summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-07-23 03:01:02 +0000
committerNorbert Preining <norbert@preining.info>2022-07-23 03:01:02 +0000
commitfcd380d0a9f42e14bfc55d8ea92e93fe0b7b48b9 (patch)
tree7db30c9583c625a81c7aabaecdbc163379b8a39a
parent72eecdf45fcf3f421668c6bdfbfe17141ce3edc1 (diff)
CTAN sync 202207230301
-rw-r--r--FILES.byname454
-rw-r--r--FILES.byname.gzbin2444448 -> 2444847 bytes
-rw-r--r--FILES.last07days605
-rw-r--r--graphics/figput/LICENSE.txt342
-rw-r--r--graphics/figput/README.md15
-rw-r--r--graphics/figput/example/example.pdfbin0 -> 307735 bytes
-rw-r--r--graphics/figput/example/example.tex2342
-rw-r--r--graphics/figput/example/externalcode.js89
-rw-r--r--graphics/figput/figput-manual/figput-manual.pdfbin0 -> 227833 bytes
-rw-r--r--graphics/figput/figput-manual/figput-manual.tex857
-rw-r--r--graphics/figput/figput.sty682
-rw-r--r--graphics/figput/javascript/development/layout.ts654
-rw-r--r--graphics/figput/javascript/development/main.ts1086
-rw-r--r--graphics/figput/javascript/development/tikz.ts1419
-rw-r--r--graphics/figput/javascript/development/widgets.ts2908
-rw-r--r--graphics/figput/javascript/figput.html42
-rw-r--r--graphics/figput/javascript/layout.js489
-rw-r--r--graphics/figput/javascript/main.js833
-rw-r--r--graphics/figput/javascript/pdf.js1
-rw-r--r--graphics/figput/javascript/pdf.worker.min.js1
-rw-r--r--graphics/figput/javascript/pdfjs_license.txt180
-rw-r--r--graphics/figput/javascript/release/figput.html38
-rw-r--r--graphics/figput/javascript/release/figput.js457
-rw-r--r--graphics/figput/javascript/server.py209
-rw-r--r--graphics/figput/javascript/tikz.js1040
-rw-r--r--graphics/figput/javascript/widgets.js2256
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl5
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb69
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2394744 -> 2392572 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/pr.ini8
-rw-r--r--systems/win32/miktex/tm/packages/pr.ini8
-rw-r--r--timestamp2
35 files changed, 16486 insertions, 623 deletions
diff --git a/FILES.byname b/FILES.byname
index aee5bbd851..0a1be76f99 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5260,7 +5260,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2022/07/21 | 130765 | FILES.last07days
+2022/07/22 | 103686 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -154065,6 +154065,30 @@
2003/08/29 | 81357 | graphics/figfrag/test.eps
2003/08/29 | 911 | graphics/figfrag/test.fig
2006/03/19 | 39736 | graphics/figfrag.zip
+2022/07/21 | 307735 | graphics/figput/example/example.pdf
+2022/07/21 | 78287 | graphics/figput/example/example.tex
+2022/06/28 | 2039 | graphics/figput/example/externalcode.js
+2022/07/21 | 227833 | graphics/figput/figput-manual/figput-manual.pdf
+2022/07/21 | 38044 | graphics/figput/figput-manual/figput-manual.tex
+2022/06/26 | 27347 | graphics/figput/figput.sty
+2022/07/20 | 22023 | graphics/figput/javascript/development/layout.ts
+2022/07/20 | 40642 | graphics/figput/javascript/development/main.ts
+2022/07/20 | 49119 | graphics/figput/javascript/development/tikz.ts
+2022/07/20 | 103309 | graphics/figput/javascript/development/widgets.ts
+2022/07/21 | 1063 | graphics/figput/javascript/figput.html
+2022/07/20 | 22313 | graphics/figput/javascript/layout.js
+2022/07/20 | 39048 | graphics/figput/javascript/main.js
+2022/02/24 | 363622 | graphics/figput/javascript/pdf.js
+2022/07/02 | 10313 | graphics/figput/javascript/pdfjs_license.txt
+2022/02/24 | 750273 | graphics/figput/javascript/pdf.worker.min.js
+2022/07/21 | 937 | graphics/figput/javascript/release/figput.html
+2022/07/21 | 58516 | graphics/figput/javascript/release/figput.js
+2022/06/25 | 8085 | graphics/figput/javascript/server.py
+2022/07/20 | 46665 | graphics/figput/javascript/tikz.js
+2022/07/20 | 104058 | graphics/figput/javascript/widgets.js
+2022/07/02 | 15919 | graphics/figput/LICENSE.txt
+2022/07/21 | 336 | graphics/figput/README.md
+2022/07/22 | 1013286 | graphics/figput.zip
2007/06/21 | 815 | graphics/finomaton/ChangeLog
2006/07/11 | 17992 | graphics/finomaton/COPYING
2007/06/21 | 48903 | graphics/finomaton/examples/finomaton.pdf
@@ -285641,8 +285665,8 @@
2021/06/02 | 1468 | systems/texlive/tlnet/archive/hvarabic.r59423.tar.xz
2022/06/25 | 1125232 | systems/texlive/tlnet/archive/hvextern.doc.r63711.tar.xz
2022/06/25 | 7136 | systems/texlive/tlnet/archive/hvextern.r63711.tar.xz
-2022/05/02 | 8725268 | systems/texlive/tlnet/archive/hvfloat.doc.r63201.tar.xz
-2022/05/02 | 11776 | systems/texlive/tlnet/archive/hvfloat.r63201.tar.xz
+2022/07/22 | 10340744 | systems/texlive/tlnet/archive/hvfloat.doc.r63953.tar.xz
+2022/07/22 | 11816 | systems/texlive/tlnet/archive/hvfloat.r63953.tar.xz
2019/02/28 | 76336 | systems/texlive/tlnet/archive/hvindex.doc.r46051.tar.xz
2019/02/28 | 1672 | systems/texlive/tlnet/archive/hvindex.r46051.tar.xz
2022/05/09 | 87192 | systems/texlive/tlnet/archive/hvlogos.doc.r63261.tar.xz
@@ -291762,7 +291786,7 @@
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r55172.tar.xz
-2022/07/21 | 418788 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63943.tar.xz
+2022/07/22 | 418844 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63951.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -291786,7 +291810,7 @@
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r55172.tar.xz
2020/05/17 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r55172.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r55172.tar.xz
-2022/07/21 | 113528 | systems/texlive/tlnet/archive/texlive-scripts.r63943.tar.xz
+2022/07/22 | 113492 | systems/texlive/tlnet/archive/texlive-scripts.r63951.tar.xz
2021/02/25 | 572 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r57908.tar.xz
2022/04/19 | 36296 | systems/texlive/tlnet/archive/texlive-scripts.win32.r63068.tar.xz
2020/05/17 | 588 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r55172.tar.xz
@@ -291842,13 +291866,13 @@
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.amd64-freebsd.r61328.tar.xz
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.amd64-netbsd.r61328.tar.xz
2021/12/17 | 336 | systems/texlive/tlnet/archive/texlogsieve.armhf-linux.r61328.tar.xz
-2022/04/24 | 110876 | systems/texlive/tlnet/archive/texlogsieve.doc.r63116.tar.xz
+2022/07/22 | 111312 | systems/texlive/tlnet/archive/texlogsieve.doc.r63954.tar.xz
2021/12/17 | 336 | systems/texlive/tlnet/archive/texlogsieve.i386-cygwin.r61328.tar.xz
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.i386-freebsd.r61328.tar.xz
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.i386-linux.r61328.tar.xz
2021/12/17 | 336 | systems/texlive/tlnet/archive/texlogsieve.i386-netbsd.r61328.tar.xz
2021/12/17 | 336 | systems/texlive/tlnet/archive/texlogsieve.i386-solaris.r61328.tar.xz
-2022/04/24 | 43788 | systems/texlive/tlnet/archive/texlogsieve.r63116.tar.xz
+2022/07/22 | 44368 | systems/texlive/tlnet/archive/texlogsieve.r63954.tar.xz
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.universal-darwin.r61328.tar.xz
2021/12/17 | 684 | systems/texlive/tlnet/archive/texlogsieve.win32.r61328.tar.xz
2021/12/17 | 340 | systems/texlive/tlnet/archive/texlogsieve.x86_64-cygwin.r61328.tar.xz
@@ -292123,8 +292147,8 @@
2019/02/28 | 1748 | systems/texlive/tlnet/archive/tikz-bayesnet.r38295.tar.xz
2021/01/17 | 238660 | systems/texlive/tlnet/archive/tikz-bbox.doc.r57444.tar.xz
2021/01/17 | 1512 | systems/texlive/tlnet/archive/tikz-bbox.r57444.tar.xz
-2021/08/14 | 256244 | systems/texlive/tlnet/archive/tikzbricks.doc.r60234.tar.xz
-2021/08/14 | 1952 | systems/texlive/tlnet/archive/tikzbricks.r60234.tar.xz
+2022/07/22 | 268120 | systems/texlive/tlnet/archive/tikzbricks.doc.r63952.tar.xz
+2022/07/22 | 2284 | systems/texlive/tlnet/archive/tikzbricks.r63952.tar.xz
2021/05/09 | 279924 | systems/texlive/tlnet/archive/tikz-cd.doc.r59133.tar.xz
2021/05/09 | 6364 | systems/texlive/tlnet/archive/tikz-cd.r59133.tar.xz
2020/04/16 | 481372 | systems/texlive/tlnet/archive/tikzcodeblocks.doc.r54758.tar.xz
@@ -293608,16 +293632,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2022/07/17 | 124404 | systems/texlive/tlnet/install-tl
-2022/07/21 | 5804558 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2022/07/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/07/22 | 5808747 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/07/22 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2022/07/21 | 20463572 | systems/texlive/tlnet/install-tl-windows.exe
-2022/07/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/07/21 | 25489312 | systems/texlive/tlnet/install-tl.zip
-2022/07/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/07/22 | 20465574 | systems/texlive/tlnet/install-tl-windows.exe
+2022/07/22 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/07/22 | 25493350 | systems/texlive/tlnet/install-tl.zip
+2022/07/22 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2022/04/03 | 1229 | systems/texlive/tlnet/README.md
2022/04/03 | 0 | systems/texlive/tlnet/TEXLIVE_2022
2022/02/28 | 7791 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -293627,8 +293651,8 @@
2022/02/28 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2022/05/27 | 49794 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2022/07/20 | 7354 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
-2022/04/27 | 215352 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
+2022/07/21 | 7242 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2022/07/21 | 222477 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
2022/03/15 | 5462 | systems/texlive/tlnet/tlpkg/installer/install-menu-extl.pl
@@ -293669,12 +293693,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/12/21 | 27582 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2022/07/21 | 17562546 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/07/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/07/22 | 17563039 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/07/22 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2022/07/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2022/07/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/07/21 | 2394032 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/07/22 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/07/22 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/07/22 | 2394744 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2021/12/21 | 58848 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2022/04/18 | 42116 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -298934,7 +298958,7 @@
2020/10/03 | 318630 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2022/07/21 | 659658 | systems/win32/miktex/tm/packages/files.csv.lzma
+2022/07/22 | 659658 | systems/win32/miktex/tm/packages/files.csv.lzma
2001/05/14 | 5617 | systems/win32/miktex/tm/packages/finbib.tar.lzma
2015/10/20 | 44379 | systems/win32/miktex/tm/packages/findhyph.tar.lzma
2011/10/21 | 89323 | systems/win32/miktex/tm/packages/fink.tar.lzma
@@ -300596,9 +300620,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2022/07/16 | 39688 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2022/07/16 | 43614 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2022/07/21 | 286488 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2022/07/21 | 1475194 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2022/07/21 | 1357882 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2022/07/22 | 286506 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2022/07/22 | 1474060 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2022/07/22 | 1358998 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2022/07/16 | 13509 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2022/07/16 | 14427 | systems/win32/miktex/tm/packages/miktex-zzip-bin-x64-2.9.tar.lzma
2016/07/15 | 35914 | systems/win32/miktex/tm/packages/mil3.tar.lzma
@@ -300839,191 +300863,191 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2021/03/17 | 232249 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2022/07/21 | 659836 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2022/07/21 | 51831 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2022/07/21 | 57283 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2022/07/21 | 1023425 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2022/07/21 | 1161246 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2022/07/21 | 28931 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2022/07/21 | 31571 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2022/07/21 | 30158 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2022/07/21 | 35251 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2022/07/21 | 56965 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2022/07/21 | 65177 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2022/07/21 | 83217 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2022/07/21 | 95606 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2022/07/21 | 69370 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2022/07/21 | 77246 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2022/07/21 | 27386 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2022/07/21 | 31532 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2022/07/21 | 332482 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2022/07/21 | 394068 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2022/07/21 | 32777 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2022/07/21 | 37020 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2022/07/21 | 51464 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2022/07/21 | 57514 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2022/07/21 | 244718 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2022/07/21 | 270790 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2022/07/21 | 179835 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2022/07/21 | 196154 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2022/07/21 | 92904 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2022/07/21 | 103264 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2022/07/21 | 21337 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2022/07/21 | 24139 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2022/07/21 | 481220 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2022/07/21 | 46420 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2022/07/21 | 51990 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2022/07/21 | 285843 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2022/07/21 | 326014 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2022/07/21 | 41459 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2022/07/21 | 45804 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2022/07/21 | 120685 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2022/07/21 | 135398 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2022/07/21 | 1297230 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2022/07/21 | 1455264 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2022/07/21 | 99487 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2022/07/21 | 112993 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2022/07/21 | 43671 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2022/07/21 | 48839 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2022/07/21 | 25260 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2022/07/21 | 28502 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2022/07/21 | 56906 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2022/07/21 | 63160 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2022/07/21 | 136102 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2022/07/21 | 155470 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2022/07/21 | 74109 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2022/07/21 | 79106 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2022/07/21 | 72153 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2022/07/21 | 81352 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2022/07/21 | 259333 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2022/07/21 | 295869 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2022/07/21 | 22153 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2022/07/21 | 25104 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2022/07/21 | 97422 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2022/07/21 | 113027 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2022/07/21 | 64629 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2022/07/21 | 73216 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2022/07/21 | 96972 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2022/07/21 | 115403 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2022/07/21 | 38693 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2022/07/21 | 43700 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2022/07/21 | 483448 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2022/07/21 | 564870 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2022/07/21 | 204193 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma
-2022/07/21 | 247272 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
-2022/07/21 | 152543 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2022/07/21 | 169635 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2022/07/21 | 95499 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2022/07/21 | 109688 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2022/07/21 | 16464 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2022/07/21 | 18391 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2022/07/21 | 28508 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2022/07/21 | 30553 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2022/07/21 | 631398 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2022/07/21 | 681994 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2022/07/21 | 532438 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2022/07/21 | 599120 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2022/07/21 | 478111 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2022/07/21 | 527078 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2022/07/21 | 94099 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2022/07/21 | 103622 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2022/07/21 | 1740651 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2022/07/21 | 2027161 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2022/07/21 | 67993 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2022/07/21 | 74073 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2022/07/21 | 27744 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2022/07/21 | 32079 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2022/07/21 | 7755 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2022/07/21 | 8819 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2022/07/21 | 190511 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2022/07/21 | 209174 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2022/07/21 | 251189 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2022/07/21 | 286694 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2022/07/21 | 99343 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2022/07/21 | 104730 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2022/07/21 | 126876 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2022/07/21 | 140070 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2022/07/21 | 287375 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2022/07/21 | 325593 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2022/07/21 | 199825 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2022/07/21 | 181607 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2022/07/21 | 49729 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2022/07/21 | 55268 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2022/07/21 | 31441 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2022/07/21 | 35212 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2022/07/21 | 38311 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2022/07/21 | 43616 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2022/07/21 | 43508 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2022/07/21 | 48033 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2022/07/21 | 45809 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2022/07/21 | 52364 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2022/07/21 | 197328 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2022/07/21 | 213320 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2022/07/21 | 36406 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2022/07/21 | 41137 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2022/07/21 | 748817 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2022/07/21 | 824814 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2022/07/21 | 200461 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2022/07/21 | 203528 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2022/07/21 | 210190 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2022/07/21 | 245184 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2022/07/21 | 79451 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2022/07/21 | 88389 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2022/07/21 | 1180315 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2022/07/21 | 1322192 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2022/07/21 | 20186 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2022/07/21 | 23977 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2022/07/21 | 31581 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2022/07/21 | 37545 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2022/07/21 | 64868 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2022/07/21 | 72971 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2022/07/21 | 50553 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2022/07/21 | 58742 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2022/07/21 | 692213 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma
-2022/07/21 | 763860 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
-2022/07/21 | 1354843 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2022/07/21 | 1503354 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2022/07/21 | 42744 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2022/07/21 | 52579 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2022/07/21 | 57415 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2022/07/21 | 63796 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2022/07/21 | 25503 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2022/07/21 | 27627 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2022/07/21 | 16516 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2022/07/21 | 18493 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2022/07/21 | 64180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2022/07/21 | 70949 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2022/07/21 | 157153 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2022/07/21 | 173122 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2022/07/21 | 58254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2022/07/21 | 68210 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2022/07/21 | 100586 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2022/07/21 | 107321 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2022/07/21 | 2695589 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2022/07/21 | 2823040 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2022/07/21 | 55556 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2022/07/21 | 62336 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2022/07/21 | 37040 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2022/07/21 | 41199 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2022/07/21 | 28716 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2022/07/21 | 33837 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2022/07/21 | 68059 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2022/07/21 | 73609 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2022/07/21 | 316695 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2022/07/21 | 352130 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2022/07/21 | 55743 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2022/07/21 | 57454 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2022/07/21 | 591161 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2022/07/21 | 630008 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2022/07/21 | 39638 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2022/07/21 | 43672 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2022/07/21 | 286527 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2022/07/21 | 1474714 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2022/07/21 | 1358641 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2022/07/21 | 13517 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2022/07/21 | 14435 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2022/07/22 | 659836 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2022/07/22 | 51828 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2022/07/22 | 57284 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2022/07/22 | 1023425 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2022/07/22 | 1161246 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2022/07/22 | 28929 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2022/07/22 | 31572 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2022/07/22 | 30158 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2022/07/22 | 35248 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2022/07/22 | 56963 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2022/07/22 | 65178 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2022/07/22 | 83219 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2022/07/22 | 95604 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2022/07/22 | 69370 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2022/07/22 | 77246 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2022/07/22 | 27386 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2022/07/22 | 31532 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2022/07/22 | 332482 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2022/07/22 | 394070 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2022/07/22 | 32776 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2022/07/22 | 37020 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2022/07/22 | 51463 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2022/07/22 | 57516 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2022/07/22 | 244718 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2022/07/22 | 270789 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2022/07/22 | 179833 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2022/07/22 | 196151 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2022/07/22 | 92905 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2022/07/22 | 103264 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/22 | 21337 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2022/07/22 | 24140 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2022/07/22 | 481219 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2022/07/22 | 46419 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2022/07/22 | 51991 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2022/07/22 | 285844 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2022/07/22 | 326015 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2022/07/22 | 41460 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2022/07/22 | 45803 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2022/07/22 | 120685 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2022/07/22 | 135400 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2022/07/22 | 1297231 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2022/07/22 | 1455266 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2022/07/22 | 99487 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2022/07/22 | 112994 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2022/07/22 | 43671 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2022/07/22 | 48839 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2022/07/22 | 25261 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2022/07/22 | 28503 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2022/07/22 | 56905 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2022/07/22 | 63160 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2022/07/22 | 136105 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2022/07/22 | 155472 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2022/07/22 | 74110 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2022/07/22 | 79107 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2022/07/22 | 72151 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2022/07/22 | 81351 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2022/07/22 | 259333 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2022/07/22 | 295869 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2022/07/22 | 22153 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2022/07/22 | 25103 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2022/07/22 | 97420 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2022/07/22 | 113027 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2022/07/22 | 64627 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2022/07/22 | 73217 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2022/07/22 | 96970 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2022/07/22 | 115403 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2022/07/22 | 38693 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2022/07/22 | 43699 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2022/07/22 | 483448 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2022/07/22 | 564868 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2022/07/22 | 204193 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma
+2022/07/22 | 247273 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
+2022/07/22 | 152542 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2022/07/22 | 169632 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/22 | 95497 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2022/07/22 | 109687 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2022/07/22 | 16463 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2022/07/22 | 18390 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2022/07/22 | 28507 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2022/07/22 | 30555 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2022/07/22 | 631395 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2022/07/22 | 681997 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2022/07/22 | 532436 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2022/07/22 | 599119 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2022/07/22 | 478112 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2022/07/22 | 527080 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2022/07/22 | 94099 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2022/07/22 | 103623 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2022/07/22 | 1740653 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2022/07/22 | 2027162 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2022/07/22 | 67993 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2022/07/22 | 74074 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2022/07/22 | 27744 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2022/07/22 | 32080 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2022/07/22 | 7755 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2022/07/22 | 8819 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2022/07/22 | 190510 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2022/07/22 | 209175 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2022/07/22 | 251193 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2022/07/22 | 286693 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2022/07/22 | 99343 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2022/07/22 | 104728 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2022/07/22 | 126874 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2022/07/22 | 140070 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2022/07/22 | 287375 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2022/07/22 | 325591 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2022/07/22 | 199825 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2022/07/22 | 181608 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2022/07/22 | 49728 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2022/07/22 | 55267 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2022/07/22 | 31440 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2022/07/22 | 35211 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2022/07/22 | 38311 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2022/07/22 | 43616 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2022/07/22 | 43507 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2022/07/22 | 48033 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2022/07/22 | 45809 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2022/07/22 | 52366 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2022/07/22 | 197327 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2022/07/22 | 213318 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2022/07/22 | 36407 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2022/07/22 | 41137 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2022/07/22 | 748817 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2022/07/22 | 824815 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2022/07/22 | 200460 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2022/07/22 | 203527 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2022/07/22 | 210189 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2022/07/22 | 245184 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2022/07/22 | 79450 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2022/07/22 | 88390 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2022/07/22 | 1180313 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2022/07/22 | 1322193 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2022/07/22 | 20186 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2022/07/22 | 23976 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/22 | 31580 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2022/07/22 | 37545 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2022/07/22 | 64869 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2022/07/22 | 72970 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2022/07/22 | 50555 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2022/07/22 | 58743 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2022/07/22 | 692211 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma
+2022/07/22 | 763863 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
+2022/07/22 | 1354846 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2022/07/22 | 1503356 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2022/07/22 | 42744 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2022/07/22 | 52579 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2022/07/22 | 57416 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2022/07/22 | 63796 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2022/07/22 | 25502 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2022/07/22 | 27628 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2022/07/22 | 16517 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2022/07/22 | 18493 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2022/07/22 | 64180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2022/07/22 | 70948 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2022/07/22 | 157155 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2022/07/22 | 173123 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2022/07/22 | 58255 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2022/07/22 | 68210 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2022/07/22 | 100586 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2022/07/22 | 107321 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2022/07/22 | 2695587 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2022/07/22 | 2823040 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2022/07/22 | 55556 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2022/07/22 | 62335 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2022/07/22 | 37040 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2022/07/22 | 41199 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2022/07/22 | 28715 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2022/07/22 | 33837 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2022/07/22 | 68060 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2022/07/22 | 73610 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2022/07/22 | 316696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2022/07/22 | 352130 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2022/07/22 | 55741 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2022/07/22 | 57455 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2022/07/22 | 591161 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2022/07/22 | 630005 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2022/07/22 | 39637 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2022/07/22 | 43672 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2022/07/22 | 286490 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2022/07/22 | 1474871 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2022/07/22 | 1358796 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2022/07/22 | 13518 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2022/07/22 | 14435 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2022/07/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2022/07/22 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
2018/07/06 | 145915 | systems/win32/miktex/tm/packages/nexus-otf.tar.lzma
2017/03/30 | 191149 | systems/win32/miktex/tm/packages/nfssext-cfr.tar.lzma
2012/12/20 | 612251 | systems/win32/miktex/tm/packages/nicefilelist.tar.lzma
@@ -301510,7 +301534,7 @@
2022/02/22 | 6917 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
2021/04/23 | 274028 | systems/win32/miktex/tm/packages/principia.tar.lzma
-2022/07/21 | 1138 | systems/win32/miktex/tm/packages/pr.ini
+2022/07/22 | 1138 | systems/win32/miktex/tm/packages/pr.ini
2010/09/27 | 248469 | systems/win32/miktex/tm/packages/printlen.tar.lzma
2008/06/17 | 77313 | systems/win32/miktex/tm/packages/proba.tar.lzma
2017/07/12 | 988486 | systems/win32/miktex/tm/packages/probsoln.tar.lzma
@@ -303423,7 +303447,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2022/07/22 | 186 | timestamp
+2022/07/23 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2022/02/28 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 4d13db2866..b3d5014eda 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 494284be27..089b40f76a 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,239 +1,256 @@
-2022/07/21 | 99487 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2022/07/21 | 99343 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2022/07/22 | 99487 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2022/07/22 | 99343 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2022/07/22 | 97420 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2022/07/22 | 96970 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2022/07/22 | 95604 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2022/07/22 | 95497 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2022/07/22 | 94099 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2022/07/22 | 92905 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2022/07/22 | 88390 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2022/07/22 | 8819 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2022/07/22 | 83219 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2022/07/22 | 824815 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2022/07/22 | 81351 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2022/07/22 | 79450 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2022/07/22 | 79107 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2022/07/22 | 7755 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2022/07/22 | 77246 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2022/07/22 | 763863 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
+2022/07/22 | 748817 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2022/07/22 | 74110 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2022/07/22 | 74074 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2022/07/22 | 73610 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2022/07/22 | 73217 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2022/07/22 | 72970 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2022/07/22 | 72151 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2022/07/22 | 70948 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2022/07/22 | 69370 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2022/07/22 | 692211 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma
+2022/07/22 | 68210 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2022/07/22 | 681997 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2022/07/22 | 68060 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2022/07/22 | 67993 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2022/07/22 | 659836 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2022/07/22 | 659658 | systems/win32/miktex/tm/packages/files.csv.lzma
+2022/07/22 | 65178 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2022/07/22 | 64869 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2022/07/22 | 64627 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2022/07/22 | 64180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2022/07/22 | 63796 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2022/07/22 | 63160 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2022/07/22 | 631395 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2022/07/22 | 630005 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2022/07/22 | 62335 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2022/07/22 | 599119 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2022/07/22 | 591161 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2022/07/22 | 58743 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2022/07/22 | 58255 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2022/07/22 | 5808747 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2022/07/22 | 57516 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2022/07/22 | 57455 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
+2022/07/22 | 57416 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2022/07/22 | 57284 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2022/07/22 | 56963 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2022/07/22 | 56905 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2022/07/22 | 564868 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2022/07/22 | 55741 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
+2022/07/22 | 55556 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2022/07/22 | 55267 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2022/07/22 | 532436 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2022/07/22 | 527080 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2022/07/22 | 52579 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2022/07/22 | 52366 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2022/07/22 | 51991 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2022/07/22 | 51828 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2022/07/22 | 51463 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2022/07/22 | 50555 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2022/07/22 | 49728 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2022/07/22 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2022/07/22 | 48839 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2022/07/22 | 483448 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2022/07/22 | 481219 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2022/07/22 | 48033 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2022/07/22 | 478112 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2022/07/22 | 46419 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2022/07/22 | 45809 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2022/07/22 | 45803 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2022/07/22 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2022/07/22 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2022/07/22 | 44368 | systems/texlive/tlnet/archive/texlogsieve.r63954.tar.xz
+2022/07/22 | 43699 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2022/07/22 | 43672 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2022/07/22 | 43671 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2022/07/22 | 43616 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2022/07/22 | 43507 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2022/07/22 | 42744 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2022/07/22 | 418844 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63951.tar.xz
+2022/07/22 | 41460 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2022/07/22 | 41199 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2022/07/22 | 41137 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2022/07/22 | 39637 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2022/07/22 | 394070 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2022/07/22 | 38693 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2022/07/22 | 38311 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2022/07/22 | 37545 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2022/07/22 | 37040 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2022/07/22 | 37020 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2022/07/22 | 36407 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2022/07/22 | 35248 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2022/07/22 | 352130 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2022/07/22 | 35211 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2022/07/22 | 33837 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2022/07/22 | 332482 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2022/07/22 | 32776 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2022/07/22 | 326015 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2022/07/22 | 325591 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2022/07/22 | 32080 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2022/07/22 | 316696 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2022/07/22 | 31580 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2022/07/22 | 31572 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2022/07/22 | 31532 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2022/07/22 | 31440 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2022/07/22 | 30555 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2022/07/22 | 30158 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2022/07/22 | 295869 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2022/07/22 | 28929 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2022/07/22 | 287375 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2022/07/22 | 28715 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2022/07/22 | 286693 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2022/07/22 | 286506 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2022/07/22 | 286490 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2022/07/22 | 285844 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2022/07/22 | 28507 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2022/07/22 | 28503 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2022/07/22 | 2823040 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2022/07/22 | 27744 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2022/07/22 | 27628 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2022/07/22 | 27386 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2022/07/22 | 270789 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2022/07/22 | 2695587 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2022/07/22 | 268120 | systems/texlive/tlnet/archive/tikzbricks.doc.r63952.tar.xz
+2022/07/22 | 259333 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2022/07/22 | 25502 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2022/07/22 | 25493350 | systems/texlive/tlnet/install-tl.zip
+2022/07/22 | 25261 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2022/07/22 | 251193 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2022/07/22 | 25103 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2022/07/22 | 247273 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
+2022/07/22 | 245184 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2022/07/22 | 244718 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2022/07/22 | 24140 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2022/07/22 | 23976 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2022/07/22 | 2394744 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/07/22 | 2284 | systems/texlive/tlnet/archive/tikzbricks.r63952.tar.xz
+2022/07/22 | 22153 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2022/07/22 | 21337 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2022/07/22 | 213318 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2022/07/22 | 210189 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2022/07/22 | 209175 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2022/07/22 | 20465574 | systems/texlive/tlnet/install-tl-windows.exe
+2022/07/22 | 204193 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma
+2022/07/22 | 203527 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2022/07/22 | 2027162 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2022/07/22 | 20186 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2022/07/22 | 200460 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2022/07/22 | 199825 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2022/07/22 | 197327 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2022/07/22 | 196151 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2022/07/22 | 190510 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2022/07/22 | 18493 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2022/07/22 | 18390 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2022/07/22 | 181608 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2022/07/22 | 179833 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2022/07/22 | 17563039 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2022/07/22 | 1740653 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2022/07/22 | 173123 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2022/07/22 | 169632 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2022/07/22 | 16517 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2022/07/22 | 16463 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2022/07/22 | 157155 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2022/07/22 | 155472 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2022/07/22 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2022/07/22 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2022/07/22 | 152542 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2022/07/22 | 1503356 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2022/07/22 | 1474871 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2022/07/22 | 1474060 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2022/07/22 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2022/07/22 | 1455266 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2022/07/22 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2022/07/22 | 14435 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2022/07/22 | 140070 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2022/07/22 | 136105 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2022/07/22 | 1358998 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2022/07/22 | 1358796 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2022/07/22 | 1354846 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2022/07/22 | 135400 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2022/07/22 | 13518 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2022/07/22 | 1322193 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2022/07/22 | 1297231 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2022/07/22 | 126874 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2022/07/22 | 120685 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2022/07/22 | 11816 | systems/texlive/tlnet/archive/hvfloat.r63953.tar.xz
+2022/07/22 | 1180313 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2022/07/22 | 1161246 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2022/07/22 | 115403 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2022/07/22 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2022/07/22 | 1138 | systems/win32/miktex/tm/packages/pr.ini
+2022/07/22 | 113492 | systems/texlive/tlnet/archive/texlive-scripts.r63951.tar.xz
+2022/07/22 | 113027 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2022/07/22 | 112994 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2022/07/22 | 111312 | systems/texlive/tlnet/archive/texlogsieve.doc.r63954.tar.xz
+2022/07/22 | 109687 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2022/07/22 | 107321 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2022/07/22 | 104728 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2022/07/22 | 103623 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2022/07/22 | 10340744 | systems/texlive/tlnet/archive/hvfloat.doc.r63953.tar.xz
+2022/07/22 | 103264 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/22 | 1023425 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2022/07/22 | 1013286 | graphics/figput.zip
+2022/07/22 | 100586 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
2022/07/21 | 977780 | systems/texlive/tlnet/archive/gfsneohellenic.r63944.tar.xz
-2022/07/21 | 97422 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2022/07/21 | 96972 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2022/07/21 | 95606 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2022/07/21 | 95499 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2022/07/21 | 94099 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2022/07/21 | 92904 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2022/07/21 | 88389 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2022/07/21 | 8819 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2022/07/21 | 937 | graphics/figput/javascript/release/figput.html
2022/07/21 | 870100 | systems/texlive/tlnet/archive/babel.doc.r63948.tar.xz
-2022/07/21 | 83217 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2022/07/21 | 824814 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2022/07/21 | 81352 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2022/07/21 | 79451 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
2022/07/21 | 7923 | graphics/pgf/contrib/tikzbricks/tikzbricks.sty
-2022/07/21 | 79106 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2022/07/21 | 7755 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2022/07/21 | 77246 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2022/07/21 | 763860 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma
-2022/07/21 | 748817 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2022/07/21 | 74109 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2022/07/21 | 74073 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2022/07/21 | 78287 | graphics/figput/example/example.tex
2022/07/21 | 737444 | systems/texlive/tlnet/archive/bodeplot.doc.r63946.tar.xz
-2022/07/21 | 73609 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2022/07/21 | 73216 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2022/07/21 | 72971 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2022/07/21 | 72153 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2022/07/21 | 7242 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/07/21 | 718440 | systems/texlive/tlnet/archive/babel.source.r63948.tar.xz
-2022/07/21 | 70949 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2022/07/21 | 69370 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2022/07/21 | 692213 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin.tar.lzma
-2022/07/21 | 68210 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2022/07/21 | 681994 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2022/07/21 | 68059 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2022/07/21 | 67993 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
2022/07/21 | 6708 | systems/texlive/tlnet/archive/collection-latexextra.r63949.tar.xz
-2022/07/21 | 659836 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2022/07/21 | 659658 | systems/win32/miktex/tm/packages/files.csv.lzma
-2022/07/21 | 65177 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2022/07/21 | 64868 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2022/07/21 | 64629 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2022/07/21 | 64180 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2022/07/21 | 63796 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2022/07/21 | 63160 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2022/07/21 | 631398 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2022/07/21 | 630008 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2022/07/21 | 62336 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
2022/07/21 | 622916 | systems/texlive/tlnet/archive/tikzfill.doc.r63947.tar.xz
-2022/07/21 | 599120 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
2022/07/21 | 59279 | support/texlogsieve/texlogsieve.pdf
-2022/07/21 | 591161 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2022/07/21 | 58742 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2022/07/21 | 58254 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2022/07/21 | 5804558 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2022/07/21 | 57514 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2022/07/21 | 57454 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma
-2022/07/21 | 57415 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2022/07/21 | 57283 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2022/07/21 | 56965 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2022/07/21 | 56906 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2022/07/21 | 564870 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2022/07/21 | 55743 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin.tar.lzma
-2022/07/21 | 55556 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2022/07/21 | 55268 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2022/07/21 | 58516 | graphics/figput/javascript/release/figput.js
2022/07/21 | 534244 | systems/texlive/tlnet/archive/feyn.doc.r63945.tar.xz
-2022/07/21 | 532438 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2022/07/21 | 527078 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2022/07/21 | 52579 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2022/07/21 | 52364 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2022/07/21 | 51990 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2022/07/21 | 51831 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2022/07/21 | 51464 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
2022/07/21 | 512 | graphics/pgf/contrib/tikzbricks/README.md
-2022/07/21 | 50553 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2022/07/21 | 49729 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
2022/07/21 | 4944 | systems/texlive/tlnet/archive/bodeplot.r63946.tar.xz
-2022/07/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2022/07/21 | 48839 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2022/07/21 | 483448 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2022/07/21 | 481220 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2022/07/21 | 48033 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2022/07/21 | 478111 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2022/07/21 | 46420 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2022/07/21 | 45809 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2022/07/21 | 45804 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2022/07/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2022/07/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2022/07/21 | 4432 | systems/texlive/tlnet/archive/tikzfill.r63947.tar.xz
-2022/07/21 | 43700 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2022/07/21 | 43672 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2022/07/21 | 43671 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2022/07/21 | 43616 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2022/07/21 | 43508 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2022/07/21 | 42744 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2022/07/21 | 418788 | systems/texlive/tlnet/archive/texlive-scripts.doc.r63943.tar.xz
-2022/07/21 | 41459 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2022/07/21 | 41199 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2022/07/21 | 41137 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
2022/07/21 | 409780 | systems/texlive/tlnet/archive/wrapstuff.doc.r63949.tar.xz
-2022/07/21 | 39638 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2022/07/21 | 394068 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2022/07/21 | 38693 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2022/07/21 | 38311 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2022/07/21 | 37545 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2022/07/21 | 37040 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2022/07/21 | 37020 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2022/07/21 | 36406 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2022/07/21 | 35251 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2022/07/21 | 352130 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2022/07/21 | 35212 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2022/07/21 | 38044 | graphics/figput/figput-manual/figput-manual.tex
2022/07/21 | 35149 | support/texlogsieve/LICENCE.txt
-2022/07/21 | 33837 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2022/07/21 | 332482 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2022/07/21 | 32777 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2022/07/21 | 326014 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2022/07/21 | 325593 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2022/07/21 | 32079 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2022/07/21 | 316695 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2022/07/21 | 31581 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2022/07/21 | 31571 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2022/07/21 | 31532 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2022/07/21 | 31441 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2022/07/21 | 30553 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2022/07/21 | 30158 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2022/07/21 | 295869 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2022/07/21 | 28931 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2022/07/21 | 287375 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2022/07/21 | 28716 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2022/07/21 | 286694 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2022/07/21 | 286527 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2022/07/21 | 286488 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2022/07/21 | 285843 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2022/07/21 | 28508 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2022/07/21 | 28502 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2022/07/21 | 2823040 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2022/07/21 | 336 | graphics/figput/README.md
+2022/07/21 | 307735 | graphics/figput/example/example.pdf
2022/07/21 | 2811 | support/texlogsieve/README.md
-2022/07/21 | 27744 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2022/07/21 | 27627 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2022/07/21 | 27386 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
2022/07/21 | 271210 | graphics/pgf/contrib/tikzbricks/tikzbricks-doc.pdf
-2022/07/21 | 270790 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2022/07/21 | 2695589 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
2022/07/21 | 269145 | graphics/pgf/contrib/tikzbricks.zip
-2022/07/21 | 259333 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2022/07/21 | 25503 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2022/07/21 | 25489312 | systems/texlive/tlnet/install-tl.zip
-2022/07/21 | 25260 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2022/07/21 | 251189 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2022/07/21 | 25104 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2022/07/21 | 247272 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma
-2022/07/21 | 245184 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2022/07/21 | 244718 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2022/07/21 | 24139 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2022/07/21 | 23977 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2022/07/21 | 2394032 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2022/07/21 | 227833 | graphics/figput/figput-manual/figput-manual.pdf
2022/07/21 | 22509 | support/texlogsieve/texlogsieve.tex
-2022/07/21 | 22153 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2022/07/21 | 21337 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2022/07/21 | 213320 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2022/07/21 | 210190 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2022/07/21 | 209174 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2022/07/21 | 20463572 | systems/texlive/tlnet/install-tl-windows.exe
-2022/07/21 | 204193 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin.tar.lzma
-2022/07/21 | 203528 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2022/07/21 | 2027161 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2022/07/21 | 20186 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2022/07/21 | 200461 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2022/07/21 | 199825 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2022/07/21 | 222477 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2022/07/21 | 197589 | support/texlogsieve/texlogsieve
-2022/07/21 | 197328 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2022/07/21 | 196154 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
2022/07/21 | 191140 | systems/texlive/tlnet/archive/babel.r63948.tar.xz
-2022/07/21 | 190511 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2022/07/21 | 18493 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2022/07/21 | 18391 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2022/07/21 | 181607 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2022/07/21 | 179835 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
2022/07/21 | 17906 | CTAN.sites
-2022/07/21 | 17562546 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2022/07/21 | 1740651 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2022/07/21 | 173122 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2022/07/21 | 169635 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2022/07/21 | 16516 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2022/07/21 | 16464 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
2022/07/21 | 16364 | systems/texlive/tlnet/archive/feyn.source.r63945.tar.xz
-2022/07/21 | 157153 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
2022/07/21 | 15648 | systems/texlive/tlnet/archive/bodeplot.source.r63946.tar.xz
-2022/07/21 | 155470 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2022/07/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2022/07/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2022/07/21 | 152543 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
2022/07/21 | 1524 | systems/texlive/tlnet/archive/collection-pictures.r63947.tar.xz
-2022/07/21 | 1503354 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
2022/07/21 | 14824 | systems/texlive/tlnet/archive/wrapstuff.source.r63949.tar.xz
-2022/07/21 | 1475194 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2022/07/21 | 1474714 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2022/07/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2022/07/21 | 1455264 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2022/07/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2022/07/21 | 14435 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2022/07/21 | 140070 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2022/07/21 | 136102 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2022/07/21 | 1358641 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2022/07/21 | 1357882 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2022/07/21 | 1354843 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2022/07/21 | 135398 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2022/07/21 | 13517 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
2022/07/21 | 13508 | systems/texlive/tlnet/archive/feyn.r63945.tar.xz
2022/07/21 | 133497 | support/texlogsieve.zip
-2022/07/21 | 1322192 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2022/07/21 | 1297230 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2022/07/21 | 126876 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
2022/07/21 | 12068 | graphics/pgf/contrib/tikzbricks/tikzbricks-doc.tex
-2022/07/21 | 120685 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2022/07/21 | 1180315 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2022/07/21 | 1161246 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
2022/07/21 | 11541 | support/texlogsieve/texlogsieve.1
-2022/07/21 | 115403 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2022/07/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
-2022/07/21 | 1138 | systems/win32/miktex/tm/packages/pr.ini
-2022/07/21 | 113528 | systems/texlive/tlnet/archive/texlive-scripts.r63943.tar.xz
-2022/07/21 | 113027 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2022/07/21 | 112993 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2022/07/21 | 109688 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
2022/07/21 | 10888 | systems/texlive/tlnet/archive/wrapstuff.r63949.tar.xz
-2022/07/21 | 107321 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2022/07/21 | 104730 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2022/07/21 | 103622 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2022/07/21 | 103264 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2022/07/21 | 1063 | graphics/figput/javascript/figput.html
2022/07/21 | 10308 | systems/texlive/tlnet/archive/gfsneohellenic.doc.r63944.tar.xz
-2022/07/21 | 1023425 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2022/07/21 | 100586 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
2022/07/20 | 98070 | macros/latex/contrib/hvfloat/doc/examples/multi-inner2s2c.pdf
2022/07/20 | 98061 | macros/latex/contrib/hvfloat/doc/examples/capPos.pdf
2022/07/20 | 90436 | macros/latex/contrib/hvfloat/doc/examples/paper-default1s2c.pdf
@@ -279,7 +296,6 @@
2022/07/20 | 77375 | macros/latex/contrib/hvfloat/doc/examples/odd1s1c.pdf
2022/07/20 | 77202 | macros/latex/contrib/hvfloat/doc/examples/even1s1c.pdf
2022/07/20 | 748494 | macros/latex/required/babel/base/babel.dtx
-2022/07/20 | 7354 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2022/07/20 | 721265 | graphics/pgf/contrib/tikzfill/tikzfill.pdf
2022/07/20 | 7057 | fonts/feyn/feyn.html
2022/07/20 | 69916 | macros/latex/contrib/hvfloat/latex/hvfloat.sty
@@ -299,19 +315,23 @@
2022/07/20 | 52024 | systems/texlive/tlnet/archive/yfonts-otf.r63936.tar.xz
2022/07/20 | 5037834 | macros/latex/contrib/hvfloat/doc/hvfloat.pdf
2022/07/20 | 4935 | fonts/feyn/sample-two-loop-annotated.png
+2022/07/20 | 49119 | graphics/figput/javascript/development/tikz.ts
2022/07/20 | 4857 | fonts/feyn/release-notes.html
2022/07/20 | 4680 | graphics/pgf/contrib/tikzfill/tikzfill-doc.sty
+2022/07/20 | 46665 | graphics/figput/javascript/tikz.js
2022/07/20 | 4422 | fonts/feyn/feynmac.mf
2022/07/20 | 424500 | macros/latex/contrib/wrapstuff.zip
2022/07/20 | 422157 | macros/latex/contrib/wrapstuff/wrapstuff.pdf
2022/07/20 | 42108 | graphics/pgf/contrib/tikzfill/tikzfill.tex
2022/07/20 | 4199 | macros/latex/contrib/hvfloat/Changes
+2022/07/20 | 40642 | graphics/figput/javascript/development/main.ts
2022/07/20 | 402 | graphics/pgf/contrib/tikzfill/CHANGES.md
2022/07/20 | 4000 | systems/texlive/tlnet/archive/runcode.r63939.tar.xz
2022/07/20 | 3981 | fonts/feyn/sample-phi4.png
2022/07/20 | 39620 | systems/texlive/tlnet/archive/tkz-euclide.r63941.tar.xz
2022/07/20 | 3928 | fonts/feyn/sample-two-loop.png
2022/07/20 | 3920 | fonts/feyn/sample-massive.png
+2022/07/20 | 39048 | graphics/figput/javascript/main.js
2022/07/20 | 3629 | graphics/pgf/contrib/bodeplot/README.md
2022/07/20 | 3526 | macros/latex/required/babel/base/bbidxglo.dtx
2022/07/20 | 3319 | fonts/feyn/sample-vertex.png
@@ -326,6 +346,8 @@
2022/07/20 | 232956 | systems/texlive/tlnet/archive/showlabels.doc.r63940.tar.xz
2022/07/20 | 231 | fonts/feyn/feyn.ins
2022/07/20 | 2317480 | macros/latex/contrib/hvfloat/doc/examples/doublepage2s1c.pdf
+2022/07/20 | 22313 | graphics/figput/javascript/layout.js
+2022/07/20 | 22023 | graphics/figput/javascript/development/layout.ts
2022/07/20 | 21890 | macros/latex/required/babel/base/bbcompat.dtx
2022/07/20 | 2141 | macros/latex/required/babel/base/README.md
2022/07/20 | 1964 | systems/texlive/tlnet/archive/collection-fontsextra.r63936.tar.xz
@@ -383,6 +405,8 @@
2022/07/20 | 1101 | graphics/pgf/contrib/tikzfill/tikzfill.rhombus.sty
2022/07/20 | 1101 | graphics/pgf/contrib/tikzfill/tikzfill.hexagon.sty
2022/07/20 | 1083 | graphics/pgf/contrib/tikzfill/tikzfill.image.sty
+2022/07/20 | 104058 | graphics/figput/javascript/widgets.js
+2022/07/20 | 103309 | graphics/figput/javascript/development/widgets.ts
2022/07/20 | 102871 | macros/latex/contrib/hvfloat/doc/examples/multi-default1s2c.pdf
2022/07/20 | 101319 | macros/latex/contrib/hvfloat/doc/examples/multi-outer2s2c.pdf
2022/07/20 | 1007326 | graphics/pgf/contrib/bodeplot/bodeplot.pdf
@@ -1137,172 +1161,3 @@
2022/07/16 | 1029471 | info/kaytannollista-latexia.zip
2022/07/16 | 1023945 | systems/win32/miktex/tm/packages/miktex-asymptote-bin-2.9.tar.lzma
2022/07/16 | 100491 | systems/win32/miktex/tm/packages/miktex-texware-bin-2.9.tar.lzma
-2022/07/15 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
-2022/07/15 | 9940256 | systems/texlive/tlnet/archive/profcollege.doc.r63895.tar.xz
-2022/07/15 | 98599 | macros/latex/contrib/tkz/tkzexample/doc/tkzexample.pdf
-2022/07/15 | 984100 | systems/texlive/tlnet/archive/pseudo.doc.r63896.tar.xz
-2022/07/15 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
-2022/07/15 | 9436 | macros/latex/contrib/l3kernel/l3flag.dtx
-2022/07/15 | 90470 | macros/latex/contrib/l3kernel/l3seq.dtx
-2022/07/15 | 90018 | macros/latex/contrib/l3kernel/l3int.dtx
-2022/07/15 | 89 | macros/latex/contrib/lwarp/lwarp_baseline_marker.png
-2022/07/15 | 89732 | systems/texlive/tlnet/archive/xecjk.source.r63899.tar.xz
-2022/07/15 | 89520 | systems/texlive/tlnet/archive/ctex.source.r63891.tar.xz
-2022/07/15 | 87493 | macros/latex/contrib/l3kernel/l3coffins.dtx
-2022/07/15 | 8608 | systems/texlive/tlnet/archive/zhnumber.r63898.tar.xz
-2022/07/15 | 8495 | macros/latex/contrib/l3kernel/l3unicode.dtx
-2022/07/15 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
-2022/07/15 | 84785 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
-2022/07/15 | 8320949 | macros/context/contrib/context-simpleslides.zip
-2022/07/15 | 82707 | macros/latex/contrib/l3kernel/l3clist.dtx
-2022/07/15 | 81493 | macros/latex/contrib/l3kernel/l3prefixes.pdf
-2022/07/15 | 80495 | macros/latex/contrib/l3kernel/l3names.dtx
-2022/07/15 | 79792 | macros/latex/contrib/l3kernel/l3box.dtx
-2022/07/15 | 78509 | macros/latex/contrib/l3kernel/l3str.dtx
-2022/07/15 | 78249 | macros/latex/contrib/l3kernel/l3text-case.dtx
-2022/07/15 | 7778 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-utilities.tex
-2022/07/15 | 76279 | macros/latex/contrib/l3kernel/l3skip.dtx
-2022/07/15 | 7454 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
-2022/07/15 | 74225 | macros/latex/contrib/l3kernel/l3msg.dtx
-2022/07/15 | 73835 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
-2022/07/15 | 7228051 | macros/latex/contrib/l3kernel/source3.pdf
-2022/07/15 | 719 | macros/latex/contrib/lwarp/lwarp_baseline_marker.eps
-2022/07/15 | 70685 | macros/latex/contrib/l3kernel/expl3.dtx
-2022/07/15 | 70578 | macros/latex/contrib/l3kernel/l3fp.dtx
-2022/07/15 | 69260 | macros/latex/contrib/l3kernel/l3candidates.dtx
-2022/07/15 | 6760 | systems/texlive/tlnet/archive/pseudo.r63896.tar.xz
-2022/07/15 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
-2022/07/15 | 66524 | macros/latex/contrib/l3kernel/l3prg.dtx
-2022/07/15 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
-2022/07/15 | 6480 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-arith.tex
-2022/07/15 | 6451 | macros/latex/contrib/l3kernel/l3term-glossary.tex
-2022/07/15 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
-2022/07/15 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
-2022/07/15 | 626191 | macros/latex/contrib/l3kernel/expl3.pdf
-2022/07/15 | 6182 | macros/latex/contrib/l3kernel/l3.ins
-2022/07/15 | 57887 | macros/latex/contrib/l3kernel/l3prop.dtx
-2022/07/15 | 57245 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
-2022/07/15 | 558089 | macros/latex/contrib/l3kernel/l3doc.pdf
-2022/07/15 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
-2022/07/15 | 51059 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
-2022/07/15 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
-2022/07/15 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
-2022/07/15 | 49311 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
-2022/07/15 | 4904 | macros/latex/contrib/tkz/tkz-base/latex/tkz-obj-marks.tex
-2022/07/15 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
-2022/07/15 | 47217 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
-2022/07/15 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
-2022/07/15 | 4650 | macros/latex/contrib/tkz-doc/doc/latex/tkz-doc.tex
-2022/07/15 | 4538 | macros/latex/contrib/l3kernel/l3legacy.dtx
-2022/07/15 | 44249 | macros/latex/contrib/l3kernel/l3prefixes.csv
-2022/07/15 | 442465 | macros/latex/contrib/tkz/tkz-base.zip
-2022/07/15 | 4366 | macros/latex/contrib/tkz/tkz-base/latex/tkz-lib-marks.tex
-2022/07/15 | 43212 | macros/latex/contrib/l3kernel/l3debug.dtx
-2022/07/15 | 42965 | macros/latex/contrib/tkz-doc.zip
-2022/07/15 | 4278193 | install/macros/latex/contrib/lwarp.tds.zip
-2022/07/15 | 42383 | macros/latex/contrib/l3kernel/l3text.dtx
-2022/07/15 | 40705 | macros/latex/contrib/l3kernel/l3sort.dtx
-2022/07/15 | 39672 | macros/latex/contrib/l3kernel/CHANGELOG.md
-2022/07/15 | 395879 | macros/latex/contrib/l3kernel/l3news.pdf
-2022/07/15 | 3929 | macros/latex/contrib/l3kernel/README.md
-2022/07/15 | 38121 | macros/latex/contrib/tkz-doc/doc/tkz-doc.pdf
-2022/07/15 | 3680451 | macros/latex/contrib/lwarp.zip
-2022/07/15 | 362010 | macros/latex/contrib/tkz/tkz-base/doc/tkz-base.pdf
-2022/07/15 | 3579 | macros/latex/contrib/tkz/tkz-base/latex/tkz-base.sty
-2022/07/15 | 35621 | macros/latex/contrib/l3kernel/l3quark.dtx
-2022/07/15 | 3482 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-misc.tex
-2022/07/15 | 3474 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-base.tex
-2022/07/15 | 3466 | macros/latex/contrib/tkz/tkz-base/latex/tkz-obj-grids.tex
-2022/07/15 | 34166 | macros/latex/contrib/l3kernel/l3intarray.dtx
-2022/07/15 | 337868 | systems/texlive/tlnet/archive/eulerpx.doc.r63890.tar.xz
-2022/07/15 | 33607 | macros/latex/contrib/lwarp/lwarp.ins
-2022/07/15 | 33116 | macros/latex/contrib/l3kernel/l3sys.dtx
-2022/07/15 | 32430 | macros/latex/contrib/l3kernel/l3cctab.dtx
-2022/07/15 | 3191275 | macros/latex/contrib/lwarp/lwarp.pdf
-2022/07/15 | 304577 | macros/latex/contrib/l3kernel/l3regex.dtx
-2022/07/15 | 29836 | macros/latex/contrib/lwarp/lwarpmk.lua
-2022/07/15 | 2978 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-text.tex
-2022/07/15 | 296253 | macros/latex/contrib/l3kernel/l3styleguide.pdf
-2022/07/15 | 2947 | macros/latex/contrib/lwarp/lwarp_tutorial.txt
-2022/07/15 | 293936 | systems/texlive/tlnet/archive/zhnumber.doc.r63898.tar.xz
-2022/07/15 | 2872 | systems/texlive/tlnet/archive/eulerpx.r63890.tar.xz
-2022/07/15 | 2846639 | macros/latex/contrib/lwarp/lwarp.dtx
-2022/07/15 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
-2022/07/15 | 2762 | macros/latex/contrib/tkz/tkz-base/README.md
-2022/07/15 | 2742 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-modules.tex
-2022/07/15 | 2724 | macros/latex/contrib/tkz/tkz-base/latex/tkz-obj-rep.tex
-2022/07/15 | 2720 | systems/texlive/tlnet/archive/jpneduenumerate.r63893.tar.xz
-2022/07/15 | 2703 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-print.tex
-2022/07/15 | 25650 | macros/latex/contrib/l3kernel/l3fp-random.dtx
-2022/07/15 | 250139 | macros/latex/contrib/l3kernel/l3news09.pdf
-2022/07/15 | 24819 | macros/latex/contrib/l3kernel/source3body.tex
-2022/07/15 | 24673 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
-2022/07/15 | 242927 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
-2022/07/15 | 2390 | macros/latex/contrib/l3kernel/l3docstrip.dtx
-2022/07/15 | 23892 | macros/latex/contrib/jpneduenumerate/jpneduenumerate.tex
-2022/07/15 | 23867 | macros/latex/contrib/l3kernel/l3luatex.dtx
-2022/07/15 | 231332 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
-2022/07/15 | 23011 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
-2022/07/15 | 2256 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-colors.tex
-2022/07/15 | 2229 | macros/latex/contrib/l3kernel/source3.tex
-2022/07/15 | 221664 | systems/texlive/tlnet/archive/xecjk.r63899.tar.xz
-2022/07/15 | 21643 | macros/latex/contrib/l3kernel/l3text-purify.dtx
-2022/07/15 | 21589 | macros/latex/contrib/l3kernel/l3deprecation.dtx
-2022/07/15 | 206472 | systems/texlive/tlnet/archive/xpinyin.doc.r63897.tar.xz
-2022/07/15 | 204990 | macros/latex/contrib/l3kernel/l3news12.pdf
-2022/07/15 | 201044 | systems/texlive/tlnet/archive/xpinyin.r63897.tar.xz
-2022/07/15 | 1995 | macros/latex/contrib/tkz/tkz-base/latex/tkz-lib-shape.tex
-2022/07/15 | 19641 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
-2022/07/15 | 1908 | macros/latex/contrib/l3kernel/interface3.tex
-2022/07/15 | 18531 | macros/latex/contrib/l3kernel/l3fp-round.dtx
-2022/07/15 | 18263 | macros/latex/contrib/tkz/tkz-base/latex/tkz-obj-axes.tex
-2022/07/15 | 17886 | macros/latex/contrib/tkz/tkzexample/doc/latex/tkzexample.tex
-2022/07/15 | 1768619 | macros/latex/contrib/l3kernel/interface3.pdf
-2022/07/15 | 170063 | macros/latex/contrib/l3kernel/l3news11.pdf
-2022/07/15 | 16686 | macros/latex/contrib/jpneduenumerate/jpneduenumerate.sty
-2022/07/15 | 163454 | macros/latex/contrib/l3kernel/l3news08.pdf
-2022/07/15 | 1623 | macros/latex/contrib/lwarp/README.txt
-2022/07/15 | 1618392 | systems/texlive/tlnet/archive/xecjk.doc.r63899.tar.xz
-2022/07/15 | 161713 | macros/latex/contrib/jpneduenumerate/jpneduenumerate.pdf
-2022/07/15 | 160748 | systems/texlive/tlnet/archive/jpneduenumerate.doc.r63893.tar.xz
-2022/07/15 | 15954 | macros/latex/contrib/tkz/tkzexample/latex/tkzexample.sty
-2022/07/15 | 156373 | macros/latex/contrib/l3kernel/l3doc.dtx
-2022/07/15 | 151855 | macros/latex/contrib/l3kernel/l3docstrip.pdf
-2022/07/15 | 151573 | macros/latex/contrib/l3kernel/l3news06.pdf
-2022/07/15 | 15127 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
-2022/07/15 | 150676 | macros/latex/contrib/l3kernel/l3news02.pdf
-2022/07/15 | 150279 | macros/latex/contrib/l3kernel/l3news10.pdf
-2022/07/15 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
-2022/07/15 | 14882 | macros/latex/contrib/l3kernel/l3pdf.dtx
-2022/07/15 | 148702 | macros/latex/contrib/l3kernel/l3news03.pdf
-2022/07/15 | 145318 | macros/latex/contrib/l3kernel/l3tl.dtx
-2022/07/15 | 14436 | systems/texlive/tlnet/archive/zhnumber.source.r63898.tar.xz
-2022/07/15 | 13930898 | install/macros/latex/contrib/l3kernel.tds.zip
-2022/07/15 | 13673537 | macros/latex/contrib/l3kernel.zip
-2022/07/15 | 136304 | macros/latex/contrib/l3kernel/l3file.dtx
-2022/07/15 | 13313 | macros/latex/contrib/tkz/tkz-base/latex/tkz-obj-points.tex
-2022/07/15 | 130988 | systems/texlive/tlnet/archive/ctex.r63891.tar.xz
-2022/07/15 | 128799 | macros/latex/contrib/l3kernel/l3basics.dtx
-2022/07/15 | 128309 | macros/latex/contrib/l3kernel/l3news07.pdf
-2022/07/15 | 12783 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
-2022/07/15 | 127089 | macros/latex/contrib/l3kernel/l3keys.dtx
-2022/07/15 | 124233 | macros/latex/contrib/l3kernel/l3token.dtx
-2022/07/15 | 122710 | macros/latex/contrib/l3kernel/l3news01.pdf
-2022/07/15 | 1216 | macros/latex/contrib/tkz/tkz-base/latex/tkz-tools-BB.tex
-2022/07/15 | 1209900 | systems/texlive/tlnet/archive/profcollege.r63895.tar.xz
-2022/07/15 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
-2022/07/15 | 11781 | macros/latex/contrib/l3kernel/l3fparray.dtx
-2022/07/15 | 114588 | macros/latex/contrib/l3kernel/l3news04.pdf
-2022/07/15 | 1143636 | systems/texlive/tlnet/archive/ctex.doc.r63891.tar.xz
-2022/07/15 | 113422 | macros/latex/contrib/l3kernel/l3str-convert.dtx
-2022/07/15 | 112487 | macros/latex/contrib/l3kernel/l3news05.pdf
-2022/07/15 | 11216 | macros/latex/contrib/tkz/tkz-base/latex/tkz-base.cfg
-2022/07/15 | 1098 | macros/latex/contrib/tkz-doc/README.md
-2022/07/15 | 10852 | systems/texlive/tlnet/archive/xpinyin.source.r63897.tar.xz
-2022/07/15 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
-2022/07/15 | 107220 | macros/latex/contrib/l3kernel/l3color.dtx
-2022/07/15 | 106428 | macros/latex/contrib/l3kernel/l3expan.dtx
-2022/07/15 | 1053 | macros/latex/contrib/jpneduenumerate/README.md
-2022/07/15 | 105029 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
-2022/07/15 | 102047 | macros/latex/contrib/tkz/tkzexample.zip
-2022/07/15 | 10111 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
diff --git a/graphics/figput/LICENSE.txt b/graphics/figput/LICENSE.txt
new file mode 100644
index 0000000000..c3d3112c05
--- /dev/null
+++ b/graphics/figput/LICENSE.txt
@@ -0,0 +1,342 @@
+
+This license applies to everything except pdf.js and pdf.worker.min.js,
+which are under the Apache 2.0 license.
+
+Creative Commons Attribution-ShareAlike 4.0 International Public License
+ https://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+By exercising the Licensed Rights (defined below), You accept and
+agree to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+Section 1 – Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+Section 2 – Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ A. reproduce and Share the Licensed Material, in whole or in
+ part; and
+
+ B. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with its
+ terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in all
+ media and formats whether now known or hereafter created, and
+ to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including technical
+ modifications necessary to circumvent Effective Technological
+ Measures. For purposes of this Public License, simply making
+ modifications authorized by this Section 2(a)(4) never
+ produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ A. Offer from the Licensor – Licensed Material. Every
+ recipient of the Licensed Material automatically receives
+ an offer from the Licensor to exercise the Licensed Rights
+ under the terms and conditions of this Public License.
+
+ B. Additional offer from the Licensor – Adapted
+ Material. Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material under
+ the conditions of the Adapter’s License You apply.
+
+ C. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not licensed
+ under this Public License, nor are publicity, privacy, and/or
+ other similar personality rights; however, to the extent
+ possible, the Licensor waives and/or agrees not to assert any
+ such rights held by the Licensor to the limited extent
+ necessary to allow You to exercise the Licensed Rights, but
+ not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this Public
+ License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society under
+ any voluntary or waivable statutory or compulsory licensing
+ scheme. In all other cases the Licensor expressly reserves any
+ right to collect such royalties.
+
+Section 3 – License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ A. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by the
+ Licensor (including by pseudonym if designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ B. indicate if You modified the Licensed Material and retain
+ an indication of any previous modifications; and
+
+ C. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter’s License You apply must be a Creative Commons
+ license with the same License Elements, this version or later,
+ or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition in
+ any reasonable manner based on the medium, means, and context
+ in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+Section 4 – Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+ including for purposes of Section 3(b); and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+Section 5 – Disclaimer of Warranties and Limitation of Liability.
+
+ a. Unless otherwise separately undertaken by the Licensor, to the
+ extent possible, the Licensor offers the Licensed Material as-is
+ and as-available, and makes no representations or warranties of
+ any kind concerning the Licensed Material, whether express,
+ implied, statutory, or other. This includes, without limitation,
+ warranties of title, merchantability, fitness for a particular
+ purpose, non-infringement, absence of latent or other defects,
+ accuracy, or the presence or absence of errors, whether or not
+ known or discoverable. Where disclaimers of warranties are not
+ allowed in full or in part, this disclaimer may not apply to You.
+
+ b. To the extent possible, in no event will the Licensor be liable to
+ You on any legal theory (including, without limitation,
+ negligence) or otherwise for any direct, special, indirect,
+ incidental, consequential, punitive, exemplary, or other losses,
+ costs, expenses, or damages arising out of this Public License or
+ use of the Licensed Material, even if the Licensor has been
+ advised of the possibility of such losses, costs, expenses, or
+ damages. Where a limitation of liability is not allowed in full or
+ in part, this limitation may not apply to You.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+Section 6 – Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the violation;
+ or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+Section 7 – Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+Section 8 – Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
diff --git a/graphics/figput/README.md b/graphics/figput/README.md
new file mode 100644
index 0000000000..132ba6e8ea
--- /dev/null
+++ b/graphics/figput/README.md
@@ -0,0 +1,15 @@
+
+Use JavaScript to add interactive figures to LaTeX documents
+
+See figput-manual.pdf for a detailed overview.
+
+See https://rsfairman.github.io/figput-example/ for a running example.
+
+Suggestions for improvement can be made under "issues" at
+
+https://github.com/rsfairman/figput
+
+and I can be reached directly at rsfairman@yahoo.com.
+
+
+
diff --git a/graphics/figput/example/example.pdf b/graphics/figput/example/example.pdf
new file mode 100644
index 0000000000..36c2f0e60e
--- /dev/null
+++ b/graphics/figput/example/example.pdf
Binary files differ
diff --git a/graphics/figput/example/example.tex b/graphics/figput/example/example.tex
new file mode 100644
index 0000000000..ab5bfc6b6f
--- /dev/null
+++ b/graphics/figput/example/example.tex
@@ -0,0 +1,2342 @@
+
+\documentclass[10pt]{article}
+
+% This file was written to demonstrate this package.
+\usepackage{figput}
+
+% Allows various tweaks to itemize as optional arguments.
+\usepackage{enumitem}
+
+% Allows \verb in footnotes
+\usepackage{fancyvrb}
+
+
+\begin{document}
+
+% Need this for fancyvrb to work.
+\VerbatimFootnotes
+
+
+% Getting this right may involve some experimentation.
+\SetInnerMargin{135pt}
+\SetOuterMargin{135pt}
+
+% Turn this on to show figures or off to save time.
+\NeverSkip
+
+% Some of the \FigPut commands refer to this code.
+\LoadFigureCode{externalcode.js}
+
+
+This document demonstrates some of the features of \textsc{FigPut}. It
+consists of a series of snippets of exposition. There are a few simple
+examples -- B\'ezier curves, the ellipse and diffiusion -- followed by
+a more extended example about gears.
+
+% Much of what follows uses the figput *environment*. This uses the
+% \FigPut *command*.
+\begin{figure}[b!]
+\FigPut{bezier,175bp}[17bp,22bp,done,skip]
+\caption{A Cubic B\'ezier Curve}
+\label{fig-cubic-bezier}
+\end{figure}
+
+\section{Example: B\'ezier Curves}
+
+B\'ezier curves are a convenient way of defining curves in the
+plane. They can be defined using Bernstein polynomials. The
+Bernstein polynomials of degree $n$ are defined by
+$$B_i^n(t) = {n \choose i} t^i (1-t)^{n-i},\qquad i=0,\ldots,n.$$
+A cubic B\'ezier curve is a linear combination of the Bernstein
+polynomials of degree 3:
+$$C(t) = \sum_{i=0}^3 p_i B_i^3(t),$$
+where the four $p_i$ are points in the plane and $t$ is limited to
+$[0,1]$. This can be written as the pair of equations $(x(t),y(t))=
+C(t)$, where
+\begin{eqnarray*}
+x(t) &=& x_1\cdot (1-t)^3 + x_2\cdot 3(1-t)^2t + x_3\cdot 3(1-t)t^2 +
+x_4\cdot t^3 \\
+y(t) &=& y_1\cdot (1-t)^3 + y_2\cdot 3(1-t)^2t + y_3\cdot 3(1-t)t^2 +
+y_4\cdot t^3,
+\end{eqnarray*}
+$(x_i,y_i) = p_i$ and the indices on the $p_i$ have been
+shifted. We have $C(0) = p_1$ and $C(1)=p_4$ and the other two points
+act as ``controls.'' See Figure (\ref{fig-cubic-bezier}), noting that
+the line determined by the pair of points controlling each end of the curve is
+tangent to the corresponding end-point of the B\'ezier curve.
+
+\section{Example: Drawing an Ellipse}
+
+One way to define an ellipse is illustrated by Figure
+(\ref{fig-ellipse-draw}). Choose two points, $F_1$ and $F_2$ (the
+{\bf foci}), and fix some $k>0$. The ellipse is then
+the set of points, $P$, satisfying
+$$d(P,F_1) + d(P,F_2) = k,$$
+where $d(A,B)$ is the distance from $A$ to $B$.
+
+The figure makes it clear why this is sometimes refered to as the
+``tacks and string'' definition. Imagine tacking each end of a bit of
+string, of length $k$, to the two foci; then tracing out the ellipse
+by holding a pencil at the limit of what the string will allow as the
+pencil travels about the foci.
+
+\begin{figure}
+\begin{figput}{elldraw,175bp}[done,skip]
+ function elldraw(ctx) {
+
+ // The length of the string.
+ let k = 150;
+
+ let yaxis = 85;
+
+ // Limit these two points to be along the line y = yaxis.
+ let w1 = DraggableDotWidget.register(ctx,125,yaxis,'d1');
+ let w2 = DraggableDotWidget.register(ctx,225,yaxis,'d2');
+
+ // We need a LoopAnimWidget for an animation, even though we never want
+ // see the widget.
+ let numSteps = 1000;
+ let loopw = LoopAnimWidget.register(ctx,-100,100,1.0,
+ false, // hidden
+ numSteps, // steps per loop
+ 0, // starting step
+ 10, // ms time step
+ false,false,false,false,false, // nothing is visible
+ 'loop');
+
+ w1.widgetY = yaxis;
+ w2.widgetY = yaxis;
+
+ // The origin is the mid-point.
+ let cx = (w1.widgetX + w2.widgetX) / 2;
+ let cy = yaxis;
+
+ // c = distance from foci to center, a = x-radius and b = y-radius.
+ let c = Math.abs(w1.widgetX - cx);
+ let a = k / 2;
+ let b = Math.sqrt(a*a - c*c);
+
+ // The ellipse
+ let p = new FPath();
+ p.ellipse(cx,cy,a,b,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 1.5;
+ ctx.stroke(p);
+
+ // An animation, based on the parameterization p(t) = (a cos(t),b sin(t)).
+ // This based on the eccentric angle, so time won't seem to be
+ // constant, but that's OK. This is easier.
+ let t = 2*Math.PI * loopw.curStep / numSteps;
+ let px = a * Math.cos(t) + cx;
+ let py = b * Math.sin(t) + cy;
+
+ p = new FPath();
+ p.moveTo(cx - c,yaxis);
+ p.lineTo(px,py);
+ p.lineTo(cx + c,yaxis);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // In this case (unlike most others), the widgets must be explicitly drawn.
+ w1.draw(ctx);
+ w2.draw(ctx);
+}
+\end{figput}
+\caption{Tacks-and-string Ellipse}
+\label{fig-ellipse-draw}
+\end{figure}
+
+\section{Example: Diffusion}
+
+The concept of diffusion is illustrated by Figure
+(\ref{fig-boltzmann}). Statistical mechanics and Boltzmann's equation
+explain concepts like heat transfer and the gas laws by modeling the
+random motion of many particles. These equations may be difficult to grasp,
+but an intuitive understanding is not difficult. At time zero, there
+is some set of particles on the left half of the box, each of which is
+moving with some randomly distributed momentum. The divider is removed
+and, over time, the particles distribute themselves more evenly
+throughout the box.
+
+\begin{figure}
+\begin{figput}{diffusion,180bp}[0bp,30bp,done,skip]
+function diffusion(ctx) {
+
+ // This is an open-ended animation.
+ let wanim = OpenAnimWidget.register(ctx,50,-32,1.0,
+ 200, // horizontal size
+ true, // visible
+ 10, // time step (ms)
+ 10000, // decay
+ false, // steps not visible
+ true, // fast/slow visible
+ true, // pause/run visible
+ true, // time bar visible
+ false, // time bar not grabable.
+ 'anim');
+
+ // A button for removing the divider.
+ let wbut = ButtonWidget.register(ctx,-85,32,'Open/Restart','but');
+
+ // Draw the enclosing box.
+ let p = new FPath();
+ p.moveTo(1,2);
+ p.lineTo(300,2);
+ p.lineTo(300,178);
+ p.lineTo(1,178);
+ p.closePath();
+ ctx.lineWidth = 3;
+ ctx.fillStyle = 'black';
+ ctx.strokeStyle = 'black';
+ ctx.stroke(p);
+
+ // These define the box for the particles.
+ let boxleft = 5;
+ let boxright = 150;
+ let boxbot = 4;
+ let boxtop = 175;
+ let boxdivider = 145;
+
+ if ((diffusion.started === undefined) || (wbut.resetState === true))
+ {
+ wbut.resetState = false;
+ wanim.curStep = 0;
+
+ // Allocate 100 dots in the left half of the box.
+ // Each needs a position and direction.
+ diffusion.pos = [];
+ diffusion.dir = [];
+ for (let i = 0; i < 100; i++)
+ {
+ // Position
+ let r = Math.random();
+ let x = boxleft + r*(boxdivider - boxleft - 4);
+
+ r = Math.random();
+ let y = boxbot + r*(boxtop-boxbot)
+ diffusion.pos.push({x: x, y: y});
+
+ // Direction vector. Say each is evenly distributed over
+ // (0,1). That is not physically correct, but that's OK.
+ // To make this better, consider how the balls could bounce
+ // off of each other. That's messy, so I let them pass
+ // through one another, and only consider bouncing off walls.
+ let vx = (Math.random() - 0.50) / 2.0 ;
+ let vy = Math.sqrt(0.25*0.25 - vx*vx);
+ if (Math.random() > 0.50)
+ vy *= -1;
+
+ // Don't let either value be too small. It looks weird.
+ if (Math.abs(vx) < 0.05)
+ {
+ if (vx < 0.0)
+ vx = -0.05;
+ else
+ vx = 0.05;
+ }
+ if (Math.abs(vy) < 0.05)
+ {
+ if (vy < 0.0)
+ vy = -0.05;
+ else
+ vy = 0.05;
+ }
+
+ diffusion.dir.push({x: vx, y: vy});
+ }
+
+ diffusion.started = true;
+ }
+
+ // As noted, we only consider bouncing off walls. Assume that a ball
+ // moves from it's old position to new by the dir vector with each
+ // time step. If that would take the ball outside the rectangle, then
+ // we must consider reflection.
+ let dotR = 3;
+
+ // Draw the "wall" if it's closed.
+ if (wbut.clickState === false)
+ {
+ p = new FPath();
+ p.moveTo(boxdivider,2);
+ p.lineTo(boxdivider,boxtop + 2);
+ ctx.lineWidth = 3;
+ ctx.stroke(p);
+ }
+
+ // This depends on whether the wall is up.
+ let rightEdge = boxdivider - 3;
+
+ if (wbut.clickState === true)
+ rightEdge = 299;
+
+ for (let i = 0; i < diffusion.pos.length; i++)
+ {
+ let pold = diffusion.pos[i];
+ let vold = diffusion.dir[i];
+
+ let pnew = {x: pold.x + vold.x, y: pold.y + vold.y};
+ //console.log(i+ ' ' +pnew.y);
+ if (pnew.y < boxbot)
+ {
+ // Bounced off top edge.
+ // If each step takes 1 unit of time, then it hit the edget at
+ // Actually... be sloppy. I'm not really doing physics; I just
+ // want to demonstrate the FigPut system.
+ // The balls are moving slowly, so only allow them to reflect
+ // at the time of the step divisions.
+ diffusion.dir[i].y *= -1;
+ }
+ if (pnew.y > boxtop)
+ {
+ // Bottom edge bounce.
+ diffusion.dir[i].y *= -1;
+ }
+ if (pnew.x < boxleft)
+ // Left edge bounce.
+ diffusion.dir[i].x *= -1;
+ if (pnew.x > rightEdge - 2)
+ // Right edge bounce.
+ diffusion.dir[i].x *= -1;
+
+ // Redo, after taking reflections into account.
+ vold = diffusion.dir[i];
+ pnew = {x: pold.x + vold.x, y: pold.y + vold.y};
+
+ diffusion.pos[i] = pnew;
+
+ p = new FPath();
+ p.ellipse(pnew.x,pnew.y,dotR,dotR,0,0,2*Math.PI);
+ ctx.fill(p);
+ }
+}
+\end{figput}
+\caption{Diffusion and Boltzmann's Equation}
+\label{fig-boltzmann}
+\end{figure}
+
+\newpage
+
+\section{Example: Gears}
+
+Gears like those in Figure (\ref{fig-gear-toy}) might work after a
+fashion, but it's rare to see such gears in anything other than a
+child's toy. As a rule, gears take the form shown in Figure
+(\ref{fig-final-gear}). Why?
+
+\begin{figure}[b!]
+\begin{figput}{badgear,130bp}[done,skip]
+function badgear(ctx) {
+
+ var path1 = new FPath();
+
+ let numTeeth = 17;
+ let cx = 70;
+ let cy = 65;
+ let inR = 40;
+ let outR = 50;
+
+ path1 = new FPath();
+
+ // A dot at the center.
+ path1.ellipse(cx,cy,2,2,0,0,2*Math.PI);
+ ctx.fillStyle = 'black';
+ ctx.fill(path1);
+
+ // The teeth of the gear.
+ path1 = new FPath();
+
+ // One degree, in radians, then 360 and 180 degrees.
+ let d = Math.PI / 180;
+ let d360 = 2 * Math.PI;
+ let d180 = Math.PI;
+
+ let x = cx + inR * Math.cos(0);
+ let y = cy + inR * Math.sin(0);
+ path1.moveTo(x,y);
+
+ let deltaA = Math.PI/numTeeth;
+
+ for (let i = 0; i < numTeeth; i++)
+ {
+ x = cx + inR * Math.cos(2 * i * deltaA + deltaA);
+ y = cy + inR * Math.sin(2 * i * deltaA + deltaA);
+ path1.lineTo(x,y);
+
+ x = cx + outR * Math.cos(2 * i * deltaA + deltaA);
+ y = cy + outR * Math.sin(2 * i * deltaA + deltaA);
+ path1.lineTo(x,y);
+
+ x = cx + outR * Math.cos(2 * i * deltaA + deltaA + deltaA);
+ y = cy + outR * Math.sin(2 * i * deltaA + deltaA + deltaA);
+ path1.lineTo(x,y);
+
+ x = cx + inR * Math.cos(2 * i * deltaA + deltaA + deltaA);
+ y = cy + inR * Math.sin(2 * i * deltaA + deltaA + deltaA);
+ path1.lineTo(x,y);
+ }
+
+ path1.closePath();
+ ctx.lineWidth = 1.5;
+ ctx.stroke(path1);
+
+ // Now the triangular teeth.
+ numTeeth = 21;
+ cx = 230;
+ outR = 60;
+
+ path1 = new FPath();
+ path1.ellipse(cx,cy,2,2,0,0,2*Math.PI);
+ ctx.fill(path1);
+
+ path1 = new FPath();
+
+ x = cx + + inR * Math.cos(0);
+ y = cy + inR * Math.sin(0);
+ path1.moveTo(x,y);
+
+ for (let i = 0; i < numTeeth; i++)
+ {
+ x = cx + outR * Math.cos(i * d360/numTeeth + d180/numTeeth);
+ y = cy + outR * Math.sin(i * d360/numTeeth + d180/numTeeth);
+ path1.lineTo(x,y);
+
+ x = cx + inR * Math.cos((i+1) * d360/numTeeth);
+ y = cy + inR * Math.sin((i+1) * d360/numTeeth);
+ path1.lineTo(x,y);
+ }
+ path1.closePath();
+ ctx.stroke(path1);
+}
+
+\end{figput}
+\caption{Crude Gear Designs}
+\label{fig-gear-toy}
+\end{figure}
+
+Figure (\ref{fig-gear-spoke}) illustrates the fundamental problem of
+gear design, using a particularly bad design. The ``gears'' here have
+been reduced to something more like spokes. The gear on the right
+rotates counter-clockwise at a constant rate and drives the gear on
+the left. As the gears rotate, the rate of rotation of the gear on the
+left will not be constant; at some positions, the left gear is nearly
+stationary and at other positions, it rotates much faster than the
+gear on the right. In addition, the point of contact slides,
+generating friction and wear.
+
+\begin{figure}
+\begin{figput}{badspokegear,130bp}[done,skip]
+function badspokegear(ctx) {
+
+ // Two gear-like pinwheels, where the one on the right drives the one on
+ // the left. The idea is to show how the rotation surges, and why something
+ // like involvolute gears are needed.
+ //
+ // Modeling this is surprisingly fiddly. There's no need to make this
+ // fully general, for all possible arrangements, and it's not too bad
+ // if we restrict things a bit.
+ //
+ // In general (too general), suppose that the two sets of spokes have
+ // lengths R1 and R2. Think of the gear on the right driving the
+ // gear on the left, with the gear on the right rotating ccw (under the
+ // usual RH coordinate system). WLOG, assume that the two axles are on the
+ // x-axis. We want to know where the two spokes initially touch "at
+ // the top," but it's actually easier to figure out where the last touch
+ // "at the bottom."
+ //
+ // To simplify, assume that all spokes (on both gears) have the same
+ // length, R. And assume that the centers of these gears are at
+ // (-x,0) and (x,0) so that the centers are 2x appart. Obviously, R > x
+ // for the gears to mesh at all.
+ //
+ // Since the spokes are all the same length, it's easy to see that
+ // The angle of the RH spoke at the top is alpha above the x-axis when
+ // the spokes initally touch, and alpha below the x-axs when they cease
+ // to touch. Here, alpha is defined by
+ // cos(alpha) = x/R.
+ //
+ // Furthermore, let delta be the angle from spoke to spoke, so the
+ // number of spokes is 2 pi / delta. Assume that both gears have the
+ // same number of spokes. Note that delta must be less than 2 alpha
+ // for the spokes to always be in contact. Ideally, I want delta to be
+ // large enough so that no more than one pair of spokes (one on left and
+ // on on right) is ever in contact. Otherwise, it's more messy since
+ // you'd have to figure out which pair of spokes is doing the driving.
+ // In fact, it looks like I want delta = 2 alpha, or to put it another
+ // way, given delta, it follows that alpha = delta / 2.
+ //
+ // Now, think about what happens as the point of contact goes from the
+ // top, where the spoke barely touch, downward. The point of contact
+ // stays on the top of the left spoke and slides down on the right spoke.
+ // What you have is a triangle on the left with hypoteneuse R, and a
+ // triangle on the right with hypoteneuse r. We need to determine r.
+ // Let beta be the angle of the right spoke above the x-axis. beta
+ // grows linearly with time, and is fully known...actually, beta
+ // *shrinks* if we think of it as the angle of the right spoke above
+ // the x-axis.
+ //
+ // Let c be the x-coordinate of the point of contact, and let x1 be
+ // the distance from c to -x (the left axle) and x2 be the distance
+ // from c to +x (the right axle). We must have
+ // R^2 - x1^2 = r^2 - x2^2
+ // since the left and right triangles share the same vertical leg.
+ // And x1 + x2 = 2x by construction. The third equation we need
+ // is cos(beta) = x2/r or x2 = r cos(beta).
+ //
+ // Solve these three equations for x1, x2 and r in terms of R and x.
+ // First, use x1 = 2x - x2. Substitute:
+ // R^2 - x1^2 = r^2 - x2^2
+ // R^2 - (2x-x2)^2 = r^2 - x2^2
+ // R^2 - 4x^2 + 4x*x2 - (x2)^2 = r^2 - x2^2
+ // R^2 - 4x^2 + 4x*x2 = r^2
+ //
+ // Now use x2 = r cos(beta) and use C = cos(beta) for brevity:
+ // R^2 - 4x^2 + 4x*x2 = r^2
+ // R^2 - 4x^2 + 4x*(rC) = r^2
+ // r^2 - 4Cx r + 4x^2 - R^2 = 0.
+ // Solve for r by quadatic equation:
+ // r = (1/2) [ 4Cx \pm \sqrt{ 16C^2x^2 - 4(4x^2-R^2) } ]
+ // r = 2Cx \pm \sqrt{ 4C^2x^2 - 4x^2+ R^2 }
+ // r = 2Cx \pm \sqrt{ 4x^2(cos^2(beta) - 1 ) + R^2 }
+ // r = 2Cx \pm \sqrt{ -4x^2 sin^2(beta) + R^2 }
+ //
+ // Aside: note that the discriminant is always postive since R > x.
+ // I'm not sure what the two solutions here might "mean."
+ //
+ // This tells us what is going on from the point when the spokes touch
+ // at the top until you reach the point where they are aligned along the
+ // x-axis. However, we need the angle on the left -- that was the
+ // whole point. We have angle beta on the right, and we want to know
+ // the angle, gamma, on the left.
+ //
+ // We have cos(gamma) = x1/R, where gamma is measured upwards from the
+ // x-axis to the spoke in contact on the left gear (like normal).
+ //
+ // Now do something similar as the point of contact goes below the
+ // x-axis. It's the same basic calculation, except that the tip of the
+ // right spoke is in contact somewhere along the left spoke.
+ // Left and right are reversed.
+ //
+ // We still have x1 + x2 = 2x but now R^2 - x2^2 = r^2 - x1^2, and
+ // cos(beta) = x2/R. It's the same basic game. We get.
+ //
+ // R^2 + 4x^2 - 4x*x2 = r^2
+ // just as before. But now use x2 = R cos(beta) (R, not r) and it's
+ // a simpler problem:
+ // R^2 - 4x^2 + 4x*x2 = r^2
+ // R^2 - 4x^2 + 4x R cos(beta) = r^2
+ // becomes
+ // r = \pm\sqrt{ R^2 - 4x^2 + 4x R cos(beta) }
+ //
+ // BUG: The calculation above treats the spokes as geometric lines, with zero
+ // thickness. Ideally, I should take the width of the lines into account.
+
+ // The presence of this widget means that this is an animation.
+ // The code here will be called on a regular schedule.
+ let stepsPerRev = 500;
+ let startStep = 0;
+ let timeStep = 20;
+
+ let w = LoopAnimWidget.register(ctx,
+ -LoopAnimWidget.Radius,LoopAnimWidget.Radius + LoopAnimWidget.TopHeight,0.75,
+ true,stepsPerRev,startStep,timeStep,
+ true,true,true,true,true,"wigname");
+
+ // BUG: I messed up when I wrote this and inadvertantly did all the
+ // measurements to the wrong scale. Thus, I have to undo my mistake.
+ // The real fix is to change all the constants below so that this
+ // scale() isn't necessary.
+ let mistakeT = ctx.getTransform();
+ ctx.scale(0.5,0.5);
+
+ // The two gears are on opposite sides of this vertical line.
+ let xZero = 300;
+
+ // You can change the number of teeth, but the surging is most apparent
+ // with four teeth (which is the minimum geometrically possible given
+ // the algebra. Somewhere around 6 or 7 teeth it becomes hard to see.
+ // BUG: five teeth generates some kind of "jump" in the animation.
+ // Not sure why.
+ let numTeeth = 4;
+ let spokeLength = 100;
+
+ // The angle between spokes.
+ let delta = 2*Math.PI/numTeeth;
+
+ // Spoke radius and thickness.
+ let R = spokeLength;
+ let spokeWidth = 2;
+
+ // Distance of each spoke axis from the center line.
+ // I want the top pair of spokes to make contact at the same instant
+ // that the bottom pair of spokes ceases contact. That requires
+ let x = R * Math.cos(delta/2);
+
+ // Draw the spokes on the right. These are the drivers, so the angle rises
+ // linearly with time.
+ let cx = (xZero + x);
+ let cy = 140;
+
+ var path1 = new FPath();
+
+ // A dot at the center, probably not necessary.
+ path1.ellipse(cx,cy,2.0*spokeWidth,2.0*spokeWidth,0,0,2*Math.PI);
+ ctx.fill(path1);
+
+ // Angle by which the gear has rotated, based on the step of the animation.
+ let rotA = w.curStep * 2 * Math.PI / stepsPerRev;
+
+ for (let i = 0; i < numTeeth; i++)
+ {
+ path1 = new FPath();
+
+ let angle = i*delta + rotA;
+ while (angle < 0)
+ angle += 2 * Math.PI;
+ while (angle > 2*Math.PI)
+ angle -= 2 * Math.PI;
+
+ path1.moveTo(cx,cy);
+ let x = cx + R * Math.cos(angle);
+ let y = cy + R * Math.sin(angle);
+ path1.lineTo(x,y);
+
+ ctx.strokeStyle = "black";
+ ctx.lineWidth = spokeWidth;
+ ctx.stroke(path1);
+ }
+
+ // Now the left, driven, set of spokes.
+ cx = (xZero - x);
+
+ // Figure out which of the spokes on the right gear is the one in contact
+ // and doing the driving. It's the one whose angle relative to the
+ // x-axis is between delta/2 above and delta/2 below the axis.
+ // To put it another way, its angle is in the range pi\pm delta/2.
+ // This could have been noted in the loop above.
+ let contactAngle = 0.0;
+ for (let i = 0; i < numTeeth; i++)
+ {
+ let angle = i*delta + rotA;
+ while (angle < 0)
+ angle += 2 * Math.PI;
+ while (angle > 2*Math.PI)
+ angle -= 2 * Math.PI;
+
+ if ((angle < Math.PI + delta/2) && (angle > Math.PI - delta/2))
+ {
+ contactAngle = angle;
+ break;
+ }
+ }
+
+ // contactAngle is the angle of the right gear's "contact spoke," but
+ // measured from the right. I want beta (in the notation above), measured
+ // from the left side, to put it in the range [-delta/2,+delta/2].
+ contactAngle = Math.PI - contactAngle;
+
+ var gamma = 0;
+ if (contactAngle >= 0)
+ {
+ // The point of contact is above the x-axis. Slightly messier case.
+ let beta = contactAngle;
+ let disc = R*R - 4*x*x*Math.sin(beta)*Math.sin(beta);
+ let root = Math.sqrt(disc);
+
+ // Conceptually, I'm not sure why, but this seems to be the right
+ // choice -- minus, not plus.
+ let r = 2 * Math.cos(beta) * x - root;
+
+ let x2 = r * Math.cos(beta);
+ let x1 = 2 * x - x2;
+
+ // I didn't address this in the long comment above, but
+ // (x1,sqrt(R^2-x1^2)) is the end-point of the left spoke in
+ // contact with the right spoke. The angle for this spoke is thus
+ // gamma, where cos(gamma) = x1/R.
+ gamma = Math.acos(x1/R);
+ }
+ else
+ {
+ // The point of contact is below the x-axis, hence the minus to
+ // make beta positive.
+ let beta = -contactAngle;
+ let disc = R*R + 4*x*x - 4*x*R*Math.cos(beta);
+ let r = Math.sqrt(disc);
+
+ let x2 = R * Math.cos(beta);
+ let x1 = 2 * x - x2;
+
+ gamma = 2*Math.PI - Math.acos(x1/r);
+ }
+
+ // A dot at the center, probably not necessary.
+ path1 = new FPath();
+ path1.ellipse(cx,cy,2.0*spokeWidth,2.0*spokeWidth,0,0,2*Math.PI);
+ ctx.fill(path1);
+
+ // Draw the left spokes, based on gamma.
+ rotA = -w.curStep * 2 * Math.PI / stepsPerRev;
+
+ for (let i = 0; i < numTeeth; i++)
+ {
+ path1 = new FPath();
+
+ path1.moveTo(cx,cy);
+ let x = cx + R * Math.cos(i*delta + gamma);
+ let y = cy + R * Math.sin(i*delta + gamma);
+
+ path1.lineTo(x,y);
+
+ ctx.lineWidth = spokeWidth;
+ ctx.stroke(path1);
+ }
+
+ // BUG: Undo the above fix of my scaling mistake.
+ ctx.setTransform(mistakeT);
+}
+\end{figput}
+\caption{Maybe the Worst Possible Gears?}
+\label{fig-gear-spoke}
+\end{figure}
+
+Understanding how to design gears without the kind of surging motion
+and wear inherent in the gears of Figure (\ref{fig-gear-spoke})
+explains why nearly all modern gears take the form of Figure
+(\ref{fig-final-gear}). The most glaring problem with the
+spoke-like gears is the way their motion varies -- imagine riding in a
+car with a gear-train based on such gears!
+
+Gears typically have what's called \emph{conjugate action},
+meaning that the ratio of their rates of rotation is constant,
+with no surging or lagging. Sometimes this is also called the
+\emph{fundamental law of gearing}, although it would be more accurate
+to call it a ``commonly desired feature,'' rather than a ``law.''
+Arranging the teeth of gears so that they have conjugate action is
+surprisingly tricky.
+
+\subsection{The Involute}
+
+Figure (\ref{fig-basic-gear-constraints}) shows a cam and a lever-arm
+pushing against each other, causing them to rotate about their
+respective axes. Imagine that the cam rotates counter-clockwise,
+pushing the arm downwards. There are several crucial observations:
+\begin{enumerate}[itemsep=-1pt]
+\item The two curves must be tangent at the point of contact.
+\item The force from one part to the other must be directed along a
+ line perpendicular to the two curves at the point of contact. Call
+ this the \emph{line of action}.
+\item Let $P$ be point where the line of action intersects the line
+ connecting the two centers of rotation. This is called the
+ \emph{pitch point}. The instantaneous ratio of
+ the two rates of rotation is equal to the ratio of the distances
+ from $P$ to each of the centers of rotation.
+\end{enumerate}
+In conclusion, if two gears are to have conjugate action, then the
+pitch point must be fixed.
+
+\begin{figure}
+\begin{figput}{gearconstraints,120bp}[done,skip]
+function gearconstraints(ctx) {
+
+ // A static figure. No widgets.
+ //
+ // I wrote this before I changed the framework to assume a RH coordinates
+ // system. Instead of messing around changing the values below, each path
+ // is reflected and translated, much like a transformation matrix.
+
+ // Cam center.
+ let cax = 250;
+ let cay = 80;
+ let ra = 5;
+
+ let p = new FPath();
+ p.ellipse(cax,cay,ra,ra,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+
+ p = p.reflectX();
+ p = p.translate(new Point2D(0,120));
+
+ ctx.stroke(p);
+
+ // Cam itself
+
+ // Right upper
+ let cs = 15; // space to right of axis
+ let h1 = 60; // height above
+ let tan1 = 25; // tightness of tangents
+ let tan2 = 25;
+
+ p = new FPath();
+ p.moveTo(cax+cs,cay);
+ p.bezierCurveTo(cax+cs,cay - tan1,
+ cax-cs + tan2,cay-h1,
+ cax-cs,cay-h1);
+
+ // left upper
+ let h2 = 70; // how far left
+ let t1 = 20; // thickness of arm
+ tan1 = 4;
+ tan2 = 3;
+ p.bezierCurveTo(cax-cs-tan1,cay - h1,
+ cax-cs - h2,cay - h1,
+ cax-cs - h2,cay - h1 + t1);
+
+ // Lower left
+ let h3 = 40; // how far back right
+ p.bezierCurveTo(cax-cs-h2,cay - h1 + t1 + tan2,
+ cax-cs - h2,cay - h1 + 2*t1,
+ cax-cs - h2 + h3,cay - h1 + 2*t1);
+
+ // Inner concave
+ tan1 = 20;
+ tan2 = 20;
+ p.bezierCurveTo(cax-cs-h2 + h3 + tan1,cay - h1 + 2*t1,
+ cax-cs,cay - tan2,
+ cax-cs,cay);
+
+ // lower left below
+ tan1 = 8;
+ tan2 = 8;
+ p.bezierCurveTo(cax-cs,cay + tan1,
+ cax-tan2,cay + cs,
+ cax,cay+cs);
+
+ // lower right below
+ // BUG: It's hard to get these curves to meet smoothly. Need a better 'close'.
+ tan1 = 17;
+ tan2 = 10;
+ p.bezierCurveTo(cax + tan1,cay + cs,
+ cax + cs,cay - tan2,
+ cax + cs,cay);
+
+ ctx.lineWidth = 2.0;
+
+ p = p.reflectX();
+ p = p.translate(new Point2D(0,120));
+
+ ctx.stroke(p);
+
+ // Now something similar for the long arm.
+ // The easiest way to do this is to draw it horizontal, but rotate all the
+ // points by some angle so that the arm touches the cam.
+ cax = 30
+ cay = 100;
+
+ p = new FPath();
+ p.ellipse(cax,cay,ra,ra,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+
+ p = p.reflectX();
+ p = p.translate(new Point2D(0,120));
+
+ ctx.stroke(p);
+
+ // top right
+ cs = 12; // half thickness
+ let L = 150; // length
+
+ p = new FPath();
+ tan1 = 10;
+ tan2 = 10;
+ p.moveTo(cax,cay + cs);
+ p.bezierCurveTo(cax + tan1,cay + cs,
+ cax + L - tan2,cay +cs,
+ cax + L,cay + cs);
+
+ // lower right
+ tan1 = 6;
+ tan2 = 6;
+ p.bezierCurveTo(cax + L + tan1,cay +cs,
+ cax + L + cs,cay + tan2,
+ cax + L + cs,cay);
+
+ // upper right
+ p.bezierCurveTo(cax + L + cs,cay - tan1,
+ cax + L + tan2,cay - cs,
+ cax + L,cay - cs);
+
+ // top
+ p.bezierCurveTo(cax + L - tan1,cay - cs,
+ cax + tan2,cay - cs,
+ cax,cay - cs);
+
+ // upper left
+ p.bezierCurveTo(cax - tan1,cay - cs,
+ cax - cs,cay - tan2,
+ cax - cs,cay);
+
+ // lower left to close
+ p.bezierCurveTo(cax - cs,cay + tan1,
+ cax - tan2,cay + cs,
+ cax,cay + cs);
+
+ // Rotate the entire thing
+ let a = -12 * Math.PI / 180; // angle to rotate
+ let p2 = p.rotateAbout(a,new Point2D(cax,cay));
+
+ ctx.lineWidth = 2.0;
+
+ p2 = p2.reflectX();
+ p2 = p2.translate(new Point2D(0,120));
+
+ ctx.stroke(p2);
+}
+\end{figput}
+\caption{Basic Constraints on Gears}
+\label{fig-basic-gear-constraints}
+\end{figure}
+
+See Figure (\ref{fig-basic-involute}).
+Imagine a string wrapped around the circle, with one end fixed to the
+circle and a pencil at the other end. As the string unwraps from the
+circle, the pencil traces out a
+curve called the involute. The line determined by the string is
+obviously tangent to the circle at the point at which it meets the circle. The
+line is also perpendicular to the involute because, at each
+instantaneous point of rotation, the involute is locally an arc of the
+circle formed by the string. For a circle of radius $r$ centered at the
+origin, the involute can be parameterized by $i(t)=(i_x(t),i_y(t))$, where
+\begin{eqnarray*}
+i_x(t) &=& r (\cos t + t \sin t) \\
+i_y(t) &=& r (\sin t - t \cos t)
+\end{eqnarray*}
+As we will see, the notable thing about the involute is that when gear
+teeth take the form of an involute, the pitch point is constant
+throughout the gears' motion.
+
+\begin{figure}[b!]
+\begin{figput}{basicinvolute,140bp}[done,skip]
+// An extra function to define the involute.
+function invo(t) {
+
+ // Basically, if you have a circle of radius a, the parametric form is
+ // x(t) = a (cos t + t sin t)
+ // y(t) = a (sin t - t cos t)
+ // The parameterization starts with t = 0, then runs as an angle in radians.
+
+ // These values copied from below.
+ let cx = 160;
+ let cy = 52;
+ let a = 50;
+
+ let c = Math.cos(t);
+ let s = Math.sin(t);
+
+ return new Point2D( cx + a*(c + t*s), cy + a*(s - t*c));
+}
+
+function basicinvolute(ctx) {
+
+ // A looping animation that draws an involute. The string unwraps
+ // and re-wraps in a loop. Note the doubling of numSteps since I
+ // want back-and-forth action.
+ let numSteps = 100;
+ let loopw = LoopAnimWidget.register(ctx,-30,55,0.85,
+ true, // visible
+ 2*numSteps, // steps per loop
+ 0, // starting step
+ 20, // ms time step
+ //false,false,false,false,false, // nothing is visible
+ true,true,true,true,true, // Everything visible
+ 'loop');
+
+ let cx = 160;
+ let cy = 52;
+ let r = 50;
+
+ // circle
+ let p = new FPath();
+ p.ellipse(cx,cy,r,r,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // And a dot at the center.
+ p = new FPath();
+ p.ellipse(cx,cy,2,2,0,0,2*Math.PI);
+ ctx.fillStyle = 'black';
+ ctx.fill(p);
+
+ // Draw the involute by converting to a bezier.
+ // The level of ``unwrap'' is determined by the number of steps of
+ // the animation.
+ let t = 2 * Math.abs((loopw.curStep - numSteps) / numSteps);
+ let segs = Math.ceil(15 * t);
+ p = FPath.parametricToBezier(invo,0,t,segs);
+ ctx.lineWidth = 1.2;
+ ctx.stroke(p);
+
+ // The string goes from the end of the involute to a point tangent
+ // to the circle. So, I have a circle centered at
+ // (c_x,c_y) and a point p = (p_x,p_y) = end-point of involute, and
+ // I want the point on the circle such that the line from the point on
+ // the circle to p is tangent to the circle. The circle is parameterized
+ // by (c_x,c_y) + r(cos a,sin a), (a varies) so the tangent to the circle is
+ // parameterized by r(-sin a,cos a). I need such a tangent vector that points
+ // to p. Let t(a) = r(-sin a,cos a) and c(a) = r(cos a,sin a). I need to
+ // find a such that c(a) + s t(s) = p, for some s. Thus, I need to solve
+ // (c_x + r cos a - s r sin a,c_y + r sin a + s r cos a) = (p_x,p_y)
+ // for a and s (although I don't really care about s). We have
+ // c_x + r cos a - s r sin a = p_x implies
+ // s = ( c_x + r cos a - p_x) / r sin a
+ // Plugging into the other coordinate, we get
+ // p_y = c_y + r sin a + s r cos a
+ // p_y = c_y + r sin a + r cos a ( c_x + r cos a - p_x) / r sin a
+ // p_y = c_y + r sin a + cos a ( c_x + r cos a - p_x) / sin a
+ //
+ // BLAH. That is a mess. Easier is to do it by construction.
+ // We have a circle centered at C and a point P. Let D be the midpoint
+ // of line line CP. The circle about D passing through C and P meets the
+ // circle around C at two points, E and F. The line from C to E (or to F)
+ // is a right angle since the angle is ``inscribed'' in the circle about D.
+ // This is a general fact, that if you take two points that are opposite
+ // each other in a circle (C and P in my example) and *any* other point
+ // on that circle, then the angle formed by the two opposite points and
+ // that other point is a right angle.
+ // If that is a right angle, then the line from P to E (or to F) is tangent
+ // to the circle.
+ //
+ // Moral of the story...We have circle centered at (c_x,c_y) and p=(p_x,p_y),
+ // the end-point of involute. The line from p tangent to the circle is
+ // obtained by defining d=(d_x,d_y) as the midpoint of c and p. The
+ // intersection of the circle around d with the circle around c is the
+ // point in question.
+ //
+ // I've reduced to the problem of finding the points of intersection of two
+ // circles. We have
+ // (x-c_x)^2 + (y-c_y)^2 = r_c^2
+ // (x-d_x)^2 + (y-d_y)^2 = r_d^2
+ // Subtract the second from the first to obtain
+ // (x-c_x)^2 - (x-d_x)^2 + (y-c_y)^2 - (y-d_y)^2 = r_c^2 - r_d^2
+ // Expand and collect:
+ // x^2-2xc_x+c_x^2 - x^2+2xd_x-d_x^2 + y^2-2yc_y+c_y^2 - y^2+2yd_y-d_y^2 =
+ // r_c^2 - r_d^2
+ // -2xc_x+c_x^2 +2xd_x-d_x^2 - 2yc_y+c_y^2 +2yd_y-d_y^2 = r_c^2 - r_d^2
+ // 2x(d_x-c_x) + 2y(d_y-c_y) + c_x^2 -d_x^2 +c_y^2 -d_y^2 = r_c^2 - r_d^2
+ // 2x(d_x-c_x) + 2y(d_y-c_y) = (r_c^2-r_d^2) + (c_x^2-d_x^2) + (c_y^2 -d_y^2)
+ // Solve for y (say):
+ // y = x(c_x-d_x) / 2(d_y-c_y) +
+ // [ (r_c^2-r_d^2) + (c_x^2-d_x^2) + (c_y^2 -d_y^2) ] / 2(d_y-c_y)
+ // and plug this back into the original equation for the circle and you
+ // can solve for x. First, write the above eqn for y as
+ // y = x(c_x-d_x) / D + r_m / D
+ // = [ x(c_x-d_x) + r_m ] / D
+ // where r_m means ``r-mess'' and D is for ``denominator.''
+ // (x-c_x)^2 + (y-c_y)^2 = r_c^2
+ // (x-c_x)^2 + [ ( x(c_x-d_x)+ r_m ) / D - c_y ]^2 = r_c^2
+ // (x-c_x)^2 + ( x(c_x-d_x)+ r_m )^2 / D^2 - c_y ]^2 = r_c^2
+ // Etc. In theory, this is a quadratic in x, but wow.
+ //
+ // That is another mess. Back up a bit, and consider the general case
+ // of the intersection of two circles, c and d.
+ // Let D = distance between centers and P be the point of intersection.
+ // Draw a line between the centers and two triangles, one from center c to
+ // P and then perpendicular to the line betwene centers, and the other
+ // triangle similar, but in circle d. Let E be the point where the
+ // perpendicular leg of the triangles intersects the line between centers.
+ // We have distances a and b, a from center of C to E, and b from center
+ // of d to E. Let h be the height of this perpendicular leg. We have
+ // D = a + b, a^2 + h^2 = r_c^2 and b^2 + h^2 = r_d^2. Solve for a and b.
+ // This is really the same is the big messy thing, but easier to follow.
+ //
+ // FORGET ABOUT THE ABOVE. THIS IS THE WAY TO DO IT.
+ // Back way up to the very begining and reconsider the whole thing with
+ // simpler assuptions. Suppose that the circle is centered at the origin,
+ // so we can ignore (c_x,c_y). Assume also that the point is on the
+ // x-axis so that p = (p_x,p_y) = (p_x,0). Now the circle is
+ // C(a) = r (cos a, sin a)
+ // C'(a) = r (-sin a, cos a).
+ // We want the line through C(a) pointing in the C'(a) direction to
+ // pass through p. That is, we require a solution (in t and a) to
+ // C(a) + t C'(a) = p
+ // r cos a - r t sin a = p_x and r sin a + r t cos a = 0.
+ // So t = - sin a / cos a = - tan a. Then
+ // r cos a + r sin^2 a / cos a = p_x
+ // r cos^2a + r sin^2 a = p_x cos a
+ // r = p_x cos a
+ // THAT we can solve for a. We get this solution, but then have to shift
+ // and rotate. Rotate the entire plane by the angle that p is relative to
+ // the x-axis. Then shift to move the origin of the circle to (c_x,c_y).
+ //
+ // BUG: This entire mess belongs in some geometry module, preferably with
+ // a complete discussion of the math.
+
+ let P = invo(t);
+
+ // This is p_x in the analysis above.
+ let Pd = Math.sqrt((P.x - cx)**2 + (P.y - cy)**2);
+
+ // There are two possible solutions for r = p_x cos a or
+ let a = Math.acos(r/Pd);
+
+ // Now have a solution that's valid for P on the x-axis. Rotate (Pd,0) to P.
+ // This has the effect of rotating C(a) (with the a just determined this
+ // would be the tangent point if P were on the x-axis and C were centered
+ // at the origin) through an angle b, determined by tan b = P_x/P_y.
+ // But we want this relative to (cx,cy), so shift.
+ let b = Math.atan2(P.y-cy,P.x-cx);
+
+ // The point we want is now C(a+b), then translated by (cx,cy).
+ let E = new Point2D(r*Math.cos(a+b)+cx,r*Math.sin(a+b)+cy);
+
+ p = new FPath();
+ p.moveTo(P.x,P.y);
+ p.lineTo(E.x,E.y);
+ ctx.lineWidth = 0.8;
+ ctx.stroke(p);
+
+}
+\end{figput}
+\caption{The Involute of a Circle}
+\label{fig-basic-involute}
+\end{figure}
+
+Figure (\ref{fig-constant-pp}) shows two disks acting as gears by
+simple friction. The circle of each such disk is
+called the \emph{pitch circle} (where they come in contact is the
+pitch point). The centers of these disks are joined
+by the \emph{line of centers}, and the distance between these centers
+is the \emph{center distance}. Now imagine two slightly smaller and
+concentric circles, called the \emph{base circles}. These base circles
+will be used to form involutes, and these involutes will be the
+profiles of the gear teeth.
+
+
+\begin{figure}
+\begin{figput}{constpp,140bp}[done,skip]
+function constpp(ctx) {
+
+ // A static figure, no interaction.
+ let rc = 60;
+ let rd = 40;
+ let y = 70;
+
+ let c = new Point2D(100,y);
+ let d = new Point2D(c.x + rc+rd,y);
+
+ // Pitch circles
+ let p = new FPath();
+ p.ellipse(c.x,c.y,rc,rc,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 1.5;
+ ctx.stroke(p);
+
+ p = new FPath();
+ p.ellipse(d.x,d.y,rd,rd,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 1.5;
+ ctx.stroke(p);
+
+ // Base circles
+ let s = 0.80;
+ p = new FPath();
+ p.ellipse(c.x,c.y,s*rc,s*rc,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ p = new FPath();
+ p.ellipse(d.x,d.y,s*rd,s*rd,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ ctx.font = '10px san-serif';
+ ctx.fillStyle = 'black';
+
+ drawText(ctx,'base circle', c.x,c.y,-4,0);
+ drawText(ctx,'pitch circle', d.x,c.y+rd+6,0,0);
+}
+\end{figput}
+\caption{Base Circle and Pitch Circle}
+\label{fig-constant-pp}
+\end{figure}
+
+
+\begin{figure}[b!]
+\begin{figput}{moveinvo,200bp}[done,skip]
+// At one point, I was making a small manual adjustment on the figure
+// placement here. I did this by wrapping all the drawing
+// (after the \useasbounding box) with
+// \begin{scope}[shift={(40bp,0bp)}]
+// then \end{scope} just before \end{tikzpicture}
+
+function moveinvo(ctx) {
+
+ // Similar to above, but don't draw the pitch circles, and only a part
+ // of the base circles is drawn, and they're larger. There is also
+ // a line for the line of action and an animation to show what the
+ // point of contact does over time. OK, so not that similar!
+
+ let numSteps = 1000;
+ let loopw = LoopAnimWidget.register(ctx,-80,100,1.0,
+ true, // not hidden
+ numSteps, // steps per loop
+ 0, // starting step
+ 10, // ms time step
+ true,true,true,true,true,
+ 'loop');
+
+ let rc = 80;
+ let rd = 60;
+ let y = 100;
+ let s = 35;
+
+ let c = new Point2D(90,y);
+ let d = new Point2D(c.x + rc+rd +s,y);
+
+ // Base circles
+ p = new FPath();
+
+ // I played around, trying to show only portions of the disks so as to
+ // save space, but it doesn't look right. In some ways, that
+ // simplifies things.
+ p.ellipse(c.x,c.y,rc,rc,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 1.0;
+ ctx.stroke(p);
+
+ p = new FPath();
+ p.ellipse(d.x,d.y,rd,rd,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 1.0;
+ ctx.stroke(p);
+
+ /* I was going to just draw these arcs, but better to do the
+ // whole cirles.
+ //In fact, defer drawing this. I want the entire wedge to turn.
+ // This arc is centered at (0,0).
+ let cVisAngle = 4*Math.PI/8;
+ p = FPath.arcToBezierNEW(rc,-cVisAngle,cVisAngle);
+ p = p.translate(c);
+ ctx.lineWidth = 2.0;
+ ctx.stroke(p);
+
+ let dVisAngle = 5*Math.PI/8;
+ p = FPath.arcToBezierNEW(rd,dVisAngle,-dVisAngle);
+ p = p.translate(d);
+ ctx.lineWidth = 2.0;
+ ctx.stroke(p);
+ */
+
+ // The line of action.
+ // This involves another calculation of tangent lines. See Graphics Gems I,
+ // p. 7 and Figure 8. Use similar triangles. We have two distances,
+ // x_c and x_d from the respective centers of the circles to the point
+ // where the desired line intersects the line connecting the centers.
+ // We have x_c + x_d = D = distance between centers, and by
+ // similar triangles r_c/x_c = r_d/x_d. A little algebra gives
+ // x_c = r_c D / (r_c + r_d).
+ //
+ // We now have one point that must be on the line, and we go through the
+ // same rigmarole as above to find the line tangent to a circle. The only
+ // difference is that we've chosen the point through which the circle must
+ // pass in such a way that the resulting line will be tangent to both
+ // circles if it's tangent to either of them.
+ //
+ // As above, make the simplifying assumption that circle C is centered
+ // at the origin. Then do a rotate and translate at the end.
+ let D = Math.sqrt((c.x-d.x)**2 + (c.y-d.y)**2);
+ let xc = rc * D / (rc + rd);
+
+ // We are working (for now) as though circle C is centered at the origin.
+ // So this is the point we want.
+ let M = new Point2D(xc,0);
+
+ // As in the earlier case, where I did the involute, we get the tangent.
+ // The difference is that the point is now M, not P, as it was above.
+ let Md = Math.sqrt((M.x - c.x)**2 + (M.y - c.y)**2);
+ let a = Math.acos(rc/Md);
+ let b = Math.atan2(M.y,M.x);
+ let E = new Point2D(rc*Math.cos(-a+b)+c.x,rc*Math.sin(-a+b)+c.y);
+
+ // The above draws from circle C to the central point M, but I need to
+ // extend the line all the way to the other circle. So I need to know where
+ // this line intersects that circle. Recall that M was found by similar
+ // triangles. The angle of the tangent point relative to the circles' centers
+ // is the same in both cases, although for the circle on the right, we
+ // have to adjust by pi.
+ b += Math.PI;
+ let F = new Point2D(rd*Math.cos(-a+b)+d.x,rd*Math.sin(-a+b)+d.y);
+
+ p = new FPath();
+ p.moveTo(E.x,E.y);
+ p.lineTo(F.x,F.y);
+ ctx.lineWidth = 0.6;
+ ctx.stroke(p);
+
+ // The above draws the more or less static setup. Now I want to draw a
+ // particular point on the line of action, and let it move as the disks
+ // rotate, tracing out a pair of involutes.
+ //
+ // Use M for the particular point along the line, which is detemined
+ // by t, using a linear parameterization of the line E to F.
+ // This value is what determines the frame of the animation.
+ let t;
+ if (loopw.curStep < numSteps/2)
+ t = 2* loopw.curStep/numSteps;
+ else
+ t = 2 *(numSteps - loopw.curStep)/numSteps;
+
+ M = new Point2D(E.x + t*(F.x-E.x),E.y + t*(F.y-E.y));
+
+ p = new FPath();
+ p.ellipse(M.x,M.y,1.5,1.5,0,0,2*Math.PI);
+ ctx.fillStyle = 'black';
+ ctx.fill(p);
+
+ // I need to know the total size of the tooth. So I need the value for
+ // t at which the tooth will barely clear the opposing gear. The value
+ // I am looking for has nothing to do with the current point of contact,
+ // and is always the same (which is sort of the point). Scale down the
+ // entire picture and find t for which the distance of involute(t) from
+ // the center of the left disk is equal to the distance between the
+ // edges of the two disks.
+ //
+ // BUG: A common problem is that lines have thickness. If you want line A
+ // to barely touch line B, then thicknesses matter. The strictly correct way
+ // to deal with this is probably to treat lines as filled rectangles (or
+ // quadrilaterals more generally). This general philisophy is one way to
+ // handle stuff like arrowheads. Another way might be to allow stroking
+ // the line on one side of its geometric definition or the other.
+ // I may have mentioned this issue before.
+ //
+ // See above. rc and rd are the two disks' radii and the centers at c and d.
+ // The distance we care about is d.x-c.x-rd before scaling. Subtract off
+ // a hair to take into account line thicknesses. Scaling then gives:
+ let toothD = (d.x-c.x-rd - 2) / rc;
+
+ // And the value that brings the unit involute out to this distance.
+ let toothT = Numerical.newton(solveToothD,0.5,0,3,toothD,0.00001);
+
+ // For circle C, we have an involute extending out to M.
+ // The standard parameterization of the involute assumes that the point
+ // starts at the x-axis, and that is not true here. The ``point of initial
+ // contact'' with the base circle varies, and that is sort of the point
+ // for gear design. At any rate, the usual parameterization is
+ // x(a) = r (cos a + a sin a)
+ // y(a) = r (sin a - t cos a)
+ // What we need to do is to add some constant to a so as to shift
+ // the involute -- effectively rotate it around the center of the circle.
+ //
+ // The distance from M to E is how much string wraps around the circle C.
+ // This determines the point of initial contact. Let d_M = |M-E|.
+ // When wrapped around the circle, this corresponds to an angle d_M/r_c.
+ // It wraps from the point E, and that point is at angle -a+b relative to
+ // the x-axis. So the adjustment we need to make is a_M = d_M/r_c +a-b.
+ // There's also a pi adjustment due to LH coordinates.
+ //
+ // In addition, we need to know at what value of a (as argument to the
+ // parameterization) the involute reaches M. THAT is not so easy since it
+ // amounts to inverting the involute. We want to find t such that
+ // involute(t) = M, where M is the point in question. Assuming that (u,v)
+ // is on the involute, and considering the ``standard'' involute, what
+ // we want is t such that
+ // u = cos t + t sin t
+ // v = sin t - t cos t
+ // I don't think there's any good way to do this, and a bit of googling
+ // bears that out. I'm not going to try to be mathematically clever.
+ // Just use Newton's method. So, take the point, M, and "undo" the
+ // transformation to get M relative to the standard involute -- I mean for
+ // a unit circle at the origin.
+ let dM = Math.sqrt((M.x-E.x)**2 + (M.y-E.y)**2);
+ let aM = dM/rc - a + b - Math.PI;
+
+ // Untranslate, unscale and unrotate M.
+ // BUG: This foolishness is why I should have worked with the standard unit
+ // involute throughout.
+ let unitM = new Point2D(M.x - c.x,M.y-c.y);
+ unitM = new Point2D(unitM.x/rc,unitM.y/rc);
+ unitM.rotateSelf(-aM);
+
+ // Now I want t such that invo2(t).x = unitM.x. I'm using x instead of
+ // y since y varies very little near the circle and I'm afraid that
+ // the root finder won't converge well.
+ // Note that t = 3 is roughly where the derivative changes sign.
+ // That's why it's a good place for bracketing.
+ t = Numerical.newton(solveInvo,0.5,0,3,unitM.x,0.00001);
+
+ // However, we do NOT want to use a value for t larger than toothT
+ // since the tooth would make the tooth magically grow to touch M.
+ if (t > toothT) t = toothT;
+
+ p = FPath.parametricToBezier(invo2,0,t,30);
+ p = p.rotate(aM);
+ p = p.scale(rc);
+ p = p.translate(c);
+
+ ctx.lineWidth = 1.0;
+ ctx.stroke(p);
+
+ // Now, exactly as above, draw a bit of the involute.
+ p = FPath.parametricToBezier(invo2,t,toothT,30);
+ p = p.rotate(aM);
+ p = p.scale(rc);
+ p = p.translate(c);
+
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // And...what the heck... some spokes to make the rotation
+ // more noticable.
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ let sp = new Point2D(c.x+rc,c.y);
+ sp = sp.rotateAbout(c,aM);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // let wedgeRange = cVisAngle / 4;
+ let wedgeRange = Math.PI / 6;
+ for (let i = 0; i < 10; i++)
+ {
+ let a = aM + i*wedgeRange;
+ //if ((a <= cVisAngle) && (a >= -cVisAngle))
+ {
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ let sp = new Point2D(c.x+rc,c.y);
+ sp = sp.rotateAbout(c,a);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+ }
+
+ a = aM - i*wedgeRange;
+ //if ((a <= cVisAngle) && (a >= -cVisAngle))
+ {
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ let sp = new Point2D(c.x+rc,c.y);
+ sp = sp.rotateAbout(c,a);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+ }
+ }
+
+ // Now we have to do almost the same thing, but for the right disk.
+ // The twist is that the involute is now flipped relative to the
+ // earlier case because the right disk rotates in the opposite direction.
+ // That is, swap the sign of the y-coordinate, and the x-coordinate too
+ // since the disk is on the right.
+ //
+ // The tooth height is the same on the right side, but the scale is different,
+ // so the value of toothT will be different.
+ toothD = (d.x-c.x-rc - 2) / rd;
+ toothT = Numerical.newton(solveToothD,0.5,0,3,toothD,0.00001);
+
+ // What we want is for the flipped involute to pass through M, although
+ // it will pass through M at a different value for t. I could work out
+ // this t by finding it numerically. Or, I could use the fact that --
+ // because I know how gears work -- the relative rates of rotion are known.
+ // In fact, because I want the line to change at M, I do need this value
+ // for t. This is more like what happens physically: the motion of the
+ // left disk determines M, which pushes the disk on the right to rotate.
+ //
+ // Redetermine unitM, as above, but relative to the right disk.
+ // Do it afresh to avoid any rounding error.
+ dM = Math.sqrt((M.x-F.x)**2 + (M.y-F.y)**2);
+ aM = dM/rd - a + b - Math.PI;
+ unitM = new Point2D(d.x-M.x ,d.y-M.y);
+ unitM = new Point2D(unitM.x/rd,unitM.y/rd);
+ unitM.rotateSelf(-aM);
+
+ // This is the value for t at which the RH involute passes through M.
+ t = Numerical.newton(solveInvo,0.5,0,3,unitM.x,0.00001);
+ if (t > toothT) t = toothT;
+
+ // Path from disk to M
+ p = FPath.parametricToBezier(invo2,0,t,30);
+ p = p.reflectXY();
+ p = p.rotate(aM);
+ p = p.scale(rd);
+ p = p.translate(d);
+
+ ctx.lineWidth = 1.0;
+ ctx.stroke(p);
+
+ // Path from M to the tip of the tooth.
+ p = FPath.parametricToBezier(invo2,t,toothT,30);
+ p = p.reflectXY();
+ p = p.rotate(aM);
+ p = p.scale(rd);
+ p = p.translate(d);
+
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // And some spokes for visual appeal, as above.
+ // The outer arc first.
+ /*
+ dVisAngle = 5*Math.PI/8;
+ p = FPath.arcToBezier(rd,dVisAngle,-dVisAngle);
+ p = p.rotate(aM);
+ p = p.translate(d);
+ ctx.lineWidth = 2.0;
+ ctx.stroke(p);
+ */
+
+ // And the spokes.
+ p = new FPath();
+ p.moveTo(d.x,d.y);
+ sp = new Point2D(d.x-rd,d.y);
+ sp = sp.rotateAbout(d,aM);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // In fact, the angle *spanned* by the arc is two times this.
+ // It's because of the whole LH/RH thing.
+ for (let i = 0; i < 7; i++)
+ {
+ let a = aM + i*wedgeRange;
+ //if ((a <= dVisAngle) && (a >= -dVisAngle))
+ {
+ p = new FPath();
+ p.moveTo(d.x,d.y);
+ let sp = new Point2D(d.x-rd,d.y);
+ sp = sp.rotateAbout(d,a);
+ //sp.x = d.x - (sp.x - d.x);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+ }
+
+ a = aM - i*wedgeRange;
+ p = new FPath();
+ p.moveTo(d.x,d.y);
+ let sp = new Point2D(d.x-rd,d.y);
+ sp = sp.rotateAbout(d,a);
+ p.lineTo(sp.x,sp.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+ }
+}
+
+function solveToothD(t) {
+ let p = invo2(t);
+ return Math.sqrt(p.x**2 + p.y**2);
+}
+
+function solveInvo(t) {
+ return invo2(t).x;
+}
+
+function invo2(t) {
+
+ // Involute, assuming circle of radius 1 centered at the origin.
+ // There is another function called invo(), hence this is invo2().
+ // BUG: This is the way I should have done this above. Generate a standard
+ // involute, then scale and rotate as needed.
+ let c = Math.cos(t);
+ let s = Math.sin(t);
+
+ // Note that y is backwards since LH coordinate system.
+ return new Point2D( c + t*s , - (s - t*c) );
+}
+\end{figput}
+\caption{Rotation Traces Involutes}
+\label{fig-moving-involute}
+\end{figure}
+
+
+Figure (\ref{fig-moving-involute}) shows an enlarged view of the two
+base circles of Figure (\ref{fig-constant-pp}), without the pitch
+circles. Imagine that a piece of string is tightly
+wrapped around one base circle, extends over to the other base circle,
+and is wrapped around it too. As the disks rotate, the string unwinds
+from one base circle and is taken up by the other base circle. There
+is a fixed point on the string that represents the point of
+contact between two teeth. This point traces a path that
+is an involute relative to either circle. These involutes define the
+shape of the mating tooth profiles. The line of action is coincident
+with the string, and the two gears have conjugate action.
+
+A fortunate feature of the involute is that the teeth can be truncated at
+their perimeter, or their widths may be varied, yet the two gears
+still have conjugate action; the teeth come into contact sooner or
+later as they rotate, but the point of contact follows the same line
+of action. If the center distance changes, then the line of action
+also changes, but the tooth form (the involute) remains the same, and
+the gears still have conjugate action, though there will be some
+backlash and additional friction between the teeth.
+
+What remains is the resolution of many practical issues: the interplay
+of gear radius, tooth size, number of teeth and the
+like.
+
+The two main methods of gear specification are
+metric (ISO) and inch (AGMA), and the two systems use slightly different
+fundamental quantities to specify a given gear. These are the basic
+parameters used to specify off-the-shelf gear profiles.
+\begin{small}
+\begin{itemize}[itemsep=-1pt]
+\item $\phi$, pressure angle
+\item $N$, number of teeth
+\item $m$, module (for metric gears)
+\item $p_d$, diametral pitch (for inch gears)
+\end{itemize}
+\end{small}
+
+There are many additional terms and measurements. In fact,
+off-the-shelf gears are typically specified in a way that makes
+various assumptions. Additional parameters that influence
+gear design are
+\begin{small}
+\begin{itemize}[itemsep=-1pt]
+\item $p_c$, circular pitch
+\item $d$, pitch diameter
+\item $r_p$, pitch radius
+\item $r_b$, base radius
+\item $a$, addendum
+\item $b$, dedendum
+%\item $C$, center distance
+%\item $r$, pitch radius
+\end{itemize}
+\end{small}
+
+The \emph{pressure angle}, $\phi$, is the angle between the line of
+action and the perpendicular to the line of centers. In Figure
+(\ref{fig-moving-involute}), the pressure angle is roughly $35^\circ$.
+If two gears are to mesh without backlash, then they must use the same
+pressure angle. At one time, $14.5^\circ$ was a commonly used pressure
+angle, but $20^\circ$ is the current standard.
+A more obviously important choice is the number of teeth, $N$. Since
+the number of teeth determines the ratio of any gear train, this is a crucial
+choice, but it raises the question of how to fit $N$ teeth on a given
+gear.
+
+The tooth-to-tooth distance, as measured along the arc of the pitch
+circle, is the \emph{circular pitch}, $p_c$, and the corresponding
+diameter is the \emph{pitch diameter}, $d$. Since $N p_c$ is the
+circumference of the pitch circle, we have
+$$p_c = {\pi d\over N}.$$
+This is the inches or mm per tooth, measured along the circumerence. In
+practice, AGMA gears are specified by the \emph{diametral pitch},
+$$p_d = {N\over d}.$$
+This is the teeth per $\pi$ inches, and seems like an odd
+choice, but that's how it's done.
+Metric gears are specified by their \emph{module}, $m$, which is
+stated in millimeters, and is
+$$m = {d\over N} = {1\over p_d}.$$
+The actual tooth-to-tooth distance is thus $\pi m$.
+The values around which the two systems, ISO and AGMA,
+are standardized are not compatible. For example, a module of $m=4$
+corresponds to a diametral pitch of
+$$p_d = {25.4\over 4} = 6.35,$$
+which is not a standard AGMA size.
+
+The profile of each gear tooth is an involute, and determining the
+involute requires that the base circle be known. See Figure
+(\ref{fig-base-from-pitch}), in which the outer circle is the pitch circle and
+the inner circle is the base circle. Let $r_p$ be the radius of the
+pitch circle, and $r_b$ be the radius of the base circle. Because the
+angle determined by where the line of action meets the base circle is
+equal to the pressure angle, $\phi$, we have
+$$r_b = r_p \cos\phi.$$
+
+\begin{figure}[b!]
+\begin{figput}{baseandpitch,175bp}[done,skip]
+function baseandpitch(ctx) {
+
+ // A static figure, no interaction.
+ let rc = 70;
+ let y = 80;
+
+ let c = new Point2D(130,y);
+
+ // Pitch circle
+ let p = new FPath();
+ p.ellipse(c.x,c.y,rc,rc,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // Radius through pitch point
+ let pplen = rc + 50;
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ p.lineTo(c.x+pplen,c.y);
+ ctx.stroke(p);
+
+ // Line of action through P and angle phi. Use tan phi = dx / dy
+ // to draw a line through P = (c.x+rc,c.y).
+ let phi = Math.PI / 6;
+ let lenup = 70;
+ let lendown = 50;
+ let tan = Math.tan(phi);
+ p = new FPath();
+ p.moveTo(c.x + rc - lenup * tan,c.y + lenup);
+ p.lineTo(c.x + rc + lendown * tan,c.y - lendown);
+ ctx.stroke(p);
+
+ // Base circle has radius:
+ let rb = rc * Math.cos(phi);
+ p = new FPath();
+ p.ellipse(c.x,c.y,rb,rb,0,0,2*Math.PI);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // Vertical line through P.
+ let vlen = 60;
+ p = new FPath();
+ p.moveTo(c.x+rc,c.y-vlen);
+ p.lineTo(c.x+rc,c.y+vlen);
+ ctx.stroke(p);
+
+ // radial line to where line of action meets base circle.
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ p.lineTo(c.x + rb*Math.cos(phi),c.y+rb*Math.sin(phi));
+ ctx.stroke(p);
+
+ // Little hash marks to indicate angles have same measure.
+ p = FPath.circArcToBezier(16,0,phi);
+ p = p.translate(c);
+ ctx.stroke(p);
+
+ p = FPath.circArcToBezier(16,Math.PI/2 - phi,Math.PI/2);
+ p = p.reflectX();
+ p = p.translate(new Point2D(c.x+rc,c.y));
+ ctx.stroke(p);
+}
+
+\end{figput}
+\caption{Base Circle from Pitch Circle}
+\label{fig-base-from-pitch}
+\end{figure}
+
+
+The module or diametral pitch determines the tooth-to-tooth distance,
+but it doesn't determine how much of that space is solid tooth and how
+much is the space between teeth. The ensure that there is no backlash,
+the thickness of each tooth, as measured along the arc of the pitch
+circle, should be equal to the space between teeth -- for practical
+reasons (lubrication), the gap between teeth is often made one or two
+thousandths of an inch wider than this. Again, these distances are
+\emph{as measured along the arc of the pitch circle}. In practice, it
+is easier to work with the angles subtended by these arcs.
+
+There is one further issue to resolve. See Figure (\ref{fig-teeth-touch}),
+which shows a portion of a base circle and slightly larger pitch
+circle, with an involute. What's needed is the measure of the small
+angle relative to the $x$-axis at which the involute meets the pitch
+circle. The involute is parametrized by
+$$i(t) = r_b(\cos t + t\sin t,\sin t - t\cos t) = (i_x(t),i_y(t)),$$
+and the involute meets the pitch circle when $|i(t)|^2 = r_p^2$. We have
+\begin{eqnarray*}
+|i(t)|^2 &=& r_b^2\left[(\cos t + t\sin t)^2 + (\sin t - t\cos t)^2\right] \\
+&=& r_b^2\left[\cos^2 t + 2t\cos t\sin t + t^2\sin^2t +
+ \sin^2 t - 2t\cos t\sin t + t^2\cos^2 t\right] \\
+&=& r_b^2(1 + t^2),
+\end{eqnarray*}
+and $|i(t)| = r_p$ implies that
+$$t = \sqrt{\left({r_p\over r_b}\right)^2-1} = \sqrt{\left({r_p\over
+ r_p\cos\phi}\right)^2-1}\ = \tan\phi.$$
+The angle made by the line through $i(t)$ with the $x$-axis is
+$\alpha$, where\footnote{There
+ seems to be no standard notation for this angle. In fact, I have
+ found no mention of this issue in any common reference, even though it's crucial for
+ determining the profile.}
+$$\tan\alpha = i_y(t)/i_x(t).$$
+
+\begin{figure}
+\begin{figput}{teethtouch,100bp}[done,skip]
+function teethtouch(ctx) {
+
+ let c = new Point2D(100,20);
+ let rb = 80;
+
+ // Bit of arc on the right. This is the base circle.
+ let span = Math.PI/5;
+ let p = FPath.circArcToBezier(rb,0,span);
+ //p = p.reflectX();
+ p = p.translate(c);
+ ctx.lineWidth = 1.0;
+ ctx.stroke(p);
+
+ // And a slightly larger arc for the pitch circle.
+ let rp = rb + 22;
+ p = FPath.circArcToBezier(rp,0,span);
+ //p = p.reflectX();
+ p = p.translate(c);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // Draw x-axis/radius.
+ let width = 150
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ p.lineTo(c.x+width,c.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // Using the earlier invo2() function for the unit involute.
+ let a = Math.PI/8;
+ let inv = FPath.parametricToBezier(invo2,0,1.5,30);
+ p = inv.reflectX();
+ //p = inv.scale(rb);
+ p = p.scale(rb);
+ p = p.translate(c);
+ ctx.stroke(p);
+
+ // And a line out to the point where the top involute meets the pitch circle.
+ p = new FPath();
+ p.moveTo(c.x,c.y);
+ let t = Math.sqrt((rp/rb)**2 - 1);
+ let q = invo2(t);
+ q = new Point2D(q.x,-q.y);
+ q = new Point2D(q.x*rb,q.y*rb);
+ q = new Point2D(q.x+c.x,q.y+c.y);
+ p.lineTo(q.x,q.y);
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+}
+\end{figput}
+\caption{Angle Subtended by Involutes.}
+\label{fig-teeth-touch}
+\end{figure}
+
+We now have enough information to begin laying out gear
+profiles. Suppose that $\phi$, $N$ and $m$ (or $p_d$) are given. There
+will be $N$ involutes runing one way, and $N$ running the other
+way. Relative to the base circle, the tooth-to-tooth distance subtends
+an angle measuring $2\pi/N$. Half of this is solid tooth, and half is the
+gap between teeth, with an adjustment for $\alpha$. So each solid
+tooth subtends the angle $\pi/N + 2\alpha$, and each gap
+subtends the angle $\pi/N - 2\alpha$. Figure~(\ref{fig-gear-example})
+shows the result for $\phi = 20^\circ$, $N=15$ and $m =4$.
+
+\begin{figure}
+\begin{figput}{gearexample,120bp}[done,skip]
+function gearexample(ctx) {
+
+ // Note that I may have written this for a LH coordinate system, but
+ // it doesn't matter since it's radially symmetric.
+
+ // Pressure angle, number of teeth and module.
+ let phi = 20 * Math.PI / 180;
+ let N = 15;
+ let m = 5;
+
+ let c = new Point2D(175,60);
+ let pitchDiam = N * m;
+
+ // Pitch radius and base radius.
+ let rp = pitchDiam / 2;
+ let rb = rp * Math.cos(phi);
+
+ ctx.lineWidth = 0.4;
+
+ // Point along parameterization where involute meets pitch circle.
+ let t = Math.tan(phi);
+
+ // Adjustment to width of the base of the teeth due to the fact that
+ // the teeth are of varying width. Note that the radius of the base circle
+ // doesn't matter.
+ let ipt = invo2(t);
+ let alpha = -Math.atan2(ipt.y,ipt.x);
+
+ ctx.lineWidth = 0.4;
+
+ // Each tooth, at the base, takes 2pi/2N + 2 alpha. The space between
+ // teeth is 2pi/2N - 2 alpha
+ //
+ // We want the x-axis to split a gap between teeth, so the first tooth
+ // starts at (pi/N - 2 alpha) / 2 = pi/2N - alpha.
+ //
+ // Using earlier function for the unit involute.
+ // Note that the angles are all backwards (reversed sign) due to LH coords.
+
+ let basicInv = FPath.parametricToBezier(invo2,0,1,30);
+ let basicArc = FPath.circArcToBezier(rb,0,Math.PI/N - 2*alpha);
+ basicArc = basicArc.reflectX();
+
+ let angle = -Math.PI / (2*N) + alpha;
+ ctx.strokeStyle='black';
+
+ for (let i = 0; i < N; i++)
+ {
+ // One side of tooth.
+ let inv = basicInv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Other side of tooth.
+ angle -= Math.PI / N + 2 * alpha;
+ inv = basicInv.reflectX();
+ inv = inv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Gap between teeth.
+ let gap = basicArc.rotate(angle);
+ gap = gap.translate(c);
+ //ctx.strokeStyle='blue';
+ ctx.stroke(gap);
+
+ angle -= Math.PI / N - 2*alpha;
+ }
+}
+
+\end{figput}
+\caption{Basic Gear Form.}
+\label{fig-gear-example}
+\end{figure}
+
+There is a glaring problem with Figure (\ref{fig-gear-example}): the
+involutes continue beyond the point where the two sides of each tooth
+meet. If the aim is to program a milling machine to cut these profiles,
+then that's not a big deal -- the machine will be cutting a bit of
+air beyond the end of each tooth -- but it would be nice to know
+exactly where the two sides meet. Suppose that a tooth is symmetric
+about the $x$-axis so that the two sides meet at $y=0$. Let $R_\theta$
+be the rotation matrix through angle $\theta$. Then the involute below
+the $x$-axis is parameterized by $R_{-\theta}i(t)$, where $\theta
+= \alpha + \pi/2N$. In particular, we want to find $t$ such that the
+$y$-coordinate of $R_{-\theta}i(t)$ is equal to zero. We have
+\begin{eqnarray*}
+R_{-\theta}\ i(t) &=& \pmatrix{\cos\theta&\sin\theta\cr-\sin\theta&\cos\theta}
+\pmatrix{r_b(\cos t + t\sin t)\cr r_b(\sin t - t\cos t)},
+\end{eqnarray*}
+and we require $t$ such that
+$$-r_b\sin\theta(\cos t + t\sin t) + r_b\cos\theta(\sin t - t\cos t) = 0$$
+or
+$${\sin t - t\cos t\over \cos t + t\sin t} = \tan\theta.$$
+Unfortunately, finding such $t$ requires the use of numerical methods
+of approximation. Making use of something like Newton-Raphson to
+determine $t$, we obtain Figure (\ref{fig-gear-ex-better}).
+
+\begin{figure}
+\begin{figput}{bettergear,120bp}[done,skip]
+function bettergear(ctx) {
+
+ // As above, but the teeth meet properly instead of having ``hair.''
+
+ // Pressure angle, number of teeth and module.
+ let phi = 20 * Math.PI / 180;
+ let N = 15;
+ let m = 5;
+
+ let c = new Point2D(175,60);
+ let pitchDiam = N * m;
+
+ // Pitch radius and base radius.
+ let rp = pitchDiam / 2;
+ let rb = rp * Math.cos(phi);
+
+ ctx.lineWidth = 0.4;
+
+ // Point along parameterization where involute meets pitch circle.
+ let t = Math.tan(phi);
+
+ // Adjustment to width of the base of the teeth due to the fact that
+ // the teeth are of varying width. Note that the radius of the base circle
+ // doesn't matter.
+ let ipt = invo2(t);
+ let alpha = -Math.atan2(ipt.y,ipt.x);
+
+ ctx.lineWidth = 0.4;
+
+ // Each tooth, at the base, takes 2pi/2N + 2 alpha. The space between
+ // teeth is 2pi/2N - 2 alpha
+ //
+ // We want the x-axis to split a gap between teeth, so the first tooth
+ // starts at (pi/N - 2 alpha) / 2 = pi/2N - alpha.
+ //
+ // Using earlier function for the unit involute.
+ // Note that the angles are all backwards (reversed sign) due to LH coords.
+ //
+ // We also solve for t so that the teeth meet as they should.
+ let targetV = Math.tan(Math.PI/(2*N) + alpha);
+ let toothT = Numerical.newton(toothMeet,0.3,0,2,targetV,0.00001);
+
+ let basicInv = FPath.parametricToBezier(invo2,0,toothT,30);
+ let basicArc = FPath.circArcToBezier(rb,0,Math.PI/N - 2*alpha);
+ basicArc = basicArc.reflectX();
+
+ let angle = -Math.PI / (2*N) + alpha;
+ ctx.strokeStyle='black';
+
+ for (let i = 0; i < N; i++)
+ {
+ // One side of tooth.
+ let inv = basicInv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Other side of tooth.
+ angle -= Math.PI / N + 2 * alpha;
+ inv = basicInv.reflectX();
+ inv = inv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Gap between teeth.
+ let gap = basicArc.rotate(angle);
+ gap = gap.translate(c);
+ //ctx.strokeStyle='blue';
+ ctx.stroke(gap);
+
+ angle -= Math.PI / N - 2*alpha;
+ }
+}
+
+function toothMeet(t) {
+
+ // Used to solve for the t at which the two sides of a tooth meet.
+ let s = Math.sin(t);
+ let c = Math.cos(t);
+ return (s - t*c) / (c + t * s);
+}
+
+\end{figput}
+\caption{Corrected Gear Form.}
+\label{fig-gear-ex-better}
+\end{figure}
+
+Figure (\ref{fig-gear-ex-better}) still doesn't look quite
+right. Gears don't typically have such pointy-ended teeth, and the gaps
+between the teeth don't seem deep enough in Figure
+(\ref{fig-gear-ex-better}). There are two more parameters to adjust
+for this: the \emph{addendum}, $a$, and \emph{dedendum}, $b$. The
+addendum is the distance above the pitch circle to which the teeth
+extend; when a tooth reaches a radius of $r_p + a$, it is truncated
+and given a flat top (the so-called \emph{top land}). The dedendum is
+the depth below the pitch circle to which the gap between teeth is
+cut; so the gaps are cut to a radius of $r_p -b$ (forming the
+so-called \emph{bottom land}). While the parameters $a$ and $b$ could
+take any value, they have been standardized to
+$$a = m\qquad{\rm and}\qquad b = 1.25\ m.$$
+Under the AGMA system (inches), these are
+$$a = 1/p_d\qquad{\rm and}\qquad b = 1.25/p_d.$$
+Teeth have been standardized this way because the tips of pointy-ended
+teeth are prone to burring, while cutting the gaps more deeply allows
+for fuller engagement of the teeth. Figure (\ref{fig-gear-with-add-ded})
+shows the same gear as in Figure (\ref{fig-gear-ex-better}), but with
+the addendum and dedendum circles.
+
+\begin{figure}[b!]
+\begin{figput}{gearaddded,120bp}[done,skip]
+function gearaddded(ctx) {
+
+ // As above, but with (or without when interactive) the various circles.
+
+ // A button for show/hide the extra circles.
+ let wbut = ButtonWidget.register(ctx,-80,10,'Show/Hide','but');
+
+ // Pressure angle, number of teeth and module.
+ let phi = 20 * Math.PI / 180;
+ let N = 15;
+ let m = 5;
+
+ let c = new Point2D(175,60);
+ let pitchDiam = N * m;
+
+ // Pitch radius and base radius.
+ let rp = pitchDiam / 2;
+ let rb = rp * Math.cos(phi);
+
+ ctx.lineWidth = 0.4;
+
+ if (wbut.clickState === true)
+ {
+ // Pitch circle.
+ p = new FPath();
+ p.ellipse(c.x,c.y,rp,rp,0,0,2*Math.PI);
+ ctx.stroke(p);
+
+ // Addendum
+ radd = rp + m;
+ p = new FPath();
+ p.ellipse(c.x,c.y,radd,radd,0,0,2*Math.PI);
+ ctx.stroke(p);
+
+ // Dedendum
+ rded = rp - 1.25* m;
+ p = new FPath();
+ p.ellipse(c.x,c.y,rded,rded,0,0,2*Math.PI);
+ ctx.stroke(p);
+ }
+
+
+ // Point along parameterization where involute meets pitch circle.
+ let t = Math.tan(phi);
+
+ // Adjustment to width of the base of the teeth due to the fact that
+ // the teeth are of varying width. Note that the radius of the base circle
+ // doesn't matter.
+ let ipt = invo2(t);
+ let alpha = -Math.atan2(ipt.y,ipt.x);
+
+ ctx.lineWidth = 0.4;
+
+ // Each tooth, at the base, takes 2pi/2N + 2 alpha. The space between
+ // teeth is 2pi/2N - 2 alpha
+ //
+ // We want the x-axis to split a gap between teeth, so the first tooth
+ // starts at (pi/N - 2 alpha) / 2 = pi/2N - alpha.
+ //
+ // Using earlier function for the unit involute.
+ // Note that the angles are all backwards (reversed sign) due to LH coords.
+ //
+ // We also solve for t so that the teeth meet as they should.
+ let targetV = Math.tan(Math.PI/(2*N) + alpha);
+ let toothT = Numerical.newton(toothMeet,0.3,0,2,targetV,0.00001);
+
+ let basicInv = FPath.parametricToBezier(invo2,0,toothT,30);
+ let basicArc = FPath.circArcToBezier(rb,0,Math.PI/N - 2*alpha);
+ basicArc = basicArc.reflectX();
+
+ let angle = -Math.PI / (2*N) + alpha;
+ ctx.strokeStyle='black';
+
+ for (let i = 0; i < N; i++)
+ {
+ // One side of tooth.
+ let inv = basicInv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Other side of tooth.
+ angle -= Math.PI / N + 2 * alpha;
+ inv = basicInv.reflectX();
+ inv = inv.rotate(angle);
+ inv = inv.scale(rb);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Gap between teeth.
+ let gap = basicArc.rotate(angle);
+ gap = gap.translate(c);
+ //ctx.strokeStyle='blue';
+ ctx.stroke(gap);
+
+ angle -= Math.PI / N - 2*alpha;
+ }
+}
+
+\end{figput}
+\caption{Gear with Addedenum and Dedendum Circles.}
+\label{fig-gear-with-add-ded}
+\end{figure}
+
+It is now possible to specify the standard tooth profile for a gear
+with arbitrary parameters, as in Figure ({\ref{fig-final-gear}). The
+value for $t$ to which the parameterization of the involute extends
+must be adjusted. Instead of extending out to the value of $t_0$ for
+which
+$${\sin t_0 - t_0\cos t_0\over \cos t_0 + t_0\sin t_0} = \tan\theta,$$
+$t$ must be chosen so that $|i(t)| = r_p + a$. This is simpler to
+determine since $\theta$ no longer plays a role. As in an earlier
+calculation, we must have
+\begin{eqnarray*}
+(r_p+a)^2 &=& |i(t)|^2 \\
+&=& r_b^2(1+t^2)
+\end{eqnarray*}
+or
+$$t\ =\ \sqrt{\left({r_p+a\over r_b}\right)^2 - 1}\ =\
+\sqrt{\left({r_p+a\over r_p\cos\phi}\right)^2 - 1}.$$
+Of course, $a$ can't be chosen to produce a value for $t$ larger than $t_0$.
+
+When drawing gears with a given addendum, it can be useful to know the
+angle subtended by the top land. As noted above, the angle subtended
+relative to the base circle by each tooth is $\pi/N + 2\alpha$. Let
+$t_d$ be the value for $t$ at which the top land begins. Each
+side of the tooth, from the base circle to the top land subtends the
+angle $\beta$, where $\tan\beta = i_y(t_d)/i_x(t_d)$. The top land
+thus subtends the angle $\pi/N + 2\alpha - 2\beta$.
+
+\begin{figure}
+\begin{figput}{gearfinal,200bp}[done,skip]
+function gearfinal(ctx) {
+
+ // As above, but allow the user to tweak the settings. Further, we use the
+ // standard values for addendum and dedendum. This changes the way the
+ // involutes and gaps are drawn.
+ //
+ // BUG: There's some problem here of a mathematical or graphical nature.
+ // If I lift the restrictions on the inputs, things go haywire at
+ // the extremes.
+
+ // Default pressure angle, number of teeth and module.
+ let phi = 20 * Math.PI / 180;
+ let N = 15;
+ let m = 5;
+
+ // Let the user change these.
+ let leftInput = -50;
+ let toothInput = NumberInputWidget.register(ctx,leftInput,20,15,"tooth");
+ N = parseInt(toothInput.getValue());
+ if (N < 4)
+ {
+ toothInput.theWidget.value = 4;
+ N = 4;
+ }
+ if (N > 30)
+ {
+ toothInput.theWidget.value = 30;
+ N = 30;
+ }
+
+ let paInput = NumberInputWidget.register(ctx,leftInput,35,20,"pa");
+ phi = parseFloat(paInput.getValue());
+ if (phi > 25)
+ {
+ paInput.theWidget.value = 25;
+ phi = 25;
+ }
+ if (phi < 5)
+ {
+ paInput.theWidget.value = 5;
+ phi = 5;
+ }
+ phi = phi * Math.PI / 180;
+
+ let moduleInput = NumberInputWidget.register(ctx,leftInput,50,5,"mod");
+ m = parseFloat(moduleInput.getValue());
+ if (m > 6)
+ {
+ moduleInput.theWidget.value = 6;
+ m = 6;
+ }
+ if (m < 1)
+ {
+ moduleInput.theWidget.value = 1;
+ m = 1;
+ }
+
+ let leftText = -120;
+ let upText = 30;
+ ctx.font = '10px san-serif';
+ ctx.fillStyle = 'black';
+ drawTextBrowserOnly(ctx,'Tooth Count',leftText,35-upText);
+ drawTextBrowserOnly(ctx,'Pressure Angle',leftText,50-upText);
+ drawTextBrowserOnly(ctx,'Module',leftText,65-upText);
+
+ // Addendum and dedendum.
+ // BUG: I could let the user adjust these too.
+ let a = m;
+ let b = 1.25 * m;
+
+ let c = new Point2D(150,100);
+ let pitchDiam = N * m;
+
+ // Pitch radius and base radius.
+ let rp = pitchDiam / 2;
+ let rb = rp * Math.cos(phi);
+
+ ctx.lineWidth = 0.4;
+
+ // Center of gear.
+ let p = new FPath();
+ p.ellipse(c.x,c.y,1.5,1.5,0,0,2*Math.PI);
+ ctx.fill(p);
+
+ // Point along parameterization where involute meets pitch circle.
+ let t = Math.tan(phi);
+
+ // Adjustment to width of the base of the teeth due to the fact that
+ // the teeth are of varying width. Note that the radius of the base circle
+ // doesn't matter.
+ let ipt = invo2(t);
+ let alpha = -Math.atan2(ipt.y,ipt.x);
+
+ // Determine the maximum value for t. This is the point at which the
+ // sides of a tooth meet. It determines the maximum possible value
+ // for the addendum.
+ let targetV = Math.tan(Math.PI/(2*N) + alpha);
+ let maxT = Numerical.newton(toothMeet,0.3,0,2,targetV,0.00001);
+
+ // Now the value of t determined by the addendum.
+ let T = Math.sqrt(((rp + a)/rb)**2 - 1);
+ if (T > maxT)
+ T = maxT;
+
+ // These are the parts of the gear profile. There's a tricky thing here in
+ // that the arc subtended by the top land must be determined.
+ // The arc subtended by half a tooth (out to maxT) is known to be
+ // pi/(2N) + alpha, but the involute now spans a smaller angle and the top
+ // land makes up the difference. This smaller angle is determined by
+ // invo(T), and the angle is beta such that
+ // tan(beta) = y(T)/x(T).
+ let basicInv = FPath.parametricToBezier(invo2,0,T,30);
+ let basicBot = FPath.circArcToBezier(rp-b,0,Math.PI/N - 2*alpha);
+
+ ipt = invo2(T);
+ let beta = -Math.atan2(ipt.y,ipt.x);
+ let basicTop = FPath.circArcToBezier(rp+a,0,Math.PI/N + 2*alpha - 2*beta);
+
+ // Due to LH coordinates.
+ basicTop = basicTop.reflectX();
+ basicBot = basicBot.reflectX();
+
+ // Add a radial line on each side of basicInv so that the tooth reaches
+ // the dedendum circle.
+ basicInv = basicInv.scale(rb);
+ basicInv.frontLineTo(rp-b,0);
+
+ let angle = -Math.PI / (2*N) + alpha;
+ ctx.strokeStyle='black';
+
+ for (let i = 0; i < N; i++)
+ {
+ // One side of tooth.
+ let inv = basicInv.rotate(angle);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Arc of top land.
+ let top = basicTop.rotate(angle - beta);
+ top = top.translate(c);
+ ctx.stroke(top);
+
+ // Other side of tooth.
+ angle -= Math.PI / N + 2 * alpha;
+ inv = basicInv.reflectX();
+ inv = inv.rotate(angle);
+ inv = inv.translate(c);
+ ctx.stroke(inv);
+
+ // Gap between teeth.
+ let gap = basicBot.rotate(angle);
+ gap = gap.translate(c);
+ ctx.stroke(gap);
+
+ angle -= Math.PI / N - 2*alpha;
+ }
+}
+\end{figput}
+\caption{Standard Gear Profile.}
+\label{fig-final-gear}
+\end{figure}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\end{document}
+
+
diff --git a/graphics/figput/example/externalcode.js b/graphics/figput/example/externalcode.js
new file mode 100644
index 0000000000..c467540e69
--- /dev/null
+++ b/graphics/figput/example/externalcode.js
@@ -0,0 +1,89 @@
+
+// This file demonstrates two things: how to use an external js
+// file, and use of the DraggableDrawWidget.
+
+// Functions passed to DraggableDrawWidgets
+
+function getRawSquare() {
+
+ // The 'radius' of a square.
+ let r = 3;
+ let p = new FPath();
+ p.moveTo(-r,-r);
+ p.lineTo(r,-r);
+ p.lineTo(r,r);
+ p.lineTo(-r,r);
+ p.closePath();
+
+ return p;
+}
+
+function drawSquareDot(ctx) {
+
+ let p = getRawSquare();
+ ctx.fillStyle='red';
+ ctx.fill(p);
+ return p;
+}
+
+function drawSquareDotSelect(ctx) {
+
+ let p = getRawSquare();
+ ctx.fillStyle='green';
+ ctx.fill(p);
+ return p;
+}
+
+function squareLocationOK(x,y,w,ha,hb) {
+
+ // A bit of padding so that we don't leave "crumbs" around the edges.
+ let pad = 5;
+
+ if (x < pad) return false;
+ if (x > w - pad) return false;
+
+ // Note the minus sign. We need to compare to y, which may be negative.
+ if (y < -hb + pad ) return false;
+ if (y > ha - pad ) return false;
+ return true;
+}
+
+
+// The top-level figure-drawing function.
+
+function bezier(ctx) {
+
+ let w1 = DraggableDotWidget.register(ctx,70,165,'d1');
+ let w2 = DraggableDrawWidget.register(ctx,30,115,
+ drawSquareDot,drawSquareDotSelect,squareLocationOK,'d2');
+ let w3 = DraggableDrawWidget.register(ctx,120,25,
+ drawSquareDot,drawSquareDotSelect,squareLocationOK,'d3');
+ let w4 = DraggableDotWidget.register(ctx,270,105,'d4');
+
+ let p = new FPath();
+
+ // Straight lines from point to point.
+ p.moveTo(w1.widgetX,w1.widgetY);
+ p.lineTo(w2.widgetX,w2.widgetY);
+ p.lineTo(w3.widgetX,w3.widgetY);
+ p.lineTo(w4.widgetX,w4.widgetY);
+ ctx.strokeStyle = 'black';
+ ctx.lineWidth = 0.4;
+ ctx.stroke(p);
+
+ // Bezier curve determined by these points.
+ p = new FPath();
+ p.moveTo(w1.widgetX,w1.widgetY);
+ p.bezierCurveTo(w2.widgetX,w2.widgetY,
+ w3.widgetX,w3.widgetY,w4.widgetX,w4.widgetY);
+ ctx.strokeStyle = 'blue';
+ ctx.lineWidth = 1.5;
+ ctx.stroke(p);
+
+ // In this case (unlike most others), the widgets must be explicitly drawn.
+ w1.draw(ctx);
+ w2.draw(ctx);
+ w3.draw(ctx);
+ w4.draw(ctx);
+}
+
diff --git a/graphics/figput/figput-manual/figput-manual.pdf b/graphics/figput/figput-manual/figput-manual.pdf
new file mode 100644
index 0000000000..dc459e33bf
--- /dev/null
+++ b/graphics/figput/figput-manual/figput-manual.pdf
Binary files differ
diff --git a/graphics/figput/figput-manual/figput-manual.tex b/graphics/figput/figput-manual/figput-manual.tex
new file mode 100644
index 0000000000..2960aceff7
--- /dev/null
+++ b/graphics/figput/figput-manual/figput-manual.tex
@@ -0,0 +1,857 @@
+
+\documentclass[10pt]{article}
+
+% Allows various tweaks to itemize as optional arguments.
+\usepackage{enumitem}
+
+% Gives the proof environment, with a box for QED.
+\usepackage{amsthm}
+
+% Needed for things like pmatrix.
+\usepackage{amsmath}
+
+% This allows footnotes from within array environment.
+\usepackage{footnote}
+\makesavenoteenv{array}
+
+% To adjust font sizes more easily.
+\usepackage{relsize}
+
+% This allows \verb in footnotes
+\usepackage{fancyvrb}
+
+% This allows me to say
+% \begin{figure}[H]
+% to mean ``here, and don't argue.'' Note the captial 'H'.
+\usepackage{float}
+
+% This is the modern thing to do, but the manual is 1300 pages!
+\usepackage{tikz}
+\usepackage{pgfplots}
+
+
+\begin{document}
+
+% Need this for fancyvrb to work.
+\VerbatimFootnotes
+
+% So that I don't have to type this all the time.
+\newcommand{\figput}{\textsc{FigPut}}
+
+
+\begin{center}
+ {\Large \figput}
+
+ Interactive Figures for \LaTeX
+
+ \verb=https://github.com/rsfairman/figput=
+
+ Randall Fairman
+
+ Version 0.90, July 21, 2022
+\end{center}
+
+\vskip 0.2cm
+
+The \textsc{FigPut} system allows \LaTeX\ to produce interactive
+figures. The system produces a static PDF file, as usual; in addition,
+the document can be viewed with an Internet browser and the figures
+become interactive. See the prototype in {\tt example/example.tex}
+to clarify what follows.\footnote{The version available on CTAN
+includes only what is strictly necessary to rebuild the document from
+scratch: {\tt example.tex} and {\tt exteernalcode.js}. The repository at {\tt
+ github} includes all the files that result from the build process,
+and are necessary to view the PDF in either static or interactive
+form.} To view this example in its fully interactive form, see
+\verb=rsfairman.github.io/figput-example/=.
+
+% For some reason \textsc doesn't work within \section
+\section{Why \normalfont\scshape{FigPut}}
+
+There are many ways to produce figures in \LaTeX: MetaPost, TikZ,
+PSTricks, XY-pic, {\tt graphics}, {\tt picture}, and more. Creating
+technical figures is often an exercise in programming, and none of
+these is based on a commonly used programming
+language. \textsc{FigPut} is based on JavaScript (JS), which is
+probably the most widely used language today. Moreover,
+\figput\ allows figures to be animated and/or interactive.
+
+Aside from the fact that figures are specified with
+JavaScript, the system is normal \LaTeX. An important feature is that
+the two forms of the document -- static PDF and interactive -- look
+identical, with the same pagination and formatting. The reader can
+move between the printed version and the interactive version without
+needing to reorient.
+
+% For some reason \textsc doesn't work within \section
+\section{Using \normalfont\scshape{FigPut}}
+
+Here's a list of all the commands available in \figput:
+\begin{verbatim}
+\begin{figput} ... \end{figput}
+\FigPut
+\SetInnerMargin
+\SetOuterMargin
+\NeverSkip
+\AllowSkip
+\LoadFigureCode
+\end{verbatim}
+
+\subsection{The \LaTeX\ Side}
+
+Interactive figures are specified with the {\tt figput}
+environment or the \verb=\FigPut= command. The full form of the
+environment specification is
+\vskip 0.2cm
+
+\noindent\verb=\begin{figput}{<fig_name>,<fig_ht>}[=\emph{optional arguments}\verb=]=
+
+\noindent\verb= <JavaScript code>=
+
+\noindent\verb=\end{figput}=
+\vskip 0.2cm
+
+\noindent There are two mandatory arguments: \verb=<fig_name>= and
+\verb=<fig_ht>=. Every figure must have a unique name. This name is
+unrelated to any \verb=\label= or other identifier used for
+the figure. The \verb=<fig_ht>= is the height of the figure, expressed
+like other \LaTeX\ lengths in {\tt pt}, {\tt cm}, \emph{etc}. The
+figure is allocated this much vertical space on the page. The
+remaining optional arguments are discussed below.
+
+The {\tt <JavaScript code>} is used to draw the figure, and the only
+requirement is that it be given as
+\begin{verbatim}
+function <fig_name>(ctx) {
+ ...
+}
+\end{verbatim}
+The name of the JS function must match the figure name given to the
+{\tt figput} environment -- that's how the browser finds the correct
+JS function to draw a particular figure. The {\tt ctx} argument
+is required; it's the ``rendering context'' used for
+drawing.\footnote{\label{page-ctx} A variable of this type is commonly obtained in
+JavaScript by something like \vspace{-1.5mm}
+\begin{verbatim}
+let canvas = document.getElementById('where-drawing-happens');
+let ctx = canvas.getContext('2d');
+\end{verbatim}
+\vspace{-1.5mm} The full name for this type is {\tt
+ CanvasRenderingContext2D}.}
+
+All of the JS functions for the various figures share the same
+name-space, and it is perfectly acceptable to share functions between
+figures or to define helper functions within a figure's
+environment. If many figures use the same {\tt drawDoodad()}
+function, then that function should appear with only a single figure, and
+it will be available to all of them.
+
+Use \verb=\SetInnerMargin= and \verb=\SetOuterMargin= to set the inner and outer
+margins (which may differ in a book that has left and right
+pages). The figure will be rendered within a rectangle that is set in
+from the left margin by the given amount. For example, you might say
+\begin{verbatim}
+\SetInnerMargin{150pt}
+\SetOuterMargin{150pt}
+\end{verbatim}
+so that the left edge of the figure is {\tt 150pt} from the left edge
+of the paper. These values can be changed before every figure, if that
+is appropriate.
+
+The coordinate system used within the JS code is based on big points ({\tt
+ bp}), with the origin at the lower-left corner of the
+figure. The $y$-coordinate increases as you move \emph{up} the page.
+The $y$-axis is offset from the edge of the page by the
+value given to \verb=\SetInnerMargin= or \verb=\SetOuterMargin=.
+
+There is no need to begin the drawing by erasing the drawing
+area. That's done automatically.
+
+\subsubsection*{Optional Arguments}
+
+The arguments to {\tt figput} in {\tt []}, are optional. The first two
+of these arguments are \label{ht-above-below}
+\begin{verbatim}
+ht_above, ht_below
+\end{verbatim}
+If these arguments appear, then they must both appear, they must be
+the first two arguments, and they must be given in that order (above,
+then below); furthermore, they must include a unit specification, like {\tt
+ bp}. An interactive figure may need a bit of extra clearance
+for an animation or space for widgets that aren't part of the
+figure itself. The static version of the document always uses
+\verb=<fig_ht>= for the figure height, while the interactive form adds
+this optional amount of space above and below the figure. If
+\verb=ht_below= is non-zero, then the $y$-axis is \verb=ht_below=
+above the bottom of the figure when drawn interactively.
+
+The remaining optional arguments may appear in any order and function
+as boolean flags:
+
+\begin{itemize}[itemsep=-1pt,leftmargin=2cm]
+ \item[{\tt nostatic}] Use this when the figure is to be shown only
+ when the document is viewed interactively. No figure will appear
+ in the PDF. Almost certainly, the mandatory \verb=fig_ht= argument
+ should be zero. The sum of \verb=ht_above= and \verb=ht_below= is
+ used for the height of the interactive figure.
+ \item[{\tt done}] indicates to the browser that the {\tt .tikz}
+ should not be updated.
+ \item[{\tt skip}] TikZ files can be large and take a long time to
+ process. When this is set, the TikZ file won't be loaded and the
+ figure will appear with a default ``not available'' message.
+\end{itemize}
+
+When the composition of a figure is complete, it often makes sense to
+turn on the {\tt done} and {\tt skip} flags. Using {\tt skip} saves
+time, and {\tt done} prevents inadvertent overwriting of a {\tt .tikz}
+file that you're happy with. However, to see the complete output, with
+your figures, you would have to go back and tediously remove all of
+the {\tt skip} flags. Use \verb=\NeverSkip= to avoid that tedium and
+disable all the {\tt skip}
+flags that occur until the next \verb=\AllowSkip=.
+
+\subsection*{The {\tt \textbackslash FigPut} Command}
+
+\verb=\FigPut= takes exactly the same arguments as the {\tt figput}
+environment, but the JS code must appear in an external file. The
+location of this external file is indicated with
+\verb=\LoadFigureCode=. If the code is found in {\tt mydrawcode.js},
+then
+\begin{verbatim}
+\LoadFigureCode{mydrawcode.js}
+\end{verbatim}
+must appear somewhere in the {\tt .tex} file.
+
+It is often easier to use an external file to consolidate the drawing
+code in fewer files (or a single file). Not only
+does it make the {\tt .tex} file shorter and easier to navigate, but it
+allows the use of programming tools tailored to JS. For instance,
+the code could be written in TypeScript and compiled to JS. On the other
+hand, if the code for the figures is brief, then it may be clearer and more
+direct to use the {\tt figput} environment so that the code is in the
+{\tt .tex} file.
+
+\subsubsection*{Additional Remarks}
+
+There is no explicit provision in \textsc{FigPut} for changing the
+body of the text based on whether the document is to be viewed statically
+or interactively. This is intentional. The aim is for the text and its
+layout to be \emph{identical} in the two scenarios. However, it would
+be relatively straightforward to set up a couple of commands like
+\begin{verbatim}
+\newcommand{\statictext}[1]{#1}
+\newcommand{\intereactivetext}[1]{ }
+\end{verbatim}
+In the above example, anything that appears in \verb=\statictext{}=
+will pass through to the \LaTeX\ document, while everything in
+\verb=\interactivetext{}= will be ignored. Swap these two definitions
+depending on whether the document is being compiled for interactive or
+static reading.
+
+\subsection{Workflow}
+
+There are several phases to composing and releasing a document. The
+first phase is a loop through writing the \LaTeX, compiling it, viewing
+the output in a browser and generating TikZ, until the document is
+done. Everything in the first phase is local to your machine. The
+second phase is posting the result to a public-facing website. The
+first phase is discussed here; see Section \ref{sec-distributing} for
+the second phase.
+
+\subsubsection*{Setup}
+
+The functionality of \figput\ is given by {\tt figput.sty}. It
+requires the following packages: {\tt zref}, {\tt xsim}, {\tt tikz}
+and {\tt verbatim}.
+
+A typical arrangement is to have a {\tt javascript}
+directory with the files for the browser side of the framework, and a
+\LaTeX\ directory where the document is written in the usual way. The {\tt
+ javascript} directory contains the JS files and the one HTML file needed
+to provide the browser front-end, and you'll also find {\tt server.py}.
+This Python script runs a local server so that your browser can
+open and view the document being written.\footnote{This requires
+Python 3 -- although that's probably obvious these days.} In principle, it's no
+different than a normal web-server, but it is tailored in several
+ways to the task at hand. To invoke this server, use the command-line
+to go to the {\tt javascript} directory and type
+\begin{verbatim}
+python server.py directory/nameof.pdf [port_num]
+\end{verbatim}
+The {\tt directory/nameof.pdf} argument is required and should be the
+path from the current ({\tt javascript}) directory to the PDF being
+generated by \LaTeX. Often, this will be something like
+\begin{verbatim}
+../../latex_area/num_theory/hairy_math.pdf
+\end{verbatim}
+The optional \verb=port_num= argument indicates the TCP/IP port on which the
+server will listen. It defaults to 8000. In principle, any integer in
+the range $[0,2^{16})$ could appear here, but certain values are
+restricted and others may already be in use. Stick to values
+in the range 8000-8100, and you should be safe.\footnote{See
+\verb=en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers=}
+
+By using different port numbers, it's possible to run several servers
+at once, so that multiple documents can be viewed and edited at the
+same time. Once the server is running, point your browser to
+\verb=localhost:8000= (or whatever \verb=port_num= you've chosen) to
+load the document.
+
+As stated, {\tt server.py} differs from a normal web-server in certain
+ways. This is done to make it easier to work with a document while it
+is being written. Once the document is complete, it can be served by a
+normal web-server.
+
+\subsubsection*{Additional Files}
+
+There are two additional directories in the {\tt javascript} directory:
+{\tt development} and {\tt release}. \figput\ was written in
+TypeScript, and the {\tt .ts} files are in {\tt development}. Even if
+you don't want to modify the system, the TypeScript files are easier
+to follow than the JavaScript files, and are the first place to look to
+clarify how the system works internally. There are four files:
+\begin{itemize}[itemsep=-1pt,leftmargin=1cm]
+\item{\tt main.ts} is the main entry-point for the program. This is
+ unlikely to interest anyone who wants to simply use \figput.
+\item{\tt layout.ts} handles page layout -- also uninteresting to most people.
+\item{\tt widgets.ts} has the code for the various widgets. If widgets
+ aren't acting the way you expect, then look here.
+\item{\tt tikz.ts} handles lower-level geometry, and conversion from
+ JS to TikZ. Look here for details about the {\tt Point2D} and
+ {\tt FPath} classes.
+\end{itemize}
+
+Two files found in the {\tt javascript} directory are {\tt
+ pdf.worker.min.js} and {\tt pdf.js}. These are the source files for
+Mozilla's pdf.js library. The complete project can be found at
+\verb=github.com/mozilla/pdf.js=. The files are included here because,
+when developing a \LaTeX\ document on your local machine, it would be
+pointless (and slow) to download these files every time an updated
+version of your document is loaded.
+
+The {\tt release} directory contains the files to be used when the
+document is released to a public-facing website. As noted above, {\tt
+ server.py} works differently than a normal web-server. The release
+process is discussed in more detail in Section \ref{sec-distributing}.
+
+\subsubsection*{From JavaScript to TikZ}
+
+Once the server is running, a browser can view documents created with
+\figput, but the figures will not be visible in
+the PDF document until a TikZ file is provided. The \emph{Get TikZ}
+button in the browser window generates the TikZ files. The server
+will save these files to the same directory as the PDF file. Note that
+a TikZ file will only be generated if the figure has been scrolled
+into view (or nearly into view) since the document was loaded.
+
+Because TikZ files can take time to load, it's often useful to
+compose the figures one (or a few) at a time. Apply the optional
+{\tt done} argument for any figures that are complete, and the
+\emph{Get TikZ} button will not generate TikZ files for them. You may
+want a particular frame from an animation; once you have the right
+frame, it would be frustrating to accidentally overwrite it in the course of
+working on some other figure. Using {\tt done} prevents that from happening.
+
+\subsection{JavaScript Drawing}
+
+In most respects, any JS code can be used with FigPut, but it must be
+possible to translate the JS drawing commands to TikZ, and that leads
+to certain requirements. In a nutshell, all drawing must be done using a
+class that is very similar to JS's built-in {\tt Path2D} class.
+
+If this is too restrictive, then it is possible to side-step the
+requirement with a bit of extra effort. If you use JS drawing commands
+that are off-limits, like {\tt drawImage()}, then the interactive version
+will work fine, but you'll have to find some other way to generate the
+figure for inclusion in the static PDF. Any of the usual methods of
+generating figures for \LaTeX\ documents will work, but now the two
+versions, interactive and static, are generated from different
+source-code.
+
+Earlier, in a footnote on p. \pageref{page-ctx}, it was a stated that
+the {\tt ctx} argument to your drawing function has the standard JS type, {\tt
+ CanvasRenderingContext2D}. That's not always true. Any drawing
+done \emph{to the browser} is \emph{precisely} an object of this
+type. If you only care about seeing your document within the browser
+framework, and you don't care about generating figures for a
+standalone {\tt .pdf} file, then that's all you need to know. Draw
+with JS however you like.
+
+To produce TikZ output, the built-in {\tt CanvasRenderingContext2D}
+must be ``spoofed.'' All of the drawing commands that normally go to
+the built-in JS browser code go to \figput's {\tt CTX} class
+instead, where they are converted to TikZ output.
+This class implements a sub-set of the full list of drawing
+commands normally available. The permitted commands are
+\begin{verbatim}
+ ctx.fill()
+ ctx.stroke()
+ ctx.lineWidth
+\end{verbatim}
+These work almost as they normally do. The {\tt lineWidth} is the
+thickness of any paths, and can be thought of as being in \TeX's {\tt
+ bp} units. The {\tt fill()} and {\tt stroke()} commands normally
+take a JS {\tt Path2D} object, but you should pass an object of type
+{\tt FPath} instead.
+
+The methods of {\tt FPath} listed below are exactly like those found
+in {\tt Path2D}. They add a new segment to an existing {\tt FPath},
+obtained with {\tt new}. See any JS resource for an explanation.
+\begin{itemize}[itemsep=-1pt,leftmargin=*]
+\item {\tt closePath()}
+\item {\tt moveTo()}
+\item {\tt lineTo()}
+\item {\tt bezierCurveTo()}
+\item {\tt ellipse()}
+\end{itemize}
+And these methods of {\tt FPath} are new -- they have no counterpart
+in {\tt Path2D}.
+\begin{itemize}[itemsep=-1pt,leftmargin=*]
+\item {\tt addPath(p)} appends the {\tt FPath}, {\tt p}, to an
+ existing {\tt FPath}.
+\item {\tt translate(p)} translates an {\tt FPath} by the given {\tt Point2D}.
+\item {\tt rotate(angle)} rotates an {\tt FPath} by the given angle,
+ in radians.
+\item {\tt scale(s)} scales an {\tt FPath} by the given factor
+ (relative to the origin).
+\item {\tt reflectX()} reflects an {\tt FPath} across the $x$-axis.
+\item {\tt reflectXY()} reflects an {\tt FPath} across the $x$ and $y$-axis.
+\item {\tt rotateAbout(angle,p)} rotates a given {\tt FPath} about the
+ given {\tt Point2D} by the given angle.
+
+The methods above apply to an existing {\tt FPath} and return a new {\tt FPath}.
+\item {\tt parametricToBezier(f,t0,t1,n)} converts a parametric
+ function, {\tt f(t)}, to a path consisting of {\tt n} B\'ezier
+ curves as {\tt t} runs from {\tt t0} to {\tt t1}. The function
+ must be defined to return {\tt Point2D} objects.
+
+This is a static method, so it returns a new {\tt FPath} that is unrelated to any existing {\tt FPath} objects.
+\end{itemize}
+There are several additional methods in {\tt FPath} that may be
+useful, but they haven't yet been tested well enough to mention
+here (and they may change in the future). See the source code if
+you're adventurous.
+
+Several of the methods above mention the {\tt Point2D} class, and it's what you would expect. Use
+\begin{verbatim}
+ new Point2D(x,y);
+\end{verbatim}
+to create these objects. There's a long list of methods defined in the
+class: {\tt translate()}, {\tt rotate()}, {\tt length()},
+\emph{etc}. See the source code for a complete list.
+
+Text is drawn in a way that is further from how it's normally done in
+JS. Instead of calling {\tt ctx.fillText()}, there are three top-level
+functions (not part of any class) for drawing text:
+\begin{verbatim}
+ drawText(ctx,txt,x,y,dx,dy);
+ drawTextBrowserOnly(ctx,txt,x,y,dx,dy);
+ drawTextTikZOnly(ctx,txt,x,y,dx,dy);
+\end{verbatim}
+The arguments are the same in the three cases, but the first function will draw
+text to both the browser window and the TikZ, while the other two will
+draw the text to only one destination or the other. The {\tt ctx} is
+the same as the argument to your drawing function, {\tt txt} is the
+string to be drawn, {\tt x,y} is the location of the text \emph{for
+the browser}, relative to the lower-left corner of the
+bounding-box. When the text is drawn to TikZ, it is drawn at {\tt
+ x+dx,y+dy}. Because the fonts used in the browser and in TikZ differ
+slightly, sometimes it's necessary to tweak the TikZ placement. Setting
+\begin{verbatim}
+ ctx.font = '10px san-serif';
+\end{verbatim}
+sets the browser font to something very close the default font used
+by TikZ, but it's not a perfect match. The {\tt dx} and {\tt dy}
+arguments are optional and default to {\tt 0}.
+
+As a bonus, the static method, {\tt Numerical.newton()}, can be used to
+solve $f(x) = y$ for $x$, given $y$. It's a naive implementation of Newton-Raphson.
+
+\subsection{JavaScript Widgets}
+
+The foregoing framework could be used an an alternative to TikZ,
+PSTricks, MetaPost, \emph{etc.}, if your aim is strictly static
+output. To make the figures interactive, there must be some means to
+accept user input -- widgets.
+
+All widgets have a static {\tt register()} method. Do not use {\tt
+ new} to create widgets! Registering a widget has the effect of
+making it available for user input, and drawing it too (with one
+exception). The arguments to these {\tt register()} methods vary with
+the widget, but the first argument is always the {\tt ctx} known to
+the drawing function, and the last argument is always a {\tt name} (a
+string). One drawing could have several widgets of the same kind and
+{\tt name} is used to distinguish
+them. So, if a particular drawing has three buttons, then they could
+be created/registered with
+\begin{verbatim}
+let b1 = ButtonWidget.register(ctx,...,"first");
+let b2 = ButtonWidget.register(ctx,...,"second");
+let b3 = ButtonWidget.register(ctx,...,"third");
+\end{verbatim}
+These names only need to be unique within a single drawing and one
+type of widget. So, in the example above, two {\tt
+ DraggableDotWidget}s could be registered in the same drawing as
+the {\tt ButtonWidget}s with
+\begin{verbatim}
+let dd1 = DraggableDotWidget.register(ctx,...,"first");
+let dd2 = DraggableDotWidget.register(ctx,...,"second");
+\end{verbatim}
+
+\subsubsection{\tt ButtonWidget}
+
+These are registered with
+\begin{verbatim}
+ButtonWidget.register(ctx,x,y,text,name);
+\end{verbatim}
+The {\tt x,y} argument is the location of the button, relative to the
+lower-left corner. The {\tt text} is what is shown as the message
+within the button. Buttons work by calling back to your drawing code
+whenever they are clicked. Every time the button is clicked, the
+entire drawing function is executed.
+
+There are two useful fields of {\tt ButtonWidget}. If {\tt b} is a
+{\tt ButtonWidget}, then {\tt b.clickState} toggles between {\tt true} and {\tt
+ false} with every click of the button, while {\tt b.resetState} is
+set to {\tt true} whenever the button is clicked -- and remains {\tt
+ true} until your drawing code resets it.
+
+\subsubsection{\tt NumberInputWidget}
+
+This is similar to {\tt ButtonWidget}, and is used to input single
+numbers. It's registered with
+\begin{verbatim}
+NumberInputWidget.register(ctx,x,y,v,name);
+\end{verbatim}
+The {\tt v} argument is the initial numerical value shown in the
+widget. Whenever the user changes this value, the widget calls back
+and executes the entire drawing function. To obtain this value, call
+{\tt getValue()} on the relevant widget. Because this widget relies
+on HTML, {\tt getValue()} returns a string. It may be necessary to
+call the JS {\tt parseFloat()} or {\tt parseInt()} functions on this
+value.
+
+\subsubsection{\tt DraggableDotWidget}
+
+A ``draggable dot'' is a small dot that can be grabbed by the mouse
+and moved around. They're registered with
+\begin{verbatim}
+DraggableDotWidget.register(ctx,x,y,name);
+\end{verbatim}
+To determine where the user has moved a dot, refer to the widget's
+{\tt widgetX} and {\tt widgetY} fields.
+
+Most widgets are used ``off to the side'' and wouldn't normally
+interfere with the way the figure is drawn, but these dots are typically
+used as part of the drawing itself. The order in which dots are drawn
+may matter. Sometimes a dot should be drawn first, so that other
+elements of the figure may be drawn over it; and sometimes a dot
+should be drawn last so that nothing can obscure it. For this
+reason, unlike other widgets, registering the widget does not also
+draw the widget. An explicit call to the widget's {\tt
+ draw(ctx)} method must be made to draw the dot.
+
+\subsubsection{\tt DraggableDrawWidget}
+
+This is similar to {\tt DraggableDotWidget}, but it has no default
+drawing behavior. The user must provide functions to specify what is
+to be drawn. So it can also be a draggable polygon, or a draggable
+anything-you-can-draw. Register these with
+\begin{verbatim}
+DraggableDrawWidget.register(ctx,x,y,
+ drawFcn,drawSelFcn,testPosFcn,
+ name);
+\end{verbatim}
+The {\tt drawFcn} must be defined to take the {\tt ctx} as the sole
+argument. It can draw whatever it wants, noting that the origin is
+shifted so that drawing should typically take place relative to {\tt
+ (0,0)}, not {\tt (widgetX,widgetY)}. In most cases, this means
+that the drawing code is independent of where the item is on the
+page. {\tt drawFcn} must return an {\tt FPath} object to indicate
+the ``clickable area'' for the item. For example, if what is being
+drawn is a small square, then the function might be defined as
+\begin{verbatim}
+function drawSquare(ctx) {
+ let p = new FPath();
+ // p.lineTo, moveTo, etc., to make a square.
+ ctx.fillPath(p);
+ return p;
+}
+\end{verbatim}
+The value returned is noted, and any click in the interior of the path
+-- as determined by the JS function {\tt isPointInPath()} --
+is taken to be a valid click on the object, to select it and drag it around.
+
+The {\tt drawSelFcn} argument to {\tt register} is identical to the
+{\tt drawFcn} argument, but it is called to draw the item when it is
+``selected.'' Often, the only difference between the two functions
+will be the color used to draw the item.
+
+The {\tt testPosFcn} argument is used to determine whether a
+particular location for the item is acceptable. For example, an item
+could be limited to a particular region. This is called every time the
+mouse is moved, after the item has been selected, up until the mouse
+button is released. The function takes five arguments and returns a
+boolean. The five arguments are the proposed {\tt x,y} position (the
+mouse location), followed by the width of the drawing area, then the
+height above and below the $x$-axis, where the width is equal to the
+text width. Return {\tt true} if the
+proposed {\tt x,y} is acceptable; {\tt false} otherwise. At a minimum,
+the function should typically check that {\tt x,y} is inside the
+figure rectangle.
+
+\subsubsection{\tt LoopAnimWidget}
+
+This widget and the next one ({\tt OpenAnimWidget}) are for
+animations, and work similarly. A {\tt LoopAnimWidget} is used for
+animations that run in a repeating loop. There are many arguments to
+register them.
+\begin{verbatim}
+LoopAnimWidget.register(ctx,x,y,scale,visWidget,
+ steps,start,timeStep,
+ visSteps,visFastSlow,visPauseRun,visCircle,triGrab,
+ name);
+\end{verbatim}
+The {\tt x,y} values are the location of the center of the circle that
+is the primary element of the widget. The widget can be made larger or
+smaller by changing the {\tt scale} -- a value of {\tt 1.0} makes the
+circle 40~{\tt bp} in radius. The {\tt visWidget} argument is a
+boolean; set it to {\tt false} to run an animation without
+showing the user this widget.
+
+{\tt steps} is the integral number of steps that make up one loop of
+the animation. {\tt start} is the step on which the animation
+starts -- so that the animation starts with the {\tt start}-th
+frame. {\tt timeStep} is the number of milliseconds between
+frames. Unless the machine is \emph{very} fast, anything less than
+{\tt 10} for {\tt timeStep} is probably pointless, and a setting of
+{\tt 50} or {\tt 75} is more reasonable considering the human eye.
+
+The next group of arguments -- {\tt visSteps} through {\tt triGrab} -- are
+all booleans. They determine whether certain parts of the widget are
+visible. {\tt visSteps} shows or hides an area above the circle that
+can be used to change the number of steps taken per frame. The user
+can use this control to skip frames of the animation. {\tt
+ visFastSlow} is for some ``sideways chevrons,'' in an area below the circle,
+that allow the user to change the number of milliseconds per
+frame. {\tt vsPauseRun} is for a pause/run control below the
+circle. {\tt visCircle} is for the entire circle. The circle has a
+small grabable triangle to indicate which frame is being shown; use
+{\tt triGrab} to show or hide the triangle.
+
+To draw a particular frame from your drawing function, refer to the
+{\tt curStep} field of the object. This will be a value in the range
+from 0 to the {\tt steps} argument to {\tt register()}.
+
+\subsubsection{\tt OpenAnimWidget}
+
+This widget is for open-ended animations that don't run in a loop,
+but continue ``forever.'' Whereas {\tt LoopAnimWidget} indicates the
+frame being viewed relative to a circle, {\tt OpenAnimWidget} uses a
+bar, something like a scroll-bar. Registration is similar to
+{\tt LoopAnimWidget}:
+\begin{verbatim}
+OpenAnimWidget.register(ctx,x,y,scale,width,visWidget,
+ timeStep,decay,
+ visSteps,visFastSlow,visPauseRun,visBar,barGrab,
+ name);
+\end{verbatim}
+The {\tt ctx}, {\tt x}, {\tt y}, {\tt scale} and {\tt visWidget}
+arguments are as for {\tt LoopAnimWidget}. {\tt width} sets the width
+of the bar, in {\tt bp}.
+
+{\tt timeStep} is in milliseconds, as for {\tt LoopAnimWidget}. The
+{\tt decay} is used to adjust the rate of travel of the ``thumb'' along the
+bar as the animation progresses. Since the animation is potentially
+infinite, the thumb moves quickly early in the animation, then moves
+more and more slowly, so that it never quite reaches the end of the
+bar. The position of the thumb is given by
+$$1 - {1\over (1+{\tt decay})^s},$$
+expressed as a fraction of the bar's total length, where $s$ is the
+frame count (\emph{i.e.}, {\tt curStep}). A reasonable setting for {\tt
+ decay} is something in the range of $10^3$ to $10^6$, although it
+will depend on the animation.
+
+The arguments from {\tt visSteps} to {\tt barGrab} are all boolean and
+control which controls that make up the widget are visible. They're
+like their counterparts in {\tt LoopAnimWidget}, except that {\tt
+ OpenAnimWidget} uses a bar instead of a circle.
+
+\section{Distributing a Complete Document}
+\label{sec-distributing}
+
+The PDF document is no different than any other PDF, and can be
+distributed in the usual ways. When moving the document in interactive
+form to a public-facing website, a few steps are necessary.
+
+See the {\tt javascript/release} directory. It has two files: {\tt
+ figput.html} and {\tt figput.js}. The {\tt .js} file is just the
+four files used for the local version ({\tt main.js}, \emph{etc}.),
+consolidated to a single file and minified. These two files must
+appear on the web-server in the same directory as the various files
+that make up your document.
+
+{\tt figput.html} is only a few lines long, and there are two
+important changes that must be made. See the line that reads
+\vskip 0.2cm
+\noindent\verb!<body onload="doOpenDocument('unknown1',unknowny)" id="mainbody">!
+\vskip 0.2cm
+\noindent Change {\tt unknown1} to your document's name, \emph{without} the
+{\tt .pdf} suffix. If the document was generated from {\tt
+example.tex}, then {\tt unknown1} should be changed to {\tt example}.
+Second, change {\tt unknowny} to {\tt 0}. When the document is
+opened, this is the vertical position, in {\tt bp}, at which the document is
+opened. Setting {\tt unknonwy} to {\tt 0} means that the document
+will open at the top of the first page. Of course, it's possible
+that you want the document to open at some other location, in which
+case use some other value for {\tt unknowny}.
+
+The server needs {\tt figput.html} (after the modifications
+above), {\tt figput.js}, and the files that make up your
+document. These files consist of the {\tt .pdf} file, the {\tt .fig.aux}
+file, any {\tt .js} files referred to by \verb=\LoadFigureCode=, plus
+any {\tt .fjs} files generated by your document. The server does not
+need the {\tt .tikz} files.
+
+\section{Code Internals}
+
+An understanding of this section isn't necessary to use \figput; it's
+here to provide a bit of background for anyone who wants to improve
+or modify the framework. Most of \figput\ is in TypeScript, which
+should make it easier to follow.
+
+Throughout the various files that make up the system are
+{\tt BUG} annotations. These are not bugs \emph{per se}, but are more
+like infelicities, opportunities for improvement, or to draw attention
+to something confusing or problematic. If you want to contribute to
+\figput, then these are a good place to start.
+
+\subsection{\tt figput.sty}
+
+The {\tt .sty} file is well-commented and should be
+self-explanatory. However, I am far from an expert in \LaTeX3
+programming. Here is a high-level list of ways in which it might be
+possible to improve things.
+
+\begin{itemize}[itemsep=-1pt,leftmargin=*]
+\item {\tt figput.sty} is written for \LaTeX3. The entire thing might
+ be simpler if it were in Lua\TeX.
+\item The ability to explicitly specify the inner and outer margins
+ used by \figput\ (with \verb=\SetInnerMargin= and
+ \verb=SetOuterMargin=) is useful, but it would often suffice to
+ default to the margins used by \LaTeX. How can those values be
+ obtained?
+\item Someone who is more expert in \LaTeX3 could improve the code's
+ clarity and brevity.
+\item It would be nice if \figput\ could create figures within a {\tt
+ minipage}, but that would require extensive changes to both the
+ \LaTeX\ and browser code.
+\end{itemize}
+
+\subsubsection*{A Quirk}
+
+\LaTeX\ on Windows has a quirk. \TeX\ will not write to a
+file whose type is executable. Thus, it won't write to
+a {\tt .pl} file (Perl), {\tt .py} (Python) file, \emph{etc.},
+depending on how the machine is set up. \figput\ creates
+JavaScript files, which are typically saved as {\tt .js} files, and
+these may be seen as executable by Windows. Fortunately,
+browsers doesn't care what the suffix is, so \figput\ uses
+{\tt .jfs} as the suffix.
+
+This limitation on the file name suffix applies to \verb=\write=, but
+not to \verb=\write18=. \TeX\ is limited in this way to prevent
+accidental errors and for security. One solution might be to have the
+package write files using an acceptable suffix, then change the
+suffix with \verb=\write18=, which does not have this
+limitation. However, to use \verb=\write18= this way, \LaTeX\ would
+have to be invoked with something like
+\begin{verbatim}
+pdflatex -shell-escape
+\end{verbatim}
+which would be annoying.
+
+\subsection{\tt server.py}
+
+The server is a simple thing, so there's not much to say. It
+would be nice if it were written in a compiled language so
+that the user doesn't need to install Python.
+
+\subsection{Browser Code}
+
+This part is written in TypeScript (TS), which is essentially JS with
+type annotations. It must be translated
+to JS for the browser to run it, but TS code is easier to follow, and
+the type information heads off many programming errors.
+
+Although the program is (to my knowledge!) bug-free in the usual
+sense, there are plenty of {\tt BUG} annotations to draw attention to
+places where the code could be improved. Some of the higher-level
+possibilities for improvement are noted below.
+\begin{itemize}[itemsep=-1pt,leftmargin=*]
+\item \figput\ relies on the {\tt pdf.js} library for rendering
+ PDFs. The result is not as crisp as I would like. It's unclear
+ whether the problem is with the library itself, or how it is being
+ used. Someone who knows that library well may be able to improve the
+ output. Maybe a different library would work better.
+\item Most of the widgets do not rely on the DOM, but {\tt
+ NumberInputWidget} and {\tt ButtonWidget} are based on the built-in
+ DOM elements. It would be nice if these didn't use the DOM.
+\item Many additional widgets could be created.
+\item Adjust the font used for figures in the browser to make it more
+ nearly identical to what appears in the PDF.
+\item Color is entirely neglected on the \LaTeX\ end of \figput. Browser output
+ can be colored arbitrarily (with {\tt ctx.fillStyle} or {\tt
+ ctx.strokeStyle}, as usual), but the TikZ output is limited to
+ black and white.
+\item Double-buffer everything. Animations seem to run fine,
+ without any noticeable flicker, but double-buffering \emph{all}
+ drawing would put an end to any concerns about flicker.
+\item Animations should be turned off and stop generating events when
+ they are scrolled out of view. This would save CPU cycles, which may
+ matter for documents with many animations.
+\end{itemize}
+
+\noindent And some items that are more ambitious...
+\begin{itemize}[itemsep=-1pt,leftmargin=*]
+\item Allow figures to be set within a {\tt minipage} (mentioned above).
+\item Double-clicking a figure (or something) could enlarge the figure
+ to give more room for interaction.
+\item Come up with a scheme so that the code that draws a figure could
+ be made part of the document. For certain topics, the code that
+ draws a figure can be as instructive as the figure itself.
+\item Extend the framework somehow so that it can be used within an
+ IDE. Code that's mathematically-oriented is difficult to
+ document within source code using simple text. It would be easier to
+ understand if it's explained as \LaTeX\ output that appears
+ in the source code, rather than in a separate document.
+\item Extend the framework to allow inclusion of snippets of
+ \LaTeX\ output in standard HTML documents. Things like KaTeX and
+ MathJax are convenient, but incomplete relative to \LaTeX.
+\end{itemize}
+
+\newpage
+
+\subsection*{Version History}
+
+\begin{itemize}[itemsep = -3pt]
+\item{0.90} -- July 21, 2022. I've been using this, privately, for
+ several months. Numerous improvements and extensions are possible,
+ but it definitely works.
+\end{itemize}
+
+
+\vskip 0.3cm
+\hrule
+\vskip 0.3cm
+
+
+Thanks to Dan Pratt for insights regarding TypeScript, and
+improvements to the code.
+
+Several people on {\tt tex.stackexchange} very
+patiently answered numerous questions. Thank you.
+
+
+
+\end{document}
diff --git a/graphics/figput/figput.sty b/graphics/figput/figput.sty
new file mode 100644
index 0000000000..aef23dde05
--- /dev/null
+++ b/graphics/figput/figput.sty
@@ -0,0 +1,682 @@
+
+% We need to know the vertical position on the page where the figures
+% are located. Because this position can't be known until the page is
+% fully composed ("shipout"), the value is only accurate after the
+% second run, just like the \ref command. The value from the previous
+% run is available in the .aux file.
+\RequirePackage{zref-savepos}
+
+% The zref package also provides the page number. It gives the
+% absolute page number, not the logical page number. Things like the
+% table of contents and preface are part of the count. This value is
+% available from abspage. This number is zero-based, so that the
+% "first" page is numbered as zero. Just as positions within a page
+% are not really known until a page is shipped out, the page number
+% isn't known either. Generally, if you're near the middle or the end
+% of the page, then \thepage or abspage is correct, but it is often
+% wrong near the top of the page. The only way around this seems to be
+% to place a label on the page, in a manner similar to what is done
+% for positions within the page.
+\RequirePackage{zref-thepage}
+\RequirePackage{zref-abspage}
+\RequirePackage{zref-user}
+\RequirePackage{zref-pagelayout}
+\RequirePackage{xsim}
+\RequirePackage{tikz}
+
+% This is needed to help with the process of replacing the body of
+% the environment and (optionally) copying it to an external file.
+\RequirePackage{verbatim}
+
+
+\ExplSyntaxOn
+
+% The fig.aux file is open throughout the run.
+\iow_new:N \g_figurefile_iow
+\iow_open:Nn \g_figurefile_iow { \jobname.fig.aux }
+
+% The inner and outer margin widths
+\dim_new:N \l_figput_innermargin_dim
+\dim_new:N \l_figput_outermargin_dim
+
+% By default, set these margins to have zero width. This has no effect
+% on how the text is laid out by latex. It's used on the browser end
+% to set the origin for drawing. In turn, that affects where the
+% figures end up when the tikz is loaded.
+%
+% BUG: There should be a way (?) to determine where the left margin of
+% the text is from latex instead of inputing your best approximation.
+% At the same time, the user might want to adjust this regardless.
+\dim_set:Nn \l_figput_innermargin_dim { 0 pt }
+\dim_set:Nn \l_figput_outermargin_dim { 0 pt }
+
+% Two little commands to set these values.
+\NewDocumentCommand\SetInnerMargin { m }
+{
+ \dim_set:Nn \l_figput_innermargin_dim { #1 }
+}
+
+\NewDocumentCommand\SetOuterMargin { m }
+{
+ \dim_set:Nn \l_figput_outermargin_dim { #1 }
+}
+
+% Use this to turn off any of the optional "skip" arguments to figput.
+% If you call \NeverSkip, then these "skip" arguments are ignored.
+\bool_new:N \l_figput_skipoff_bool
+\bool_set_false:N \l_figput_skipoff_bool
+
+\NewDocumentCommand\NeverSkip{} {
+ \bool_set_true:N \l_figput_skipoff_bool
+}
+
+\NewDocumentCommand\AllowSkip{} {
+ \bool_set_false:N \l_figput_skipoff_bool
+}
+
+% Use this to request that a specific file be loaded by the browser.
+% This simply writes a line to the .aux file.
+\NewDocumentCommand\LoadFigureCode{ m }
+{
+ \group_begin:
+
+ \iow_now:Nx \g_figurefile_iow { load~ #1 }
+
+ \group_end:
+}
+
+
+% The variables used below:
+%
+% Manditory name for the figure, as given by the user. Using string,
+% although maybe token list would be better?
+\str_new:N \l_figput_figname_str
+
+% The manditory height given by the user. This is a dim, as opposed to
+% merely a floating-point value.
+\dim_new:N \l_figput_height_dim
+
+% The optional height adjustments given by the user. Again, dims.
+\dim_new:N \l_figput_htAbove_dim
+\dim_new:N \l_figput_htBelow_dim
+
+% Scratch values used for calculation of figure position.
+\tl_new:N \l_figput_tempa_tl
+\tl_new:N \l_figput_tempb_tl
+\tl_new:N \l_figput_tempc_tl
+
+% And several booleans.
+% BUG: In theory, it would be possible to get rid of nostatic.
+% If the figure height is set to zero, then that should implicitly
+% imply nostatic.
+\bool_new:N \l_figput_hasintht_bool
+\bool_new:N \l_figput_nostatic_bool
+\bool_new:N \l_figput_done_bool
+\bool_new:N \l_figput_skip_bool
+
+% This is for the figures file: the position of the figure on the page.
+\dim_new:N \l_figput_pagepos_dim
+
+% BUG: I don't understand the whole concept of these variants of
+% functions. Somehow it deals with various cases of whether arguments
+% are expanded or not. There's another variant defintion below as well.
+\cs_generate_variant:Nn \file_if_exist:nTF {V}
+\cs_generate_variant:Nn \file_input:n {V}
+
+
+
+% This command works in (almost) exactly the same way as the figput
+% environment. The differenence is that, as a command instead of
+% an environment, there is no body to deal with. Most of the comments
+% have been removed. See the definition of the environment for *much*
+% more detailed comments.
+%
+% BUG: possible to define a function and combine these?
+\NewDocumentCommand\FigPut { > { \SplitArgument { 1 } { , } } m!o }
+{
+ \group_begin:
+
+ % The manditory arguments come in in #1
+ \figput_manargs #1
+
+ % Now the optional arguments.
+ \bool_set_false:N \l_figput_hasintht_bool
+ \bool_set_false:N \l_figput_nostatic_bool
+ \bool_set_false:N \l_figput_done_bool
+ \bool_set_false:N \l_figput_skip_bool
+
+ \tl_if_blank:nTF { #2 } {} {
+ \clist_set:Nn \l_figput_optclist_clist { #2 }
+ \figput_optargs { }
+ }
+
+ % We have everything needed to know what to do.
+ \str_set:Nx \l_figput_filespec_str {
+ \use:c { zref@extractdefault } { \l_figput_figname_str -pageno} { abspage } { 0 }
+ }
+
+ % The inner and outer margins.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_innermargin_dim }
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_outermargin_dim }
+
+ % And the text width.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \textwidth }
+
+ % Massive fooling around to do arithmetic on page position.
+ \tl_set:Nn \l_figput_tempa_tl { \zposy { \l_figput_figname_str } }
+ % Convert the figure height to sp.
+ \tl_set:Nn \l_figput_tempb_tl { \dim_to_decimal_in_sp:n{ \l_figput_height_dim } }
+ % Add
+ \tl_set:Nn \l_figput_tempc_tl { \int_eval:n { \l_figput_tempa_tl + \l_figput_tempb_tl } }
+ % Convert to a dim
+ \dim_set:Nn \l_figput_pagepos_dim { \l_figput_tempc_tl sp }
+ % And (whew!) write it out, in bp.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_pagepos_dim }
+
+ % The latex height of the figure (in bp)
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_height_dim }
+
+ % The interactive height paddings, which are zero by default.
+ \bool_if:NTF \l_figput_hasintht_bool
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_htAbove_dim }
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_htBelow_dim }
+ }
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~0~0 }
+ }
+
+ % The figure name -- used for the JS function to call.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \l_figput_figname_str }
+
+ % And a boolean for whether the tikz is 'done.'
+ \bool_if:NTF \l_figput_done_bool
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ true }
+ }
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ false }
+ }
+
+ % And indicate that this function must appear in an external file.
+ % It is not (false) to be loaded from a seperate file.
+ \str_put_right:Nx \l_figput_filespec_str { ~ false }
+
+ % String is ready. Write out the line.
+ \iow_now:Nx \g_figurefile_iow { \l_figput_filespec_str }
+
+ % That's it for the figures.aux file. Next is the tikz.
+ % Above is identical to the environment code, but the following differs
+ % slightly since there is no body.
+ \bool_set_true:N \l_figput_readtikz_bool
+
+ \bool_if:NTF \l_figput_skip_bool
+ {
+ \bool_set_false:N \l_figput_readtikz_bool
+ }
+ {}
+
+ % In the environment definition, this was part of the "post body"
+ % set of commands.
+ \bool_if:NTF \l_figput_nostatic_bool
+ {
+ % nostatic is set, so do nothing at all -- no figure in the static version.
+ }
+ {
+ % nostatic is not set, so there is a figure.
+ \str_set_eq:NN \l_figput_tikzfile_str \l_figput_figname_str
+ \str_put_right:Nn \l_figput_tikzfile_str { .tikz }
+
+ % Whether to read the tikz file or display a "not available" message
+ % depends on whether the tikz file exists and whether skip was set.
+ \file_if_exist:VTF \l_figput_tikzfile_str
+ {
+ % Yes, tikz exists, although we may not read it if skip is set.
+ }
+ {
+ % Tikz file doesn't exist, so we can't read it in any case.
+ \bool_set_false:N \l_figput_readtikz_bool
+ }
+
+ \bool_if:NTF \l_figput_readtikz_bool
+ {
+ % Load the tikz file here.
+ \file_input:V \l_figput_tikzfile_str
+ }
+ {
+ % Not loading the tikz file. Display a big empty box.
+ \begin{tikzpicture}
+ \useasboundingbox (0pt,0pt) rectangle (\textwidth,\l_figput_height_dim);
+ \draw[dashed] (0pt,0pt) rectangle ( \textwidth,\l_figput_height_dim);
+ \node at (\textwidth / 2,\l_figput_height_dim / 2) {The\ drawing\ is\ not\ available\ to\ load.};
+ \draw (5pt,5pt) rectangle ( \textwidth - 5,\l_figput_height_dim - 5);
+ \end{tikzpicture}
+ }
+
+ % End of figure inclusion -- nostatic is not set.
+ }
+
+ % Note the figures location as of after the figure.
+ \par\zsaveposy { \l_figput_figname_str }
+ \zlabel{ \l_figput_figname_str -pageno}
+
+ \group_end:
+}
+
+
+
+% See xparse for the top-level definition, \NewDocumentEnvironment and
+% its use of \SplitArgument. The gist is that there will be two
+% arguments, one for the manditory items (m), given in {}, and one for
+% the optional arguments (o), given in [].
+%
+% In theory, it is possible to take the body of the environment as an
+% argument, but that won't work if you want to receive the body
+% verbatim. Somehow, using xsim allows the body to be taken verbatim.
+%
+% Note also the ! that appears before the o. This is explained in the
+% xparse documentation. Without the !, if the user does not provide
+% any optional arguments, then any leading space in the body will be
+% eaten and disappear.
+
+\NewDocumentEnvironment{figput} { > { \SplitArgument { 1 } { , } } m!o }
+{
+ % I don't understand latex's concept of local variable, but
+ % this makes what follows local in some sense.
+ % BUG: Does this even matter? It looks like all my variables are in
+ % the figput module.
+ \group_begin:
+
+ % The manditory arguments come in in #1, but they have been
+ % broken up so that #1 "reads as" {first arg}{second arg}. By
+ % passing this to another function, it automatically breaks this
+ % into two distinct arguments. This seems a silly way, but it works.
+ % This sets \l_figput_figname_str and \l_figput_height_dim.
+ \figput_manargs #1
+
+ % Now the optional arguments. Start off with some default values.
+ % It looks like the htAbove and htBelow values are blank by default,
+ % which is what I want.
+ \bool_set_false:N \l_figput_hasintht_bool
+ \bool_set_false:N \l_figput_nostatic_bool
+ \bool_set_false:N \l_figput_done_bool
+ \bool_set_false:N \l_figput_skip_bool
+
+ % Only try to set these values if there *were* some optional arguments,
+ % which come in as the #2 argument to figput.
+ % I set the clist here and "pass" it as global variable since I can't
+ % figure out how to pass the #2 argument directly. This works, but it
+ % is ugly. So this does nothing if the #2 argument is empty, leaving
+ % the boolean values as set above. Otherwise, it reads in the
+ % height adjustments and sets the boolean values above.
+ \tl_if_blank:nTF { #2 } {} {
+ \clist_set:Nn \l_figput_optclist_clist { #2 }
+ \figput_optargs { }
+ }
+
+ % We have everything needed to know what to do. Prepare to write the
+ % data to the figures file. It seems that the easiest way to do this
+ % is to build up the string, then write it out. Getting spaces right
+ % is hard when I tried to write each bit directly to the file.
+ % Unravelling what's actually written and its meaning is hard to do
+ % here. It's easier to understand the js code that reads this output.
+
+ % Need the position on the page. This saves it (for the next run).
+ % Just as for the page number (see below), it turns out that this
+ % shouldn't be done here; if it is, the figures at the bottom of the page are
+ % improperly positioned. This is done *after* the environment closes.
+ %\zsaveposy { \l_figput_figname_str }
+
+ % And this gets the value from the previous run.
+ % This value is relative to the bottom of the page (normal axes)
+ % See below. The possibility of a figure at the bottom of the page
+ % requires a bit of trickery.
+ %\dim_set:Nn \l_figput_pagepos_dim { \zposy { \l_figput_figname_str } sp}
+
+ % Getting the page number correct is fiddly. We need to place a
+ % label at this location, and this label is updated at shipout.
+ % Because I am using the figure name as the label for the vertical
+ % position, I add a suffix ("-pageno") to distinguish this label.
+ % Originally, I had this line here, but that doesn't work because
+ % the page number is that at which the environment "opens" rather
+ % than when it "closes." If the figure is at the bottom of the page,
+ % then it seems that you get the page prior to the one you want.
+ %\zlabel{ \l_figput_figname_str -pageno}
+
+ % I would have thought that saying
+ % \zref[abspage]{ \l_figput_figname_str }
+ % would work, but it's not properly expanded. It *does* work to say
+ % the above and have it appear as a number on the page. I don't fully
+ % understand what the bit below does, but it works.
+ \str_set:Nx \l_figput_filespec_str {
+ \use:c { zref@extractdefault } { \l_figput_figname_str -pageno} { abspage } { 0 }
+ }
+
+ % The inner and outer margins.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_innermargin_dim }
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_outermargin_dim }
+
+ % And the text width.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \textwidth }
+
+ % Use tilde (~) to get a space in the string, and convert to bp (big
+ % points). Fortunately, this eliminates the "bp" suffix too.
+ % There is a problem here, related to whether the figure is at the
+ % bottom of the page and gets bumped to the next page.
+ % I want to know the location of the top of the figure relative to
+ % the page on which it appears. The way to get the position on the
+ % page is with \zsaveposy. The problem is that if I want this
+ % location *before* the figure, then you get the bottom of the text
+ % immediately before the figure; if you ask for this location
+ % *after* the figure (or from within the figure), then you get the
+ % location of the bottom edge of the figure.
+ %
+ % The solution is to get the location of the bottom edge of the
+ % figure, then subtract the known figure height -- actually we *add*
+ % because we are in "normal" coordinates. We want to move up on the
+ % page.
+ %
+ % So, get the value from the previous run, in sp (small or scaled points).
+ \tl_set:Nn \l_figput_tempa_tl { \zposy { \l_figput_figname_str } }
+ % Convert the figure height to sp.
+ \tl_set:Nn \l_figput_tempb_tl { \dim_to_decimal_in_sp:n{ \l_figput_height_dim } }
+ % Add
+ \tl_set:Nn \l_figput_tempc_tl { \int_eval:n { \l_figput_tempa_tl + \l_figput_tempb_tl } }
+ % Convert to a dim
+ \dim_set:Nn \l_figput_pagepos_dim { \l_figput_tempc_tl sp }
+ % And (whew!) write it out, in bp.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_pagepos_dim }
+
+ % The latex height of the figure (in bp)
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_height_dim }
+
+ % The interactive height paddings, which are zero by default.
+ \bool_if:NTF \l_figput_hasintht_bool
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_htAbove_dim }
+ \str_put_right:Nx \l_figput_filespec_str { ~ \dim_to_decimal_in_bp:n \l_figput_htBelow_dim }
+ }
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~0~0 }
+ }
+
+ % The figure name -- used for the JS function to call.
+ \str_put_right:Nx \l_figput_filespec_str { ~ \l_figput_figname_str }
+
+ % And a boolean
+ \bool_if:NTF \l_figput_done_bool
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ true }
+ }
+ {
+ \str_put_right:Nx \l_figput_filespec_str { ~ false }
+ }
+
+ % We're making a seperate file for this particular function.
+ % Tell the browser (true) to load it.
+ \str_put_right:Nx \l_figput_filespec_str { ~ true }
+
+ % String is ready. Write out the line.
+ \iow_now:Nx \g_figurefile_iow { \l_figput_filespec_str }
+
+ % That's it for the fig.aux file. Next is the heavy lifting,
+ % making the environment shift blocks of text around. Exactly what
+ % to do depends on the optional flags.
+ %
+ % Ultimately, there are only two things we might do (plus nothing):
+ % write the body of the environment to a file, and/or read a tikz
+ % file in to replace the current body (which may be blank). The
+ % easiest way to manage these options is to set a couple of booleans
+ % to indicate whether we should do these two things.
+ \bool_set_true:N \l_figput_writebody_bool
+ \bool_set_true:N \l_figput_readtikz_bool
+
+ % Note that there is no need to check nostatic here.
+
+ \bool_if:NTF \l_figput_skip_bool
+ {
+ % skip == true, so don't write body or read tikz.
+ \bool_set_false:N \l_figput_writebody_bool
+ \bool_set_false:N \l_figput_readtikz_bool
+ }
+ {}
+
+ \bool_if:NTF \l_figput_writebody_bool
+ {
+ % Yes, we are to write the body to an external file.
+
+ % The output file name needs an extra ".fjs" on the end.
+ % I don't like using this suffix, but it's seems the least bad.
+ \str_set_eq:NN \l_figput_jinfile_str \l_figput_figname_str
+ \str_put_right:Nn \l_figput_jinfile_str { .fjs }
+
+ % Whether to add an additional EOL to the output file depends on
+ % whether there were any optional arguments. That's what the boolean
+ % argument does here. It tells the writer whether to start off with
+ % an "extra" EOL.
+ \IfValueTF {#2}
+ { \xsim_file_write_start:nn { \c_true_bool } }
+ { \xsim_file_write_start:nn { \c_false_bool } }
+ { \l_figput_jinfile_str }
+ }
+ {
+ % Do not write the body to an external file, but it still needs
+ % to be "eaten" and thrown away; otherwise, it passes through
+ % and latex tries to make the JS code into part of the document.
+ % This uses the verbatim package.
+ \comment
+ }
+}{
+ % Post environment commands. Remember that the "execution" of an
+ % environment is divided into two parts.
+ \bool_if:NTF \l_figput_writebody_bool
+ {
+ % Stop writing the body since it's done.
+ \xsim_file_write_stop:
+ }
+ {
+ \endcomment
+ }
+
+ \bool_if:NTF \l_figput_nostatic_bool
+ {
+ % nostatic is set, so do nothing at all -- no figure in the static version.
+ }
+ {
+ % nostatic is not set, so there is a figure.
+
+ % And replace the current body with an external tikz file.
+ \str_set_eq:NN \l_figput_tikzfile_str \l_figput_figname_str
+ \str_put_right:Nn \l_figput_tikzfile_str { .tikz }
+
+ % Whether to read the tikz file or display a "not available" message
+ % depends on whether the tikz file exists and whether skip was set.
+ \file_if_exist:VTF \l_figput_tikzfile_str
+ {
+ % Yes, tikz exists, although we may not read it if skip is set.
+ }
+ {
+ % Tikz file doesn't exist, so we can't read it in any case.
+ \bool_set_false:N \l_figput_readtikz_bool
+ }
+
+ \bool_if:NTF \l_figput_readtikz_bool
+ {
+ % Load the tikz file here.
+ \file_input:V \l_figput_tikzfile_str
+ }
+ {
+ % Not loading the tikz file. Display a big empty box.
+ % The problem here is that I need to specify the size of the
+ % drawing, and tizk doesn't make that easy. It prefers to look at
+ % the drawing and determine the size based on what was actually
+ % drawn. It seems as though it is possible to *scale* a drawing to
+ % take a particular size, although simply specifying the size is
+ % hard. What does seem to work is one of the two following approaches.
+ % (1) If you want to "trick" latex into allocating a given area
+ % for the drawing, even if the drawing ends up going "outside the
+ % lines," then you can say (within the tikzpicture environment)
+ % \useasboundingbox (0pt,0pt) rectangle (100pt,200pt);
+ % or whatever the dimensions are. Use this on the first line.
+ % (2) This idea doesn't so much trick latex into using a particular
+ % vbox/hbox for the drawing as limit the drawing to the rectangle
+ % you want by clipping it. Here, as the first line of the drawing
+ % you say
+ % \clip (0,0) rectangle (100pt,200pt);
+ % and the drawing will be limited to that region. I suspect (?)
+ % that if the actual drawing is smaller than the clip region, the
+ % latex will reduce the size of the figure accordiningly. So (1)
+ % is probably the better solution.
+
+ \begin{tikzpicture}
+ % The opposite corner is given by (width,height), and the width
+ % doesn't really matter since I assume that the figure spans the page.
+ % BUG: Maybe I should change this to bp?
+ % BUG: The right thing to do here is (?) to make the box match
+ % the settings for \l_figput_innermargin_dim and outermargin, but
+ % I think this requires that I know the page width.
+ \useasboundingbox (0pt,0pt) rectangle (\textwidth,\l_figput_height_dim);
+
+ % I don't understand exactly how the figure is placed on the
+ % page, but this seems to work.
+ \draw[dashed] (0pt,0pt) rectangle ( \textwidth,\l_figput_height_dim);
+
+ % It looks like the text is drawn so that the bounding box is
+ % centered at the given coordinates. Note how tikz lets you
+ % divide with a simple "/2". Nice.
+ %
+ % Note also that, because this is being done with \ExplSyntaxOn,
+ % the spaces in the text need to be \-spaces. Also, if I say
+ % \node[draw], then a box is drawn around the text.
+ \node at (\textwidth / 2,\l_figput_height_dim / 2) {The\ drawing\ is\ not\ available\ to\ load.};
+
+ % For visual appeal, an extra enclosing rectangle.
+ % BUG: I might want to check how tall the figure is and adjust
+ % this box accordingly, or not show it at all if the box is very small.
+ \draw (5pt,5pt) rectangle ( \textwidth - 5,\l_figput_height_dim - 5);
+
+ \end{tikzpicture}
+ }
+
+ % End of figure inclusion -- nostatic is not set.
+ }
+
+ % See above. I originally had these lines near the start of the
+ % process, but I had to put it here, as the very last thing, for the
+ % values to be correct. Otherwise figures at the very end of a
+ % page are assigned the page number prior to what it should be, and
+ % they end up on the bottom of that page.
+ %
+ % Wow, I really don't understand this, but somehow, adding the \par
+ % here serves to "quiet" another \par that would be inserted and
+ % that I do not want. Without this, it seems like there is an extra
+ % \par following the .tikz file when one is loaded. This solution
+ % was provided as the answer to my question 643125 on tex.stackexchagne.
+ % Apparently, it has something to do with \zsaveposy being a
+ % "whatsit" command. I haven't unravelled this fully, but it somehow
+ % explains what is going on.
+ \par\zsaveposy { \l_figput_figname_str }
+ \zlabel{ \l_figput_figname_str -pageno}
+
+ % Note that group_end occurs here. It can't appear above, in the
+ % pre-environment stuff because we still need access to some of the
+ % variables here, post-environment.
+ \group_end:
+}
+
+% I wanted to define this with \cs_new, but lost patience with it.
+% This works, but it's probably not "the right way."
+\NewDocumentCommand{\figput_manargs}{ m m }
+{
+ % You need braces around #1 or you only get the first character.
+ \str_set:Nn \l_figput_figname_str { #1 }
+ \dim_set:Nn \l_figput_height_dim { #2 }
+}
+
+% This is to handle the optional arguments. It merely sets the
+% relevant variables.
+\NewDocumentCommand{\figput_optargs} { }
+{
+ % Certain things are hard to do using a clist, so it's held as a seq
+ % too. Again, no doubt there is a better way, but this works.
+ \seq_set_from_clist:NN \l_figput_optseq_seq { \l_figput_optclist_clist }
+
+ % The first of the optional arguments might be a length. If it is, then
+ % we have two lengths (dims), for the additional space above/below when
+ % the figure is viewed interactively.
+ %
+ % Note that one could make the call directly from the entire set of
+ % optional arguments with
+ %\figput_if_length:eTF { \clist_item:nn { #2 } { 1 } } {TRUE}{FALSE} \\
+ % However (!) this only works if the function if_length is defined
+ % with \prg_new_conditional:Nnn rather than
+ % \prg_new_protected_conditional. I have no idea what the difference
+ % is.
+ %
+ % Pull out the first of the optional arguments to make it easier to
+ % work with. Note that by using a copy of the data in a seq variable,
+ % I can pop things off without worrying about side-effects.
+ \seq_pop_left:NN \l_figput_optseq_seq \l_figput_firstvalue_tl
+
+ % If the first value parses out to be a dimension, then note that
+ % value as the height above and get the height below too.
+ \figput_if_length:VTF \l_figput_firstvalue_tl
+ {
+ \dim_set:Nn \l_figput_htAbove_dim \l_figput_firstvalue_tl
+ \bool_set_true:N \l_figput_hasintht_bool
+
+ % Get the second value (reusing the "firstvalue" variable).
+ \seq_pop_left:NN \l_figput_optseq_seq \l_figput_firstvalue_tl
+ \dim_set:Nn \l_figput_htBelow_dim \l_figput_firstvalue_tl
+ }
+ {
+ % If it's not a dimension, then ignore it for now.
+ }
+
+ % Check whether each possible boolean flag has been set.
+ % BUG: I should check whether the user passed in something
+ % spurious, and he might accidentally indicate the interactive
+ % heights out of order. As things stand now, the user could pass in
+ % "gibberish" as an option and it would be ignored. No harm done,
+ % but it could confuse the user.
+ \clist_if_in:NnTF \l_figput_optclist_clist { nostatic }
+ {
+ \bool_set_true:N \l_figput_nostatic_bool
+ }{}
+ \clist_if_in:NnTF \l_figput_optclist_clist { done }
+ {
+ \bool_set_true:N \l_figput_done_bool
+ }{}
+ \clist_if_in:NnTF \l_figput_optclist_clist { skip }
+ {
+ % Note the test for whether \NeverSkip was called.
+ \bool_if:NTF \l_figput_skipoff_bool
+ {}{
+ \bool_set_true:N \l_figput_skip_bool
+ }
+ }{}
+}
+
+% This was a "top-level" command, defined with
+%\NewDocumentCommand{\iflengthTF}{mmm}
+% but that's really not the way to do this.
+%
+% Instead, we define a function "in the module" (figput), plus a
+% "variant." See p. 32 of the interface3 document. For the initial
+% function (not the variant), see p. 62. I can't say that I really
+% understand what's going on here, other than a bit of copy and paste
+% and the help from stack overflow does it.
+\prg_new_protected_conditional:Nnn \figput_if_length:n { T, F, TF }
+ {
+ \regex_match:nnTF
+ % Note that I only allow positive values.
+ { \A [+]? ((\d+(\.\d*)?)|(\.\d+)) \s* (pt|pc|in|bp|cm|mm|dd|cc|sp|ex|em) \Z}
+ { #1 } % test string
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_generate_conditional_variant:Nnn \figput_if_length:n { V } { T, F, TF }
+
+
+\ExplSyntaxOff
diff --git a/graphics/figput/javascript/development/layout.ts b/graphics/figput/javascript/development/layout.ts
new file mode 100644
index 0000000000..e1e1c496f4
--- /dev/null
+++ b/graphics/figput/javascript/development/layout.ts
@@ -0,0 +1,654 @@
+/*
+Code for page layout. The idea is a bit like Java Swing (or a zillion other
+similar setups), but stripped down to only what I need. In particular, the
+Panels are assumed to be stacked vertically.
+
+Everything is accessed through FullPanel, which consists of a list of
+PagePanel objects. These are stacked vertically, and each one contains at
+least one PDFPanel, and may contain FigurePanels. In the lingo of something
+like Java, it would be better to think of PagePanel as a Container or a Box
+since it's used for layout and doesn't directly do anything other than pass
+things to its sub-parts.
+
+*/
+
+
+// This class is the only thing that should be touched by code outside
+// this file. FullPanel.init() is called to set up page layout. Everything
+// is static since there is only one window/canvas.
+
+class FullPanel {
+
+ // The full document consists of a list of PagePanel objects.
+ // thePages[i] is the i-th page, counting from zero.
+ public static thePages : PagePanel[] = [];
+
+ // The width of the widest page of the entire document. Don't access
+ // this directly; use getFullWidth().
+ private static totalWidth : number = -1;
+
+
+ static init(specList : PageData[]) {
+
+ // Add all the pages to this document. specList is PDFDocument.pageSpecs.
+ // Each element of specList corresponds to page.
+ // Call this once, when the program starts, to set up the page layout.
+ let cumV = 0;
+ for (let i = 0; i < specList.length; i++)
+ {
+ let pp = new PagePanel(i,specList[i],cumV);
+ this.thePages[i] = pp;
+ cumV += pp.h;
+ }
+ }
+
+ static async renderAll( height : number ) {
+
+ // Render every PagePanel in FullPanel.thePages.
+
+ // Internal to this function, the height should be in "page pixels,"
+ // meaning the number of pixels tall the destination canvas is at the
+ // current zoom ratio of the offsreen pages.
+ height = height / PDFDocument.getZoom();
+
+ // Because of the use of promises by pdf.js, rendering is broken into
+ // two steps: pre-render and the actual rendering. Pre-rendering
+ // generates a bunch of promises (the pages rendered offscreen) and
+ // rendering can't be done until those promises resolve.
+ let ps = [];
+ for (let i = 0; i < this.thePages.length; i++)
+ {
+ let p = this.thePages[i].preRender(height);
+ ps.push(p);
+ }
+
+ // Don't return until this is done!
+ await Promise.all(ps);
+
+ for (let i = 0; i < this.thePages.length; i++)
+ this.thePages[i].render(height);
+
+ // Eliminate any excess pages from the buffer of offscreen pages.
+ // Do this after copying out, just in case there *is* some weird
+ // problem with race conditions.
+ PDFDocument.trimBuffer();
+ }
+
+ static totalHeight() : number {
+
+ // Return the total height of all pages. This is used to set up
+ // the scroll bars.
+ let answer = 0;
+ for (let i = 0; i < this.thePages.length; i++)
+ answer += this.thePages[i].h;
+
+ return answer;
+ }
+
+ static getFullWidth() : number {
+
+ // Return the width of the widest page. Most of the time, the pages of
+ // a document all have the same width, but they might not in some
+ // rare case. This is needed to center things left/right in the window.
+ if (this.totalWidth > 0)
+ return this.totalWidth;
+
+ // Need to calculate it for the first time.
+ for (let i = 0; i < this.thePages.length; i++)
+ {
+ let pp = this.thePages[i];
+ if (pp.w > this.totalWidth)
+ this.totalWidth = pp.w;
+ }
+
+ return this.totalWidth;
+ }
+
+ static mouseDown(x : number , y : number ) : void {
+
+ // (x,y) is in pdf points, relative to the entire document.
+ // So y will be a huge number if it's on the umpteeth page.
+
+ // To save CPU, I could start off by checking whether x is in
+ // [0,pageWidth] and return if it is not, but the user might want to
+ // place controls outside the page. This is unlikely, but possible.
+
+ // Whoever had focus loses it. It may be taken up by some other widget
+ // (or the same widget again), but nobody has focus by default.
+ WidgetManager.focusOwner = null;
+
+ // Figure out which page this is and hand it off.
+ let i = 0;
+ for ( ; i < this.thePages.length; i++)
+ {
+ if (this.thePages[i].v > y)
+ {
+ // Found the first and only page this could be. It was the
+ // page previous to this one.
+ i -= 1;
+ break;
+ }
+ }
+
+ // If we got here then it had to be the very last page.
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+
+ // Safety check:
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+
+ this.thePages[i].mouseDown(x,y);
+ }
+
+ static mouseMove(x : number , y : number ) : void {
+
+ // As above. However, these are only of interest if some widget
+ // "owns" the mouse -- something was clicked on so that motion
+ // could mean something.
+ if (WidgetManager.mouseOwner === null)
+ return;
+
+ // Although we know exactly which widget will ultimately get this
+ // event, it's easier to let this pass through the layout hierarchy,
+ // just as for mouseDown(), so that the coordinates are properly adjusted.
+ // BUG: Not DRY.
+ let i = 0;
+ for ( ; i < this.thePages.length; i++)
+ {
+ if (this.thePages[i].v > y)
+ {
+ i -= 1;
+ break;
+ }
+ }
+
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+
+ this.thePages[i].mouseMove(x,y);
+ }
+
+ static mouseUp(x : number , y : number ) : void {
+
+ // The big issue here is that the mouse was released so that ownership
+ // is once again up for grabs. In addition, certain widgets will want
+ // to know where the mouse was released. Buttons are a good example.
+ // You could have mouse-down on the button, then the user moves the
+ // mouse out of the button and releases it; the button should only be
+ // "clicked" if the mouse was released over the button.
+ //
+ // An annoying thing here is that the *only* widget that could care about
+ // this (at least, as designed) is the one that owns the mouse-down.
+ // As above, we want the event to pass through the layout hierarchy
+ // so that (x,y) is adjusted for the right frame, but the ultimate
+ // *consumer* of the event may not even be on the page where the
+ // mouse-up occured.
+ // BUG: Not DRY.
+ if (WidgetManager.mouseOwner === null)
+ return;
+
+ let i = 0;
+ for ( ; i < this.thePages.length; i++)
+ {
+ if (this.thePages[i].v > y)
+ {
+ i -= 1;
+ break;
+ }
+ }
+
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+
+ this.thePages[i].mouseUp(x,y);
+
+ // Whatever happened above, the mouse is now up for grabs.
+ WidgetManager.mouseOwner = null;
+ }
+
+}
+
+
+// A PagePanel is the top-level thing, just under the canvas. Each
+// PagePanel makes up a single page of the printed document. There's
+// a list of them in FullPanel. It includes references to the PDFPanel
+// and FigurePanel objects that it contains.
+
+class PagePanel {
+
+ // Every panel has a vertical position within the entire document and height,
+ // in pdf pts. The vertical postion, v, is the top of the page, so the page
+ // extends from v to v+h. The caller must ensure that the Panels stack up
+ // correctly since there is no real page layout.
+ //
+ // In some ways the height, h, is redundant since it could be worked
+ // out from the heights of the individual sub-parts. In fact (see below)
+ // it *is* worked out by the constuctor, but it's easier to do it once
+ // and be done with it. This is the height of the page, as rendered,
+ // taking into account any mismatch due to extra "padding" in the figures
+ // (if there is any, and there often is not).
+ v = 0;
+ w = 0;
+ h = 0;
+
+ // page number, counting from zero.
+ pageNum = 0;
+
+ // The SubPanels that make up this PagePanel.
+ parts : SubPanel[] = [];
+
+
+ constructor(pageNum : number , pageSpec : PageData , v : number) {
+
+ // This implicitly applies to the global (because everything is static)
+ // PDFDocument. pageNum is which page this is, counting from zero.
+ // pageSpec has the info about how the page breaks into pieces and the
+ // relevant figures. v is where this page lies in the entire vertical
+ // list of pages.
+ this.w = pageSpec.pageWidth;
+ this.v = v;
+ this.pageNum = pageNum;
+
+ // Create the PDFPanels and FigurePanels in this PagePanel.
+ let s = pageSpec;
+ if (s.insertPoint.length == 0)
+ {
+ // There are no figures on this page.
+ let p = new PDFPanel(pageNum,this.v,0,0,this.v,this.w,s.pageHeight);
+ this.h = s.pageHeight;
+ this.parts = [p];
+ }
+ else
+ {
+ // There are figures.
+ let srcV = 0;
+ let destV = 0;
+ let totalV = v;
+ for (let j = 0; j < s.insertPoint.length; j++)
+ {
+ // Bit of pdf above figure.
+ let p = new PDFPanel(pageNum,this.v,srcV,destV,totalV,this.w,
+ s.insertPoint[j]-srcV);
+ destV += s.insertPoint[j]-srcV;
+ totalV += s.insertPoint[j]-srcV;
+
+ let f = new FigurePanel( this.v , destV , totalV , this.w ,
+ s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j] ,
+ s.aboveHeight[j] , s.belowHeight[j] , s.leftMargin ,
+ s.textWidth , s.drawFcn[j] );
+
+ srcV = s.insertPoint[j] + s.deleteHeight[j];
+ destV += s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j];
+ totalV += s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j];
+
+ this.parts.push(p);
+ this.parts.push(f);
+ }
+
+ // And the bit of pdf below the last figure on the page.
+ let p = new PDFPanel(pageNum,this.v,srcV,destV,totalV,
+ this.w,s.pageHeight - srcV);
+ this.parts.push(p);
+
+ this.h = destV + s.pageHeight - srcV
+ }
+ }
+
+ async preRender( height : number ) {
+
+ // This renders the underlying page of pdf. It returns a promise
+ // so that the caller can wait for the promise to resolve before
+ // attempting to copy from the rendered page.
+ //
+ // The vpos is where the top of the ctx should be relative to the entire
+ // document, in pdf pts, and height is how much is visible, in rendered
+ // page pixels.
+ // The first question is whether any of this page is visible.
+ let vpos = window.scrollY;
+ if (this.v + this.h < vpos)
+ // Entire page is above the visible area.
+ return;
+ if (this.v > vpos + height)
+ // Entire page is below the visible area.
+ return;
+
+ // Got here, so some portion of the page is visible.
+ await PDFDocument.render(this.pageNum);
+ }
+
+ render( height : number ) : void {
+
+ // Render every SubPanel of the current PagePanel.
+
+ // BUG: Before returning, turn off any of these animations that are
+ // definitely not visible.
+ let vpos = window.scrollY;
+ if (this.v + this.h < vpos)
+ return;
+ if (this.v > vpos + height)
+ return;
+
+ // Got here, so some portion of the page is visible. From here on,
+ // render everything, whether it's actually visible or not.
+ let ctx = ctxTopLevelAdjust();
+
+ // Call the parts of the page. These could be PDFPanel or FigurePanel
+ // objects.
+ for (let i = 0; i < this.parts.length; i++)
+ this.parts[i].render();
+
+ // BUG: I don't like this use of zoom here. Maybe no choice?
+ let z = PDFDocument.getZoom();
+
+ // Put a rectangle aroud the entire page. I'm not 100% convinced that
+ // I like this.
+ ctx.strokeStyle = "black";
+ ctx.strokeRect(0,0,this.w*z,this.h*z);
+ }
+
+ mouseDown(x : number , y : number ) : void {
+
+ // Mouse clicked on this page.
+
+ // y is given relative to the entire document; make it page-relative.
+ y -= this.v;
+
+ // Only clicks on a figure could be of interest.
+ for (let i = 0; i < this.parts.length; i++)
+ {
+ // Either a PDFPanel or a FigurePanel.
+ let p = this.parts[i];
+ if (p instanceof PDFPanel)
+ continue;
+
+ // p must be a FigurePanel.
+ if ((p.destV <= y) && (y <= p.destV + p.h))
+ return p.mouseDown(x,y);
+ }
+ }
+
+ mouseMove(x : number , y : number ) : void {
+
+ // As above. Note that this event could go to the "wrong" figure,
+ // but that's OK. Also, if the mouse is over a PDFPanel, and not
+ // a figure, then the event dies here, which is also OK.
+ y -= this.v;
+
+ for (let i = 0; i < this.parts.length; i++)
+ {
+ let p = this.parts[i];
+ if (p instanceof PDFPanel)
+ continue;
+
+ if ((p.destV <= y) && (y <= p.destV + p.h))
+ p.mouseMove(x,y);
+ }
+ }
+
+ mouseUp(x : number , y : number ) : void {
+
+ // As above, but the event can't be allowed to die. The owning widget
+ // must hear about the mouse up. At the same time, we can't just
+ // inform the widget directly of the mouse up since we also need to
+ // pass the correct coordinates.
+ y -= this.v;
+
+ for (let i = 0; i < this.parts.length; i++)
+ {
+ let p = this.parts[i];
+
+ // This is different than above since *somebody* must take the event,
+ // and the relevant widget must hear about it. If the event is over
+ // a PDFPanel, then tell the widget using crazy coordinates. It
+ // doesn't matter exactly where the mouse was released; it only
+ // matters that it wasn't released anywhere near the widget.
+ if ((p.destV <= y) && (y <= p.destV + p.h))
+ {
+ if (p instanceof PDFPanel)
+ WidgetManager.mouseOwner ! .mouseUp(10000000000000,10000000000000);
+ else
+ // Over a figure.
+ p.mouseUp(x,y);
+ }
+ }
+ }
+}
+
+
+// A PagePanel consists of one or more SubPanels.
+
+abstract class SubPanel {
+
+ // The vertical position and height within a page, with zero being at the
+ // top, and measured in pdf points. This height, h, is the total height.
+ // There's no ambiguity to this height for PDFPanel subclasses, but for
+ // FigurePanel subclasses, it is the sum of the latex height
+ // (PageData.deleteHeight), plus any additional padding as given in
+ // PageData.aboveHeight/belowHeight.
+ destV = 0;
+ h = 0;
+ w = 0;
+
+ // The position of this panel within the entire document.
+ // The only reason for this is the possible use of HTML DOM elements
+ // as widgets within a figure. I would prefer not to use those at all,
+ // but sometimes it's easier. See the NumberInputWidget for one example.
+ totalV = 0;
+
+
+ constructor(v : number , totalV : number , w : number , h : number ) {
+ this.destV = v;
+ this.totalV = totalV;
+ this.w = w;
+ this.h = h;
+ }
+
+ // Will be filled in by sub-class.
+ public render( ) : void {
+ console.log("Error: called SubPanel.render()!");
+ }
+ public mouseDown(x : number , y : number ) : void {
+ console.log("Error: called SubPanel.mouseDown()!");
+ }
+ public mouseMove(x : number , y : number ) : void {
+ console.log("Error: called SubPanel.mouseMove()!");
+ }
+ public mouseUp(x : number , y : number ) : void {
+ console.log("Error: called SubPanel.mouseUp()!");
+ }
+
+}
+
+
+// Used for portions of a page consisting of rendered pdf.
+
+class PDFPanel extends SubPanel {
+
+ // The page numbers start at zero and positions are given in pdf points.
+ pageNum = 0;
+ srcV = 0;
+
+ // BUG: I think I can fold this in elsewhere. It's the same as PagePanel.v.
+ offsetV = 0;
+
+ constructor(pageNum : number , offsetV : number , srcV : number , destV : number ,
+ totalV : number , w : number , h : number ) {
+
+ // The pageNum is given relative to the global PDFDocument. The srcV
+ // and destV are locations relative to the page (in pdf points, with the
+ // top of the page at v=0) and h is the height of this piece, which
+ // is the same for src and dest.
+ super(destV,totalV,w,h);
+ this.pageNum = pageNum;
+ this.srcV = srcV;
+ this.offsetV = offsetV;
+ }
+
+ render( ) : void {
+
+ // Render a portion of the current page.
+
+ let theCanvas = PDFDocument.getCanvas(this.pageNum) ;
+ if (theCanvas === null)
+ {
+ // I'm sure how this happens, but it does occasionally.
+ // It doesn't cause any noticable problems. It seems to happen
+ // if you move the scroll thumb too fast.
+ return;
+ }
+
+ // BUG: I don't like this use of zoom here. Maybe no choice?
+ let z = PDFDocument.getZoom();
+
+ let ctx = ctxTopLevelAdjust();
+
+ // Adjust for scroll bar.
+ ctx.translate(0,(this.offsetV - window.scrollY) * z);
+
+ // Arguments here:
+ // the source image (or canvas),
+ // the source (x,y),
+ // the source (width,height),
+ // the destination (x,y),
+ // the destination (width,height),
+ // It's confusing because optional things typically come after
+ // required things, but not here somehow.
+ ctx.drawImage(theCanvas,
+ 0,this.srcV * z,theCanvas.width,this.h * z,
+ 0,this.destV*z,theCanvas.width,this.h*z);
+ }
+}
+
+class FigurePanel extends SubPanel {
+
+ // Function name, as a string.
+ drawFcn : AugmentedDrawingFunction;
+
+ // Page's v position. This is the position of the page on which
+ // this figure appears relative to the entire document.
+ pageV : number = 0;
+
+ // This margin is the location of the left edge of the text, as
+ // reported by latex.
+ margin = 0;
+
+ // Also from Latex (via figures.aux). This I have more confidence in.
+ textWidth = 0;
+
+ // The height in SubPanel.h is the total height of the figure, including
+ // any padding above or below. The origin used for the figure occurs at
+ // a y-value that is PageData.belowHeight *above* the total height.
+ // lowerPadding is equal to PageData.belowHeight for this figure.
+ lowerPadding = 0;
+ upperPadding = 0;
+
+
+ constructor(pageV : number, destV : number , totalV : number , w : number , h : number ,
+ upperPadding : number , lowerPadding : number , margin : number ,
+ textWidth : number , drawFcn : AugmentedDrawingFunction) {
+
+ // As for PDFPanel, plus the margin is the amount by which to shift the
+ // drawing to the right so that the origin is in line with the text.The
+ // drawFcn is the function provided through Latex.
+ // This is just the name of the function, as a string.
+ super(destV,totalV,w,h);
+ this.pageV = pageV;
+ this.upperPadding = upperPadding;
+ this.lowerPadding = lowerPadding;
+ this.margin = margin;
+ this.textWidth = textWidth;
+ this.drawFcn = drawFcn;
+ }
+
+ render( ) : void {
+
+ // Save this for widgets and animations to use.
+ let ctx = ctxTopLevelAdjust();
+
+ let z = PDFDocument.getZoom();
+ ctx.translate(0,(this.pageV - window.scrollY) * z);
+
+ // Erase the full width of the page. this.w is the correct width,
+ // but the origin will be shifted for drawing. So, erase, then
+ // return the origin to where it was and start over.
+
+ // Shift to where the figure appears and erase.
+ ctx.translate(0,this.destV * z);
+ ctx.scale(z,z);
+
+ // The small adjustment here is to prevent erasing the rectangle
+ // that encloses the entire page.
+ ctx.clearRect(1,0,this.w-2,this.h);
+
+ // Return to the orginal t-matrix, then shift down and right before
+ // drawing the figure (and widgets).
+ // What we want is for the origin to be at the lower-right and
+ // right-handed, adjusted upwards by this.lowerPadding too.
+ ctx = ctxTopLevelAdjust();
+ ctx.translate(0,(this.pageV - window.scrollY) * z);
+ ctx.translate(this.margin * z,(this.destV + this.h - this.lowerPadding) * z);
+ ctx.scale(1,-1);
+ ctx.scale(z,z);
+
+ // Tack this FigurePanel onto the underlying figure-drawing code.
+ // The first time the figure is rendered, this is set, and it's re-set
+ // to the same value with every subsequent call. That seems like
+ // pointless extra work, but it gets the job done.
+ this.drawFcn.figurePanelClass = this;
+ this.drawFcn(ctx);
+ }
+
+ mouseDown(x : number , y : number ) : void {
+
+ // (x,y) is in pdf points, relative to the top-left of the page.
+
+ // Adjust to be relative to the figure, but still LH, relative
+ // to the top of the figure.
+ y -= this.destV;
+ x -= this.margin;
+
+ // y is now given relative to the top edge of the figure, getting
+ // larger as you go *down* the page.
+
+ // Convert y to be RH relative to the correct origin, taking
+ // any padding into account. This is confusing. At this stage,
+ // y is the distance below the figure's top edge. Call that y0.
+ // We want the distance above the lower padding (if any); call
+ // that y1. The distance above the lower *edge* of the figure
+ // is this.h - y0, and from this we subtract the padding.
+ y = (this.h - y) - this.lowerPadding;
+
+ // Pass to the relevant widget.
+ WidgetManager.mouseDown(this.drawFcn,x,y);
+ }
+
+ mouseMove(x : number , y : number ) : void {
+
+ // As above.
+ y -= this.destV;
+ x -= this.margin;
+
+ y = (this.h - this.lowerPadding) - y;
+
+ WidgetManager.mouseMove(this.drawFcn,x,y);
+ }
+
+ mouseUp(x : number , y : number ) : void {
+
+ // As above.
+ y -= this.destV;
+ x -= this.margin;
+
+ y = (this.h - this.lowerPadding) - y;
+
+ WidgetManager.mouseUp(this.drawFcn,x,y);
+ }
+}
+
diff --git a/graphics/figput/javascript/development/main.ts b/graphics/figput/javascript/development/main.ts
new file mode 100644
index 0000000000..ed7c179ed4
--- /dev/null
+++ b/graphics/figput/javascript/development/main.ts
@@ -0,0 +1,1086 @@
+/*
+
+Main entry point for all the js code behind the browser interface.
+
+This has the initialization code, to load the pdf and the data specifying
+how figures are drawn and laid out, plus the top-level stuff to direct
+events to the proper place for handling.
+
+The same code is used for developing the document, and for serving it
+from a public-facing website, with a few changes. Look for "PUBLIC FACING"
+annotations. Note also that it would be possible to strip considerably
+more code away for the public-facing version, but there's no pressing
+reason to do it -- the savings would be tiny -- and it could lead to
+an error of some kind due to unforeseen dependencies on the deleted
+code.
+
+*/
+
+
+// In rare cases, I need to know the browser. Note it first, before doing
+// anything else. This userAgent is a longish bit of blather specifying
+// the browser, and the easiest way to deal with it is to check whether
+// certain strings appear.
+
+var theBrowser = function() {
+
+ let blah = navigator.userAgent;
+
+ if (blah.indexOf("Firefox") > -1)
+ return "Firefox";
+
+ // MS Edge is also "Chrome," at least for my purposes.
+ if (blah.indexOf("Chrome") > -1)
+ return "Chrome";
+
+ // Assume "Chrome" as the default.
+ console.log("MAKING DEFAULT 'CHROME' ASSUMPTION ABOUT THE BROWSWER!!!");
+ return "Chrome";
+}();
+
+
+// JS has poor to non-existent facilities for dealing with thread scheduling.
+// In a lot of JS code that doesn't matter, but the pdf.js library, on which
+// this entire thing rests, makes heavy use of Promises and workers. Fortunately,
+// there's a simple way of managing this.
+//
+// To use this, the caller says
+// await sleep(100);
+// and the "await" is crucial. This works because setTimeout() takes a
+// function to run, and some amount of time to wait before running that
+// function.
+//
+// This isn't a satisfying solution because it requires "await."
+// For that reason it can only be used in async functions.
+
+function sleep(ms : number) : Promise<unknown> {
+
+ // ms is milliseconds, not microseconds.
+ return new Promise(resolve => setTimeout(resolve,ms));
+}
+
+
+// Some semi-bogus stuff to quiet the ts compiler...
+
+// This makes the external library known to tsc.
+declare var pdfjsLib : any;
+
+// And this provides the properties known to pdfjs that belong to a pdf.
+// I had hoped to define a blank type, and have done with it, but we need
+// access to certain fields. This provides the type information that
+// pdf.js lacks -- or at least the minimal information that I need.
+type LoadedPDF = {
+ numPages : number;
+ getPage : (n : number) => Promise<any>;
+};
+
+// This is less bogus. It's the type of the functions called to draw the figures.
+// These functions have an added property that points to the
+// correct FigurePanel widget. See the layout code.
+// Declaring these types serves to warn the programmer what's ahead. It also
+// provides tsc with the information it needs to prevent certain mistakes.
+type BaseDrawingFunction = (ctx : CanvasRenderingContext2D | CTX) => void;
+type AugmentedDrawingFunction = BaseDrawingFunction & { figurePanelClass : FigurePanel | null; };
+
+
+function getAugmentedFunction(fcnName : string ) : AugmentedDrawingFunction {
+
+ // This converts from a function name, as specified by the user in their latex
+ // document to the internally more useful AugmentedDrawingFunction. Doing this
+ // kind of conversion feels icky, but any alternative I've come up with requires
+ // that the person using FigPut know more than the absolute minimum about what's
+ // behind the curtain.
+ //
+ // References to these functions come into the program at two points. First, when
+ // the document is loaded, a list of the relevant drawing functions is provided
+ // by latex. Second, when the user creates widgets within his drawings, these
+ // widgets must belong to a particular drawing and the function (or its name, as
+ // a string) is used as the key under which the widget is filed.
+
+ // BUG: This double-cast and use of 'any' is horrible, but is there
+ // anything better?
+ return <AugmentedDrawingFunction> <unknown> window[ fcnName as any ];
+}
+
+
+// Data related to the document pages and figures. Each page
+// has one of these in PDFDocument.pageSpecs. This is all
+// static data once the document has been loaded.
+
+// BUG: Should this be a type? An interface?
+
+class PageData {
+
+ // Note that pageHeight is the height of a *printed* page. If the page
+ // has a figure whose height is different than the deleted height, then
+ // the page height, as rendered, will be different than this value.
+ // Also, the margins and textWidth are only valid when there is a
+ // figure to render since they come from figures.aux.
+ // For reference, 8.5 x 11 inch paper is 612 x 792 pts;
+ // A4 paper is 8.27 x 11.69 inch or 595.44 x 841.68 pts.
+ // However, it seems that latex sometimes produces slightly different
+ // dimensions of what must be A4 paper.
+ pageHeight : number = 0;
+ pageWidth : number = 0;
+ leftMargin : number = 0;
+ rightMargin : number = 0;
+ textWidth : number = 0;
+
+ // These arrays have one entry for each interactive figure on the page.
+ // insertPoint is the position, from the top, at which the figure is
+ // inserted. deleteHeight is how much of the latex doc is omitted, and
+ // above/belowHeight is how much room to leave in the browser window for
+ // the figure. name is the name of the function to call to draw the
+ // figure, done is whether to generate new tikz
+ insertPoint : number[] = [];
+ deleteHeight : number[] = [];
+ aboveHeight : number[] = [];
+ belowHeight : number[] = [];
+ name : string[] = [];
+ done : boolean[] = [];
+
+ // For each figure, there is a corresponding function (that will be
+ // augmented with a drawing target). These values make the name values
+ // given above conceptually redundant.
+ drawFcn : AugmentedDrawingFunction[] = [];
+}
+
+
+// Everything related to the pdf document is here. Its main purpose is
+// to handle off-screen rendering. It's all static since there can only be
+// one pdf open at a time. It does include data about how to lay out the
+// figures, but none of the code that does it.
+//
+// I tried making this a module, but really no advantage over a class,
+// and definitely some disadvantages.
+
+class PDFDocument {
+
+ // The document, as returned by pdfjsLib.getDocument.
+ private static pdf : LoadedPDF;
+
+ // Total number of pages in the above document.
+ public static numberOfPages = 0;
+
+ // This is the scale at which to to render the pages offscreen. Setting
+ // this equal to 1 means that each px of the off-screen canvas is 1 pdf
+ // point.
+ private static zoom : number = 1;
+
+ // Information about the layout, one for each page.
+ public static pageSpecs : PageData[] = [];
+
+ // The fields below are a temporary buffer of pages rendered offscreen.
+ // This speeds up the process so that we aren't re-rendering pages.
+ // My original intent was for these arrays to have no more than
+ // pageBufSize entries, but the way async/promise works makes that
+ // difficult (impossible?). I want render() to render a given page
+ // to an offscreen canvas and store that canvas here, which means
+ // that all these calls to render() share the variables below.
+ // Each call to render() is, unavoidably, in a different thread, and
+ // that means that they are all trying to manipulate these varaibles
+ // in an order that is unpredictable. The only way that I can see to
+ // make this happen in a predicatable way is for each page to have
+ // its own canvas. It's OK for render() to put things into its designated
+ // spot in an array, but it can't touch anything that some other invocation
+ // of render might touch.
+ //
+ // This is wasteful, but I see no other way to do it without using
+ // a mutex. It's not that bad since we're talking about a few bytes for
+ // every page, but still annoying.
+ //
+ // Aside: JS does have the Atomics object, as of ECMA 2017, and it
+ // might (?) be possible to use that somehow as a way to synchronize
+ // threads, but I'd rather not mess with it.
+
+
+ // The total number of pages that may be held. This needs to be at least
+ // as large as the number of pages that may be visible at one time if you
+ // zoom all the way out, plus a couple extra due to possible problems
+ // resulting from race conditions that I can't (?) avoid.
+ private static pageBufSize : number = 6;
+
+ // This holds a copy of page to be copied to the screen. Every page has
+ // its own entry, although all but (at most) pageBufSize will be null.
+ private static theCanvases : (HTMLCanvasElement | null)[] = [];
+
+ // The renderCount is how many times we've rendered any page. It's used like
+ // a time since I have no confidence in window.performance.now, which is
+ // supposed to return the current time in nanoseconds. Every time a page
+ // is asked to be rendered, this value increments, and is stored in
+ // pageAge[i], where i is the index of the page rendered. It may not
+ // actually be rendered if it would be a re-render, but the time is updated.
+ // We need this to flush older pages from the buffer when there are too many.
+ //
+ // NOTE: This variable is shared by the various invocations of render()
+ // and something like
+ // ++renderCount
+ // is not an atomic operation. The way I am using this, the fact that
+ // the value of renderCount may be incorrect isn't a disaster. It can
+ // only be wrong by a few steps. This is why pageBufSize is bumped up to be a
+ // little larger than strictly necessary. Worst case, things are re-rendered
+ // and you waste some CPU.
+ private static renderCount : number = 0;
+
+ // One of these for each page, indexed by page number. Holds the value
+ // or renderCount at the time when the page was rendered (or re-rendered).
+ private static pageAge : number[] = [];
+
+
+ public static async setPDF(thePDF : LoadedPDF) {
+
+ // Take the newly loaded pdf and note some of it's stats.
+ // Once this is loaded, thePDF never needs to be accessed again
+ // from outside this class.
+ this.pdf = thePDF;
+
+ this.numberOfPages = thePDF.numPages;
+
+ // It seems that pdfjs counts pages from one, not zero.
+ for (let i = 1; i <= this.numberOfPages; i++)
+ {
+ await thePDF.getPage(i).then(function(page) {
+
+ // Note the i-1 here since I want arrays to start at zero.
+ PDFDocument.pageSpecs[i-1] = new PageData();
+ PDFDocument.pageSpecs[i-1].pageWidth = page.view[2];
+ PDFDocument.pageSpecs[i-1].pageHeight = page.view[3];
+
+ // Make sure that the shared buffer arrays are all fully allocated.
+ PDFDocument.theCanvases[i-1] = null;
+ PDFDocument.pageAge[i-1] = 0;
+ });
+ }
+ }
+
+ public static isLoaded() : boolean {
+ if (this.pdf === null)
+ return false;
+ else
+ return true;
+ }
+
+ public static getZoom() : number {
+ return this.zoom;
+ }
+
+ public static setZoom(z : number) : void {
+
+ this.zoom = z;
+ this.flushBuffer();
+ }
+
+ public static getCanvas(n : number) {
+
+ // Return the canvas for page number n (counting from zero).
+ // This assumes that the canvas is available due to a previous
+ // call to render(n) -- which must have resolved by the time this
+ // method is called.
+
+ // BUG: This shouldn't happen, but maybe I should create a fake
+ // blank canvas anyway.
+ if (this.theCanvases[n] === null)
+ console.log("ERROR! Canvas for page missing: " +n);
+
+ return this.theCanvases[n];
+ }
+
+ public static async render(n : number ) {
+
+ // Render page n offscreen, where the pages are counted from zero.
+
+ // See if the page is already there.
+ if (PDFDocument.theCanvases[n] !== null)
+ return;
+
+ // Note the +1 here since pdf.js counts pages from 1, not zero.
+ let thePage = await PDFDocument.pdf.getPage(n + 1);
+
+ let newCanvas : HTMLCanvasElement = document.createElement('canvas');
+ PDFDocument.theCanvases[n] = newCanvas;
+ PDFDocument.pageAge[n] = PDFDocument.renderCount;
+ ++PDFDocument.renderCount;
+
+ let offctx = newCanvas.getContext('2d');
+ let viewport = thePage.getViewport(PDFDocument.zoom);
+
+ newCanvas.width = viewport.width;
+ newCanvas.height = viewport.height;
+
+ await thePage.render({
+ canvasContext: offctx,
+ viewport: viewport
+ });
+ }
+
+ public static trimBuffer() : void {
+
+ // Call this periodically, like after making a series of calls to
+ // render(), to remove excess canvases from the buffer arrays.
+ // Due to the risk of race conditions -- which I think is minimal --
+ // it's best not to call this until reaching a point at which it
+ // doesn't matter if *all* the offscreen canvases are deleted (although
+ // that outcome would be inefficient). The unlikely possiblitity of
+ // problems due to race conditions is why this is not part of render().
+ let ctot = 0;
+ for (let i = 0; i < PDFDocument.numberOfPages; i++)
+ {
+ if (PDFDocument.theCanvases[i] !== null)
+ ++ctot;
+ }
+
+ // Delete excess offscreen canvases.
+ while (ctot > PDFDocument.pageBufSize)
+ {
+ PDFDocument.removeOldestPage();
+ --ctot;
+ }
+ }
+
+ private static removeOldestPage() : void {
+
+ // Remove the oldest single canvas from this.theCanvases.
+ let oldestIndex = -1;
+ let oldestAge = this.pageAge[0];
+ for (let i = 0; i < this.numberOfPages; i++)
+ {
+ if (this.theCanvases[i] === null)
+ continue;
+
+ if (this.pageAge[i] < oldestAge)
+ {
+ oldestAge= this.pageAge[i];
+ oldestIndex = i;
+ }
+ }
+ this.theCanvases[oldestIndex] = null;
+ }
+
+ public static flushBuffer() : void {
+
+ // Removes all offscreen canvases in the buffer. This is needed, e.g.,
+ // when resizing so that you don't use a canvas of the wrong scale.
+ for (let i = 0; i < this.numberOfPages; i++)
+ this.theCanvases[i] = null;
+ }
+}
+
+
+// A class for scheduling event handling.
+//
+// Everything is static because there is only one of these for all events.
+// It is used to mediate the event loop so that everything happens
+// syncrhonously, even when async functions are involved. It is used for
+// things like scroll and mouse-down events; it is also used for animations,
+// which are created by certain widgets.
+//
+// The idea is that you call getID() to get your ticket (like at the
+// butcher's). Then call await waitMyTurn() until the butcher is ready.
+// The 'await' is crucial! Then call allDone() to thank the butcher and
+// leave so that he can take the next customer.
+//
+// For this to work properly, calls to getID() must be made outside
+// of async functions. Otherwise the IDs could get out of order.
+//
+// BUG: I could use this in a DRY-er way. Define a method called
+// getInLine() that takes the function to be invoked. Have getInLine()
+// call getID(), waitMyTurn(), run the job, then call allDone().
+//
+// BUG: It may be that someone who is more expert in JS could use
+// Promises somehow to make this scheme unnecessary. OTOH, this may
+// be easier to understand and use than something more clever.
+class Events {
+
+ // A count of events that have come in. Each event gets its own unique
+ // ID by calling getID().
+ private static count : number = 0;
+
+ // The ID number of the event whose handling was most recently completed.
+ private static complete : number = -1;
+
+ public static getID() {
+ let answer = this.count;
+ this.count++;
+ return answer;
+ }
+
+ public static async waitMyTurn(id : number) {
+ while (id !== Events.complete + 1)
+ await sleep(5);
+ }
+
+ public static allDone(id : number) {
+ Events.complete = id;
+ }
+}
+
+
+async function doOpenDocument(latexName : string , scrollPos : number ) {
+
+ // Called when the body of the page loads (onload).
+ // latexName is the base of the name of the pdf. Thus, latexName.pdf
+ // is what is to be opened. The scrollPos value is the position on the
+ // page. This is provided by doBeforeUnload(), noted by the server, and
+ // given back in the course of the reload.
+
+ // The "Get TikZ" button is fixed, and it is always on top.
+ // PUBLIC FACING: Comment this block of code out when running serving from a
+ // public-facing website. There's no reason to provide this "Get TikZ" button
+ // and the server won't now how to handle the resulting messages.
+
+ let fmenu = document.createElement("button");
+ fmenu.style.position = "fixed";
+ fmenu.style.display = "block";
+ fmenu.style.left = "0px";
+ fmenu.style.top = "0px";
+ fmenu.style.width = "80px";
+ fmenu.style.height = "18px";
+ fmenu.style.fontSize = "10px";
+ fmenu.textContent = "Get TikZ";
+ fmenu.style.zIndex = "99";
+ fmenu.onclick = doTikzClick;
+ document.body.appendChild(fmenu);
+
+
+ let theCanvas = <HTMLCanvasElement> document.getElementById("pdf_renderer")!;
+ theCanvas.style.position = "fixed";
+
+ // It might happen that the program starts with some level of zoom.
+ PDFDocument.setZoom(window.devicePixelRatio);
+
+ // So that the canvas exactly fills the window.
+ adjustCanvas();
+
+ // Mouse events are registered on the canvas rather than the document
+ // (as is done for resize and scroll), but I'm not sure there's any
+ // practical difference since the canvas is the whole document.
+ // Note that this does *not* listen for onclick events. In a few cases,
+ // they might be a more natural choice (like for buttons), but they make
+ // things like coloring a "halfway clicked" widget difficult.
+ // Note that this does not distinguish between left, right and middle
+ // buttons; a click is a click.
+ // Also, the mouseup listener is registered on the window, not the canvas,
+ // so that we hear about mouse-ups even when they happen outside the
+ // browswer window entirely.
+ theCanvas.addEventListener("mousedown",doMouseDown);
+ theCanvas.addEventListener("mousemove",doMouseMove);
+ theCanvas.addEventListener("mouseup",doMouseUp);
+
+ // I considered registering listeners for mouseenter/mouseleave, but
+ // they're not needed.
+
+ /*
+ BUG: I have not tested this much on touch devices. Everything
+ works fine on some phones, but not on others. It's a hard to imagine
+ people trying to use this on a phone, but I should test on things
+ like iPads.
+ theCanvas.addEventListener("touchstart",doTouchDown);
+ theCanvas.addEventListener("touchend",doTouchUp);
+ theCanvas.addEventListener("touchmove",doTouchMove);
+ */
+
+ // Open the pdf and digest figures.aux.
+ await getDocumentData(latexName);
+
+ // Create the various Panel objects that make up the document as a whole.
+ // This does the "page layout."
+ FullPanel.init(PDFDocument.pageSpecs);
+
+ // Now that page layout is done, set the range for the scroll bars on
+ // the browswer window.
+ adjustScrollBars();
+
+ // When reloading, we don't want things to move back to the top of
+ // the first page.
+ window.scrollTo(0 , scrollPos);
+
+ // Render for the very first time.
+ fullRender();
+}
+
+async function getDocumentData(latexName : string) {
+
+ // This opens and digests the data files and the pdf itself.
+ let thePDF : LoadedPDF = await pdfjsLib.getDocument(latexName+ '.pdf');
+ await PDFDocument.setPDF(thePDF);
+
+ // Open and digest figures.aux.
+ let fname = latexName + ".fig.aux";
+
+ // fetch() is the new XMLHttpRequest(), which has been deprecated.
+ // Thanks to Dan Pratt for pointing that out.
+ let fetchPromise = await fetch(fname);
+ let allText = await fetchPromise.text();
+ await getFigureInfo(allText);
+}
+
+async function syncLoad(scriptName : string) {
+
+ // Load the script with the given name and append to the DOM, and
+ // don't return until the load is complete. So this should typically
+ // be called with 'await'.
+ //
+ // Thanks to Dan Pratt for this tidy solution. This works because the
+ // promise can't resolve (either way) until appendChild() completes
+ // because you can't resolve or reject until the code is loaded
+ // or fails to load. Note that the 'once' argument means that the function
+ // is called once, then flushed. That's exactly what I want so that they
+ // don't hang around and consume resources.
+ let theCode = document.createElement("script");
+ theCode.type = "application/javascript";
+ theCode.src = scriptName;
+
+ var p = new Promise((resolve, reject) => {
+ theCode.addEventListener("load", resolve, { once: true});
+ theCode.addEventListener("error", reject, { once: true});
+ });
+
+ document.body.appendChild(theCode);
+
+ await p;
+}
+
+async function getFigureInfo(textBody : string) {
+
+ // textBody is the complete contents of the .aux file. Parse it and
+ // use the data to fill in PDFDocument.PageSpecs.
+ let lines = textBody.split('\n');
+
+ for (let i = 0; i < lines.length; i++)
+ {
+ if (lines[i].length < 2)
+ // Last line might be blank.
+ break;
+
+ var parts = lines[i].split(' ');
+
+ if (parts[0] === "load")
+ {
+ // Load a single .js file and move on.
+ await syncLoad(parts[1]);
+ continue;
+ }
+
+ var pnum = parseInt(parts[0]);
+ var innerMargin = parseFloat(parts[1]);
+ var outerMargin = parseFloat(parts[2]);
+ var textWidth = parseFloat(parts[3]);
+ var vpos = parseFloat(parts[4]);
+ var hLatex = parseFloat(parts[5]);
+ var hAbove = parseFloat(parts[6]);
+ var hBelow = parseFloat(parts[7]);
+ var name : string = parts[8];
+
+ // Careful: JS weirdness means that Boolean(parts[9]) is ALWAYS true
+ // (unless parts[9] is empty).
+ var done : boolean = (parts[9] === 'true');
+ var externLoad : boolean = (parts[10] === 'true');
+
+ // Page numbers should start at zero (not 1 as reported by latex).
+ pnum -= 1;
+
+ // Load the JS now, if necessary.
+ // NOTE: In earlier versions, up to v23, I looked to either a
+ // .js file or an .fjs file. Individual files are now assumed
+ // to be .fjs files. This is much simpler.
+ if (externLoad === true)
+ await syncLoad(name + ".fjs");
+
+ // NOTE: This assumes that the relevant function has been loaded,
+ // perhaps as an external file from \LoadFigureCode.
+ let augFcn : AugmentedDrawingFunction = getAugmentedFunction( name );
+ if (typeof augFcn === "undefined")
+ alert(name + " not found. Is the function name correct?");
+
+ // Note this for the future.
+ augFcn.figurePanelClass = null;
+ PDFDocument.pageSpecs[pnum].drawFcn.push(augFcn);
+
+ // Copy the remaining fields over.
+
+ // Adjust the vertical position to be given relative to the top
+ // of the page, rather than the bottom.
+ vpos = PDFDocument.pageSpecs[pnum].pageHeight - vpos;
+
+ // If there are multiple figures on a particular page, then this
+ // is redundant, but harmless.
+ if (pnum % 2 === 0)
+ {
+ PDFDocument.pageSpecs[pnum].leftMargin = innerMargin;
+ PDFDocument.pageSpecs[pnum].rightMargin = outerMargin;
+ }
+ else
+ {
+ PDFDocument.pageSpecs[pnum].leftMargin = outerMargin;
+ PDFDocument.pageSpecs[pnum].rightMargin = innerMargin;
+ }
+ PDFDocument.pageSpecs[pnum].textWidth = textWidth;
+
+ // The per-figure data.
+ PDFDocument.pageSpecs[pnum].insertPoint.push(vpos);
+ PDFDocument.pageSpecs[pnum].deleteHeight.push(hLatex);
+ PDFDocument.pageSpecs[pnum].aboveHeight.push(hAbove);
+ PDFDocument.pageSpecs[pnum].belowHeight.push(hBelow);
+ PDFDocument.pageSpecs[pnum].name.push(name);
+ PDFDocument.pageSpecs[pnum].done.push(done);
+ }
+
+ // Make sure that all the figure names are distinct.
+ for (let i = 0; i < PDFDocument.numberOfPages; i++)
+ {
+ // Loop over each figure on the current page.
+ for (let fig = 0; fig < PDFDocument.pageSpecs[i].name.length; fig++)
+ {
+ let curName = PDFDocument.pageSpecs[i].name[fig];
+
+ // See if this name matches a name on any other page/figure.
+ // Consider the current page first.
+ for (let subfig = fig + 1; subfig < PDFDocument.pageSpecs[i].name.length; subfig++)
+ {
+ if (curName === PDFDocument.pageSpecs[i].name[subfig])
+ {
+ alert("The figure name " +curName+ " is used more than once.");
+ throw new Error();
+ }
+ }
+
+ // Continue with all the remaining pages.
+ for (let j = i + 1; j < PDFDocument.numberOfPages; j++)
+ {
+ for (let subfig = 0; subfig < PDFDocument.pageSpecs[j].name.length; subfig++)
+ {
+ if (curName === PDFDocument.pageSpecs[j].name[subfig])
+ {
+ alert("The figure name " +curName+ " is used more than once.");
+ throw new Error();
+ }
+ }
+ }
+ }
+ }
+}
+
+function adjustScrollBars() : void {
+
+ // Based on the page size and document length, adjust the range of the
+ // browswer's scroll bars.
+ var body = <HTMLElement> document.getElementById("mainbody");
+
+ // I don't see any way to set the range of the scroll bar directly, so
+ // I'm fooling the browser to think that it has a body of a certain
+ // height, in px, when the body is really no bigger than the visible
+ // area of the window. What I want is a height such that, when the scroll
+ // bar is at the bottom, the lower edge of the last page is barely visible
+ // in the bottom of the window.
+ //
+ // There was some mental debate about whether it's better to let the
+ // bottom of the last page scroll up beyond the bottom of the window, but
+ // this is easier to program, and it's probably more natural for most people.
+ let totHeight = FullPanel.totalHeight();
+ let visHeight = document.documentElement.clientHeight;
+ body.style.height = totHeight + "px";
+
+ // The horizontal scroll bar is expressed in terms of pdf pts. This is
+ // simpler than above since I don't want to be able to scroll so that the
+ // right edge of the document is barely off the window; I want to be able
+ // to scroll just far enough so that the right edge of the document meets
+ // the right edge of the window. The size of the window becomes irrelevant
+ // (i.e., the browser deals with it).
+ // However, we do need to know whether a scroll bar is needed at all,
+ // so we can't totally ignore the visible width.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+
+ if (visWidth > totWidth)
+ {
+ // No need for horizontal scroll. It seems like "0px" works, but "0 px"
+ // does not. Maybe the space causes a (silent) parse error?
+ body.style.width = "0px";
+ return;
+ }
+
+ body.style.width = totWidth + "px";
+}
+
+function ctxTopLevelAdjust( ) : CanvasRenderingContext2D {
+
+ // Each function should call this before doing any drawing.
+ // Rendering is done relative to the ctx (obviously) with the t-matrix
+ // adjusted accordingly. This brings the t-matrix from being the
+ // identity to being relative to the entire document.
+ //
+ // In earlier versions, the ctx was being passed around and adjusted
+ // as the layout manager descended to a particular portion of the document.
+ // In some ways that is the cleaner and more modular way to do things,
+ // but it can be confusing because the adjustments to the t-matrix aren't
+ // done in a central place.
+ var canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+ let ctx : CanvasRenderingContext2D = canvas.getContext('2d') ! ;
+
+ ctx.resetTransform();
+
+ // Center the document. Rather than mess with CSS to center the canvas,
+ // leave the canvas at the size of the entire window, and shift the origin
+ // so the document is rendered in the center of the canvas.
+ //
+ // However, if the window is smaller than the document, then we do
+ // NOT want to center the document. If we did center it, then it would
+ // be impossible to scroll over to the left since we can't have "negative
+ // scroll;" window.scrollX is always non-negative (unfortunately).
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let z = PDFDocument.getZoom();
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ docCenter *= PDFDocument.getZoom();
+
+ ctx.translate(canvasCenter - docCenter,0);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar, leaving the document
+ // against the left edge. Note the scaling by the zoom factor so
+ // as to be consistent with the above.
+ ctx.translate(-window.scrollX * PDFDocument.getZoom(),0);
+ }
+
+ return ctx;
+}
+
+async function fullRender() {
+
+ // Render all the pages of the pdf, together with the figures.
+ var canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+
+ // This shouldn't be necessary, but do it as a fail-safe.
+ var ctx = <CanvasRenderingContext2D> canvas.getContext('2d');
+ ctx.resetTransform();
+
+ let visWidth = document.documentElement.clientWidth;
+
+ let z = PDFDocument.getZoom();
+
+ // BUG: Could lead to flicker? It is necessary to clear everything
+ // because widgets could be drawn outside the page. I suppose that I could
+ // only erase the area outside the pages, which would reduce any flicker.
+ // I really don't want to double-buffer everything if it can be avoided.
+ // It may be the only solution. The problem is that, if a widget extends
+ // outside the page, and is animated (like LoopAnimWidget) so that it's
+ // drawn as part of an animation, then you must erase the entire page to
+ // avoid "leftovers," and *that* requires that you redraw the entire
+ // document (or what is visible) with every frame of an animation.
+ //
+ // BUG: So the correct solution is double-buffering everything, but I don't
+ // feel that it's pressing. For now, either restrict any widgets to
+ // draw within a page or accept that it might leave spoogey leftovers.
+ ctx.clearRect(0,0,visWidth*z,document.documentElement.clientHeight*z);
+
+ await FullPanel.renderAll(canvas.height);
+}
+
+function adjustCanvas() : void {
+
+ // Call when the window has been zoomed or re-sized.
+ //
+ // canvas has two different dimensions: canvas.style.width and height, and
+ // canvas.width and height. The style values determine the size of the canvas
+ // on the screen -- so-called ""CSS styling." The straight values (no style)
+ // are the number of px in the canvas. By keeping the style values constant and
+ // varying the straight values, you can have more or less resolution for the
+ // canvas, EVEN WHEN ZOOMED IN.
+ //
+ // The bottom line is that if we adjust the straight pixel sizes, then
+ // we can always have one px for every physical pixel -- up to the accuracy
+ // of window.devicePixelRatio.
+ //
+ // BUG: Check for things with super high pixel density, like phones. I
+ // think the devicePixelRatio is somehow wrong for those. It may not matter.
+ var canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer") ;
+
+ // Adjust the visible width to match the window size.
+ //
+ // NOTE: For debugging, it can be helpful to subtract off a bit from these
+ // values, like 1, 10 or 50, depending. In earlier versions, there was
+ // also a bit of CSS in the html that put a visible rectangle around the canvas.
+ //canvas.style.width = (document.documentElement.clientWidth - 50) + "px";
+ //canvas.style.height = (document.documentElement.clientHeight - 50) + "px";
+ canvas.style.width = document.documentElement.clientWidth + "px";
+ canvas.style.height = document.documentElement.clientHeight + "px";
+
+ // The visible width of the canvas has just been fixed. Now change the
+ // number of px so that the number of px per inch on the screen varies with
+ // the level of browser zoom. There seems to be no means of direct access
+ // to the phyical pixels of the monitor, but this is close, and may be
+ // exactly equivalent in many situations.
+ canvas.width = document.documentElement.clientWidth * window.devicePixelRatio;
+ canvas.height = document.documentElement.clientHeight * window.devicePixelRatio;
+}
+
+async function doScrollGuts(id : number) {
+
+ // Wait for any active event handler to finish and then wait until it is
+ // the turn of current id to run.
+ await Events.waitMyTurn(id);
+
+ await fullRender();
+
+ // Give your ticket to the butcher so that he can take the next customer.
+ Events.allDone(id);
+}
+
+function doScroll() : void {
+
+ // Scroll events are registered below to call this function.
+ // It redraws the contents of the main canvas.
+
+ // This appears to be called when the page is opened, before almost
+ // anything else, so return until page initialization is complete.
+ if (PDFDocument.isLoaded() == false)
+ return;
+
+ // Get a unique ID for this event.
+ // This must be done outside any async function to ensure proper order.
+ let id = Events.getID();
+
+ doScrollGuts(id);
+}
+
+async function doResizeGuts(id : number) {
+
+ // As with scrolling, wait for any earlier event handler to complete.
+ await Events.waitMyTurn(id);
+
+ // None of the buffered offscreen canvases are valid anymore.
+ // In theory, I could test for whether this was merely a window
+ // resize and not a zoom, but it's not worth fooling with.
+ PDFDocument.flushBuffer();
+
+ console.log("ratio: " + window.devicePixelRatio);
+
+ // The other thing that needs to be adjusted is the zoom level
+ // used when rendering the pdfs.
+ adjustCanvas();
+
+ // Here is the magic. Effectively, this value is now the level of zoom.
+ // If you take out this line, and leave PDFDocument.zoom always equal to
+ // default value of 1, then zooming does nothing, although the mismatch
+ // between the resolution of the off-screen canvas and the resolution on
+ // the screen can make things blurry or blocky.
+ PDFDocument.setZoom(window.devicePixelRatio);
+
+ // If the size of the window changed, then this needs to be adjusted too.
+ // This must be done after adjustCanvas().
+ adjustScrollBars();
+
+ // Render the pages too.
+ await fullRender();
+
+ // Final bit of scheduling magic.
+ Events.allDone(id);
+}
+
+function doResize() : void {
+
+ // This is called whenever the user zooms and also if the
+ // entire broswer window is resized.
+ let id = Events.getID();
+ doResizeGuts(id);
+}
+
+async function mouseDownGuts(id : number , x : number , y : number ) {
+
+ // (x,y) is the location of the mouse click, in pdf points, but
+ // relative to the window.
+ await Events.waitMyTurn(id);
+
+ // Just as we have to tweak the t-matrix to determine where to draw things,
+ // we need to do something similar to figure out where (x,y) is on the page.
+ // The difference is that the ctx.translate() operations become adjustments
+ // to x and y.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+
+ x = x - (canvasCenter - docCenter);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+
+ FullPanel.mouseDown(x,y);
+
+ // Don't forget!
+ Events.allDone(id);
+}
+
+function doMouseDown(e : MouseEvent) : void {
+
+ // This is an event like any other, so the usual scheduling rigmarole.
+ let id = Events.getID();
+ mouseDownGuts(id,e.x,e.y);
+}
+
+async function mouseMoveGuts(id : number , x : number , y : number ) {
+
+ // As above.
+ // BUG: Common code. Not DRY.
+ await Events.waitMyTurn(id);
+
+ // As for mouse-down.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+
+ x = x - (canvasCenter - docCenter);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+ FullPanel.mouseMove(x,y);
+
+ // Don't forget!
+ Events.allDone(id);
+}
+
+function doMouseMove(e : MouseEvent) :void {
+
+ // As above.
+ let id = Events.getID();
+ mouseMoveGuts(id,e.x,e.y);
+}
+
+async function mouseUpGuts(id : number , x : number , y : number ) {
+
+ // As above.
+ // BUG: Common code. Not DRY.
+ await Events.waitMyTurn(id);
+
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+
+ x = x - (canvasCenter - docCenter);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+ FullPanel.mouseUp(x,y);
+
+ // Don't forget!
+ Events.allDone(id);
+}
+
+function doMouseUp(e : MouseEvent ) : void {
+
+ // As above.
+ let id = Events.getID();
+ mouseUpGuts(id,e.x,e.y);
+}
+
+function doTikzClick() : void {
+
+ // Tikz button was clicked. Generate output file(s).
+ //
+ // Cycle over every figure and let it generate tikz data.
+ for (let pi = 0; pi < PDFDocument.pageSpecs.length; pi++)
+ {
+ let pd = PDFDocument.pageSpecs[pi] !;
+ if (pd.name.length === 0)
+ // No figures on this page.
+ continue;
+
+ for (let fi = 0; fi < pd.name.length; fi++)
+ {
+ if (pd.done[fi] == true)
+ // User said to skip this one.
+ continue;
+
+ let theFcn : AugmentedDrawingFunction = pd.drawFcn[fi];
+
+ if (theFcn.figurePanelClass === null)
+ // Hasn't been loaded, because was never visible.
+ continue;
+
+ let ctx = new CTX(pd.name[fi]);
+ theFcn(ctx);
+ ctx.close();
+ }
+ }
+}
+
+
+function doBeforeUnload(e : Event) {
+
+ // This is *very* non-standard. Pass a made-up WHERE message with the position
+ // on the document.
+ // BUG: This only informs the server of the vertical scroll position.
+ // Dealing with horizontal scroll would be more painful. See fullRender()
+ // and adjustScrollBars().
+ // If *everything* were double-buffered, then this would be a bit easier.
+ let req = new XMLHttpRequest();
+
+ // We don't care about the second argument. In a POST this would be
+ // something like a file name. The third argument, 'false', forces the request
+ // to be handled synchronously. If it's done async, then the unload proceeds
+ // and completes before this task finishes.
+ req.open("WHERE","bogus", false );
+
+ req.setRequestHeader("Content-Type","text/plain;charset=UTF-8");
+
+ // Send the postion as the message. It could probaby be sent instead of
+ // 'bogus' above, and this could be blank.
+ let msg = window.scrollY.toString();
+
+ // BUG: Firefox generates "Uncaught DOMException: A network error occurred."
+ // on this. It might be that XMLHttpRequest is deprecated?
+ req.send(msg);
+}
+
+// Register additional event handlers. The main (and only) canvas had
+// listeners registered for mouse events in doOpenDocument().
+document.addEventListener('scroll',doScroll);
+window.addEventListener('resize', doResize);
+
+// PUBLIC FACING: Comment this out. It's doing something *very* non-standard,
+// and any normal web-server will choke on it.
+window.addEventListener('beforeunload',doBeforeUnload);
+
diff --git a/graphics/figput/javascript/development/tikz.ts b/graphics/figput/javascript/development/tikz.ts
new file mode 100644
index 0000000000..f66395b70a
--- /dev/null
+++ b/graphics/figput/javascript/development/tikz.ts
@@ -0,0 +1,1419 @@
+/*
+Code necessary to output tikz for figures. It spoofs the normal canvas
+drawing code so that the output comes here, and is then converted to
+tizk output.
+
+One problem with JS is that there is no path interator. You can't obtain
+the segments that make up an entire path. I don't see any way around this
+other than writing my own wrapper around Path2D. It might be possible to
+somehow hack the internals of Path2D, but that would be brittle, even if
+it works.
+
+BUG: The long-term solution is to eliminate use of the JS Path2D class,
+but it's not possible to entirely eliminate it since it's the only way to
+draw to the browser window. What I *could* do is sub-class
+CanvasRenderingContext2D so that this sub-class take my own path class
+objects and converts them to Path2D for drawing. Another hurdle is
+isPointInPath(), which is used in a few places. I could provide a separate
+implementation of that, but it's fiddly. isPointInStroke() is a bit harder.
+
+BUG: It's tempting to come up with a framework under which a "path"
+is closer to our intuition of something that can be drawn as a continuous
+thing, without lifting your pencil. Then, have a second-order thing that
+may hold several of these continuous paths. Intuitively one wants a "path"
+to have a clear start-point and end-point, but you also need to be able
+to handle things like winding number for multiple paths when filling.
+
+BUG: There are many cases where you might want the online version to be
+different from what is printed. I just gave the example of filling a path,
+and color is similar. There's lots of things that might make sense on a
+computer screen, but wouldn't work well on printed paper.
+
+*/
+
+
+// Turns out that Point used to be part of js, but was deprecated, and
+// seems not to exist any longer.
+
+class Point2D {
+
+ private _x : number;
+ private _y : number;
+
+ constructor(x : number,y : number) {
+ this._x = x;
+ this._y = y;
+ }
+
+ public toString() : string {
+
+ // May be handy for debugging.
+ return "( " + this._x.toFixed(2) + "," + this._y.toFixed(2) + ")";
+ }
+
+ public get x() : number {
+ return this._x;
+ }
+
+ public get y() : number {
+ return this._y;
+ }
+
+ public copy() : Point2D {
+ return new Point2D( this._x , this._y );
+ }
+
+ public negate() : Point2D {
+ // return -this.
+ return new Point2D(-this._x,-this.y);
+ }
+
+ public negateSelf() : void {
+
+ this._x = -this.x;
+ this._y = -this.y;
+ }
+
+ public minus(p : Point2D) : Point2D {
+
+ // return this - p. Redunant since it's just a form of translation.
+ return new Point2D( this._x - p.x , this._y - p.y );
+ }
+
+ public minusSelf(p : Point2D) : void {
+
+ this._x -= p._x;
+ this._y -= p._y;
+ }
+
+ public translate2(u : number, v : number) : Point2D {
+ return new Point2D( u + this._x , v + this._y );
+ }
+
+ public translate(p : Point2D) : Point2D {
+ return new Point2D( p.x + this._x , p.y + this._y );
+ }
+
+ public translateSelf2(u : number, v : number) : void {
+
+ this._x += u;
+ this._y += v;
+ }
+
+ public translateSelf(p : Point2D) : void {
+
+ this._x += p.x;
+ this._y += p.y;
+ }
+
+ public scale(s : number) : Point2D {
+ return new Point2D( s * this._x , s * this._y );
+ }
+
+ public scaleSelf(s : number) : void {
+
+ // As above, but it's done in-place rather than returning a copy.
+ this._x *= s
+ this._y *= s;
+ }
+
+ public rotate(theta : number) : Point2D {
+
+ // Apply rotation matrix in the usual (RH) way. theta in radians.
+ let c = Math.cos(theta);
+ let s = Math.sin(theta);
+ return new Point2D (
+ c * this._x - s * this._y ,
+ s * this._x + c * this._y
+ );
+ }
+
+ public rotateSelf(theta : number) : void {
+
+ let c = Math.cos(theta);
+ let s = Math.sin(theta);
+
+ let u = c * this._x - s * this._y ;
+ let v = s * this._x + c * this._y ;
+
+ this._x = u;
+ this._y = v;
+ }
+
+ public rotateAbout(c : Point2D , theta : number ) : Point2D {
+
+ // Rotate this about c by angle theta, returning the result.
+ let answer = new Point2D(this.x - c.x , this.y - c.y );
+ answer = answer.rotate( theta );
+ answer._x += c.x;
+ answer._y += c.y;
+ return answer;
+ }
+
+ public dot(a : Point2D) : number {
+
+ // Return this dot a.
+ return a.x * this._x + a.y * this._y;
+ }
+
+ public length() : number {
+ return Math.sqrt(this._x**2 + this._y**2);
+ }
+
+ public static dot(a: Point2D , b : Point2D) : number {
+ // This looks like Java-style overloading, but it's not. One dot()
+ // is static and the other is not.
+ return a.dot(b);
+ }
+
+ public angleBetween( a : Point2D ) : number {
+
+ // Return angle between this and a, based on
+ // this dot a = |this| |a| cos angle
+ // This is the angle between the two, without any orientation.
+ let cos = this.dot(a) / (this.length() * a.length() );
+ return Math.acos(cos);
+ }
+
+ public cliffordBetween( a : Point2D) : number {
+
+ // The "clifford angle," which is like angleBetween(), but it takes
+ // orientation into account. The angle is given relative to ("from") this.
+ return Math.atan2( this.x * a.y - a.x * this.y ,
+ this.x * a.x + this.y * a.y );
+ }
+}
+
+// Used for a function of the form f(t) = ( x(t) , y(t) ).
+type Parametric2DFunction = (t : number) => Point2D;
+
+// BUG: Really, these should be based on Point2D. E.g., bezier should be three Point2D objects.
+type CloseSegment = {};
+
+type MoveToSegment = {
+ x : number;
+ y : number;
+}
+
+type LineToSegment = {
+ x : number;
+ y : number;
+}
+
+type BezierToSegment = {
+ cx1 : number;
+ cy1 : number;
+ cx2 : number;
+ cy2 : number;
+ x : number;
+ y : number;
+}
+
+type QuadToSegment = {
+ cx : number;
+ cy : number;
+ x : number;
+ y : number;
+}
+
+type ArcSegment = {
+ x : number;
+ y : number;
+ r : number;
+ a0 : number;
+ a1 : number;
+ ccw : boolean;
+}
+
+type ArcToSegment = {
+ x1 : number;
+ y1 : number;
+ x2 : number;
+ y2 : number;
+ r : number;
+}
+
+type EllipseSegment = {
+ x : number;
+ y : number;
+ rx : number;
+ ry : number;
+ rot : number;
+ a0 : number;
+ a1 : number;
+ ccw : boolean;
+}
+
+type RectSegment = {
+ x : number;
+ y : number;
+ w : number;
+ h : number;
+}
+
+type SegmentData = CloseSegment | MoveToSegment | LineToSegment | BezierToSegment |
+ ArcSegment | ArcToSegment | EllipseSegment | RectSegment;
+
+
+// Almost everything here is static because this is essentially a factory for the
+// various segment types.
+
+class PathSegment {
+
+ // The various kinds of segment.
+ // I'm being sloppy about typing here since the use is uncomplicated and
+ // private. Some kind of enumerated type would be better in the abstract.
+
+ // BUG: I should get rid of anything after the QUADRATIC type. The
+ // mathematically clean way to do this is to convert *everything* to beziers,
+ // including ellipses. In fact (?) is a quadratic just a cubic where the
+ // control points coincide? If so, I could get rid of QUADRATIC too.
+ static readonly MOVE_TO = 1;
+ static readonly LINE_TO = 2;
+ static readonly BEZIER = 3;
+ static readonly QUADRATIC = 4;
+ static readonly ARC = 5;
+ static readonly ARC_TO = 6;
+ static readonly ELLIPSE = 7;
+ static readonly RECT = 8;
+ static readonly CLOSE = 9;
+ static readonly UNKNOWN = -1
+
+ // One of the values above.
+ public type = PathSegment.UNKNOWN;
+
+ // The relevant data.
+ // BUG: change variable name to seg.
+ s : SegmentData;
+
+ private constructor(kind : number , d : SegmentData) {
+ this.type = kind;
+ this.s = d;
+ }
+
+ static getClose() : PathSegment {
+ let d : CloseSegment = {};
+ return new PathSegment(PathSegment.CLOSE,d);
+ }
+
+ static getMoveTo(x : number , y : number ) : PathSegment {
+ let d : MoveToSegment = { x : x , y : y };
+ return new PathSegment(PathSegment.MOVE_TO,d);
+ }
+
+ static getLineTo( x : number, y : number ) : PathSegment {
+ let d : LineToSegment = {x : x , y : y }
+ return new PathSegment(PathSegment.LINE_TO,d);
+ }
+
+ static getBezier(cx1 : number , cy1 : number , cx2 : number , cy2 : number ,
+ x : number , y : number ) : PathSegment {
+ let d : BezierToSegment =
+ {cx1 : cx1 , cy1 : cy1 , cx2 : cx2 , cy2 : cy2 , x : x , y : y};
+ return new PathSegment(PathSegment.BEZIER, d );
+ }
+
+ static getQuadratic(cx : number , cy : number , x : number , y : number ) : PathSegment {
+ let d : QuadToSegment = { cx : cx , cy : cy , x : x , y : y };
+ return new PathSegment(PathSegment.QUADRATIC , d );
+ }
+
+ static getArc(x : number , y : number , r : number , a0 : number , a1 : number ,
+ ccw : boolean) : PathSegment {
+ let d : ArcSegment = { x : x , y : y , r : r , a0 : a0 , a1 : a1 , ccw : ccw };
+ return new PathSegment(PathSegment.ARC , d );
+ }
+
+ static getArcTo(x1 : number , y1 : number , x2 : number , y2 : number ,
+ r : number ) : PathSegment {
+ let d : ArcToSegment = { x1 : x1 , y1 : y1 , x2 : x2 , y2 : y2 , r : r };
+ return new PathSegment(PathSegment.ARC_TO , d );
+ }
+
+ static getEllipse(x : number , y : number , rx : number , ry : number , rot : number ,
+ a0 : number , a1 : number , ccw : boolean ) : PathSegment {
+ // BUG: If I convert everything to bezier, then many of these static
+ // methods can be eliminated.
+ // YES. THIS IS A BAD IDEA IN EVERY WAY. ONLY BEZIER CURVES SHOULD
+ // BE ALLOWED INTERNALLY.
+ // OTOH, there are certain shapes, like an ellipse or rectangle, that
+ // should be treated as a single unitary thing.
+ // What I should probably do is sub-class FPath for these. Interally, they
+ // can be represented as a messy bezier thing, but that would be hidden from the user.
+ // At the same time, one might want to add an ellipse or rect to an existing path to
+ // obtain various fill effects. So, the ellipse sub-class will need something like
+ // a toFPath() method so that it can be added to a normal FPath.
+ let d : EllipseSegment = { x : x , y : y , rx : rx , ry : ry , rot : rot , a0 : a0 ,
+ a1 : a1 , ccw : ccw };
+ return new PathSegment(PathSegment.ELLIPSE , d );
+ }
+
+ static getRect(x : number , y : number , w : number , h : number ) : PathSegment {
+ let d : RectSegment = { x : x , y : y , w : w , h : h };
+ return new PathSegment(PathSegment.RECT , d );
+ }
+
+}
+
+
+// BUG: Add some flags so that things could be drawn or not drawn based
+// on whether the output is going to tikz or to the screen.
+
+class FPath extends Path2D {
+
+ // An array of PathSegments.
+ segs : PathSegment[] = [];
+
+
+ constructor() {
+ super();
+ }
+
+ addPath(p : FPath ) : void {
+
+ // Append the elements of p to this.
+ for (let i = 0; i < p.segs.length; i++)
+ this.segs.push(p.segs[i]);
+ }
+
+ closePath () : void {
+ super.closePath();
+ this.segs.push(PathSegment.getClose());
+ }
+
+ moveTo(x : number , y : number) : void {
+ super.moveTo(x,y);
+ this.segs.push(PathSegment.getMoveTo(x,y));
+ }
+
+ frontLineTo(x : number , y : number ) : void {
+
+ // To tack a line segment to the *begining* of an existing path.
+ // This assumes that segs[0] is a moveTo() -- as I think (?) it must be
+ // in any reasonable case.
+ // So, you start with a path that looks like
+ // moveTo(a,b) ...whatever
+ // and it becomes
+ // moveTo(x,y) lineTo(a,b) ...whatever.
+ // You're basically drawing as usual, but "from the wrong end."
+ let s = this.segs[0];
+ if (s.type != PathSegment.MOVE_TO)
+ console.log("ERROR: frontLineTo() doesn't start with moveTo(): " +s.type);
+
+ let newfirst = PathSegment.getMoveTo(x,y);
+
+ // Convert the initial moveto to a lineto.
+ // In fact, this is sort of pointless, and is only done this way to respect
+ // the type-checker. It's (x,y) whether it's a lineto or a moveto.
+ let m = <MoveToSegment> s.s;
+ let newsecond = PathSegment.getLineTo(m.x,m.y);
+
+ this.segs[0] = newsecond;
+ this.segs.unshift(newfirst);
+ }
+
+ lineTo(x : number , y : number ) : void {
+ super.lineTo(x,y);
+ this.segs.push(PathSegment.getLineTo(x,y));
+ }
+
+ bezierCurveTo(cx1 : number , cy1 : number , cx2 : number , cy2 : number ,
+ x : number , y : number ) : void {
+ super.bezierCurveTo(cx1,cy1,cx2,cy2,x,y);
+ this.segs.push(PathSegment.getBezier(cx1,cy1,cx2,cy2,x,y));
+ }
+
+ quadraticCurveTo(cx : number , cy : number , x : number , y : number ) : void {
+ super.quadraticCurveTo(cx,cy,x,y);
+ this.segs.push(PathSegment.getQuadratic(cx,cy,x,y));
+ }
+
+ translate(p : Point2D) : FPath {
+
+ // Translate this entire path by the given point.
+
+ // BUG: Not implemented for every possible type of segment.
+
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++)
+ {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ answer.moveTo(m.x + p.x,m.y + p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ let m = <LineToSegment> s.s;
+ answer.lineTo(m.x + p.x,m.y + p.y);
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ let m = <BezierToSegment> s.s;
+ answer.bezierCurveTo( m.cx1 + p.x , m.cy1 + p.y ,
+ m.cx2 + p.x , m.cy2 + p.y , m.x + p.x , m.y + p.y );
+ }
+ else if (s.type == PathSegment.ELLIPSE)
+ {
+ let m = <EllipseSegment> s.s;
+ answer.ellipse(m.x+p.x,m.y+p.y , m.rx, m.ry, m.rot , m.a0 , m.a1 , m.ccw);
+ }
+ else
+ {
+ console.log("whatever translattion you want, it's not done.");
+ }
+ }
+
+ return answer;
+ }
+
+ rotate( a : number ) : FPath {
+
+ // Rotate this entire path about the origin and return the result.
+
+ // BUG: I have only implemented this for bezier curves and lines.
+ // Expanding this probably doesn't make sense until I settle on a
+ // framework to more fully replace Path2D.
+
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++)
+ {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ let p = new Point2D( m.x , m.y ).rotate( a );
+ answer.moveTo(p.x,p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ let m = <LineToSegment> s.s;
+ let p = new Point2D( m.x , m.y ).rotate( a );
+ answer.lineTo(p.x , p.y);
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ let m = <BezierToSegment> s.s;
+ let c1 = new Point2D( m.cx1 , m.cy1 ).rotate( a );
+ let c2 = new Point2D( m.cx2 , m.cy2 ).rotate( a );
+ let e = new Point2D( m.x , m.y ).rotate( a );
+ answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,e.x,e.y);
+ }
+ else
+ {
+ console.log("whatever rotation you want, it's not done.");
+ }
+ }
+
+ return answer;
+ }
+
+ scale( r : number ) : FPath {
+
+ // Scale this entire path about the origin and return the result.
+
+ // BUG: I have only implemented this for bezier curves and lines.
+
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++)
+ {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ let p = new Point2D( r * m.x , r * m.y );
+ answer.moveTo(p.x,p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ let m = <LineToSegment> s.s;
+
+ // BUG:
+ console.log("scale not done for lines");
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ let m = <BezierToSegment> s.s;
+ let c1 = new Point2D( r * m.cx1 , r* m.cy1 );
+ let c2 = new Point2D( r * m.cx2 , r * m.cy2 );
+ let p = new Point2D( r * m.x , r * m.y );
+ answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);
+ }
+ else
+ {
+ console.log("whatever scale you want, it's not done.");
+ }
+ }
+
+ return answer;
+ }
+
+ reflectX() : FPath {
+
+ // Reflect this entire path about the x-axis and return the result.
+
+ // BUG: not implemented for every case.
+
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++)
+ {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ let p = new Point2D( m.x , -m.y );
+ answer.moveTo(p.x,p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ let m = <LineToSegment> s.s;
+ let p = new Point2D( m.x , -m.y);
+ answer.lineTo(p.x,p.y);
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ let m = <BezierToSegment> s.s;
+ let c1 = new Point2D( m.cx1 , -m.cy1 );
+ let c2 = new Point2D( m.cx2 , -m.cy2 );
+ let p = new Point2D( m.x , -m.y );
+ answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);
+ }
+ else if (s.type == PathSegment.ELLIPSE)
+ {
+ let m = <EllipseSegment> s.s;
+ answer.ellipse(m.x,-m.y,m.rx,m.ry,m.rot,m.a0,m.a1,m.ccw);
+ }
+ else
+ {
+ console.log("whatever reflect you want, it's not done.");
+ }
+ }
+
+ return answer;
+ }
+
+ reflectXY() : FPath {
+
+ // Reflect this entire path about the x-axis AND y-axis.
+
+ // BUG: not implemented for every case.
+ // BUG: Also, what about reflectY()?
+
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++)
+ {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ let p = new Point2D( -m.x , -m.y );
+ answer.moveTo(p.x,p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ let m = <LineToSegment> s.s;
+ // BUG:
+ console.log("reflect not done for lines");
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ let m = <BezierToSegment> s.s;
+ let c1 = new Point2D( -m.cx1 , -m.cy1 );
+ let c2 = new Point2D( -m.cx2 , -m.cy2 );
+ let p = new Point2D( -m.x , -m.y );
+ answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);
+ }
+ else
+ {
+ console.log("whatever reflect you want, it's not done.");
+ }
+ }
+
+ return answer;
+ }
+
+ rotateAbout(a : number , p : Point2D ) : FPath {
+
+ // Rotate this entire path about p and return the result.
+ let t1 = this.translate(new Point2D(-p.x,-p.y));
+ let t2 = t1.rotate(a);
+ return t2.translate(p);
+ }
+
+
+ static arcToBezierNEW( r : number , a0 : number , a1 : number ) : FPath {
+
+ // Generate a series of bezier curves to represent an arc. The result
+ // represents an arc of a circle of radius r, centered
+ // at (0,0), going from angle a0 to a1, in radians.
+
+ // Each step should subtend no more than pi/4 radians. Most of the
+ // time pi/2 would be accurate enough, but pi/4 is better, and not that
+ // much extra work.
+ let totalAngle = a1 - a0;
+ if (totalAngle < 0)
+ totalAngle += 2*Math.PI;
+
+ let numCurves = Math.ceil(4 * totalAngle / Math.PI);
+
+ let subtend = totalAngle / numCurves;
+
+ // See the manual for where this comes from. It's the crucial constant
+ // for approximating arcs of circles by cubics.
+ let k = (4/3) * Math.tan(subtend/4);
+
+ // Everything is built out of a single arc for a circle of radius r,
+ // going cw, starting at (1,0) and angle subtend.
+ let s = Math.sin(subtend);
+ let c = Math.cos(subtend);
+
+ let p1 = new Point2D (r,0);
+ let p2 = new Point2D (r,r*k);
+ let p3 = new Point2D (r*(c+k*s),r*(s-k*c));
+ let p4 = new Point2D (r*c,r*s);
+
+ // The arc determined by the p_i above must be rotated to create
+ // a series of sub-arcs to get the total arc we want.
+ let answer = new FPath();
+
+ answer.moveTo(p1.x,p1.y);
+ for (let i = 0; i < numCurves; i++)
+ {
+ answer.bezierCurveTo(p2.x,p2.y,p3.x,p3.y,p4.x,p4.y);
+
+ p2.rotateSelf(subtend);
+ p3.rotateSelf(subtend);
+ p4.rotateSelf(subtend);
+ }
+
+ // Rotate the entire thing so that it starts at a0.
+ answer = answer.rotate(a0);
+
+ return answer;
+ }
+
+ arc(x : number , y : number , r : number , a0 : number , a1 : number , ccw : boolean) : void {
+
+ // BUG: I am pretty sure this isn't right. There are things about
+ // being cw/cww and things like that. It needs to be tested.
+
+ // A circular arc, centered at (x,y) and radius r, from angle
+ // a0 to angle a1 (in radians), going cw or ccw. Like ellipse, this
+ // is basically independent of the surrounding segments. Actually,
+ // the documentation I've found is a little vague on this point,
+ // but it looks like that is how it works.
+ //
+ // Another issue is the fact that these angles, a0 and a1, may
+ // have "extra" multiples of 2pi in them and whether a1>a0.
+ // The first thing this does is reduce the angles to be in [0,2pi).
+ //
+ // The whole cw versus ccw issue amounts to whether you're getting
+ // the "large" arc or the "small" arc. If a1 > a0, then the ccw arc
+ // is the small arc and the cw arc is the large arc. If a1 < a0,
+ // then the ccw arc is the large arc and the cw arc is the small arc.
+ // To untangle this, assume that the arc will be treated ccw, and
+ // swap a1 and a0, if necessary, to make that the case.
+ //
+ // Finally, there's the issue of what cw and ccw mean when in
+ // left or right handed coordinate systems. Ugh.
+ //
+ // See
+ // https://pomax.github.io/bezierinfo/#circles_cubic
+ // for an explanation of the math, which is just HS algrbra.
+ //
+ //
+ // BUG: Seems like this is a special case of an arc of an ellipse.
+
+ if (ccw === undefined)
+ ccw = false;
+
+ // Reduce angles to be in [0,2pi).
+ while (a0 < 0)
+ a0 += 2*Math.PI;
+ while (a1 < 0)
+ a1 += 2*Math.PI;
+
+ while (a0 >= 2*Math.PI)
+ a0 -= 2*Math.PI;
+ while (a1 >= 2*Math.PI)
+ a1 -= 2*Math.PI;
+
+ // If the user asked for cw, then swap the angles so that we only
+ // need to consider the ccw case below.
+ if (ccw === true)
+ {
+ let temp = a1;
+ a1 = a0;
+ a0 = temp;
+ }
+
+ // Get the various arcs for a circle centered at zero.
+ let arcs = FPath.arcToBezierNEW(r,a0,a1);
+
+ // Translate them all by (x,y).
+ arcs = arcs.translate(new Point2D(x,y));
+
+ this.addPath(arcs);
+ }
+
+ ellipse(x : number , y : number , rx : number , ry : number , rot : number ,
+ a0 : number , a1 : number , ccw : boolean) : void {
+
+ // BUG: Long-term, the right thing to do here is convert it (internally)
+ // to a series of bezier curves.
+ if (ccw === undefined)
+ ccw = false;
+ super.ellipse(x,y,rx,ry,rot,a0,a1,ccw);
+ this.segs.push(PathSegment.getEllipse(x,y,rx,ry,rot,a0,a1,ccw));
+ }
+
+ rect(x : number , y : number , w : number , h : number ) : void {
+
+ // BUG: As above, make into a series of line segments. This one is easy.
+ super.rect(x,y,w,h);
+ this.segs.push(PathSegment.getRect(x,y,w,h));
+ }
+
+ static circArcToBezier(r : number , a0 : number , a1 : number ) : FPath {
+
+ // Return a series of n bezier curves for a circle of radius r, extending
+ // from r(cos a0,sin a0) to r (cos a1,sin a1).
+ //
+ // BUG: This should really be part of ellipse().
+
+ let answer = FPath.arcToBezierNEW(r,a0,a1);
+
+ return answer;
+ }
+
+ static parametricToBezier(f : Parametric2DFunction ,
+ t0 : number , t1 : number ,n : number) : FPath {
+
+ // Given a 2D parametric curve, f(t) = x(t),y(t)), this returns a bezier
+ // approximation from t=t0 to t=t1 by taking n time-steps. Obviously,
+ // f must be a function returning f.x and f.y.
+ //
+ // This works by sampling f (n+1) times, plus n times at the in
+ // between points, and fitting a Bezier to each trio of points. It
+ // follows the notes in the "main" manual. This is a hard problem -- or
+ // a messy one. There are various strategies. The one used here is to
+ // choose the tangent at the intermediate point (which I call B) to be
+ // parallel to the line between the two end-points of the Bezier segment.
+ // This is relatively straightforward, but one problem with this is that
+ // the slopes where these segments meet need not be the same -- the
+ // resulting curve is not G_1. I'm pretty sure that I worked out a method
+ // once that was based (somehow?) on the way MetaPost works, but it's
+ // complicated and messy and uses complex numbers.
+ let p = new FPath();
+
+ let p1 : Point2D = f(t0);
+ p.moveTo(p1.x,p1.y);
+
+ for (let i = 0; i < n; i++)
+ {
+ let p4 : Point2D = f(t0 + (i+1)*(t1-t0)/n);
+ let B = f(t0 + (i+0.5)*(t1-t0)/n);
+
+ // Work out an appropriate value for t based on relative distances.
+ let d1 = Math.sqrt((B.x-p1.x)**2 + (B.y-p1.y)**2);
+ let d2 = Math.sqrt((B.x-p4.x)**2 + (B.y-p4.y)**2);
+ let t = d1 / (d1+d2);
+
+ // The p4 to p1 vector:
+ let V = new Point2D(p4.x - p1.x,p4.y-p1.y);
+
+ // e1 = B - (1-t)(p4-p1)/3 and e2 = B + t(p4-p1)/3.
+ let e1 = new Point2D(B.x - (1-t)*V.x/3,B.y - (1-t)*V.y/3);
+ let e2 = new Point2D(B.x + t*V.x/3,B.y +t*V.y/3);
+
+ // Run de Casteljau's algorithm backwards. I call this alpha too,
+ // but r is a better name since it's a ratio.
+ let r = 1 - 1 / (t**3 + (1-t)**3);
+ let u = (1-r)*(1-t)**3;
+ let C = new Point2D(p1.x*u + p4.x*(1-u),p1.y*u + p4.y*(1-u));
+ let A = new Point2D(B.x + (C.x-B.x)/r,B.y + (C.y-B.y)/r);
+ let v1 = new Point2D((e1.x - A.x*t)/(1-t),(e1.y - A.y*t)/(1-t));
+ let v2 = new Point2D((e2.x - A.x*(1-t))/t,(e2.y - A.y*(1-t))/t);
+ let p2 = new Point2D((v1.x - p1.x*(1-t))/t,(v1.y - p1.y*(1-t))/t);
+ let p3 = new Point2D((v2.x - p4.x*t)/(1-t),(v2.y - p4.y*t)/(1-t));
+
+ p.bezierCurveTo(p2.x,p2.y,p3.x,p3.y,p4.x,p4.y);
+
+ p1 = p4.copy();
+ }
+
+ return p;
+ }
+}
+
+// Text is a special case because it expects a LH coordinate system, but
+// everything else is set up for a RH coordinate system. The end-user
+// shouldn't make a direct call to ctx.fillText(). If he does, then the
+// the text will be upside-down. So, call this instead.
+//
+// Getting the placement of the js to match the placement of the tikz exactly
+// is difficult because they're using two different fonts. So the tikz
+// is drawn at (x+dx,y+dy). The dx and dy are optional and default to zero.
+//
+// BUG: I *could* create a class, something like FPath, to handle all drawing
+// of text, which may be more natural to the user. But I would probably have
+// to extend CanvasRenderingContext2D somehow and use that everywhere, not
+// just when creating TikZ. For now, this is a sufficient solution.
+// Another approach would be to overwrite the existing
+// CanvasRenderingContext2D.fillText method to call the function below.
+// In some ways, that's the "right" thing to do, but my gut is that
+// it could lead to various problems and make the code generally brittle.
+
+function drawText(ctx : CanvasRenderingContext2D, txt : string,
+ x : number , y : number , dx = 0 , dy = 0) : void {
+
+ let saveT = ctx.getTransform();
+
+ if (ctx instanceof CTX)
+ {
+ // Don't fool around. Just write it to the .tikz file.
+ // BUG: The ts compiler complains about this, but it works fine.
+ ctx.fillText(txt , x + dx , y + dy );
+ ctx.setTransform(saveT);
+ return;
+ }
+
+ // Get the measurements -- all we really care about is the baseline.
+ // Transform the ctx so that the horizontal line at y becomes the
+ // origin, flip the scale, and draw at (x,0).
+ //
+ // Recapitulating the info on MDN, we care about m.actualBoundingBoxAscent
+ // and m.actualBoundBoxDescent, which give distances from ctx.textBaseline
+ // to the relevant side of the bounding box of the text. The baseline
+ // defaults to the 'alphabetic' setting, which puts the baseline just
+ // under where you normally draw the letter -- B sits on the baseline,
+ // while p hangs below it.
+ let m : TextMetrics = ctx.measureText(txt);
+
+ ctx.translate(0,y);
+ ctx.scale(1,-1);
+ ctx.textBaseline = 'bottom';
+ ctx.fillText(txt , x , 0 );
+
+ ctx.setTransform(saveT);
+}
+
+// As above, but these to draw the text in only one scenario or
+// the other. This could be handled with boolean arguments to the
+// above, but this seems clearer for the user.
+function drawTextBrowserOnly(ctx : CanvasRenderingContext2D | CTX, txt : string,
+ x : number , y : number , dx = 0 , dy = 0) : void {
+
+ if (ctx instanceof CTX)
+ // Skip it.
+ return;
+
+ drawText(ctx,txt,x,y,dx,dy);
+}
+
+function drawTextTikZOnly(ctx : CanvasRenderingContext2D | CTX, txt : string,
+ x : number , y : number , dx = 0 , dy = 0) : void {
+
+ if (ctx instanceof CTX)
+ ctx.fillText(txt , x + dx , y + dy );
+}
+
+
+// This is to act much like the object returned from
+// canvas.getContext('2d').
+// Only a few elements of the standard context class are needed.
+// I purposely did *not* make this extend CanvasRenderingContext2D.
+// By not extending, you can't accidentally make use of some feature
+// of the normal ctx framework and have it silently fail.
+//
+// This is one major difference. Each time you want to render a figure,
+// you need a new one of these since the tikz text goes out to a file
+// with a different name. In principle, it would be possible to allow
+// reusing these, but there's no value in allowing for that.
+
+// I had hoped not to need to deal with transformation matricies, and
+// just (implicitly) use the identity matrix. However, certain things
+// are easier for the user if they are permitted. See
+// www.alanzucconi.com/2016/02/10/tranfsormation-matrix
+// for a brief summary of how these work.
+//
+// Think of the matrix as R in the upper left, for rotation etc, and
+// (tx,ty,1) in the right column for translation, with M as the overall
+// matrix. The bottom row is always (0 0 1). If the user gives (x y) as
+// some position relative to M, then the "real" position is M(x y 1).
+// By "real" I mean that position relative to the identity matrix.
+//
+// BUG: I think I am doing this the wrong way. As things stand, I store
+// the thing the user does (the path and any points or whatever that
+// specify) in terms given by the user. Then I convert those values to
+// their "unadjusted" values when written to tikz output. Instead, I should
+// convert things as they come in. For one thing, as things stand, if
+// the user adjusts the t-matrix as things are drawn, it would mess up
+// everything. This would also side-step certain questions like what
+// a shear transformation should mean for something like an ellipse. If
+// we correct things as just described, then an ellipse is an ellipse,
+// and it is not shear-transformed, although the points where ellipse
+// is located would be shear-transformed.
+//
+// BUG: Add a flag, like CTX.paper, and set is to true here.
+// That way, the rendering process can output something different on paper.
+// This flag will be undefined when run in a browser.
+
+class CTX {
+
+ // Transformation matrix.
+ // BUG: Try to get rid of this. I think that, now that all drawing is
+ // done with a RH system, this is unnecessary. Everything related to
+ // tmatrix is private and I think it's effectively unused.
+ private tmatrix = [[1,0,0],[0,1,0],[0,0,1]];
+
+ // BUG: This is *not* the right way to do things, but it's easier.
+ // The problem is in scaling lengths, which are not points. This is a
+ // particular problem with radii. The proper solution is to work this value
+ // out from the tmatrix, but that's messy.
+ // This is why things like ellipses should be treated as beziers.
+ private netScale = 1.0;
+
+ // To allow the user to set the linewidth. Otherwise, tikz uses a
+ // default value of 0.4pt. Tikz has certained named line widths, like
+ // 'semithick' and 'ultra thin' but I don't care about those. It's better
+ // to stick with numerical values to be consistent with js.
+ // This name matches what's used in a "normal" ctx.
+ // The way to specify line width in tikz is as an option to \draw:
+ // \draw[line width = 1mm] ...whatever...
+ // for example.
+ lineWidth = 1.0;
+
+ // File name (without the '.tizk') for the figure.
+ figureName = "";
+
+ // This holds the output as it is generated.
+ tikzstr = "";
+
+
+ constructor(name : string) {
+
+ // Provide the name of the figure whose tikz is being generated.
+ // This goes to a file, which is fiddly with js. The contents of the
+ // file will be sent to the server, and it is assumed that the server
+ // knows what to do. A normal HTTP server will choke on it (really,
+ // it will just ignore it).
+ //
+ // As each call to stroke(), fill(), and so forth is made, the corresponding
+ // tikz is noted. When all these are calls are done, call close() to write it out.
+ this.figureName = name;
+ this.tikzstr = "";
+
+ // The tikz file needs a bit of a heading.
+ this.tikzstr += "\\begin{tikzpicture}\n";
+
+ // And everything is clipped to the permitted drawing area. To obtain
+ // that area, we need to look at the figure specification.
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction ( name );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+
+ // Neither one really seems to give the right thing.
+ // Maybe use \clip as an option to
+ // \begin{tikzpicture}[\clip something?]
+ //this.tikzstr += "\\clip (0bp,0bp) rectangle (" +fpc.textWidth+
+ // "bp," + fpc.h+ "bp);\n";
+ this.tikzstr += "\\useasboundingbox (0bp,0bp) rectangle (" +fpc.textWidth.toFixed(2)+
+ "bp," + (fpc.h - fpc.lowerPadding - fpc.upperPadding).toFixed(2)+ "bp);\n";
+ }
+
+ close() {
+
+ // Finalize the tikz specification, and write it out.
+ //
+ // Note that, under Firefox, this generates an error on the console:
+ //
+ // XML Parsing Error: no root element found
+ // Location: http://localhost:8000/geartest01.tikz
+ // Line Number 1, Column 1:
+ //
+ // or whatever the file name is that's saved. Apparently this is a
+ // "known issue" (aka, a bug) with Firefox. No such message appears
+ // with MS Edge. It works the same either way.
+ this.tikzstr += "\\end{tikzpicture}\n";
+
+ // BUG: No doubt there is a more modern fetch() way to do this.
+ let req = new XMLHttpRequest();
+
+ // This is *really* not the standard way to do things.
+ // Pass the file name to save under, then the text to save.
+ // I *should* be passing some cgi script that takes input, but
+ // I've tweaked the http server so that it's non-standard,
+ // and does what I want instead of what it is supposed to do.
+ let fname = this.figureName + ".tikz";
+ req.open("POST",fname);
+
+ // I have no idea whether this is really necessary.
+ req.setRequestHeader("Content-Type","text/plain;charset=UTF-8");
+
+ req.send(this.tikzstr);
+ }
+
+ private static clone3x3Matrix(m : number[][]) : number[][] {
+
+ // JS seems not to have a standard way of creating a copy of a matrix.
+ // This does it for a 3x3 matrix and returns the result.
+ let a : number[][] = [];
+ a[0] = [];
+ a[0][0] = m[0][0];
+ a[0][1] = m[0][1];
+ a[0][2] = m[0][2];
+
+ a[1] = [];
+ a[1][0] = m[1][0];
+ a[1][1] = m[1][1];
+ a[1][2] = m[1][2];
+
+ a[2] = [];
+ a[2][0] = m[2][0];
+ a[2][1] = m[2][1];
+ a[2][2] = m[2][2];
+
+ return a;
+ }
+
+ private getTransform() : number[][] {
+ return CTX.clone3x3Matrix(this.tmatrix);
+ }
+
+ private setTransform(t : number[][]) : void {
+ this.tmatrix = CTX.clone3x3Matrix(t);
+ }
+
+ private translate(tx : number , ty : number ) : void {
+
+ // Adjust the transformation matrix. Going forward, this will have the
+ // effect of converting (x,y) to (tx + x,ty+y) whenever the user
+ // refers to (x,y).
+ this.tmatrix[0][2] += tx;
+ this.tmatrix[1][2] += ty;
+ }
+
+ private scale(sx : number , sy : number ) : void {
+
+ // Scale the transformation matrix.
+ // Let S = diag(sx,sy,1). The new t-matrix is the old t-matrix times S.
+ //
+ // BUG: I am not sure. Maybe it should be S times old t-matrix, and
+ // I have the order wrong. For the time being it doesn't matter since
+ // every case I care about has sx=sy and the matrices commute in that
+ // special case.
+ this.tmatrix[0][0] *= sx;
+ this.tmatrix[0][1] *= sy;
+
+ this.tmatrix[1][0] *= sx;
+ this.tmatrix[1][1] *= sy;
+
+ // Track this here too.
+ // BUG: This assumes that sx = xy.
+ this.netScale *= sx;
+ }
+
+ private applyTMatrix(x : number , y : number ) : {x : number , y : number } {
+
+ // Return tmatrix times (x,y). As a matrix operation, this is
+ // tmatrix x (x y 1), but we only return the first two entries.
+ let ax = this.tmatrix[0][0] * x + this.tmatrix[0][1] * y + this.tmatrix[0][2];
+ let ay = this.tmatrix[1][0] * x + this.tmatrix[1][1] * y + this.tmatrix[1][2];
+
+ return {x: ax, y: ay};
+ }
+
+ handlePath(path : FPath ) : void {
+
+ // Called by either fill() or stroke().
+ var segs = path.segs;
+
+ for (let i = 0; i < segs.length; i++)
+ {
+ // s is a PathSegment object.
+ let s = segs[i];
+
+ if (s.type == PathSegment.MOVE_TO)
+ {
+ let m = <MoveToSegment> s.s;
+ let t = this.applyTMatrix(m.x,m.y);
+ //this.tikzstr += "(" +s.x+ "pt, " + s.y+ "pt) ";
+ this.tikzstr += "(" +t.x.toFixed(2)+ "bp, " + t.y.toFixed(2)+ "bp) ";
+ }
+ else if (s.type == PathSegment.LINE_TO)
+ {
+ // Lines are drawn with the tikz \draw command. It takes the form
+ // \draw [options] (x1,y1) -- (x2,y2);
+ // Note that I include "bp" for the dimensions. I think that tikz
+ // defaults to cm if no dimension is given, so I should specify
+ // something. Note also that I use bp, not pt.
+ //
+ // BUG: I am not sure whether the tikz point is 72ppi or 72.27 ppi
+ // to match latex.
+ //
+ // BUG: For the time being, I will ignore these options, but they
+ // can be things like fill or dashed, or to set the color or line
+ // width, and probably a mess of other stuff.
+ let m = <LineToSegment> s.s;
+ let t = this.applyTMatrix(m.x,m.y);
+ this.tikzstr += "-- (" +t.x.toFixed(2)+ "bp, " + t.y.toFixed(2)+ "bp) ";
+ }
+ else if (s.type == PathSegment.BEZIER)
+ {
+ // The sources I found aren't very explicit about exactly how
+ // this is implemented. I assume it's done in the usual way.
+ // We have
+ // P(t) = B(3,0)*CP + B(3,1)*P1 + B(3,2)*P2 + B(3,3)*P3,
+ // where t\in [0,1] and B are the usual Bernstein polynomials (the
+ // functions of t):
+ // B(n,m) = C(n,m) t^m (1-t)^(n-m),
+ // and C is the choice function.
+
+ // See also the tikz/pgf manual (v3.1.9a), p. 156, for the output.
+ // However the manual is wrong, or not clear. Use 'and' between
+ // the control points.
+ //
+ // The gist is that CP is fixed point where the curve starts;
+ // it's implicit for both Java and tikz. P1 and P2 are the control
+ // points and P3 is where the curve terminates. Fortunately this
+ // matches up nicely with the tikz syntax.
+ let m = <BezierToSegment> s.s;
+ let t1 = this.applyTMatrix( m.cx1 , m.cy1);
+ let t2 = this.applyTMatrix( m.cx2 , m.cy2);
+ let t3 = this.applyTMatrix( m.x , m.y);
+
+ this.tikzstr +=
+ ".. controls (" +t1.x.toFixed(2)+ "bp, " +t1.y.toFixed(2)+ "bp) and (" +
+ t2.x.toFixed(2)+ "bp, " +t2.y.toFixed(2)+ "bp) .. (" +
+ t3.x.toFixed(2)+ "bp, " +t3.y.toFixed(2)+ "bp)";
+ }
+ else if (s.type == PathSegment.QUADRATIC)
+ {
+ // BUG: Put this back.
+ console.log("quadratic does not work");
+ // Tikz has this too (whew). Oddly, it's part of the pgf stuff.
+ // Everything else is drawn with \draw (or \fill), but this
+ // uses \pgfpathquadraticcurveto. I'm not sure if that matters,
+ // and I hope that you can mix these freely in the middle of
+ // a \draw command. The tikz/pgf manual isn't very clear on
+ // mixing these.
+ // BUG: I wonder if I should be using commands like \pgflineto,
+ // \pgfcurveto, and so forth, throughout what I've done.
+ // See the tikz/pgf manul (v3.1.9a), p. 1095.
+ //
+ // BUG: I'm going to code this hoping that it works, but I suspect
+ // that it will not, and will need to go back and change to
+ // something other than \draw or \fill to start with.
+ // Maybe I need to define an entire path and then \draw or \fill
+ // it? It looks like you define that path, then say
+ // \pgfusepath{fill} or whatever.
+ //
+ // BUG: Maybe I could convert this to a cubic here and avoid this
+ // entire messy issue?
+ //
+ // NOTE: pgf has some nice commands for drawing only *part* of
+ // a Bezier curve. See p. 1097 for \pgfpathcurvebetweentime.
+
+ // BUG: Maybe I'll be lucky and this is never called.
+ // I think (?) it must be that the only time this type of
+ // segment ever arises is if the user users a QuadCurve2D, which
+ // seems (?) unlikely.
+ /*
+ let t1 = this.applyTMatrix(s.cx,s.cy);
+ let t2 = this.applyTMatrix(s.x,s.y);
+
+ //this.tikzstr +=
+ // "\\pgfpathquadraticcurveto {\\pgfpoint{" +
+ // s.cx+ "pt}{" +x.cy+ "pt}}{\\pgfpoint{" +
+ // s.x+ "pt}{" +s.y+ "pt}}";
+ this.tikzstr +=
+ "\\pgfpathquadraticcurveto {\\pgfpoint{" +
+ t1.x+ "bp}{" +t1.y+ "bp}}{\\pgfpoint{" +
+ t2.x+ "bp}{" +t2.y+ "bp}}";
+ */
+ }
+ else if (s.type == PathSegment.ARC)
+ {
+ console.log("arc");
+ // This is a circular arc of a circle
+ // centered at (x,y) over a given range of angles (cw or ccw).
+ //
+ // BUG: For the remaining cases, I may need to do something
+ // special. It's not clear exactly what the browser is doing
+ // with these. Are they converted, internally, to bezier
+ // curves or are they somehow rendered more directly.
+
+ this.tikzstr += "no arc implemented";
+ }
+ else if (s.type == PathSegment.ARC_TO)
+ {
+ console.log("arc to not done");
+ // This is essentially a bezier curve.
+ // You have two control points and a radius. It is not
+ // clear exactly how it works.
+
+ this.tikzstr += "no arcTo implemented";
+ }
+ else if (s.type == PathSegment.ELLIPSE)
+ {
+ // BUG: This will only draw a complete ellipse, not an arc of
+ // an ellipse.
+ // BUG: The foolishness with netScale is another reason not
+ // to allow an ellipse type. If an ellipse were really a series
+ // of bezier curves, then this would be a non-issue.
+ let m = <EllipseSegment> s.s;
+
+ let c = this.applyTMatrix( m.x , m.y );
+
+ //console.log(s.x+ "," +s.y+ " becomes " +c.x+ " " +c.y);
+
+ //this.tikzstr += "(" +c.x+ "pt," +c.y+
+ // "pt) ellipse [x radius=" +s.rx*this.netScale+
+ // "pt,y radius =" + s.ry*this.netScale+ "pt]";
+
+ this.tikzstr += "(" +c.x.toFixed(2)+ "bp," +c.y.toFixed(2)+
+ "bp) ellipse [x radius=" + (m.rx * this.netScale).toFixed(2)+
+ "bp,y radius =" + (m.ry * this.netScale).toFixed(2)+ "bp]";
+ }
+ else if (s.type == PathSegment.RECT)
+ {
+ console.log("rect not done");
+ this.tikzstr += "no rect implemented";
+ }
+ else if (s.type == PathSegment.CLOSE)
+ {
+ this.tikzstr += "-- cycle";
+ }
+ else
+ {
+ console.log("unknown FPath: " +s.type);
+ }
+ }
+
+ this.tikzstr += ";\n";
+ }
+
+ stroke(path : FPath ) : void {
+
+ let segs = path.segs;
+ if (segs.length === 0)
+ return;
+
+ this.tikzstr += "\\draw[line width=" +this.lineWidth.toFixed(2)+ "bp] ";
+
+ this.handlePath(path);
+ }
+
+ fill(path : FPath ) : void {
+
+ let segs = path.segs;
+ if (segs.length === 0)
+ return;
+
+ this.tikzstr += "\\fill ";
+
+ this.handlePath(path);
+ }
+
+ fillText(s : string , x : number , y : number ) : void {
+
+ // BUG: This is now done with top-level functions now and shouldn't
+ // be called (or callable) by outside code.
+ //
+ // BUG: I have my doubts about including this one. It needs to be done
+ // *somehow*, but I am concerned about a mismatch between the JS
+ // font and the fonts used by latex.
+ //
+ // BUG: I am ignoring the ctx.font setting. It does seem that if you
+ // set it to '10px san-serif' you get something reasonable for the
+ // browswer that doesn't look too different than latex.
+ //
+ // BUG: This is so fussy that I suspect that any drawing that is at
+ // all tricky will require that the user provide different placement for
+ // text on the browser and text on the page. Getting things to match
+ // up *exactly* may be impossible.
+
+ let t = this.applyTMatrix(x,y);
+ // I had this as 'anchor=south west', but 'base west' seems closer
+ // to what latex does.
+ // BUG: It's all a mystery.
+ this.tikzstr +=
+ "\\node [anchor=base west] at (" +t.x.toFixed(2)+ "pt, " +t.y.toFixed(2)+ "pt) {" +s+ "};\n";
+
+
+ }
+
+}
+
+
+
+// A grab-bag of numerical techniques.
+// BUG: This doesn't really belong in this file.
+
+type FunctionRealtoReal = ( x : number ) => number;
+
+class Numerical {
+
+ static newton(f : FunctionRealtoReal , g : number, a : number , b : number ,
+ y : number , e : number ) : number {
+
+ // Given a function, f, and an initial guess, g, bracketed between a and b,
+ // for the argument to f, and a target value, y, this returns x such that
+ // f(x) = y to within error, e.
+ //
+ // A crude off-the-cuff implementation of Newton-Raphson.
+ // This will only work in the tamest situations.
+ //
+ // Recall that the idea is that
+ // f(x0 + dx) ~ f(x0) + f'(x0) dx
+ // We want y = f(x + dx) and that is approximately equivalent to
+ // y = f(x0) + f'(x0) dx or dx = ( y - f(x0) ) / f'(x0)
+ // so that x0 becomes x1 = x0 + dx = x0 + ( y - f(x0) ) / f'(x0)
+ //
+ // NOTE: I had hoped to avoid the need to bracket entirely, and for
+ // some functions (and sufficiently good initial guesses), you could,
+ // but it's too easy for the algorithm to get lost among local extrema
+ // if there is no bracket.
+ //
+ // In fact, here is a good example of why bracketing is needed.
+ // Let f = cos x + x sin x, which happens to be the x-coordinate for
+ // the parameterization of the unit involute. Suppose that you want
+ // to find x for which f(x) = 1.5, and you start off with a guess of
+ // x = 0.5. The slope of f at 0.5 is small so that Newton-Raphson
+ // sends x1 to a value that is beyond the inflection point near x = 3.
+ // At that point things go haywire.
+
+ let x0 = g;
+ let y0 = f(x0);
+
+ let i = 0;
+
+ while (Math.abs(y-y0) > e)
+ {
+ let fplus = f(x0+e);
+ let fminus = f(x0-e);
+ let fprime = (fplus - fminus) / (2*e);
+
+ let dx = (y - y0) / fprime;
+ let x1 = x0 + dx;
+
+ // Make sure we haven't passed a bracket. Just subdivide if we have.
+ if (x1 > b)
+ x1 = (x1-x0)/2;
+ if (x1 < a)
+ x1 = (x0-x1)/2;
+
+ x0 = x1;
+ y0 = f(x0);
+
+ // Don't allow an infinite loop
+ ++i;
+ if (i > 100)
+ return x0;
+ }
+
+ return x0;
+ }
+
+}
diff --git a/graphics/figput/javascript/development/widgets.ts b/graphics/figput/javascript/development/widgets.ts
new file mode 100644
index 0000000000..6c371527ab
--- /dev/null
+++ b/graphics/figput/javascript/development/widgets.ts
@@ -0,0 +1,2908 @@
+/*
+Widget management code.
+
+Typically, widget management is done with a tightly siloed hierarchy, with
+widgets in containers, which are in containers, etc. There is a hierarchy
+like that here (though rather flat since I don't need much), but there's also
+a global registry of widgets alongside the hierarchy. This makes widgets
+easier to work with for the author of the latex document.
+
+I've also avoided any kind of clever abstraction around the widget concept.
+This can mean that there's a certain amount of boilerplate (not DRY), but
+it also means that things aren't tangled up. Widgets can be individually
+modified without worries about side-effects.
+
+All widgets use a register() method rather than a constructor. This
+is because the user should be able to specify a widget repeatedly
+without actually creating a new one every time it's specified.
+
+So, the user should say something like
+let w = RandomWidgetType.register(arguments);
+to create a widget from the drawing code. If register() has never been
+called for the particular widget, then a new widget *is* created and
+a reference to it is placed in global storage. If this widget was created
+earlier, then the reference to it is taken from global storage and returned.
+So, register() is something like an object factory, but it won't make the
+same object more than once.
+
+Every widget is distinguished by its type and the (name of the) figure it
+belongs to. In addition, if a figure has several widgets of the same type,
+then the user must provide an optional name for that particular widget. For
+example, if there are three ButtonWidgets for a given figure, then they
+might be created by
+let b1 = ButtonWidget.register(whatever,"first");
+let b2 = ButtonWidget.register(whatever,"second");
+let b3 = ButtonWidget.register(whatever,"third");
+
+-------------------------
+
+One of the ticklish issues is how to associate widgets with their
+figures. In most languages, this problem is solved by explicitly using
+"this" somehow. In Java, you might say something like
+new Widget(this);
+to indicate that the owner of the widget is the class from which the widget
+was constructed. I would rather not do that because it's the kind of
+boilerplate arcana that the user shouldn't have to think about.
+
+JS provides a couple of ways to determine who made a call to a particular
+function. The easiest way is like this
+
+function example() {
+ let caller = example.caller.name;
+ console.log(caller);
+}
+
+This should print the name of the function that invoked example().
+
+Another way is very easy to do, but it's been deprecated. See
+https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
+Even though it is deprecated, every browser supports it, according to the
+above link. Also, my guess is that this is very commonly used since
+it's so handy. They won't be getting rid of it any time soon.
+
+If they do get rid of caller.name, then another way to obtain this
+information is by creating a bogus Error and examining the call stack:
+
+function example() {
+
+ let stack = new Error().stack;
+ let caller = stack.split('\n')[1].trim();
+
+ // caller is now inforamtion about the function calling this one,
+ // including the file name and a bunch of other stuff I don't care about.
+ // I just want to know the name of the function.
+ // It *appears* (but not extensively tested) that the function name
+ // occurs before the first '@'.;
+ let callingFcn = caller.split('@')[0];
+ console.log(callingFcn);
+}
+
+I wanted to use caller.name, even though it is deprecated, because it is
+so much easier. Unfortunately, it is not allowed in strict mode.
+Since everything that appears within a class is strict, that makes its use
+awkward. I tried to get around this by defining a top-level function (outside
+any class) that does nothing but return the value I want, but that doesn't
+work either. It seems like, as soon as you enter a class, the data you want
+is stripped off (or something). Also, now that I've moved to TypeScript any
+violation of "strict" is even harder. Since I'll have to define a seperate class
+anyway, go ahead and use the Error-based approach.
+
+To top it off, the method via generating an Error is sensitive to the
+broswer because different browsers format this information differently.
+
+-------------------
+
+BUG: Future Widgets...?
+
+Because LoopWidget takes such a crazy number of options, it would be nice
+to have several widgets that merely call LoopWidget. This wouldn't really
+be any different, but would simplify things for the user. Basically, these
+would have a reduced set of arguments to register() and just hand everything
+off to LoopWidget. They would be a mere glue skeleton. Same goes for
+OpenAnimWidget.
+
+Image Building Widget
+ For something like (say) a Mandelbrot set. This takes time to generate
+ and you might want to draw it in an open-ended way. It's not reasonable
+ to allow the user to move through time and see the state of the image
+ at different time steps. The widget should store an off-screen image
+ and making the animation "run faster" would mean calling it more frequently
+ so that it can do more calculation. So it would use some of the same
+ animation infrastructure, but in a different way. The most that makes
+ sense here is a pause/run (to reduce computational load) and something
+ to increase or decrease the load. This would often be something for which
+ it does not make sense to generate tikz. Any JS rendering of a mandelbrot
+ set (say) would be terrible for inclusion in a book. You'd generate a
+ printed figure like that in some other way, even if an on-line animation
+ would be instructive.
+
+Various restrictions on how a DraggableDot can be moved would be handy.
+Restricting to a particular line or arc wouldn't be hard, but restricting to
+fall on a given Path2D would be hard. The JS implementation of Path2D is
+poor, and I would need to reimplement the entire thing from the
+ground up. I might need to do some of that anyway for the best tikz output
+(I did some stuff along those lines already).
+
+Draggable Line
+ Similar to Draggable dot. In fact, it's not clear that this needs its own
+ widget. A line is determined by two points, so the user could use a
+ draggable dot and just draw the line himself. The only advantage I can
+ see to a draggable *line* is that the user could mouse-down on any
+ portion of the line. In fact, that could be done with DraggableDot since
+ the "dot" could be an entire line.
+
+Scroll bar for number selection.
+ Similar to a spinner, but the user drags a dot along a line.
+ Not clear whether a numerical value should appear.
+
+Checkboxes and Radio buttons
+ Gack
+
+Drop-down menu
+ Stuff like this gets more fiddly. If you have a drop-down menu and
+ it has a vertical scroll bar for multiple selections, then it's even worse.
+
+*/
+
+
+// There is only one of these, so everything is static. It manages all
+// the widgets in the program.
+
+class WidgetManager {
+
+ // All the widgets known to the program.
+ // Each of these is an instance of the Widget class.
+ // BUG: I could get rid of this and just use theWidgets. It's redundant,
+ // and theWidgets is actually easier.
+ // BUG: Yes, get rid of this.
+ static theList : Widget[] = [];
+
+ // Also a complete list of all widgets, but indexed by the figure
+ // to which the widget belongs. This makes it easier to pass events
+ // to the proper recipent. So this is a hash map taking a figure name
+ // (as a string) to an array of Widget objects.
+ static theWidgets : Map<AugmentedDrawingFunction,Widget[]> = new Map();
+
+ // This is BOGUS. Certain path operations require a CanvasRenderingContext2D,
+ // even when the question is one of pure abstract geometry, like
+ // isPointInPath(), and the only way to get one of these is from a canvas.
+ // Using the visible canvas and ctx for this is prone to all kinds of misuse
+ // and mistakes, so create a bogus ctx here.
+ // BUG: The long-term solution is not to rely on js for this at all. Write
+ // my own code for Bezier curves and the like. I'm partway there already.
+ static bogusCanvas : HTMLCanvasElement = document.createElement('canvas');
+ static bogusCtx : CanvasRenderingContext2D = WidgetManager.bogusCanvas.getContext('2d') !;
+
+ // Whether a widget "owns" a recent mouse-down event. This is needed
+ // for things like dragging. If this is null, then the next mouse-down
+ // is up for grabs. Otherwise, it points to the relevant Widget object.
+ static mouseOwner : Widget | null = null;
+
+ // This isn't being used yet, but it will be needed to handle keyboard
+ // events. The idea is that a widget ""takes ownership" of a mouse-down
+ // with mouseOwner, and that widget is the same one that has focus for
+ // any future keyboard events too. The only real difference is that
+ // focusOwner is "stickier." This goes to null whenever a user clicks
+ // on something other than a widget.
+ static focusOwner = null;
+
+
+ static register(w : Widget) : void {
+
+ this.theList.push(w);
+
+ if ( WidgetManager.theWidgets.has(w.betterOwner) )
+ WidgetManager.theWidgets.get(w.betterOwner) ! .push(w);
+ else
+ WidgetManager.theWidgets.set(w.betterOwner,[w]);
+ }
+
+ static knownWidget(o : string , t : string , n : string) : Widget | null {
+
+ // If there is a widget with the given owner (o), type (t) and name(n)
+ // in theList, then return it; return null otherwise.
+ // BUG: Using a string as owner feels particularly bad.
+ for (let i = 0; i < this.theList.length; i++)
+ {
+ let curW = this.theList[i];
+
+ if (o !== curW.owner)
+ continue;
+ if (t !== curW.type)
+ continue;
+ if (n === curW.name)
+ return curW;
+ }
+
+ return null;
+ }
+
+ static mouseDown(theFig : AugmentedDrawingFunction , x : number , y : number ) : void {
+
+ // theFig should match one of the Widget object's owner fields.
+ // (x,y) is given relative to he origin of the figure.
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+
+ // The only thing to do here is to pass the event to each widget and
+ // see if it wants it. I suppose that I *could* store the area for
+ // each widget, and do an initial test here, but this is easier.
+ let wlist : Widget[] = WidgetManager.theWidgets.get(theFig) !;
+
+ for (let i = 0; i < wlist.length; i++)
+ {
+ if (wlist[i].mouseDown(x,y) === true)
+ // First come, first serve.
+ return;
+ }
+ }
+
+ static mouseMove(theFig : AugmentedDrawingFunction , x : number , y : number ) : void {
+
+ // As above.
+ if (WidgetManager.mouseOwner === null)
+ return;
+
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+
+ // We only accept mouse moves if the mouse is on the figure that
+ // "owns" the mouse event.
+ if (WidgetManager.mouseOwner.betterOwner !== theFig)
+ return;
+
+ WidgetManager.mouseOwner.mouseMove(x,y);
+ }
+
+ static mouseUp(theFig : AugmentedDrawingFunction , x : number , y : number ) : void {
+
+ // As above.
+ if (WidgetManager.mouseOwner === null)
+ return;
+
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+
+ if (WidgetManager.mouseOwner.betterOwner !== theFig)
+ // Mouse was released over *a* figure, but not the figure with
+ // the owning widget. Tell the correct widget about the release, using
+ // bogus coordinates so that the mouse-up is sure to be off the widget.
+ WidgetManager.mouseOwner.mouseUp(10000000000000,10000000000000);
+
+ //console.log("up up");
+ WidgetManager.mouseOwner.mouseUp(x,y);
+ }
+}
+
+
+function getCaller() : string {
+
+ // Irritating function to get around strict mode. See the comment at the
+ // top of the file. I want the caller of the thing that calls this.
+ //
+ // BUG: I was never entirely happy with this, and now that it depends
+ // on the particular browser, I am even less happy about it. It's a
+ // question of the lesser of two evils: this function or requiring
+ // the user to provide a boilerplate 'this' or the like.
+
+ let stack : string = new Error().stack !;
+
+ // The exact format of the information in stack depends on the particular
+ // browser. Firefox produces something like this:
+ //
+ // getCaller@http://localhost:8000/widgets.js:375:15
+ // register@http://localhost:8000/widgets.js:1557:18
+ // geartest01@http://localhost:8000/geartest01.js:142:26
+ // render@http://localhost:8000/layout.js:628:11
+ // renderFrame@http://localhost:8000/widgets.js:538:13
+ // etc.
+ //
+ // While MS Edge/Chrome produces
+ //
+ // Error
+ // at getCaller (widgets.js:375:15)
+ // at Function.register (widgets.js:1557:18)
+ // at geartest01 (geartest01.js:142:26)
+ // at FigurePanel.render (layout.js:628:5)
+ // etc.
+ //
+ // Depending on the Browser, stack needs to be parsed differently.
+ // theBrowser was defined in main.js.
+
+ // The digit value (e.g., '2') indicates how many steps back in the the
+ // stack to go.
+ if (theBrowser === "Firefox")
+ {
+ let caller = stack.split('\n')[2].trim();
+
+ // caller is now information about a function in the call stack,
+ // including the file name and a bunch of other stuff I don't care about.
+ // I just want to know the name of the function.
+ // The function name occurs before the first '@'.
+ let callingFcn = caller.split('@')[0];
+ return callingFcn;
+ }
+ else if (theBrowser === "Chrome")
+ {
+ let caller = stack.split('\n')[3].trim();
+
+ // Here, space-deliminting works better.
+ let callingFcn = caller.split(' ')[1];
+
+ // But this may return something like 'FigurePanel.bezier'; what I want
+ // is just 'bezier'.
+ if (callingFcn.indexOf('.') > -1)
+ callingFcn = callingFcn.split('.')[1];
+
+ return callingFcn;
+ }
+ else
+ {
+ console.log("IMPOSSIBLE ERROR DUE TO UNKNOWN BROWSER TYPE!!!");
+ return "";
+ }
+}
+
+
+
+// Base class for all widgets. No code outside this file should
+// ever access this class directly. It's not abstract because there
+// are certain actions common to every case in the constructor.
+
+class Widget {
+
+ // Every widget is owned by a particular figure. The "owner" is
+ // the name of the figure function, just as in latex.
+ // BUG: Change this to the AugmentedDrawingFunction. Thus, get rid
+ // of this and use betterOwner.
+ owner : string = "";
+
+ betterOwner : AugmentedDrawingFunction;
+
+ // JS isn't very good about types, so it's clearer to tag sub-classes with
+ // the name of that sub-class rather than mess with typeof or whatever.
+ // This should be "LoopWidget" or whatever the name is of the sub-class.
+ type : string = "";
+
+ // Name to distinguish this widget from all others of the same
+ // type that belong to the same figure. So, the triple (owner,type,name)
+ // fully distinguishes this Widget from all others.
+ //
+ // In principle, this variable could have been avoided as a user-provided
+ // value and he wouldn't have to come up with an 'extra' name for the widget,
+ // but it wouldn't be easy. The WidgetManager (or something) would have to
+ // come up with a unique ID and *that* would require that the user invoke
+ // something like a "starting to create widgets" and "done creating widgets"
+ // commands. Overall, this seems less fussy for him.
+ name : string = "";
+
+ // The (x,y) is where the widget should be drawn relative to the
+ // rectangle of the figure. Often, widgetX will be negative to put the
+ // widget in the margin of the page.
+ // It's tempting to call these fields x and y, but it would
+ // be easy to accidentally reuse those names.
+ widgetX = 0;
+ widgetY = 0;
+
+ // To scale the drawing of a widget up or down.
+ scale = 1.0;
+
+ // Occassionally, it may make sense to hide a widget. This is different
+ // than being non-visible because the widget is off-screen. If the
+ // widget has hide == true, then it is *never* shown. For example, the
+ // way animations work, you have to have an animation widget to run the
+ // animation, even if you don't want to see the widget.
+ hide : boolean = true;
+
+
+ constructor(owner : string , type : string , x : number , y : number , scale : number ,
+ hide : boolean , name : string ) {
+
+ // Due to the fact that this tracks the owner of the widget, and how
+ // it is done, it is IMPORTANT that no sub-class has its own constructor.
+ this.owner = owner;
+ this.type = type;
+ this.widgetX = x;
+ this.widgetY = y;
+ this.scale = scale;
+ this.hide = hide;
+ this.name = name;
+ this.betterOwner = getAugmentedFunction(owner);
+
+ // When a widget is contructed it must be registered in a global list.
+ WidgetManager.register(this);
+ }
+
+ draw(ctx : CanvasRenderingContext2D) : void {
+ // Every sub-class must implement this method.
+ console.log("Called Widget.draw()!!!");
+ }
+
+ // BUG: These methods that are "never" supposed to be called
+ // will be called for the widgets based on the DOM, like ButtonWidget.
+ // That's fine -- don't panic! I want to get rid of these DOM-based
+ // widgets anyway. DOM = cesspool.
+ mouseDown(x : number , y : number ) : boolean {
+ // Every sub-class must implement this method.
+ // Return true iff the widget wants to "take ownership" of this event.
+ console.log("Called Widget.mouseDown()!!! " +this.name);
+ return false;
+ }
+
+ mouseMove(x : number , y : number ) : void {
+ // As above, but returns nothing.
+ console.log("Called Widget.mouseMove()!!!");
+ }
+
+ mouseUp(x : number , y : number ) : void {
+ // As above, but returns nothing.
+ console.log("Called Widget.mouseUp()!!!");
+ }
+}
+
+
+// Animations require some infrastructure.
+// BUG: Maybe this stuff should be in AnimationWidget.
+
+function doAnimation(theWidget : AnimationWidget) : void {
+
+ // This is called to render a frame of an animation. It is generated via
+ // the usual event-loop, so we schedule it just as we do for things like
+ // mouse-downs and scroll events.
+ // theWidget is the one that "runs" the animation, like a LoopWidget.
+ let id = Events.getID();
+ doAnimationGuts(id,theWidget);
+}
+
+async function doAnimationGuts(id : number , theWidget : AnimationWidget ) {
+
+ // Scheduling is handled in a way similar to doScroll() in main.ts.
+ await Events.waitMyTurn(id);
+
+ await renderFrame(theWidget);
+
+ // Advance to the next frame.
+ theWidget.curStep += theWidget.stepsPerFrame;
+ theWidget.advanceFrame();
+
+ // Don't forget this or the program is bricked!
+ Events.allDone(id);
+}
+
+async function renderFrame(theWidget : Widget ) {
+
+ // Calls the code to render the relevant figure. It renders the *entire*
+ // figure, widget and all.
+ //
+ // NOTE: This is used for animations, but it is also used to ensure
+ // that any change to a widget (and resulting changes to a figure)
+ // is shown.
+ //
+ // BUG: It's tempting to mention this in the user manual since users might
+ // find it useful. OTOH, that shouldn't be encouraged, and this is the kind
+ // of thing that might change in a later version.
+
+ // The "owner" is the function (from the latex document) that created
+ // theWidget.
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction( theWidget.owner );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+
+ // This is generally synchronous, but it doesn't hurt anything to tack an
+ // async on here. Maybe somebody will write one that *is* asynchronous.
+ await fpc.render();
+}
+
+function getFigureRect(theWidget : Widget ) : { w : number , ha : number , hb : number } {
+
+// Returns the width and height of the rectangle of the widget.
+// The height is in two parts: the height above the x-axis, and the height
+// below the x-axis.
+// The units are pdf points, and the width is relative to the left
+// margin. So the width matches the usual coordinate system for drawing
+// the figure, and this width is equal to the text width, as reported
+// by latex. So x in the range [0,width] should be limited to the area
+// below the text.
+let myFunc : AugmentedDrawingFunction = getAugmentedFunction( theWidget.owner );
+let fpc : FigurePanel = myFunc.figurePanelClass ! ;
+
+let answer = { w: fpc.textWidth, ha : fpc.h - fpc.lowerPadding , hb : fpc.lowerPadding };
+return answer;
+}
+
+// Base class for widgets that run animations. See LoopAnimWidget and
+// OpenAnimWidget. There is a fair amount of overlap between the two types
+// of animation class, and it is tempting to pull more stuff up to this level for
+// DRY reasons, but it seems cleaner and clearer to limit this to what's needed
+// to run the animations with doAnimation() and related functions.
+
+abstract class AnimationWidget extends Widget {
+
+ // Animations run as a series of frames, and this is the frame being displayed.
+ // This value may be open-ended or it may "loop back" so that animation repeats.
+ curStep = 0;
+
+ // How much to advance the above with each frame -- an integer. Animations
+ // can be made to run faster by increasing this value, thereby skipping frames.
+ stepsPerFrame = 1;
+
+ // The process id for the call to setInterval().
+ animID = 0;
+
+ advanceFrame() : void {
+ // This is why the class is abstract. It moves curStep to the next frame,
+ // however that should be done for the particular animation.
+ console.log("Calling abstract AnimationWidget.advanceFrame()!");
+ }
+}
+
+// A LoopWidget is to be used when an animiation runs in a repeating loop.
+// You must have one of these for an animation to run, even if the widget
+// itself is invisible.
+
+class LoopAnimWidget extends AnimationWidget {
+
+ // These are useful to the user to help properly place things.
+ // These values are given with scale equal to 1, and are worked
+ // out from the actual drawing code.
+ // The TopHeight is the amount above the circle that is used for the
+ // time-step controls, and BottomHeight is the amount used for the
+ // faster/slower, pause/run contols. If you don't want the circle at
+ // all, then it's a little awkward to work out placement, but it works.
+ // There is some imprecision here due to line thickneses, but very close.
+ static Radius = 41.5;
+ static TopHeight = 24.5;
+ static BottomHeight = 21.0;
+
+ // When things are "selected," draw them in this color.
+ static sColor = "blue";
+
+ // These are as passed to register(). See that method for a description.
+ // They really shouldn't be touched outside this class. The boolean values
+ // are whether certain elements of the widget are visible (and hence
+ // available for interaction).
+ steps = 100;
+ start = 0;
+ timeStep = 20;
+ visSteps = true;
+ visFastSlow = true;
+ visPauseRun = true;
+ visCircle = true;
+ triGrab = true;
+
+ // This stuff is very much private.
+
+ // These are stored when the figure is drawn so that mouse events can find
+ // what was clicked more easily. It's simpler than recalculating with
+ // every event.
+ pCircle : Path2D | null = null;
+ pUpStep : Path2D | null = null;
+ pDownStep : Path2D | null = null;
+ pFaster : Path2D | null = null;
+ pSlower : Path2D | null = null;
+ pPauseRun : Path2D | null = null;
+
+ // The states of various parts of the widget; e.g., whether the pause
+ // or run icon is present, whether a part is "half-way clicked,"" etc.
+ // I'm using 'a' for 'active' and 's' for 'selected.'
+ //
+ // BUG: If I want to get *really* fancy, then I need another set of
+ // flags to indicate that the mouse *was* clicked on something, so it
+ // is "selected," but the user moved the mouse away from the item without
+ // a mouse-up, so that selected item should be drawn in normal color, not
+ // the highlighted color (sColor). If the mouse is moved back over the
+ // selected item, then the color can go back to being the selection color.
+ aRunning = true;
+ sCircle = false;
+ sPauseRun = false;
+ sFaster = false;
+ sSlower = false;
+ sUpStep = false;
+ sDownStep = false;
+
+
+ static register(ctx : CanvasRenderingContext2D , x : number , y : number , scale : number ,
+ visWidget : boolean , steps : number , start : number , timeStep : number ,
+ visSteps : boolean, visFastSlow : boolean , visPauseRun : boolean , visCircle : boolean ,
+ triGrab : boolean , name : string ) : LoopAnimWidget {
+
+ // BUG: Add an argument for the size of the steps so that
+ // curStep can be incremented by more than 1?
+
+ // This is used something like a constructor. It either creates a new
+ // LoopWidget and returns it, or returns one that was created earlier.
+
+ // Many of these arguments are the same as for Widget.constructor().
+ // In addition, we have
+ // * ctx is assumed to have a t-matrix prepared to properly draw
+ // the widget.
+ // * steps is the number of steps required to form a loop -- when it
+ // "rolls over" or the "steps per revolution."
+ // * start is the starting step, which will usually be zero.
+ // * timeStep, in milliseconds, is the time from frame to frame.
+ // It seems like anything less than about 10ms is pointless.
+ // My guess (?) is that the rate of event generation is throttled
+ // somehow. It could be that my various layers of management are
+ // slowing things down, but I don't think so. 10ms is an eternity
+ // on modern hardware. The eye can only follow about 20 frames per
+ // second, at most, or 50ms per frame, so this is no big deal.
+ // * visWidget is whether the widget is visible at all -- same as the
+ // vis argument to Widget.construtor().
+ // * visSteps is whether the time step controls (at the top) are visible.
+ // * visFastSlow is whether the faster/slower controls are visible (at
+ // the bottom)
+ // * visPauseRun is whether the pause/run controls are visible
+ // * visCircle is for the circle (with triangular indicator).
+ // * triGrab is whether the user is allowed to grab the indicator
+ // triangle and control the animation by dragging it. The indicator
+ // triangle is always there, but it might not be grabable.
+ // Note that if visCircle == false, then triGrab is implicitly false
+ // since the triangle isn't visible either.
+ // * name is as in Widget.constructor()
+ //
+ // There appears to be a tacit assumption that time is measured in
+ // integer steps, but fractional values are fine. So they aren't really
+ // time "steps," but more like time increments.
+ //
+ // BUG: Maybe I should have different classes for some of these choices.
+ // There are just too many. These could all use (internally) the
+ // same class, just not with such a crazy number of options.
+
+ // Instead of messing with LoopWidget.name or something, be explicit.
+ let type = "LoopWidget";
+
+ // Something like this line must appear with every regester() method
+ // for each widget.
+ let caller : string = getCaller();
+
+ // I am forcing the type here, but if the wrong type is returned,
+ // then there are bigger problems.
+ let w : LoopAnimWidget = <LoopAnimWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ // Widget is known, but it needs to be drawn too.
+ w.draw(ctx);
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ // This class has NO construtor, by design, so this falls through to the
+ // super-class Widget constructor.
+ // Careful: Internally, I use an "is hidden" flag, but the user passes in
+ // an "is visible" flag.
+ // BUG: Change the names to be consistent.
+ w = new LoopAnimWidget(caller,type,x,y,scale,!visWidget,name);
+
+ // Now the additional stuff. This is what would be in a constructor
+ // if this class had one.
+ w.steps = steps;
+ w.start = start;
+ w.timeStep = timeStep;
+ w.visSteps = visSteps;
+ w.visFastSlow = visFastSlow;
+ w.visPauseRun = visPauseRun;
+ w.visCircle = visCircle;
+ w.triGrab = triGrab;
+
+ w.curStep = w.start;
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ // This is a special case because it's an animiation. The animation
+ // needs to be scheduled. It may make sense not to call setInterval()
+ // immediately; rather, it may be better to call setTimeout() so that
+ // setInterval() is called after a brief pause. It depends on how these
+ // two work. Try an immediate call; it *should* be fine.
+ w.animID = setInterval(doAnimation,w.timeStep,w);
+
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+
+ return w;
+ }
+
+ advanceFrame() : void {
+
+ // This kind of animation repeats.
+ this.curStep += this.stepsPerFrame;
+ if (this.curStep >= this.steps)
+ this.curStep -= this.steps;
+ }
+
+ draw(ctx : CanvasRenderingContext2D) : void {
+
+ // This is drawn with (0,0) at the center of the circle. The ctx must be
+ // shifted and scaled based on where the user wants the widget relative
+ // to the larger drawing area.
+ if (this.hide === true)
+ return;
+
+ // Don't attempt to draw to a tikz file.
+ if (ctx instanceof CTX)
+ return;
+
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX,this.widgetY);
+ ctx.scale(this.scale,this.scale);
+
+ var p = new Path2D();
+
+ // These values determine where the entire drawing is. (cx,cy) is the
+ // center of the circular thing, with radius r.
+ // In unscaled terms, it's clear that cx should equal r to make the
+ // widget but up against x = 0. It's messier for the y-coordinate and you
+ // need to work backwards from what the values defined below. The total
+ // height is 2r (the circle), plus circWidth (circle line thickness),
+ // plus 2 * arrowHeight (the go fast/go slow things). Then we need to
+ // add the stuff on the top: upperGap, plus stepHeight, plus stepThick.
+ // This is silly and probably confusing to the user. Just place the
+ // widget relative to the center of the circle. In other words, set
+ // (cx,cy) = (0,0). The user just needs adjust accordingly, and
+ // exactly what he wants to do will be influenced by whether the upper
+ // and lower sub-controls are present.
+ var r = 40;
+ var cx = 0;
+ var cy = 0;
+ var circWidth = 3;
+
+ if (this.visCircle == true)
+ {
+ // Draw the circle. (cx,cy) is center r and r are the two axes of the
+ // elipse. 0 is that the ellipse isn't rotated, and the last two are
+ // the start and end angle.
+ p.ellipse(cx,cy,r,r,0,0,2*Math.PI);
+
+ // Note this circle for reference by mouse events.
+ this.pCircle = new Path2D(p);
+
+ ctx.lineWidth = circWidth;
+
+ if (this.sCircle == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ ctx.stroke(p);
+
+ ctx.lineWidth = 1;
+
+ // A little triangle to point to the location within the animation loop.
+ // This value is in radians, in [0,2pi).
+
+ // Location of indicator triangle around the perimeter of the circle.
+ // Minus so that it travels clock-wise, which seems to be our natural expectation.
+ var loc = -2*Math.PI * this.curStep / this.steps;
+
+ var triHeight = 10;
+
+ // This is half the full angle at the outer point.
+ var triAngle = Math.PI/20;
+
+ p = new Path2D();
+
+ var x = cx + (r-circWidth/2) * Math.cos(loc);
+ var y = cy + (r-circWidth/2) * Math.sin(loc);
+ p.moveTo(x,y);
+
+ x = cx + (r-triHeight) * Math.cos(loc + triAngle);
+ y = cy + (r-triHeight) * Math.sin(loc + triAngle);
+ p.lineTo(x,y);
+
+ x = cx + (r-triHeight) * Math.cos(loc - triAngle);
+ y = cy + (r-triHeight) * Math.sin(loc - triAngle);
+ p.lineTo(x,y);
+
+ p.closePath();
+
+ ctx.strokeStyle = "red";
+ ctx.stroke(p);
+ ctx.strokeStyle = "black";
+ }
+
+ // Next, some controls at the bottom for going faster/slower and
+ // pausing/running.
+ // First, a pair of '>' for going faster.
+ let arrowOffset = 18;
+ let lowerGap = 6;
+ let arrowHeight = 7;
+ let arrowDepth = 4;
+ let arrowPairSpace = 3;
+ let arrowThick = 1.25;
+
+ if (this.visFastSlow === true)
+ {
+ ctx.lineWidth = arrowThick;
+
+ if (this.sFaster == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx + arrowOffset + arrowDepth,
+ cy - r - circWidth/2 - lowerGap - arrowHeight);
+ p.lineTo(cx + arrowOffset,
+ cy - r - circWidth/2 - lowerGap - 2*arrowHeight);
+ ctx.stroke(p);
+
+ // You can't just shift a path. Needs to be rebuilt.
+ // BUG: I need to add that ability to my FPath class.
+ // Maybe I have already?
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset + arrowPairSpace,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx + arrowOffset + arrowDepth + arrowPairSpace,
+ cy - r - circWidth/2 - lowerGap - arrowHeight);
+ p.lineTo(cx + arrowOffset + arrowPairSpace,
+ cy - r - circWidth/2 - lowerGap - 2*arrowHeight);
+ ctx.stroke(p);
+
+ // A rectangle for the clickable area.
+ this.pFaster = new Path2D();
+ this.pFaster.rect(cx + arrowOffset - arrowThick,cy - r - circWidth/2 - lowerGap - 2*arrowHeight,
+ arrowPairSpace + arrowDepth + 2*arrowThick,2*arrowHeight);
+
+ // ctx.strokeStyle = 'green';
+ // ctx.stroke(this.pFaster);
+
+ // Same idea: '<' to go slower.
+ if (this.sSlower == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx - arrowOffset - arrowDepth,
+ cy - r - circWidth/2 - lowerGap - arrowHeight);
+ p.lineTo(cx - arrowOffset,
+ cy - r - circWidth/2 - lowerGap - 2*arrowHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset - arrowPairSpace,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx - arrowOffset - arrowDepth - arrowPairSpace,
+ cy - r - circWidth/2 - lowerGap - arrowHeight);
+ p.lineTo(cx - arrowOffset - arrowPairSpace,
+ cy - r - circWidth/2 - lowerGap - 2*arrowHeight);
+ ctx.stroke(p);
+
+ // And the clickable area.
+ this.pSlower = new Path2D();
+ this.pSlower.rect(
+ cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick,
+ cy - r - circWidth/2 - lowerGap - 2*arrowHeight,
+ arrowPairSpace + arrowDepth + 2*arrowThick,2*arrowHeight);
+
+ // ctx.strokeStyle = 'green';
+ // ctx.stroke(this.pSlower);
+ }
+
+ ctx.lineWidth = 1;
+
+ if (this.visPauseRun === true)
+ {
+ // A || or triangle for pause or run.
+ let pauseSpace = 3.25;
+ let pauseThick = 1.5;
+ let pauseHeight = 2 * arrowHeight;
+
+ let runThick = 1.5;
+ let runLeftRight = 5;
+ let runHeight = 2 * arrowHeight;
+
+ if (this.sPauseRun == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ if (this.aRunning === true)
+ {
+ // The animation is running, so show || to allow pausing.
+ ctx.lineWidth = pauseThick;
+
+ p = new Path2D();
+ p.moveTo(cx + pauseSpace,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx + pauseSpace,cy - r - circWidth/2 - lowerGap - pauseHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx - pauseSpace,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx - pauseSpace,cy - r - circWidth/2 - lowerGap - pauseHeight);
+ ctx.stroke(p);
+
+ ctx.lineWidth = 1;
+ }
+ else
+ {
+ // Animation is paused, so show triangle to run it again.
+ ctx.lineWidth = runThick;
+
+ p = new Path2D();
+ p.moveTo(cx - runLeftRight,cy - r - circWidth/2 - lowerGap);
+ p.lineTo(cx - runLeftRight,cy - r - circWidth/2 - lowerGap - runHeight);
+ p.lineTo(cx + runLeftRight,cy - r - circWidth/2 - lowerGap - runHeight/2);
+ p.closePath();
+ ctx.stroke(p);
+ }
+
+ // Either way (paused or running), we need the clickable area.
+ // This area is too generous for the "run" triangle, because
+ // I use the same rectangle for "pause" and "run," but no big deal.
+ this.pPauseRun = new Path2D();
+ this.pPauseRun.rect(cx - runLeftRight - runThick,
+ cy - r - circWidth/2 - lowerGap - runHeight - runThick,
+ 2*runLeftRight + 2*runThick,runHeight + 2*runThick);
+
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pPauseRun);
+ // ctx.strokeStyle = "black";
+ }
+
+ ctx.lineWidth = 1;
+
+ // Now some symbols above the circle for adjusting the step size.
+
+ if (this.visSteps === true)
+ {
+ // Up and down arrows.
+ let stepSpace = 20;
+ let stepThick = 2.0;
+ let upperGap = 8;
+ let stepHeight = 15;
+ let stepArrowHeight = 8;
+ let stepArrowWidth = 5;
+
+ ctx.lineWidth = stepThick;
+
+ if (this.sDownStep == true)
+ {
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ ctx.fillStyle = LoopAnimWidget.sColor;
+ }
+ else
+ {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+
+ // Vertical line
+ p = new Path2D();
+ p.moveTo(cx - stepSpace,cy + r + circWidth/2 + upperGap);
+ p.lineTo(cx - stepSpace,cy + r + circWidth/2 + upperGap + stepHeight);
+ ctx.stroke(p);
+
+ // Arrow head
+ p = new Path2D();
+ p.moveTo(cx - stepSpace,
+ cy + r + circWidth/2 + upperGap - stepThick);
+ p.lineTo(cx - stepSpace + stepArrowWidth,
+ cy + r + circWidth/2 + upperGap + stepArrowHeight - stepThick);
+ p.lineTo(cx - stepSpace - stepArrowWidth,
+ cy + r + circWidth/2 + upperGap + stepArrowHeight - stepThick);
+ p.closePath();
+ ctx.fill(p);
+
+ // Clickable area for down arrow.
+ this.pDownStep = new Path2D();
+ this.pDownStep.rect(cx - stepSpace - stepArrowWidth,
+ cy + r + circWidth/2 + upperGap - stepThick,
+ 2*stepArrowWidth,stepHeight + stepThick);
+
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pDownStep);
+ // ctx.strokeStyle = "black";
+ // ctx.lineWidth = stepThick;
+
+ // Again, to the right, arrow head up.
+ if (this.sUpStep == true)
+ {
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ ctx.fillStyle = LoopAnimWidget.sColor;
+ }
+ else
+ {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+
+ p = new Path2D();
+ p.moveTo(cx + stepSpace,cy + r + circWidth/2 + upperGap);
+ p.lineTo(cx + stepSpace,cy + r + circWidth/2 + upperGap + stepHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx + stepSpace,
+ cy + r + circWidth/2 + upperGap + stepHeight + stepThick);
+ p.lineTo(cx + stepSpace + stepArrowWidth,
+ cy + r + circWidth/2 + upperGap + stepHeight - stepArrowHeight + stepThick);
+ p.lineTo(cx + stepSpace - stepArrowWidth,
+ cy + r + circWidth/2 + upperGap + stepHeight - stepArrowHeight + stepThick);
+ p.closePath();
+ ctx.fill(p);
+
+ // Clickable area for up arrow.
+ this.pUpStep = new Path2D();
+ this.pUpStep.rect(cx + stepSpace - stepArrowWidth,
+ cy + r + circWidth/2 + upperGap,
+ 2*stepArrowWidth,stepHeight + stepThick);
+
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pUpStep);
+ // ctx.strokeStyle = "black";
+
+ ctx.lineWidth = 1;
+
+ // A little step icon.
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ stepThick = 1.5;
+ let stepSize = 6;
+
+ ctx.lineWidth = stepThick;
+
+ // Steps made as one path, starting at upper-left
+ p = new Path2D();
+ p.moveTo(cx - stepSize,cy + r + circWidth/2 + upperGap + 2*stepSize);
+ p.lineTo(cx,cy + r + circWidth/2 + upperGap + 2*stepSize);
+ p.lineTo(cx,cy + r + circWidth/2 + upperGap + stepSize);
+ p.lineTo(cx + stepSize,cy + r + circWidth/2 + upperGap + stepSize);
+ p.lineTo(cx + stepSize,cy + r + circWidth/2 + upperGap);
+ ctx.stroke(p);
+ }
+
+ ctx.lineWidth = 1;
+
+ // Used this to verify the constants. The rectangle barely encloses
+ // the widget.
+ //ctx.strokeRect(
+ // -LoopWidget.Radius,-LoopWidget.Radius - LoopWidget.TopHeight,
+ // 2*LoopWidget.Radius,
+ // 2*LoopWidget.Radius + LoopWidget.TopHeight + LoopWidget.BottomHeight);
+
+ ctx.setTransform(saveT);
+ }
+
+ mouseDown(x : number , y : number ) : boolean {
+
+ // (x,y) is given in coordinates relative to the owning figure.
+ // Return true iff these coordinates apply to this widget.
+ if (this.hide === true)
+ return false;
+
+ // Adjust coordinates relative to what the draw() methods uses.
+ // This way we can compare (x,y) to what is on the screen.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+
+ // There is isPointInPath() and isPointInStroke().
+ // It seems that isPointInPath() works on an abstract geometric basis;
+ // the lineWidth of the ctx doesn't matter. OTOH, isPointInStroke()
+ // is affected by the lineWidth -- as it must be to work in any
+ // reasonable way.
+ //
+ // Note also that isPointInPath() defaults to the non-zero winding rule.
+ // Pass "evenodd" as the final argument for that winding rule.
+
+ // Check the pause/run area first since it should be "on top of"
+ // the circle area.
+ if (this.pPauseRun !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);
+ if (isin === true)
+ {
+ this.sPauseRun = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // And the run faster area.
+ if (this.pFaster !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);
+ if (isin === true)
+ {
+ this.sFaster = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The run slower area.
+ if (this.pSlower !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);
+ if (isin === true)
+ {
+ this.sSlower = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The longer step area.
+ if (this.pUpStep !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);
+ if (isin === true)
+ {
+ this.sUpStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The shorter step area.
+ if (this.pDownStep !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);
+ if (isin === true)
+ {
+ this.sDownStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // Last thing to check since it should be "underneath" everything.
+ if (this.pCircle !== null)
+ {
+ // If the user clicked near the circle, then set the indicator and
+ // current step to that position. Be generous with the clickable area.
+ WidgetManager.bogusCtx.lineWidth = 15;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pCircle,x,y);
+
+ if (isin === true)
+ {
+ // Act on this click and take ownership for future draggging.
+ // Want an angle in [0,2pi].
+ this.sCircle = true;
+
+ // Again, minus since clockwise.
+ let alpha = -Math.atan2(y,x);
+ if (alpha < 0)
+ alpha += 2*Math.PI;
+
+ this.curStep = Math.floor(this.steps * alpha / (2*Math.PI));
+
+ WidgetManager.mouseOwner = this;
+
+ // The appearance of the widget has changed.
+ renderFrame(this);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ mouseMove(x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+
+ if (this.sCircle === true)
+ {
+ // What I will do it check that the mouse is "close enough" to the
+ // circle, but it can be a *long* ways away.
+ WidgetManager.bogusCtx.lineWidth = 40;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pCircle !,x,y);
+
+ if (isin == false)
+ return;
+
+ // Minus to make clockwise.
+ let alpha = -Math.atan2(y,x);
+ if (alpha < 0)
+ alpha += 2*Math.PI;
+
+ this.curStep = Math.floor(this.steps * alpha / (2*Math.PI));
+
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+
+ // BUG: I might (?) want colors to change based on what the mouse
+ // is over. See the BUG comment that goes with aRunning, sCircle, etc.,
+ // at the top of the class.
+ }
+
+ mouseUp(x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+
+ // The mouse is up, so nothing can remain selected. In most cases,
+ // releasing the mouse over the selected item means that something
+ // must be done since the "button" was properly pressed.
+ this.sCircle = false;
+
+ if (this.sPauseRun)
+ {
+ // Did they *release* the mouse over the pause/run area?
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun ! ,x,y);
+ if (isin === true)
+ {
+ // Start/stop the animation.
+ if (this.aRunning === true)
+ // Currently running. Pause it.
+ clearInterval(this.animID);
+ else
+ // Currently paused. Restart it.
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+
+ // Change the pause/run icon too.
+ if (this.aRunning === true)
+ this.aRunning = false;
+ else
+ this.aRunning = true;
+ }
+
+ this.sPauseRun = false;
+ }
+
+ if (this.sFaster === true)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster ! ,x,y);
+ if (isin === true)
+ {
+ // Make the animation run a bit faster by reducing the frame-to-
+ // frame time step -- the animation speed. This could be done in
+ // a lot of different ways, by using a factor of 1.4 seems about
+ // right.
+ this.timeStep /= 1.4;
+ if (this.timeStep < 1)
+ this.timeStep = 1;
+
+ // Stop the animation and restart it at the new speed,
+ // but only if it is currently running. It restarts always, but
+ // don't try to halt it if it's not running.
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+ this.aRunning = true;
+ }
+
+ this.sFaster = false;
+ }
+
+ if (this.sSlower === true)
+ {
+ // Just as above, but make it go slower.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower ! ,x,y);
+ if (isin === true)
+ {
+ this.timeStep *= 1.4;
+
+ // More than a second per frame is silly.
+ if (this.timeStep > 1000)
+ this.timeStep = 1000;
+
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+ this.aRunning = true;
+ }
+
+ this.sSlower = false;
+ }
+
+ if (this.sUpStep === true)
+ {
+ // Make the number of time increments per frame larger.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep ! ,x,y);
+ if (isin === true)
+ {
+ // Use a smaller ratio here. Conceptually, it seems like
+ // this should be an integer, but it really doesn't have to be.
+ this.stepsPerFrame *= 1.25;
+
+ // Fewer than 3 frames per cycle seems silly. For most animations,
+ // you'd proably want at least 10 or 20, at a minimum.
+ if (this.stepsPerFrame > this.steps / 3)
+ this.stepsPerFrame = this.steps / 3;
+ }
+
+ this.sUpStep = false;
+ }
+
+ if (this.sDownStep === true)
+ {
+ // As above.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep ! ,x,y);
+ if (isin === true)
+ {
+ this.stepsPerFrame /= 1.25;
+
+ // I am tempted to put a lower bound on this, but it's 'not
+ // absolutely necessary.
+ }
+
+ this.sDownStep = false;
+ }
+
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+
+ }
+}
+
+
+// An OpenAnimWidget is for an open-ended animation that doesn't loop back
+// on itself and repeat. In many respects, it's similar to a LoopWidget.
+// It looks different because it's a long bar, sort of like a scroll bar.
+// It's so similar that there are minimal (for me) comments. See
+// LoopWidgets for certain details.
+
+class OpenAnimWidget extends AnimationWidget {
+
+ // These are useful to the user to help properly place things.
+ // The widget is placed based on the lower-left corner, and the
+ // user can specify the width. The BarHeight is the height of the
+ // bar portion -- it's essentially the radius of the indicator dot --
+ // and ControlsHeight is for the controls.
+ static BarHeight = 6.0;
+ static ControlsHeight = 20.0;
+
+ // This is useful to help the user place stuff above the control.
+ static TotalHeight = 32.0;
+
+
+ // When things are "selected," draw them in this color.
+ static sColor = "blue";
+
+ // These things are important to the animation drawing code, and are
+ // meant to be public(ish).
+
+ // These are as passed to register().
+ barLength = 100;
+ timeStep = 25;
+ decay = 1.0001;
+ visSteps = true;
+ visFastSlow = true;
+ visPauseRun = true;
+ visBar = true;
+ barGrab = true;
+
+ // As for LoopWidth, width modest changes:
+
+ // Clickable areas:
+ pBar : Path2D | null = null;
+ pDot : Path2D | null = null;
+ pFaster : Path2D | null = null;
+ pSlower : Path2D | null = null;
+ pPauseRun : Path2D | null = null;
+ pUpStep : Path2D | null = null;
+ pDownStep : Path2D | null = null;
+
+ // States of parts:
+ //
+ // BUG: If I want to get *really* fancy, then I need another set of
+ // flags to indicate that the mouse *was* clicked on something, so it
+ // is "selected," but the user moved the mouse away from the item without
+ // a mouse-up, so that selected item should be drawn in normal color, not
+ // the highlighted color (sColor). If the mouse is moved back over the
+ // selected item, then the color can go back to being the selection color.
+ aRunning = true;
+ sDot = false;
+ sFaster = false;
+ sSlower = false;
+ sPauseRun = false;
+ sUpStep = false;
+ sDownStep = false;
+
+
+ static register(ctx : CanvasRenderingContext2D , x : number , y : number ,scale : number ,
+ width : number , visWidget : boolean , timeStep : number , decay : number ,
+ visSteps : boolean , visFastSlow : boolean , visPauseRun : boolean ,visBar : boolean ,
+ barGrab : boolean , name : string ) : OpenAnimWidget {
+
+ // This is used something like a constructor. It either creates a new
+ // LoopWidget and returns it, or returns one that was created earlier.
+
+ // Many of these arguments are the same as for Widget.constructor().
+ // In addition, we have
+ // * ctx is assumed to have a t-matrix prepared to properly draw
+ // the widget.
+ // * width is the length of the indicator bar. If you want both the
+ // controls (time steps and fast/slow), then this should be at least
+ // 200 so that the controls don't stick out. Of course, this is the
+ // unscaled size, and you can make the entire thing smaller with the
+ // scale argument.
+ // * timeStep, in milliseconds, is the time from frame to frame.
+ // * decay is complicated. The value of this.curStep must be mapped to
+ // the linear bar, which is not infinite.
+ // We need a map from [0,infty) to [0,width). Define
+ // f(s) = 1 - 1/a^s
+ // This maps [0,infty) to [0,1), provided that a > 1. Then
+ // g(s) = w f(s)
+ // is the function we want. But what about a? The closer a is to 1,
+ // the faster g(s) will approach w. Typically, you'll want a to be
+ // something like 1.001 or 1.0001, depending on the number of steps
+ // in your animation. The decay argment determines a:
+ // a = 1 + 1/decay, so you'll usually want decay to be somewhere in the
+ // range from 100 to (maybe) 100,000. It depends how big the steps
+ // are and how long you want the animiation to run. For comparison,
+ // decay = 1,000 puts f(2000) = 0.86 and f(5000) = 0.99, while
+ // decay = 10,000 puts f(2000) = 0.18, f(5000) = 0.39,
+ // f(20,000) = 0.86. You can also work backwards. If you want
+ // f(n) = x, where x is in [0,1), like x = 85%, then you want
+ // 1 / (1 + 1/a)^n = x, or
+ // a = 1 / [ x^(1/n) - 1 ]
+ // That's not so informative, but you can write it as
+ // a = 1 / [ exp(-ln(x)/n) - 1 ]
+ // If we take x \approx 0.86 so that ln(x) = -0.15 (exactly), then
+ // a = 1 / [ exp(-0.15/n) - 1 ]
+ // Plug in the value for n at which you want to have reached the
+ // 86% level, and you get a.
+ // For brevity, in the code, I use this.decay as the value, a,
+ // discussed above.
+ // BUG: I feel like I made an algebra mistake, but that's the idea.
+ // * visWidget is whether the widget is visible at all -- same as the
+ // vis argument to Widget.construtor().
+ // * visSteps is whether the time step controls (at the right) are visible.
+ // * visFastSlow is whether the faster/slower controls are visible (at
+ // the left)
+ // * visPauseRun is whether the pause/run controls are visible.
+ // * visBar is for the progress bar (with dot indicator).
+ // * barGrab is whether the user is allowed to grab the dot indicator
+ // triangle and control the animation by dragging it.
+ // * name is as in Widget.constructor()
+ //
+ // BUG: Maybe I should have different classes for some of these choices.
+ // There are just too many. These could all use (internally) the
+ // same class, just not with such a crazy number of options.
+
+
+ // As for LoopWidget.
+ let type = "OpenAnimWidget";
+ let caller = getCaller();
+
+ let w : OpenAnimWidget = <OpenAnimWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ w.draw(ctx);
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ w = new OpenAnimWidget(caller,type,x,y,scale,!visWidget,name);
+
+ // Adjust the length for the scale so that if the user asks for
+ // a bar that is X px long, he gets it. So, the scale adjusts the size
+ // of the "bits", not the total size.
+ w.barLength = width / scale;
+ w.timeStep = timeStep;
+ w.visSteps = visSteps;
+ w.visFastSlow = visFastSlow;
+ w.visPauseRun = visPauseRun;
+ w.visBar = visBar;
+ w.barGrab = barGrab;
+
+ // For internal use, we convert the given decay to the value we use
+ // for exponentiation.
+ w.decay = 1 + 1/decay;
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ // This is a special case because it's an animiation, as with LoopWidget.
+ w.animID = setInterval(doAnimation,w.timeStep,w);
+
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+
+ return w;
+ }
+
+ advanceFrame() : void {
+
+ // This animation is open-ended; curStep grows without limit (up to
+ // E500 or whatever it is).
+ this.curStep += this.stepsPerFrame;
+ }
+
+ draw(ctx : CanvasRenderingContext2D ) : void {
+
+ // This is drawn with (0,0) at the lower-right corner.
+ if (this.hide === true)
+ return;
+
+ // Don't draw the widget to a tikz file.
+ if (ctx instanceof CTX)
+ return;
+
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX,this.widgetY);
+ ctx.scale(this.scale,this.scale);
+
+ var p = new Path2D();
+
+ if (this.visBar == true)
+ {
+ // These *could* be made accessible to the user, but we already
+ // have a heap of arguments to create this thing.
+ let indDotRadius = 5.0;
+ let barThick = 3.0;
+ let indDotThick = 2.0;
+
+ // Draw the indicator bar and dot.
+ // Bar first.
+ p.moveTo(0,indDotRadius + OpenAnimWidget.ControlsHeight);
+ p.lineTo(this.barLength,indDotRadius + OpenAnimWidget.ControlsHeight);
+
+ // Note this circle for reference by mouse events.
+ if (this.barGrab === true)
+ this.pBar = new Path2D(p);
+
+ ctx.lineWidth = barThick;
+
+ ctx.stroke(p);
+
+ // Now the dot.
+ p = new Path2D();
+
+ let dx = Math.pow(this.decay,this.curStep);
+
+ dx = this.barLength * (1 - 1/dx);
+ p.ellipse(dx,indDotRadius + OpenAnimWidget.ControlsHeight,
+ indDotRadius,indDotRadius,0,0,2*Math.PI);
+
+ if (this.barGrab === true)
+ this.pDot = new Path2D(p);
+
+ if (this.sDot == true)
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ else
+ ctx.fillStyle = "red";
+
+ ctx.fill(p);
+
+ ctx.lineWidth = indDotThick;
+ ctx.strokeStyle = "black";
+ ctx.stroke(p);
+ }
+
+ // There may be controls under the bar for faster/slower, pause/run
+ // and larger/smaller steps. Whatever of these is present, they should be
+ // centered, which is a pain. The total width of the pause/run controls
+ // is 40.5, obtained by checking the size of the box necessary to
+ // exactly enclose the controls. Height of that box is 14. I've set
+ // things up so that the height of the "step size" controls is also 14,
+ // and the width of that part is 32. These *could* be expressed in
+ // terms of the various constants defined below, but hard-coding is
+ // easier.
+ // These controls are drawn relative to their individual centers,
+ // so the shifting is done relative to those centers and their widths.
+ let pauseRunWidth = 40;
+ let stepsWidth = 32;
+ let intraGap = 8;
+
+ // Here (compared to LoopWidget), I use cx and cy to shift the parts
+ // of the control down and right. The right-shift is used for centering
+ // Changing the t-matrix of ctx would work too.
+ let cy = OpenAnimWidget.BarHeight - 4;
+ let cx = this.barLength / 2;
+
+ // We position the right bit, based on whether the left bit is present.
+ if (this.visSteps === true)
+ cx += intraGap + (pauseRunWidth / 2);
+
+ // Used for both fast/slow "chevrons" and for up/down arrows.
+ let arrowHeight = 7;
+
+ if (this.visFastSlow === true)
+ {
+
+ // I made this a little tighter than for LoopWidget.
+ let arrowOffset = 12;//18;
+ let arrowDepth = 4;
+ let arrowPairSpace = 3;
+ let arrowThick = 1.25;
+
+ // First, a pair of '>' for going faster.
+ ctx.lineWidth = arrowThick;
+
+ if (this.sFaster == true)
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset, cy);
+ p.lineTo(cx + arrowOffset + arrowDepth,cy + arrowHeight);
+ p.lineTo(cx + arrowOffset,cy + 2*arrowHeight);
+ ctx.stroke(p);
+
+ // You can't just shift a path. Needs to be rebuilt.
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset + arrowPairSpace,cy);
+ p.lineTo(cx + arrowOffset + arrowDepth + arrowPairSpace,
+ cy + arrowHeight);
+ p.lineTo(cx + arrowOffset + arrowPairSpace,cy + 2*arrowHeight);
+ ctx.stroke(p);
+
+ // A rectangle for the clickable area.
+ this.pFaster = new Path2D();
+ this.pFaster.rect(cx + arrowOffset - arrowThick,cy,
+ arrowPairSpace + arrowDepth + 2*arrowThick,2*arrowHeight);
+
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "green";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pFaster);
+ ctx.strokeStyle = "black";
+ ctx.lineWidth = arrowThick;
+ */
+
+ // Same idea: '<' to go slower.
+ if (this.sSlower == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset,cy);
+ p.lineTo(cx - arrowOffset - arrowDepth,cy + arrowHeight);
+ p.lineTo(cx - arrowOffset,cy + 2*arrowHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset - arrowPairSpace,cy);
+ p.lineTo(cx - arrowOffset - arrowDepth - arrowPairSpace,cy + arrowHeight);
+ p.lineTo(cx - arrowOffset - arrowPairSpace,cy + 2*arrowHeight);
+ ctx.stroke(p);
+
+ // And the clickable area.
+ this.pSlower = new Path2D();
+ this.pSlower.rect(cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick,
+ cy,arrowPairSpace + arrowDepth + 2*arrowThick,2*arrowHeight);
+
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "yellow";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pSlower);
+ ctx.strokeStyle = "black";
+ */
+
+ /*
+ // BUG: test box around entire thing.
+ p = new Path2D();
+ p.rect(cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick,cy,
+ 2*(arrowOffset + arrowPairSpace + arrowDepth + arrowThick),
+ 2*arrowHeight);
+
+ //let temp = 2*(arrowOffset + arrowPairSpace + arrowDepth + arrowThick);
+ //console.log("val: " +temp);
+
+ ctx.strokeStyle = "red";
+ ctx.stroke(p);
+ */
+
+ ctx.strokeStyle = "black";
+ }
+
+ ctx.lineWidth = 1;
+
+ if (this.visPauseRun === true)
+ {
+ // A || or triangle for pause or run.
+
+ let pauseSpace = 3.25;
+ let pauseThick = 1.5;
+ let pauseHeight = 2 * arrowHeight;
+
+ let runThick = 1.5;
+ let runLeftRight = 5;
+ let runHeight = 2 * arrowHeight;
+
+ if (this.sPauseRun == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+
+ if (this.aRunning === true)
+ {
+ // The animation is running, so show || to allow pausing.
+ ctx.lineWidth = pauseThick;
+
+ p = new Path2D();
+ p.moveTo(cx + pauseSpace,cy);
+ p.lineTo(cx + pauseSpace,cy + pauseHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx - pauseSpace,cy);
+ p.lineTo(cx - pauseSpace,cy + pauseHeight);
+ ctx.stroke(p);
+
+ ctx.lineWidth = 1;
+ }
+ else
+ {
+ // Animation is paused, so show triangle to run it again.
+ ctx.lineWidth = runThick;
+
+ p = new Path2D();
+ p.moveTo(cx - runLeftRight,cy);
+ p.lineTo(cx - runLeftRight,cy + runHeight);
+ p.lineTo(cx + runLeftRight,cy + runHeight/2);
+ p.closePath();
+ ctx.stroke(p);
+ }
+
+ // Either way (paused or running), we need the clickable area.
+ // This area is too generous for the "run" triangle, because
+ // I use the same rectangle for "pause" and "run," but no big deal.
+ this.pPauseRun = new Path2D();
+ this.pPauseRun.rect(cx - runLeftRight - runThick,
+ cy - runThick,2*runLeftRight + 2*runThick,runHeight + 2*runThick);
+
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pPauseRun);
+ ctx.strokeStyle = "black";
+ */
+ }
+
+ // And position the left controls, based on whether the ones on
+ // the right are present.
+ cy += 12.5;
+ cx = this.barLength / 2;
+ if ((this.visPauseRun === true) || (this.visFastSlow === true))
+ cx -= intraGap + stepsWidth/2;
+
+ ctx.lineWidth = 1;
+
+ // Symbols for adjusting the step size.
+ if (this.visSteps === true)
+ {
+ // Up and down arrows. This is a little smaller than for LoopWidget,
+ // so that the height matches the paure/run controls. I also
+ // tightened up the spacing a bit.
+ // Note that I am also using stepThick as a proxy for adjustment
+ // of the fact that the tip of the arrow head is a little tall.
+ let stepSpace = 12;
+ let stepThick = 2.0;
+ let stepHeight = 12.5;
+ let stepArrowHeight = 5.0;
+ let stepArrowWidth = 4.0;
+
+ ctx.lineWidth = stepThick;
+
+ if (this.sDownStep === true)
+ {
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ }
+ else
+ {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+
+ // Vertical line
+ p = new Path2D();
+ p.moveTo(cx - stepSpace,cy);
+ p.lineTo(cx - stepSpace,cy- stepHeight);
+ ctx.stroke(p);
+
+ // Arrow head
+ p = new Path2D();
+ p.moveTo(cx - stepSpace,cy + stepThick);
+ p.lineTo(cx - stepSpace + stepArrowWidth,cy - stepArrowHeight + stepThick);
+ p.lineTo(cx - stepSpace - stepArrowWidth,cy - stepArrowHeight + stepThick);
+ p.closePath();
+ ctx.fill(p);
+
+ // Clickable area for down arrow.
+ this.pDownStep = new Path2D();
+ this.pDownStep.rect(cx - stepSpace - stepArrowWidth,cy - stepHeight,
+ 2*stepArrowWidth,stepHeight + stepThick);
+
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pDownStep);
+ ctx.strokeStyle = "black";
+ ctx.lineWidth = stepThick;
+ */
+
+ // Again, to the right, arrow head up.
+ if (this.sUpStep === true)
+ {
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ }
+ else
+ {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+
+ p = new Path2D();
+ p.moveTo(cx + stepSpace,cy + stepThick);
+ p.lineTo(cx + stepSpace,cy + stepThick - stepHeight);
+ ctx.stroke(p);
+
+ p = new Path2D();
+ p.moveTo(cx + stepSpace,cy - stepHeight);
+ p.lineTo(cx + stepSpace + stepArrowWidth,
+ cy - stepHeight + stepArrowHeight);
+ p.lineTo(cx + stepSpace - stepArrowWidth,
+ cy - stepHeight + stepArrowHeight);
+ p.closePath();
+ ctx.fill(p);
+
+ // Clickable area for up arrow.
+ this.pUpStep = new Path2D();
+ this.pUpStep.rect(cx + stepSpace - stepArrowWidth,
+ cy - stepHeight,
+ 2*stepArrowWidth,stepHeight + stepThick);
+
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pUpStep);
+ ctx.strokeStyle = "black";
+ */
+
+ ctx.lineWidth = 1;
+
+ // A little step icon.
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ stepThick = 1.5;
+ let stepSize = 5;
+
+ ctx.lineWidth = stepThick;
+
+ // Steps made as one path, starting at upper-left
+ p = new Path2D();
+ p.moveTo(cx - stepSize,cy - 2*stepSize);
+ p.lineTo(cx,cy - 2*stepSize);
+ p.lineTo(cx,cy - stepSize);
+ p.lineTo(cx + stepSize,cy - stepSize);
+ p.lineTo(cx + stepSize,cy);
+ ctx.stroke(p);
+
+ /*
+ // BUG: Testing box around it all.
+ p = new Path2D();
+ p.rect(cx - stepSpace - stepArrowWidth,cy - stepHeight,
+ 2*(stepSpace + stepArrowWidth),
+ stepHeight + stepThick);
+
+ ctx.strokeStyle = "red";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(p);
+
+ //let temp = 2*(stepSpace + stepArrowWidth);
+ //let temp = stepHeight + stepThick;
+ //console.log("val: " + temp);
+ */
+
+ ctx.strokeStyle = "black";
+
+ }
+
+ ctx.lineWidth = 1;
+
+ ctx.setTransform(saveT);
+ }
+
+ mouseDown( x : number , y : number ) : boolean {
+
+ // (x,y) is given in coordinates relative to the owning figure.
+ // Return true iff these coordinates apply to this widget.
+ // BUG: This is almost identical to LoopWidget. DRY?
+ if (this.hide === true)
+ return false;
+
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+
+ // The run faster area.
+ if (this.pFaster !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);
+ if (isin === true)
+ {
+ this.sFaster = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The run slower area.
+ if (this.pSlower !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);
+ if (isin === true)
+ {
+ this.sSlower = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+
+ // The pause/run area.
+ if (this.pPauseRun !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);
+ if (isin === true)
+ {
+ this.sPauseRun = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The longer step area.
+ if (this.pUpStep !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);
+ if (isin === true)
+ {
+ this.sUpStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // The shorter step area.
+ if (this.pDownStep !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);
+ if (isin === true)
+ {
+ this.sDownStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ // Last thing to check since it should be "underneath" everything,
+ // although I don't think there's the same kind of overlap that
+ // there was for LoopWidget.
+ if (this.pDot !== null)
+ {
+ // See whether the user clicked on or near the dot. He must click
+ // on the dot, not at some random point along the bar.
+ WidgetManager.bogusCtx.lineWidth = 2;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pDot,x,y);
+ if (isin === false)
+ isin = WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);
+
+ if (isin === true)
+ {
+ this.sDot = true;
+
+ // Move the dot (slightly) so that it is centered at (x,y).
+ // We don't actually "move the dot;" instead we adjust
+ // this.curStep to put the dot where we want it. That is, we
+ // invert g(s) = w (1-1/a^s). See the discussion, in register(),
+ // of this function. We have
+ // x = w (1 - 1/a^s)
+ // a^s = w / (w - x)
+ // s = log_a [ w / (w - x) ]
+ // And recall that log_a (z) = ln(z) / ln(a).
+ let ratio = this.barLength / (this.barLength - x);
+ let s = Math.log(ratio) / Math.log(this.decay);
+ if (s < 0)
+ s = 0;
+ this.curStep = s;
+
+ WidgetManager.mouseOwner = this;
+
+ renderFrame(this);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ mouseMove( x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+
+ WidgetManager.bogusCtx.resetTransform();
+
+ if (this.sDot === true)
+ {
+ // What I will do it check that the mouse is "close enough" to the
+ // bar, but it can be a long ways away.
+ WidgetManager.bogusCtx.lineWidth = 20;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pBar !,x,y);
+
+ if (isin == false)
+ return;
+
+ let ratio = this.barLength / (this.barLength - x);
+ let s = Math.log(ratio) / Math.log(this.decay);
+ if (s < 0)
+ s = 0;
+ this.curStep = s;
+
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+
+ // BUG: I might (?) want colors to change based on what the mouse
+ // is over. See the BUG comment that goes with aRunning, sCircle, etc.,
+ // at the top of the class.
+ }
+
+ mouseUp( x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+
+ // The mouse is up, so nothing can remain selected. In most cases,
+ // releasing the mouse over the selected item means that something
+ // must be done since the "button" was properly pressed.
+ this.sDot = false;
+
+ if (this.sFaster === true)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster ! ,x,y);
+ if (isin === true)
+ {
+ this.timeStep /= 1.4;
+ if (this.timeStep < 1)
+ this.timeStep = 1;
+
+ // Stop the animation and restart it at the new speed
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+ this.aRunning = true;
+ }
+
+ this.sFaster = false;
+ }
+
+ if (this.sSlower === true)
+ {
+ // Just as above, but make it go slower.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower ! ,x,y);
+ if (isin === true)
+ {
+ this.timeStep *= 1.4;
+
+ // More than a second per frame is silly.
+ if (this.timeStep > 1000)
+ this.timeStep = 1000;
+
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+ this.aRunning = true;
+ }
+
+ this.sSlower = false;
+ }
+
+ if (this.sPauseRun)
+ {
+ // Did they *release* the mouse over the pause/run area?
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun ! ,x,y);
+ if (isin === true)
+ {
+ // Start/stop the animation.
+ if (this.aRunning === true)
+ // Currently running. Pause it.
+ clearInterval(this.animID);
+ else
+ // Currently paused. Restart it.
+ this.animID = setInterval(doAnimation,this.timeStep,this);
+
+ // Change the pause/run icon too.
+ if (this.aRunning === true)
+ this.aRunning = false;
+ else
+ this.aRunning = true;
+ }
+
+ this.sPauseRun = false;
+ }
+
+ if (this.sUpStep === true)
+ {
+ // Make the number of time increments per frame larger.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep ! ,x,y);
+ if (isin === true)
+ {
+ // Use a smaller ratio here. Conceptually, it seems like
+ // this should be an integer, but it really doesn't have to be.
+ // Unlike LoopWidget, there's no upper limit on the number
+ // of steps per frame.
+ this.stepsPerFrame *= 1.25;
+ }
+
+ this.sUpStep = false;
+ }
+
+ if (this.sDownStep === true)
+ {
+ // As above.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep ! ,x,y);
+ if (isin === true)
+ this.stepsPerFrame /= 1.25;
+
+ this.sDownStep = false;
+ }
+
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+}
+
+
+// This is to allow dragging points around. After the much more complicated
+// animation widgets, this is a lot easier. One difference is that dots
+// are not drawn automatically; the user must call the widget's draw()
+// method. This is because the order of drawing may matter -- what should
+// be on top?
+//
+// At one point, this was more flexible, but -- see DraggableDrawWidget below
+// -- it seems better to keep this widget simple (just dots).
+
+class DraggableDotWidget extends Widget {
+
+ // When things are "selected," draw them in this color.
+ static sColor = "blue";
+
+ // The clickable area for the dot, and whether it is selected.
+ // pDot : Path2D | null = null;
+ pDot : FPath | null = null;
+ selected = false;
+
+ // The default radius of a dot.
+ dotRadius = 3.0;
+
+
+ static register(ctx : CanvasRenderingContext2D , x : number , y : number ,
+ name : string ) : DraggableDotWidget {
+
+ // As with other widgets. Note that there is no scale since it doesn't
+ // make sense here.
+ let type = "DraggableDotWidget";
+ let caller = getCaller();
+ let w = <DraggableDotWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ // The 'false' here means that we always assume the dot is visible. Leting
+ // this be invisible would be pointless, although it is hidable by
+ // directly changing the Widget.hide field.
+ w = new DraggableDotWidget(caller,type,x,y,1.0,false,name);
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ // Note that we do *not* draw this widget here.
+
+ return w;
+ }
+
+ draw(ctx : CanvasRenderingContext2D ) : void {
+
+ // Because these widgets might be drawn for tikz output, this uses
+ // FPath instead of Path2D.
+ //
+ // BUG: As a rule, I don't think people will want most widgets (like
+ // LoopWidget) to be drawn to the paper version, but I suppose it should
+ // be possible. *I* would like it for documentation purposes.
+
+ if (this.hide === true)
+ return;
+
+ // Adjusting the coordinates this way feels a little weird, but it's
+ // how the other widgets work, and it's actually easier.
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX,this.widgetY);
+ ctx.scale(this.scale,this.scale);
+
+ // BUG: Somehow, sometimes using FPath puts hair on these dots??
+ // It looks like it happens where the segments meet. There's probably
+ // some algebra mistake. Either that or the JS implementation of
+ // bezier curves sucks. For now, I do not use bezier curves, and
+ // leave it as an ellipse internally.
+ let p = new FPath();
+ //let p = new Path2D();
+
+ let r = this.dotRadius;
+
+ p.ellipse(0,0,r,r,0,0,2*Math.PI,true);
+
+ //this.pDot = new Path2D(p);
+ // this.pDot = new FPath(p);
+ this.pDot = p;
+
+ if (this.selected === true)
+ ctx.fillStyle = DraggableDotWidget.sColor;
+ else
+ ctx.fillStyle = "red";
+
+ ctx.fill(p);
+
+ ctx.setTransform(saveT);
+ }
+
+ mouseDown(x: number , y : number ) : boolean {
+
+ if (this.hide === true)
+ return false;
+
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+
+ if (this.pDot !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);
+ if (isin === true)
+ {
+ this.selected = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ mouseMove(x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ // Restrict to be within the figure area, at the least.
+ // By default (the code here, not this.drawSelFcn, whatever that might
+ // do), the dot doesn't get "lost," but it can be drawn partially outside
+ // the figure proper, leaving "crumbs" that aren't erased until you
+ // scroll the page.
+ let wh = getFigureRect(this);
+
+ // Rrestrict to the entire figure rectangle, tightened up a bit.
+ wh.w -= 2 * this.dotRadius;
+ wh.ha -= 2 * this.dotRadius;
+ wh.hb -= 2 * this.dotRadius;
+
+ // Note the minus with hb. The "height below" is a postive value, but
+ // we are comparing to a potentially negative y.
+ if (x <= this.dotRadius) return;
+ if (x >= wh.w) return;
+ if (y <= -wh.hb) return;
+ if (y >= wh.ha) return;
+
+ if (this.selected === true)
+ {
+ this.widgetX = x;
+ this.widgetY = y;
+
+ renderFrame(this);
+ }
+ }
+
+ mouseUp( x : number , y : number ) : void {
+
+ if (this.hide === true)
+ return;
+
+ // This is more round-about because of the possibility that the
+ // mouse-up occured outside the figure area. We need to reach
+ // the renderFrame() line whatever happens.
+ if (this.selected === true)
+ {
+ this.selected = false;
+
+ let wh = getFigureRect(this);
+
+ wh.w -= 2 * this.dotRadius;
+ wh.ha -= 2 * this.dotRadius;
+ wh.hb -= 2 * this.dotRadius;
+
+ // Note the minus with hb. The "height below" is a postive value, but
+ // we are comparing to a potentially negative y.
+ if ((x > this.dotRadius) && (x < wh.w) &&
+ // (y > this.dotRadius) && (y < wh.h))
+ (y > -wh.hb) && (y < wh.ha))
+ {
+ this.widgetX = x;
+ this.widgetY = y;
+ }
+
+ renderFrame(this);
+ }
+ }
+}
+
+
+// This is almost idential to DraggableDotWidget, except that
+// there is no default drawing behavior. The user must provide it.
+//
+// Maybe...
+// * The user might want dots to be drawn in different ways, like a solid
+// circle, an open circle with or without a fill of some other color, or
+// even a square "dot."
+// * The motion of the point, when dragging, needs to be restricted to a
+// limited path or region. By default, the point is limited to the entire
+// figure area, but that may not suffice.
+// * To address the two previous points, register() takes functions
+// for drawing the "dot" (which need not be a dot at all), depending
+// on whether the dot is to be drawn in selected form or unselected form.
+
+type SimpleDrawFunction = (ctx : CanvasRenderingContext2D) => FPath;
+type AcceptedDrawLocationFunction = (x : number, y : number, w : number ,
+ ha : number , hb : number) => boolean;
+
+class DraggableDrawWidget extends Widget {
+
+ // When things are "selected," draw them in this color.
+ static sColor = "blue";
+
+ // The clickable area for the "dot" (which could have any shape)
+ // and whether it is selected.
+ pDot : FPath | null = null;
+ selected = false;
+
+ // The user must provide these functions.
+ // Note the litle cheat to make the ts compiler shut its yapper.
+ drawFcn : SimpleDrawFunction = null as any;
+ drawSelFcn : SimpleDrawFunction = null as any;
+ testPosFcn : AcceptedDrawLocationFunction = null as any;
+
+
+ static register(ctx : CanvasRenderingContext2D , x : number , y : number ,
+ drawFcn : SimpleDrawFunction, drawSelFcn : SimpleDrawFunction,
+ testPosFcn : AcceptedDrawLocationFunction , name : string ) : DraggableDrawWidget{
+
+ // The drawFcn should be defined to draw whatevever it wants.
+ // It should take the ctx as the sole argument, and return a path
+ // such that a click in the path (using ctx.isPointInPath()).
+ //
+ // The drawSelFcn is similar, but is used for drawing when the
+ // item is selected -- so that the user can change the color or
+ // whatever.
+ //
+ // The testPosFcn receives (x,y) as an argument, along with the (w,h)
+ // of the figure area (in pdf points) and should return
+ // true (point is acceptable) or false (not acceptable).
+
+ let type = "DraggableDrawWidget";
+ let caller = getCaller();
+ let w = <DraggableDrawWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ // The 'false' here means that we always assume the dot is visible. Leting
+ // this be invisible would be pointless, although it is hidable by
+ // directly changing the Widget.hide field.
+ w = new DraggableDrawWidget(caller,type,x,y,1.0,false,name);
+
+ w.drawFcn = drawFcn;
+ w.drawSelFcn = drawSelFcn;
+ w.testPosFcn = testPosFcn;
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ return w;
+ }
+
+ draw(ctx : CanvasRenderingContext2D ) : void {
+
+ // Because these widgets might be drawn for tikz output, this uses
+ // FPath instead of Path2D.
+ //
+ // BUG: As a rule, I don't think people will want most widgets (like
+ // LoopWidget) to be drawn to the paper version, but I suppose it should
+ // be possible. *I* would like it for documentation purposes.
+ if (this.hide === true)
+ return;
+
+ // Adjusting the coordinates this way feels a little weird, but it's
+ // how the other widgets work, and it's actually easier.
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX,this.widgetY);
+ ctx.scale(this.scale,this.scale);
+
+ if (this.selected === true)
+ this.pDot = this.drawSelFcn(ctx);
+ else
+ this.pDot = this.drawFcn(ctx);
+
+ ctx.setTransform(saveT);
+ }
+
+ mouseDown(x: number , y : number ) : boolean {
+
+ //console.log("dot down");
+
+ if (this.hide === true)
+ return false;
+
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+
+ WidgetManager.bogusCtx.resetTransform();
+
+ if (this.pDot !== null)
+ {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);
+ if (isin === true)
+ {
+ this.selected = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ mouseMove(x : number , y : number ) : void {
+
+ // As above.
+ if (this.hide === true)
+ return;
+
+ // Restrict to be within the figure area, at the least.
+ // By default (the code here, not this.drawSelFcn, whatever that might
+ // do), the dot doesn't get "lost," but it can be drawn partially outside
+ // the figure proper, leaving "crumbs" that aren't erased until you
+ // scroll the page.
+ let wh = getFigureRect(this);
+
+ if (this.testPosFcn(x,y,wh.w,wh.ha,wh.hb) === false)
+ return;
+
+ if (this.selected === true)
+ {
+ this.widgetX = x;
+ this.widgetY = y;
+
+ renderFrame(this);
+ }
+ }
+
+ mouseUp( x : number , y : number ) : void {
+
+ if (this.hide === true)
+ return;
+
+ // This is more round-about because of the possibility that the
+ // mouse-up occured outside the figure area. We need to reach
+ // the renderFrame() line whatever happens.
+ if (this.selected === true)
+ {
+ this.selected = false;
+
+ let wh = getFigureRect(this);
+
+ if (this.testPosFcn(x,y,wh.w,wh.ha,wh.hb) === true)
+ {
+ this.widgetX = x;
+ this.widgetY = y;
+ }
+
+ renderFrame(this);
+ }
+ }
+
+}
+
+
+// A numerical value widget. This uses an HTML <input type = "number">
+// thing by putting it on top of the canvas. Using HTML this way is not the
+// direction I want to go, but I do want to see if it's feasible and what's
+// involved. Certain widgets that already exist in HTML are probably not
+// worth building from scratch as "pure canvas" widgets. Also, this
+// allows me to delay dealing with keyboard events.
+//
+// The idea is to put the HTML widget on top of the canvas, with absolute
+// placement.
+//
+// NOTE: Firefox generates a warning about "ansynchronous panning." Somehow
+// it sees that I'm doing something tricky and warns about it. As far as I
+// can tell, I'm not doing anything likely to be deprecated or problematic
+// in the future. Edge doesn't complain.
+
+class NumberInputWidget extends Widget {
+
+ // An HTML <input type = "number"> thing. This is the HTML DOM element,
+ // like from document.getElementById() or createElement("input").
+ theWidget : HTMLInputElement | null = null;
+
+
+ static register( ctx : CanvasRenderingContext2D , x : number , y : number ,
+ v : number , name : string ) : NumberInputWidget {
+
+ // Even fewer arguments than usual.
+ // v = initial value;
+ let type = "NumberInputWidget";
+ let caller = getCaller();
+ let w = <NumberInputWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ w.draw(ctx);
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ w = new NumberInputWidget(caller,type,x,y,1.0,false,name);
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ // The usual syntax for this within HTML is
+ // <input type="number" id="something" name="whatever" min="10" max="100">
+ // There are some other possible settings too. See
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number
+ //
+ // BUG: There's some funny business here that I don't like at all.
+ // These DOM elements are placed relative to the body as a whole,
+ // not the canvas. So, I need to know where the figure containing
+ // this widget falls on the entire document. The body height is adjusted
+ // when I tweak the scroll bars (mainbody.style.height and width),
+ // and the widget needs to be placed relative to that.
+ //
+ // As a result, every time the user zooms (or resizes the window),
+ // every widget placed in the DOM this way needs to be repositioned.
+ // One reasonable way to deal with that is to recalculate the position
+ // every time draw() is called.
+ //
+ // So this isn't really a BUG; it works as intended. But using
+ // HTML this way is an entirely different (and unpleasant) approach.
+
+ w.theWidget = document.createElement("input");
+ w.theWidget.setAttribute("type","number");
+ w.theWidget.value = v.toString();
+
+ w.theWidget.style.position = "absolute";
+ w.theWidget.style.display = "block";
+ w.theWidget.style.left = 400+"px";
+ w.theWidget.style.top = 900+"px";
+ w.theWidget.style.width = 50+"px";
+ w.theWidget.style.height = 10+"px";
+ w.theWidget.style.zIndex = "99";
+
+ document.body.appendChild(w.theWidget);
+
+ // The owner will want to redraw it's figure when this changes.
+ w.theWidget.onchange = function() {
+
+ // console.log("change");
+
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction( w.owner );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+ fpc.render( );
+ };
+
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+
+ return w;
+ }
+
+ getValue() {
+
+ // Return the numerical value.
+ //
+ // BUG: This seems to return a string -- whatever is in the field.
+ // The caller will typically need to do parseInt() or parseFloat()
+ // on the result. If this widget were better, then it would know
+ // what it's supposed to return and limit the possible things it can hold.
+
+ // BUG: I should probably have getter functions for everything in
+ // all widgets instead of having the user access fields directly.
+ // So, define LoopWidget.getCurStep(), etc.
+ // It doesn't *really* matter, but it makes it clearer to the user
+ // what he's supposed to have access to.
+ return this.theWidget ! .value;
+ }
+
+ draw(ctx : CanvasRenderingContext2D ) : void {
+
+ // This widget is really an HTML DOM element, so this function doesn't
+ // actually draw the widget. It repositions the element in the DOM.
+ // See the discussion in register().
+
+ // BUG: make accessing this information a function, like I did
+ // for getFigureRect().
+
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction( this.owner );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+ let totalV = fpc.totalV;
+
+ // The vertical position is relatively easy, but the horizontal position
+ // requires a calculation similar to fullRender() since the page
+ // is centered. Also, the vertical position must be given in LH coordinates
+ // relative to the entire document.
+ // BUG: Make this calculation a function used in main.js too.
+ // Can I combine with what's done for mouse events there too?
+ // In fact, this is more like the mouse calculation than like fullRender().
+ let vpos = fpc.totalV + fpc.h - this.widgetY;
+ // let vpos = totalV + this.widgetY;
+
+
+ // BUG: I don't like reaching into the DOM this way to get the canvas,
+ // but what is the alternative?
+ let hpos = this.widgetX;
+ let canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+
+ hpos = hpos + (canvasCenter - docCenter);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar.
+ hpos = hpos - window.scrollX;
+ }
+
+ hpos += fpc.margin;
+
+ //console.log("wid at " +hpos+ " " +vpos);
+
+ // Don't forget the stupid "px"!
+ this.theWidget ! .style.top = vpos +"px";
+ this.theWidget ! .style.left = hpos +"px";
+ }
+}
+
+// Another DOM-based widget. A simple button.
+
+class ButtonWidget extends Widget {
+
+ // An HTML <input type = "button"> thing.
+ theWidget : HTMLButtonElement | null = null;
+
+ // Sometimes you want to treat the button as a boolean
+ // Each time the button is clicked, this toggles.
+ clickState = false;
+
+ // And this is set to true whenever the button is clicked.
+ resetState = false;
+
+ static register(ctx : CanvasRenderingContext2D , x : number , y : number ,
+ text : string , name : string ) : Widget {
+
+ // Even fewer arguments than usual.
+ let type = "ButtonWidget";
+ let caller = getCaller();
+ let w = <ButtonWidget> WidgetManager.knownWidget(caller,type,name);
+
+ if (w != null)
+ {
+ w.draw(ctx);
+ return w;
+ }
+
+ // Got here, so this widget is not already known, and must be created.
+ w = new ButtonWidget(caller,type,x,y,1.0,false,name);
+
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+
+ // The usual syntax for this within HTML is
+ // <button type="button" id="something" name="whatever">
+ //
+ // BUG: There's some funny business here that I don't like at all.
+ // These DOM elements are placed relative to the body as a whole,
+ // not the canvas. So, I need to know where the figure containing
+ // this widget falls on the entire document. The body height is adjusted
+ // when I tweak the scroll bars (mainbody.style.height and width),
+ // and the widget needs to be placed relative to that.
+ //
+ // As a result, every time the user zooms (or resizes the window),
+ // every widget placed in the DOM this way needs to be repositioned.
+ // One reasonable way to deal with that is to recalculate the position
+ // every time draw() is called.
+ //
+ // So this isn't really a BUG; it works as intended. But using
+ // HTML this way is an entirely different (and unpleasant) approach.
+
+ w.theWidget = document.createElement("button");
+ w.theWidget.setAttribute("type","button");
+ w.theWidget.style.fontSize = "10px";
+ w.theWidget.textContent = text;
+
+ w.theWidget.style.position = "absolute";
+ w.theWidget.style.display = "block";
+ w.theWidget.style.left = 400+"px";
+ w.theWidget.style.top = 900+"px";
+ //w.theWidget.style.width = 100+"px"; // Width automatic, based on text.
+ w.theWidget.style.height = 18+"px";
+ w.theWidget.style.zIndex = "99";
+
+ document.body.appendChild(w.theWidget);
+
+ // Need to hear about clicks....
+ // BUG: I would have thought that this would work, but I don't think that
+ // the doClick() method is seeing the correct class instance or something.
+ //w.theWidget.addEventListener('click',w.doClick,false);
+
+ // Instead, define the action here.
+ w.theWidget.addEventListener('click',() => {
+
+ if (w.clickState === false)
+ w.clickState = true;
+ else
+ {
+ w.clickState = false;
+ w.resetState = true;
+ }
+
+
+ // If the figure is part of an animation, then it will be drawn taking
+ // into account this click in the next frame. If the figure is *not*
+ // an animation, then we need to refresh.
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction( w.owner );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+ fpc.render();
+ },false);
+
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+
+ return w;
+ }
+
+ doClick() {
+ // BUG: This doesn't work. See above.
+ if (this.clickState === false)
+ this.clickState = true;
+ else
+ this.clickState = false;
+
+ //console.log("swapped click");
+ }
+
+ draw( ctx : CanvasRenderingContext2D ) : void {
+
+ // This widget is really an HTML DOM element, so this function doesn't
+ // actually draw the widget. It repositions the element in the DOM.
+ // See the discussion in register().
+
+ let myFunc : AugmentedDrawingFunction = getAugmentedFunction( this.owner );
+ let fpc : FigurePanel = myFunc.figurePanelClass !;
+
+ // The horizontal position requires a calculation similar to fullRender()
+ // since the page is centered and the vertical position must be given
+ // in LH coordinates relative to the entire document.
+ // BUG: Make this calculation a function used in main.js too.
+ // Can I combine with what's done for mouse events there too?
+ // In fact, this is more like the mouse calculation than like fullRender().
+ let vpos = fpc.totalV + fpc.h - this.widgetY;
+
+ let hpos = this.widgetX;
+ // BUG: Again, with the DOM access.
+ let canvas = <HTMLCanvasElement> document.getElementById("pdf_renderer");
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+
+ if (visWidth > totWidth)
+ {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+
+ hpos = hpos + (canvasCenter - docCenter);
+ }
+ else
+ {
+ // Shift according to the horizontal scroll bar.
+ hpos = hpos - window.scrollX;
+ }
+
+ hpos += fpc.margin;
+
+ // It seems that these must be placed using style.top, not style.bottom.
+ // The clientHeight seems to be the height of the text in the button,
+ // which style.height is the actually button. Don't forget the stupid "px"!
+ let w : HTMLButtonElement = this.theWidget ! ;
+ w.style.top = (vpos - parseInt(w.style.height , 10) ) +"px";
+ w.style.left = hpos +"px";
+ }
+}
+
diff --git a/graphics/figput/javascript/figput.html b/graphics/figput/javascript/figput.html
new file mode 100644
index 0000000000..0f855a6c20
--- /dev/null
+++ b/graphics/figput/javascript/figput.html
@@ -0,0 +1,42 @@
+
+<!doctype html>
+
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>FigPut Viewer</title>
+
+ <!-- The pdf.js stuff, from Mozilla. -->
+ <script src="pdf.js"></script>
+ <script src="pdf.worker.min.js"></script>
+
+ <!-- FigPut code -->
+ <script src="layout.js"></script>
+ <script src="tikz.js"></script>
+ <script src="widgets.js"></script>
+ <script src="main.js"></script>
+
+ <style>
+ /* Put the canvas right up to the edge of the visible area of the window. */
+ body {
+ padding: 0;
+ margin: 0;
+ }
+ </style>
+</head>
+
+
+<!--
+Note that 'unknown1' will be changed to the project's name as this file
+is being served. If the pdf generated by LaTeX is called math.pdf, then
+'unknown1' will become 'math'.
+BEWARE: This works by replacing every occurence of 'unknown1' in this file,
+so don't use 'unknown1' for anything else.
+The same basic thing is going on with unknowny, but it is used for scroll
+position
+-->
+<body onload="doOpenDocument('unknown1',unknowny)" id="mainbody">
+ <canvas id="pdf_renderer"></canvas>
+</body>
+</html>
+
diff --git a/graphics/figput/javascript/layout.js b/graphics/figput/javascript/layout.js
new file mode 100644
index 0000000000..b359306941
--- /dev/null
+++ b/graphics/figput/javascript/layout.js
@@ -0,0 +1,489 @@
+"use strict";
+/*
+Code for page layout. The idea is a bit like Java Swing (or a zillion other
+similar setups), but stripped down to only what I need. In particular, the
+Panels are assumed to be stacked vertically.
+
+Everything is accessed through FullPanel, which consists of a list of
+PagePanel objects. These are stacked vertically, and each one contains at
+least one PDFPanel, and may contain FigurePanels. In the lingo of something
+like Java, it would be better to think of PagePanel as a Container or a Box
+since it's used for layout and doesn't directly do anything other than pass
+things to its sub-parts.
+
+*/
+// This class is the only thing that should be touched by code outside
+// this file. FullPanel.init() is called to set up page layout. Everything
+// is static since there is only one window/canvas.
+class FullPanel {
+ static init(specList) {
+ // Add all the pages to this document. specList is PDFDocument.pageSpecs.
+ // Each element of specList corresponds to page.
+ // Call this once, when the program starts, to set up the page layout.
+ let cumV = 0;
+ for (let i = 0; i < specList.length; i++) {
+ let pp = new PagePanel(i, specList[i], cumV);
+ this.thePages[i] = pp;
+ cumV += pp.h;
+ }
+ }
+ static async renderAll(height) {
+ // Render every PagePanel in FullPanel.thePages.
+ // Internal to this function, the height should be in "page pixels,"
+ // meaning the number of pixels tall the destination canvas is at the
+ // current zoom ratio of the offsreen pages.
+ height = height / PDFDocument.getZoom();
+ // Because of the use of promises by pdf.js, rendering is broken into
+ // two steps: pre-render and the actual rendering. Pre-rendering
+ // generates a bunch of promises (the pages rendered offscreen) and
+ // rendering can't be done until those promises resolve.
+ let ps = [];
+ for (let i = 0; i < this.thePages.length; i++) {
+ let p = this.thePages[i].preRender(height);
+ ps.push(p);
+ }
+ // Don't return until this is done!
+ await Promise.all(ps);
+ for (let i = 0; i < this.thePages.length; i++)
+ this.thePages[i].render(height);
+ // Eliminate any excess pages from the buffer of offscreen pages.
+ // Do this after copying out, just in case there *is* some weird
+ // problem with race conditions.
+ PDFDocument.trimBuffer();
+ }
+ static totalHeight() {
+ // Return the total height of all pages. This is used to set up
+ // the scroll bars.
+ let answer = 0;
+ for (let i = 0; i < this.thePages.length; i++)
+ answer += this.thePages[i].h;
+ return answer;
+ }
+ static getFullWidth() {
+ // Return the width of the widest page. Most of the time, the pages of
+ // a document all have the same width, but they might not in some
+ // rare case. This is needed to center things left/right in the window.
+ if (this.totalWidth > 0)
+ return this.totalWidth;
+ // Need to calculate it for the first time.
+ for (let i = 0; i < this.thePages.length; i++) {
+ let pp = this.thePages[i];
+ if (pp.w > this.totalWidth)
+ this.totalWidth = pp.w;
+ }
+ return this.totalWidth;
+ }
+ static mouseDown(x, y) {
+ // (x,y) is in pdf points, relative to the entire document.
+ // So y will be a huge number if it's on the umpteeth page.
+ // To save CPU, I could start off by checking whether x is in
+ // [0,pageWidth] and return if it is not, but the user might want to
+ // place controls outside the page. This is unlikely, but possible.
+ // Whoever had focus loses it. It may be taken up by some other widget
+ // (or the same widget again), but nobody has focus by default.
+ WidgetManager.focusOwner = null;
+ // Figure out which page this is and hand it off.
+ let i = 0;
+ for (; i < this.thePages.length; i++) {
+ if (this.thePages[i].v > y) {
+ // Found the first and only page this could be. It was the
+ // page previous to this one.
+ i -= 1;
+ break;
+ }
+ }
+ // If we got here then it had to be the very last page.
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+ // Safety check:
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+ this.thePages[i].mouseDown(x, y);
+ }
+ static mouseMove(x, y) {
+ // As above. However, these are only of interest if some widget
+ // "owns" the mouse -- something was clicked on so that motion
+ // could mean something.
+ if (WidgetManager.mouseOwner === null)
+ return;
+ // Although we know exactly which widget will ultimately get this
+ // event, it's easier to let this pass through the layout hierarchy,
+ // just as for mouseDown(), so that the coordinates are properly adjusted.
+ // BUG: Not DRY.
+ let i = 0;
+ for (; i < this.thePages.length; i++) {
+ if (this.thePages[i].v > y) {
+ i -= 1;
+ break;
+ }
+ }
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+ this.thePages[i].mouseMove(x, y);
+ }
+ static mouseUp(x, y) {
+ // The big issue here is that the mouse was released so that ownership
+ // is once again up for grabs. In addition, certain widgets will want
+ // to know where the mouse was released. Buttons are a good example.
+ // You could have mouse-down on the button, then the user moves the
+ // mouse out of the button and releases it; the button should only be
+ // "clicked" if the mouse was released over the button.
+ //
+ // An annoying thing here is that the *only* widget that could care about
+ // this (at least, as designed) is the one that owns the mouse-down.
+ // As above, we want the event to pass through the layout hierarchy
+ // so that (x,y) is adjusted for the right frame, but the ultimate
+ // *consumer* of the event may not even be on the page where the
+ // mouse-up occured.
+ // BUG: Not DRY.
+ if (WidgetManager.mouseOwner === null)
+ return;
+ let i = 0;
+ for (; i < this.thePages.length; i++) {
+ if (this.thePages[i].v > y) {
+ i -= 1;
+ break;
+ }
+ }
+ if (i === this.thePages.length)
+ i = this.thePages.length - 1;
+ if ((i == this.thePages.length) || (i < 0))
+ return;
+ this.thePages[i].mouseUp(x, y);
+ // Whatever happened above, the mouse is now up for grabs.
+ WidgetManager.mouseOwner = null;
+ }
+}
+// The full document consists of a list of PagePanel objects.
+// thePages[i] is the i-th page, counting from zero.
+FullPanel.thePages = [];
+// The width of the widest page of the entire document. Don't access
+// this directly; use getFullWidth().
+FullPanel.totalWidth = -1;
+// A PagePanel is the top-level thing, just under the canvas. Each
+// PagePanel makes up a single page of the printed document. There's
+// a list of them in FullPanel. It includes references to the PDFPanel
+// and FigurePanel objects that it contains.
+class PagePanel {
+ constructor(pageNum, pageSpec, v) {
+ // Every panel has a vertical position within the entire document and height,
+ // in pdf pts. The vertical postion, v, is the top of the page, so the page
+ // extends from v to v+h. The caller must ensure that the Panels stack up
+ // correctly since there is no real page layout.
+ //
+ // In some ways the height, h, is redundant since it could be worked
+ // out from the heights of the individual sub-parts. In fact (see below)
+ // it *is* worked out by the constuctor, but it's easier to do it once
+ // and be done with it. This is the height of the page, as rendered,
+ // taking into account any mismatch due to extra "padding" in the figures
+ // (if there is any, and there often is not).
+ this.v = 0;
+ this.w = 0;
+ this.h = 0;
+ // page number, counting from zero.
+ this.pageNum = 0;
+ // The SubPanels that make up this PagePanel.
+ this.parts = [];
+ // This implicitly applies to the global (because everything is static)
+ // PDFDocument. pageNum is which page this is, counting from zero.
+ // pageSpec has the info about how the page breaks into pieces and the
+ // relevant figures. v is where this page lies in the entire vertical
+ // list of pages.
+ this.w = pageSpec.pageWidth;
+ this.v = v;
+ this.pageNum = pageNum;
+ // Create the PDFPanels and FigurePanels in this PagePanel.
+ let s = pageSpec;
+ if (s.insertPoint.length == 0) {
+ // There are no figures on this page.
+ let p = new PDFPanel(pageNum, this.v, 0, 0, this.v, this.w, s.pageHeight);
+ this.h = s.pageHeight;
+ this.parts = [p];
+ }
+ else {
+ // There are figures.
+ let srcV = 0;
+ let destV = 0;
+ let totalV = v;
+ for (let j = 0; j < s.insertPoint.length; j++) {
+ // Bit of pdf above figure.
+ let p = new PDFPanel(pageNum, this.v, srcV, destV, totalV, this.w, s.insertPoint[j] - srcV);
+ destV += s.insertPoint[j] - srcV;
+ totalV += s.insertPoint[j] - srcV;
+ let f = new FigurePanel(this.v, destV, totalV, this.w, s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j], s.aboveHeight[j], s.belowHeight[j], s.leftMargin, s.textWidth, s.drawFcn[j]);
+ srcV = s.insertPoint[j] + s.deleteHeight[j];
+ destV += s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j];
+ totalV += s.deleteHeight[j] + s.aboveHeight[j] + s.belowHeight[j];
+ this.parts.push(p);
+ this.parts.push(f);
+ }
+ // And the bit of pdf below the last figure on the page.
+ let p = new PDFPanel(pageNum, this.v, srcV, destV, totalV, this.w, s.pageHeight - srcV);
+ this.parts.push(p);
+ this.h = destV + s.pageHeight - srcV;
+ }
+ }
+ async preRender(height) {
+ // This renders the underlying page of pdf. It returns a promise
+ // so that the caller can wait for the promise to resolve before
+ // attempting to copy from the rendered page.
+ //
+ // The vpos is where the top of the ctx should be relative to the entire
+ // document, in pdf pts, and height is how much is visible, in rendered
+ // page pixels.
+ // The first question is whether any of this page is visible.
+ let vpos = window.scrollY;
+ if (this.v + this.h < vpos)
+ // Entire page is above the visible area.
+ return;
+ if (this.v > vpos + height)
+ // Entire page is below the visible area.
+ return;
+ // Got here, so some portion of the page is visible.
+ await PDFDocument.render(this.pageNum);
+ }
+ render(height) {
+ // Render every SubPanel of the current PagePanel.
+ // BUG: Before returning, turn off any of these animations that are
+ // definitely not visible.
+ let vpos = window.scrollY;
+ if (this.v + this.h < vpos)
+ return;
+ if (this.v > vpos + height)
+ return;
+ // Got here, so some portion of the page is visible. From here on,
+ // render everything, whether it's actually visible or not.
+ let ctx = ctxTopLevelAdjust();
+ // Call the parts of the page. These could be PDFPanel or FigurePanel
+ // objects.
+ for (let i = 0; i < this.parts.length; i++)
+ this.parts[i].render();
+ // BUG: I don't like this use of zoom here. Maybe no choice?
+ let z = PDFDocument.getZoom();
+ // Put a rectangle aroud the entire page. I'm not 100% convinced that
+ // I like this.
+ ctx.strokeStyle = "black";
+ ctx.strokeRect(0, 0, this.w * z, this.h * z);
+ }
+ mouseDown(x, y) {
+ // Mouse clicked on this page.
+ // y is given relative to the entire document; make it page-relative.
+ y -= this.v;
+ // Only clicks on a figure could be of interest.
+ for (let i = 0; i < this.parts.length; i++) {
+ // Either a PDFPanel or a FigurePanel.
+ let p = this.parts[i];
+ if (p instanceof PDFPanel)
+ continue;
+ // p must be a FigurePanel.
+ if ((p.destV <= y) && (y <= p.destV + p.h))
+ return p.mouseDown(x, y);
+ }
+ }
+ mouseMove(x, y) {
+ // As above. Note that this event could go to the "wrong" figure,
+ // but that's OK. Also, if the mouse is over a PDFPanel, and not
+ // a figure, then the event dies here, which is also OK.
+ y -= this.v;
+ for (let i = 0; i < this.parts.length; i++) {
+ let p = this.parts[i];
+ if (p instanceof PDFPanel)
+ continue;
+ if ((p.destV <= y) && (y <= p.destV + p.h))
+ p.mouseMove(x, y);
+ }
+ }
+ mouseUp(x, y) {
+ // As above, but the event can't be allowed to die. The owning widget
+ // must hear about the mouse up. At the same time, we can't just
+ // inform the widget directly of the mouse up since we also need to
+ // pass the correct coordinates.
+ y -= this.v;
+ for (let i = 0; i < this.parts.length; i++) {
+ let p = this.parts[i];
+ // This is different than above since *somebody* must take the event,
+ // and the relevant widget must hear about it. If the event is over
+ // a PDFPanel, then tell the widget using crazy coordinates. It
+ // doesn't matter exactly where the mouse was released; it only
+ // matters that it wasn't released anywhere near the widget.
+ if ((p.destV <= y) && (y <= p.destV + p.h)) {
+ if (p instanceof PDFPanel)
+ WidgetManager.mouseOwner.mouseUp(10000000000000, 10000000000000);
+ else
+ // Over a figure.
+ p.mouseUp(x, y);
+ }
+ }
+ }
+}
+// A PagePanel consists of one or more SubPanels.
+class SubPanel {
+ constructor(v, totalV, w, h) {
+ // The vertical position and height within a page, with zero being at the
+ // top, and measured in pdf points. This height, h, is the total height.
+ // There's no ambiguity to this height for PDFPanel subclasses, but for
+ // FigurePanel subclasses, it is the sum of the latex height
+ // (PageData.deleteHeight), plus any additional padding as given in
+ // PageData.aboveHeight/belowHeight.
+ this.destV = 0;
+ this.h = 0;
+ this.w = 0;
+ // The position of this panel within the entire document.
+ // The only reason for this is the possible use of HTML DOM elements
+ // as widgets within a figure. I would prefer not to use those at all,
+ // but sometimes it's easier. See the NumberInputWidget for one example.
+ this.totalV = 0;
+ this.destV = v;
+ this.totalV = totalV;
+ this.w = w;
+ this.h = h;
+ }
+ // Will be filled in by sub-class.
+ render() {
+ console.log("Error: called SubPanel.render()!");
+ }
+ mouseDown(x, y) {
+ console.log("Error: called SubPanel.mouseDown()!");
+ }
+ mouseMove(x, y) {
+ console.log("Error: called SubPanel.mouseMove()!");
+ }
+ mouseUp(x, y) {
+ console.log("Error: called SubPanel.mouseUp()!");
+ }
+}
+// Used for portions of a page consisting of rendered pdf.
+class PDFPanel extends SubPanel {
+ constructor(pageNum, offsetV, srcV, destV, totalV, w, h) {
+ // The pageNum is given relative to the global PDFDocument. The srcV
+ // and destV are locations relative to the page (in pdf points, with the
+ // top of the page at v=0) and h is the height of this piece, which
+ // is the same for src and dest.
+ super(destV, totalV, w, h);
+ // The page numbers start at zero and positions are given in pdf points.
+ this.pageNum = 0;
+ this.srcV = 0;
+ // BUG: I think I can fold this in elsewhere. It's the same as PagePanel.v.
+ this.offsetV = 0;
+ this.pageNum = pageNum;
+ this.srcV = srcV;
+ this.offsetV = offsetV;
+ }
+ render() {
+ // Render a portion of the current page.
+ let theCanvas = PDFDocument.getCanvas(this.pageNum);
+ if (theCanvas === null) {
+ // I'm sure how this happens, but it does occasionally.
+ // It doesn't cause any noticable problems. It seems to happen
+ // if you move the scroll thumb too fast.
+ return;
+ }
+ // BUG: I don't like this use of zoom here. Maybe no choice?
+ let z = PDFDocument.getZoom();
+ let ctx = ctxTopLevelAdjust();
+ // Adjust for scroll bar.
+ ctx.translate(0, (this.offsetV - window.scrollY) * z);
+ // Arguments here:
+ // the source image (or canvas),
+ // the source (x,y),
+ // the source (width,height),
+ // the destination (x,y),
+ // the destination (width,height),
+ // It's confusing because optional things typically come after
+ // required things, but not here somehow.
+ ctx.drawImage(theCanvas, 0, this.srcV * z, theCanvas.width, this.h * z, 0, this.destV * z, theCanvas.width, this.h * z);
+ }
+}
+class FigurePanel extends SubPanel {
+ constructor(pageV, destV, totalV, w, h, upperPadding, lowerPadding, margin, textWidth, drawFcn) {
+ // As for PDFPanel, plus the margin is the amount by which to shift the
+ // drawing to the right so that the origin is in line with the text.The
+ // drawFcn is the function provided through Latex.
+ // This is just the name of the function, as a string.
+ super(destV, totalV, w, h);
+ // Page's v position. This is the position of the page on which
+ // this figure appears relative to the entire document.
+ this.pageV = 0;
+ // This margin is the location of the left edge of the text, as
+ // reported by latex.
+ this.margin = 0;
+ // Also from Latex (via figures.aux). This I have more confidence in.
+ this.textWidth = 0;
+ // The height in SubPanel.h is the total height of the figure, including
+ // any padding above or below. The origin used for the figure occurs at
+ // a y-value that is PageData.belowHeight *above* the total height.
+ // lowerPadding is equal to PageData.belowHeight for this figure.
+ this.lowerPadding = 0;
+ this.upperPadding = 0;
+ this.pageV = pageV;
+ this.upperPadding = upperPadding;
+ this.lowerPadding = lowerPadding;
+ this.margin = margin;
+ this.textWidth = textWidth;
+ this.drawFcn = drawFcn;
+ }
+ render() {
+ // Save this for widgets and animations to use.
+ let ctx = ctxTopLevelAdjust();
+ let z = PDFDocument.getZoom();
+ ctx.translate(0, (this.pageV - window.scrollY) * z);
+ // Erase the full width of the page. this.w is the correct width,
+ // but the origin will be shifted for drawing. So, erase, then
+ // return the origin to where it was and start over.
+ // Shift to where the figure appears and erase.
+ ctx.translate(0, this.destV * z);
+ ctx.scale(z, z);
+ // The small adjustment here is to prevent erasing the rectangle
+ // that encloses the entire page.
+ ctx.clearRect(1, 0, this.w - 2, this.h);
+ // Return to the orginal t-matrix, then shift down and right before
+ // drawing the figure (and widgets).
+ // What we want is for the origin to be at the lower-right and
+ // right-handed, adjusted upwards by this.lowerPadding too.
+ ctx = ctxTopLevelAdjust();
+ ctx.translate(0, (this.pageV - window.scrollY) * z);
+ ctx.translate(this.margin * z, (this.destV + this.h - this.lowerPadding) * z);
+ ctx.scale(1, -1);
+ ctx.scale(z, z);
+ // Tack this FigurePanel onto the underlying figure-drawing code.
+ // The first time the figure is rendered, this is set, and it's re-set
+ // to the same value with every subsequent call. That seems like
+ // pointless extra work, but it gets the job done.
+ this.drawFcn.figurePanelClass = this;
+ this.drawFcn(ctx);
+ }
+ mouseDown(x, y) {
+ // (x,y) is in pdf points, relative to the top-left of the page.
+ // Adjust to be relative to the figure, but still LH, relative
+ // to the top of the figure.
+ y -= this.destV;
+ x -= this.margin;
+ // y is now given relative to the top edge of the figure, getting
+ // larger as you go *down* the page.
+ // Convert y to be RH relative to the correct origin, taking
+ // any padding into account. This is confusing. At this stage,
+ // y is the distance below the figure's top edge. Call that y0.
+ // We want the distance above the lower padding (if any); call
+ // that y1. The distance above the lower *edge* of the figure
+ // is this.h - y0, and from this we subtract the padding.
+ y = (this.h - y) - this.lowerPadding;
+ // Pass to the relevant widget.
+ WidgetManager.mouseDown(this.drawFcn, x, y);
+ }
+ mouseMove(x, y) {
+ // As above.
+ y -= this.destV;
+ x -= this.margin;
+ y = (this.h - this.lowerPadding) - y;
+ WidgetManager.mouseMove(this.drawFcn, x, y);
+ }
+ mouseUp(x, y) {
+ // As above.
+ y -= this.destV;
+ x -= this.margin;
+ y = (this.h - this.lowerPadding) - y;
+ WidgetManager.mouseUp(this.drawFcn, x, y);
+ }
+}
diff --git a/graphics/figput/javascript/main.js b/graphics/figput/javascript/main.js
new file mode 100644
index 0000000000..afc7b03990
--- /dev/null
+++ b/graphics/figput/javascript/main.js
@@ -0,0 +1,833 @@
+"use strict";
+/*
+
+Main entry point for all the js code behind the browser interface.
+
+This has the initialization code, to load the pdf and the data specifying
+how figures are drawn and laid out, plus the top-level stuff to direct
+events to the proper place for handling.
+
+The same code is used for developing the document, and for serving it
+from a public-facing website, with a few changes. Look for "PUBLIC FACING"
+annotations. Note also that it would be possible to strip considerably
+more code away for the public-facing version, but there's no pressing
+reason to do it -- the savings would be tiny -- and it could lead to
+an error of some kind due to unforeseen dependencies on the deleted
+code.
+
+*/
+// In rare cases, I need to know the browser. Note it first, before doing
+// anything else. This userAgent is a longish bit of blather specifying
+// the browser, and the easiest way to deal with it is to check whether
+// certain strings appear.
+var theBrowser = function () {
+ let blah = navigator.userAgent;
+ if (blah.indexOf("Firefox") > -1)
+ return "Firefox";
+ // MS Edge is also "Chrome," at least for my purposes.
+ if (blah.indexOf("Chrome") > -1)
+ return "Chrome";
+ // Assume "Chrome" as the default.
+ console.log("MAKING DEFAULT 'CHROME' ASSUMPTION ABOUT THE BROWSWER!!!");
+ return "Chrome";
+}();
+// JS has poor to non-existent facilities for dealing with thread scheduling.
+// In a lot of JS code that doesn't matter, but the pdf.js library, on which
+// this entire thing rests, makes heavy use of Promises and workers. Fortunately,
+// there's a simple way of managing this.
+//
+// To use this, the caller says
+// await sleep(100);
+// and the "await" is crucial. This works because setTimeout() takes a
+// function to run, and some amount of time to wait before running that
+// function.
+//
+// This isn't a satisfying solution because it requires "await."
+// For that reason it can only be used in async functions.
+function sleep(ms) {
+ // ms is milliseconds, not microseconds.
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+function getAugmentedFunction(fcnName) {
+ // This converts from a function name, as specified by the user in their latex
+ // document to the internally more useful AugmentedDrawingFunction. Doing this
+ // kind of conversion feels icky, but any alternative I've come up with requires
+ // that the person using FigPut know more than the absolute minimum about what's
+ // behind the curtain.
+ //
+ // References to these functions come into the program at two points. First, when
+ // the document is loaded, a list of the relevant drawing functions is provided
+ // by latex. Second, when the user creates widgets within his drawings, these
+ // widgets must belong to a particular drawing and the function (or its name, as
+ // a string) is used as the key under which the widget is filed.
+ // BUG: This double-cast and use of 'any' is horrible, but is there
+ // anything better?
+ return window[fcnName];
+}
+// Data related to the document pages and figures. Each page
+// has one of these in PDFDocument.pageSpecs. This is all
+// static data once the document has been loaded.
+// BUG: Should this be a type? An interface?
+class PageData {
+ constructor() {
+ // Note that pageHeight is the height of a *printed* page. If the page
+ // has a figure whose height is different than the deleted height, then
+ // the page height, as rendered, will be different than this value.
+ // Also, the margins and textWidth are only valid when there is a
+ // figure to render since they come from figures.aux.
+ // For reference, 8.5 x 11 inch paper is 612 x 792 pts;
+ // A4 paper is 8.27 x 11.69 inch or 595.44 x 841.68 pts.
+ // However, it seems that latex sometimes produces slightly different
+ // dimensions of what must be A4 paper.
+ this.pageHeight = 0;
+ this.pageWidth = 0;
+ this.leftMargin = 0;
+ this.rightMargin = 0;
+ this.textWidth = 0;
+ // These arrays have one entry for each interactive figure on the page.
+ // insertPoint is the position, from the top, at which the figure is
+ // inserted. deleteHeight is how much of the latex doc is omitted, and
+ // above/belowHeight is how much room to leave in the browser window for
+ // the figure. name is the name of the function to call to draw the
+ // figure, done is whether to generate new tikz
+ this.insertPoint = [];
+ this.deleteHeight = [];
+ this.aboveHeight = [];
+ this.belowHeight = [];
+ this.name = [];
+ this.done = [];
+ // For each figure, there is a corresponding function (that will be
+ // augmented with a drawing target). These values make the name values
+ // given above conceptually redundant.
+ this.drawFcn = [];
+ }
+}
+// Everything related to the pdf document is here. Its main purpose is
+// to handle off-screen rendering. It's all static since there can only be
+// one pdf open at a time. It does include data about how to lay out the
+// figures, but none of the code that does it.
+//
+// I tried making this a module, but really no advantage over a class,
+// and definitely some disadvantages.
+class PDFDocument {
+ static async setPDF(thePDF) {
+ // Take the newly loaded pdf and note some of it's stats.
+ // Once this is loaded, thePDF never needs to be accessed again
+ // from outside this class.
+ this.pdf = thePDF;
+ this.numberOfPages = thePDF.numPages;
+ // It seems that pdfjs counts pages from one, not zero.
+ for (let i = 1; i <= this.numberOfPages; i++) {
+ await thePDF.getPage(i).then(function (page) {
+ // Note the i-1 here since I want arrays to start at zero.
+ PDFDocument.pageSpecs[i - 1] = new PageData();
+ PDFDocument.pageSpecs[i - 1].pageWidth = page.view[2];
+ PDFDocument.pageSpecs[i - 1].pageHeight = page.view[3];
+ // Make sure that the shared buffer arrays are all fully allocated.
+ PDFDocument.theCanvases[i - 1] = null;
+ PDFDocument.pageAge[i - 1] = 0;
+ });
+ }
+ }
+ static isLoaded() {
+ if (this.pdf === null)
+ return false;
+ else
+ return true;
+ }
+ static getZoom() {
+ return this.zoom;
+ }
+ static setZoom(z) {
+ this.zoom = z;
+ this.flushBuffer();
+ }
+ static getCanvas(n) {
+ // Return the canvas for page number n (counting from zero).
+ // This assumes that the canvas is available due to a previous
+ // call to render(n) -- which must have resolved by the time this
+ // method is called.
+ // BUG: This shouldn't happen, but maybe I should create a fake
+ // blank canvas anyway.
+ if (this.theCanvases[n] === null)
+ console.log("ERROR! Canvas for page missing: " + n);
+ return this.theCanvases[n];
+ }
+ static async render(n) {
+ // Render page n offscreen, where the pages are counted from zero.
+ // See if the page is already there.
+ if (PDFDocument.theCanvases[n] !== null)
+ return;
+ // Note the +1 here since pdf.js counts pages from 1, not zero.
+ let thePage = await PDFDocument.pdf.getPage(n + 1);
+ let newCanvas = document.createElement('canvas');
+ PDFDocument.theCanvases[n] = newCanvas;
+ PDFDocument.pageAge[n] = PDFDocument.renderCount;
+ ++PDFDocument.renderCount;
+ let offctx = newCanvas.getContext('2d');
+ let viewport = thePage.getViewport(PDFDocument.zoom);
+ newCanvas.width = viewport.width;
+ newCanvas.height = viewport.height;
+ await thePage.render({
+ canvasContext: offctx,
+ viewport: viewport
+ });
+ }
+ static trimBuffer() {
+ // Call this periodically, like after making a series of calls to
+ // render(), to remove excess canvases from the buffer arrays.
+ // Due to the risk of race conditions -- which I think is minimal --
+ // it's best not to call this until reaching a point at which it
+ // doesn't matter if *all* the offscreen canvases are deleted (although
+ // that outcome would be inefficient). The unlikely possiblitity of
+ // problems due to race conditions is why this is not part of render().
+ let ctot = 0;
+ for (let i = 0; i < PDFDocument.numberOfPages; i++) {
+ if (PDFDocument.theCanvases[i] !== null)
+ ++ctot;
+ }
+ // Delete excess offscreen canvases.
+ while (ctot > PDFDocument.pageBufSize) {
+ PDFDocument.removeOldestPage();
+ --ctot;
+ }
+ }
+ static removeOldestPage() {
+ // Remove the oldest single canvas from this.theCanvases.
+ let oldestIndex = -1;
+ let oldestAge = this.pageAge[0];
+ for (let i = 0; i < this.numberOfPages; i++) {
+ if (this.theCanvases[i] === null)
+ continue;
+ if (this.pageAge[i] < oldestAge) {
+ oldestAge = this.pageAge[i];
+ oldestIndex = i;
+ }
+ }
+ this.theCanvases[oldestIndex] = null;
+ }
+ static flushBuffer() {
+ // Removes all offscreen canvases in the buffer. This is needed, e.g.,
+ // when resizing so that you don't use a canvas of the wrong scale.
+ for (let i = 0; i < this.numberOfPages; i++)
+ this.theCanvases[i] = null;
+ }
+}
+// Total number of pages in the above document.
+PDFDocument.numberOfPages = 0;
+// This is the scale at which to to render the pages offscreen. Setting
+// this equal to 1 means that each px of the off-screen canvas is 1 pdf
+// point.
+PDFDocument.zoom = 1;
+// Information about the layout, one for each page.
+PDFDocument.pageSpecs = [];
+// The fields below are a temporary buffer of pages rendered offscreen.
+// This speeds up the process so that we aren't re-rendering pages.
+// My original intent was for these arrays to have no more than
+// pageBufSize entries, but the way async/promise works makes that
+// difficult (impossible?). I want render() to render a given page
+// to an offscreen canvas and store that canvas here, which means
+// that all these calls to render() share the variables below.
+// Each call to render() is, unavoidably, in a different thread, and
+// that means that they are all trying to manipulate these varaibles
+// in an order that is unpredictable. The only way that I can see to
+// make this happen in a predicatable way is for each page to have
+// its own canvas. It's OK for render() to put things into its designated
+// spot in an array, but it can't touch anything that some other invocation
+// of render might touch.
+//
+// This is wasteful, but I see no other way to do it without using
+// a mutex. It's not that bad since we're talking about a few bytes for
+// every page, but still annoying.
+//
+// Aside: JS does have the Atomics object, as of ECMA 2017, and it
+// might (?) be possible to use that somehow as a way to synchronize
+// threads, but I'd rather not mess with it.
+// The total number of pages that may be held. This needs to be at least
+// as large as the number of pages that may be visible at one time if you
+// zoom all the way out, plus a couple extra due to possible problems
+// resulting from race conditions that I can't (?) avoid.
+PDFDocument.pageBufSize = 6;
+// This holds a copy of page to be copied to the screen. Every page has
+// its own entry, although all but (at most) pageBufSize will be null.
+PDFDocument.theCanvases = [];
+// The renderCount is how many times we've rendered any page. It's used like
+// a time since I have no confidence in window.performance.now, which is
+// supposed to return the current time in nanoseconds. Every time a page
+// is asked to be rendered, this value increments, and is stored in
+// pageAge[i], where i is the index of the page rendered. It may not
+// actually be rendered if it would be a re-render, but the time is updated.
+// We need this to flush older pages from the buffer when there are too many.
+//
+// NOTE: This variable is shared by the various invocations of render()
+// and something like
+// ++renderCount
+// is not an atomic operation. The way I am using this, the fact that
+// the value of renderCount may be incorrect isn't a disaster. It can
+// only be wrong by a few steps. This is why pageBufSize is bumped up to be a
+// little larger than strictly necessary. Worst case, things are re-rendered
+// and you waste some CPU.
+PDFDocument.renderCount = 0;
+// One of these for each page, indexed by page number. Holds the value
+// or renderCount at the time when the page was rendered (or re-rendered).
+PDFDocument.pageAge = [];
+// A class for scheduling event handling.
+//
+// Everything is static because there is only one of these for all events.
+// It is used to mediate the event loop so that everything happens
+// syncrhonously, even when async functions are involved. It is used for
+// things like scroll and mouse-down events; it is also used for animations,
+// which are created by certain widgets.
+//
+// The idea is that you call getID() to get your ticket (like at the
+// butcher's). Then call await waitMyTurn() until the butcher is ready.
+// The 'await' is crucial! Then call allDone() to thank the butcher and
+// leave so that he can take the next customer.
+//
+// For this to work properly, calls to getID() must be made outside
+// of async functions. Otherwise the IDs could get out of order.
+//
+// BUG: I could use this in a DRY-er way. Define a method called
+// getInLine() that takes the function to be invoked. Have getInLine()
+// call getID(), waitMyTurn(), run the job, then call allDone().
+//
+// BUG: It may be that someone who is more expert in JS could use
+// Promises somehow to make this scheme unnecessary. OTOH, this may
+// be easier to understand and use than something more clever.
+class Events {
+ static getID() {
+ let answer = this.count;
+ this.count++;
+ return answer;
+ }
+ static async waitMyTurn(id) {
+ while (id !== Events.complete + 1)
+ await sleep(5);
+ }
+ static allDone(id) {
+ Events.complete = id;
+ }
+}
+// A count of events that have come in. Each event gets its own unique
+// ID by calling getID().
+Events.count = 0;
+// The ID number of the event whose handling was most recently completed.
+Events.complete = -1;
+async function doOpenDocument(latexName, scrollPos) {
+ // Called when the body of the page loads (onload).
+ // latexName is the base of the name of the pdf. Thus, latexName.pdf
+ // is what is to be opened. The scrollPos value is the position on the
+ // page. This is provided by doBeforeUnload(), noted by the server, and
+ // given back in the course of the reload.
+ // The "Get TikZ" button is fixed, and it is always on top.
+ // PUBLIC FACING: Comment this block of code out when running serving from a
+ // public-facing website. There's no reason to provide this "Get TikZ" button
+ // and the server won't now how to handle the resulting messages.
+ let fmenu = document.createElement("button");
+ fmenu.style.position = "fixed";
+ fmenu.style.display = "block";
+ fmenu.style.left = "0px";
+ fmenu.style.top = "0px";
+ fmenu.style.width = "80px";
+ fmenu.style.height = "18px";
+ fmenu.style.fontSize = "10px";
+ fmenu.textContent = "Get TikZ";
+ fmenu.style.zIndex = "99";
+ fmenu.onclick = doTikzClick;
+ document.body.appendChild(fmenu);
+ let theCanvas = document.getElementById("pdf_renderer");
+ theCanvas.style.position = "fixed";
+ // It might happen that the program starts with some level of zoom.
+ PDFDocument.setZoom(window.devicePixelRatio);
+ // So that the canvas exactly fills the window.
+ adjustCanvas();
+ // Mouse events are registered on the canvas rather than the document
+ // (as is done for resize and scroll), but I'm not sure there's any
+ // practical difference since the canvas is the whole document.
+ // Note that this does *not* listen for onclick events. In a few cases,
+ // they might be a more natural choice (like for buttons), but they make
+ // things like coloring a "halfway clicked" widget difficult.
+ // Note that this does not distinguish between left, right and middle
+ // buttons; a click is a click.
+ // Also, the mouseup listener is registered on the window, not the canvas,
+ // so that we hear about mouse-ups even when they happen outside the
+ // browswer window entirely.
+ theCanvas.addEventListener("mousedown", doMouseDown);
+ theCanvas.addEventListener("mousemove", doMouseMove);
+ theCanvas.addEventListener("mouseup", doMouseUp);
+ // I considered registering listeners for mouseenter/mouseleave, but
+ // they're not needed.
+ /*
+ BUG: I have not tested this much on touch devices. Everything
+ works fine on some phones, but not on others. It's a hard to imagine
+ people trying to use this on a phone, but I should test on things
+ like iPads.
+ theCanvas.addEventListener("touchstart",doTouchDown);
+ theCanvas.addEventListener("touchend",doTouchUp);
+ theCanvas.addEventListener("touchmove",doTouchMove);
+ */
+ // Open the pdf and digest figures.aux.
+ await getDocumentData(latexName);
+ // Create the various Panel objects that make up the document as a whole.
+ // This does the "page layout."
+ FullPanel.init(PDFDocument.pageSpecs);
+ // Now that page layout is done, set the range for the scroll bars on
+ // the browswer window.
+ adjustScrollBars();
+ // When reloading, we don't want things to move back to the top of
+ // the first page.
+ window.scrollTo(0, scrollPos);
+ // Render for the very first time.
+ fullRender();
+}
+async function getDocumentData(latexName) {
+ // This opens and digests the data files and the pdf itself.
+ let thePDF = await pdfjsLib.getDocument(latexName + '.pdf');
+ await PDFDocument.setPDF(thePDF);
+ // Open and digest figures.aux.
+ let fname = latexName + ".fig.aux";
+ // fetch() is the new XMLHttpRequest(), which has been deprecated.
+ // Thanks to Dan Pratt for pointing that out.
+ let fetchPromise = await fetch(fname);
+ let allText = await fetchPromise.text();
+ await getFigureInfo(allText);
+}
+async function syncLoad(scriptName) {
+ // Load the script with the given name and append to the DOM, and
+ // don't return until the load is complete. So this should typically
+ // be called with 'await'.
+ //
+ // Thanks to Dan Pratt for this tidy solution. This works because the
+ // promise can't resolve (either way) until appendChild() completes
+ // because you can't resolve or reject until the code is loaded
+ // or fails to load. Note that the 'once' argument means that the function
+ // is called once, then flushed. That's exactly what I want so that they
+ // don't hang around and consume resources.
+ let theCode = document.createElement("script");
+ theCode.type = "application/javascript";
+ theCode.src = scriptName;
+ var p = new Promise((resolve, reject) => {
+ theCode.addEventListener("load", resolve, { once: true });
+ theCode.addEventListener("error", reject, { once: true });
+ });
+ document.body.appendChild(theCode);
+ await p;
+}
+async function getFigureInfo(textBody) {
+ // textBody is the complete contents of the .aux file. Parse it and
+ // use the data to fill in PDFDocument.PageSpecs.
+ let lines = textBody.split('\n');
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i].length < 2)
+ // Last line might be blank.
+ break;
+ var parts = lines[i].split(' ');
+ if (parts[0] === "load") {
+ // Load a single .js file and move on.
+ await syncLoad(parts[1]);
+ continue;
+ }
+ var pnum = parseInt(parts[0]);
+ var innerMargin = parseFloat(parts[1]);
+ var outerMargin = parseFloat(parts[2]);
+ var textWidth = parseFloat(parts[3]);
+ var vpos = parseFloat(parts[4]);
+ var hLatex = parseFloat(parts[5]);
+ var hAbove = parseFloat(parts[6]);
+ var hBelow = parseFloat(parts[7]);
+ var name = parts[8];
+ // Careful: JS weirdness means that Boolean(parts[9]) is ALWAYS true
+ // (unless parts[9] is empty).
+ var done = (parts[9] === 'true');
+ var externLoad = (parts[10] === 'true');
+ // Page numbers should start at zero (not 1 as reported by latex).
+ pnum -= 1;
+ // Load the JS now, if necessary.
+ // NOTE: In earlier versions, up to v23, I looked to either a
+ // .js file or an .fjs file. Individual files are now assumed
+ // to be .fjs files. This is much simpler.
+ if (externLoad === true)
+ await syncLoad(name + ".fjs");
+ // NOTE: This assumes that the relevant function has been loaded,
+ // perhaps as an external file from \LoadFigureCode.
+ let augFcn = getAugmentedFunction(name);
+ if (typeof augFcn === "undefined")
+ alert(name + " not found. Is the function name correct?");
+ // Note this for the future.
+ augFcn.figurePanelClass = null;
+ PDFDocument.pageSpecs[pnum].drawFcn.push(augFcn);
+ // Copy the remaining fields over.
+ // Adjust the vertical position to be given relative to the top
+ // of the page, rather than the bottom.
+ vpos = PDFDocument.pageSpecs[pnum].pageHeight - vpos;
+ // If there are multiple figures on a particular page, then this
+ // is redundant, but harmless.
+ if (pnum % 2 === 0) {
+ PDFDocument.pageSpecs[pnum].leftMargin = innerMargin;
+ PDFDocument.pageSpecs[pnum].rightMargin = outerMargin;
+ }
+ else {
+ PDFDocument.pageSpecs[pnum].leftMargin = outerMargin;
+ PDFDocument.pageSpecs[pnum].rightMargin = innerMargin;
+ }
+ PDFDocument.pageSpecs[pnum].textWidth = textWidth;
+ // The per-figure data.
+ PDFDocument.pageSpecs[pnum].insertPoint.push(vpos);
+ PDFDocument.pageSpecs[pnum].deleteHeight.push(hLatex);
+ PDFDocument.pageSpecs[pnum].aboveHeight.push(hAbove);
+ PDFDocument.pageSpecs[pnum].belowHeight.push(hBelow);
+ PDFDocument.pageSpecs[pnum].name.push(name);
+ PDFDocument.pageSpecs[pnum].done.push(done);
+ }
+ // Make sure that all the figure names are distinct.
+ for (let i = 0; i < PDFDocument.numberOfPages; i++) {
+ // Loop over each figure on the current page.
+ for (let fig = 0; fig < PDFDocument.pageSpecs[i].name.length; fig++) {
+ let curName = PDFDocument.pageSpecs[i].name[fig];
+ // See if this name matches a name on any other page/figure.
+ // Consider the current page first.
+ for (let subfig = fig + 1; subfig < PDFDocument.pageSpecs[i].name.length; subfig++) {
+ if (curName === PDFDocument.pageSpecs[i].name[subfig]) {
+ alert("The figure name " + curName + " is used more than once.");
+ throw new Error();
+ }
+ }
+ // Continue with all the remaining pages.
+ for (let j = i + 1; j < PDFDocument.numberOfPages; j++) {
+ for (let subfig = 0; subfig < PDFDocument.pageSpecs[j].name.length; subfig++) {
+ if (curName === PDFDocument.pageSpecs[j].name[subfig]) {
+ alert("The figure name " + curName + " is used more than once.");
+ throw new Error();
+ }
+ }
+ }
+ }
+ }
+}
+function adjustScrollBars() {
+ // Based on the page size and document length, adjust the range of the
+ // browswer's scroll bars.
+ var body = document.getElementById("mainbody");
+ // I don't see any way to set the range of the scroll bar directly, so
+ // I'm fooling the browser to think that it has a body of a certain
+ // height, in px, when the body is really no bigger than the visible
+ // area of the window. What I want is a height such that, when the scroll
+ // bar is at the bottom, the lower edge of the last page is barely visible
+ // in the bottom of the window.
+ //
+ // There was some mental debate about whether it's better to let the
+ // bottom of the last page scroll up beyond the bottom of the window, but
+ // this is easier to program, and it's probably more natural for most people.
+ let totHeight = FullPanel.totalHeight();
+ let visHeight = document.documentElement.clientHeight;
+ body.style.height = totHeight + "px";
+ // The horizontal scroll bar is expressed in terms of pdf pts. This is
+ // simpler than above since I don't want to be able to scroll so that the
+ // right edge of the document is barely off the window; I want to be able
+ // to scroll just far enough so that the right edge of the document meets
+ // the right edge of the window. The size of the window becomes irrelevant
+ // (i.e., the browser deals with it).
+ // However, we do need to know whether a scroll bar is needed at all,
+ // so we can't totally ignore the visible width.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ if (visWidth > totWidth) {
+ // No need for horizontal scroll. It seems like "0px" works, but "0 px"
+ // does not. Maybe the space causes a (silent) parse error?
+ body.style.width = "0px";
+ return;
+ }
+ body.style.width = totWidth + "px";
+}
+function ctxTopLevelAdjust() {
+ // Each function should call this before doing any drawing.
+ // Rendering is done relative to the ctx (obviously) with the t-matrix
+ // adjusted accordingly. This brings the t-matrix from being the
+ // identity to being relative to the entire document.
+ //
+ // In earlier versions, the ctx was being passed around and adjusted
+ // as the layout manager descended to a particular portion of the document.
+ // In some ways that is the cleaner and more modular way to do things,
+ // but it can be confusing because the adjustments to the t-matrix aren't
+ // done in a central place.
+ var canvas = document.getElementById("pdf_renderer");
+ let ctx = canvas.getContext('2d');
+ ctx.resetTransform();
+ // Center the document. Rather than mess with CSS to center the canvas,
+ // leave the canvas at the size of the entire window, and shift the origin
+ // so the document is rendered in the center of the canvas.
+ //
+ // However, if the window is smaller than the document, then we do
+ // NOT want to center the document. If we did center it, then it would
+ // be impossible to scroll over to the left since we can't have "negative
+ // scroll;" window.scrollX is always non-negative (unfortunately).
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let z = PDFDocument.getZoom();
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ docCenter *= PDFDocument.getZoom();
+ ctx.translate(canvasCenter - docCenter, 0);
+ }
+ else {
+ // Shift according to the horizontal scroll bar, leaving the document
+ // against the left edge. Note the scaling by the zoom factor so
+ // as to be consistent with the above.
+ ctx.translate(-window.scrollX * PDFDocument.getZoom(), 0);
+ }
+ return ctx;
+}
+async function fullRender() {
+ // Render all the pages of the pdf, together with the figures.
+ var canvas = document.getElementById("pdf_renderer");
+ // This shouldn't be necessary, but do it as a fail-safe.
+ var ctx = canvas.getContext('2d');
+ ctx.resetTransform();
+ let visWidth = document.documentElement.clientWidth;
+ let z = PDFDocument.getZoom();
+ // BUG: Could lead to flicker? It is necessary to clear everything
+ // because widgets could be drawn outside the page. I suppose that I could
+ // only erase the area outside the pages, which would reduce any flicker.
+ // I really don't want to double-buffer everything if it can be avoided.
+ // It may be the only solution. The problem is that, if a widget extends
+ // outside the page, and is animated (like LoopAnimWidget) so that it's
+ // drawn as part of an animation, then you must erase the entire page to
+ // avoid "leftovers," and *that* requires that you redraw the entire
+ // document (or what is visible) with every frame of an animation.
+ //
+ // BUG: So the correct solution is double-buffering everything, but I don't
+ // feel that it's pressing. For now, either restrict any widgets to
+ // draw within a page or accept that it might leave spoogey leftovers.
+ ctx.clearRect(0, 0, visWidth * z, document.documentElement.clientHeight * z);
+ await FullPanel.renderAll(canvas.height);
+}
+function adjustCanvas() {
+ // Call when the window has been zoomed or re-sized.
+ //
+ // canvas has two different dimensions: canvas.style.width and height, and
+ // canvas.width and height. The style values determine the size of the canvas
+ // on the screen -- so-called ""CSS styling." The straight values (no style)
+ // are the number of px in the canvas. By keeping the style values constant and
+ // varying the straight values, you can have more or less resolution for the
+ // canvas, EVEN WHEN ZOOMED IN.
+ //
+ // The bottom line is that if we adjust the straight pixel sizes, then
+ // we can always have one px for every physical pixel -- up to the accuracy
+ // of window.devicePixelRatio.
+ //
+ // BUG: Check for things with super high pixel density, like phones. I
+ // think the devicePixelRatio is somehow wrong for those. It may not matter.
+ var canvas = document.getElementById("pdf_renderer");
+ // Adjust the visible width to match the window size.
+ //
+ // NOTE: For debugging, it can be helpful to subtract off a bit from these
+ // values, like 1, 10 or 50, depending. In earlier versions, there was
+ // also a bit of CSS in the html that put a visible rectangle around the canvas.
+ //canvas.style.width = (document.documentElement.clientWidth - 50) + "px";
+ //canvas.style.height = (document.documentElement.clientHeight - 50) + "px";
+ canvas.style.width = document.documentElement.clientWidth + "px";
+ canvas.style.height = document.documentElement.clientHeight + "px";
+ // The visible width of the canvas has just been fixed. Now change the
+ // number of px so that the number of px per inch on the screen varies with
+ // the level of browser zoom. There seems to be no means of direct access
+ // to the phyical pixels of the monitor, but this is close, and may be
+ // exactly equivalent in many situations.
+ canvas.width = document.documentElement.clientWidth * window.devicePixelRatio;
+ canvas.height = document.documentElement.clientHeight * window.devicePixelRatio;
+}
+async function doScrollGuts(id) {
+ // Wait for any active event handler to finish and then wait until it is
+ // the turn of current id to run.
+ await Events.waitMyTurn(id);
+ await fullRender();
+ // Give your ticket to the butcher so that he can take the next customer.
+ Events.allDone(id);
+}
+function doScroll() {
+ // Scroll events are registered below to call this function.
+ // It redraws the contents of the main canvas.
+ // This appears to be called when the page is opened, before almost
+ // anything else, so return until page initialization is complete.
+ if (PDFDocument.isLoaded() == false)
+ return;
+ // Get a unique ID for this event.
+ // This must be done outside any async function to ensure proper order.
+ let id = Events.getID();
+ doScrollGuts(id);
+}
+async function doResizeGuts(id) {
+ // As with scrolling, wait for any earlier event handler to complete.
+ await Events.waitMyTurn(id);
+ // None of the buffered offscreen canvases are valid anymore.
+ // In theory, I could test for whether this was merely a window
+ // resize and not a zoom, but it's not worth fooling with.
+ PDFDocument.flushBuffer();
+ console.log("ratio: " + window.devicePixelRatio);
+ // The other thing that needs to be adjusted is the zoom level
+ // used when rendering the pdfs.
+ adjustCanvas();
+ // Here is the magic. Effectively, this value is now the level of zoom.
+ // If you take out this line, and leave PDFDocument.zoom always equal to
+ // default value of 1, then zooming does nothing, although the mismatch
+ // between the resolution of the off-screen canvas and the resolution on
+ // the screen can make things blurry or blocky.
+ PDFDocument.setZoom(window.devicePixelRatio);
+ // If the size of the window changed, then this needs to be adjusted too.
+ // This must be done after adjustCanvas().
+ adjustScrollBars();
+ // Render the pages too.
+ await fullRender();
+ // Final bit of scheduling magic.
+ Events.allDone(id);
+}
+function doResize() {
+ // This is called whenever the user zooms and also if the
+ // entire broswer window is resized.
+ let id = Events.getID();
+ doResizeGuts(id);
+}
+async function mouseDownGuts(id, x, y) {
+ // (x,y) is the location of the mouse click, in pdf points, but
+ // relative to the window.
+ await Events.waitMyTurn(id);
+ // Just as we have to tweak the t-matrix to determine where to draw things,
+ // we need to do something similar to figure out where (x,y) is on the page.
+ // The difference is that the ctx.translate() operations become adjustments
+ // to x and y.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = document.getElementById("pdf_renderer");
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+ x = x - (canvasCenter - docCenter);
+ }
+ else {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+ FullPanel.mouseDown(x, y);
+ // Don't forget!
+ Events.allDone(id);
+}
+function doMouseDown(e) {
+ // This is an event like any other, so the usual scheduling rigmarole.
+ let id = Events.getID();
+ mouseDownGuts(id, e.x, e.y);
+}
+async function mouseMoveGuts(id, x, y) {
+ // As above.
+ // BUG: Common code. Not DRY.
+ await Events.waitMyTurn(id);
+ // As for mouse-down.
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = document.getElementById("pdf_renderer");
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+ x = x - (canvasCenter - docCenter);
+ }
+ else {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+ FullPanel.mouseMove(x, y);
+ // Don't forget!
+ Events.allDone(id);
+}
+function doMouseMove(e) {
+ // As above.
+ let id = Events.getID();
+ mouseMoveGuts(id, e.x, e.y);
+}
+async function mouseUpGuts(id, x, y) {
+ // As above.
+ // BUG: Common code. Not DRY.
+ await Events.waitMyTurn(id);
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ let canvas = document.getElementById("pdf_renderer");
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. The document is centered.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+ x = x - (canvasCenter - docCenter);
+ }
+ else {
+ // Shift according to the horizontal scroll bar.
+ x = x + window.scrollX;
+ }
+ // Fix up the y-coordinate too.
+ y = y + window.scrollY;
+ FullPanel.mouseUp(x, y);
+ // Don't forget!
+ Events.allDone(id);
+}
+function doMouseUp(e) {
+ // As above.
+ let id = Events.getID();
+ mouseUpGuts(id, e.x, e.y);
+}
+function doTikzClick() {
+ // Tikz button was clicked. Generate output file(s).
+ //
+ // Cycle over every figure and let it generate tikz data.
+ for (let pi = 0; pi < PDFDocument.pageSpecs.length; pi++) {
+ let pd = PDFDocument.pageSpecs[pi];
+ if (pd.name.length === 0)
+ // No figures on this page.
+ continue;
+ for (let fi = 0; fi < pd.name.length; fi++) {
+ if (pd.done[fi] == true)
+ // User said to skip this one.
+ continue;
+ let theFcn = pd.drawFcn[fi];
+ if (theFcn.figurePanelClass === null)
+ // Hasn't been loaded, because was never visible.
+ continue;
+ let ctx = new CTX(pd.name[fi]);
+ theFcn(ctx);
+ ctx.close();
+ }
+ }
+}
+function doBeforeUnload(e) {
+ // This is *very* non-standard. Pass a made-up WHERE message with the position
+ // on the document.
+ // BUG: This only informs the server of the vertical scroll position.
+ // Dealing with horizontal scroll would be more painful. See fullRender()
+ // and adjustScrollBars().
+ // If *everything* were double-buffered, then this would be a bit easier.
+ let req = new XMLHttpRequest();
+ // We don't care about the second argument. In a POST this would be
+ // something like a file name. The third argument, 'false', forces the request
+ // to be handled synchronously. If it's done async, then the unload proceeds
+ // and completes before this task finishes.
+ req.open("WHERE", "bogus", false);
+ req.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
+ // Send the postion as the message. It could probaby be sent instead of
+ // 'bogus' above, and this could be blank.
+ let msg = window.scrollY.toString();
+ // BUG: Firefox generates "Uncaught DOMException: A network error occurred."
+ // on this. It might be that XMLHttpRequest is deprecated?
+ req.send(msg);
+}
+// Register additional event handlers. The main (and only) canvas had
+// listeners registered for mouse events in doOpenDocument().
+document.addEventListener('scroll', doScroll);
+window.addEventListener('resize', doResize);
+// PUBLIC FACING: Comment this out. It's doing something *very* non-standard,
+// and any normal web-server will choke on it.
+window.addEventListener('beforeunload', doBeforeUnload);
diff --git a/graphics/figput/javascript/pdf.js b/graphics/figput/javascript/pdf.js
new file mode 100644
index 0000000000..9fd468f76a
--- /dev/null
+++ b/graphics/figput/javascript/pdf.js
@@ -0,0 +1 @@
+!function (e, t) { "object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define("pdfjs-dist/build/pdf", [], t) : "object" == typeof exports ? exports["pdfjs-dist/build/pdf"] = t() : e["pdfjs-dist/build/pdf"] = e.pdfjsLib = t() }(this, function () { return function (e) { var t = {}; function r(n) { if (t[n]) return t[n].exports; var i = t[n] = { i: n, l: !1, exports: {} }; return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports } return r.m = e, r.c = t, r.d = function (e, t, n) { r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n }) }, r.r = function (e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, r.t = function (e, t) { if (1 & t && (e = r(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var n = Object.create(null); if (r.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var i in e) r.d(n, i, function (t) { return e[t] }.bind(null, i)); return n }, r.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return r.d(t, "a", t), t }, r.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, r.p = "", r(r.s = 0) }([function (e, t, r) { "use strict"; var n = r(1), i = r(129), a = r(145), o = r(146), s = r(130), u = r(147), l = r(135), c = r(132); if (r(4)()) { var h = r(148).PDFNodeStream; i.setPDFNetworkStreamFactory(function (e) { return new h(e) }) } else if ("undefined" != typeof Response && "body" in Response.prototype && "undefined" != typeof ReadableStream) { var d = r(151).PDFFetchStream; i.setPDFNetworkStreamFactory(function (e) { return new d(e) }) } else { var f = r(152).PDFNetworkStream; i.setPDFNetworkStreamFactory(function (e) { return new f(e) }) } t.build = i.build, t.version = i.version, t.getDocument = i.getDocument, t.LoopbackPort = i.LoopbackPort, t.PDFDataRangeTransport = i.PDFDataRangeTransport, t.PDFWorker = i.PDFWorker, t.renderTextLayer = a.renderTextLayer, t.AnnotationLayer = o.AnnotationLayer, t.createPromiseCapability = n.createPromiseCapability, t.PasswordResponses = n.PasswordResponses, t.InvalidPDFException = n.InvalidPDFException, t.MissingPDFException = n.MissingPDFException, t.SVGGraphics = u.SVGGraphics, t.NativeImageDecoding = n.NativeImageDecoding, t.CMapCompressionType = n.CMapCompressionType, t.PermissionFlag = n.PermissionFlag, t.UnexpectedResponseException = n.UnexpectedResponseException, t.OPS = n.OPS, t.VerbosityLevel = n.VerbosityLevel, t.UNSUPPORTED_FEATURES = n.UNSUPPORTED_FEATURES, t.createValidAbsoluteUrl = n.createValidAbsoluteUrl, t.createObjectURL = n.createObjectURL, t.removeNullCharacters = n.removeNullCharacters, t.shadow = n.shadow, t.Util = n.Util, t.ReadableStream = n.ReadableStream, t.URL = n.URL, t.RenderingCancelledException = s.RenderingCancelledException, t.getFilenameFromUrl = s.getFilenameFromUrl, t.LinkTarget = s.LinkTarget, t.addLinkAttributes = s.addLinkAttributes, t.loadScript = s.loadScript, t.GlobalWorkerOptions = l.GlobalWorkerOptions, t.apiCompatibilityParams = c.apiCompatibilityParams }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.unreachable = t.warn = t.utf8StringToString = t.stringToUTF8String = t.stringToPDFString = t.stringToBytes = t.string32 = t.shadow = t.setVerbosityLevel = t.URL = t.ReadableStream = t.removeNullCharacters = t.readUint32 = t.readUint16 = t.readInt8 = t.log2 = t.isEvalSupported = t.isLittleEndian = t.createValidAbsoluteUrl = t.isSameOrigin = t.isSpace = t.isString = t.isNum = t.isEmptyObj = t.isBool = t.isArrayBuffer = t.info = t.getVerbosityLevel = t.getLookupTableFactory = t.getInheritableProperty = t.deprecated = t.createObjectURL = t.createPromiseCapability = t.bytesToString = t.assert = t.arraysToBytes = t.arrayByteLength = t.FormatError = t.XRefParseException = t.toRomanNumerals = t.Util = t.UnknownErrorException = t.UnexpectedResponseException = t.TextRenderingMode = t.StreamType = t.PermissionFlag = t.PasswordResponses = t.PasswordException = t.NativeImageDecoding = t.MissingPDFException = t.MissingDataException = t.InvalidPDFException = t.AbortException = t.CMapCompressionType = t.ImageKind = t.FontType = t.AnnotationType = t.AnnotationFlag = t.AnnotationFieldFlag = t.AnnotationBorderStyleType = t.UNSUPPORTED_FEATURES = t.VerbosityLevel = t.OPS = t.IDENTITY_MATRIX = t.FONT_IDENTITY_MATRIX = void 0; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }; r(2); var i = r(125), a = r(127), o = { ERRORS: 0, WARNINGS: 1, INFOS: 5 }, s = o.WARNINGS; function u(e) { s >= o.WARNINGS && console.log("Warning: " + e) } function l(e) { throw new Error(e) } function c(e, t) { e || l(t) } var h = function () { function e(e, t) { this.name = "PasswordException", this.message = e, this.code = t } return e.prototype = new Error, e.constructor = e, e }(), d = function () { function e(e, t) { this.name = "UnknownErrorException", this.message = e, this.details = t } return e.prototype = new Error, e.constructor = e, e }(), f = function () { function e(e) { this.name = "InvalidPDFException", this.message = e } return e.prototype = new Error, e.constructor = e, e }(), p = function () { function e(e) { this.name = "MissingPDFException", this.message = e } return e.prototype = new Error, e.constructor = e, e }(), v = function () { function e(e, t) { this.name = "UnexpectedResponseException", this.message = e, this.status = t } return e.prototype = new Error, e.constructor = e, e }(), m = function () { function e(e, t) { this.begin = e, this.end = t, this.message = "Missing data [" + e + ", " + t + ")" } return e.prototype = new Error, e.prototype.name = "MissingDataException", e.constructor = e, e }(), g = function () { function e(e) { this.message = e } return e.prototype = new Error, e.prototype.name = "XRefParseException", e.constructor = e, e }(), y = function () { function e(e) { this.message = e } return e.prototype = new Error, e.prototype.name = "FormatError", e.constructor = e, e }(), b = function () { function e(e) { this.name = "AbortException", this.message = e } return e.prototype = new Error, e.constructor = e, e }(), _ = /\x00/g; function A(e) { c("string" == typeof e, "Invalid argument for stringToBytes"); for (var t = e.length, r = new Uint8Array(t), n = 0; n < t; ++n)r[n] = 255 & e.charCodeAt(n); return r } function S(e) { return void 0 !== e.length ? e.length : (c(void 0 !== e.byteLength), e.byteLength) } var w = function () { function e() { } var t = ["rgb(", 0, ",", 0, ",", 0, ")"]; return e.makeCssRgb = function (e, r, n) { return t[1] = e, t[3] = r, t[5] = n, t.join("") }, e.transform = function (e, t) { return [e[0] * t[0] + e[2] * t[1], e[1] * t[0] + e[3] * t[1], e[0] * t[2] + e[2] * t[3], e[1] * t[2] + e[3] * t[3], e[0] * t[4] + e[2] * t[5] + e[4], e[1] * t[4] + e[3] * t[5] + e[5]] }, e.applyTransform = function (e, t) { return [e[0] * t[0] + e[1] * t[2] + t[4], e[0] * t[1] + e[1] * t[3] + t[5]] }, e.applyInverseTransform = function (e, t) { var r = t[0] * t[3] - t[1] * t[2]; return [(e[0] * t[3] - e[1] * t[2] + t[2] * t[5] - t[4] * t[3]) / r, (-e[0] * t[1] + e[1] * t[0] + t[4] * t[1] - t[5] * t[0]) / r] }, e.getAxialAlignedBoundingBox = function (t, r) { var n = e.applyTransform(t, r), i = e.applyTransform(t.slice(2, 4), r), a = e.applyTransform([t[0], t[3]], r), o = e.applyTransform([t[2], t[1]], r); return [Math.min(n[0], i[0], a[0], o[0]), Math.min(n[1], i[1], a[1], o[1]), Math.max(n[0], i[0], a[0], o[0]), Math.max(n[1], i[1], a[1], o[1])] }, e.inverseTransform = function (e) { var t = e[0] * e[3] - e[1] * e[2]; return [e[3] / t, -e[1] / t, -e[2] / t, e[0] / t, (e[2] * e[5] - e[4] * e[3]) / t, (e[4] * e[1] - e[5] * e[0]) / t] }, e.apply3dTransform = function (e, t) { return [e[0] * t[0] + e[1] * t[1] + e[2] * t[2], e[3] * t[0] + e[4] * t[1] + e[5] * t[2], e[6] * t[0] + e[7] * t[1] + e[8] * t[2]] }, e.singularValueDecompose2dScale = function (e) { var t = [e[0], e[2], e[1], e[3]], r = e[0] * t[0] + e[1] * t[2], n = e[0] * t[1] + e[1] * t[3], i = e[2] * t[0] + e[3] * t[2], a = e[2] * t[1] + e[3] * t[3], o = (r + a) / 2, s = Math.sqrt((r + a) * (r + a) - 4 * (r * a - i * n)) / 2, u = o + s || 1, l = o - s || 1; return [Math.sqrt(u), Math.sqrt(l)] }, e.normalizeRect = function (e) { var t = e.slice(0); return e[0] > e[2] && (t[0] = e[2], t[2] = e[0]), e[1] > e[3] && (t[1] = e[3], t[3] = e[1]), t }, e.intersect = function (t, r) { function n(e, t) { return e - t } var i = [t[0], t[2], r[0], r[2]].sort(n), a = [t[1], t[3], r[1], r[3]].sort(n), o = []; return t = e.normalizeRect(t), r = e.normalizeRect(r), (i[0] === t[0] && i[1] === r[0] || i[0] === r[0] && i[1] === t[0]) && (o[0] = i[1], o[2] = i[2], (a[0] === t[1] && a[1] === r[1] || a[0] === r[1] && a[1] === t[1]) && (o[1] = a[1], o[3] = a[2], o)) }, e }(), k = ["", "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"]; var P = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, 711, 710, 729, 733, 731, 730, 732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8226, 8224, 8225, 8230, 8212, 8211, 402, 8260, 8249, 8250, 8722, 8240, 8222, 8220, 8221, 8216, 8217, 8218, 8482, 64257, 64258, 321, 338, 352, 376, 381, 305, 322, 339, 353, 382, 0, 8364]; var x, C = (x = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", function (e, t) { if (!(arguments.length > 2 && void 0 !== arguments[2] && arguments[2]) && a.URL.createObjectURL) { var r = new Blob([e], { type: t }); return a.URL.createObjectURL(r) } for (var n = "data:" + t + ";base64,", i = 0, o = e.length; i < o; i += 3) { var s = 255 & e[i], u = 255 & e[i + 1], l = 255 & e[i + 2]; n += x[s >> 2] + x[(3 & s) << 4 | u >> 4] + x[i + 1 < o ? (15 & u) << 2 | l >> 6 : 64] + x[i + 2 < o ? 63 & l : 64] } return n }); t.FONT_IDENTITY_MATRIX = [.001, 0, 0, .001, 0, 0], t.IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0], t.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, beginAnnotations: 78, endAnnotations: 79, beginAnnotation: 80, endAnnotation: 81, paintJpegXObject: 82, paintImageMaskXObject: 83, paintImageMaskXObjectGroup: 84, paintImageXObject: 85, paintInlineImageXObject: 86, paintInlineImageXObjectGroup: 87, paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, constructPath: 91 }, t.VerbosityLevel = o, t.UNSUPPORTED_FEATURES = { unknown: "unknown", forms: "forms", javaScript: "javaScript", smask: "smask", shadingPattern: "shadingPattern", font: "font" }, t.AnnotationBorderStyleType = { SOLID: 1, DASHED: 2, BEVELED: 3, INSET: 4, UNDERLINE: 5 }, t.AnnotationFieldFlag = { READONLY: 1, REQUIRED: 2, NOEXPORT: 4, MULTILINE: 4096, PASSWORD: 8192, NOTOGGLETOOFF: 16384, RADIO: 32768, PUSHBUTTON: 65536, COMBO: 131072, EDIT: 262144, SORT: 524288, FILESELECT: 1048576, MULTISELECT: 2097152, DONOTSPELLCHECK: 4194304, DONOTSCROLL: 8388608, COMB: 16777216, RICHTEXT: 33554432, RADIOSINUNISON: 33554432, COMMITONSELCHANGE: 67108864 }, t.AnnotationFlag = { INVISIBLE: 1, HIDDEN: 2, PRINT: 4, NOZOOM: 8, NOROTATE: 16, NOVIEW: 32, READONLY: 64, LOCKED: 128, TOGGLENOVIEW: 256, LOCKEDCONTENTS: 512 }, t.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 }, t.FontType = { UNKNOWN: 0, TYPE1: 1, TYPE1C: 2, CIDFONTTYPE0: 3, CIDFONTTYPE0C: 4, TRUETYPE: 5, CIDFONTTYPE2: 6, TYPE3: 7, OPENTYPE: 8, TYPE0: 9, MMTYPE1: 10 }, t.ImageKind = { GRAYSCALE_1BPP: 1, RGB_24BPP: 2, RGBA_32BPP: 3 }, t.CMapCompressionType = { NONE: 0, BINARY: 1, STREAM: 2 }, t.AbortException = b, t.InvalidPDFException = f, t.MissingDataException = m, t.MissingPDFException = p, t.NativeImageDecoding = { NONE: "none", DECODE: "decode", DISPLAY: "display" }, t.PasswordException = h, t.PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 }, t.PermissionFlag = { PRINT: 4, MODIFY_CONTENTS: 8, COPY: 16, MODIFY_ANNOTATIONS: 32, FILL_INTERACTIVE_FORMS: 256, COPY_FOR_ACCESSIBILITY: 512, ASSEMBLE: 1024, PRINT_HIGH_QUALITY: 2048 }, t.StreamType = { UNKNOWN: 0, FLATE: 1, LZW: 2, DCT: 3, JPX: 4, JBIG: 5, A85: 6, AHX: 7, CCF: 8, RL: 9 }, t.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 }, t.UnexpectedResponseException = v, t.UnknownErrorException = d, t.Util = w, t.toRomanNumerals = function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; c(Number.isInteger(e) && e > 0, "The number should be a positive integer."); for (var r = void 0, n = []; e >= 1e3;)e -= 1e3, n.push("M"); r = e / 100 | 0, e %= 100, n.push(k[r]), r = e / 10 | 0, e %= 10, n.push(k[10 + r]), n.push(k[20 + e]); var i = n.join(""); return t ? i.toLowerCase() : i }, t.XRefParseException = g, t.FormatError = y, t.arrayByteLength = S, t.arraysToBytes = function (e) { if (1 === e.length && e[0] instanceof Uint8Array) return e[0]; var t, r, n, i = 0, a = e.length; for (t = 0; t < a; t++)i += n = S(r = e[t]); var o = 0, s = new Uint8Array(i); for (t = 0; t < a; t++)(r = e[t]) instanceof Uint8Array || (r = "string" == typeof r ? A(r) : new Uint8Array(r)), n = r.byteLength, s.set(r, o), o += n; return s }, t.assert = c, t.bytesToString = function (e) { c(null !== e && "object" === (void 0 === e ? "undefined" : n(e)) && void 0 !== e.length, "Invalid argument for bytesToString"); var t = e.length; if (t < 8192) return String.fromCharCode.apply(null, e); for (var r = [], i = 0; i < t; i += 8192) { var a = Math.min(i + 8192, t), o = e.subarray(i, a); r.push(String.fromCharCode.apply(null, o)) } return r.join("") }, t.createPromiseCapability = function () { var e = {}; return e.promise = new Promise(function (t, r) { e.resolve = t, e.reject = r }), e }, t.createObjectURL = C, t.deprecated = function (e) { console.log("Deprecated API usage: " + e) }, t.getInheritableProperty = function (e) { for (var t = e.dict, r = e.key, n = e.getArray, i = void 0 !== n && n, a = e.stopWhenFound, o = void 0 === a || a, s = 0, l = void 0; t;) { var c = i ? t.getArray(r) : t.get(r); if (void 0 !== c) { if (o) return c; l || (l = []), l.push(c) } if (++s > 100) { u('getInheritableProperty: maximum loop count exceeded for "' + r + '"'); break } t = t.get("Parent") } return l }, t.getLookupTableFactory = function (e) { var t; return function () { return e && (t = Object.create(null), e(t), e = null), t } }, t.getVerbosityLevel = function () { return s }, t.info = function (e) { s >= o.INFOS && console.log("Info: " + e) }, t.isArrayBuffer = function (e) { return "object" === (void 0 === e ? "undefined" : n(e)) && null !== e && void 0 !== e.byteLength }, t.isBool = function (e) { return "boolean" == typeof e }, t.isEmptyObj = function (e) { for (var t in e) return !1; return !0 }, t.isNum = function (e) { return "number" == typeof e }, t.isString = function (e) { return "string" == typeof e }, t.isSpace = function (e) { return 32 === e || 9 === e || 13 === e || 10 === e }, t.isSameOrigin = function (e, t) { try { var r = new a.URL(e); if (!r.origin || "null" === r.origin) return !1 } catch (e) { return !1 } var n = new a.URL(t, r); return r.origin === n.origin }, t.createValidAbsoluteUrl = function (e, t) { if (!e) return null; try { var r = t ? new a.URL(e, t) : new a.URL(e); if (function (e) { if (!e) return !1; switch (e.protocol) { case "http:": case "https:": case "ftp:": case "mailto:": case "tel:": return !0; default: return !1 } }(r)) return r } catch (e) { } return null }, t.isLittleEndian = function () { var e = new Uint8Array(4); return e[0] = 1, 1 === new Uint32Array(e.buffer, 0, 1)[0] }, t.isEvalSupported = function () { try { return new Function(""), !0 } catch (e) { return !1 } }, t.log2 = function (e) { return e <= 0 ? 0 : Math.ceil(Math.log2(e)) }, t.readInt8 = function (e, t) { return e[t] << 24 >> 24 }, t.readUint16 = function (e, t) { return e[t] << 8 | e[t + 1] }, t.readUint32 = function (e, t) { return (e[t] << 24 | e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3]) >>> 0 }, t.removeNullCharacters = function (e) { return "string" != typeof e ? (u("The argument for removeNullCharacters must be a string."), e) : e.replace(_, "") }, t.ReadableStream = i.ReadableStream, t.URL = a.URL, t.setVerbosityLevel = function (e) { Number.isInteger(e) && (s = e) }, t.shadow = function (e, t, r) { return Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !1 }), r }, t.string32 = function (e) { return String.fromCharCode(e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, 255 & e) }, t.stringToBytes = A, t.stringToPDFString = function (e) { var t, r = e.length, n = []; if ("þ" === e[0] && "ÿ" === e[1]) for (t = 2; t < r; t += 2)n.push(String.fromCharCode(e.charCodeAt(t) << 8 | e.charCodeAt(t + 1))); else for (t = 0; t < r; ++t) { var i = P[e.charCodeAt(t)]; n.push(i ? String.fromCharCode(i) : e.charAt(t)) } return n.join("") }, t.stringToUTF8String = function (e) { return decodeURIComponent(escape(e)) }, t.utf8StringToString = function (e) { return unescape(encodeURIComponent(e)) }, t.warn = u, t.unreachable = l }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, i = r(3); if (!i._pdfjsCompatibilityChecked) { i._pdfjsCompatibilityChecked = !0; var a = r(4), o = "object" === ("undefined" == typeof window ? "undefined" : n(window)) && "object" === ("undefined" == typeof document ? "undefined" : n(document)); !i.btoa && a() && (i.btoa = function (e) { return Buffer.from(e, "binary").toString("base64") }), !i.atob && a() && (i.atob = function (e) { return Buffer.from(e, "base64").toString("binary") }), o && ("currentScript" in document || Object.defineProperty(document, "currentScript", { get: function () { var e = document.getElementsByTagName("script"); return e[e.length - 1] }, enumerable: !0, configurable: !0 })), o && void 0 === Element.prototype.remove && (Element.prototype.remove = function () { this.parentNode && this.parentNode.removeChild(this) }), function () { if (o && !a() && !1 !== document.createElement("div").classList.toggle("test", 0)) { var e = DOMTokenList.prototype.toggle; DOMTokenList.prototype.toggle = function (t) { if (arguments.length > 1) { var r = !!arguments[1]; return this[r ? "add" : "remove"](t), r } return e(t) } } }(), String.prototype.includes || r(5), Array.prototype.includes || r(33), Object.assign || r(42), Math.log2 || (Math.log2 = r(52)), Number.isNaN || (Number.isNaN = r(54)), Number.isInteger || (Number.isInteger = r(56)), i.Promise || (i.Promise = r(59)), i.WeakMap || (i.WeakMap = r(94)), String.codePointAt || (String.codePointAt = r(111)), String.fromCodePoint || (String.fromCodePoint = r(113)), i.Symbol || r(115), Object.values || (Object.values = r(122)) } }, function (e, t, r) { "use strict"; e.exports = "undefined" != typeof window && window.Math === Math ? window : "undefined" != typeof global && global.Math === Math ? global : "undefined" != typeof self && self.Math === Math ? self : {} }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }; e.exports = function () { return "object" === ("undefined" == typeof process ? "undefined" : n(process)) && process + "" == "[object process]" } }, function (e, t, r) { "use strict"; r(6), e.exports = r(9).String.includes }, function (e, t, r) { "use strict"; var n = r(7), i = r(25); n(n.P + n.F * r(32)("includes"), "String", { includes: function (e) { return !!~i(this, e, "includes").indexOf(e, arguments.length > 1 ? arguments[1] : void 0) } }) }, function (e, t, r) { "use strict"; var n = r(8), i = r(9), a = r(10), o = r(20), s = r(23), u = function e(t, r, u) { var l, c, h, d, f = t & e.F, p = t & e.G, v = t & e.P, m = t & e.B, g = p ? n : t & e.S ? n[r] || (n[r] = {}) : (n[r] || {}).prototype, y = p ? i : i[r] || (i[r] = {}), b = y.prototype || (y.prototype = {}); for (l in p && (u = r), u) h = ((c = !f && g && void 0 !== g[l]) ? g : u)[l], d = m && c ? s(h, n) : v && "function" == typeof h ? s(Function.call, h) : h, g && o(g, l, h, t & e.U), y[l] != h && a(y, l, d), v && b[l] != h && (b[l] = h) }; n.core = i, u.F = 1, u.G = 2, u.S = 4, u.P = 8, u.B = 16, u.W = 32, u.U = 64, u.R = 128, e.exports = u }, function (e, t, r) { "use strict"; var n = e.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); "number" == typeof __g && (__g = n) }, function (e, t, r) { "use strict"; var n = e.exports = { version: "2.5.7" }; "number" == typeof __e && (__e = n) }, function (e, t, r) { "use strict"; var n = r(11), i = r(19); e.exports = r(15) ? function (e, t, r) { return n.f(e, t, i(1, r)) } : function (e, t, r) { return e[t] = r, e } }, function (e, t, r) { "use strict"; var n = r(12), i = r(14), a = r(18), o = Object.defineProperty; t.f = r(15) ? Object.defineProperty : function (e, t, r) { if (n(e), t = a(t, !0), n(r), i) try { return o(e, t, r) } catch (e) { } if ("get" in r || "set" in r) throw TypeError("Accessors not supported!"); return "value" in r && (e[t] = r.value), e } }, function (e, t, r) { "use strict"; var n = r(13); e.exports = function (e) { if (!n(e)) throw TypeError(e + " is not an object!"); return e } }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }; e.exports = function (e) { return "object" === (void 0 === e ? "undefined" : n(e)) ? null !== e : "function" == typeof e } }, function (e, t, r) { "use strict"; e.exports = !r(15) && !r(16)(function () { return 7 != Object.defineProperty(r(17)("div"), "a", { get: function () { return 7 } }).a }) }, function (e, t, r) { "use strict"; e.exports = !r(16)(function () { return 7 != Object.defineProperty({}, "a", { get: function () { return 7 } }).a }) }, function (e, t, r) { "use strict"; e.exports = function (e) { try { return !!e() } catch (e) { return !0 } } }, function (e, t, r) { "use strict"; var n = r(13), i = r(8).document, a = n(i) && n(i.createElement); e.exports = function (e) { return a ? i.createElement(e) : {} } }, function (e, t, r) { "use strict"; var n = r(13); e.exports = function (e, t) { if (!n(e)) return e; var r, i; if (t && "function" == typeof (r = e.toString) && !n(i = r.call(e))) return i; if ("function" == typeof (r = e.valueOf) && !n(i = r.call(e))) return i; if (!t && "function" == typeof (r = e.toString) && !n(i = r.call(e))) return i; throw TypeError("Can't convert object to primitive value") } }, function (e, t, r) { "use strict"; e.exports = function (e, t) { return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: t } } }, function (e, t, r) { "use strict"; var n = r(8), i = r(10), a = r(21), o = r(22)("src"), s = Function.toString, u = ("" + s).split("toString"); r(9).inspectSource = function (e) { return s.call(e) }, (e.exports = function (e, t, r, s) { var l = "function" == typeof r; l && (a(r, "name") || i(r, "name", t)), e[t] !== r && (l && (a(r, o) || i(r, o, e[t] ? "" + e[t] : u.join(String(t)))), e === n ? e[t] = r : s ? e[t] ? e[t] = r : i(e, t, r) : (delete e[t], i(e, t, r))) })(Function.prototype, "toString", function () { return "function" == typeof this && this[o] || s.call(this) }) }, function (e, t, r) { "use strict"; var n = {}.hasOwnProperty; e.exports = function (e, t) { return n.call(e, t) } }, function (e, t, r) { "use strict"; var n = 0, i = Math.random(); e.exports = function (e) { return "Symbol(".concat(void 0 === e ? "" : e, ")_", (++n + i).toString(36)) } }, function (e, t, r) { "use strict"; var n = r(24); e.exports = function (e, t, r) { if (n(e), void 0 === t) return e; switch (r) { case 1: return function (r) { return e.call(t, r) }; case 2: return function (r, n) { return e.call(t, r, n) }; case 3: return function (r, n, i) { return e.call(t, r, n, i) } }return function () { return e.apply(t, arguments) } } }, function (e, t, r) { "use strict"; e.exports = function (e) { if ("function" != typeof e) throw TypeError(e + " is not a function!"); return e } }, function (e, t, r) { "use strict"; var n = r(26), i = r(31); e.exports = function (e, t, r) { if (n(t)) throw TypeError("String#" + r + " doesn't accept regex!"); return String(i(e)) } }, function (e, t, r) { "use strict"; var n = r(13), i = r(27), a = r(28)("match"); e.exports = function (e) { var t; return n(e) && (void 0 !== (t = e[a]) ? !!t : "RegExp" == i(e)) } }, function (e, t, r) { "use strict"; var n = {}.toString; e.exports = function (e) { return n.call(e).slice(8, -1) } }, function (e, t, r) { "use strict"; var n = r(29)("wks"), i = r(22), a = r(8).Symbol, o = "function" == typeof a; (e.exports = function (e) { return n[e] || (n[e] = o && a[e] || (o ? a : i)("Symbol." + e)) }).store = n }, function (e, t, r) { "use strict"; var n = r(9), i = r(8), a = i["__core-js_shared__"] || (i["__core-js_shared__"] = {}); (e.exports = function (e, t) { return a[e] || (a[e] = void 0 !== t ? t : {}) })("versions", []).push({ version: n.version, mode: r(30) ? "pure" : "global", copyright: "© 2018 Denis Pushkarev (zloirock.ru)" }) }, function (e, t, r) { "use strict"; e.exports = !1 }, function (e, t, r) { "use strict"; e.exports = function (e) { if (void 0 == e) throw TypeError("Can't call method on " + e); return e } }, function (e, t, r) { "use strict"; var n = r(28)("match"); e.exports = function (e) { var t = /./; try { "/./"[e](t) } catch (r) { try { return t[n] = !1, !"/./"[e](t) } catch (e) { } } return !0 } }, function (e, t, r) { "use strict"; r(34), e.exports = r(9).Array.includes }, function (e, t, r) { "use strict"; var n = r(7), i = r(35)(!0); n(n.P, "Array", { includes: function (e) { return i(this, e, arguments.length > 1 ? arguments[1] : void 0) } }), r(41)("includes") }, function (e, t, r) { "use strict"; var n = r(36), i = r(38), a = r(40); e.exports = function (e) { return function (t, r, o) { var s, u = n(t), l = i(u.length), c = a(o, l); if (e && r != r) { for (; l > c;)if ((s = u[c++]) != s) return !0 } else for (; l > c; c++)if ((e || c in u) && u[c] === r) return e || c || 0; return !e && -1 } } }, function (e, t, r) { "use strict"; var n = r(37), i = r(31); e.exports = function (e) { return n(i(e)) } }, function (e, t, r) { "use strict"; var n = r(27); e.exports = Object("z").propertyIsEnumerable(0) ? Object : function (e) { return "String" == n(e) ? e.split("") : Object(e) } }, function (e, t, r) { "use strict"; var n = r(39), i = Math.min; e.exports = function (e) { return e > 0 ? i(n(e), 9007199254740991) : 0 } }, function (e, t, r) { "use strict"; var n = Math.ceil, i = Math.floor; e.exports = function (e) { return isNaN(e = +e) ? 0 : (e > 0 ? i : n)(e) } }, function (e, t, r) { "use strict"; var n = r(39), i = Math.max, a = Math.min; e.exports = function (e, t) { return (e = n(e)) < 0 ? i(e + t, 0) : a(e, t) } }, function (e, t, r) { "use strict"; var n = r(28)("unscopables"), i = Array.prototype; void 0 == i[n] && r(10)(i, n, {}), e.exports = function (e) { i[n][e] = !0 } }, function (e, t, r) { "use strict"; r(43), e.exports = r(9).Object.assign }, function (e, t, r) { "use strict"; var n = r(7); n(n.S + n.F, "Object", { assign: r(44) }) }, function (e, t, r) { "use strict"; var n = r(45), i = r(49), a = r(50), o = r(51), s = r(37), u = Object.assign; e.exports = !u || r(16)(function () { var e = {}, t = {}, r = Symbol(), n = "abcdefghijklmnopqrst"; return e[r] = 7, n.split("").forEach(function (e) { t[e] = e }), 7 != u({}, e)[r] || Object.keys(u({}, t)).join("") != n }) ? function (e, t) { for (var r = o(e), u = arguments.length, l = 1, c = i.f, h = a.f; u > l;)for (var d, f = s(arguments[l++]), p = c ? n(f).concat(c(f)) : n(f), v = p.length, m = 0; v > m;)h.call(f, d = p[m++]) && (r[d] = f[d]); return r } : u }, function (e, t, r) { "use strict"; var n = r(46), i = r(48); e.exports = Object.keys || function (e) { return n(e, i) } }, function (e, t, r) { "use strict"; var n = r(21), i = r(36), a = r(35)(!1), o = r(47)("IE_PROTO"); e.exports = function (e, t) { var r, s = i(e), u = 0, l = []; for (r in s) r != o && n(s, r) && l.push(r); for (; t.length > u;)n(s, r = t[u++]) && (~a(l, r) || l.push(r)); return l } }, function (e, t, r) { "use strict"; var n = r(29)("keys"), i = r(22); e.exports = function (e) { return n[e] || (n[e] = i(e)) } }, function (e, t, r) { "use strict"; e.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",") }, function (e, t, r) { "use strict"; t.f = Object.getOwnPropertySymbols }, function (e, t, r) { "use strict"; t.f = {}.propertyIsEnumerable }, function (e, t, r) { "use strict"; var n = r(31); e.exports = function (e) { return Object(n(e)) } }, function (e, t, r) { "use strict"; r(53), e.exports = r(9).Math.log2 }, function (e, t, r) { "use strict"; var n = r(7); n(n.S, "Math", { log2: function (e) { return Math.log(e) / Math.LN2 } }) }, function (e, t, r) { "use strict"; r(55), e.exports = r(9).Number.isNaN }, function (e, t, r) { "use strict"; var n = r(7); n(n.S, "Number", { isNaN: function (e) { return e != e } }) }, function (e, t, r) { "use strict"; r(57), e.exports = r(9).Number.isInteger }, function (e, t, r) { "use strict"; var n = r(7); n(n.S, "Number", { isInteger: r(58) }) }, function (e, t, r) { "use strict"; var n = r(13), i = Math.floor; e.exports = function (e) { return !n(e) && isFinite(e) && i(e) === e } }, function (e, t, r) { "use strict"; r(60), r(62), r(72), r(75), r(92), r(93), e.exports = r(9).Promise }, function (e, t, r) { "use strict"; var n = r(61), i = {}; i[r(28)("toStringTag")] = "z", i + "" != "[object z]" && r(20)(Object.prototype, "toString", function () { return "[object " + n(this) + "]" }, !0) }, function (e, t, r) { "use strict"; var n = r(27), i = r(28)("toStringTag"), a = "Arguments" == n(function () { return arguments }()); e.exports = function (e) { var t, r, o; return void 0 === e ? "Undefined" : null === e ? "Null" : "string" == typeof (r = function (e, t) { try { return e[t] } catch (e) { } }(t = Object(e), i)) ? r : a ? n(t) : "Object" == (o = n(t)) && "function" == typeof t.callee ? "Arguments" : o } }, function (e, t, r) { "use strict"; var n = r(63)(!0); r(64)(String, "String", function (e) { this._t = String(e), this._i = 0 }, function () { var e, t = this._t, r = this._i; return r >= t.length ? { value: void 0, done: !0 } : (e = n(t, r), this._i += e.length, { value: e, done: !1 }) }) }, function (e, t, r) { "use strict"; var n = r(39), i = r(31); e.exports = function (e) { return function (t, r) { var a, o, s = String(i(t)), u = n(r), l = s.length; return u < 0 || u >= l ? e ? "" : void 0 : (a = s.charCodeAt(u)) < 55296 || a > 56319 || u + 1 === l || (o = s.charCodeAt(u + 1)) < 56320 || o > 57343 ? e ? s.charAt(u) : a : e ? s.slice(u, u + 2) : o - 56320 + (a - 55296 << 10) + 65536 } } }, function (e, t, r) { "use strict"; var n = r(30), i = r(7), a = r(20), o = r(10), s = r(65), u = r(66), l = r(70), c = r(71), h = r(28)("iterator"), d = !([].keys && "next" in [].keys()), f = function () { return this }; e.exports = function (e, t, r, p, v, m, g) { u(r, t, p); var y, b, _, A = function (e) { if (!d && e in P) return P[e]; switch (e) { case "keys": case "values": return function () { return new r(this, e) } }return function () { return new r(this, e) } }, S = t + " Iterator", w = "values" == v, k = !1, P = e.prototype, x = P[h] || P["@@iterator"] || v && P[v], C = x || A(v), R = v ? w ? A("entries") : C : void 0, E = "Array" == t && P.entries || x; if (E && (_ = c(E.call(new e))) !== Object.prototype && _.next && (l(_, S, !0), n || "function" == typeof _[h] || o(_, h, f)), w && x && "values" !== x.name && (k = !0, C = function () { return x.call(this) }), n && !g || !d && !k && P[h] || o(P, h, C), s[t] = C, s[S] = f, v) if (y = { values: w ? C : A("values"), keys: m ? C : A("keys"), entries: R }, g) for (b in y) b in P || a(P, b, y[b]); else i(i.P + i.F * (d || k), t, y); return y } }, function (e, t, r) { "use strict"; e.exports = {} }, function (e, t, r) { "use strict"; var n = r(67), i = r(19), a = r(70), o = {}; r(10)(o, r(28)("iterator"), function () { return this }), e.exports = function (e, t, r) { e.prototype = n(o, { next: i(1, r) }), a(e, t + " Iterator") } }, function (e, t, r) { "use strict"; var n = r(12), i = r(68), a = r(48), o = r(47)("IE_PROTO"), s = function () { }, u = function () { var e, t = r(17)("iframe"), n = a.length; for (t.style.display = "none", r(69).appendChild(t), t.src = "javascript:", (e = t.contentWindow.document).open(), e.write("<script>document.F=Object<\/script>"), e.close(), u = e.F; n--;)delete u.prototype[a[n]]; return u() }; e.exports = Object.create || function (e, t) { var r; return null !== e ? (s.prototype = n(e), r = new s, s.prototype = null, r[o] = e) : r = u(), void 0 === t ? r : i(r, t) } }, function (e, t, r) { "use strict"; var n = r(11), i = r(12), a = r(45); e.exports = r(15) ? Object.defineProperties : function (e, t) { i(e); for (var r, o = a(t), s = o.length, u = 0; s > u;)n.f(e, r = o[u++], t[r]); return e } }, function (e, t, r) { "use strict"; var n = r(8).document; e.exports = n && n.documentElement }, function (e, t, r) { "use strict"; var n = r(11).f, i = r(21), a = r(28)("toStringTag"); e.exports = function (e, t, r) { e && !i(e = r ? e : e.prototype, a) && n(e, a, { configurable: !0, value: t }) } }, function (e, t, r) { "use strict"; var n = r(21), i = r(51), a = r(47)("IE_PROTO"), o = Object.prototype; e.exports = Object.getPrototypeOf || function (e) { return e = i(e), n(e, a) ? e[a] : "function" == typeof e.constructor && e instanceof e.constructor ? e.constructor.prototype : e instanceof Object ? o : null } }, function (e, t, r) { "use strict"; for (var n = r(73), i = r(45), a = r(20), o = r(8), s = r(10), u = r(65), l = r(28), c = l("iterator"), h = l("toStringTag"), d = u.Array, f = { CSSRuleList: !0, CSSStyleDeclaration: !1, CSSValueList: !1, ClientRectList: !1, DOMRectList: !1, DOMStringList: !1, DOMTokenList: !0, DataTransferItemList: !1, FileList: !1, HTMLAllCollection: !1, HTMLCollection: !1, HTMLFormElement: !1, HTMLSelectElement: !1, MediaList: !0, MimeTypeArray: !1, NamedNodeMap: !1, NodeList: !0, PaintRequestList: !1, Plugin: !1, PluginArray: !1, SVGLengthList: !1, SVGNumberList: !1, SVGPathSegList: !1, SVGPointList: !1, SVGStringList: !1, SVGTransformList: !1, SourceBufferList: !1, StyleSheetList: !0, TextTrackCueList: !1, TextTrackList: !1, TouchList: !1 }, p = i(f), v = 0; v < p.length; v++) { var m, g = p[v], y = f[g], b = o[g], _ = b && b.prototype; if (_ && (_[c] || s(_, c, d), _[h] || s(_, h, g), u[g] = d, y)) for (m in n) _[m] || a(_, m, n[m], !0) } }, function (e, t, r) { "use strict"; var n = r(41), i = r(74), a = r(65), o = r(36); e.exports = r(64)(Array, "Array", function (e, t) { this._t = o(e), this._i = 0, this._k = t }, function () { var e = this._t, t = this._k, r = this._i++; return !e || r >= e.length ? (this._t = void 0, i(1)) : i(0, "keys" == t ? r : "values" == t ? e[r] : [r, e[r]]) }, "values"), a.Arguments = a.Array, n("keys"), n("values"), n("entries") }, function (e, t, r) { "use strict"; e.exports = function (e, t) { return { value: t, done: !!e } } }, function (e, t, r) { "use strict"; var n, i, a, o, s = r(30), u = r(8), l = r(23), c = r(61), h = r(7), d = r(13), f = r(24), p = r(76), v = r(77), m = r(81), g = r(82).set, y = r(84)(), b = r(85), _ = r(86), A = r(87), S = r(88), w = u.TypeError, k = u.process, P = k && k.versions, x = P && P.v8 || "", C = u.Promise, R = "process" == c(k), E = function () { }, T = i = b.f, O = !!function () { try { var e = C.resolve(1), t = (e.constructor = {})[r(28)("species")] = function (e) { e(E, E) }; return (R || "function" == typeof PromiseRejectionEvent) && e.then(E) instanceof t && 0 !== x.indexOf("6.6") && -1 === A.indexOf("Chrome/66") } catch (e) { } }(), I = function (e) { var t; return !(!d(e) || "function" != typeof (t = e.then)) && t }, F = function (e, t) { if (!e._n) { e._n = !0; var r = e._c; y(function () { for (var n = e._v, i = 1 == e._s, a = 0, o = function (t) { var r, a, o, s = i ? t.ok : t.fail, u = t.resolve, l = t.reject, c = t.domain; try { s ? (i || (2 == e._h && M(e), e._h = 1), !0 === s ? r = n : (c && c.enter(), r = s(n), c && (c.exit(), o = !0)), r === t.promise ? l(w("Promise-chain cycle")) : (a = I(r)) ? a.call(r, u, l) : u(r)) : l(n) } catch (e) { c && !o && c.exit(), l(e) } }; r.length > a;)o(r[a++]); e._c = [], e._n = !1, t && !e._h && L(e) }) } }, L = function (e) { g.call(u, function () { var t, r, n, i = e._v, a = j(e); if (a && (t = _(function () { R ? k.emit("unhandledRejection", i, e) : (r = u.onunhandledrejection) ? r({ promise: e, reason: i }) : (n = u.console) && n.error && n.error("Unhandled promise rejection", i) }), e._h = R || j(e) ? 2 : 1), e._a = void 0, a && t.e) throw t.v }) }, j = function (e) { return 1 !== e._h && 0 === (e._a || e._c).length }, M = function (e) { g.call(u, function () { var t; R ? k.emit("rejectionHandled", e) : (t = u.onrejectionhandled) && t({ promise: e, reason: e._v }) }) }, D = function (e) { var t = this; t._d || (t._d = !0, (t = t._w || t)._v = e, t._s = 2, t._a || (t._a = t._c.slice()), F(t, !0)) }, N = function e(t) { var r, n = this; if (!n._d) { n._d = !0, n = n._w || n; try { if (n === t) throw w("Promise can't be resolved itself"); (r = I(t)) ? y(function () { var i = { _w: n, _d: !1 }; try { r.call(t, l(e, i, 1), l(D, i, 1)) } catch (e) { D.call(i, e) } }) : (n._v = t, n._s = 1, F(n, !1)) } catch (e) { D.call({ _w: n, _d: !1 }, e) } } }; O || (C = function (e) { p(this, C, "Promise", "_h"), f(e), n.call(this); try { e(l(N, this, 1), l(D, this, 1)) } catch (e) { D.call(this, e) } }, (n = function (e) { this._c = [], this._a = void 0, this._s = 0, this._d = !1, this._v = void 0, this._h = 0, this._n = !1 }).prototype = r(89)(C.prototype, { then: function (e, t) { var r = T(m(this, C)); return r.ok = "function" != typeof e || e, r.fail = "function" == typeof t && t, r.domain = R ? k.domain : void 0, this._c.push(r), this._a && this._a.push(r), this._s && F(this, !1), r.promise }, catch: function (e) { return this.then(void 0, e) } }), a = function () { var e = new n; this.promise = e, this.resolve = l(N, e, 1), this.reject = l(D, e, 1) }, b.f = T = function (e) { return e === C || e === o ? new a(e) : i(e) }), h(h.G + h.W + h.F * !O, { Promise: C }), r(70)(C, "Promise"), r(90)("Promise"), o = r(9).Promise, h(h.S + h.F * !O, "Promise", { reject: function (e) { var t = T(this); return (0, t.reject)(e), t.promise } }), h(h.S + h.F * (s || !O), "Promise", { resolve: function (e) { return S(s && this === o ? C : this, e) } }), h(h.S + h.F * !(O && r(91)(function (e) { C.all(e).catch(E) })), "Promise", { all: function (e) { var t = this, r = T(t), n = r.resolve, i = r.reject, a = _(function () { var r = [], a = 0, o = 1; v(e, !1, function (e) { var s = a++, u = !1; r.push(void 0), o++, t.resolve(e).then(function (e) { u || (u = !0, r[s] = e, --o || n(r)) }, i) }), --o || n(r) }); return a.e && i(a.v), r.promise }, race: function (e) { var t = this, r = T(t), n = r.reject, i = _(function () { v(e, !1, function (e) { t.resolve(e).then(r.resolve, n) }) }); return i.e && n(i.v), r.promise } }) }, function (e, t, r) { "use strict"; e.exports = function (e, t, r, n) { if (!(e instanceof t) || void 0 !== n && n in e) throw TypeError(r + ": incorrect invocation!"); return e } }, function (e, t, r) { "use strict"; var n = r(23), i = r(78), a = r(79), o = r(12), s = r(38), u = r(80), l = {}, c = {}, h = e.exports = function (e, t, r, h, d) { var f, p, v, m, g = d ? function () { return e } : u(e), y = n(r, h, t ? 2 : 1), b = 0; if ("function" != typeof g) throw TypeError(e + " is not iterable!"); if (a(g)) { for (f = s(e.length); f > b; b++)if ((m = t ? y(o(p = e[b])[0], p[1]) : y(e[b])) === l || m === c) return m } else for (v = g.call(e); !(p = v.next()).done;)if ((m = i(v, y, p.value, t)) === l || m === c) return m }; h.BREAK = l, h.RETURN = c }, function (e, t, r) { "use strict"; var n = r(12); e.exports = function (e, t, r, i) { try { return i ? t(n(r)[0], r[1]) : t(r) } catch (t) { var a = e.return; throw void 0 !== a && n(a.call(e)), t } } }, function (e, t, r) { "use strict"; var n = r(65), i = r(28)("iterator"), a = Array.prototype; e.exports = function (e) { return void 0 !== e && (n.Array === e || a[i] === e) } }, function (e, t, r) { "use strict"; var n = r(61), i = r(28)("iterator"), a = r(65); e.exports = r(9).getIteratorMethod = function (e) { if (void 0 != e) return e[i] || e["@@iterator"] || a[n(e)] } }, function (e, t, r) { "use strict"; var n = r(12), i = r(24), a = r(28)("species"); e.exports = function (e, t) { var r, o = n(e).constructor; return void 0 === o || void 0 == (r = n(o)[a]) ? t : i(r) } }, function (e, t, r) { "use strict"; var n, i, a, o = r(23), s = r(83), u = r(69), l = r(17), c = r(8), h = c.process, d = c.setImmediate, f = c.clearImmediate, p = c.MessageChannel, v = c.Dispatch, m = 0, g = {}, y = function () { var e = +this; if (g.hasOwnProperty(e)) { var t = g[e]; delete g[e], t() } }, b = function (e) { y.call(e.data) }; d && f || (d = function (e) { for (var t = [], r = 1; arguments.length > r;)t.push(arguments[r++]); return g[++m] = function () { s("function" == typeof e ? e : Function(e), t) }, n(m), m }, f = function (e) { delete g[e] }, "process" == r(27)(h) ? n = function (e) { h.nextTick(o(y, e, 1)) } : v && v.now ? n = function (e) { v.now(o(y, e, 1)) } : p ? (a = (i = new p).port2, i.port1.onmessage = b, n = o(a.postMessage, a, 1)) : c.addEventListener && "function" == typeof postMessage && !c.importScripts ? (n = function (e) { c.postMessage(e + "", "*") }, c.addEventListener("message", b, !1)) : n = "onreadystatechange" in l("script") ? function (e) { u.appendChild(l("script")).onreadystatechange = function () { u.removeChild(this), y.call(e) } } : function (e) { setTimeout(o(y, e, 1), 0) }), e.exports = { set: d, clear: f } }, function (e, t, r) { "use strict"; e.exports = function (e, t, r) { var n = void 0 === r; switch (t.length) { case 0: return n ? e() : e.call(r); case 1: return n ? e(t[0]) : e.call(r, t[0]); case 2: return n ? e(t[0], t[1]) : e.call(r, t[0], t[1]); case 3: return n ? e(t[0], t[1], t[2]) : e.call(r, t[0], t[1], t[2]); case 4: return n ? e(t[0], t[1], t[2], t[3]) : e.call(r, t[0], t[1], t[2], t[3]) }return e.apply(r, t) } }, function (e, t, r) { "use strict"; var n = r(8), i = r(82).set, a = n.MutationObserver || n.WebKitMutationObserver, o = n.process, s = n.Promise, u = "process" == r(27)(o); e.exports = function () { var e, t, r, l = function () { var n, i; for (u && (n = o.domain) && n.exit(); e;) { i = e.fn, e = e.next; try { i() } catch (n) { throw e ? r() : t = void 0, n } } t = void 0, n && n.enter() }; if (u) r = function () { o.nextTick(l) }; else if (!a || n.navigator && n.navigator.standalone) if (s && s.resolve) { var c = s.resolve(void 0); r = function () { c.then(l) } } else r = function () { i.call(n, l) }; else { var h = !0, d = document.createTextNode(""); new a(l).observe(d, { characterData: !0 }), r = function () { d.data = h = !h } } return function (n) { var i = { fn: n, next: void 0 }; t && (t.next = i), e || (e = i, r()), t = i } } }, function (e, t, r) { "use strict"; var n = r(24); e.exports.f = function (e) { return new function (e) { var t, r; this.promise = new e(function (e, n) { if (void 0 !== t || void 0 !== r) throw TypeError("Bad Promise constructor"); t = e, r = n }), this.resolve = n(t), this.reject = n(r) }(e) } }, function (e, t, r) { "use strict"; e.exports = function (e) { try { return { e: !1, v: e() } } catch (e) { return { e: !0, v: e } } } }, function (e, t, r) { "use strict"; var n = r(8).navigator; e.exports = n && n.userAgent || "" }, function (e, t, r) { "use strict"; var n = r(12), i = r(13), a = r(85); e.exports = function (e, t) { if (n(e), i(t) && t.constructor === e) return t; var r = a.f(e); return (0, r.resolve)(t), r.promise } }, function (e, t, r) { "use strict"; var n = r(20); e.exports = function (e, t, r) { for (var i in t) n(e, i, t[i], r); return e } }, function (e, t, r) { "use strict"; var n = r(8), i = r(11), a = r(15), o = r(28)("species"); e.exports = function (e) { var t = n[e]; a && t && !t[o] && i.f(t, o, { configurable: !0, get: function () { return this } }) } }, function (e, t, r) { "use strict"; var n = r(28)("iterator"), i = !1; try { var a = [7][n](); a.return = function () { i = !0 }, Array.from(a, function () { throw 2 }) } catch (e) { } e.exports = function (e, t) { if (!t && !i) return !1; var r = !1; try { var a = [7], o = a[n](); o.next = function () { return { done: r = !0 } }, a[n] = function () { return o }, e(a) } catch (e) { } return r } }, function (e, t, r) { "use strict"; var n = r(7), i = r(9), a = r(8), o = r(81), s = r(88); n(n.P + n.R, "Promise", { finally: function (e) { var t = o(this, i.Promise || a.Promise), r = "function" == typeof e; return this.then(r ? function (r) { return s(t, e()).then(function () { return r }) } : e, r ? function (r) { return s(t, e()).then(function () { throw r }) } : e) } }) }, function (e, t, r) { "use strict"; var n = r(7), i = r(85), a = r(86); n(n.S, "Promise", { try: function (e) { var t = i.f(this), r = a(e); return (r.e ? t.reject : t.resolve)(r.v), t.promise } }) }, function (e, t, r) { "use strict"; r(60), r(72), r(95), r(107), r(109), e.exports = r(9).WeakMap }, function (e, t, r) { "use strict"; var n, i = r(96)(0), a = r(20), o = r(100), s = r(44), u = r(101), l = r(13), c = r(16), h = r(102), d = o.getWeak, f = Object.isExtensible, p = u.ufstore, v = {}, m = function (e) { return function () { return e(this, arguments.length > 0 ? arguments[0] : void 0) } }, g = { get: function (e) { if (l(e)) { var t = d(e); return !0 === t ? p(h(this, "WeakMap")).get(e) : t ? t[this._i] : void 0 } }, set: function (e, t) { return u.def(h(this, "WeakMap"), e, t) } }, y = e.exports = r(103)("WeakMap", m, g, u, !0, !0); c(function () { return 7 != (new y).set((Object.freeze || Object)(v), 7).get(v) }) && (s((n = u.getConstructor(m, "WeakMap")).prototype, g), o.NEED = !0, i(["delete", "has", "get", "set"], function (e) { var t = y.prototype, r = t[e]; a(t, e, function (t, i) { if (l(t) && !f(t)) { this._f || (this._f = new n); var a = this._f[e](t, i); return "set" == e ? this : a } return r.call(this, t, i) }) })) }, function (e, t, r) { "use strict"; var n = r(23), i = r(37), a = r(51), o = r(38), s = r(97); e.exports = function (e, t) { var r = 1 == e, u = 2 == e, l = 3 == e, c = 4 == e, h = 6 == e, d = 5 == e || h, f = t || s; return function (t, s, p) { for (var v, m, g = a(t), y = i(g), b = n(s, p, 3), _ = o(y.length), A = 0, S = r ? f(t, _) : u ? f(t, 0) : void 0; _ > A; A++)if ((d || A in y) && (m = b(v = y[A], A, g), e)) if (r) S[A] = m; else if (m) switch (e) { case 3: return !0; case 5: return v; case 6: return A; case 2: S.push(v) } else if (c) return !1; return h ? -1 : l || c ? c : S } } }, function (e, t, r) { "use strict"; var n = r(98); e.exports = function (e, t) { return new (n(e))(t) } }, function (e, t, r) { "use strict"; var n = r(13), i = r(99), a = r(28)("species"); e.exports = function (e) { var t; return i(e) && ("function" != typeof (t = e.constructor) || t !== Array && !i(t.prototype) || (t = void 0), n(t) && null === (t = t[a]) && (t = void 0)), void 0 === t ? Array : t } }, function (e, t, r) { "use strict"; var n = r(27); e.exports = Array.isArray || function (e) { return "Array" == n(e) } }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, i = r(22)("meta"), a = r(13), o = r(21), s = r(11).f, u = 0, l = Object.isExtensible || function () { return !0 }, c = !r(16)(function () { return l(Object.preventExtensions({})) }), h = function (e) { s(e, i, { value: { i: "O" + ++u, w: {} } }) }, d = e.exports = { KEY: i, NEED: !1, fastKey: function (e, t) { if (!a(e)) return "symbol" == (void 0 === e ? "undefined" : n(e)) ? e : ("string" == typeof e ? "S" : "P") + e; if (!o(e, i)) { if (!l(e)) return "F"; if (!t) return "E"; h(e) } return e[i].i }, getWeak: function (e, t) { if (!o(e, i)) { if (!l(e)) return !0; if (!t) return !1; h(e) } return e[i].w }, onFreeze: function (e) { return c && d.NEED && l(e) && !o(e, i) && h(e), e } } }, function (e, t, r) { "use strict"; var n = r(89), i = r(100).getWeak, a = r(12), o = r(13), s = r(76), u = r(77), l = r(96), c = r(21), h = r(102), d = l(5), f = l(6), p = 0, v = function (e) { return e._l || (e._l = new m) }, m = function () { this.a = [] }, g = function (e, t) { return d(e.a, function (e) { return e[0] === t }) }; m.prototype = { get: function (e) { var t = g(this, e); if (t) return t[1] }, has: function (e) { return !!g(this, e) }, set: function (e, t) { var r = g(this, e); r ? r[1] = t : this.a.push([e, t]) }, delete: function (e) { var t = f(this.a, function (t) { return t[0] === e }); return ~t && this.a.splice(t, 1), !!~t } }, e.exports = { getConstructor: function (e, t, r, a) { var l = e(function (e, n) { s(e, l, t, "_i"), e._t = t, e._i = p++, e._l = void 0, void 0 != n && u(n, r, e[a], e) }); return n(l.prototype, { delete: function (e) { if (!o(e)) return !1; var r = i(e); return !0 === r ? v(h(this, t)).delete(e) : r && c(r, this._i) && delete r[this._i] }, has: function (e) { if (!o(e)) return !1; var r = i(e); return !0 === r ? v(h(this, t)).has(e) : r && c(r, this._i) } }), l }, def: function (e, t, r) { var n = i(a(t), !0); return !0 === n ? v(e).set(t, r) : n[e._i] = r, e }, ufstore: v } }, function (e, t, r) { "use strict"; var n = r(13); e.exports = function (e, t) { if (!n(e) || e._t !== t) throw TypeError("Incompatible receiver, " + t + " required!"); return e } }, function (e, t, r) { "use strict"; var n = r(8), i = r(7), a = r(20), o = r(89), s = r(100), u = r(77), l = r(76), c = r(13), h = r(16), d = r(91), f = r(70), p = r(104); e.exports = function (e, t, r, v, m, g) { var y = n[e], b = y, _ = m ? "set" : "add", A = b && b.prototype, S = {}, w = function (e) { var t = A[e]; a(A, e, "delete" == e ? function (e) { return !(g && !c(e)) && t.call(this, 0 === e ? 0 : e) } : "has" == e ? function (e) { return !(g && !c(e)) && t.call(this, 0 === e ? 0 : e) } : "get" == e ? function (e) { return g && !c(e) ? void 0 : t.call(this, 0 === e ? 0 : e) } : "add" == e ? function (e) { return t.call(this, 0 === e ? 0 : e), this } : function (e, r) { return t.call(this, 0 === e ? 0 : e, r), this }) }; if ("function" == typeof b && (g || A.forEach && !h(function () { (new b).entries().next() }))) { var k = new b, P = k[_](g ? {} : -0, 1) != k, x = h(function () { k.has(1) }), C = d(function (e) { new b(e) }), R = !g && h(function () { for (var e = new b, t = 5; t--;)e[_](t, t); return !e.has(-0) }); C || ((b = t(function (t, r) { l(t, b, e); var n = p(new y, t, b); return void 0 != r && u(r, m, n[_], n), n })).prototype = A, A.constructor = b), (x || R) && (w("delete"), w("has"), m && w("get")), (R || P) && w(_), g && A.clear && delete A.clear } else b = v.getConstructor(t, e, m, _), o(b.prototype, r), s.NEED = !0; return f(b, e), S[e] = b, i(i.G + i.W + i.F * (b != y), S), g || v.setStrong(b, e, m), b } }, function (e, t, r) { "use strict"; var n = r(13), i = r(105).set; e.exports = function (e, t, r) { var a, o = t.constructor; return o !== r && "function" == typeof o && (a = o.prototype) !== r.prototype && n(a) && i && i(e, a), e } }, function (e, t, r) { "use strict"; var n = r(13), i = r(12), a = function (e, t) { if (i(e), !n(t) && null !== t) throw TypeError(t + ": can't set as prototype!") }; e.exports = { set: Object.setPrototypeOf || ("__proto__" in {} ? function (e, t, n) { try { (n = r(23)(Function.call, r(106).f(Object.prototype, "__proto__").set, 2))(e, []), t = !(e instanceof Array) } catch (e) { t = !0 } return function (e, r) { return a(e, r), t ? e.__proto__ = r : n(e, r), e } }({}, !1) : void 0), check: a } }, function (e, t, r) { "use strict"; var n = r(50), i = r(19), a = r(36), o = r(18), s = r(21), u = r(14), l = Object.getOwnPropertyDescriptor; t.f = r(15) ? l : function (e, t) { if (e = a(e), t = o(t, !0), u) try { return l(e, t) } catch (e) { } if (s(e, t)) return i(!n.f.call(e, t), e[t]) } }, function (e, t, r) { "use strict"; r(108)("WeakMap") }, function (e, t, r) { "use strict"; var n = r(7); e.exports = function (e) { n(n.S, e, { of: function () { for (var e = arguments.length, t = new Array(e); e--;)t[e] = arguments[e]; return new this(t) } }) } }, function (e, t, r) { "use strict"; r(110)("WeakMap") }, function (e, t, r) { "use strict"; var n = r(7), i = r(24), a = r(23), o = r(77); e.exports = function (e) { n(n.S, e, { from: function (e) { var t, r, n, s, u = arguments[1]; return i(this), (t = void 0 !== u) && i(u), void 0 == e ? new this : (r = [], t ? (n = 0, s = a(u, arguments[2], 2), o(e, !1, function (e) { r.push(s(e, n++)) })) : o(e, !1, r.push, r), new this(r)) } }) } }, function (e, t, r) { "use strict"; r(112), e.exports = r(9).String.codePointAt }, function (e, t, r) { "use strict"; var n = r(7), i = r(63)(!1); n(n.P, "String", { codePointAt: function (e) { return i(this, e) } }) }, function (e, t, r) { "use strict"; r(114), e.exports = r(9).String.fromCodePoint }, function (e, t, r) { "use strict"; var n = r(7), i = r(40), a = String.fromCharCode, o = String.fromCodePoint; n(n.S + n.F * (!!o && 1 != o.length), "String", { fromCodePoint: function (e) { for (var t, r = [], n = arguments.length, o = 0; n > o;) { if (t = +arguments[o++], i(t, 1114111) !== t) throw RangeError(t + " is not a valid code point"); r.push(t < 65536 ? a(t) : a(55296 + ((t -= 65536) >> 10), t % 1024 + 56320)) } return r.join("") } }) }, function (e, t, r) { "use strict"; r(116), r(60), e.exports = r(9).Symbol }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, i = r(8), a = r(21), o = r(15), s = r(7), u = r(20), l = r(100).KEY, c = r(16), h = r(29), d = r(70), f = r(22), p = r(28), v = r(117), m = r(118), g = r(119), y = r(99), b = r(12), _ = r(13), A = r(36), S = r(18), w = r(19), k = r(67), P = r(120), x = r(106), C = r(11), R = r(45), E = x.f, T = C.f, O = P.f, I = i.Symbol, F = i.JSON, L = F && F.stringify, j = p("_hidden"), M = p("toPrimitive"), D = {}.propertyIsEnumerable, N = h("symbol-registry"), q = h("symbols"), W = h("op-symbols"), U = Object.prototype, B = "function" == typeof I, z = i.QObject, G = !z || !z.prototype || !z.prototype.findChild, H = o && c(function () { return 7 != k(T({}, "a", { get: function () { return T(this, "a", { value: 7 }).a } })).a }) ? function (e, t, r) { var n = E(U, t); n && delete U[t], T(e, t, r), n && e !== U && T(U, t, n) } : T, X = function (e) { var t = q[e] = k(I.prototype); return t._k = e, t }, Y = B && "symbol" == n(I.iterator) ? function (e) { return "symbol" == (void 0 === e ? "undefined" : n(e)) } : function (e) { return e instanceof I }, V = function (e, t, r) { return e === U && V(W, t, r), b(e), t = S(t, !0), b(r), a(q, t) ? (r.enumerable ? (a(e, j) && e[j][t] && (e[j][t] = !1), r = k(r, { enumerable: w(0, !1) })) : (a(e, j) || T(e, j, w(1, {})), e[j][t] = !0), H(e, t, r)) : T(e, t, r) }, Q = function (e, t) { b(e); for (var r, n = g(t = A(t)), i = 0, a = n.length; a > i;)V(e, r = n[i++], t[r]); return e }, K = function (e) { var t = D.call(this, e = S(e, !0)); return !(this === U && a(q, e) && !a(W, e)) && (!(t || !a(this, e) || !a(q, e) || a(this, j) && this[j][e]) || t) }, J = function (e, t) { if (e = A(e), t = S(t, !0), e !== U || !a(q, t) || a(W, t)) { var r = E(e, t); return !r || !a(q, t) || a(e, j) && e[j][t] || (r.enumerable = !0), r } }, Z = function (e) { for (var t, r = O(A(e)), n = [], i = 0; r.length > i;)a(q, t = r[i++]) || t == j || t == l || n.push(t); return n }, $ = function (e) { for (var t, r = e === U, n = O(r ? W : A(e)), i = [], o = 0; n.length > o;)!a(q, t = n[o++]) || r && !a(U, t) || i.push(q[t]); return i }; B || (u((I = function () { if (this instanceof I) throw TypeError("Symbol is not a constructor!"); var e = f(arguments.length > 0 ? arguments[0] : void 0); return o && G && H(U, e, { configurable: !0, set: function t(r) { this === U && t.call(W, r), a(this, j) && a(this[j], e) && (this[j][e] = !1), H(this, e, w(1, r)) } }), X(e) }).prototype, "toString", function () { return this._k }), x.f = J, C.f = V, r(121).f = P.f = Z, r(50).f = K, r(49).f = $, o && !r(30) && u(U, "propertyIsEnumerable", K, !0), v.f = function (e) { return X(p(e)) }), s(s.G + s.W + s.F * !B, { Symbol: I }); for (var ee = "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","), te = 0; ee.length > te;)p(ee[te++]); for (var re = R(p.store), ne = 0; re.length > ne;)m(re[ne++]); s(s.S + s.F * !B, "Symbol", { for: function (e) { return a(N, e += "") ? N[e] : N[e] = I(e) }, keyFor: function (e) { if (!Y(e)) throw TypeError(e + " is not a symbol!"); for (var t in N) if (N[t] === e) return t }, useSetter: function () { G = !0 }, useSimple: function () { G = !1 } }), s(s.S + s.F * !B, "Object", { create: function (e, t) { return void 0 === t ? k(e) : Q(k(e), t) }, defineProperty: V, defineProperties: Q, getOwnPropertyDescriptor: J, getOwnPropertyNames: Z, getOwnPropertySymbols: $ }), F && s(s.S + s.F * (!B || c(function () { var e = I(); return "[null]" != L([e]) || "{}" != L({ a: e }) || "{}" != L(Object(e)) })), "JSON", { stringify: function (e) { for (var t, r, n = [e], i = 1; arguments.length > i;)n.push(arguments[i++]); if (r = t = n[1], (_(t) || void 0 !== e) && !Y(e)) return y(t) || (t = function (e, t) { if ("function" == typeof r && (t = r.call(this, e, t)), !Y(t)) return t }), n[1] = t, L.apply(F, n) } }), I.prototype[M] || r(10)(I.prototype, M, I.prototype.valueOf), d(I, "Symbol"), d(Math, "Math", !0), d(i.JSON, "JSON", !0) }, function (e, t, r) { "use strict"; t.f = r(28) }, function (e, t, r) { "use strict"; var n = r(8), i = r(9), a = r(30), o = r(117), s = r(11).f; e.exports = function (e) { var t = i.Symbol || (i.Symbol = a ? {} : n.Symbol || {}); "_" == e.charAt(0) || e in t || s(t, e, { value: o.f(e) }) } }, function (e, t, r) { "use strict"; var n = r(45), i = r(49), a = r(50); e.exports = function (e) { var t = n(e), r = i.f; if (r) for (var o, s = r(e), u = a.f, l = 0; s.length > l;)u.call(e, o = s[l++]) && t.push(o); return t } }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, i = r(36), a = r(121).f, o = {}.toString, s = "object" == ("undefined" == typeof window ? "undefined" : n(window)) && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; e.exports.f = function (e) { return s && "[object Window]" == o.call(e) ? function (e) { try { return a(e) } catch (e) { return s.slice() } }(e) : a(i(e)) } }, function (e, t, r) { "use strict"; var n = r(46), i = r(48).concat("length", "prototype"); t.f = Object.getOwnPropertyNames || function (e) { return n(e, i) } }, function (e, t, r) { "use strict"; r(123), e.exports = r(9).Object.values }, function (e, t, r) { "use strict"; var n = r(7), i = r(124)(!1); n(n.S, "Object", { values: function (e) { return i(e) } }) }, function (e, t, r) { "use strict"; var n = r(45), i = r(36), a = r(50).f; e.exports = function (e) { return function (t) { for (var r, o = i(t), s = n(o), u = s.length, l = 0, c = []; u > l;)a.call(o, r = s[l++]) && c.push(e ? [r, o[r]] : o[r]); return c } } }, function (e, t, r) { "use strict"; var n = !1; if ("undefined" != typeof ReadableStream) try { new ReadableStream({ start: function (e) { e.close() } }), n = !0 } catch (e) { } t.ReadableStream = n ? ReadableStream : r(126).ReadableStream }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }; !function (e, t) { for (var r in t) e[r] = t[r] }(t, function (e) { var t = {}; function r(n) { if (t[n]) return t[n].exports; var i = t[n] = { i: n, l: !1, exports: {} }; return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports } return r.m = e, r.c = t, r.i = function (e) { return e }, r.d = function (e, t, n) { r.o(e, t) || Object.defineProperty(e, t, { configurable: !1, enumerable: !0, get: n }) }, r.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return r.d(t, "a", t), t }, r.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, r.p = "", r(r.s = 7) }([function (e, t, r) { var i = "function" == typeof Symbol && "symbol" === n(Symbol.iterator) ? function (e) { return void 0 === e ? "undefined" : n(e) } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : void 0 === e ? "undefined" : n(e) }, a = r(1).assert; function o(e) { return "string" == typeof e || "symbol" === (void 0 === e ? "undefined" : i(e)) } function s(e, t, r) { if ("function" != typeof e) throw new TypeError("Argument is not a function"); return Function.prototype.apply.call(e, t, r) } t.typeIsObject = function (e) { return "object" === (void 0 === e ? "undefined" : i(e)) && null !== e || "function" == typeof e }, t.createDataProperty = function (e, r, n) { a(t.typeIsObject(e)), Object.defineProperty(e, r, { value: n, writable: !0, enumerable: !0, configurable: !0 }) }, t.createArrayFromList = function (e) { return e.slice() }, t.ArrayBufferCopy = function (e, t, r, n, i) { new Uint8Array(e).set(new Uint8Array(r, n, i), t) }, t.CreateIterResultObject = function (e, t) { a("boolean" == typeof t); var r = {}; return Object.defineProperty(r, "value", { value: e, enumerable: !0, writable: !0, configurable: !0 }), Object.defineProperty(r, "done", { value: t, enumerable: !0, writable: !0, configurable: !0 }), r }, t.IsFiniteNonNegativeNumber = function (e) { return !Number.isNaN(e) && (e !== 1 / 0 && !(e < 0)) }, t.InvokeOrNoop = function (e, t, r) { a(void 0 !== e), a(o(t)), a(Array.isArray(r)); var n = e[t]; if (void 0 !== n) return s(n, e, r) }, t.PromiseInvokeOrNoop = function (e, r, n) { a(void 0 !== e), a(o(r)), a(Array.isArray(n)); try { return Promise.resolve(t.InvokeOrNoop(e, r, n)) } catch (e) { return Promise.reject(e) } }, t.PromiseInvokeOrPerformFallback = function (e, t, r, n, i) { a(void 0 !== e), a(o(t)), a(Array.isArray(r)), a(Array.isArray(i)); var u = void 0; try { u = e[t] } catch (e) { return Promise.reject(e) } if (void 0 === u) return n.apply(null, i); try { return Promise.resolve(s(u, e, r)) } catch (e) { return Promise.reject(e) } }, t.TransferArrayBuffer = function (e) { return e.slice() }, t.ValidateAndNormalizeHighWaterMark = function (e) { if (e = Number(e), Number.isNaN(e) || e < 0) throw new RangeError("highWaterMark property of a queuing strategy must be non-negative and non-NaN"); return e }, t.ValidateAndNormalizeQueuingStrategy = function (e, r) { if (void 0 !== e && "function" != typeof e) throw new TypeError("size property of a queuing strategy must be a function"); return { size: e, highWaterMark: r = t.ValidateAndNormalizeHighWaterMark(r) } } }, function (e, t, r) { function n(e) { this.name = "AssertionError", this.message = e || "", this.stack = (new Error).stack } n.prototype = Object.create(Error.prototype), n.prototype.constructor = n, e.exports = { rethrowAssertionErrorRejection: function (e) { e && e.constructor === n && setTimeout(function () { throw e }, 0) }, AssertionError: n, assert: function (e, t) { if (!e) throw new n(t) } } }, function (e, t, r) { var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(); function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var a = r(0), o = a.InvokeOrNoop, s = a.PromiseInvokeOrNoop, u = a.ValidateAndNormalizeQueuingStrategy, l = a.typeIsObject, c = r(1), h = c.assert, d = c.rethrowAssertionErrorRejection, f = r(3), p = f.DequeueValue, v = f.EnqueueValueWithSize, m = f.PeekQueueValue, g = f.ResetQueue, y = function () { function e() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = r.size, a = r.highWaterMark, o = void 0 === a ? 1 : a; if (i(this, e), this._state = "writable", this._storedError = void 0, this._writer = void 0, this._writableStreamController = void 0, this._writeRequests = [], this._inFlightWriteRequest = void 0, this._closeRequest = void 0, this._inFlightCloseRequest = void 0, this._pendingAbortRequest = void 0, this._backpressure = !1, void 0 !== t.type) throw new RangeError("Invalid type is specified"); this._writableStreamController = new N(this, t, n, o), this._writableStreamController.__startSteps() } return n(e, [{ key: "abort", value: function (e) { return !1 === _(this) ? Promise.reject(G("abort")) : !0 === A(this) ? Promise.reject(new TypeError("Cannot abort a stream that already has a writer")) : S(this, e) } }, { key: "getWriter", value: function () { if (!1 === _(this)) throw G("getWriter"); return b(this) } }, { key: "locked", get: function () { if (!1 === _(this)) throw G("locked"); return A(this) } }]), e }(); function b(e) { return new O(e) } function _(e) { return !!l(e) && !!Object.prototype.hasOwnProperty.call(e, "_writableStreamController") } function A(e) { return h(!0 === _(e), "IsWritableStreamLocked should only be used on known writable streams"), void 0 !== e._writer } function S(e, t) { var r = e._state; if ("closed" === r) return Promise.resolve(void 0); if ("errored" === r) return Promise.reject(e._storedError); var n = new TypeError("Requested to abort"); if (void 0 !== e._pendingAbortRequest) return Promise.reject(n); h("writable" === r || "erroring" === r, "state must be writable or erroring"); var i = !1; "erroring" === r && (i = !0, t = void 0); var a = new Promise(function (r, n) { e._pendingAbortRequest = { _resolve: r, _reject: n, _reason: t, _wasAlreadyErroring: i } }); return !1 === i && k(e, n), a } function w(e, t) { var r = e._state; "writable" !== r ? (h("erroring" === r), P(e)) : k(e, t) } function k(e, t) { h(void 0 === e._storedError, "stream._storedError === undefined"), h("writable" === e._state, "state must be writable"); var r = e._writableStreamController; h(void 0 !== r, "controller must not be undefined"), e._state = "erroring", e._storedError = t; var n = e._writer; void 0 !== n && j(n, t), !1 === R(e) && !0 === r._started && P(e) } function P(e) { h("erroring" === e._state, "stream._state === erroring"), h(!1 === R(e), "WritableStreamHasOperationMarkedInFlight(stream) === false"), e._state = "errored", e._writableStreamController.__errorSteps(); for (var t = e._storedError, r = 0; r < e._writeRequests.length; r++) { e._writeRequests[r]._reject(t) } if (e._writeRequests = [], void 0 !== e._pendingAbortRequest) { var n = e._pendingAbortRequest; if (e._pendingAbortRequest = void 0, !0 === n._wasAlreadyErroring) return n._reject(t), void E(e); e._writableStreamController.__abortSteps(n._reason).then(function () { n._resolve(), E(e) }, function (t) { n._reject(t), E(e) }) } else E(e) } function x(e) { h(void 0 !== e._inFlightCloseRequest), e._inFlightCloseRequest._resolve(void 0), e._inFlightCloseRequest = void 0; var t = e._state; h("writable" === t || "erroring" === t), "erroring" === t && (e._storedError = void 0, void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._resolve(), e._pendingAbortRequest = void 0)), e._state = "closed"; var r = e._writer; void 0 !== r && function (e) { h(void 0 !== e._closedPromise_resolve, "writer._closedPromise_resolve !== undefined"), h(void 0 !== e._closedPromise_reject, "writer._closedPromise_reject !== undefined"), h("pending" === e._closedPromiseState, "writer._closedPromiseState is pending"), e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "resolved" }(r), h(void 0 === e._pendingAbortRequest, "stream._pendingAbortRequest === undefined"), h(void 0 === e._storedError, "stream._storedError === undefined") } function C(e) { return void 0 !== e._closeRequest || void 0 !== e._inFlightCloseRequest } function R(e) { return void 0 !== e._inFlightWriteRequest || void 0 !== e._inFlightCloseRequest } function E(e) { h("errored" === e._state, '_stream_.[[state]] is `"errored"`'), void 0 !== e._closeRequest && (h(void 0 === e._inFlightCloseRequest), e._closeRequest._reject(e._storedError), e._closeRequest = void 0); var t = e._writer; void 0 !== t && (V(t, e._storedError), t._closedPromise.catch(function () { })) } function T(e, t) { h("writable" === e._state), h(!1 === C(e)); var r = e._writer; void 0 !== r && t !== e._backpressure && (!0 === t ? function (e) { h(void 0 === e._readyPromise_resolve, "writer._readyPromise_resolve === undefined"), h(void 0 === e._readyPromise_reject, "writer._readyPromise_reject === undefined"), e._readyPromise = new Promise(function (t, r) { e._readyPromise_resolve = t, e._readyPromise_reject = r }), e._readyPromiseState = "pending" }(r) : (h(!1 === t), J(r))), e._backpressure = t } e.exports = { AcquireWritableStreamDefaultWriter: b, IsWritableStream: _, IsWritableStreamLocked: A, WritableStream: y, WritableStreamAbort: S, WritableStreamDefaultControllerError: z, WritableStreamDefaultWriterCloseWithErrorPropagation: function (e) { var t = e._ownerWritableStream; h(void 0 !== t); var r = t._state; if (!0 === C(t) || "closed" === r) return Promise.resolve(); if ("errored" === r) return Promise.reject(t._storedError); return h("writable" === r || "erroring" === r), F(e) }, WritableStreamDefaultWriterRelease: M, WritableStreamDefaultWriterWrite: D, WritableStreamCloseQueuedOrInFlight: C }; var O = function () { function e(t) { if (i(this, e), !1 === _(t)) throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance"); if (!0 === A(t)) throw new TypeError("This stream has already been locked for exclusive writing by another writer"); this._ownerWritableStream = t, t._writer = this; var r, n = t._state; if ("writable" === n) !1 === C(t) && !0 === t._backpressure ? ((r = this)._readyPromise = new Promise(function (e, t) { r._readyPromise_resolve = e, r._readyPromise_reject = t }), r._readyPromiseState = "pending") : K(this), Y(this); else if ("erroring" === n) Q(this, t._storedError), this._readyPromise.catch(function () { }), Y(this); else if ("closed" === n) K(this), function (e) { e._closedPromise = Promise.resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "resolved" }(this); else { h("errored" === n, "state must be errored"); var a = t._storedError; Q(this, a), this._readyPromise.catch(function () { }), function (e, t) { e._closedPromise = Promise.reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "rejected" }(this, a), this._closedPromise.catch(function () { }) } } return n(e, [{ key: "abort", value: function (e) { return !1 === I(this) ? Promise.reject(H("abort")) : void 0 === this._ownerWritableStream ? Promise.reject(X("abort")) : function (e, t) { var r = e._ownerWritableStream; return h(void 0 !== r), S(r, t) }(this, e) } }, { key: "close", value: function () { if (!1 === I(this)) return Promise.reject(H("close")); var e = this._ownerWritableStream; return void 0 === e ? Promise.reject(X("close")) : !0 === C(e) ? Promise.reject(new TypeError("cannot close an already-closing stream")) : F(this) } }, { key: "releaseLock", value: function () { if (!1 === I(this)) throw H("releaseLock"); var e = this._ownerWritableStream; void 0 !== e && (h(void 0 !== e._writer), M(this)) } }, { key: "write", value: function (e) { return !1 === I(this) ? Promise.reject(H("write")) : void 0 === this._ownerWritableStream ? Promise.reject(X("write to")) : D(this, e) } }, { key: "closed", get: function () { return !1 === I(this) ? Promise.reject(H("closed")) : this._closedPromise } }, { key: "desiredSize", get: function () { if (!1 === I(this)) throw H("desiredSize"); if (void 0 === this._ownerWritableStream) throw X("desiredSize"); return function (e) { var t = e._ownerWritableStream, r = t._state; if ("errored" === r || "erroring" === r) return null; if ("closed" === r) return 0; return q(t._writableStreamController) }(this) } }, { key: "ready", get: function () { return !1 === I(this) ? Promise.reject(H("ready")) : this._readyPromise } }]), e }(); function I(e) { return !!l(e) && !!Object.prototype.hasOwnProperty.call(e, "_ownerWritableStream") } function F(e) { var t = e._ownerWritableStream; h(void 0 !== t); var r = t._state; if ("closed" === r || "errored" === r) return Promise.reject(new TypeError("The stream (in " + r + " state) is not in the writable state and cannot be closed")); h("writable" === r || "erroring" === r), h(!1 === C(t)); var n, i = new Promise(function (e, r) { var n = { _resolve: e, _reject: r }; t._closeRequest = n }); return !0 === t._backpressure && "writable" === r && J(e), n = t._writableStreamController, v(n, "close", 0), W(n), i } function L(e, t) { "pending" === e._closedPromiseState ? V(e, t) : function (e, t) { h(void 0 === e._closedPromise_resolve, "writer._closedPromise_resolve === undefined"), h(void 0 === e._closedPromise_reject, "writer._closedPromise_reject === undefined"), h("pending" !== e._closedPromiseState, "writer._closedPromiseState is not pending"), e._closedPromise = Promise.reject(t), e._closedPromiseState = "rejected" }(e, t), e._closedPromise.catch(function () { }) } function j(e, t) { "pending" === e._readyPromiseState ? function (e, t) { h(void 0 !== e._readyPromise_resolve, "writer._readyPromise_resolve !== undefined"), h(void 0 !== e._readyPromise_reject, "writer._readyPromise_reject !== undefined"), e._readyPromise_reject(t), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "rejected" }(e, t) : function (e, t) { h(void 0 === e._readyPromise_resolve, "writer._readyPromise_resolve === undefined"), h(void 0 === e._readyPromise_reject, "writer._readyPromise_reject === undefined"), e._readyPromise = Promise.reject(t), e._readyPromiseState = "rejected" }(e, t), e._readyPromise.catch(function () { }) } function M(e) { var t = e._ownerWritableStream; h(void 0 !== t), h(t._writer === e); var r = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness"); j(e, r), L(e, r), t._writer = void 0, e._ownerWritableStream = void 0 } function D(e, t) { var r = e._ownerWritableStream; h(void 0 !== r); var n = r._writableStreamController, i = function (e, t) { var r = e._strategySize; if (void 0 === r) return 1; try { return r(t) } catch (t) { return U(e, t), 1 } }(n, t); if (r !== e._ownerWritableStream) return Promise.reject(X("write to")); var a = r._state; if ("errored" === a) return Promise.reject(r._storedError); if (!0 === C(r) || "closed" === a) return Promise.reject(new TypeError("The stream is closing or closed and cannot be written to")); if ("erroring" === a) return Promise.reject(r._storedError); h("writable" === a); var o = function (e) { return h(!0 === A(e)), h("writable" === e._state), new Promise(function (t, r) { var n = { _resolve: t, _reject: r }; e._writeRequests.push(n) }) }(r); return function (e, t, r) { var n = { chunk: t }; try { v(e, n, r) } catch (t) { return void U(e, t) } var i = e._controlledWritableStream; if (!1 === C(i) && "writable" === i._state) { var a = B(e); T(i, a) } W(e) }(n, t, i), o } var N = function () { function e(t, r, n, a) { if (i(this, e), !1 === _(t)) throw new TypeError("WritableStreamDefaultController can only be constructed with a WritableStream instance"); if (void 0 !== t._writableStreamController) throw new TypeError("WritableStreamDefaultController instances can only be created by the WritableStream constructor"); this._controlledWritableStream = t, this._underlyingSink = r, this._queue = void 0, this._queueTotalSize = void 0, g(this), this._started = !1; var o = u(n, a); this._strategySize = o.size, this._strategyHWM = o.highWaterMark, T(t, B(this)) } return n(e, [{ key: "error", value: function (e) { if (!1 === function (e) { if (!l(e)) return !1; if (!Object.prototype.hasOwnProperty.call(e, "_underlyingSink")) return !1; return !0 }(this)) throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController"); "writable" === this._controlledWritableStream._state && z(this, e) } }, { key: "__abortSteps", value: function (e) { return s(this._underlyingSink, "abort", [e]) } }, { key: "__errorSteps", value: function () { g(this) } }, { key: "__startSteps", value: function () { var e = this, t = o(this._underlyingSink, "start", [this]), r = this._controlledWritableStream; Promise.resolve(t).then(function () { h("writable" === r._state || "erroring" === r._state), e._started = !0, W(e) }, function (t) { h("writable" === r._state || "erroring" === r._state), e._started = !0, w(r, t) }).catch(d) } }]), e }(); function q(e) { return e._strategyHWM - e._queueTotalSize } function W(e) { var t = e._controlledWritableStream; if (!1 !== e._started && void 0 === t._inFlightWriteRequest) { var r = t._state; if ("closed" !== r && "errored" !== r) if ("erroring" !== r) { if (0 !== e._queue.length) { var n = m(e); "close" === n ? function (e) { var t = e._controlledWritableStream; (function (e) { h(void 0 === e._inFlightCloseRequest), h(void 0 !== e._closeRequest), e._inFlightCloseRequest = e._closeRequest, e._closeRequest = void 0 })(t), p(e), h(0 === e._queue.length, "queue must be empty once the final write record is dequeued"), s(e._underlyingSink, "close", []).then(function () { x(t) }, function (e) { !function (e, t) { h(void 0 !== e._inFlightCloseRequest), e._inFlightCloseRequest._reject(t), e._inFlightCloseRequest = void 0, h("writable" === e._state || "erroring" === e._state), void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._reject(t), e._pendingAbortRequest = void 0), w(e, t) }(t, e) }).catch(d) }(e) : function (e, t) { var r = e._controlledWritableStream; (function (e) { h(void 0 === e._inFlightWriteRequest, "there must be no pending write request"), h(0 !== e._writeRequests.length, "writeRequests must not be empty"), e._inFlightWriteRequest = e._writeRequests.shift() })(r), s(e._underlyingSink, "write", [t, e]).then(function () { !function (e) { h(void 0 !== e._inFlightWriteRequest), e._inFlightWriteRequest._resolve(void 0), e._inFlightWriteRequest = void 0 }(r); var t = r._state; if (h("writable" === t || "erroring" === t), p(e), !1 === C(r) && "writable" === t) { var n = B(e); T(r, n) } W(e) }, function (e) { !function (e, t) { h(void 0 !== e._inFlightWriteRequest), e._inFlightWriteRequest._reject(t), e._inFlightWriteRequest = void 0, h("writable" === e._state || "erroring" === e._state), w(e, t) }(r, e) }).catch(d) }(e, n.chunk) } } else P(t) } } function U(e, t) { "writable" === e._controlledWritableStream._state && z(e, t) } function B(e) { return q(e) <= 0 } function z(e, t) { var r = e._controlledWritableStream; h("writable" === r._state), k(r, t) } function G(e) { return new TypeError("WritableStream.prototype." + e + " can only be used on a WritableStream") } function H(e) { return new TypeError("WritableStreamDefaultWriter.prototype." + e + " can only be used on a WritableStreamDefaultWriter") } function X(e) { return new TypeError("Cannot " + e + " a stream using a released writer") } function Y(e) { e._closedPromise = new Promise(function (t, r) { e._closedPromise_resolve = t, e._closedPromise_reject = r, e._closedPromiseState = "pending" }) } function V(e, t) { h(void 0 !== e._closedPromise_resolve, "writer._closedPromise_resolve !== undefined"), h(void 0 !== e._closedPromise_reject, "writer._closedPromise_reject !== undefined"), h("pending" === e._closedPromiseState, "writer._closedPromiseState is pending"), e._closedPromise_reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "rejected" } function Q(e, t) { e._readyPromise = Promise.reject(t), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "rejected" } function K(e) { e._readyPromise = Promise.resolve(void 0), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "fulfilled" } function J(e) { h(void 0 !== e._readyPromise_resolve, "writer._readyPromise_resolve !== undefined"), h(void 0 !== e._readyPromise_reject, "writer._readyPromise_reject !== undefined"), e._readyPromise_resolve(void 0), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "fulfilled" } }, function (e, t, r) { var n = r(0).IsFiniteNonNegativeNumber, i = r(1).assert; t.DequeueValue = function (e) { i("_queue" in e && "_queueTotalSize" in e, "Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]]."), i(e._queue.length > 0, "Spec-level failure: should never dequeue from an empty queue."); var t = e._queue.shift(); return e._queueTotalSize -= t.size, e._queueTotalSize < 0 && (e._queueTotalSize = 0), t.value }, t.EnqueueValueWithSize = function (e, t, r) { if (i("_queue" in e && "_queueTotalSize" in e, "Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and [[queueTotalSize]]."), r = Number(r), !n(r)) throw new RangeError("Size must be a finite, non-NaN, non-negative number."); e._queue.push({ value: t, size: r }), e._queueTotalSize += r }, t.PeekQueueValue = function (e) { return i("_queue" in e && "_queueTotalSize" in e, "Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]]."), i(e._queue.length > 0, "Spec-level failure: should never peek at an empty queue."), e._queue[0].value }, t.ResetQueue = function (e) { i("_queue" in e && "_queueTotalSize" in e, "Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]]."), e._queue = [], e._queueTotalSize = 0 } }, function (e, t, r) { var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(); function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var a = r(0), o = a.ArrayBufferCopy, s = a.CreateIterResultObject, u = a.IsFiniteNonNegativeNumber, l = a.InvokeOrNoop, c = a.PromiseInvokeOrNoop, h = a.TransferArrayBuffer, d = a.ValidateAndNormalizeQueuingStrategy, f = a.ValidateAndNormalizeHighWaterMark, p = r(0), v = p.createArrayFromList, m = p.createDataProperty, g = p.typeIsObject, y = r(1), b = y.assert, _ = y.rethrowAssertionErrorRejection, A = r(3), S = A.DequeueValue, w = A.EnqueueValueWithSize, k = A.ResetQueue, P = r(2), x = P.AcquireWritableStreamDefaultWriter, C = P.IsWritableStream, R = P.IsWritableStreamLocked, E = P.WritableStreamAbort, T = P.WritableStreamDefaultWriterCloseWithErrorPropagation, O = P.WritableStreamDefaultWriterRelease, I = P.WritableStreamDefaultWriterWrite, F = P.WritableStreamCloseQueuedOrInFlight, L = function () { function e() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = r.size, a = r.highWaterMark; i(this, e), this._state = "readable", this._reader = void 0, this._storedError = void 0, this._disturbed = !1, this._readableStreamController = void 0; var o = t.type; if ("bytes" === String(o)) void 0 === a && (a = 0), this._readableStreamController = new de(this, t, a); else { if (void 0 !== o) throw new RangeError("Invalid type is specified"); void 0 === a && (a = 1), this._readableStreamController = new ne(this, t, n, a) } } return n(e, [{ key: "cancel", value: function (e) { return !1 === M(this) ? Promise.reject(Ee("cancel")) : !0 === D(this) ? Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")) : U(this, e) } }, { key: "getReader", value: function () { var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).mode; if (!1 === M(this)) throw Ee("getReader"); if (void 0 === e) return j(this); if ("byob" === (e = String(e))) return new K(this); throw new RangeError("Invalid mode is specified") } }, { key: "pipeThrough", value: function (e, t) { var r = e.writable, n = e.readable; return function (e) { try { Promise.prototype.then.call(e, void 0, function () { }) } catch (e) { } }(this.pipeTo(r, t)), n } }, { key: "pipeTo", value: function (e) { var t = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = r.preventClose, i = r.preventAbort, a = r.preventCancel; if (!1 === M(this)) return Promise.reject(Ee("pipeTo")); if (!1 === C(e)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")); if (n = Boolean(n), i = Boolean(i), a = Boolean(a), !0 === D(this)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")); if (!0 === R(e)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")); var o = j(this), s = x(e), u = !1, l = Promise.resolve(); return new Promise(function (r, c) { var h, d, f; if (m(t, o._closedPromise, function (t) { !1 === i ? g(function () { return E(e, t) }, !0, t) : y(!0, t) }), m(e, s._closedPromise, function (e) { !1 === a ? g(function () { return U(t, e) }, !0, e) : y(!0, e) }), h = t, d = o._closedPromise, f = function () { !1 === n ? g(function () { return T(s) }) : y() }, "closed" === h._state ? f() : d.then(f).catch(_), !0 === F(e) || "closed" === e._state) { var p = new TypeError("the destination writable stream closed before all data could be piped to it"); !1 === a ? g(function () { return U(t, p) }, !0, p) : y(!0, p) } function v() { var e = l; return l.then(function () { return e !== l ? v() : void 0 }) } function m(e, t, r) { "errored" === e._state ? r(e._storedError) : t.catch(r).catch(_) } function g(t, r, n) { function i() { t().then(function () { return b(r, n) }, function (e) { return b(!0, e) }).catch(_) } !0 !== u && (u = !0, "writable" === e._state && !1 === F(e) ? v().then(i) : i()) } function y(t, r) { !0 !== u && (u = !0, "writable" === e._state && !1 === F(e) ? v().then(function () { return b(t, r) }).catch(_) : b(t, r)) } function b(e, t) { O(s), te(o), e ? c(t) : r(void 0) } (function e() { return l = Promise.resolve(), !0 === u ? Promise.resolve() : s._readyPromise.then(function () { return re(o).then(function (e) { var t = e.value; !0 !== e.done && (l = I(s, t).catch(function () { })) }) }).then(e) })().catch(function (e) { l = Promise.resolve(), _(e) }) }) } }, { key: "tee", value: function () { if (!1 === M(this)) throw Ee("tee"); var e = N(this, !1); return v(e) } }, { key: "locked", get: function () { if (!1 === M(this)) throw Ee("locked"); return D(this) } }]), e }(); function j(e) { return new Q(e) } function M(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_readableStreamController") } function D(e) { return b(!0 === M(e), "IsReadableStreamLocked should only be used on known readable streams"), void 0 !== e._reader } function N(e, t) { b(!0 === M(e)), b("boolean" == typeof t); var r = j(e), n = { closedOrErrored: !1, canceled1: !1, canceled2: !1, reason1: void 0, reason2: void 0 }; n.promise = new Promise(function (e) { n._resolve = e }); var i = function () { return function e() { var t = e._reader, r = e._branch1, n = e._branch2, i = e._teeState; return re(t).then(function (e) { b(g(e)); var t = e.value, a = e.done; if (b("boolean" == typeof a), !0 === a && !1 === i.closedOrErrored && (!1 === i.canceled1 && oe(r), !1 === i.canceled2 && oe(n), i.closedOrErrored = !0), !0 !== i.closedOrErrored) { var o = t, s = t; !1 === i.canceled1 && se(r, o), !1 === i.canceled2 && se(n, s) } }) } }(); i._reader = r, i._teeState = n, i._cloneForBranch2 = t; var a = function () { return function e(t) { var r = e._stream, n = e._teeState; n.canceled1 = !0; n.reason1 = t; if (!0 === n.canceled2) { var i = v([n.reason1, n.reason2]), a = U(r, i); n._resolve(a) } return n.promise } }(); a._stream = e, a._teeState = n; var o = function () { return function e(t) { var r = e._stream, n = e._teeState; n.canceled2 = !0; n.reason2 = t; if (!0 === n.canceled1) { var i = v([n.reason1, n.reason2]), a = U(r, i); n._resolve(a) } return n.promise } }(); o._stream = e, o._teeState = n; var s = Object.create(Object.prototype); m(s, "pull", i), m(s, "cancel", a); var u = new L(s), l = Object.create(Object.prototype); m(l, "pull", i), m(l, "cancel", o); var c = new L(l); return i._branch1 = u._readableStreamController, i._branch2 = c._readableStreamController, r._closedPromise.catch(function (e) { !0 !== n.closedOrErrored && (ue(i._branch1, e), ue(i._branch2, e), n.closedOrErrored = !0) }), [u, c] } function q(e) { return b(!0 === J(e._reader)), b("readable" === e._state || "closed" === e._state), new Promise(function (t, r) { var n = { _resolve: t, _reject: r }; e._reader._readIntoRequests.push(n) }) } function W(e) { return b(!0 === Z(e._reader)), b("readable" === e._state), new Promise(function (t, r) { var n = { _resolve: t, _reject: r }; e._reader._readRequests.push(n) }) } function U(e, t) { return e._disturbed = !0, "closed" === e._state ? Promise.resolve(void 0) : "errored" === e._state ? Promise.reject(e._storedError) : (B(e), e._readableStreamController.__cancelSteps(t).then(function () { })) } function B(e) { b("readable" === e._state), e._state = "closed"; var t = e._reader; if (void 0 !== t) { if (!0 === Z(t)) { for (var r = 0; r < t._readRequests.length; r++) { (0, t._readRequests[r]._resolve)(s(void 0, !0)) } t._readRequests = [] } !function (e) { b(void 0 !== e._closedPromise_resolve), b(void 0 !== e._closedPromise_reject), e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 }(t) } } function z(e, t) { b(!0 === M(e), "stream must be ReadableStream"), b("readable" === e._state, "state must be readable"), e._state = "errored", e._storedError = t; var r = e._reader; if (void 0 !== r) { if (!0 === Z(r)) { for (var n = 0; n < r._readRequests.length; n++) { r._readRequests[n]._reject(t) } r._readRequests = [] } else { b(J(r), "reader must be ReadableStreamBYOBReader"); for (var i = 0; i < r._readIntoRequests.length; i++) { r._readIntoRequests[i]._reject(t) } r._readIntoRequests = [] } Ie(r, t), r._closedPromise.catch(function () { }) } } function G(e, t, r) { var n = e._reader; b(n._readRequests.length > 0), n._readRequests.shift()._resolve(s(t, r)) } function H(e) { return e._reader._readIntoRequests.length } function X(e) { return e._reader._readRequests.length } function Y(e) { var t = e._reader; return void 0 !== t && !1 !== J(t) } function V(e) { var t = e._reader; return void 0 !== t && !1 !== Z(t) } e.exports = { ReadableStream: L, IsReadableStreamDisturbed: function (e) { return b(!0 === M(e), "IsReadableStreamDisturbed should only be used on known readable streams"), e._disturbed }, ReadableStreamDefaultControllerClose: oe, ReadableStreamDefaultControllerEnqueue: se, ReadableStreamDefaultControllerError: ue, ReadableStreamDefaultControllerGetDesiredSize: ce }; var Q = function () { function e(t) { if (i(this, e), !1 === M(t)) throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance"); if (!0 === D(t)) throw new TypeError("This stream has already been locked for exclusive reading by another reader"); $(this, t), this._readRequests = [] } return n(e, [{ key: "cancel", value: function (e) { return !1 === Z(this) ? Promise.reject(Oe("cancel")) : void 0 === this._ownerReadableStream ? Promise.reject(Te("cancel")) : ee(this, e) } }, { key: "read", value: function () { return !1 === Z(this) ? Promise.reject(Oe("read")) : void 0 === this._ownerReadableStream ? Promise.reject(Te("read from")) : re(this) } }, { key: "releaseLock", value: function () { if (!1 === Z(this)) throw Oe("releaseLock"); if (void 0 !== this._ownerReadableStream) { if (this._readRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled"); te(this) } } }, { key: "closed", get: function () { return !1 === Z(this) ? Promise.reject(Oe("closed")) : this._closedPromise } }]), e }(), K = function () { function e(t) { if (i(this, e), !M(t)) throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source"); if (!1 === fe(t._readableStreamController)) throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source"); if (D(t)) throw new TypeError("This stream has already been locked for exclusive reading by another reader"); $(this, t), this._readIntoRequests = [] } return n(e, [{ key: "cancel", value: function (e) { return J(this) ? void 0 === this._ownerReadableStream ? Promise.reject(Te("cancel")) : ee(this, e) : Promise.reject(Fe("cancel")) } }, { key: "read", value: function (e) { return J(this) ? void 0 === this._ownerReadableStream ? Promise.reject(Te("read from")) : ArrayBuffer.isView(e) ? 0 === e.byteLength ? Promise.reject(new TypeError("view must have non-zero byteLength")) : function (e, t) { var r = e._ownerReadableStream; if (b(void 0 !== r), r._disturbed = !0, "errored" === r._state) return Promise.reject(r._storedError); return function (e, t) { var r = e._controlledReadableStream, n = 1; t.constructor !== DataView && (n = t.constructor.BYTES_PER_ELEMENT); var i = t.constructor, a = { buffer: t.buffer, byteOffset: t.byteOffset, byteLength: t.byteLength, bytesFilled: 0, elementSize: n, ctor: i, readerType: "byob" }; if (e._pendingPullIntos.length > 0) return a.buffer = h(a.buffer), e._pendingPullIntos.push(a), q(r); if ("closed" === r._state) { var o = new t.constructor(a.buffer, a.byteOffset, 0); return Promise.resolve(s(o, !0)) } if (e._queueTotalSize > 0) { if (!0 === _e(e, a)) { var u = ye(a); return Se(e), Promise.resolve(s(u, !1)) } if (!0 === e._closeRequested) { var l = new TypeError("Insufficient bytes to fill elements in the given buffer"); return Ce(e, l), Promise.reject(l) } } a.buffer = h(a.buffer), e._pendingPullIntos.push(a); var c = q(r); return ve(e), c }(r._readableStreamController, t) }(this, e) : Promise.reject(new TypeError("view must be an array buffer view")) : Promise.reject(Fe("read")) } }, { key: "releaseLock", value: function () { if (!J(this)) throw Fe("releaseLock"); if (void 0 !== this._ownerReadableStream) { if (this._readIntoRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled"); te(this) } } }, { key: "closed", get: function () { return J(this) ? this._closedPromise : Promise.reject(Fe("closed")) } }]), e }(); function J(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_readIntoRequests") } function Z(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_readRequests") } function $(e, t) { e._ownerReadableStream = t, t._reader = e, "readable" === t._state ? function (e) { e._closedPromise = new Promise(function (t, r) { e._closedPromise_resolve = t, e._closedPromise_reject = r }) }(e) : "closed" === t._state ? function (e) { e._closedPromise = Promise.resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 }(e) : (b("errored" === t._state, "state must be errored"), function (e, t) { e._closedPromise = Promise.reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 }(e, t._storedError), e._closedPromise.catch(function () { })) } function ee(e, t) { var r = e._ownerReadableStream; return b(void 0 !== r), U(r, t) } function te(e) { b(void 0 !== e._ownerReadableStream), b(e._ownerReadableStream._reader === e), "readable" === e._ownerReadableStream._state ? Ie(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")) : function (e, t) { b(void 0 === e._closedPromise_resolve), b(void 0 === e._closedPromise_reject), e._closedPromise = Promise.reject(t) }(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")), e._closedPromise.catch(function () { }), e._ownerReadableStream._reader = void 0, e._ownerReadableStream = void 0 } function re(e) { var t = e._ownerReadableStream; return b(void 0 !== t), t._disturbed = !0, "closed" === t._state ? Promise.resolve(s(void 0, !0)) : "errored" === t._state ? Promise.reject(t._storedError) : (b("readable" === t._state), t._readableStreamController.__pullSteps()) } var ne = function () { function e(t, r, n, a) { if (i(this, e), !1 === M(t)) throw new TypeError("ReadableStreamDefaultController can only be constructed with a ReadableStream instance"); if (void 0 !== t._readableStreamController) throw new TypeError("ReadableStreamDefaultController instances can only be created by the ReadableStream constructor"); this._controlledReadableStream = t, this._underlyingSource = r, this._queue = void 0, this._queueTotalSize = void 0, k(this), this._started = !1, this._closeRequested = !1, this._pullAgain = !1, this._pulling = !1; var o = d(n, a); this._strategySize = o.size, this._strategyHWM = o.highWaterMark; var s = this, u = l(r, "start", [this]); Promise.resolve(u).then(function () { s._started = !0, b(!1 === s._pulling), b(!1 === s._pullAgain), ae(s) }, function (e) { le(s, e) }).catch(_) } return n(e, [{ key: "close", value: function () { if (!1 === ie(this)) throw Le("close"); if (!0 === this._closeRequested) throw new TypeError("The stream has already been closed; do not close it again!"); var e = this._controlledReadableStream._state; if ("readable" !== e) throw new TypeError("The stream (in " + e + " state) is not in the readable state and cannot be closed"); oe(this) } }, { key: "enqueue", value: function (e) { if (!1 === ie(this)) throw Le("enqueue"); if (!0 === this._closeRequested) throw new TypeError("stream is closed or draining"); var t = this._controlledReadableStream._state; if ("readable" !== t) throw new TypeError("The stream (in " + t + " state) is not in the readable state and cannot be enqueued to"); return se(this, e) } }, { key: "error", value: function (e) { if (!1 === ie(this)) throw Le("error"); var t = this._controlledReadableStream; if ("readable" !== t._state) throw new TypeError("The stream is " + t._state + " and so cannot be errored"); ue(this, e) } }, { key: "__cancelSteps", value: function (e) { return k(this), c(this._underlyingSource, "cancel", [e]) } }, { key: "__pullSteps", value: function () { var e = this._controlledReadableStream; if (this._queue.length > 0) { var t = S(this); return !0 === this._closeRequested && 0 === this._queue.length ? B(e) : ae(this), Promise.resolve(s(t, !1)) } var r = W(e); return ae(this), r } }, { key: "desiredSize", get: function () { if (!1 === ie(this)) throw Le("desiredSize"); return ce(this) } }]), e }(); function ie(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_underlyingSource") } function ae(e) { !1 !== function (e) { var t = e._controlledReadableStream; if ("closed" === t._state || "errored" === t._state) return !1; if (!0 === e._closeRequested) return !1; if (!1 === e._started) return !1; if (!0 === D(t) && X(t) > 0) return !0; if (ce(e) > 0) return !0; return !1 }(e) && (!0 !== e._pulling ? (b(!1 === e._pullAgain), e._pulling = !0, c(e._underlyingSource, "pull", [e]).then(function () { if (e._pulling = !1, !0 === e._pullAgain) return e._pullAgain = !1, ae(e) }, function (t) { le(e, t) }).catch(_)) : e._pullAgain = !0) } function oe(e) { var t = e._controlledReadableStream; b(!1 === e._closeRequested), b("readable" === t._state), e._closeRequested = !0, 0 === e._queue.length && B(t) } function se(e, t) { var r = e._controlledReadableStream; if (b(!1 === e._closeRequested), b("readable" === r._state), !0 === D(r) && X(r) > 0) G(r, t, !1); else { var n = 1; if (void 0 !== e._strategySize) { var i = e._strategySize; try { n = i(t) } catch (t) { throw le(e, t), t } } try { w(e, t, n) } catch (t) { throw le(e, t), t } } ae(e) } function ue(e, t) { var r = e._controlledReadableStream; b("readable" === r._state), k(e), z(r, t) } function le(e, t) { "readable" === e._controlledReadableStream._state && ue(e, t) } function ce(e) { var t = e._controlledReadableStream._state; return "errored" === t ? null : "closed" === t ? 0 : e._strategyHWM - e._queueTotalSize } var he = function () { function e(t, r) { i(this, e), this._associatedReadableByteStreamController = t, this._view = r } return n(e, [{ key: "respond", value: function (e) { if (!1 === pe(this)) throw je("respond"); if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated"); !function (e, t) { if (t = Number(t), !1 === u(t)) throw new RangeError("bytesWritten must be a finite"); b(e._pendingPullIntos.length > 0), Pe(e, t) }(this._associatedReadableByteStreamController, e) } }, { key: "respondWithNewView", value: function (e) { if (!1 === pe(this)) throw je("respond"); if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated"); if (!ArrayBuffer.isView(e)) throw new TypeError("You can only respond with array buffer views"); !function (e, t) { b(e._pendingPullIntos.length > 0); var r = e._pendingPullIntos[0]; if (r.byteOffset + r.bytesFilled !== t.byteOffset) throw new RangeError("The region specified by view does not match byobRequest"); if (r.byteLength !== t.byteLength) throw new RangeError("The buffer of view has different capacity than byobRequest"); r.buffer = t.buffer, Pe(e, t.byteLength) }(this._associatedReadableByteStreamController, e) } }, { key: "view", get: function () { return this._view } }]), e }(), de = function () { function e(t, r, n) { if (i(this, e), !1 === M(t)) throw new TypeError("ReadableByteStreamController can only be constructed with a ReadableStream instance given a byte source"); if (void 0 !== t._readableStreamController) throw new TypeError("ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte source"); this._controlledReadableStream = t, this._underlyingByteSource = r, this._pullAgain = !1, this._pulling = !1, me(this), this._queue = this._queueTotalSize = void 0, k(this), this._closeRequested = !1, this._started = !1, this._strategyHWM = f(n); var a = r.autoAllocateChunkSize; if (void 0 !== a && (!1 === Number.isInteger(a) || a <= 0)) throw new RangeError("autoAllocateChunkSize must be a positive integer"); this._autoAllocateChunkSize = a, this._pendingPullIntos = []; var o = this, s = l(r, "start", [this]); Promise.resolve(s).then(function () { o._started = !0, b(!1 === o._pulling), b(!1 === o._pullAgain), ve(o) }, function (e) { "readable" === t._state && Ce(o, e) }).catch(_) } return n(e, [{ key: "close", value: function () { if (!1 === fe(this)) throw Me("close"); if (!0 === this._closeRequested) throw new TypeError("The stream has already been closed; do not close it again!"); var e = this._controlledReadableStream._state; if ("readable" !== e) throw new TypeError("The stream (in " + e + " state) is not in the readable state and cannot be closed"); !function (e) { var t = e._controlledReadableStream; if (b(!1 === e._closeRequested), b("readable" === t._state), e._queueTotalSize > 0) return void (e._closeRequested = !0); if (e._pendingPullIntos.length > 0) { var r = e._pendingPullIntos[0]; if (r.bytesFilled > 0) { var n = new TypeError("Insufficient bytes to fill elements in the given buffer"); throw Ce(e, n), n } } B(t) }(this) } }, { key: "enqueue", value: function (e) { if (!1 === fe(this)) throw Me("enqueue"); if (!0 === this._closeRequested) throw new TypeError("stream is closed or draining"); var t = this._controlledReadableStream._state; if ("readable" !== t) throw new TypeError("The stream (in " + t + " state) is not in the readable state and cannot be enqueued to"); if (!ArrayBuffer.isView(e)) throw new TypeError("You can only enqueue array buffer views when using a ReadableByteStreamController"); !function (e, t) { var r = e._controlledReadableStream; b(!1 === e._closeRequested), b("readable" === r._state); var n = t.buffer, i = t.byteOffset, a = t.byteLength, o = h(n); if (!0 === V(r)) if (0 === X(r)) be(e, o, i, a); else { b(0 === e._queue.length); var s = new Uint8Array(o, i, a); G(r, s, !1) } else !0 === Y(r) ? (be(e, o, i, a), ke(e)) : (b(!1 === D(r), "stream must not be locked"), be(e, o, i, a)) }(this, e) } }, { key: "error", value: function (e) { if (!1 === fe(this)) throw Me("error"); var t = this._controlledReadableStream; if ("readable" !== t._state) throw new TypeError("The stream is " + t._state + " and so cannot be errored"); Ce(this, e) } }, { key: "__cancelSteps", value: function (e) { this._pendingPullIntos.length > 0 && (this._pendingPullIntos[0].bytesFilled = 0); return k(this), c(this._underlyingByteSource, "cancel", [e]) } }, { key: "__pullSteps", value: function () { var e = this._controlledReadableStream; if (b(!0 === V(e)), this._queueTotalSize > 0) { b(0 === X(e)); var t = this._queue.shift(); this._queueTotalSize -= t.byteLength, Se(this); var r = void 0; try { r = new Uint8Array(t.buffer, t.byteOffset, t.byteLength) } catch (e) { return Promise.reject(e) } return Promise.resolve(s(r, !1)) } var n = this._autoAllocateChunkSize; if (void 0 !== n) { var i = void 0; try { i = new ArrayBuffer(n) } catch (e) { return Promise.reject(e) } var a = { buffer: i, byteOffset: 0, byteLength: n, bytesFilled: 0, elementSize: 1, ctor: Uint8Array, readerType: "default" }; this._pendingPullIntos.push(a) } var o = W(e); return ve(this), o } }, { key: "byobRequest", get: function () { if (!1 === fe(this)) throw Me("byobRequest"); if (void 0 === this._byobRequest && this._pendingPullIntos.length > 0) { var e = this._pendingPullIntos[0], t = new Uint8Array(e.buffer, e.byteOffset + e.bytesFilled, e.byteLength - e.bytesFilled); this._byobRequest = new he(this, t) } return this._byobRequest } }, { key: "desiredSize", get: function () { if (!1 === fe(this)) throw Me("desiredSize"); return Re(this) } }]), e }(); function fe(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_underlyingByteSource") } function pe(e) { return !!g(e) && !!Object.prototype.hasOwnProperty.call(e, "_associatedReadableByteStreamController") } function ve(e) { !1 !== function (e) { var t = e._controlledReadableStream; if ("readable" !== t._state) return !1; if (!0 === e._closeRequested) return !1; if (!1 === e._started) return !1; if (!0 === V(t) && X(t) > 0) return !0; if (!0 === Y(t) && H(t) > 0) return !0; if (Re(e) > 0) return !0; return !1 }(e) && (!0 !== e._pulling ? (b(!1 === e._pullAgain), e._pulling = !0, c(e._underlyingByteSource, "pull", [e]).then(function () { e._pulling = !1, !0 === e._pullAgain && (e._pullAgain = !1, ve(e)) }, function (t) { "readable" === e._controlledReadableStream._state && Ce(e, t) }).catch(_)) : e._pullAgain = !0) } function me(e) { we(e), e._pendingPullIntos = [] } function ge(e, t) { b("errored" !== e._state, "state must not be errored"); var r = !1; "closed" === e._state && (b(0 === t.bytesFilled), r = !0); var n = ye(t); "default" === t.readerType ? G(e, n, r) : (b("byob" === t.readerType), function (e, t, r) { var n = e._reader; b(n._readIntoRequests.length > 0), n._readIntoRequests.shift()._resolve(s(t, r)) }(e, n, r)) } function ye(e) { var t = e.bytesFilled, r = e.elementSize; return b(t <= e.byteLength), b(t % r == 0), new e.ctor(e.buffer, e.byteOffset, t / r) } function be(e, t, r, n) { e._queue.push({ buffer: t, byteOffset: r, byteLength: n }), e._queueTotalSize += n } function _e(e, t) { var r = t.elementSize, n = t.bytesFilled - t.bytesFilled % r, i = Math.min(e._queueTotalSize, t.byteLength - t.bytesFilled), a = t.bytesFilled + i, s = a - a % r, u = i, l = !1; s > n && (u = s - t.bytesFilled, l = !0); for (var c = e._queue; u > 0;) { var h = c[0], d = Math.min(u, h.byteLength), f = t.byteOffset + t.bytesFilled; o(t.buffer, f, h.buffer, h.byteOffset, d), h.byteLength === d ? c.shift() : (h.byteOffset += d, h.byteLength -= d), e._queueTotalSize -= d, Ae(e, d, t), u -= d } return !1 === l && (b(0 === e._queueTotalSize, "queue must be empty"), b(t.bytesFilled > 0), b(t.bytesFilled < t.elementSize)), l } function Ae(e, t, r) { b(0 === e._pendingPullIntos.length || e._pendingPullIntos[0] === r), we(e), r.bytesFilled += t } function Se(e) { b("readable" === e._controlledReadableStream._state), 0 === e._queueTotalSize && !0 === e._closeRequested ? B(e._controlledReadableStream) : ve(e) } function we(e) { void 0 !== e._byobRequest && (e._byobRequest._associatedReadableByteStreamController = void 0, e._byobRequest._view = void 0, e._byobRequest = void 0) } function ke(e) { for (b(!1 === e._closeRequested); e._pendingPullIntos.length > 0;) { if (0 === e._queueTotalSize) return; var t = e._pendingPullIntos[0]; !0 === _e(e, t) && (xe(e), ge(e._controlledReadableStream, t)) } } function Pe(e, t) { var r = e._pendingPullIntos[0], n = e._controlledReadableStream; if ("closed" === n._state) { if (0 !== t) throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream"); !function (e, t) { t.buffer = h(t.buffer), b(0 === t.bytesFilled, "bytesFilled must be 0"); var r = e._controlledReadableStream; if (!0 === Y(r)) for (; H(r) > 0;)ge(r, xe(e)) }(e, r) } else b("readable" === n._state), function (e, t, r) { if (r.bytesFilled + t > r.byteLength) throw new RangeError("bytesWritten out of range"); if (Ae(e, t, r), !(r.bytesFilled < r.elementSize)) { xe(e); var n = r.bytesFilled % r.elementSize; if (n > 0) { var i = r.byteOffset + r.bytesFilled, a = r.buffer.slice(i - n, i); be(e, a, 0, a.byteLength) } r.buffer = h(r.buffer), r.bytesFilled -= n, ge(e._controlledReadableStream, r), ke(e) } }(e, t, r) } function xe(e) { var t = e._pendingPullIntos.shift(); return we(e), t } function Ce(e, t) { var r = e._controlledReadableStream; b("readable" === r._state), me(e), k(e), z(r, t) } function Re(e) { var t = e._controlledReadableStream._state; return "errored" === t ? null : "closed" === t ? 0 : e._strategyHWM - e._queueTotalSize } function Ee(e) { return new TypeError("ReadableStream.prototype." + e + " can only be used on a ReadableStream") } function Te(e) { return new TypeError("Cannot " + e + " a stream using a released reader") } function Oe(e) { return new TypeError("ReadableStreamDefaultReader.prototype." + e + " can only be used on a ReadableStreamDefaultReader") } function Ie(e, t) { b(void 0 !== e._closedPromise_resolve), b(void 0 !== e._closedPromise_reject), e._closedPromise_reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 } function Fe(e) { return new TypeError("ReadableStreamBYOBReader.prototype." + e + " can only be used on a ReadableStreamBYOBReader") } function Le(e) { return new TypeError("ReadableStreamDefaultController.prototype." + e + " can only be used on a ReadableStreamDefaultController") } function je(e) { return new TypeError("ReadableStreamBYOBRequest.prototype." + e + " can only be used on a ReadableStreamBYOBRequest") } function Me(e) { return new TypeError("ReadableByteStreamController.prototype." + e + " can only be used on a ReadableByteStreamController") } }, function (e, t, r) { var n = r(6), i = r(4), a = r(2); t.TransformStream = n.TransformStream, t.ReadableStream = i.ReadableStream, t.IsReadableStreamDisturbed = i.IsReadableStreamDisturbed, t.ReadableStreamDefaultControllerClose = i.ReadableStreamDefaultControllerClose, t.ReadableStreamDefaultControllerEnqueue = i.ReadableStreamDefaultControllerEnqueue, t.ReadableStreamDefaultControllerError = i.ReadableStreamDefaultControllerError, t.ReadableStreamDefaultControllerGetDesiredSize = i.ReadableStreamDefaultControllerGetDesiredSize, t.AcquireWritableStreamDefaultWriter = a.AcquireWritableStreamDefaultWriter, t.IsWritableStream = a.IsWritableStream, t.IsWritableStreamLocked = a.IsWritableStreamLocked, t.WritableStream = a.WritableStream, t.WritableStreamAbort = a.WritableStreamAbort, t.WritableStreamDefaultControllerError = a.WritableStreamDefaultControllerError, t.WritableStreamDefaultWriterCloseWithErrorPropagation = a.WritableStreamDefaultWriterCloseWithErrorPropagation, t.WritableStreamDefaultWriterRelease = a.WritableStreamDefaultWriterRelease, t.WritableStreamDefaultWriterWrite = a.WritableStreamDefaultWriterWrite }, function (e, t, r) { var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(); function i(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var a = r(1).assert, o = r(0), s = o.InvokeOrNoop, u = o.PromiseInvokeOrPerformFallback, l = o.PromiseInvokeOrNoop, c = o.typeIsObject, h = r(4), d = h.ReadableStream, f = h.ReadableStreamDefaultControllerClose, p = h.ReadableStreamDefaultControllerEnqueue, v = h.ReadableStreamDefaultControllerError, m = h.ReadableStreamDefaultControllerGetDesiredSize, g = r(2), y = g.WritableStream, b = g.WritableStreamDefaultControllerError; function _(e, t) { if (!0 === e._errored) throw new TypeError("TransformStream is already errored"); if (!0 === e._readableClosed) throw new TypeError("Readable side is already closed"); var r = e._readableController; try { p(r, t) } catch (t) { throw e._readableClosed = !0, S(e, t), e._storedError } !0 === m(r) <= 0 && !1 === e._backpressure && P(e, !0) } function A(e) { a(!1 === e._errored), a(!1 === e._readableClosed); try { f(e._readableController) } catch (e) { a(!1) } e._readableClosed = !0 } function S(e, t) { !1 === e._errored && w(e, t) } function w(e, t) { a(!1 === e._errored), e._errored = !0, e._storedError = t, !1 === e._writableDone && b(e._writableController, t), !1 === e._readableClosed && v(e._readableController, t) } function k(e) { return a(void 0 !== e._backpressureChangePromise, "_backpressureChangePromise should have been initialized"), !1 === e._backpressure ? Promise.resolve() : (a(!0 === e._backpressure, "_backpressure should have been initialized"), e._backpressureChangePromise) } function P(e, t) { a(e._backpressure !== t, "TransformStreamSetBackpressure() should be called only when backpressure is changed"), void 0 !== e._backpressureChangePromise && e._backpressureChangePromise_resolve(t), e._backpressureChangePromise = new Promise(function (t) { e._backpressureChangePromise_resolve = t }), e._backpressureChangePromise.then(function (e) { a(e !== t, "_backpressureChangePromise should be fulfilled only when backpressure is changed") }), e._backpressure = t } function x(e, t) { return _(t._controlledTransformStream, e), Promise.resolve() } function C(e) { return !!c(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledTransformStream") } function R(e) { return !!c(e) && !!Object.prototype.hasOwnProperty.call(e, "_transformStreamController") } var E = function () { function e(t, r) { i(this, e), this._transformStream = t, this._startPromise = r } return n(e, [{ key: "start", value: function (e) { var t = this._transformStream; return t._writableController = e, this._startPromise.then(function () { return k(t) }) } }, { key: "write", value: function (e) { return function (e, t) { a(!1 === e._errored), a(!1 === e._transforming), a(!1 === e._backpressure), e._transforming = !0; var r = e._transformer, n = e._transformStreamController; return u(r, "transform", [t, n], x, [t, n]).then(function () { return e._transforming = !1, k(e) }, function (t) { return S(e, t), Promise.reject(t) }) }(this._transformStream, e) } }, { key: "abort", value: function () { var e = this._transformStream; e._writableDone = !0, w(e, new TypeError("Writable side aborted")) } }, { key: "close", value: function () { var e = this._transformStream; return a(!1 === e._transforming), e._writableDone = !0, l(e._transformer, "flush", [e._transformStreamController]).then(function () { return !0 === e._errored ? Promise.reject(e._storedError) : (!1 === e._readableClosed && A(e), Promise.resolve()) }).catch(function (t) { return S(e, t), Promise.reject(e._storedError) }) } }]), e }(), T = function () { function e(t, r) { i(this, e), this._transformStream = t, this._startPromise = r } return n(e, [{ key: "start", value: function (e) { var t = this._transformStream; return t._readableController = e, this._startPromise.then(function () { return a(void 0 !== t._backpressureChangePromise, "_backpressureChangePromise should have been initialized"), !0 === t._backpressure ? Promise.resolve() : (a(!1 === t._backpressure, "_backpressure should have been initialized"), t._backpressureChangePromise) }) } }, { key: "pull", value: function () { var e = this._transformStream; return a(!0 === e._backpressure, "pull() should be never called while _backpressure is false"), a(void 0 !== e._backpressureChangePromise, "_backpressureChangePromise should have been initialized"), P(e, !1), e._backpressureChangePromise } }, { key: "cancel", value: function () { var e = this._transformStream; e._readableClosed = !0, w(e, new TypeError("Readable side canceled")) } }]), e }(), O = function () { function e(t) { if (i(this, e), !1 === R(t)) throw new TypeError("TransformStreamDefaultController can only be constructed with a TransformStream instance"); if (void 0 !== t._transformStreamController) throw new TypeError("TransformStreamDefaultController instances can only be created by the TransformStream constructor"); this._controlledTransformStream = t } return n(e, [{ key: "enqueue", value: function (e) { if (!1 === C(this)) throw F("enqueue"); _(this._controlledTransformStream, e) } }, { key: "close", value: function () { if (!1 === C(this)) throw F("close"); !function (e) { if (!0 === e._errored) throw new TypeError("TransformStream is already errored"); if (!0 === e._readableClosed) throw new TypeError("Readable side is already closed"); A(e) }(this._controlledTransformStream) } }, { key: "error", value: function (e) { if (!1 === C(this)) throw F("error"); !function (e, t) { if (!0 === e._errored) throw new TypeError("TransformStream is already errored"); w(e, t) }(this._controlledTransformStream, e) } }, { key: "desiredSize", get: function () { if (!1 === C(this)) throw F("desiredSize"); var e = this._controlledTransformStream._readableController; return m(e) } }]), e }(), I = function () { function e() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; i(this, e), this._transformer = t; var r = t.readableStrategy, n = t.writableStrategy; this._transforming = !1, this._errored = !1, this._storedError = void 0, this._writableController = void 0, this._readableController = void 0, this._transformStreamController = void 0, this._writableDone = !1, this._readableClosed = !1, this._backpressure = void 0, this._backpressureChangePromise = void 0, this._backpressureChangePromise_resolve = void 0, this._transformStreamController = new O(this); var o = void 0, u = new Promise(function (e) { o = e }), l = new T(this, u); this._readable = new d(l, r); var c = new E(this, u); this._writable = new y(c, n), a(void 0 !== this._writableController), a(void 0 !== this._readableController), P(this, m(this._readableController) <= 0); var h = this, f = s(t, "start", [h._transformStreamController]); o(f), u.catch(function (e) { !1 === h._errored && (h._errored = !0, h._storedError = e) }) } return n(e, [{ key: "readable", get: function () { if (!1 === R(this)) throw L("readable"); return this._readable } }, { key: "writable", get: function () { if (!1 === R(this)) throw L("writable"); return this._writable } }]), e }(); function F(e) { return new TypeError("TransformStreamDefaultController.prototype." + e + " can only be used on a TransformStreamDefaultController") } function L(e) { return new TypeError("TransformStream.prototype." + e + " can only be used on a TransformStream") } e.exports = { TransformStream: I } }, function (e, t, r) { e.exports = r(5) }])) }, function (e, t, r) { "use strict"; var n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, i = !1; try { if ("function" == typeof URL && "object" === n(URL.prototype) && "origin" in URL.prototype) { var a = new URL("b", "http://a"); a.pathname = "c%20d", i = "http://a/c%20d" === a.href } } catch (e) { } if (i) t.URL = URL; else { var o = r(128).URL, s = r(3).URL; s && (o.createObjectURL = function (e) { return s.createObjectURL.apply(s, arguments) }, o.revokeObjectURL = function (e) { s.revokeObjectURL(e) }), t.URL = o } }, function (e, t, r) { "use strict"; !function () { var e = Object.create(null); e.ftp = 21, e.file = 0, e.gopher = 70, e.http = 80, e.https = 443, e.ws = 80, e.wss = 443; var r = Object.create(null); function n(t) { return void 0 !== e[t] } function i() { d.call(this), this._isInvalid = !0 } function a(e) { return "" === e && i.call(this), e.toLowerCase() } function o(e) { var t = e.charCodeAt(0); return t > 32 && t < 127 && -1 === [34, 35, 60, 62, 63, 96].indexOf(t) ? e : encodeURIComponent(e) } function s(e) { var t = e.charCodeAt(0); return t > 32 && t < 127 && -1 === [34, 35, 60, 62, 96].indexOf(t) ? e : encodeURIComponent(e) } r["%2e"] = ".", r[".%2e"] = "..", r["%2e."] = "..", r["%2e%2e"] = ".."; var u, l = /[a-zA-Z]/, c = /[a-zA-Z0-9\+\-\.]/; function h(t, h, d) { function f(e) { b.push(e) } var p = h || "scheme start", v = 0, m = "", g = !1, y = !1, b = []; e: for (; (t[v - 1] !== u || 0 === v) && !this._isInvalid;) { var _ = t[v]; switch (p) { case "scheme start": if (!_ || !l.test(_)) { if (h) { f("Invalid scheme."); break e } m = "", p = "no scheme"; continue } m += _.toLowerCase(), p = "scheme"; break; case "scheme": if (_ && c.test(_)) m += _.toLowerCase(); else { if (":" !== _) { if (h) { if (_ === u) break e; f("Code point not allowed in scheme: " + _); break e } m = "", v = 0, p = "no scheme"; continue } if (this._scheme = m, m = "", h) break e; n(this._scheme) && (this._isRelative = !0), p = "file" === this._scheme ? "relative" : this._isRelative && d && d._scheme === this._scheme ? "relative or authority" : this._isRelative ? "authority first slash" : "scheme data" } break; case "scheme data": "?" === _ ? (this._query = "?", p = "query") : "#" === _ ? (this._fragment = "#", p = "fragment") : _ !== u && "\t" !== _ && "\n" !== _ && "\r" !== _ && (this._schemeData += o(_)); break; case "no scheme": if (d && n(d._scheme)) { p = "relative"; continue } f("Missing scheme."), i.call(this); break; case "relative or authority": if ("/" !== _ || "/" !== t[v + 1]) { f("Expected /, got: " + _), p = "relative"; continue } p = "authority ignore slashes"; break; case "relative": if (this._isRelative = !0, "file" !== this._scheme && (this._scheme = d._scheme), _ === u) { this._host = d._host, this._port = d._port, this._path = d._path.slice(), this._query = d._query, this._username = d._username, this._password = d._password; break e } if ("/" === _ || "\\" === _) "\\" === _ && f("\\ is an invalid code point."), p = "relative slash"; else if ("?" === _) this._host = d._host, this._port = d._port, this._path = d._path.slice(), this._query = "?", this._username = d._username, this._password = d._password, p = "query"; else { if ("#" !== _) { var A = t[v + 1], S = t[v + 2]; ("file" !== this._scheme || !l.test(_) || ":" !== A && "|" !== A || S !== u && "/" !== S && "\\" !== S && "?" !== S && "#" !== S) && (this._host = d._host, this._port = d._port, this._username = d._username, this._password = d._password, this._path = d._path.slice(), this._path.pop()), p = "relative path"; continue } this._host = d._host, this._port = d._port, this._path = d._path.slice(), this._query = d._query, this._fragment = "#", this._username = d._username, this._password = d._password, p = "fragment" } break; case "relative slash": if ("/" !== _ && "\\" !== _) { "file" !== this._scheme && (this._host = d._host, this._port = d._port, this._username = d._username, this._password = d._password), p = "relative path"; continue } "\\" === _ && f("\\ is an invalid code point."), p = "file" === this._scheme ? "file host" : "authority ignore slashes"; break; case "authority first slash": if ("/" !== _) { f("Expected '/', got: " + _), p = "authority ignore slashes"; continue } p = "authority second slash"; break; case "authority second slash": if (p = "authority ignore slashes", "/" !== _) { f("Expected '/', got: " + _); continue } break; case "authority ignore slashes": if ("/" !== _ && "\\" !== _) { p = "authority"; continue } f("Expected authority, got: " + _); break; case "authority": if ("@" === _) { g && (f("@ already seen."), m += "%40"), g = !0; for (var w = 0; w < m.length; w++) { var k = m[w]; if ("\t" !== k && "\n" !== k && "\r" !== k) if (":" !== k || null !== this._password) { var P = o(k); null !== this._password ? this._password += P : this._username += P } else this._password = ""; else f("Invalid whitespace in authority.") } m = "" } else { if (_ === u || "/" === _ || "\\" === _ || "?" === _ || "#" === _) { v -= m.length, m = "", p = "host"; continue } m += _ } break; case "file host": if (_ === u || "/" === _ || "\\" === _ || "?" === _ || "#" === _) { 2 !== m.length || !l.test(m[0]) || ":" !== m[1] && "|" !== m[1] ? 0 === m.length ? p = "relative path start" : (this._host = a.call(this, m), m = "", p = "relative path start") : p = "relative path"; continue } "\t" === _ || "\n" === _ || "\r" === _ ? f("Invalid whitespace in file host.") : m += _; break; case "host": case "hostname": if (":" !== _ || y) { if (_ === u || "/" === _ || "\\" === _ || "?" === _ || "#" === _) { if (this._host = a.call(this, m), m = "", p = "relative path start", h) break e; continue } "\t" !== _ && "\n" !== _ && "\r" !== _ ? ("[" === _ ? y = !0 : "]" === _ && (y = !1), m += _) : f("Invalid code point in host/hostname: " + _) } else if (this._host = a.call(this, m), m = "", p = "port", "hostname" === h) break e; break; case "port": if (/[0-9]/.test(_)) m += _; else { if (_ === u || "/" === _ || "\\" === _ || "?" === _ || "#" === _ || h) { if ("" !== m) { var x = parseInt(m, 10); x !== e[this._scheme] && (this._port = x + ""), m = "" } if (h) break e; p = "relative path start"; continue } "\t" === _ || "\n" === _ || "\r" === _ ? f("Invalid code point in port: " + _) : i.call(this) } break; case "relative path start": if ("\\" === _ && f("'\\' not allowed in path."), p = "relative path", "/" !== _ && "\\" !== _) continue; break; case "relative path": var C; if (_ !== u && "/" !== _ && "\\" !== _ && (h || "?" !== _ && "#" !== _)) "\t" !== _ && "\n" !== _ && "\r" !== _ && (m += o(_)); else "\\" === _ && f("\\ not allowed in relative path."), (C = r[m.toLowerCase()]) && (m = C), ".." === m ? (this._path.pop(), "/" !== _ && "\\" !== _ && this._path.push("")) : "." === m && "/" !== _ && "\\" !== _ ? this._path.push("") : "." !== m && ("file" === this._scheme && 0 === this._path.length && 2 === m.length && l.test(m[0]) && "|" === m[1] && (m = m[0] + ":"), this._path.push(m)), m = "", "?" === _ ? (this._query = "?", p = "query") : "#" === _ && (this._fragment = "#", p = "fragment"); break; case "query": h || "#" !== _ ? _ !== u && "\t" !== _ && "\n" !== _ && "\r" !== _ && (this._query += s(_)) : (this._fragment = "#", p = "fragment"); break; case "fragment": _ !== u && "\t" !== _ && "\n" !== _ && "\r" !== _ && (this._fragment += _) }v++ } } function d() { this._scheme = "", this._schemeData = "", this._username = "", this._password = null, this._host = "", this._port = "", this._path = [], this._query = "", this._fragment = "", this._isInvalid = !1, this._isRelative = !1 } function f(e, t) { void 0 === t || t instanceof f || (t = new f(String(t))), this._url = e, d.call(this); var r = e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ""); h.call(this, r, null, t) } f.prototype = { toString: function () { return this.href }, get href() { if (this._isInvalid) return this._url; var e = ""; return "" === this._username && null === this._password || (e = this._username + (null !== this._password ? ":" + this._password : "") + "@"), this.protocol + (this._isRelative ? "//" + e + this.host : "") + this.pathname + this._query + this._fragment }, set href(e) { d.call(this), h.call(this, e) }, get protocol() { return this._scheme + ":" }, set protocol(e) { this._isInvalid || h.call(this, e + ":", "scheme start") }, get host() { return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host }, set host(e) { !this._isInvalid && this._isRelative && h.call(this, e, "host") }, get hostname() { return this._host }, set hostname(e) { !this._isInvalid && this._isRelative && h.call(this, e, "hostname") }, get port() { return this._port }, set port(e) { !this._isInvalid && this._isRelative && h.call(this, e, "port") }, get pathname() { return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData }, set pathname(e) { !this._isInvalid && this._isRelative && (this._path = [], h.call(this, e, "relative path start")) }, get search() { return this._isInvalid || !this._query || "?" === this._query ? "" : this._query }, set search(e) { !this._isInvalid && this._isRelative && (this._query = "?", "?" === e[0] && (e = e.slice(1)), h.call(this, e, "query")) }, get hash() { return this._isInvalid || !this._fragment || "#" === this._fragment ? "" : this._fragment }, set hash(e) { this._isInvalid || (this._fragment = "#", "#" === e[0] && (e = e.slice(1)), h.call(this, e, "fragment")) }, get origin() { var e; if (this._isInvalid || !this._scheme) return ""; switch (this._scheme) { case "data": case "file": case "javascript": case "mailto": return "null"; case "blob": try { return new f(this._schemeData).origin || "null" } catch (e) { } return "null" }return (e = this.host) ? this._scheme + "://" + e : "" } }, t.URL = f }() }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.build = t.version = t.setPDFNetworkStreamFactory = t.PDFPageProxy = t.PDFDocumentProxy = t.PDFWorker = t.PDFDataRangeTransport = t.LoopbackPort = t.getDocument = void 0; var n, i = function () { return function (e, t) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return function (e, t) { var r = [], n = !0, i = !1, a = void 0; try { for (var o, s = e[Symbol.iterator](); !(n = (o = s.next()).done) && (r.push(o.value), !t || r.length !== t); n = !0); } catch (e) { i = !0, a = e } finally { try { !n && s.return && s.return() } finally { if (i) throw a } } return r }(e, t); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), a = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, s = r(1), u = r(130), l = r(131), c = r(132), h = r(133), d = r(3), f = (n = d) && n.__esModule ? n : { default: n }, p = r(135), v = r(136), m = r(141), g = r(143), y = r(144); function b(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var _ = 65536, A = !1, S = void 0, w = null, k = !1; "undefined" == typeof window ? (A = !0, void 0 === require.ensure && (require.ensure = require("node-ensure")), k = !0) : "undefined" != typeof require && "function" == typeof require.ensure && (k = !0), "undefined" != typeof requirejs && requirejs.toUrl && (S = requirejs.toUrl("pdfjs-dist/build/pdf.worker.js")); var P, x = "undefined" != typeof requirejs && requirejs.load; if (w = k ? function () { return new Promise(function (e, t) { require.ensure([], function () { try { var r; r = require("./pdf.worker.js"), e(r.WorkerMessageHandler) } catch (e) { t(e) } }, t, "pdfjsWorker") }) } : x ? function () { return new Promise(function (e, t) { requirejs(["pdfjs-dist/build/pdf.worker"], function (r) { try { e(r.WorkerMessageHandler) } catch (e) { t(e) } }, t) }) } : null, !S && "undefined" != typeof document) { var C = document.currentScript && document.currentScript.src; C && (S = C.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2")) } var R = function () { var e = 0; function t() { this._capability = (0, s.createPromiseCapability)(), this._transport = null, this._worker = null, this.docId = "d" + e++, this.destroyed = !1, this.onPassword = null, this.onProgress = null, this.onUnsupportedFeature = null } return t.prototype = { get promise() { return this._capability.promise }, destroy: function () { var e = this; return this.destroyed = !0, (this._transport ? this._transport.destroy() : Promise.resolve()).then(function () { e._transport = null, e._worker && (e._worker.destroy(), e._worker = null) }) }, then: function (e, t) { return this.promise.then.apply(this.promise, arguments) } }, t }(), E = function () { function e(t, r) { b(this, e), this.length = t, this.initialData = r, this._rangeListeners = [], this._progressListeners = [], this._progressiveReadListeners = [], this._readyCapability = (0, s.createPromiseCapability)() } return a(e, [{ key: "addRangeListener", value: function (e) { this._rangeListeners.push(e) } }, { key: "addProgressListener", value: function (e) { this._progressListeners.push(e) } }, { key: "addProgressiveReadListener", value: function (e) { this._progressiveReadListeners.push(e) } }, { key: "onDataRange", value: function (e, t) { var r = !0, n = !1, i = void 0; try { for (var a, o = this._rangeListeners[Symbol.iterator](); !(r = (a = o.next()).done); r = !0) { (0, a.value)(e, t) } } catch (e) { n = !0, i = e } finally { try { !r && o.return && o.return() } finally { if (n) throw i } } } }, { key: "onDataProgress", value: function (e) { var t = this; this._readyCapability.promise.then(function () { var r = !0, n = !1, i = void 0; try { for (var a, o = t._progressListeners[Symbol.iterator](); !(r = (a = o.next()).done); r = !0) { (0, a.value)(e) } } catch (e) { n = !0, i = e } finally { try { !r && o.return && o.return() } finally { if (n) throw i } } }) } }, { key: "onDataProgressiveRead", value: function (e) { var t = this; this._readyCapability.promise.then(function () { var r = !0, n = !1, i = void 0; try { for (var a, o = t._progressiveReadListeners[Symbol.iterator](); !(r = (a = o.next()).done); r = !0) { (0, a.value)(e) } } catch (e) { n = !0, i = e } finally { try { !r && o.return && o.return() } finally { if (n) throw i } } }) } }, { key: "transportReady", value: function () { this._readyCapability.resolve() } }, { key: "requestDataRange", value: function (e, t) { (0, s.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange") } }, { key: "abort", value: function () { } }]), e }(), T = function () { function e(t, r, n) { b(this, e), this.loadingTask = n, this._pdfInfo = t, this._transport = r } return a(e, [{ key: "getPage", value: function (e) { return this._transport.getPage(e) } }, { key: "getPageIndex", value: function (e) { return this._transport.getPageIndex(e) } }, { key: "getDestinations", value: function () { return this._transport.getDestinations() } }, { key: "getDestination", value: function (e) { return this._transport.getDestination(e) } }, { key: "getPageLabels", value: function () { return this._transport.getPageLabels() } }, { key: "getPageMode", value: function () { return this._transport.getPageMode() } }, { key: "getAttachments", value: function () { return this._transport.getAttachments() } }, { key: "getJavaScript", value: function () { return this._transport.getJavaScript() } }, { key: "getOutline", value: function () { return this._transport.getOutline() } }, { key: "getPermissions", value: function () { return this._transport.getPermissions() } }, { key: "getMetadata", value: function () { return this._transport.getMetadata() } }, { key: "getData", value: function () { return this._transport.getData() } }, { key: "getDownloadInfo", value: function () { return this._transport.downloadInfoCapability.promise } }, { key: "getStats", value: function () { return this._transport.getStats() } }, { key: "cleanup", value: function () { this._transport.startCleanup() } }, { key: "destroy", value: function () { return this.loadingTask.destroy() } }, { key: "numPages", get: function () { return this._pdfInfo.numPages } }, { key: "fingerprint", get: function () { return this._pdfInfo.fingerprint } }, { key: "loadingParams", get: function () { return this._transport.loadingParams } }]), e }(), O = function () { function e(e, t, r) { var n = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; this.pageIndex = e, this._pageInfo = t, this.transport = r, this._stats = n ? new u.StatTimer : u.DummyStatTimer, this._pdfBug = n, this.commonObjs = r.commonObjs, this.objs = new j, this.cleanupAfterRender = !1, this.pendingCleanup = !1, this.intentStates = Object.create(null), this.destroyed = !1 } return e.prototype = { 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: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.rotate, r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; return new u.PageViewport({ viewBox: this.view, scale: e, rotation: t, dontFlip: r }) }, getAnnotations: function (e) { var t = e && e.intent || null; return this.annotationsPromise && this.annotationsIntent === t || (this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, t), this.annotationsIntent = t), this.annotationsPromise }, render: function (e) { var t = this, r = this._stats; r.time("Overall"), this.pendingCleanup = !1; var n = "print" === e.intent ? "print" : "display", i = e.canvasFactory || new u.DOMCanvasFactory, a = new y.WebGLContext({ enable: e.enableWebGL }); this.intentStates[n] || (this.intentStates[n] = Object.create(null)); var o = this.intentStates[n]; o.displayReadyCapability || (o.receivingOperatorList = !0, o.displayReadyCapability = (0, s.createPromiseCapability)(), o.operatorList = { fnArray: [], argsArray: [], lastChunk: !1 }, r.time("Page Request"), this.transport.messageHandler.send("RenderPageRequest", { pageIndex: this.pageNumber - 1, intent: n, renderInteractiveForms: !0 === e.renderInteractiveForms })); var l = function (e) { var n = o.renderTasks.indexOf(c); n >= 0 && o.renderTasks.splice(n, 1), t.cleanupAfterRender && (t.pendingCleanup = !0), t._tryCleanup(), e ? c.capability.reject(e) : c.capability.resolve(), r.timeEnd("Rendering"), r.timeEnd("Overall") }, c = new D(l, e, this.objs, this.commonObjs, o.operatorList, this.pageNumber, i, a, this._pdfBug); c.useRequestAnimationFrame = "print" !== n, o.renderTasks || (o.renderTasks = []), o.renderTasks.push(c); var h = c.task; return o.displayReadyCapability.promise.then(function (e) { t.pendingCleanup ? l() : (r.time("Rendering"), c.initializeGraphics(e), c.operatorListChanged()) }).catch(l), h }, getOperatorList: function () { this.intentStates.oplist || (this.intentStates.oplist = Object.create(null)); var e, t = this.intentStates.oplist; return t.opListReadCapability || ((e = {}).operatorListChanged = function () { if (t.operatorList.lastChunk) { t.opListReadCapability.resolve(t.operatorList); var r = t.renderTasks.indexOf(e); r >= 0 && t.renderTasks.splice(r, 1) } }, t.receivingOperatorList = !0, t.opListReadCapability = (0, s.createPromiseCapability)(), t.renderTasks = [], t.renderTasks.push(e), t.operatorList = { fnArray: [], argsArray: [], lastChunk: !1 }, this._stats.time("Page Request"), this.transport.messageHandler.send("RenderPageRequest", { pageIndex: this.pageIndex, intent: "oplist" })), t.opListReadCapability.promise }, streamTextContent: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; return this.transport.messageHandler.sendWithStream("GetTextContent", { pageIndex: this.pageNumber - 1, normalizeWhitespace: !0 === e.normalizeWhitespace, combineTextItems: !0 !== e.disableCombineTextItems }, { highWaterMark: 100, size: function (e) { return e.items.length } }) }, getTextContent: function (e) { e = e || {}; var t = this.streamTextContent(e); return new Promise(function (e, r) { var n = t.getReader(), i = { items: [], styles: Object.create(null) }; !function t() { n.read().then(function (r) { var n, a = r.value; r.done ? e(i) : (Object.assign(i.styles, a.styles), (n = i.items).push.apply(n, function (e) { if (Array.isArray(e)) { for (var t = 0, r = Array(e.length); t < e.length; t++)r[t] = e[t]; return r } return Array.from(e) }(a.items)), t()) }, r) }() }) }, _destroy: function () { this.destroyed = !0, this.transport.pageCache[this.pageIndex] = null; var e = []; return Object.keys(this.intentStates).forEach(function (t) { "oplist" !== t && this.intentStates[t].renderTasks.forEach(function (t) { var r = t.capability.promise.catch(function () { }); e.push(r), t.cancel() }) }, this), this.objs.clear(), this.annotationsPromise = null, this.pendingCleanup = !1, Promise.all(e) }, cleanup: function () { var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; this.pendingCleanup = !0, this._tryCleanup(e) }, _tryCleanup: function () { var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; this.pendingCleanup && !Object.keys(this.intentStates).some(function (e) { var t = this.intentStates[e]; return 0 !== t.renderTasks.length || t.receivingOperatorList }, this) && (Object.keys(this.intentStates).forEach(function (e) { delete this.intentStates[e] }, this), this.objs.clear(), this.annotationsPromise = null, e && this._stats instanceof u.StatTimer && (this._stats = new u.StatTimer), this.pendingCleanup = !1) }, _startRenderPage: function (e, t) { var r = this.intentStates[t]; r.displayReadyCapability && r.displayReadyCapability.resolve(e) }, _renderPageChunk: function (e, t) { var r, n, i = this.intentStates[t]; for (r = 0, n = e.length; r < n; r++)i.operatorList.fnArray.push(e.fnArray[r]), i.operatorList.argsArray.push(e.argsArray[r]); for (i.operatorList.lastChunk = e.lastChunk, r = 0; r < i.renderTasks.length; r++)i.renderTasks[r].operatorListChanged(); e.lastChunk && (i.receivingOperatorList = !1, this._tryCleanup()) }, get stats() { return this._stats instanceof u.StatTimer ? this._stats : null } }, e }(), I = function () { function e() { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; b(this, e), this._listeners = [], this._defer = t, this._deferred = Promise.resolve(void 0) } return a(e, [{ key: "postMessage", value: function (e, t) { var r = this; if (this._defer) { var n = new WeakMap, i = { data: function e(r) { if ("object" !== (void 0 === r ? "undefined" : o(r)) || null === r) return r; if (n.has(r)) return n.get(r); var i, a; if ((a = r.buffer) && (0, s.isArrayBuffer)(a)) { var u = t && t.includes(a); return i = r === a ? r : u ? new r.constructor(a, r.byteOffset, r.byteLength) : new r.constructor(r), n.set(r, i), i } for (var l in i = Array.isArray(r) ? [] : {}, n.set(r, i), r) { for (var c, h = r; !(c = Object.getOwnPropertyDescriptor(h, l));)h = Object.getPrototypeOf(h); void 0 !== c.value && "function" != typeof c.value && (i[l] = e(c.value)) } return i }(e) }; this._deferred.then(function () { r._listeners.forEach(function (e) { e.call(this, i) }, r) }) } else this._listeners.forEach(function (t) { t.call(this, { data: e }) }, this) } }, { key: "addEventListener", value: function (e, t) { this._listeners.push(t) } }, { key: "removeEventListener", value: function (e, t) { var r = this._listeners.indexOf(t); this._listeners.splice(r, 1) } }, { key: "terminate", value: function () { this._listeners = [] } }]), e }(), F = function () { var e = 0; function t() { if (p.GlobalWorkerOptions.workerSrc) return p.GlobalWorkerOptions.workerSrc; if (void 0 !== S) return S; throw new Error('No "GlobalWorkerOptions.workerSrc" specified.') } function r() { try { if ("undefined" != typeof window) return window.pdfjsWorker && window.pdfjsWorker.WorkerMessageHandler } catch (e) { } return null } var n = void 0; var i = new WeakMap; function a() { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = e.name, r = void 0 === t ? null : t, n = e.port, a = void 0 === n ? null : n, o = e.postMessageTransfers, u = void 0 === o || o, l = e.verbosity, c = void 0 === l ? (0, s.getVerbosityLevel)() : l; if (a && i.has(a)) throw new Error("Cannot use more than one PDFWorker per port"); if (this.name = r, this.destroyed = !1, this.postMessageTransfers = !1 !== u, this.verbosity = c, this._readyCapability = (0, s.createPromiseCapability)(), this._port = null, this._webWorker = null, this._messageHandler = null, a) return i.set(a, this), void this._initializeFromPort(a); this._initialize() } return a.prototype = { get promise() { return this._readyCapability.promise }, get port() { return this._port }, get messageHandler() { return this._messageHandler }, _initializeFromPort: function (e) { this._port = e, this._messageHandler = new v.MessageHandler("main", "worker", e), this._messageHandler.on("ready", function () { }), this._readyCapability.resolve() }, _initialize: function () { var e, n, i = this; if ("undefined" != typeof Worker && !A && !r()) { var a = t(); try { (0, s.isSameOrigin)(window.location.href, a) || (e = new s.URL(a, window.location).href, n = "importScripts('" + e + "');", a = s.URL.createObjectURL(new Blob([n]))); var o = new Worker(a), u = new v.MessageHandler("main", "worker", o), l = function () { o.removeEventListener("error", c), u.destroy(), o.terminate(), i.destroyed ? i._readyCapability.reject(new Error("Worker was destroyed")) : i._setupFakeWorker() }, c = function () { i._webWorker || l() }; o.addEventListener("error", c), u.on("test", function (e) { o.removeEventListener("error", c), i.destroyed ? l() : e && e.supportTypedArray ? (i._messageHandler = u, i._port = o, i._webWorker = o, e.supportTransfers || (i.postMessageTransfers = !1), i._readyCapability.resolve(), u.send("configure", { verbosity: i.verbosity })) : (i._setupFakeWorker(), u.destroy(), o.terminate()) }), u.on("ready", function (e) { if (o.removeEventListener("error", c), i.destroyed) l(); else try { h() } catch (e) { i._setupFakeWorker() } }); var h = function () { var e = new Uint8Array([i.postMessageTransfers ? 255 : 0]); try { u.send("test", e, [e.buffer]) } catch (t) { (0, s.info)("Cannot use postMessage transfers"), e[0] = 0, u.send("test", e) } }; return void h() } catch (e) { (0, s.info)("The worker has been disabled.") } } this._setupFakeWorker() }, _setupFakeWorker: function () { var i = this; A || ((0, s.warn)("Setting up fake worker."), A = !0), function () { if (n) return n.promise; n = (0, s.createPromiseCapability)(); var e = r(); return e ? (n.resolve(e), n.promise) : ((w || function () { return (0, u.loadScript)(t()).then(function () { return window.pdfjsWorker.WorkerMessageHandler }) })().then(n.resolve, n.reject), n.promise) }().then(function (t) { if (i.destroyed) i._readyCapability.reject(new Error("Worker was destroyed")); else { var r = new I; i._port = r; var n = "fake" + e++, a = new v.MessageHandler(n + "_worker", n, r); t.setup(a, r); var o = new v.MessageHandler(n, n + "_worker", r); i._messageHandler = o, i._readyCapability.resolve() } }).catch(function (e) { i._readyCapability.reject(new Error('Setting up fake worker failed: "' + e.message + '".')) }) }, destroy: function () { this.destroyed = !0, this._webWorker && (this._webWorker.terminate(), this._webWorker = null), i.delete(this._port), this._port = null, this._messageHandler && (this._messageHandler.destroy(), this._messageHandler = null) } }, a.fromPort = function (e) { if (!e || !e.port) throw new Error("PDFWorker.fromPort - invalid method signature."); return i.has(e.port) ? i.get(e.port) : new a(e) }, a.getWorkerSrc = function () { return t() }, a }(), L = function () { function e(t, r, n, i) { b(this, e), this.messageHandler = t, this.loadingTask = r, this.commonObjs = new j, this.fontLoader = new l.FontLoader(r.docId), this._params = i, this.CMapReaderFactory = new i.CMapReaderFactory({ baseUrl: i.cMapUrl, isCompressed: i.cMapPacked }), this.destroyed = !1, this.destroyCapability = null, this._passwordCapability = null, this._networkStream = n, this._fullReader = null, this._lastProgress = null, this.pageCache = [], this.pagePromises = [], this.downloadInfoCapability = (0, s.createPromiseCapability)(), this.setupMessageHandler() } return a(e, [{ key: "destroy", value: function () { var e = this; if (this.destroyCapability) return this.destroyCapability.promise; this.destroyed = !0, this.destroyCapability = (0, s.createPromiseCapability)(), this._passwordCapability && this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback")); var t = []; this.pageCache.forEach(function (e) { e && t.push(e._destroy()) }), this.pageCache = [], this.pagePromises = []; var r = this.messageHandler.sendWithPromise("Terminate", null); return t.push(r), Promise.all(t).then(function () { e.fontLoader.clear(), e._networkStream && e._networkStream.cancelAllRequests(), e.messageHandler && (e.messageHandler.destroy(), e.messageHandler = null), e.destroyCapability.resolve() }, this.destroyCapability.reject), this.destroyCapability.promise } }, { key: "setupMessageHandler", value: function () { var e = this.messageHandler, t = this.loadingTask; e.on("GetReader", function (e, t) { var r = this; (0, s.assert)(this._networkStream), this._fullReader = this._networkStream.getFullReader(), this._fullReader.onProgress = function (e) { r._lastProgress = { loaded: e.loaded, total: e.total } }, t.onPull = function () { r._fullReader.read().then(function (e) { var r = e.value; e.done ? t.close() : ((0, s.assert)((0, s.isArrayBuffer)(r)), t.enqueue(new Uint8Array(r), 1, [r])) }).catch(function (e) { t.error(e) }) }, t.onCancel = function (e) { r._fullReader.cancel(e) } }, this), e.on("ReaderHeadersReady", function (e) { var r = this, n = (0, s.createPromiseCapability)(), i = this._fullReader; return i.headersReady.then(function () { i.isStreamingSupported && i.isRangeSupported || (r._lastProgress && t.onProgress && t.onProgress(r._lastProgress), i.onProgress = function (e) { t.onProgress && t.onProgress({ loaded: e.loaded, total: e.total }) }), n.resolve({ isStreamingSupported: i.isStreamingSupported, isRangeSupported: i.isRangeSupported, contentLength: i.contentLength }) }, n.reject), n.promise }, this), e.on("GetRangeReader", function (e, t) { (0, s.assert)(this._networkStream); var r = this._networkStream.getRangeReader(e.begin, e.end); t.onPull = function () { r.read().then(function (e) { var r = e.value; e.done ? t.close() : ((0, s.assert)((0, s.isArrayBuffer)(r)), t.enqueue(new Uint8Array(r), 1, [r])) }).catch(function (e) { t.error(e) }) }, t.onCancel = function (e) { r.cancel(e) } }, this), e.on("GetDoc", function (e) { var r = e.pdfInfo; this.numPages = r.numPages, this.pdfDocument = new T(r, this, t), t._capability.resolve(this.pdfDocument) }, this), e.on("PasswordRequest", function (e) { var r = this; if (this._passwordCapability = (0, s.createPromiseCapability)(), t.onPassword) { try { t.onPassword(function (e) { r._passwordCapability.resolve({ password: e }) }, e.code) } catch (e) { this._passwordCapability.reject(e) } } else this._passwordCapability.reject(new s.PasswordException(e.message, e.code)); return this._passwordCapability.promise }, this), e.on("PasswordException", function (e) { t._capability.reject(new s.PasswordException(e.message, e.code)) }, this), e.on("InvalidPDF", function (e) { t._capability.reject(new s.InvalidPDFException(e.message)) }, this), e.on("MissingPDF", function (e) { t._capability.reject(new s.MissingPDFException(e.message)) }, this), e.on("UnexpectedResponse", function (e) { t._capability.reject(new s.UnexpectedResponseException(e.message, e.status)) }, this), e.on("UnknownError", function (e) { t._capability.reject(new s.UnknownErrorException(e.message, e.details)) }, this), e.on("DataLoaded", function (e) { t.onProgress && t.onProgress({ loaded: e.length, total: e.length }), this.downloadInfoCapability.resolve(e) }, this), e.on("StartRenderPage", function (e) { if (!this.destroyed) { var t = this.pageCache[e.pageIndex]; t._stats.timeEnd("Page Request"), t._startRenderPage(e.transparency, e.intent) } }, this), e.on("RenderPageChunk", function (e) { this.destroyed || this.pageCache[e.pageIndex]._renderPageChunk(e.operatorList, e.intent) }, this), e.on("commonobj", function (e) { var t = this; if (!this.destroyed) { var r = i(e, 3), n = r[0], a = r[1], o = r[2]; if (!this.commonObjs.hasData(n)) switch (a) { case "Font": var u = this._params; if ("error" in o) { var c = o.error; (0, s.warn)("Error during font loading: " + c), this.commonObjs.resolve(n, c); break } var h = null; u.pdfBug && f.default.FontInspector && f.default.FontInspector.enabled && (h = { registerFont: function (e, t) { f.default.FontInspector.fontAdded(e, t) } }); var d = new l.FontFaceObject(o, { isEvalSupported: u.isEvalSupported, disableFontFace: u.disableFontFace, ignoreErrors: u.ignoreErrors, onUnsupportedFeature: this._onUnsupportedFeature.bind(this), fontRegistry: h }); this.fontLoader.bind([d], function (e) { t.commonObjs.resolve(n, d) }); break; case "FontPath": this.commonObjs.resolve(n, o); break; default: throw new Error("Got unknown common object type " + a) } } }, this), e.on("obj", function (e) { if (!this.destroyed) { var t = i(e, 4), r = t[0], n = t[1], a = t[2], o = t[3], s = this.pageCache[n]; if (!s.objs.hasData(r)) switch (a) { case "JpegStream": return new Promise(function (e, t) { var r = new Image; r.onload = function () { e(r) }, r.onerror = function () { t(new Error("Error during JPEG image loading")) }, r.src = o }).then(function (e) { s.objs.resolve(r, e) }); case "Image": s.objs.resolve(r, o); o && "data" in o && o.data.length > 8e6 && (s.cleanupAfterRender = !0); break; default: throw new Error("Got unknown object type " + a) } } }, this), e.on("DocProgress", function (e) { this.destroyed || t.onProgress && t.onProgress({ loaded: e.loaded, total: e.total }) }, this), e.on("PageError", function (e) { if (!this.destroyed) { var t = this.pageCache[e.pageNum - 1].intentStates[e.intent]; if (!t.displayReadyCapability) throw new Error(e.error); if (t.displayReadyCapability.reject(e.error), t.operatorList) { t.operatorList.lastChunk = !0; for (var r = 0; r < t.renderTasks.length; r++)t.renderTasks[r].operatorListChanged() } } }, this), e.on("UnsupportedFeature", this._onUnsupportedFeature, this), e.on("JpegDecode", function (e) { if (this.destroyed) return Promise.reject(new Error("Worker was destroyed")); if ("undefined" == typeof document) return Promise.reject(new Error('"document" is not defined.')); var t = i(e, 2), r = t[0], n = t[1]; return 3 !== n && 1 !== n ? Promise.reject(new Error("Only 3 components or 1 component can be returned")) : new Promise(function (e, t) { var i = new Image; i.onload = function () { var t = i.width, r = i.height, a = t * r, o = 4 * a, s = new Uint8ClampedArray(a * n), u = document.createElement("canvas"); u.width = t, u.height = r; var l = u.getContext("2d"); l.drawImage(i, 0, 0); var c = l.getImageData(0, 0, t, r).data; if (3 === n) for (var h = 0, d = 0; h < o; h += 4, d += 3)s[d] = c[h], s[d + 1] = c[h + 1], s[d + 2] = c[h + 2]; else if (1 === n) for (var f = 0, p = 0; f < o; f += 4, p++)s[p] = c[f]; e({ data: s, width: t, height: r }) }, i.onerror = function () { t(new Error("JpegDecode failed to load image")) }, i.src = r }) }, this), e.on("FetchBuiltInCMap", function (e) { return this.destroyed ? Promise.reject(new Error("Worker was destroyed")) : this.CMapReaderFactory.fetch({ name: e.name }) }, this) } }, { key: "_onUnsupportedFeature", value: function (e) { var t = e.featureId; this.destroyed || this.loadingTask.onUnsupportedFeature && this.loadingTask.onUnsupportedFeature(t) } }, { key: "getData", value: function () { return this.messageHandler.sendWithPromise("GetData", null) } }, { key: "getPage", value: function (e) { var t = this; if (!Number.isInteger(e) || e <= 0 || e > this.numPages) return Promise.reject(new Error("Invalid page request")); var r = e - 1; if (r in this.pagePromises) return this.pagePromises[r]; var n = this.messageHandler.sendWithPromise("GetPage", { pageIndex: r }).then(function (e) { if (t.destroyed) throw new Error("Transport destroyed"); var n = new O(r, e, t, t._params.pdfBug); return t.pageCache[r] = n, n }); return this.pagePromises[r] = n, n } }, { key: "getPageIndex", value: function (e) { return this.messageHandler.sendWithPromise("GetPageIndex", { ref: e }).catch(function (e) { return Promise.reject(new Error(e)) }) } }, { key: "getAnnotations", value: function (e, t) { return this.messageHandler.sendWithPromise("GetAnnotations", { pageIndex: e, intent: t }) } }, { key: "getDestinations", value: function () { return this.messageHandler.sendWithPromise("GetDestinations", null) } }, { key: "getDestination", value: function (e) { return "string" != typeof e ? Promise.reject(new Error("Invalid destination request.")) : this.messageHandler.sendWithPromise("GetDestination", { id: e }) } }, { key: "getPageLabels", value: function () { return this.messageHandler.sendWithPromise("GetPageLabels", null) } }, { key: "getPageMode", value: function () { return this.messageHandler.sendWithPromise("GetPageMode", null) } }, { key: "getAttachments", value: function () { return this.messageHandler.sendWithPromise("GetAttachments", null) } }, { key: "getJavaScript", value: function () { return this.messageHandler.sendWithPromise("GetJavaScript", null) } }, { key: "getOutline", value: function () { return this.messageHandler.sendWithPromise("GetOutline", null) } }, { key: "getPermissions", value: function () { return this.messageHandler.sendWithPromise("GetPermissions", null) } }, { key: "getMetadata", value: function () { var e = this; return this.messageHandler.sendWithPromise("GetMetadata", null).then(function (t) { return { info: t[0], metadata: t[1] ? new m.Metadata(t[1]) : null, contentDispositionFilename: e._fullReader ? e._fullReader.filename : null } }) } }, { key: "getStats", value: function () { return this.messageHandler.sendWithPromise("GetStats", null) } }, { key: "startCleanup", value: function () { var e = this; this.messageHandler.sendWithPromise("Cleanup", null).then(function () { for (var t = 0, r = e.pageCache.length; t < r; t++) { var n = e.pageCache[t]; n && n.cleanup() } e.commonObjs.clear(), e.fontLoader.clear() }) } }, { key: "loadingParams", get: function () { var e = this._params; return (0, s.shadow)(this, "loadingParams", { disableAutoFetch: e.disableAutoFetch, disableCreateObjectURL: e.disableCreateObjectURL, disableFontFace: e.disableFontFace, nativeImageDecoderSupport: e.nativeImageDecoderSupport }) } }]), e }(), j = function () { function e() { this.objs = Object.create(null) } return e.prototype = { ensureObj: function (e) { if (this.objs[e]) return this.objs[e]; var t = { capability: (0, s.createPromiseCapability)(), data: null, resolved: !1 }; return this.objs[e] = t, t }, get: function (e, t) { if (t) return this.ensureObj(e).capability.promise.then(t), null; var r = this.objs[e]; if (!r || !r.resolved) throw new Error("Requesting object that isn't resolved yet " + e); return r.data }, resolve: function (e, t) { var r = this.ensureObj(e); r.resolved = !0, r.data = t, r.capability.resolve(t) }, isResolved: function (e) { var t = this.objs; return !!t[e] && t[e].resolved }, hasData: function (e) { return this.isResolved(e) }, getData: function (e) { var t = this.objs; return t[e] && t[e].resolved ? t[e].data : null }, clear: function () { this.objs = Object.create(null) } }, e }(), M = function () { function e(e) { this._internalRenderTask = e, this.onContinue = null } return e.prototype = { get promise() { return this._internalRenderTask.capability.promise }, cancel: function () { this._internalRenderTask.cancel() }, then: function (e, t) { return this.promise.then.apply(this.promise, arguments) } }, e }(), D = function () { var e = new WeakMap; function t(e, t, r, n, i, a, o, u) { var l = arguments.length > 8 && void 0 !== arguments[8] && arguments[8]; this.callback = e, this.params = t, this.objs = r, this.commonObjs = n, this.operatorListIdx = null, this.operatorList = i, this.pageNumber = a, this.canvasFactory = o, this.webGLContext = u, this._pdfBug = l, this.running = !1, this.graphicsReadyCallback = null, this.graphicsReady = !1, this.useRequestAnimationFrame = !1, this.cancelled = !1, this.capability = (0, s.createPromiseCapability)(), this.task = new M(this), this._continueBound = this._continue.bind(this), this._scheduleNextBound = this._scheduleNext.bind(this), this._nextBound = this._next.bind(this), this._canvas = t.canvasContext.canvas } return t.prototype = { initializeGraphics: function (t) { if (!this.cancelled) { if (this._canvas) { if (e.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."); e.set(this._canvas, this) } this._pdfBug && f.default.StepperManager && f.default.StepperManager.enabled && (this.stepper = f.default.StepperManager.create(this.pageNumber - 1), this.stepper.init(this.operatorList), this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint()); var r = this.params; this.gfx = new h.CanvasGraphics(r.canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext, r.imageLayer), this.gfx.beginDrawing({ transform: r.transform, viewport: r.viewport, transparency: t, background: r.background }), this.operatorListIdx = 0, this.graphicsReady = !0, this.graphicsReadyCallback && this.graphicsReadyCallback() } }, cancel: function () { this.running = !1, this.cancelled = !0, this._canvas && e.delete(this._canvas), this.callback(new u.RenderingCancelledException("Rendering cancelled, page " + this.pageNumber, "canvas")) }, operatorListChanged: function () { this.graphicsReady ? (this.stepper && this.stepper.updateOperatorList(this.operatorList), this.running || this._continue()) : this.graphicsReadyCallback || (this.graphicsReadyCallback = this._continueBound) }, _continue: function () { this.running = !0, this.cancelled || (this.task.onContinue ? this.task.onContinue(this._scheduleNextBound) : this._scheduleNext()) }, _scheduleNext: function () { var e = this; this.useRequestAnimationFrame && "undefined" != typeof window ? window.requestAnimationFrame(function () { e._nextBound().catch(e.callback) }) : Promise.resolve().then(this._nextBound).catch(this.callback) }, _next: function () { var t = this; return new Promise(function () { t.cancelled || (t.operatorListIdx = t.gfx.executeOperatorList(t.operatorList, t.operatorListIdx, t._continueBound, t.stepper), t.operatorListIdx === t.operatorList.argsArray.length && (t.running = !1, t.operatorList.lastChunk && (t.gfx.endDrawing(), t._canvas && e.delete(t._canvas), t.callback()))) }) } }, t }(); t.version = "2.0.943", t.build = "dc98bf76", t.getDocument = function (e) { var t, r = new R; if ("string" == typeof e) t = { url: e }; else if ((0, s.isArrayBuffer)(e)) t = { data: e }; else if (e instanceof E) t = { range: e }; else { if ("object" !== (void 0 === e ? "undefined" : o(e))) throw new Error("Invalid parameter in getDocument, need either Uint8Array, string or a parameter object"); if (!e.url && !e.data && !e.range) throw new Error("Invalid parameter object: need either .data, .range or .url"); t = e } var n = Object.create(null), i = null, a = null; for (var l in t) if ("url" !== l || "undefined" == typeof window) if ("range" !== l) if ("worker" !== l) if ("data" !== l || t[l] instanceof Uint8Array) n[l] = t[l]; else { var h = t[l]; if ("string" == typeof h) n[l] = (0, s.stringToBytes)(h); else if ("object" !== (void 0 === h ? "undefined" : o(h)) || null === h || isNaN(h.length)) { if (!(0, s.isArrayBuffer)(h)) throw new Error("Invalid PDF binary data: either typed array, string or array-like object is expected in the data property."); n[l] = new Uint8Array(h) } else n[l] = new Uint8Array(h) } else a = t[l]; else i = t[l]; else n[l] = new s.URL(t[l], window.location).href; n.rangeChunkSize = n.rangeChunkSize || _, n.CMapReaderFactory = n.CMapReaderFactory || u.DOMCMapReaderFactory, n.ignoreErrors = !0 !== n.stopAtErrors, n.pdfBug = !0 === n.pdfBug; var d = Object.values(s.NativeImageDecoding); if (void 0 !== n.nativeImageDecoderSupport && d.includes(n.nativeImageDecoderSupport) || (n.nativeImageDecoderSupport = c.apiCompatibilityParams.nativeImageDecoderSupport || s.NativeImageDecoding.DECODE), Number.isInteger(n.maxImageSize) || (n.maxImageSize = -1), "boolean" != typeof n.isEvalSupported && (n.isEvalSupported = !0), "boolean" != typeof n.disableFontFace && (n.disableFontFace = c.apiCompatibilityParams.disableFontFace || !1), "boolean" != typeof n.disableRange && (n.disableRange = !1), "boolean" != typeof n.disableStream && (n.disableStream = !1), "boolean" != typeof n.disableAutoFetch && (n.disableAutoFetch = !1), "boolean" != typeof n.disableCreateObjectURL && (n.disableCreateObjectURL = c.apiCompatibilityParams.disableCreateObjectURL || !1), (0, s.setVerbosityLevel)(n.verbosity), !a) { var f = { postMessageTransfers: n.postMessageTransfers, verbosity: n.verbosity }, m = p.GlobalWorkerOptions.workerPort; m ? (f.port = m, a = F.fromPort(f)) : a = new F(f), r._worker = a } var y = r.docId; return a.promise.then(function () { if (r.destroyed) throw new Error("Loading aborted"); return function (e, t, r, n) { return e.destroyed ? Promise.reject(new Error("Worker was destroyed")) : (r && (t.length = r.length, t.initialData = r.initialData), e.messageHandler.sendWithPromise("GetDocRequest", { docId: n, apiVersion: "2.0.943", source: { data: t.data, url: t.url, password: t.password, disableAutoFetch: t.disableAutoFetch, rangeChunkSize: t.rangeChunkSize, length: t.length }, maxImageSize: t.maxImageSize, disableFontFace: t.disableFontFace, disableCreateObjectURL: t.disableCreateObjectURL, postMessageTransfers: e.postMessageTransfers, docBaseUrl: t.docBaseUrl, nativeImageDecoderSupport: t.nativeImageDecoderSupport, ignoreErrors: t.ignoreErrors, isEvalSupported: t.isEvalSupported }).then(function (t) { if (e.destroyed) throw new Error("Worker was destroyed"); return t })) }(a, n, i, y).then(function (e) { if (r.destroyed) throw new Error("Loading aborted"); var t = void 0; i ? t = new g.PDFDataTransportStream({ length: n.length, initialData: n.initialData, disableRange: n.disableRange, disableStream: n.disableStream }, i) : n.data || (t = P({ url: n.url, length: n.length, httpHeaders: n.httpHeaders, withCredentials: n.withCredentials, rangeChunkSize: n.rangeChunkSize, disableRange: n.disableRange, disableStream: n.disableStream })); var o = new v.MessageHandler(y, e, a.port); o.postMessageTransfers = a.postMessageTransfers; var s = new L(o, r, t, n); r._transport = s, o.send("Ready", null) }) }).catch(r._capability.reject), r }, t.LoopbackPort = I, t.PDFDataRangeTransport = E, t.PDFWorker = F, t.PDFDocumentProxy = T, t.PDFPageProxy = O, t.setPDFNetworkStreamFactory = function (e) { P = e }, t.version = "2.0.943", t.build = "dc98bf76" }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.loadScript = t.DummyStatTimer = t.StatTimer = t.DOMSVGFactory = t.DOMCMapReaderFactory = t.DOMCanvasFactory = t.DEFAULT_LINK_REL = t.LinkTarget = t.getFilenameFromUrl = t.addLinkAttributes = t.RenderingCancelledException = t.PageViewport = void 0; var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), i = r(1); function a(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var o = "noopener noreferrer nofollow", s = "http://www.w3.org/2000/svg", u = function () { function e() { a(this, e) } return n(e, [{ key: "create", value: function (e, t) { if (e <= 0 || t <= 0) throw new Error("invalid canvas size"); var r = document.createElement("canvas"), n = r.getContext("2d"); return r.width = e, r.height = t, { canvas: r, context: n } } }, { key: "reset", value: function (e, t, r) { if (!e.canvas) throw new Error("canvas is not specified"); if (t <= 0 || r <= 0) throw new Error("invalid canvas size"); e.canvas.width = t, e.canvas.height = r } }, { key: "destroy", value: function (e) { if (!e.canvas) throw new Error("canvas is not specified"); e.canvas.width = 0, e.canvas.height = 0, e.canvas = null, e.context = null } }]), e }(), l = function () { function e(t) { var r = t.baseUrl, n = void 0 === r ? null : r, i = t.isCompressed, o = void 0 !== i && i; a(this, e), this.baseUrl = n, this.isCompressed = o } return n(e, [{ key: "fetch", value: function (e) { var t = this, r = e.name; return this.baseUrl ? r ? new Promise(function (e, n) { var a = t.baseUrl + r + (t.isCompressed ? ".bcmap" : ""), o = new XMLHttpRequest; o.open("GET", a, !0), t.isCompressed && (o.responseType = "arraybuffer"), o.onreadystatechange = function () { if (o.readyState === XMLHttpRequest.DONE) { if (200 === o.status || 0 === o.status) { var r = void 0; if (t.isCompressed && o.response ? r = new Uint8Array(o.response) : !t.isCompressed && o.responseText && (r = (0, i.stringToBytes)(o.responseText)), r) return void e({ cMapData: r, compressionType: t.isCompressed ? i.CMapCompressionType.BINARY : i.CMapCompressionType.NONE }) } n(new Error("Unable to load " + (t.isCompressed ? "binary " : "") + "CMap at: " + a)) } }, o.send(null) }) : Promise.reject(new Error("CMap name must be specified.")) : Promise.reject(new Error('The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.')) } }]), e }(), c = function () { function e() { a(this, e) } return n(e, [{ key: "create", value: function (e, t) { (0, i.assert)(e > 0 && t > 0, "Invalid SVG dimensions"); var r = document.createElementNS(s, "svg:svg"); return r.setAttribute("version", "1.1"), r.setAttribute("width", e + "px"), r.setAttribute("height", t + "px"), r.setAttribute("preserveAspectRatio", "none"), r.setAttribute("viewBox", "0 0 " + e + " " + t), r } }, { key: "createElement", value: function (e) { return (0, i.assert)("string" == typeof e, "Invalid SVG element type"), document.createElementNS(s, e) } }]), e }(), h = function () { function e(t) { var r = t.viewBox, n = t.scale, i = t.rotation, o = t.offsetX, s = void 0 === o ? 0 : o, u = t.offsetY, l = void 0 === u ? 0 : u, c = t.dontFlip, h = void 0 !== c && c; a(this, e), this.viewBox = r, this.scale = n, this.rotation = i, this.offsetX = s, this.offsetY = l; var d = (r[2] + r[0]) / 2, f = (r[3] + r[1]) / 2, p = void 0, v = void 0, m = void 0, g = void 0; switch (i = (i %= 360) < 0 ? i + 360 : i) { case 180: p = -1, v = 0, m = 0, g = 1; break; case 90: p = 0, v = 1, m = 1, g = 0; break; case 270: p = 0, v = -1, m = -1, g = 0; break; default: p = 1, v = 0, m = 0, g = -1 }h && (m = -m, g = -g); var y = void 0, b = void 0, _ = void 0, A = void 0; 0 === p ? (y = Math.abs(f - r[1]) * n + s, b = Math.abs(d - r[0]) * n + l, _ = Math.abs(r[3] - r[1]) * n, A = Math.abs(r[2] - r[0]) * n) : (y = Math.abs(d - r[0]) * n + s, b = Math.abs(f - r[1]) * n + l, _ = Math.abs(r[2] - r[0]) * n, A = Math.abs(r[3] - r[1]) * n), this.transform = [p * n, v * n, m * n, g * n, y - p * n * d - m * n * f, b - v * n * d - g * n * f], this.width = _, this.height = A } return n(e, [{ key: "clone", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = t.scale, n = void 0 === r ? this.scale : r, i = t.rotation, a = void 0 === i ? this.rotation : i, o = t.dontFlip, s = void 0 !== o && o; return new e({ viewBox: this.viewBox.slice(), scale: n, rotation: a, offsetX: this.offsetX, offsetY: this.offsetY, dontFlip: s }) } }, { key: "convertToViewportPoint", value: function (e, t) { return i.Util.applyTransform([e, t], this.transform) } }, { key: "convertToViewportRectangle", value: function (e) { var t = i.Util.applyTransform([e[0], e[1]], this.transform), r = i.Util.applyTransform([e[2], e[3]], this.transform); return [t[0], t[1], r[0], r[1]] } }, { key: "convertToPdfPoint", value: function (e, t) { return i.Util.applyInverseTransform([e, t], this.transform) } }]), e }(), d = function () { function e(e, t) { this.message = e, this.type = t } return e.prototype = new Error, e.prototype.name = "RenderingCancelledException", e.constructor = e, e }(), f = { NONE: 0, SELF: 1, BLANK: 2, PARENT: 3, TOP: 4 }, p = ["", "_self", "_blank", "_parent", "_top"]; var v = function () { function e() { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; a(this, e), this.enabled = !!t, this.started = Object.create(null), this.times = [] } return n(e, [{ key: "time", value: function (e) { this.enabled && (e in this.started && (0, i.warn)("Timer is already running for " + e), this.started[e] = Date.now()) } }, { key: "timeEnd", value: function (e) { this.enabled && (e in this.started || (0, i.warn)("Timer has not been started for " + e), this.times.push({ name: e, start: this.started[e], end: Date.now() }), delete this.started[e]) } }, { key: "toString", value: function () { for (var e = this.times, t = "", r = 0, n = 0, i = e.length; n < i; ++n) { var a = e[n].name; a.length > r && (r = a.length) } for (var o = 0, s = e.length; o < s; ++o) { var u = e[o], l = u.end - u.start; t += u.name.padEnd(r) + " " + l + "ms\n" } return t } }]), e }(), m = function () { function e() { a(this, e), (0, i.unreachable)("Cannot initialize DummyStatTimer.") } return n(e, null, [{ key: "time", value: function (e) { } }, { key: "timeEnd", value: function (e) { } }, { key: "toString", value: function () { return "" } }]), e }(); t.PageViewport = h, t.RenderingCancelledException = d, t.addLinkAttributes = function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = t.url, n = t.target, a = t.rel; if (e.href = e.title = r ? (0, i.removeNullCharacters)(r) : "", r) { var s = Object.values(f).includes(n) ? n : f.NONE; e.target = p[s], e.rel = "string" == typeof a ? a : o } }, t.getFilenameFromUrl = function (e) { var t = e.indexOf("#"), r = e.indexOf("?"), n = Math.min(t > 0 ? t : e.length, r > 0 ? r : e.length); return e.substring(e.lastIndexOf("/", n) + 1, n) }, t.LinkTarget = f, t.DEFAULT_LINK_REL = o, t.DOMCanvasFactory = u, t.DOMCMapReaderFactory = l, t.DOMSVGFactory = c, t.StatTimer = v, t.DummyStatTimer = m, t.loadScript = function (e) { return new Promise(function (t, r) { var n = document.createElement("script"); n.src = e, n.onload = t, n.onerror = function () { r(new Error("Cannot load script at: " + n.src)) }, (document.head || document.documentElement).appendChild(n) }) } }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.FontLoader = t.FontFaceObject = void 0; var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), i = r(1); function a(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var o, s = function () { function e(t) { a(this, e), this.constructor === e && (0, i.unreachable)("Cannot initialize BaseFontLoader."), this.docId = t, this.nativeFontFaces = [], this.styleElement = null, this.loadingContext = { requests: [], nextRequestId: 0 } } return n(e, [{ key: "addNativeFontFace", value: function (e) { this.nativeFontFaces.push(e), document.fonts.add(e) } }, { key: "insertRule", value: function (e) { var t = this.styleElement; t || ((t = this.styleElement = document.createElement("style")).id = "PDFJS_FONT_STYLE_TAG_" + this.docId, document.documentElement.getElementsByTagName("head")[0].appendChild(t)); var r = t.sheet; r.insertRule(e, r.cssRules.length) } }, { key: "clear", value: function () { this.nativeFontFaces.forEach(function (e) { document.fonts.delete(e) }), this.nativeFontFaces.length = 0, this.styleElement && (this.styleElement.remove(), this.styleElement = null) } }, { key: "bind", value: function (e, t) { var r = [], n = [], a = [], o = function (e) { return e.loaded.catch(function (t) { (0, i.warn)('Failed to load font "' + e.family + '": ' + t) }) }, s = !0, u = !1, l = void 0; try { for (var c, h = e[Symbol.iterator](); !(s = (c = h.next()).done); s = !0) { var d = c.value; if (!d.attached && !d.missingFile) if (d.attached = !0, this.isFontLoadingAPISupported) { var f = d.createNativeFontFace(); f && (this.addNativeFontFace(f), a.push(o(f))) } else { var p = d.createFontFaceRule(); p && (this.insertRule(p), r.push(p), n.push(d)) } } } catch (e) { u = !0, l = e } finally { try { !s && h.return && h.return() } finally { if (u) throw l } } var v = this._queueLoadingCallback(t); this.isFontLoadingAPISupported ? Promise.all(a).then(v.complete) : r.length > 0 && !this.isSyncFontLoadingSupported ? this._prepareFontLoadEvent(r, n, v) : v.complete() } }, { key: "_queueLoadingCallback", value: function (e) { var t = this.loadingContext, r = { id: "pdfjs-font-loading-" + t.nextRequestId++, done: !1, complete: function () { for ((0, i.assert)(!r.done, "completeRequest() cannot be called twice."), r.done = !0; t.requests.length > 0 && t.requests[0].done;) { var e = t.requests.shift(); setTimeout(e.callback, 0) } }, callback: e }; return t.requests.push(r), r } }, { key: "_prepareFontLoadEvent", value: function (e, t, r) { (0, i.unreachable)("Abstract method `_prepareFontLoadEvent`.") } }, { key: "isFontLoadingAPISupported", get: function () { (0, i.unreachable)("Abstract method `isFontLoadingAPISupported`.") } }, { key: "isSyncFontLoadingSupported", get: function () { (0, i.unreachable)("Abstract method `isSyncFontLoadingSupported`.") } }, { key: "_loadTestFont", get: function () { (0, i.unreachable)("Abstract method `_loadTestFont`.") } }]), e }(); t.FontLoader = o = function (e) { function t(e) { a(this, t); var r = function (e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t }(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); return r.loadTestFontId = 0, r } return function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) }(t, s), n(t, [{ key: "_prepareFontLoadEvent", value: function (e, t, r) { function n(e, t) { return e.charCodeAt(t) << 24 | e.charCodeAt(t + 1) << 16 | e.charCodeAt(t + 2) << 8 | 255 & e.charCodeAt(t + 3) } function a(e, t, r, n) { return e.substring(0, t) + n + e.substring(t + r) } var o = void 0, s = void 0, u = document.createElement("canvas"); u.width = 1, u.height = 1; var l = u.getContext("2d"), c = 0; var h = "lt" + Date.now() + this.loadTestFontId++, d = this._loadTestFont, f = n(d = a(d, 976, h.length, h), 16); for (o = 0, s = h.length - 3; o < s; o += 4)f = f - 1482184792 + n(h, o) | 0; o < h.length && (f = f - 1482184792 + n(h + "XXX", o) | 0), d = a(d, 16, 4, (0, i.string32)(f)); var p = '@font-face {font-family:"' + h + '";src:' + ("url(data:font/opentype;base64," + btoa(d) + ");") + "}"; this.insertRule(p); var v = []; for (o = 0, s = t.length; o < s; o++)v.push(t[o].loadedName); v.push(h); var m = document.createElement("div"); for (m.setAttribute("style", "visibility: hidden;width: 10px; height: 10px;position: absolute; top: 0px; left: 0px;"), o = 0, s = v.length; o < s; ++o) { var g = document.createElement("span"); g.textContent = "Hi", g.style.fontFamily = v[o], m.appendChild(g) } document.body.appendChild(m), function e(t, r) { if (++c > 30) return (0, i.warn)("Load test font never loaded."), void r(); l.font = "30px " + t, l.fillText(".", 0, 20), l.getImageData(0, 0, 1, 1).data[3] > 0 ? r() : setTimeout(e.bind(null, t, r)) }(h, function () { document.body.removeChild(m), r.complete() }) } }, { key: "isFontLoadingAPISupported", get: function () { var e = "undefined" != typeof document && !!document.fonts; if (e && "undefined" != typeof navigator) { var t = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); t && t[1] < 63 && (e = !1) } return (0, i.shadow)(this, "isFontLoadingAPISupported", e) } }, { key: "isSyncFontLoadingSupported", get: function () { var e = !1; if ("undefined" == typeof navigator) e = !0; else { var t = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); t && t[1] >= 14 && (e = !0) } return (0, i.shadow)(this, "isSyncFontLoadingSupported", e) } }, { key: "_loadTestFont", get: function () { return (0, i.shadow)(this, "_loadTestFont", atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==")) } }]), t }(); var u = { get value() { return (0, i.shadow)(this, "value", (0, i.isEvalSupported)()) } }, l = function () { function e(t, r) { var n = r.isEvalSupported, i = void 0 === n || n, o = r.disableFontFace, s = void 0 !== o && o, u = r.ignoreErrors, l = void 0 !== u && u, c = r.onUnsupportedFeature, h = void 0 === c ? null : c, d = r.fontRegistry, f = void 0 === d ? null : d; for (var p in a(this, e), this.compiledGlyphs = Object.create(null), t) this[p] = t[p]; this.isEvalSupported = !1 !== i, this.disableFontFace = !0 === s, this.ignoreErrors = !0 === l, this._onUnsupportedFeature = h, this.fontRegistry = f } return n(e, [{ key: "createNativeFontFace", value: function () { if (!this.data || this.disableFontFace) return null; var e = new FontFace(this.loadedName, this.data, {}); return this.fontRegistry && this.fontRegistry.registerFont(this), e } }, { key: "createFontFaceRule", value: function () { if (!this.data || this.disableFontFace) return null; var e = (0, i.bytesToString)(new Uint8Array(this.data)), t = "url(data:" + this.mimetype + ";base64," + btoa(e) + ");", r = '@font-face {font-family:"' + this.loadedName + '";src:' + t + "}"; return this.fontRegistry && this.fontRegistry.registerFont(this, t), r } }, { key: "getPathGenerator", value: function (e, t) { if (void 0 !== this.compiledGlyphs[t]) return this.compiledGlyphs[t]; var r = void 0, n = void 0; try { r = e.get(this.loadedName + "_path_" + t) } catch (e) { if (!this.ignoreErrors) throw e; return this._onUnsupportedFeature && this._onUnsupportedFeature({ featureId: i.UNSUPPORTED_FEATURES.font }), (0, i.warn)('getPathGenerator - ignoring character: "' + e + '".'), this.compiledGlyphs[t] = function (e, t) { } } if (this.isEvalSupported && u.value) { for (var a = void 0, o = "", s = 0, l = r.length; s < l; s++)a = void 0 !== (n = r[s]).args ? n.args.join(",") : "", o += "c." + n.cmd + "(" + a + ");\n"; return this.compiledGlyphs[t] = new Function("c", "size", o) } return this.compiledGlyphs[t] = function (e, t) { for (var i = 0, a = r.length; i < a; i++)"scale" === (n = r[i]).cmd && (n.args = [t, -t]), e[n.cmd].apply(e, n.args) } } }]), e }(); t.FontFaceObject = l, t.FontLoader = o }, function (e, t, r) { "use strict"; var n = Object.create(null), i = r(4), a = "undefined" != typeof navigator && navigator.userAgent || "", o = /Trident/.test(a), s = /CriOS/.test(a); (o || s) && (n.disableCreateObjectURL = !0), i() && (n.disableFontFace = !0, n.nativeImageDecoderSupport = "none"), t.apiCompatibilityParams = Object.freeze(n) }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.CanvasGraphics = void 0; var n = r(1), i = r(134), a = 16, o = { get value() { return (0, n.shadow)(o, "value", (0, n.isLittleEndian)()) } }; function s(e) { e.mozCurrentTransform || (e._originalSave = e.save, e._originalRestore = e.restore, e._originalRotate = e.rotate, e._originalScale = e.scale, e._originalTranslate = e.translate, e._originalTransform = e.transform, e._originalSetTransform = e.setTransform, e._transformMatrix = e._transformMatrix || [1, 0, 0, 1, 0, 0], e._transformStack = [], Object.defineProperty(e, "mozCurrentTransform", { get: function () { return this._transformMatrix } }), Object.defineProperty(e, "mozCurrentTransformInverse", { get: function () { var e = this._transformMatrix, t = e[0], r = e[1], n = e[2], i = e[3], a = e[4], o = e[5], s = t * i - r * n, u = r * n - t * i; return [i / s, r / u, n / u, t / s, (i * a - n * o) / u, (r * a - t * o) / s] } }), e.save = function () { var e = this._transformMatrix; this._transformStack.push(e), this._transformMatrix = e.slice(0, 6), this._originalSave() }, e.restore = function () { var e = this._transformStack.pop(); e && (this._transformMatrix = e, this._originalRestore()) }, e.translate = function (e, t) { var r = this._transformMatrix; r[4] = r[0] * e + r[2] * t + r[4], r[5] = r[1] * e + r[3] * t + r[5], this._originalTranslate(e, t) }, e.scale = function (e, t) { var r = this._transformMatrix; r[0] = r[0] * e, r[1] = r[1] * e, r[2] = r[2] * t, r[3] = r[3] * t, this._originalScale(e, t) }, e.transform = function (t, r, n, i, a, o) { var s = this._transformMatrix; this._transformMatrix = [s[0] * t + s[2] * r, s[1] * t + s[3] * r, s[0] * n + s[2] * i, s[1] * n + s[3] * i, s[0] * a + s[2] * o + s[4], s[1] * a + s[3] * o + s[5]], e._originalTransform(t, r, n, i, a, o) }, e.setTransform = function (t, r, n, i, a, o) { this._transformMatrix = [t, r, n, i, a, o], e._originalSetTransform(t, r, n, i, a, o) }, e.rotate = function (e) { var t = Math.cos(e), r = Math.sin(e), n = this._transformMatrix; this._transformMatrix = [n[0] * t + n[2] * r, n[1] * t + n[3] * r, n[0] * -r + n[2] * t, n[1] * -r + n[3] * t, n[4], n[5]], this._originalRotate(e) }) } var u = function () { function e(e) { this.canvasFactory = e, this.cache = Object.create(null) } return e.prototype = { getCanvas: function (e, t, r, n) { var i; return void 0 !== this.cache[e] ? (i = this.cache[e], this.canvasFactory.reset(i, t, r), i.context.setTransform(1, 0, 0, 1, 0, 0)) : (i = this.canvasFactory.create(t, r), this.cache[e] = i), n && s(i.context), i }, clear: function () { for (var e in this.cache) { var t = this.cache[e]; this.canvasFactory.destroy(t), delete this.cache[e] } } }, e }(); var l = function () { function e() { this.alphaIsShape = !1, this.fontSize = 0, this.fontSizeScale = 1, this.textMatrix = n.IDENTITY_MATRIX, this.textMatrixScale = 1, this.fontMatrix = n.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 = n.TextRenderingMode.FILL, this.textRise = 0, this.fillColor = "#000000", this.strokeColor = "#000000", this.patternFill = !1, this.fillAlpha = 1, this.strokeAlpha = 1, this.lineWidth = 1, this.activeSMask = null, this.resumeSMaskCtx = null } return e.prototype = { clone: function () { return Object.create(this) }, setCurrentPoint: function (e, t) { this.x = e, this.y = t } }, e }(), c = function () { function e(e, t, r, n, i, a) { this.ctx = e, this.current = new l, this.stateStack = [], this.pendingClip = null, this.pendingEOFill = !1, this.res = null, this.xobjs = null, this.commonObjs = t, this.objs = r, this.canvasFactory = n, this.webGLContext = i, this.imageLayer = a, this.groupStack = [], this.processingType3 = null, this.baseTransform = null, this.baseTransformStack = [], this.groupLevel = 0, this.smaskStack = [], this.smaskCounter = 0, this.tempSMask = null, this.cachedCanvases = new u(this.canvasFactory), e && s(e), this._cachedGetSinglePixelWidth = null } function t(e, t) { if ("undefined" != typeof ImageData && t instanceof ImageData) e.putImageData(t, 0, 0); else { var r, i, s, u, l, c = t.height, h = t.width, d = c % a, f = (c - d) / a, p = 0 === d ? f : f + 1, v = e.createImageData(h, a), m = 0, g = t.data, y = v.data; if (t.kind === n.ImageKind.GRAYSCALE_1BPP) { var b = g.byteLength, _ = new Uint32Array(y.buffer, 0, y.byteLength >> 2), A = _.length, S = h + 7 >> 3, w = 4294967295, k = o.value ? 4278190080 : 255; for (i = 0; i < p; i++) { for (u = i < f ? a : d, r = 0, s = 0; s < u; s++) { for (var P = b - m, x = 0, C = P > S ? h : 8 * P - 7, R = -8 & C, E = 0, T = 0; x < R; x += 8)T = g[m++], _[r++] = 128 & T ? w : k, _[r++] = 64 & T ? w : k, _[r++] = 32 & T ? w : k, _[r++] = 16 & T ? w : k, _[r++] = 8 & T ? w : k, _[r++] = 4 & T ? w : k, _[r++] = 2 & T ? w : k, _[r++] = 1 & T ? w : k; for (; x < C; x++)0 === E && (T = g[m++], E = 128), _[r++] = T & E ? w : k, E >>= 1 } for (; r < A;)_[r++] = 0; e.putImageData(v, 0, i * a) } } else if (t.kind === n.ImageKind.RGBA_32BPP) { for (s = 0, l = h * a * 4, i = 0; i < f; i++)y.set(g.subarray(m, m + l)), m += l, e.putImageData(v, 0, s), s += a; i < p && (l = h * d * 4, y.set(g.subarray(m, m + l)), e.putImageData(v, 0, s)) } else { if (t.kind !== n.ImageKind.RGB_24BPP) throw new Error("bad image kind: " + t.kind); for (l = h * (u = a), i = 0; i < p; i++) { for (i >= f && (l = h * (u = d)), r = 0, s = l; s--;)y[r++] = g[m++], y[r++] = g[m++], y[r++] = g[m++], y[r++] = 255; e.putImageData(v, 0, i * a) } } } } function r(e, t) { for (var r = t.height, n = t.width, i = r % a, o = (r - i) / a, s = 0 === i ? o : o + 1, u = e.createImageData(n, a), l = 0, c = t.data, h = u.data, d = 0; d < s; d++) { for (var f = d < o ? a : i, p = 3, v = 0; v < f; v++)for (var m = 0, g = 0; g < n; g++) { if (!m) { var y = c[l++]; m = 128 } h[p] = y & m ? 0 : 255, p += 4, m >>= 1 } e.putImageData(u, 0, d * a) } } function c(e, t) { for (var r = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"], n = 0, i = r.length; n < i; n++) { var a = r[n]; void 0 !== e[a] && (t[a] = e[a]) } void 0 !== e.setLineDash && (t.setLineDash(e.getLineDash()), t.lineDashOffset = e.lineDashOffset) } function h(e) { e.strokeStyle = "#000000", e.fillStyle = "#000000", e.fillRule = "nonzero", e.globalAlpha = 1, e.lineWidth = 1, e.lineCap = "butt", e.lineJoin = "miter", e.miterLimit = 10, e.globalCompositeOperation = "source-over", e.font = "10px sans-serif", void 0 !== e.setLineDash && (e.setLineDash([]), e.lineDashOffset = 0) } function d(e, t, r, n) { for (var i = e.length, a = 3; a < i; a += 4) { var o = e[a]; if (0 === o) e[a - 3] = t, e[a - 2] = r, e[a - 1] = n; else if (o < 255) { var s = 255 - o; e[a - 3] = e[a - 3] * o + t * s >> 8, e[a - 2] = e[a - 2] * o + r * s >> 8, e[a - 1] = e[a - 1] * o + n * s >> 8 } } } function f(e, t, r) { for (var n = e.length, i = 3; i < n; i += 4) { var a = r ? r[e[i]] : e[i]; t[i] = t[i] * a * (1 / 255) | 0 } } function p(e, t, r) { for (var n = e.length, i = 3; i < n; i += 4) { var a = 77 * e[i - 3] + 152 * e[i - 2] + 28 * e[i - 1]; t[i] = r ? t[i] * r[a >> 8] >> 8 : t[i] * a >> 16 } } function v(e, t, r, n) { var i = t.canvas, a = t.context; e.setTransform(t.scaleX, 0, 0, t.scaleY, t.offsetX, t.offsetY); var o = t.backdrop || null; if (!t.transferMap && n.isEnabled) { var s = n.composeSMask({ layer: r.canvas, mask: i, properties: { subtype: t.subtype, backdrop: o } }); return e.setTransform(1, 0, 0, 1, 0, 0), void e.drawImage(s, t.offsetX, t.offsetY) } !function (e, t, r, n, i, a, o) { var s, u = !!a, l = u ? a[0] : 0, c = u ? a[1] : 0, h = u ? a[2] : 0; s = "Luminosity" === i ? p : f; for (var v = Math.min(n, Math.ceil(1048576 / r)), m = 0; m < n; m += v) { var g = Math.min(v, n - m), y = e.getImageData(0, m, r, g), b = t.getImageData(0, m, r, g); u && d(y.data, l, c, h), s(y.data, b.data, o), e.putImageData(b, 0, m) } }(a, r, i.width, i.height, t.subtype, o, t.transferMap), e.drawImage(i, 0, 0) } var m = ["butt", "round", "square"], g = ["miter", "round", "bevel"], y = {}, b = {}; for (var _ in e.prototype = { beginDrawing: function (e) { var t = e.transform, r = e.viewport, n = e.transparency, i = e.background, a = void 0 === i ? null : i, o = this.ctx.canvas.width, s = this.ctx.canvas.height; if (this.ctx.save(), this.ctx.fillStyle = a || "rgb(255, 255, 255)", this.ctx.fillRect(0, 0, o, s), this.ctx.restore(), n) { var u = this.cachedCanvases.getCanvas("transparent", o, s, !0); this.compositeCtx = this.ctx, this.transparentCanvas = u.canvas, this.ctx = u.context, this.ctx.save(), this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform) } this.ctx.save(), h(this.ctx), t && this.ctx.transform.apply(this.ctx, t), this.ctx.transform.apply(this.ctx, r.transform), this.baseTransform = this.ctx.mozCurrentTransform.slice(), this.imageLayer && this.imageLayer.beginLayout() }, executeOperatorList: function (e, t, r, i) { var a = e.argsArray, o = e.fnArray, s = t || 0, u = a.length; if (u === s) return s; for (var l, c = u - s > 10 && "function" == typeof r, h = c ? Date.now() + 15 : 0, d = 0, f = this.commonObjs, p = this.objs; ;) { if (void 0 !== i && s === i.nextBreakPoint) return i.breakIt(s, r), s; if ((l = o[s]) !== n.OPS.dependency) this[l].apply(this, a[s]); else for (var v = a[s], m = 0, g = v.length; m < g; m++) { var y = v[m], b = "g" === y[0] && "_" === y[1] ? f : p; if (!b.isResolved(y)) return b.get(y, r), s } if (++s === u) return s; if (c && ++d > 10) { if (Date.now() > h) return r(), s; d = 0 } } }, endDrawing: function () { null !== this.current.activeSMask && this.endSMaskGroup(), this.ctx.restore(), 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), this.cachedCanvases.clear(), this.webGLContext.clear(), this.imageLayer && this.imageLayer.endLayout() }, setLineWidth: function (e) { this.current.lineWidth = e, this.ctx.lineWidth = e }, setLineCap: function (e) { this.ctx.lineCap = m[e] }, setLineJoin: function (e) { this.ctx.lineJoin = g[e] }, setMiterLimit: function (e) { this.ctx.miterLimit = e }, setDash: function (e, t) { var r = this.ctx; void 0 !== r.setLineDash && (r.setLineDash(e), r.lineDashOffset = t) }, setRenderingIntent: function (e) { }, setFlatness: function (e) { }, setGState: function (e) { for (var t = 0, r = e.length; t < r; t++) { var n = e[t], i = n[0], a = n[1]; switch (i) { case "LW": this.setLineWidth(a); break; case "LC": this.setLineCap(a); break; case "LJ": this.setLineJoin(a); break; case "ML": this.setMiterLimit(a); break; case "D": this.setDash(a[0], a[1]); break; case "RI": this.setRenderingIntent(a); break; case "FL": this.setFlatness(a); break; case "Font": this.setFont(a[0], a[1]); break; case "CA": this.current.strokeAlpha = n[1]; break; case "ca": this.current.fillAlpha = n[1], this.ctx.globalAlpha = n[1]; break; case "BM": this.ctx.globalCompositeOperation = a; break; case "SMask": this.current.activeSMask && (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask ? this.suspendSMaskGroup() : this.endSMaskGroup()), this.current.activeSMask = a ? this.tempSMask : null, this.current.activeSMask && this.beginSMaskGroup(), this.tempSMask = null } } }, beginSMaskGroup: function () { var e = this.current.activeSMask, t = e.canvas.width, r = e.canvas.height, n = "smaskGroupAt" + this.groupLevel, i = this.cachedCanvases.getCanvas(n, t, r, !0), a = this.ctx, o = a.mozCurrentTransform; this.ctx.save(); var s = i.context; s.scale(1 / e.scaleX, 1 / e.scaleY), s.translate(-e.offsetX, -e.offsetY), s.transform.apply(s, o), e.startTransformInverse = s.mozCurrentTransformInverse, c(a, s), this.ctx = s, this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]), this.groupStack.push(a), this.groupLevel++ }, suspendSMaskGroup: function () { var e = this.ctx; this.groupLevel--, this.ctx = this.groupStack.pop(), v(this.ctx, this.current.activeSMask, e, this.webGLContext), this.ctx.restore(), this.ctx.save(), c(e, this.ctx), this.current.resumeSMaskCtx = e; var t = n.Util.transform(this.current.activeSMask.startTransformInverse, e.mozCurrentTransform); this.ctx.transform.apply(this.ctx, t), e.save(), e.setTransform(1, 0, 0, 1, 0, 0), e.clearRect(0, 0, e.canvas.width, e.canvas.height), e.restore() }, resumeSMaskGroup: function () { var e = this.current.resumeSMaskCtx, t = this.ctx; this.ctx = e, this.groupStack.push(t), this.groupLevel++ }, endSMaskGroup: function () { var e = this.ctx; this.groupLevel--, this.ctx = this.groupStack.pop(), v(this.ctx, this.current.activeSMask, e, this.webGLContext), this.ctx.restore(), c(e, this.ctx); var t = n.Util.transform(this.current.activeSMask.startTransformInverse, e.mozCurrentTransform); this.ctx.transform.apply(this.ctx, t) }, save: function () { this.ctx.save(); var e = this.current; this.stateStack.push(e), this.current = e.clone(), this.current.resumeSMaskCtx = null }, restore: function () { this.current.resumeSMaskCtx && this.resumeSMaskGroup(), null === this.current.activeSMask || 0 !== this.stateStack.length && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask || this.endSMaskGroup(), 0 !== this.stateStack.length && (this.current = this.stateStack.pop(), this.ctx.restore(), this.pendingClip = null, this._cachedGetSinglePixelWidth = null) }, transform: function (e, t, r, n, i, a) { this.ctx.transform(e, t, r, n, i, a), this._cachedGetSinglePixelWidth = null }, constructPath: function (e, t) { for (var r = this.ctx, i = this.current, a = i.x, o = i.y, s = 0, u = 0, l = e.length; s < l; s++)switch (0 | e[s]) { case n.OPS.rectangle: a = t[u++], o = t[u++]; var c = t[u++], h = t[u++]; 0 === c && (c = this.getSinglePixelWidth()), 0 === h && (h = this.getSinglePixelWidth()); var d = a + c, f = o + h; this.ctx.moveTo(a, o), this.ctx.lineTo(d, o), this.ctx.lineTo(d, f), this.ctx.lineTo(a, f), this.ctx.lineTo(a, o), this.ctx.closePath(); break; case n.OPS.moveTo: a = t[u++], o = t[u++], r.moveTo(a, o); break; case n.OPS.lineTo: a = t[u++], o = t[u++], r.lineTo(a, o); break; case n.OPS.curveTo: a = t[u + 4], o = t[u + 5], r.bezierCurveTo(t[u], t[u + 1], t[u + 2], t[u + 3], a, o), u += 6; break; case n.OPS.curveTo2: r.bezierCurveTo(a, o, t[u], t[u + 1], t[u + 2], t[u + 3]), a = t[u + 2], o = t[u + 3], u += 4; break; case n.OPS.curveTo3: a = t[u + 2], o = t[u + 3], r.bezierCurveTo(t[u], t[u + 1], a, o, a, o), u += 4; break; case n.OPS.closePath: r.closePath() }i.setCurrentPoint(a, o) }, closePath: function () { this.ctx.closePath() }, stroke: function (e) { e = void 0 === e || e; var t = this.ctx, r = this.current.strokeColor; t.lineWidth = Math.max(.65 * this.getSinglePixelWidth(), this.current.lineWidth), t.globalAlpha = this.current.strokeAlpha, r && r.hasOwnProperty("type") && "Pattern" === r.type ? (t.save(), t.strokeStyle = r.getPattern(t, this), t.stroke(), t.restore()) : t.stroke(), e && this.consumePath(), t.globalAlpha = this.current.fillAlpha }, closeStroke: function () { this.closePath(), this.stroke() }, fill: function (e) { e = void 0 === e || e; var t = this.ctx, r = this.current.fillColor, n = !1; this.current.patternFill && (t.save(), this.baseTransform && t.setTransform.apply(t, this.baseTransform), t.fillStyle = r.getPattern(t, this), n = !0), this.pendingEOFill ? (t.fill("evenodd"), this.pendingEOFill = !1) : t.fill(), n && t.restore(), e && this.consumePath() }, eoFill: function () { this.pendingEOFill = !0, this.fill() }, fillStroke: function () { this.fill(!1), this.stroke(!1), this.consumePath() }, eoFillStroke: function () { this.pendingEOFill = !0, this.fillStroke() }, closeFillStroke: function () { this.closePath(), this.fillStroke() }, closeEOFillStroke: function () { this.pendingEOFill = !0, this.closePath(), this.fillStroke() }, endPath: function () { this.consumePath() }, clip: function () { this.pendingClip = y }, eoClip: function () { this.pendingClip = b }, beginText: function () { this.current.textMatrix = n.IDENTITY_MATRIX, this.current.textMatrixScale = 1, this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0 }, endText: function () { var e = this.pendingTextPaths, t = this.ctx; if (void 0 !== e) { t.save(), t.beginPath(); for (var r = 0; r < e.length; r++) { var n = e[r]; t.setTransform.apply(t, n.transform), t.translate(n.x, n.y), n.addToPath(t, n.fontSize) } t.restore(), t.clip(), t.beginPath(), delete this.pendingTextPaths } else t.beginPath() }, setCharSpacing: function (e) { this.current.charSpacing = e }, setWordSpacing: function (e) { this.current.wordSpacing = e }, setHScale: function (e) { this.current.textHScale = e / 100 }, setLeading: function (e) { this.current.leading = -e }, setFont: function (e, t) { var r = this.commonObjs.get(e), i = this.current; if (!r) throw new Error("Can't find font for " + e); if (i.fontMatrix = r.fontMatrix ? r.fontMatrix : n.FONT_IDENTITY_MATRIX, 0 !== i.fontMatrix[0] && 0 !== i.fontMatrix[3] || (0, n.warn)("Invalid font matrix for font " + e), t < 0 ? (t = -t, i.fontDirection = -1) : i.fontDirection = 1, this.current.font = r, this.current.fontSize = t, !r.isType3Font) { var a = r.loadedName || "sans-serif", o = r.black ? "900" : r.bold ? "bold" : "normal", s = r.italic ? "italic" : "normal", u = '"' + a + '", ' + r.fallbackName, l = t < 16 ? 16 : t > 100 ? 100 : t; this.current.fontSizeScale = t / l; var c = s + " " + o + " " + l + "px " + u; this.ctx.font = c } }, setTextRenderingMode: function (e) { this.current.textRenderingMode = e }, setTextRise: function (e) { this.current.textRise = e }, moveText: function (e, t) { this.current.x = this.current.lineX += e, this.current.y = this.current.lineY += t }, setLeadingMoveText: function (e, t) { this.setLeading(-t), this.moveText(e, t) }, setTextMatrix: function (e, t, r, n, i, a) { this.current.textMatrix = [e, t, r, n, i, a], this.current.textMatrixScale = Math.sqrt(e * e + t * t), this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0 }, nextLine: function () { this.moveText(0, this.current.leading) }, paintChar: function (e, t, r, i) { var a, o = this.ctx, s = this.current, u = s.font, l = s.textRenderingMode, c = s.fontSize / s.fontSizeScale, h = l & n.TextRenderingMode.FILL_STROKE_MASK, d = !!(l & n.TextRenderingMode.ADD_TO_PATH_FLAG), f = s.patternFill && u.data; ((u.disableFontFace || d || f) && (a = u.getPathGenerator(this.commonObjs, e)), u.disableFontFace || f ? (o.save(), o.translate(t, r), o.beginPath(), a(o, c), i && o.setTransform.apply(o, i), h !== n.TextRenderingMode.FILL && h !== n.TextRenderingMode.FILL_STROKE || o.fill(), h !== n.TextRenderingMode.STROKE && h !== n.TextRenderingMode.FILL_STROKE || o.stroke(), o.restore()) : (h !== n.TextRenderingMode.FILL && h !== n.TextRenderingMode.FILL_STROKE || o.fillText(e, t, r), h !== n.TextRenderingMode.STROKE && h !== n.TextRenderingMode.FILL_STROKE || o.strokeText(e, t, r)), d) && (this.pendingTextPaths || (this.pendingTextPaths = [])).push({ transform: o.mozCurrentTransform, x: t, y: r, fontSize: c, addToPath: a }) }, get isFontSubpixelAAEnabled() { var e = this.canvasFactory.create(10, 10).context; e.scale(1.5, 1), e.fillText("I", 0, 10); for (var t = e.getImageData(0, 0, 10, 10).data, r = !1, i = 3; i < t.length; i += 4)if (t[i] > 0 && t[i] < 255) { r = !0; break } return (0, n.shadow)(this, "isFontSubpixelAAEnabled", r) }, showText: function (e) { var t = this.current, r = t.font; if (r.isType3Font) return this.showType3Text(e); var i = t.fontSize; if (0 !== i) { var a = this.ctx, o = t.fontSizeScale, s = t.charSpacing, u = t.wordSpacing, l = t.fontDirection, c = t.textHScale * l, h = e.length, d = r.vertical, f = d ? 1 : -1, p = r.defaultVMetrics, v = i * t.fontMatrix[0], m = t.textRenderingMode === n.TextRenderingMode.FILL && !r.disableFontFace && !t.patternFill; a.save(); var g = void 0; if (t.patternFill) { a.save(); var y = t.fillColor.getPattern(a, this); g = a.mozCurrentTransform, a.restore(), a.fillStyle = y } a.transform.apply(a, t.textMatrix), a.translate(t.x, t.y + t.textRise), l > 0 ? a.scale(c, -1) : a.scale(c, 1); var b = t.lineWidth, _ = t.textMatrixScale; if (0 === _ || 0 === b) { var A = t.textRenderingMode & n.TextRenderingMode.FILL_STROKE_MASK; A !== n.TextRenderingMode.STROKE && A !== n.TextRenderingMode.FILL_STROKE || (this._cachedGetSinglePixelWidth = null, b = .65 * this.getSinglePixelWidth()) } else b /= _; 1 !== o && (a.scale(o, o), b /= o), a.lineWidth = b; var S, w = 0; for (S = 0; S < h; ++S) { var k = e[S]; if ((0, n.isNum)(k)) w += f * k * i / 1e3; else { var P, x, C, R, E, T, O, I = !1, F = (k.isSpace ? u : 0) + s, L = k.fontChar, j = k.accent, M = k.width; if (d) E = k.vmetric || p, T = -(T = k.vmetric ? E[1] : .5 * M) * v, O = E[2] * v, M = E ? -E[0] : M, P = T / o, x = (w + O) / o; else P = w / o, x = 0; if (r.remeasure && M > 0) { var D = 1e3 * a.measureText(L).width / i * o; if (M < D && this.isFontSubpixelAAEnabled) { var N = M / D; I = !0, a.save(), a.scale(N, 1), P /= N } else M !== D && (P += (M - D) / 2e3 * i / o) } (k.isInFont || r.missingFile) && (m && !j ? a.fillText(L, P, x) : (this.paintChar(L, P, x, g), j && (C = P + j.offset.x / o, R = x - j.offset.y / o, this.paintChar(j.fontChar, C, R, g)))), w += M * v + F * l, I && a.restore() } } d ? t.y -= w * c : t.x += w * c, a.restore() } }, showType3Text: function (e) { var t, r, i, a, o = this.ctx, s = this.current, u = s.font, l = s.fontSize, c = s.fontDirection, h = u.vertical ? 1 : -1, d = s.charSpacing, f = s.wordSpacing, p = s.textHScale * c, v = s.fontMatrix || n.FONT_IDENTITY_MATRIX, m = e.length; if (!(s.textRenderingMode === n.TextRenderingMode.INVISIBLE) && 0 !== l) { for (this._cachedGetSinglePixelWidth = null, o.save(), o.transform.apply(o, s.textMatrix), o.translate(s.x, s.y), o.scale(p, c), t = 0; t < m; ++t)if (r = e[t], (0, n.isNum)(r)) a = h * r * l / 1e3, this.ctx.translate(a, 0), s.x += a * p; else { var g = (r.isSpace ? f : 0) + d, y = u.charProcOperatorList[r.operatorListId]; if (y) this.processingType3 = r, this.save(), o.scale(l, l), o.transform.apply(o, v), this.executeOperatorList(y), this.restore(), i = n.Util.applyTransform([r.width, 0], v)[0] * l + g, o.translate(i, 0), s.x += i * p; else (0, n.warn)('Type3 character "' + r.operatorListId + '" is not available.') } o.restore(), this.processingType3 = null } }, setCharWidth: function (e, t) { }, setCharWidthAndBounds: function (e, t, r, n, i, a) { this.ctx.rect(r, n, i - r, a - n), this.clip(), this.endPath() }, getColorN_Pattern: function (t) { var r, n = this; if ("TilingPattern" === t[0]) { var a = t[1], o = this.baseTransform || this.ctx.mozCurrentTransform.slice(), s = { createCanvasGraphics: function (t) { return new e(t, n.commonObjs, n.objs, n.canvasFactory, n.webGLContext) } }; r = new i.TilingPattern(t, a, this.ctx, s, o) } else r = (0, i.getShadingPatternFromIR)(t); return r }, setStrokeColorN: function () { this.current.strokeColor = this.getColorN_Pattern(arguments) }, setFillColorN: function () { this.current.fillColor = this.getColorN_Pattern(arguments), this.current.patternFill = !0 }, setStrokeRGBColor: function (e, t, r) { var i = n.Util.makeCssRgb(e, t, r); this.ctx.strokeStyle = i, this.current.strokeColor = i }, setFillRGBColor: function (e, t, r) { var i = n.Util.makeCssRgb(e, t, r); this.ctx.fillStyle = i, this.current.fillColor = i, this.current.patternFill = !1 }, shadingFill: function (e) { var t = this.ctx; this.save(); var r = (0, i.getShadingPatternFromIR)(e); t.fillStyle = r.getPattern(t, this, !0); var a = t.mozCurrentTransformInverse; if (a) { var o = t.canvas, s = o.width, u = o.height, l = n.Util.applyTransform([0, 0], a), c = n.Util.applyTransform([0, u], a), h = n.Util.applyTransform([s, 0], a), d = n.Util.applyTransform([s, u], a), f = Math.min(l[0], c[0], h[0], d[0]), p = Math.min(l[1], c[1], h[1], d[1]), v = Math.max(l[0], c[0], h[0], d[0]), m = Math.max(l[1], c[1], h[1], d[1]); this.ctx.fillRect(f, p, v - f, m - p) } else this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); this.restore() }, beginInlineImage: function () { (0, n.unreachable)("Should not call beginInlineImage") }, beginImageData: function () { (0, n.unreachable)("Should not call beginImageData") }, paintFormXObjectBegin: function (e, t) { if (this.save(), this.baseTransformStack.push(this.baseTransform), Array.isArray(e) && 6 === e.length && this.transform.apply(this, e), this.baseTransform = this.ctx.mozCurrentTransform, Array.isArray(t) && 4 === t.length) { var r = t[2] - t[0], n = t[3] - t[1]; this.ctx.rect(t[0], t[1], r, n), this.clip(), this.endPath() } }, paintFormXObjectEnd: function () { this.restore(), this.baseTransform = this.baseTransformStack.pop() }, beginGroup: function (e) { this.save(); var t = this.ctx; e.isolated || (0, n.info)("TODO: Support non-isolated groups."), e.knockout && (0, n.warn)("Knockout groups not supported."); var r = t.mozCurrentTransform; if (e.matrix && t.transform.apply(t, e.matrix), !e.bbox) throw new Error("Bounding box is required."); var i = n.Util.getAxialAlignedBoundingBox(e.bbox, t.mozCurrentTransform), a = [0, 0, t.canvas.width, t.canvas.height]; i = n.Util.intersect(i, a) || [0, 0, 0, 0]; var o = Math.floor(i[0]), s = Math.floor(i[1]), u = Math.max(Math.ceil(i[2]) - o, 1), l = Math.max(Math.ceil(i[3]) - s, 1), h = 1, d = 1; u > 4096 && (h = u / 4096, u = 4096), l > 4096 && (d = l / 4096, l = 4096); var f = "groupAt" + this.groupLevel; e.smask && (f += "_smask_" + this.smaskCounter++ % 2); var p = this.cachedCanvases.getCanvas(f, u, l, !0), v = p.context; v.scale(1 / h, 1 / d), v.translate(-o, -s), v.transform.apply(v, r), e.smask ? this.smaskStack.push({ canvas: p.canvas, context: v, offsetX: o, offsetY: s, scaleX: h, scaleY: d, subtype: e.smask.subtype, backdrop: e.smask.backdrop, transferMap: e.smask.transferMap || null, startTransformInverse: null }) : (t.setTransform(1, 0, 0, 1, 0, 0), t.translate(o, s), t.scale(h, d)), c(t, v), this.ctx = v, this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]), this.groupStack.push(t), this.groupLevel++, this.current.activeSMask = null }, endGroup: function (e) { this.groupLevel--; var t = this.ctx; this.ctx = this.groupStack.pop(), void 0 !== this.ctx.imageSmoothingEnabled ? this.ctx.imageSmoothingEnabled = !1 : this.ctx.mozImageSmoothingEnabled = !1, e.smask ? this.tempSMask = this.smaskStack.pop() : this.ctx.drawImage(t.canvas, 0, 0), this.restore() }, beginAnnotations: function () { this.save(), this.baseTransform && this.ctx.setTransform.apply(this.ctx, this.baseTransform) }, endAnnotations: function () { this.restore() }, beginAnnotation: function (e, t, r) { if (this.save(), h(this.ctx), this.current = new l, Array.isArray(e) && 4 === e.length) { var n = e[2] - e[0], i = e[3] - e[1]; this.ctx.rect(e[0], e[1], n, i), this.clip(), this.endPath() } this.transform.apply(this, t), this.transform.apply(this, r) }, endAnnotation: function () { this.restore() }, paintJpegXObject: function (e, t, r) { var i = this.objs.get(e); if (i) { this.save(); var a = this.ctx; if (a.scale(1 / t, -1 / r), a.drawImage(i, 0, 0, i.width, i.height, 0, -r, t, r), this.imageLayer) { var o = a.mozCurrentTransformInverse, s = this.getCanvasPosition(0, 0); this.imageLayer.appendImage({ objId: e, left: s[0], top: s[1], width: t / o[0], height: r / o[3] }) } this.restore() } else (0, n.warn)("Dependent image isn't ready yet") }, paintImageMaskXObject: function (e) { var t = this.ctx, n = e.width, i = e.height, a = this.current.fillColor, o = this.current.patternFill, s = this.processingType3; if (s && void 0 === s.compiled && (s.compiled = n <= 1e3 && i <= 1e3 ? function (e) { var t, r, n, i, a = e.width, o = e.height, s = a + 1, u = new Uint8Array(s * (o + 1)), l = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]), c = a + 7 & -8, h = e.data, d = new Uint8Array(c * o), f = 0; for (t = 0, i = h.length; t < i; t++)for (var p = 128, v = h[t]; p > 0;)d[f++] = v & p ? 0 : 255, p >>= 1; var m = 0; for (0 !== d[f = 0] && (u[0] = 1, ++m), r = 1; r < a; r++)d[f] !== d[f + 1] && (u[r] = d[f] ? 2 : 1, ++m), f++; for (0 !== d[f] && (u[r] = 2, ++m), t = 1; t < o; t++) { n = t * s, d[(f = t * c) - c] !== d[f] && (u[n] = d[f] ? 1 : 8, ++m); var g = (d[f] ? 4 : 0) + (d[f - c] ? 8 : 0); for (r = 1; r < a; r++)l[g = (g >> 2) + (d[f + 1] ? 4 : 0) + (d[f - c + 1] ? 8 : 0)] && (u[n + r] = l[g], ++m), f++; if (d[f - c] !== d[f] && (u[n + r] = d[f] ? 2 : 4, ++m), m > 1e3) return null } for (n = t * s, 0 !== d[f = c * (o - 1)] && (u[n] = 8, ++m), r = 1; r < a; r++)d[f] !== d[f + 1] && (u[n + r] = d[f] ? 4 : 8, ++m), f++; if (0 !== d[f] && (u[n + r] = 4, ++m), m > 1e3) return null; var y = new Int32Array([0, s, -1, 0, -s, 0, 0, 0, 1]), b = []; for (t = 0; m && t <= o; t++) { for (var _ = t * s, A = _ + a; _ < A && !u[_];)_++; if (_ !== A) { var S, w = [_ % s, t], k = u[_], P = _; do { var x = y[k]; do { _ += x } while (!u[_]); 5 !== (S = u[_]) && 10 !== S ? (k = S, u[_] = 0) : (k = S & 51 * k >> 4, u[_] &= k >> 2 | k << 2), w.push(_ % s), w.push(_ / s | 0), --m } while (P !== _); b.push(w), --t } } return function (e) { e.save(), e.scale(1 / a, -1 / o), e.translate(0, -o), e.beginPath(); for (var t = 0, r = b.length; t < r; t++) { var n = b[t]; e.moveTo(n[0], n[1]); for (var i = 2, s = n.length; i < s; i += 2)e.lineTo(n[i], n[i + 1]) } e.fill(), e.beginPath(), e.restore() } }({ data: e.data, width: n, height: i }) : null), s && s.compiled) s.compiled(t); else { var u = this.cachedCanvases.getCanvas("maskCanvas", n, i), l = u.context; l.save(), r(l, e), l.globalCompositeOperation = "source-in", l.fillStyle = o ? a.getPattern(l, this) : a, l.fillRect(0, 0, n, i), l.restore(), this.paintInlineImageXObject(u.canvas) } }, paintImageMaskXObjectRepeat: function (e, t, n, i) { var a = e.width, o = e.height, s = this.current.fillColor, u = this.current.patternFill, l = this.cachedCanvases.getCanvas("maskCanvas", a, o), c = l.context; c.save(), r(c, e), c.globalCompositeOperation = "source-in", c.fillStyle = u ? s.getPattern(c, this) : s, c.fillRect(0, 0, a, o), c.restore(); for (var h = this.ctx, d = 0, f = i.length; d < f; d += 2)h.save(), h.transform(t, 0, 0, n, i[d], i[d + 1]), h.scale(1, -1), h.drawImage(l.canvas, 0, 0, a, o, 0, -1, 1, 1), h.restore() }, paintImageMaskXObjectGroup: function (e) { for (var t = this.ctx, n = this.current.fillColor, i = this.current.patternFill, a = 0, o = e.length; a < o; a++) { var s = e[a], u = s.width, l = s.height, c = this.cachedCanvases.getCanvas("maskCanvas", u, l), h = c.context; h.save(), r(h, s), h.globalCompositeOperation = "source-in", h.fillStyle = i ? n.getPattern(h, this) : n, h.fillRect(0, 0, u, l), h.restore(), t.save(), t.transform.apply(t, s.transform), t.scale(1, -1), t.drawImage(c.canvas, 0, 0, u, l, 0, -1, 1, 1), t.restore() } }, paintImageXObject: function (e) { var t = this.objs.get(e); t ? this.paintInlineImageXObject(t) : (0, n.warn)("Dependent image isn't ready yet") }, paintImageXObjectRepeat: function (e, t, r, i) { var a = this.objs.get(e); if (a) { for (var o = a.width, s = a.height, u = [], l = 0, c = i.length; l < c; l += 2)u.push({ transform: [t, 0, 0, r, i[l], i[l + 1]], x: 0, y: 0, w: o, h: s }); this.paintInlineImageXObjectGroup(a, u) } else (0, n.warn)("Dependent image isn't ready yet") }, paintInlineImageXObject: function (e) { var r = e.width, n = e.height, i = this.ctx; this.save(), i.scale(1 / r, -1 / n); var a, o, s = i.mozCurrentTransformInverse, u = s[0], l = s[1], c = Math.max(Math.sqrt(u * u + l * l), 1), h = s[2], d = s[3], f = Math.max(Math.sqrt(h * h + d * d), 1); if ("function" == typeof HTMLElement && e instanceof HTMLElement || !e.data) a = e; else { var p = (o = this.cachedCanvases.getCanvas("inlineImage", r, n)).context; t(p, e), a = o.canvas } for (var v = r, m = n, g = "prescale1"; c > 2 && v > 1 || f > 2 && m > 1;) { var y = v, b = m; c > 2 && v > 1 && (c /= v / (y = Math.ceil(v / 2))), f > 2 && m > 1 && (f /= m / (b = Math.ceil(m / 2))), (p = (o = this.cachedCanvases.getCanvas(g, y, b)).context).clearRect(0, 0, y, b), p.drawImage(a, 0, 0, v, m, 0, 0, y, b), a = o.canvas, v = y, m = b, g = "prescale1" === g ? "prescale2" : "prescale1" } if (i.drawImage(a, 0, 0, v, m, 0, -n, r, n), this.imageLayer) { var _ = this.getCanvasPosition(0, -n); this.imageLayer.appendImage({ imgData: e, left: _[0], top: _[1], width: r / s[0], height: n / s[3] }) } this.restore() }, paintInlineImageXObjectGroup: function (e, r) { var n = this.ctx, i = e.width, a = e.height, o = this.cachedCanvases.getCanvas("inlineImage", i, a); t(o.context, e); for (var s = 0, u = r.length; s < u; s++) { var l = r[s]; if (n.save(), n.transform.apply(n, l.transform), n.scale(1, -1), n.drawImage(o.canvas, l.x, l.y, l.w, l.h, 0, -1, 1, 1), this.imageLayer) { var c = this.getCanvasPosition(l.x, l.y); this.imageLayer.appendImage({ imgData: e, left: c[0], top: c[1], width: i, height: a }) } n.restore() } }, paintSolidColorImageMask: function () { this.ctx.fillRect(0, 0, 1, 1) }, paintXObject: function () { (0, n.warn)("Unsupported 'paintXObject' command.") }, markPoint: function (e) { }, markPointProps: function (e, t) { }, beginMarkedContent: function (e) { }, beginMarkedContentProps: function (e, t) { }, endMarkedContent: function () { }, beginCompat: function () { }, endCompat: function () { }, consumePath: function () { var e = this.ctx; this.pendingClip && (this.pendingClip === b ? e.clip("evenodd") : e.clip(), this.pendingClip = null), e.beginPath() }, getSinglePixelWidth: function (e) { if (null === this._cachedGetSinglePixelWidth) { var t = this.ctx.mozCurrentTransformInverse; this._cachedGetSinglePixelWidth = Math.sqrt(Math.max(t[0] * t[0] + t[1] * t[1], t[2] * t[2] + t[3] * t[3])) } return this._cachedGetSinglePixelWidth }, getCanvasPosition: function (e, t) { var r = this.ctx.mozCurrentTransform; return [r[0] * e + r[2] * t + r[4], r[1] * e + r[3] * t + r[5]] } }, n.OPS) e.prototype[n.OPS[_]] = e.prototype[_]; return e }(); t.CanvasGraphics = c }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.TilingPattern = t.getShadingPatternFromIR = void 0; var n = r(1), i = { RadialAxial: { fromIR: function (e) { var t = e[1], r = e[2], n = e[3], i = e[4], a = e[5], o = e[6]; return { type: "Pattern", getPattern: function (e) { var s; "axial" === t ? s = e.createLinearGradient(n[0], n[1], i[0], i[1]) : "radial" === t && (s = e.createRadialGradient(n[0], n[1], a, i[0], i[1], o)); for (var u = 0, l = r.length; u < l; ++u) { var c = r[u]; s.addColorStop(c[0], c[1]) } return s } } } } }, a = function () { function e(e, t, r, n, i, a, o, s) { var u, l = t.coords, c = t.colors, h = e.data, d = 4 * e.width; l[r + 1] > l[n + 1] && (u = r, r = n, n = u, u = a, a = o, o = u), l[n + 1] > l[i + 1] && (u = n, n = i, i = u, u = o, o = s, s = u), l[r + 1] > l[n + 1] && (u = r, r = n, n = u, u = a, a = o, o = u); var f = (l[r] + t.offsetX) * t.scaleX, p = (l[r + 1] + t.offsetY) * t.scaleY, v = (l[n] + t.offsetX) * t.scaleX, m = (l[n + 1] + t.offsetY) * t.scaleY, g = (l[i] + t.offsetX) * t.scaleX, y = (l[i + 1] + t.offsetY) * t.scaleY; if (!(p >= y)) for (var b, _, A, S, w, k, P, x, C, R = c[a], E = c[a + 1], T = c[a + 2], O = c[o], I = c[o + 1], F = c[o + 2], L = c[s], j = c[s + 1], M = c[s + 2], D = Math.round(p), N = Math.round(y), q = D; q <= N; q++) { q < m ? (b = f - (f - v) * (C = q < p ? 0 : p === m ? 1 : (p - q) / (p - m)), _ = R - (R - O) * C, A = E - (E - I) * C, S = T - (T - F) * C) : (b = v - (v - g) * (C = q > y ? 1 : m === y ? 0 : (m - q) / (m - y)), _ = O - (O - L) * C, A = I - (I - j) * C, S = F - (F - M) * C), w = f - (f - g) * (C = q < p ? 0 : q > y ? 1 : (p - q) / (p - y)), k = R - (R - L) * C, P = E - (E - j) * C, x = T - (T - M) * C; for (var W = Math.round(Math.min(b, w)), U = Math.round(Math.max(b, w)), B = d * q + 4 * W, z = W; z <= U; z++)C = (C = (b - z) / (b - w)) < 0 ? 0 : C > 1 ? 1 : C, h[B++] = _ - (_ - k) * C | 0, h[B++] = A - (A - P) * C | 0, h[B++] = S - (S - x) * C | 0, h[B++] = 255 } } function t(t, r, n) { var i, a, o = r.coords, s = r.colors; switch (r.type) { case "lattice": var u = r.verticesPerRow, l = Math.floor(o.length / u) - 1, c = u - 1; for (i = 0; i < l; i++)for (var h = i * u, d = 0; d < c; d++, h++)e(t, n, o[h], o[h + 1], o[h + u], s[h], s[h + 1], s[h + u]), e(t, n, o[h + u + 1], o[h + 1], o[h + u], s[h + u + 1], s[h + 1], s[h + u]); break; case "triangles": for (i = 0, a = o.length; i < a; i += 3)e(t, n, o[i], o[i + 1], o[i + 2], s[i], s[i + 1], s[i + 2]); break; default: throw new Error("illegal figure") } } return function (e, r, n, i, a, o, s, u) { var l, c, h, d, f = Math.floor(e[0]), p = Math.floor(e[1]), v = Math.ceil(e[2]) - f, m = Math.ceil(e[3]) - p, g = Math.min(Math.ceil(Math.abs(v * r[0] * 1.1)), 3e3), y = Math.min(Math.ceil(Math.abs(m * r[1] * 1.1)), 3e3), b = v / g, _ = m / y, A = { coords: n, colors: i, offsetX: -f, offsetY: -p, scaleX: 1 / b, scaleY: 1 / _ }, S = g + 4, w = y + 4; if (u.isEnabled) l = u.drawFigures({ width: g, height: y, backgroundColor: o, figures: a, context: A }), (c = s.getCanvas("mesh", S, w, !1)).context.drawImage(l, 2, 2), l = c.canvas; else { var k = (c = s.getCanvas("mesh", S, w, !1)).context, P = k.createImageData(g, y); if (o) { var x = P.data; for (h = 0, d = x.length; h < d; h += 4)x[h] = o[0], x[h + 1] = o[1], x[h + 2] = o[2], x[h + 3] = 255 } for (h = 0; h < a.length; h++)t(P, a[h], A); k.putImageData(P, 2, 2), l = c.canvas } return { canvas: l, offsetX: f - 2 * b, offsetY: p - 2 * _, scaleX: b, scaleY: _ } } }(); i.Mesh = { fromIR: function (e) { var t = e[2], r = e[3], i = e[4], o = e[5], s = e[6], u = e[8]; return { type: "Pattern", getPattern: function (e, l, c) { var h; if (c) h = n.Util.singularValueDecompose2dScale(e.mozCurrentTransform); else if (h = n.Util.singularValueDecompose2dScale(l.baseTransform), s) { var d = n.Util.singularValueDecompose2dScale(s); h = [h[0] * d[0], h[1] * d[1]] } var f = a(o, h, t, r, i, c ? null : u, l.cachedCanvases, l.webGLContext); return c || (e.setTransform.apply(e, l.baseTransform), s && e.transform.apply(e, s)), e.translate(f.offsetX, f.offsetY), e.scale(f.scaleX, f.scaleY), e.createPattern(f.canvas, "no-repeat") } } } }, i.Dummy = { fromIR: function () { return { type: "Pattern", getPattern: function () { return "hotpink" } } } }; var o = function () { var e = 1, t = 2; function r(e, t, r, n, i) { this.operatorList = e[2], this.matrix = e[3] || [1, 0, 0, 1, 0, 0], this.bbox = e[4], this.xstep = e[5], this.ystep = e[6], this.paintType = e[7], this.tilingType = e[8], this.color = t, this.canvasGraphicsFactory = n, this.baseTransform = i, this.type = "Pattern", this.ctx = r } return r.prototype = { createPatternCanvas: function (e) { var t = this.operatorList, r = this.bbox, i = this.xstep, a = this.ystep, o = this.paintType, s = this.tilingType, u = this.color, l = this.canvasGraphicsFactory; (0, n.info)("TilingType: " + s); var c = r[0], h = r[1], d = r[2], f = r[3], p = [c, h], v = [c + i, h + a], m = v[0] - p[0], g = v[1] - p[1], y = n.Util.singularValueDecompose2dScale(this.matrix), b = n.Util.singularValueDecompose2dScale(this.baseTransform), _ = [y[0] * b[0], y[1] * b[1]]; m = Math.min(Math.ceil(Math.abs(m * _[0])), 3e3), g = Math.min(Math.ceil(Math.abs(g * _[1])), 3e3); var A = e.cachedCanvases.getCanvas("pattern", m, g, !0), S = A.context, w = l.createCanvasGraphics(S); w.groupLevel = e.groupLevel, this.setFillAndStrokeStyleToContext(w, o, u), this.setScale(m, g, i, a), this.transformToScale(w); var k = [1, 0, 0, 1, -p[0], -p[1]]; return w.transform.apply(w, k), this.clipBbox(w, r, c, h, d, f), w.executeOperatorList(t), A.canvas }, setScale: function (e, t, r, n) { this.scale = [e / r, t / n] }, transformToScale: function (e) { var t = this.scale, r = [t[0], 0, 0, t[1], 0, 0]; e.transform.apply(e, r) }, scaleToContext: function () { var e = this.scale; this.ctx.scale(1 / e[0], 1 / e[1]) }, clipBbox: function (e, t, r, n, i, a) { if (Array.isArray(t) && 4 === t.length) { var o = i - r, s = a - n; e.ctx.rect(r, n, o, s), e.clip(), e.endPath() } }, setFillAndStrokeStyleToContext: function (r, i, a) { var o = r.ctx, s = r.current; switch (i) { case e: var u = this.ctx; o.fillStyle = u.fillStyle, o.strokeStyle = u.strokeStyle, s.fillColor = u.fillStyle, s.strokeColor = u.strokeStyle; break; case t: var l = n.Util.makeCssRgb(a[0], a[1], a[2]); o.fillStyle = l, o.strokeStyle = l, s.fillColor = l, s.strokeColor = l; break; default: throw new n.FormatError("Unsupported paint type: " + i) } }, getPattern: function (e, t) { var r = this.createPatternCanvas(t); return (e = this.ctx).setTransform.apply(e, this.baseTransform), e.transform.apply(e, this.matrix), this.scaleToContext(), e.createPattern(r, "repeat") } }, r }(); t.getShadingPatternFromIR = function (e) { var t = i[e[0]]; if (!t) throw new Error("Unknown IR type: " + e[0]); return t.fromIR(e) }, t.TilingPattern = o }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var n = Object.create(null); n.workerPort = void 0 === n.workerPort ? null : n.workerPort, n.workerSrc = void 0 === n.workerSrc ? "" : n.workerSrc, t.GlobalWorkerOptions = n }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.MessageHandler = void 0; var n, i, a, o = r(137), s = (n = o) && n.__esModule ? n : { default: n }, u = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }, l = (i = s.default.mark(function e(t, r) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null; return s.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: if (t) { e.next = 2; break } return e.abrupt("return"); case 2: return e.abrupt("return", t.apply(n, r)); case 3: case "end": return e.stop() } }, e, this) }), a = function () { var e = i.apply(this, arguments); return new Promise(function (t, r) { return function n(i, a) { try { var o = e[i](a), s = o.value } catch (e) { return void r(e) } if (!o.done) return Promise.resolve(s).then(function (e) { n("next", e) }, function (e) { n("throw", e) }); t(s) }("next") }) }, function (e, t) { return a.apply(this, arguments) }), c = r(1); function h(e) { if ("object" !== (void 0 === e ? "undefined" : u(e))) return e; switch (e.name) { case "AbortException": return new c.AbortException(e.message); case "MissingPDFException": return new c.MissingPDFException(e.message); case "UnexpectedResponseException": return new c.UnexpectedResponseException(e.message, e.status); default: return new c.UnknownErrorException(e.message, e.details) } } function d(e, t, r) { t ? e.resolve() : e.reject(r) } function f(e, t, r) { var n = this; this.sourceName = e, this.targetName = t, this.comObj = r, this.callbackId = 1, this.streamId = 1, this.postMessageTransfers = !0, this.streamSinks = Object.create(null), this.streamControllers = Object.create(null); var i = this.callbacksCapabilities = Object.create(null), a = this.actionHandler = Object.create(null); this._onComObjOnMessage = function (e) { var t = e.data; if (t.targetName === n.sourceName) if (t.stream) n._processStreamMessage(t); else if (t.isReply) { var o = t.callbackId; if (!(t.callbackId in i)) throw new Error("Cannot resolve callback " + o); var s = i[o]; delete i[o], "error" in t ? s.reject(h(t.error)) : s.resolve(t.data) } else { if (!(t.action in a)) throw new Error("Unknown action from worker: " + t.action); var u = a[t.action]; if (t.callbackId) { var l = n.sourceName, d = t.sourceName; Promise.resolve().then(function () { return u[0].call(u[1], t.data) }).then(function (e) { r.postMessage({ sourceName: l, targetName: d, isReply: !0, callbackId: t.callbackId, data: e }) }, function (e) { r.postMessage({ sourceName: l, targetName: d, isReply: !0, callbackId: t.callbackId, error: function (e) { return !(e instanceof Error) || e instanceof c.AbortException || e instanceof c.MissingPDFException || e instanceof c.UnexpectedResponseException || e instanceof c.UnknownErrorException ? e : new c.UnknownErrorException(e.message, e.toString()) }(e) }) }) } else t.streamId ? n._createStreamSink(t) : u[0].call(u[1], t.data) } }, r.addEventListener("message", this._onComObjOnMessage) } f.prototype = { on: function (e, t, r) { var n = this.actionHandler; if (n[e]) throw new Error('There is already an actionName called "' + e + '"'); n[e] = [t, r] }, send: function (e, t, r) { var n = { sourceName: this.sourceName, targetName: this.targetName, action: e, data: t }; this.postMessage(n, r) }, sendWithPromise: function (e, t, r) { var n = this.callbackId++, i = { sourceName: this.sourceName, targetName: this.targetName, action: e, data: t, callbackId: n }, a = (0, c.createPromiseCapability)(); this.callbacksCapabilities[n] = a; try { this.postMessage(i, r) } catch (e) { a.reject(e) } return a.promise }, sendWithStream: function (e, t, r, n) { var i = this, a = this.streamId++, o = this.sourceName, s = this.targetName; return new c.ReadableStream({ start: function (r) { var n = (0, c.createPromiseCapability)(); return i.streamControllers[a] = { controller: r, startCall: n, isClosed: !1 }, i.postMessage({ sourceName: o, targetName: s, action: e, streamId: a, data: t, desiredSize: r.desiredSize }), n.promise }, pull: function (e) { var t = (0, c.createPromiseCapability)(); return i.streamControllers[a].pullCall = t, i.postMessage({ sourceName: o, targetName: s, stream: "pull", streamId: a, desiredSize: e.desiredSize }), t.promise }, cancel: function (e) { var t = (0, c.createPromiseCapability)(); return i.streamControllers[a].cancelCall = t, i.streamControllers[a].isClosed = !0, i.postMessage({ sourceName: o, targetName: s, stream: "cancel", reason: e, streamId: a }), t.promise } }, r) }, _createStreamSink: function (e) { var t = this, r = this, n = this.actionHandler[e.action], i = e.streamId, a = e.desiredSize, o = this.sourceName, s = e.sourceName, u = function (e) { var r = e.stream, n = e.chunk, a = e.transfers, u = e.success, l = e.reason; t.postMessage({ sourceName: o, targetName: s, stream: r, streamId: i, chunk: n, success: u, reason: l }, a) }, h = { enqueue: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1, r = arguments[2]; if (!this.isCancelled) { var n = this.desiredSize; this.desiredSize -= t, n > 0 && this.desiredSize <= 0 && (this.sinkCapability = (0, c.createPromiseCapability)(), this.ready = this.sinkCapability.promise), u({ stream: "enqueue", chunk: e, transfers: r }) } }, close: function () { this.isCancelled || (this.isCancelled = !0, u({ stream: "close" }), delete r.streamSinks[i]) }, error: function (e) { this.isCancelled || (this.isCancelled = !0, u({ stream: "error", reason: e })) }, sinkCapability: (0, c.createPromiseCapability)(), onPull: null, onCancel: null, isCancelled: !1, desiredSize: a, ready: null }; h.sinkCapability.resolve(), h.ready = h.sinkCapability.promise, this.streamSinks[i] = h, l(n[0], [e.data, h], n[1]).then(function () { u({ stream: "start_complete", success: !0 }) }, function (e) { u({ stream: "start_complete", success: !1, reason: e }) }) }, _processStreamMessage: function (e) { var t = this, r = this.sourceName, n = e.sourceName, i = e.streamId, a = function (e) { var a = e.stream, o = e.success, s = e.reason; t.comObj.postMessage({ sourceName: r, targetName: n, stream: a, success: o, streamId: i, reason: s }) }, o = function () { Promise.all([t.streamControllers[e.streamId].startCall, t.streamControllers[e.streamId].pullCall, t.streamControllers[e.streamId].cancelCall].map(function (e) { return e && (t = e.promise, Promise.resolve(t).catch(function () { })); var t })).then(function () { delete t.streamControllers[e.streamId] }) }; switch (e.stream) { case "start_complete": d(this.streamControllers[e.streamId].startCall, e.success, h(e.reason)); break; case "pull_complete": d(this.streamControllers[e.streamId].pullCall, e.success, h(e.reason)); break; case "pull": if (!this.streamSinks[e.streamId]) { a({ stream: "pull_complete", success: !0 }); break } this.streamSinks[e.streamId].desiredSize <= 0 && e.desiredSize > 0 && this.streamSinks[e.streamId].sinkCapability.resolve(), this.streamSinks[e.streamId].desiredSize = e.desiredSize, l(this.streamSinks[e.streamId].onPull).then(function () { a({ stream: "pull_complete", success: !0 }) }, function (e) { a({ stream: "pull_complete", success: !1, reason: e }) }); break; case "enqueue": (0, c.assert)(this.streamControllers[e.streamId], "enqueue should have stream controller"), this.streamControllers[e.streamId].isClosed || this.streamControllers[e.streamId].controller.enqueue(e.chunk); break; case "close": if ((0, c.assert)(this.streamControllers[e.streamId], "close should have stream controller"), this.streamControllers[e.streamId].isClosed) break; this.streamControllers[e.streamId].isClosed = !0, this.streamControllers[e.streamId].controller.close(), o(); break; case "error": (0, c.assert)(this.streamControllers[e.streamId], "error should have stream controller"), this.streamControllers[e.streamId].controller.error(h(e.reason)), o(); break; case "cancel_complete": d(this.streamControllers[e.streamId].cancelCall, e.success, h(e.reason)), o(); break; case "cancel": if (!this.streamSinks[e.streamId]) break; l(this.streamSinks[e.streamId].onCancel, [h(e.reason)]).then(function () { a({ stream: "cancel_complete", success: !0 }) }, function (e) { a({ stream: "cancel_complete", success: !1, reason: e }) }), this.streamSinks[e.streamId].sinkCapability.reject(h(e.reason)), this.streamSinks[e.streamId].isCancelled = !0, delete this.streamSinks[e.streamId]; break; default: throw new Error("Unexpected stream case") } }, postMessage: function (e, t) { t && this.postMessageTransfers ? this.comObj.postMessage(e, t) : this.comObj.postMessage(e) }, destroy: function () { this.comObj.removeEventListener("message", this._onComObjOnMessage) } }, t.MessageHandler = f }, function (e, t, r) { "use strict"; e.exports = r(138) }, function (e, t, r) { "use strict"; var n = function () { return this }() || Function("return this")(), i = n.regeneratorRuntime && Object.getOwnPropertyNames(n).indexOf("regeneratorRuntime") >= 0, a = i && n.regeneratorRuntime; if (n.regeneratorRuntime = void 0, e.exports = r(139), i) n.regeneratorRuntime = a; else try { delete n.regeneratorRuntime } catch (e) { n.regeneratorRuntime = void 0 } }, function (e, t, r) { "use strict"; (function (e) { var t = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e }; !function (r) { var n, i = Object.prototype, a = i.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, s = o.iterator || "@@iterator", u = o.asyncIterator || "@@asyncIterator", l = o.toStringTag || "@@toStringTag", c = "object" === t(e), h = r.regeneratorRuntime; if (h) c && (e.exports = h); else { (h = r.regeneratorRuntime = c ? e.exports : {}).wrap = A; var d = "suspendedStart", f = "suspendedYield", p = "executing", v = "completed", m = {}, g = {}; g[s] = function () { return this }; var y = Object.getPrototypeOf, b = y && y(y(I([]))); b && b !== i && a.call(b, s) && (g = b); var _ = P.prototype = w.prototype = Object.create(g); k.prototype = _.constructor = P, P.constructor = k, P[l] = k.displayName = "GeneratorFunction", h.isGeneratorFunction = function (e) { var t = "function" == typeof e && e.constructor; return !!t && (t === k || "GeneratorFunction" === (t.displayName || t.name)) }, h.mark = function (e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, P) : (e.__proto__ = P, l in e || (e[l] = "GeneratorFunction")), e.prototype = Object.create(_), e }, h.awrap = function (e) { return { __await: e } }, x(C.prototype), C.prototype[u] = function () { return this }, h.AsyncIterator = C, h.async = function (e, t, r, n) { var i = new C(A(e, t, r, n)); return h.isGeneratorFunction(t) ? i : i.next().then(function (e) { return e.done ? e.value : i.next() }) }, x(_), _[l] = "Generator", _[s] = function () { return this }, _.toString = function () { return "[object Generator]" }, h.keys = function (e) { var t = []; for (var r in e) t.push(r); return t.reverse(), function r() { for (; t.length;) { var n = t.pop(); if (n in e) return r.value = n, r.done = !1, r } return r.done = !0, r } }, h.values = I, O.prototype = { constructor: O, reset: function (e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = n, this.done = !1, this.delegate = null, this.method = "next", this.arg = n, this.tryEntries.forEach(T), !e) for (var t in this) "t" === t.charAt(0) && a.call(this, t) && !isNaN(+t.slice(1)) && (this[t] = n) }, stop: function () { this.done = !0; var e = this.tryEntries[0].completion; if ("throw" === e.type) throw e.arg; return this.rval }, dispatchException: function (e) { if (this.done) throw e; var t = this; function r(r, i) { return s.type = "throw", s.arg = e, t.next = r, i && (t.method = "next", t.arg = n), !!i } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var o = this.tryEntries[i], s = o.completion; if ("root" === o.tryLoc) return r("end"); if (o.tryLoc <= this.prev) { var u = a.call(o, "catchLoc"), l = a.call(o, "finallyLoc"); if (u && l) { if (this.prev < o.catchLoc) return r(o.catchLoc, !0); if (this.prev < o.finallyLoc) return r(o.finallyLoc) } else if (u) { if (this.prev < o.catchLoc) return r(o.catchLoc, !0) } else { if (!l) throw new Error("try statement without catch or finally"); if (this.prev < o.finallyLoc) return r(o.finallyLoc) } } } }, abrupt: function (e, t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var n = this.tryEntries[r]; if (n.tryLoc <= this.prev && a.call(n, "finallyLoc") && this.prev < n.finallyLoc) { var i = n; break } } i && ("break" === e || "continue" === e) && i.tryLoc <= t && t <= i.finallyLoc && (i = null); var o = i ? i.completion : {}; return o.type = e, o.arg = t, i ? (this.method = "next", this.next = i.finallyLoc, m) : this.complete(o) }, complete: function (e, t) { if ("throw" === e.type) throw e.arg; return "break" === e.type || "continue" === e.type ? this.next = e.arg : "return" === e.type ? (this.rval = this.arg = e.arg, this.method = "return", this.next = "end") : "normal" === e.type && t && (this.next = t), m }, finish: function (e) { for (var t = this.tryEntries.length - 1; t >= 0; --t) { var r = this.tryEntries[t]; if (r.finallyLoc === e) return this.complete(r.completion, r.afterLoc), T(r), m } }, catch: function (e) { for (var t = this.tryEntries.length - 1; t >= 0; --t) { var r = this.tryEntries[t]; if (r.tryLoc === e) { var n = r.completion; if ("throw" === n.type) { var i = n.arg; T(r) } return i } } throw new Error("illegal catch attempt") }, delegateYield: function (e, t, r) { return this.delegate = { iterator: I(e), resultName: t, nextLoc: r }, "next" === this.method && (this.arg = n), m } } } function A(e, t, r, n) { var i = t && t.prototype instanceof w ? t : w, a = Object.create(i.prototype), o = new O(n || []); return a._invoke = function (e, t, r) { var n = d; return function (i, a) { if (n === p) throw new Error("Generator is already running"); if (n === v) { if ("throw" === i) throw a; return F() } for (r.method = i, r.arg = a; ;) { var o = r.delegate; if (o) { var s = R(o, r); if (s) { if (s === m) continue; return s } } if ("next" === r.method) r.sent = r._sent = r.arg; else if ("throw" === r.method) { if (n === d) throw n = v, r.arg; r.dispatchException(r.arg) } else "return" === r.method && r.abrupt("return", r.arg); n = p; var u = S(e, t, r); if ("normal" === u.type) { if (n = r.done ? v : f, u.arg === m) continue; return { value: u.arg, done: r.done } } "throw" === u.type && (n = v, r.method = "throw", r.arg = u.arg) } } }(e, r, o), a } function S(e, t, r) { try { return { type: "normal", arg: e.call(t, r) } } catch (e) { return { type: "throw", arg: e } } } function w() { } function k() { } function P() { } function x(e) { ["next", "throw", "return"].forEach(function (t) { e[t] = function (e) { return this._invoke(t, e) } }) } function C(e) { var r; this._invoke = function (n, i) { function o() { return new Promise(function (r, o) { !function r(n, i, o, s) { var u = S(e[n], e, i); if ("throw" !== u.type) { var l = u.arg, c = l.value; return c && "object" === (void 0 === c ? "undefined" : t(c)) && a.call(c, "__await") ? Promise.resolve(c.__await).then(function (e) { r("next", e, o, s) }, function (e) { r("throw", e, o, s) }) : Promise.resolve(c).then(function (e) { l.value = e, o(l) }, s) } s(u.arg) }(n, i, r, o) }) } return r = r ? r.then(o, o) : o() } } function R(e, t) { var r = e.iterator[t.method]; if (r === n) { if (t.delegate = null, "throw" === t.method) { if (e.iterator.return && (t.method = "return", t.arg = n, R(e, t), "throw" === t.method)) return m; t.method = "throw", t.arg = new TypeError("The iterator does not provide a 'throw' method") } return m } var i = S(r, e.iterator, t.arg); if ("throw" === i.type) return t.method = "throw", t.arg = i.arg, t.delegate = null, m; var a = i.arg; return a ? a.done ? (t[e.resultName] = a.value, t.next = e.nextLoc, "return" !== t.method && (t.method = "next", t.arg = n), t.delegate = null, m) : a : (t.method = "throw", t.arg = new TypeError("iterator result is not an object"), t.delegate = null, m) } function E(e) { var t = { tryLoc: e[0] }; 1 in e && (t.catchLoc = e[1]), 2 in e && (t.finallyLoc = e[2], t.afterLoc = e[3]), this.tryEntries.push(t) } function T(e) { var t = e.completion || {}; t.type = "normal", delete t.arg, e.completion = t } function O(e) { this.tryEntries = [{ tryLoc: "root" }], e.forEach(E, this), this.reset(!0) } function I(e) { if (e) { var t = e[s]; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var r = -1, i = function t() { for (; ++r < e.length;)if (a.call(e, r)) return t.value = e[r], t.done = !1, t; return t.value = n, t.done = !0, t }; return i.next = i } } return { next: F } } function F() { return { value: n, done: !0 } } }(function () { return this }() || Function("return this")()) }).call(this, r(140)(e)) }, function (e, t, r) { "use strict"; e.exports = function (e) { return e.webpackPolyfill || (e.deprecate = function () { }, e.paths = [], e.children || (e.children = []), Object.defineProperty(e, "loaded", { enumerable: !0, get: function () { return e.l } }), Object.defineProperty(e, "id", { enumerable: !0, get: function () { return e.i } }), e.webpackPolyfill = 1), e } }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.Metadata = void 0; var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), i = r(1), a = r(142); var o = function () { function e(t) { !function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, e), (0, i.assert)("string" == typeof t, "Metadata: input is not a string"), t = this._repair(t); var r = (new a.SimpleXMLParser).parseFromString(t); this._metadata = Object.create(null), r && this._parse(r) } return n(e, [{ key: "_repair", value: function (e) { return e.replace(/>\\376\\377([^<]+)/g, function (e, t) { for (var r = t.replace(/\\([0-3])([0-7])([0-7])/g, function (e, t, r, n) { return String.fromCharCode(64 * t + 8 * r + 1 * n) }).replace(/&(amp|apos|gt|lt|quot);/g, function (e, t) { switch (t) { case "amp": return "&"; case "apos": return "'"; case "gt": return ">"; case "lt": return "<"; case "quot": return '"' }throw new Error("_repair: " + t + " isn't defined.") }), n = "", i = 0, a = r.length; i < a; i += 2) { var o = 256 * r.charCodeAt(i) + r.charCodeAt(i + 1); n += o >= 32 && o < 127 && 60 !== o && 62 !== o && 38 !== o ? String.fromCharCode(o) : "&#x" + (65536 + o).toString(16).substring(1) + ";" } return ">" + n }) } }, { key: "_parse", value: function (e) { var t = e.documentElement; if ("rdf:rdf" !== t.nodeName.toLowerCase()) for (t = t.firstChild; t && "rdf:rdf" !== t.nodeName.toLowerCase();)t = t.nextSibling; var r = t ? t.nodeName.toLowerCase() : null; if (t && "rdf:rdf" === r && t.hasChildNodes()) for (var n = t.childNodes, i = 0, a = n.length; i < a; i++) { var o = n[i]; if ("rdf:description" === o.nodeName.toLowerCase()) for (var s = 0, u = o.childNodes.length; s < u; s++)if ("#text" !== o.childNodes[s].nodeName.toLowerCase()) { var l = o.childNodes[s], c = l.nodeName.toLowerCase(); this._metadata[c] = l.textContent.trim() } } } }, { key: "get", value: function (e) { return this._metadata[e] || null } }, { key: "getAll", value: function () { return this._metadata } }, { key: "has", value: function (e) { return void 0 !== this._metadata[e] } }]), e }(); t.Metadata = o }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var n = function () { return function (e, t) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return function (e, t) { var r = [], n = !0, i = !1, a = void 0; try { for (var o, s = e[Symbol.iterator](); !(n = (o = s.next()).done) && (r.push(o.value), !t || r.length !== t); n = !0); } catch (e) { i = !0, a = e } finally { try { !n && s.return && s.return() } finally { if (i) throw a } } return r }(e, t); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), i = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(); function a(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var o = { NoError: 0, EndOfDocument: -1, UnterminatedCdat: -2, UnterminatedXmlDeclaration: -3, UnterminatedDoctypeDeclaration: -4, UnterminatedComment: -5, MalformedElement: -6, OutOfMemory: -7, UnterminatedAttributeValue: -8, UnterminatedElement: -9, ElementNeverBegun: -10 }; function s(e, t) { var r = e[t]; return " " === r || "\n" === r || "\r" === r || "\t" === r } var u = function () { function e() { a(this, e) } return i(e, [{ key: "_resolveEntities", value: function (e) { return e.replace(/&([^;]+);/g, function (e, t) { if ("#x" === t.substring(0, 2)) return String.fromCharCode(parseInt(t.substring(2), 16)); if ("#" === t.substring(0, 1)) return String.fromCharCode(parseInt(t.substring(1), 10)); switch (t) { case "lt": return "<"; case "gt": return ">"; case "amp": return "&"; case "quot": return '"' }return this.onResolveEntity(t) }) } }, { key: "_parseContent", value: function (e, t) { var r, n = t, i = []; function a() { for (; n < e.length && s(e, n);)++n } for (; n < e.length && !s(e, n) && ">" !== e[n] && "/" !== e[n];)++n; for (r = e.substring(t, n), a(); n < e.length && ">" !== e[n] && "/" !== e[n] && "?" !== e[n];) { a(); for (var o, u = ""; n < e.length && !s(e, n) && "=" !== e[n];)u += e[n], ++n; if (a(), "=" !== e[n]) return null; ++n, a(); var l = e[n]; if ('"' !== l && "'" !== l) return null; var c = e.indexOf(l, ++n); if (c < 0) return null; o = e.substring(n, c), i.push({ name: u, value: this._resolveEntities(o) }), n = c + 1, a() } return { name: r, attributes: i, parsed: n - t } } }, { key: "_parseProcessingInstruction", value: function (e, t) { var r, n = t; for (; n < e.length && !s(e, n) && ">" !== e[n] && "/" !== e[n];)++n; r = e.substring(t, n), function () { for (; n < e.length && s(e, n);)++n }(); for (var i = n; n < e.length && ("?" !== e[n] || ">" !== e[n + 1]);)++n; return { name: r, value: e.substring(i, n), parsed: n - t } } }, { key: "parseXml", value: function (e) { for (var t = 0; t < e.length;) { var r = t; if ("<" === e[t]) { var n = void 0; switch (e[++r]) { case "/": if (++r, (n = e.indexOf(">", r)) < 0) return void this.onError(o.UnterminatedElement); this.onEndElement(e.substring(r, n)), r = n + 1; break; case "?": ++r; var i = this._parseProcessingInstruction(e, r); if ("?>" !== e.substring(r + i.parsed, r + i.parsed + 2)) return void this.onError(o.UnterminatedXmlDeclaration); this.onPi(i.name, i.value), r += i.parsed + 2; break; case "!": if ("--" === e.substring(r + 1, r + 3)) { if ((n = e.indexOf("--\x3e", r + 3)) < 0) return void this.onError(o.UnterminatedComment); this.onComment(e.substring(r + 3, n)), r = n + 3 } else if ("[CDATA[" === e.substring(r + 1, r + 8)) { if ((n = e.indexOf("]]>", r + 8)) < 0) return void this.onError(o.UnterminatedCdat); this.onCdata(e.substring(r + 8, n)), r = n + 3 } else { if ("DOCTYPE" !== e.substring(r + 1, r + 8)) return void this.onError(o.MalformedElement); var a = e.indexOf("[", r + 8), s = !1; if ((n = e.indexOf(">", r + 8)) < 0) return void this.onError(o.UnterminatedDoctypeDeclaration); if (a > 0 && n > a) { if ((n = e.indexOf("]>", r + 8)) < 0) return void this.onError(o.UnterminatedDoctypeDeclaration); s = !0 } var u = e.substring(r + 8, n + (s ? 1 : 0)); this.onDoctype(u), r = n + (s ? 2 : 1) } break; default: var l = this._parseContent(e, r); if (null === l) return void this.onError(o.MalformedElement); var c = !1; if ("/>" === e.substring(r + l.parsed, r + l.parsed + 2)) c = !0; else if (">" !== e.substring(r + l.parsed, r + l.parsed + 1)) return void this.onError(o.UnterminatedElement); this.onBeginElement(l.name, l.attributes, c), r += l.parsed + (c ? 2 : 1) } } else { for (; r < e.length && "<" !== e[r];)r++; var h = e.substring(t, r); this.onText(this._resolveEntities(h)) } t = r } } }, { key: "onResolveEntity", value: function (e) { return "&" + e + ";" } }, { key: "onPi", value: function (e, t) { } }, { key: "onComment", value: function (e) { } }, { key: "onCdata", value: function (e) { } }, { key: "onDoctype", value: function (e) { } }, { key: "onText", value: function (e) { } }, { key: "onBeginElement", value: function (e, t, r) { } }, { key: "onEndElement", value: function (e) { } }, { key: "onError", value: function (e) { } }]), e }(), l = function () { function e(t, r) { a(this, e), this.nodeName = t, this.nodeValue = r, Object.defineProperty(this, "parentNode", { value: null, writable: !0 }) } return i(e, [{ key: "hasChildNodes", value: function () { return this.childNodes && this.childNodes.length > 0 } }, { key: "firstChild", get: function () { return this.childNodes[0] } }, { key: "nextSibling", get: function () { var e = this.parentNode.childNodes.indexOf(this); return this.parentNode.childNodes[e + 1] } }, { key: "textContent", get: function () { return this.childNodes ? this.childNodes.map(function (e) { return e.textContent }).join("") : this.nodeValue || "" } }]), e }(), c = function (e) { function t() { a(this, t); var e = function (e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t }(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this)); return e._currentFragment = null, e._stack = null, e._errorCode = o.NoError, e } return function (e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) }(t, u), i(t, [{ key: "parseFromString", value: function (e) { if (this._currentFragment = [], this._stack = [], this._errorCode = o.NoError, this.parseXml(e), this._errorCode === o.NoError) { var t = n(this._currentFragment, 1)[0]; if (t) return { documentElement: t } } } }, { key: "onResolveEntity", value: function (e) { switch (e) { case "apos": return "'" }return function e(t, r, n) { null === t && (t = Function.prototype); var i = Object.getOwnPropertyDescriptor(t, r); if (void 0 === i) { var a = Object.getPrototypeOf(t); return null === a ? void 0 : e(a, r, n) } if ("value" in i) return i.value; var o = i.get; return void 0 !== o ? o.call(n) : void 0 }(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "onResolveEntity", this).call(this, e) } }, { key: "onText", value: function (e) { if (!function (e) { for (var t = 0, r = e.length; t < r; t++)if (!s(e, t)) return !1; return !0 }(e)) { var t = new l("#text", e); this._currentFragment.push(t) } } }, { key: "onCdata", value: function (e) { var t = new l("#text", e); this._currentFragment.push(t) } }, { key: "onBeginElement", value: function (e, t, r) { var n = new l(e); n.childNodes = [], this._currentFragment.push(n), r || (this._stack.push(this._currentFragment), this._currentFragment = n.childNodes) } }, { key: "onEndElement", value: function (e) { this._currentFragment = this._stack.pop(); for (var t = this._currentFragment[this._currentFragment.length - 1], r = 0, n = t.childNodes.length; r < n; r++)t.childNodes[r].parentNode = t } }, { key: "onError", value: function (e) { this._errorCode = e } }]), t }(); t.SimpleXMLParser = c }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.PDFDataTransportStream = void 0; var n, i = r(137), a = (n = i) && n.__esModule ? n : { default: n }, o = r(1); function s(e) { return function () { var t = e.apply(this, arguments); return new Promise(function (e, r) { return function n(i, a) { try { var o = t[i](a), s = o.value } catch (e) { return void r(e) } if (!o.done) return Promise.resolve(s).then(function (e) { n("next", e) }, function (e) { n("throw", e) }); e(s) }("next") }) } } var u = function () { function e(e, t) { var r = this; (0, o.assert)(t), this._queuedChunks = []; var n = e.initialData; if (n && n.length > 0) { var i = new Uint8Array(n).buffer; this._queuedChunks.push(i) } this._pdfDataRangeTransport = t, this._isStreamingSupported = !e.disableStream, this._isRangeSupported = !e.disableRange, this._contentLength = e.length, this._fullRequestReader = null, this._rangeReaders = [], this._pdfDataRangeTransport.addRangeListener(function (e, t) { r._onReceiveData({ begin: e, chunk: t }) }), this._pdfDataRangeTransport.addProgressListener(function (e) { r._onProgress({ loaded: e }) }), this._pdfDataRangeTransport.addProgressiveReadListener(function (e) { r._onReceiveData({ chunk: e }) }), this._pdfDataRangeTransport.transportReady() } function t(e, t) { this._stream = e, this._done = !1, this._filename = null, this._queuedChunks = t || [], this._requests = [], this._headersReady = Promise.resolve(), e._fullRequestReader = this, this.onProgress = null } function r(e, t, r) { this._stream = e, this._begin = t, this._end = r, this._queuedChunk = null, this._requests = [], this._done = !1, this.onProgress = null } return e.prototype = { _onReceiveData: function (e) { var t = new Uint8Array(e.chunk).buffer; if (void 0 === e.begin) this._fullRequestReader ? this._fullRequestReader._enqueue(t) : this._queuedChunks.push(t); else { var r = this._rangeReaders.some(function (r) { return r._begin === e.begin && (r._enqueue(t), !0) }); (0, o.assert)(r) } }, _onProgress: function (e) { if (this._rangeReaders.length > 0) { var t = this._rangeReaders[0]; t.onProgress && t.onProgress({ loaded: e.loaded }) } }, _removeRangeReader: function (e) { var t = this._rangeReaders.indexOf(e); t >= 0 && this._rangeReaders.splice(t, 1) }, getFullReader: function () { (0, o.assert)(!this._fullRequestReader); var e = this._queuedChunks; return this._queuedChunks = null, new t(this, e) }, getRangeReader: function (e, t) { var n = new r(this, e, t); return this._pdfDataRangeTransport.requestDataRange(e, t), this._rangeReaders.push(n), n }, cancelAllRequests: function (e) { this._fullRequestReader && this._fullRequestReader.cancel(e), this._rangeReaders.slice(0).forEach(function (t) { t.cancel(e) }), this._pdfDataRangeTransport.abort() } }, t.prototype = { _enqueue: function (e) { this._done || (this._requests.length > 0 ? this._requests.shift().resolve({ value: e, done: !1 }) : this._queuedChunks.push(e)) }, 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 }, read: function () { var e = s(a.default.mark(function e() { var t, r; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: if (!(this._queuedChunks.length > 0)) { e.next = 3; break } return t = this._queuedChunks.shift(), e.abrupt("return", { value: t, done: !1 }); case 3: if (!this._done) { e.next = 5; break } return e.abrupt("return", { value: void 0, done: !0 }); case 5: return r = (0, o.createPromiseCapability)(), this._requests.push(r), e.abrupt("return", r.promise); case 8: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }(), cancel: function (e) { this._done = !0, this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = [] } }, r.prototype = { _enqueue: function (e) { if (!this._done) { if (0 === this._requests.length) this._queuedChunk = e; else this._requests.shift().resolve({ value: e, done: !1 }), this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = []; this._done = !0, this._stream._removeRangeReader(this) } }, get isStreamingSupported() { return !1 }, read: function () { var e = s(a.default.mark(function e() { var t, r; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: if (!this._queuedChunk) { e.next = 4; break } return t = this._queuedChunk, this._queuedChunk = null, e.abrupt("return", { value: t, done: !1 }); case 4: if (!this._done) { e.next = 6; break } return e.abrupt("return", { value: void 0, done: !0 }); case 6: return r = (0, o.createPromiseCapability)(), this._requests.push(r), e.abrupt("return", r.promise); case 9: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }(), cancel: function (e) { this._done = !0, this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = [], this._stream._removeRangeReader(this) } }, e }(); t.PDFDataTransportStream = u }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.WebGLContext = void 0; var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), i = r(1); var a = function () { function e(t) { var r = t.enable, n = void 0 !== r && r; !function (e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") }(this, e), this._enabled = !0 === n } return n(e, [{ key: "composeSMask", value: function (e) { var t = e.layer, r = e.mask, n = e.properties; return o.composeSMask(t, r, n) } }, { key: "drawFigures", value: function (e) { var t = e.width, r = e.height, n = e.backgroundColor, i = e.figures, a = e.context; return o.drawFigures(t, r, n, i, a) } }, { key: "clear", value: function () { o.cleanup() } }, { key: "isEnabled", get: function () { var e = this._enabled; return e && (e = o.tryInitGL()), (0, i.shadow)(this, "isEnabled", e) } }]), e }(), o = function () { function e(e, t, r) { var n = e.createShader(r); if (e.shaderSource(n, t), e.compileShader(n), !e.getShaderParameter(n, e.COMPILE_STATUS)) { var i = e.getShaderInfoLog(n); throw new Error("Error during shader compilation: " + i) } return n } function t(t, r) { return e(t, r, t.VERTEX_SHADER) } function r(t, r) { return e(t, r, t.FRAGMENT_SHADER) } function n(e, t) { for (var r = e.createProgram(), n = 0, i = t.length; n < i; ++n)e.attachShader(r, t[n]); if (e.linkProgram(r), !e.getProgramParameter(r, e.LINK_STATUS)) { var a = e.getProgramInfoLog(r); throw new Error("Error during program linking: " + a) } return r } function i(e, t, r) { e.activeTexture(r); var n = e.createTexture(); return e.bindTexture(e.TEXTURE_2D, n), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, t), n } var a, o; function s() { a || (o = document.createElement("canvas"), a = o.getContext("webgl", { premultipliedalpha: !1 })) } var u = " attribute vec2 a_position; attribute vec2 a_texCoord; uniform vec2 u_resolution; varying vec2 v_texCoord; void main() { vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); v_texCoord = a_texCoord; } ", l = " precision mediump float; uniform vec4 u_backdrop; uniform int u_subtype; uniform sampler2D u_image; uniform sampler2D u_mask; varying vec2 v_texCoord; void main() { vec4 imageColor = texture2D(u_image, v_texCoord); vec4 maskColor = texture2D(u_mask, v_texCoord); if (u_backdrop.a > 0.0) { maskColor.rgb = maskColor.rgb * maskColor.a + u_backdrop.rgb * (1.0 - maskColor.a); } float lum; if (u_subtype == 0) { lum = maskColor.a; } else { lum = maskColor.r * 0.3 + maskColor.g * 0.59 + maskColor.b * 0.11; } imageColor.a *= lum; imageColor.rgb *= imageColor.a; gl_FragColor = imageColor; } ", c = null; var h = " attribute vec2 a_position; attribute vec3 a_color; uniform vec2 u_resolution; uniform vec2 u_scale; uniform vec2 u_offset; varying vec4 v_color; void main() { vec2 position = (a_position + u_offset) * u_scale; vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); v_color = vec4(a_color / 255.0, 1.0); } ", d = " precision mediump float; varying vec4 v_color; void main() { gl_FragColor = v_color; } ", f = null; return { tryInitGL: function () { try { return s(), !!a } catch (e) { } return !1 }, composeSMask: function (e, h, d) { var f = e.width, p = e.height; c || function () { var e, i; s(), e = o, o = null, i = a, a = null; var h = n(i, [t(i, u), r(i, l)]); i.useProgram(h); var d = {}; d.gl = i, d.canvas = e, d.resolutionLocation = i.getUniformLocation(h, "u_resolution"), d.positionLocation = i.getAttribLocation(h, "a_position"), d.backdropLocation = i.getUniformLocation(h, "u_backdrop"), d.subtypeLocation = i.getUniformLocation(h, "u_subtype"); var f = i.getAttribLocation(h, "a_texCoord"), p = i.getUniformLocation(h, "u_image"), v = i.getUniformLocation(h, "u_mask"), m = i.createBuffer(); i.bindBuffer(i.ARRAY_BUFFER, m), i.bufferData(i.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1]), i.STATIC_DRAW), i.enableVertexAttribArray(f), i.vertexAttribPointer(f, 2, i.FLOAT, !1, 0, 0), i.uniform1i(p, 0), i.uniform1i(v, 1), c = d }(); var v = c, m = v.canvas, g = v.gl; m.width = f, m.height = p, g.viewport(0, 0, g.drawingBufferWidth, g.drawingBufferHeight), g.uniform2f(v.resolutionLocation, f, p), d.backdrop ? g.uniform4f(v.resolutionLocation, d.backdrop[0], d.backdrop[1], d.backdrop[2], 1) : g.uniform4f(v.resolutionLocation, 0, 0, 0, 0), g.uniform1i(v.subtypeLocation, "Luminosity" === d.subtype ? 1 : 0); var y = i(g, e, g.TEXTURE0), b = i(g, h, g.TEXTURE1), _ = g.createBuffer(); return g.bindBuffer(g.ARRAY_BUFFER, _), g.bufferData(g.ARRAY_BUFFER, new Float32Array([0, 0, f, 0, 0, p, 0, p, f, 0, f, p]), g.STATIC_DRAW), g.enableVertexAttribArray(v.positionLocation), g.vertexAttribPointer(v.positionLocation, 2, g.FLOAT, !1, 0, 0), g.clearColor(0, 0, 0, 0), g.enable(g.BLEND), g.blendFunc(g.ONE, g.ONE_MINUS_SRC_ALPHA), g.clear(g.COLOR_BUFFER_BIT), g.drawArrays(g.TRIANGLES, 0, 6), g.flush(), g.deleteTexture(y), g.deleteTexture(b), g.deleteBuffer(_), m }, drawFigures: function (e, i, u, l, c) { f || function () { var e, i; s(), e = o, o = null, i = a, a = null; var u = n(i, [t(i, h), r(i, d)]); i.useProgram(u); var l = {}; l.gl = i, l.canvas = e, l.resolutionLocation = i.getUniformLocation(u, "u_resolution"), l.scaleLocation = i.getUniformLocation(u, "u_scale"), l.offsetLocation = i.getUniformLocation(u, "u_offset"), l.positionLocation = i.getAttribLocation(u, "a_position"), l.colorLocation = i.getAttribLocation(u, "a_color"), f = l }(); var p = f, v = p.canvas, m = p.gl; v.width = e, v.height = i, m.viewport(0, 0, m.drawingBufferWidth, m.drawingBufferHeight), m.uniform2f(p.resolutionLocation, e, i); var g, y, b, _ = 0; for (g = 0, y = l.length; g < y; g++)switch (l[g].type) { case "lattice": _ += ((b = l[g].coords.length / l[g].verticesPerRow | 0) - 1) * (l[g].verticesPerRow - 1) * 6; break; case "triangles": _ += l[g].coords.length }var A = new Float32Array(2 * _), S = new Uint8Array(3 * _), w = c.coords, k = c.colors, P = 0, x = 0; for (g = 0, y = l.length; g < y; g++) { var C = l[g], R = C.coords, E = C.colors; switch (C.type) { case "lattice": var T = C.verticesPerRow; b = R.length / T | 0; for (var O = 1; O < b; O++)for (var I = O * T + 1, F = 1; F < T; F++, I++)A[P] = w[R[I - T - 1]], A[P + 1] = w[R[I - T - 1] + 1], A[P + 2] = w[R[I - T]], A[P + 3] = w[R[I - T] + 1], A[P + 4] = w[R[I - 1]], A[P + 5] = w[R[I - 1] + 1], S[x] = k[E[I - T - 1]], S[x + 1] = k[E[I - T - 1] + 1], S[x + 2] = k[E[I - T - 1] + 2], S[x + 3] = k[E[I - T]], S[x + 4] = k[E[I - T] + 1], S[x + 5] = k[E[I - T] + 2], S[x + 6] = k[E[I - 1]], S[x + 7] = k[E[I - 1] + 1], S[x + 8] = k[E[I - 1] + 2], A[P + 6] = A[P + 2], A[P + 7] = A[P + 3], A[P + 8] = A[P + 4], A[P + 9] = A[P + 5], A[P + 10] = w[R[I]], A[P + 11] = w[R[I] + 1], S[x + 9] = S[x + 3], S[x + 10] = S[x + 4], S[x + 11] = S[x + 5], S[x + 12] = S[x + 6], S[x + 13] = S[x + 7], S[x + 14] = S[x + 8], S[x + 15] = k[E[I]], S[x + 16] = k[E[I] + 1], S[x + 17] = k[E[I] + 2], P += 12, x += 18; break; case "triangles": for (var L = 0, j = R.length; L < j; L++)A[P] = w[R[L]], A[P + 1] = w[R[L] + 1], S[x] = k[E[L]], S[x + 1] = k[E[L] + 1], S[x + 2] = k[E[L] + 2], P += 2, x += 3 } } u ? m.clearColor(u[0] / 255, u[1] / 255, u[2] / 255, 1) : m.clearColor(0, 0, 0, 0), m.clear(m.COLOR_BUFFER_BIT); var M = m.createBuffer(); m.bindBuffer(m.ARRAY_BUFFER, M), m.bufferData(m.ARRAY_BUFFER, A, m.STATIC_DRAW), m.enableVertexAttribArray(p.positionLocation), m.vertexAttribPointer(p.positionLocation, 2, m.FLOAT, !1, 0, 0); var D = m.createBuffer(); return m.bindBuffer(m.ARRAY_BUFFER, D), m.bufferData(m.ARRAY_BUFFER, S, m.STATIC_DRAW), m.enableVertexAttribArray(p.colorLocation), m.vertexAttribPointer(p.colorLocation, 3, m.UNSIGNED_BYTE, !1, 0, 0), m.uniform2f(p.scaleLocation, c.scaleX, c.scaleY), m.uniform2f(p.offsetLocation, c.offsetX, c.offsetY), m.drawArrays(m.TRIANGLES, 0, _), m.flush(), m.deleteBuffer(M), m.deleteBuffer(D), v }, cleanup: function () { c && c.canvas && (c.canvas.width = 0, c.canvas.height = 0), f && f.canvas && (f.canvas.width = 0, f.canvas.height = 0), c = null, f = null } } }(); t.WebGLContext = a }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.renderTextLayer = void 0; var n, i = r(1), a = r(3), o = (n = a) && n.__esModule ? n : { default: n }; var s = function () { var e = 1e5, t = /\S/; var r = ["left: ", 0, "px; top: ", 0, "px; font-size: ", 0, "px; font-family: ", "", ";"]; function n(e, n, a) { var o, s = document.createElement("div"), u = { style: null, angle: 0, canvasWidth: 0, isWhitespace: !1, originalTransform: null, paddingBottom: 0, paddingLeft: 0, paddingRight: 0, paddingTop: 0, scale: 1 }; if (e._textDivs.push(s), o = n.str, !t.test(o)) return u.isWhitespace = !0, void e._textDivProperties.set(s, u); var l = i.Util.transform(e._viewport.transform, n.transform), c = Math.atan2(l[1], l[0]), h = a[n.fontName]; h.vertical && (c += Math.PI / 2); var d, f, p = Math.sqrt(l[2] * l[2] + l[3] * l[3]), v = p; if (h.ascent ? v = h.ascent * v : h.descent && (v = (1 + h.descent) * v), 0 === c ? (d = l[4], f = l[5] - v) : (d = l[4] + v * Math.sin(c), f = l[5] - v * Math.cos(c)), r[1] = d, r[3] = f, r[5] = p, r[7] = h.fontFamily, u.style = r.join(""), s.setAttribute("style", u.style), s.textContent = n.str, e._fontInspectorEnabled && (s.dataset.fontName = n.fontName), 0 !== c && (u.angle = c * (180 / Math.PI)), n.str.length > 1 && (h.vertical ? u.canvasWidth = n.height * e._viewport.scale : u.canvasWidth = n.width * e._viewport.scale), e._textDivProperties.set(s, u), e._textContentStream && e._layoutText(s), e._enhanceTextSelection) { var m = 1, g = 0; 0 !== c && (m = Math.cos(c), g = Math.sin(c)); var y, b, _ = (h.vertical ? n.height : n.width) * e._viewport.scale, A = p; 0 !== c ? (y = [m, g, -g, m, d, f], b = i.Util.getAxialAlignedBoundingBox([0, 0, _, A], y)) : b = [d, f, d + _, f + A], e._bounds.push({ left: b[0], top: b[1], right: b[2], bottom: b[3], div: s, size: [_, A], m: y }) } } function a(t) { if (!t._canceled) { var r = t._textDivs, n = t._capability, i = r.length; if (i > e) return t._renderingDone = !0, void n.resolve(); if (!t._textContentStream) for (var a = 0; a < i; a++)t._layoutText(r[a]); t._renderingDone = !0, n.resolve() } } function s(e) { for (var t = e._bounds, r = e._viewport, n = function (e, t, r) { var n = r.map(function (e, t) { return { x1: e.left, y1: e.top, x2: e.right, y2: e.bottom, index: t, x1New: void 0, x2New: void 0 } }); u(e, n); var i = new Array(r.length); return n.forEach(function (e) { var t = e.index; i[t] = { left: e.x1New, top: 0, right: e.x2New, bottom: 0 } }), r.map(function (t, r) { var a = i[r], o = n[r]; o.x1 = t.top, o.y1 = e - a.right, o.x2 = t.bottom, o.y2 = e - a.left, o.index = r, o.x1New = void 0, o.x2New = void 0 }), u(t, n), n.forEach(function (e) { var t = e.index; i[t].top = e.x1New, i[t].bottom = e.x2New }), i }(r.width, r.height, t), a = 0; a < n.length; a++) { var o = t[a].div, s = e._textDivProperties.get(o); if (0 !== s.angle) { var l = n[a], c = t[a], h = c.m, d = h[0], f = h[1], p = [[0, 0], [0, c.size[1]], [c.size[0], 0], c.size], v = new Float64Array(64); p.forEach(function (e, t) { var r = i.Util.applyTransform(e, h); v[t + 0] = d && (l.left - r[0]) / d, v[t + 4] = f && (l.top - r[1]) / f, v[t + 8] = d && (l.right - r[0]) / d, v[t + 12] = f && (l.bottom - r[1]) / f, v[t + 16] = f && (l.left - r[0]) / -f, v[t + 20] = d && (l.top - r[1]) / d, v[t + 24] = f && (l.right - r[0]) / -f, v[t + 28] = d && (l.bottom - r[1]) / d, v[t + 32] = d && (l.left - r[0]) / -d, v[t + 36] = f && (l.top - r[1]) / -f, v[t + 40] = d && (l.right - r[0]) / -d, v[t + 44] = f && (l.bottom - r[1]) / -f, v[t + 48] = f && (l.left - r[0]) / f, v[t + 52] = d && (l.top - r[1]) / -d, v[t + 56] = f && (l.right - r[0]) / f, v[t + 60] = d && (l.bottom - r[1]) / -d }); var m = function (e, t, r) { for (var n = 0, i = 0; i < r; i++) { var a = e[t++]; a > 0 && (n = n ? Math.min(a, n) : a) } return n }, g = 1 + Math.min(Math.abs(d), Math.abs(f)); s.paddingLeft = m(v, 32, 16) / g, s.paddingTop = m(v, 48, 16) / g, s.paddingRight = m(v, 0, 16) / g, s.paddingBottom = m(v, 16, 16) / g, e._textDivProperties.set(o, s) } else s.paddingLeft = t[a].left - n[a].left, s.paddingTop = t[a].top - n[a].top, s.paddingRight = n[a].right - t[a].right, s.paddingBottom = n[a].bottom - t[a].bottom, e._textDivProperties.set(o, s) } } function u(e, t) { t.sort(function (e, t) { return e.x1 - t.x1 || e.index - t.index }); var r = [{ start: -1 / 0, end: 1 / 0, boundary: { x1: -1 / 0, y1: -1 / 0, x2: 0, y2: 1 / 0, index: -1, x1New: 0, x2New: 0 } }]; t.forEach(function (e) { for (var t = 0; t < r.length && r[t].end <= e.y1;)t++; for (var n, i, a = r.length - 1; a >= 0 && r[a].start >= e.y2;)a--; var o, s, u = -1 / 0; for (o = t; o <= a; o++) { var l; (l = (i = (n = r[o]).boundary).x2 > e.x1 ? i.index > e.index ? i.x1New : e.x1 : void 0 === i.x2New ? (i.x2 + e.x1) / 2 : i.x2New) > u && (u = l) } for (e.x1New = u, o = t; o <= a; o++)void 0 === (i = (n = r[o]).boundary).x2New ? i.x2 > e.x1 ? i.index > e.index && (i.x2New = i.x2) : i.x2New = u : i.x2New > u && (i.x2New = Math.max(u, i.x2)); var c = [], h = null; for (o = t; o <= a; o++) { var d = (i = (n = r[o]).boundary).x2 > e.x2 ? i : e; h === d ? c[c.length - 1].end = n.end : (c.push({ start: n.start, end: n.end, boundary: d }), h = d) } for (r[t].start < e.y1 && (c[0].start = e.y1, c.unshift({ start: r[t].start, end: e.y1, boundary: r[t].boundary })), e.y2 < r[a].end && (c[c.length - 1].end = e.y2, c.push({ start: e.y2, end: r[a].end, boundary: r[a].boundary })), o = t; o <= a; o++)if (void 0 === (i = (n = r[o]).boundary).x2New) { var f = !1; for (s = t - 1; !f && s >= 0 && r[s].start >= i.y1; s--)f = r[s].boundary === i; for (s = a + 1; !f && s < r.length && r[s].end <= i.y2; s++)f = r[s].boundary === i; for (s = 0; !f && s < c.length; s++)f = c[s].boundary === i; f || (i.x2New = u) } Array.prototype.splice.apply(r, [t, a - t + 1].concat(c)) }), r.forEach(function (t) { var r = t.boundary; void 0 === r.x2New && (r.x2New = Math.max(e, r.x2)) }) } function l(e) { var t = e.textContent, r = e.textContentStream, n = e.container, a = e.viewport, s = e.textDivs, u = e.textContentItemsStr, l = e.enhanceTextSelection; this._textContent = t, this._textContentStream = r, this._container = n, this._viewport = a, this._textDivs = s || [], this._textContentItemsStr = u || [], this._enhanceTextSelection = !!l, this._fontInspectorEnabled = !(!o.default.FontInspector || !o.default.FontInspector.enabled), this._reader = null, this._layoutTextLastFontSize = null, this._layoutTextLastFontFamily = null, this._layoutTextCtx = null, this._textDivProperties = new WeakMap, this._renderingDone = !1, this._canceled = !1, this._capability = (0, i.createPromiseCapability)(), this._renderTimer = null, this._bounds = [] } return l.prototype = { get promise() { return this._capability.promise }, cancel: function () { this._reader && (this._reader.cancel(new i.AbortException("text layer task cancelled")), this._reader = null), this._canceled = !0, null !== this._renderTimer && (clearTimeout(this._renderTimer), this._renderTimer = null), this._capability.reject("canceled") }, _processItems: function (e, t) { for (var r = 0, i = e.length; r < i; r++)this._textContentItemsStr.push(e[r].str), n(this, e[r], t) }, _layoutText: function (e) { var t = this._container, r = this._textDivProperties.get(e); if (!r.isWhitespace) { var n = e.style.fontSize, i = e.style.fontFamily; n === this._layoutTextLastFontSize && i === this._layoutTextLastFontFamily || (this._layoutTextCtx.font = n + " " + i, this._layoutTextLastFontSize = n, this._layoutTextLastFontFamily = i); var a = this._layoutTextCtx.measureText(e.textContent).width, o = ""; 0 !== r.canvasWidth && a > 0 && (r.scale = r.canvasWidth / a, o = "scaleX(" + r.scale + ")"), 0 !== r.angle && (o = "rotate(" + r.angle + "deg) " + o), "" !== o && (r.originalTransform = o, e.style.transform = o), this._textDivProperties.set(e, r), t.appendChild(e) } }, _render: function (e) { var t = this, r = (0, i.createPromiseCapability)(), n = Object.create(null), o = document.createElement("canvas"); if (o.mozOpaque = !0, this._layoutTextCtx = o.getContext("2d", { alpha: !1 }), this._textContent) { var s = this._textContent.items, u = this._textContent.styles; this._processItems(s, u), r.resolve() } else { if (!this._textContentStream) throw new Error('Neither "textContent" nor "textContentStream" parameters specified.'); this._reader = this._textContentStream.getReader(), function e() { t._reader.read().then(function (i) { var a = i.value; i.done ? r.resolve() : (Object.assign(n, a.styles), t._processItems(a.items, n), e()) }, r.reject) }() } r.promise.then(function () { n = null, e ? t._renderTimer = setTimeout(function () { a(t), t._renderTimer = null }, e) : a(t) }, this._capability.reject) }, expandTextDivs: function (e) { if (this._enhanceTextSelection && this._renderingDone) { null !== this._bounds && (s(this), this._bounds = null); for (var t = 0, r = this._textDivs.length; t < r; t++) { var n = this._textDivs[t], i = this._textDivProperties.get(n); if (!i.isWhitespace) if (e) { var a = "", o = ""; 1 !== i.scale && (a = "scaleX(" + i.scale + ")"), 0 !== i.angle && (a = "rotate(" + i.angle + "deg) " + a), 0 !== i.paddingLeft && (o += " padding-left: " + i.paddingLeft / i.scale + "px;", a += " translateX(" + -i.paddingLeft / i.scale + "px)"), 0 !== i.paddingTop && (o += " padding-top: " + i.paddingTop + "px;", a += " translateY(" + -i.paddingTop + "px)"), 0 !== i.paddingRight && (o += " padding-right: " + i.paddingRight / i.scale + "px;"), 0 !== i.paddingBottom && (o += " padding-bottom: " + i.paddingBottom + "px;"), "" !== o && n.setAttribute("style", i.style + o), "" !== a && (n.style.transform = a) } else n.style.padding = 0, n.style.transform = i.originalTransform || "" } } } }, function (e) { var t = new l({ textContent: e.textContent, textContentStream: e.textContentStream, container: e.container, viewport: e.viewport, textDivs: e.textDivs, textContentItemsStr: e.textContentItemsStr, enhanceTextSelection: e.enhanceTextSelection }); return t._render(e.timeout), t } }(); t.renderTextLayer = s }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.AnnotationLayer = void 0; var n = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), i = r(130), a = r(1); function o(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function s(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function u(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var l = function () { function e() { u(this, e) } return n(e, null, [{ key: "create", value: function (e) { switch (e.data.annotationType) { case a.AnnotationType.LINK: return new h(e); case a.AnnotationType.TEXT: return new d(e); case a.AnnotationType.WIDGET: switch (e.data.fieldType) { case "Tx": return new p(e); case "Btn": return e.data.radioButton ? new m(e) : e.data.checkBox ? new v(e) : new g(e); case "Ch": return new y(e) }return new f(e); case a.AnnotationType.POPUP: return new b(e); case a.AnnotationType.LINE: return new A(e); case a.AnnotationType.SQUARE: return new S(e); case a.AnnotationType.CIRCLE: return new w(e); case a.AnnotationType.POLYLINE: return new k(e); case a.AnnotationType.INK: return new x(e); case a.AnnotationType.POLYGON: return new P(e); case a.AnnotationType.HIGHLIGHT: return new C(e); case a.AnnotationType.UNDERLINE: return new R(e); case a.AnnotationType.SQUIGGLY: return new E(e); case a.AnnotationType.STRIKEOUT: return new T(e); case a.AnnotationType.STAMP: return new O(e); case a.AnnotationType.FILEATTACHMENT: return new I(e); default: return new c(e) } } }]), e }(), c = function () { function e(t) { var r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; u(this, e), this.isRenderable = r, this.data = t.data, this.layer = t.layer, this.page = t.page, this.viewport = t.viewport, this.linkService = t.linkService, this.downloadManager = t.downloadManager, this.imageResourcesPath = t.imageResourcesPath, this.renderInteractiveForms = t.renderInteractiveForms, this.svgFactory = t.svgFactory, r && (this.container = this._createContainer(n)) } return n(e, [{ key: "_createContainer", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], t = this.data, r = this.page, n = this.viewport, i = document.createElement("section"), o = t.rect[2] - t.rect[0], s = t.rect[3] - t.rect[1]; i.setAttribute("data-annotation-id", t.id); var u = a.Util.normalizeRect([t.rect[0], r.view[3] - t.rect[1] + r.view[1], t.rect[2], r.view[3] - t.rect[3] + r.view[1]]); if (i.style.transform = "matrix(" + n.transform.join(",") + ")", i.style.transformOrigin = -u[0] + "px " + -u[1] + "px", !e && t.borderStyle.width > 0) { i.style.borderWidth = t.borderStyle.width + "px", t.borderStyle.style !== a.AnnotationBorderStyleType.UNDERLINE && (o -= 2 * t.borderStyle.width, s -= 2 * t.borderStyle.width); var l = t.borderStyle.horizontalCornerRadius, c = t.borderStyle.verticalCornerRadius; if (l > 0 || c > 0) { var h = l + "px / " + c + "px"; i.style.borderRadius = h } switch (t.borderStyle.style) { case a.AnnotationBorderStyleType.SOLID: i.style.borderStyle = "solid"; break; case a.AnnotationBorderStyleType.DASHED: i.style.borderStyle = "dashed"; break; case a.AnnotationBorderStyleType.BEVELED: (0, a.warn)("Unimplemented border style: beveled"); break; case a.AnnotationBorderStyleType.INSET: (0, a.warn)("Unimplemented border style: inset"); break; case a.AnnotationBorderStyleType.UNDERLINE: i.style.borderBottomStyle = "solid" }t.color ? i.style.borderColor = a.Util.makeCssRgb(0 | t.color[0], 0 | t.color[1], 0 | t.color[2]) : i.style.borderWidth = 0 } return i.style.left = u[0] + "px", i.style.top = u[1] + "px", i.style.width = o + "px", i.style.height = s + "px", i } }, { key: "_createPopup", value: function (e, t, r) { t || ((t = document.createElement("div")).style.height = e.style.height, t.style.width = e.style.width, e.appendChild(t)); var n = new _({ container: e, trigger: t, color: r.color, title: r.title, contents: r.contents, hideWrapper: !0 }).render(); n.style.left = e.style.width, e.appendChild(n) } }, { key: "render", value: function () { (0, a.unreachable)("Abstract method `AnnotationElement.render` called") } }]), e }(), h = function (e) { function t(e) { u(this, t); var r = !!(e.data.url || e.data.dest || e.data.action); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r)) } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "linkAnnotation"; var e = this.data, t = this.linkService, r = document.createElement("a"); return (0, i.addLinkAttributes)(r, { url: e.url, target: e.newWindow ? i.LinkTarget.BLANK : t.externalLinkTarget, rel: t.externalLinkRel }), e.url || (e.action ? this._bindNamedAction(r, e.action) : this._bindLink(r, e.dest)), this.container.appendChild(r), this.container } }, { key: "_bindLink", value: function (e, t) { var r = this; e.href = this.linkService.getDestinationHash(t), e.onclick = function () { return t && r.linkService.navigateTo(t), !1 }, t && (e.className = "internalLink") } }, { key: "_bindNamedAction", value: function (e, t) { var r = this; e.href = this.linkService.getAnchorUrl(""), e.onclick = function () { return r.linkService.executeNamedAction(t), !1 }, e.className = "internalLink" } }]), t }(), d = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r)) } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "textAnnotation"; var e = document.createElement("img"); return e.style.height = this.container.style.height, e.style.width = this.container.style.width, e.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg", e.alt = "[{{type}} Annotation]", e.dataset.l10nId = "text_annotation_type", e.dataset.l10nArgs = JSON.stringify({ type: this.data.name }), this.data.hasPopup || this._createPopup(this.container, e, this.data), this.container.appendChild(e), this.container } }]), t }(), f = function (e) { function t() { return u(this, t), o(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container } }]), t }(), p = function (e) { function t(e) { u(this, t); var r = e.renderInteractiveForms || !e.data.hasAppearance && !!e.data.fieldValue; return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r)) } return s(t, f), n(t, [{ key: "render", value: function () { this.container.className = "textWidgetAnnotation"; var e = null; if (this.renderInteractiveForms) { if (this.data.multiLine ? (e = document.createElement("textarea")).textContent = this.data.fieldValue : ((e = document.createElement("input")).type = "text", e.setAttribute("value", this.data.fieldValue)), e.disabled = this.data.readOnly, null !== this.data.maxLen && (e.maxLength = this.data.maxLen), this.data.comb) { var t = (this.data.rect[2] - this.data.rect[0]) / this.data.maxLen; e.classList.add("comb"), e.style.letterSpacing = "calc(" + t + "px - 1ch)" } } else { (e = document.createElement("div")).textContent = this.data.fieldValue, e.style.verticalAlign = "middle", e.style.display = "table-cell"; var r = null; this.data.fontRefName && (r = this.page.commonObjs.getData(this.data.fontRefName)), this._setTextStyle(e, r) } return null !== this.data.textAlignment && (e.style.textAlign = ["left", "center", "right"][this.data.textAlignment]), this.container.appendChild(e), this.container } }, { key: "_setTextStyle", value: function (e, t) { var r = e.style; if (r.fontSize = this.data.fontSize + "px", r.direction = this.data.fontDirection < 0 ? "rtl" : "ltr", t) { r.fontWeight = t.black ? t.bold ? "900" : "bold" : t.bold ? "bold" : "normal", r.fontStyle = t.italic ? "italic" : "normal"; var n = t.loadedName ? '"' + t.loadedName + '", ' : "", i = t.fallbackName || "Helvetica, sans-serif"; r.fontFamily = n + i } } }]), t }(), v = function (e) { function t(e) { return u(this, t), o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, e.renderInteractiveForms)) } return s(t, f), n(t, [{ key: "render", value: function () { this.container.className = "buttonWidgetAnnotation checkBox"; var e = document.createElement("input"); return e.disabled = this.data.readOnly, e.type = "checkbox", this.data.fieldValue && "Off" !== this.data.fieldValue && e.setAttribute("checked", !0), this.container.appendChild(e), this.container } }]), t }(), m = function (e) { function t(e) { return u(this, t), o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, e.renderInteractiveForms)) } return s(t, f), n(t, [{ key: "render", value: function () { this.container.className = "buttonWidgetAnnotation radioButton"; var e = document.createElement("input"); return e.disabled = this.data.readOnly, e.type = "radio", e.name = this.data.fieldName, this.data.fieldValue === this.data.buttonValue && e.setAttribute("checked", !0), this.container.appendChild(e), this.container } }]), t }(), g = function (e) { function t() { return u(this, t), o(this, (t.__proto__ || Object.getPrototypeOf(t)).apply(this, arguments)) } return s(t, h), n(t, [{ key: "render", value: function () { var e = function e(t, r, n) { null === t && (t = Function.prototype); var i = Object.getOwnPropertyDescriptor(t, r); if (void 0 === i) { var a = Object.getPrototypeOf(t); return null === a ? void 0 : e(a, r, n) } if ("value" in i) return i.value; var o = i.get; return void 0 !== o ? o.call(n) : void 0 }(t.prototype.__proto__ || Object.getPrototypeOf(t.prototype), "render", this).call(this); return e.className = "buttonWidgetAnnotation pushButton", e } }]), t }(), y = function (e) { function t(e) { return u(this, t), o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, e.renderInteractiveForms)) } return s(t, f), n(t, [{ key: "render", value: function () { this.container.className = "choiceWidgetAnnotation"; var e = document.createElement("select"); e.disabled = this.data.readOnly, this.data.combo || (e.size = this.data.options.length, this.data.multiSelect && (e.multiple = !0)); for (var t = 0, r = this.data.options.length; t < r; t++) { var n = this.data.options[t], i = document.createElement("option"); i.textContent = n.displayValue, i.value = n.exportValue, this.data.fieldValue.includes(n.displayValue) && i.setAttribute("selected", !0), e.appendChild(i) } return this.container.appendChild(e), this.container } }]), t }(), b = function (e) { function t(e) { u(this, t); var r = !(!e.data.title && !e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r)) } return s(t, c), n(t, [{ key: "render", value: function () { if (this.container.className = "popupAnnotation", ["Line", "Square", "Circle", "PolyLine", "Polygon", "Ink"].includes(this.data.parentType)) return this.container; var e = '[data-annotation-id="' + this.data.parentId + '"]', t = this.layer.querySelector(e); if (!t) return this.container; var r = new _({ container: this.container, trigger: t, color: this.data.color, title: this.data.title, contents: this.data.contents }), n = parseFloat(t.style.left), i = parseFloat(t.style.width); return this.container.style.transformOrigin = -(n + i) + "px -" + t.style.top, this.container.style.left = n + i + "px", this.container.appendChild(r.render()), this.container } }]), t }(), _ = function () { function e(t) { u(this, e), this.container = t.container, this.trigger = t.trigger, this.color = t.color, this.title = t.title, this.contents = t.contents, this.hideWrapper = t.hideWrapper || !1, this.pinned = !1 } return n(e, [{ key: "render", value: function () { var e = document.createElement("div"); e.className = "popupWrapper", this.hideElement = this.hideWrapper ? e : this.container, this.hideElement.setAttribute("hidden", !0); var t = document.createElement("div"); t.className = "popup"; var r = this.color; if (r) { var n = .7 * (255 - r[0]) + r[0], i = .7 * (255 - r[1]) + r[1], o = .7 * (255 - r[2]) + r[2]; t.style.backgroundColor = a.Util.makeCssRgb(0 | n, 0 | i, 0 | o) } var s = this._formatContents(this.contents), u = document.createElement("h1"); return u.textContent = this.title, this.trigger.addEventListener("click", this._toggle.bind(this)), this.trigger.addEventListener("mouseover", this._show.bind(this, !1)), this.trigger.addEventListener("mouseout", this._hide.bind(this, !1)), t.addEventListener("click", this._hide.bind(this, !0)), t.appendChild(u), t.appendChild(s), e.appendChild(t), e } }, { key: "_formatContents", value: function (e) { for (var t = document.createElement("p"), r = e.split(/(?:\r\n?|\n)/), n = 0, i = r.length; n < i; ++n) { var a = r[n]; t.appendChild(document.createTextNode(a)), n < i - 1 && t.appendChild(document.createElement("br")) } return t } }, { key: "_toggle", value: function () { this.pinned ? this._hide(!0) : this._show(!0) } }, { key: "_show", value: function () { arguments.length > 0 && void 0 !== arguments[0] && arguments[0] && (this.pinned = !0), this.hideElement.hasAttribute("hidden") && (this.hideElement.removeAttribute("hidden"), this.container.style.zIndex += 1) } }, { key: "_hide", value: function () { (!(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]) && (this.pinned = !1), this.hideElement.hasAttribute("hidden") || this.pinned || (this.hideElement.setAttribute("hidden", !0), this.container.style.zIndex -= 1) } }]), e }(), A = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "lineAnnotation"; var e = this.data, t = e.rect[2] - e.rect[0], r = e.rect[3] - e.rect[1], n = this.svgFactory.create(t, r), i = this.svgFactory.createElement("svg:line"); return i.setAttribute("x1", e.rect[2] - e.lineCoordinates[0]), i.setAttribute("y1", e.rect[3] - e.lineCoordinates[1]), i.setAttribute("x2", e.rect[2] - e.lineCoordinates[2]), i.setAttribute("y2", e.rect[3] - e.lineCoordinates[3]), i.setAttribute("stroke-width", e.borderStyle.width), i.setAttribute("stroke", "transparent"), n.appendChild(i), this.container.append(n), this._createPopup(this.container, i, e), this.container } }]), t }(), S = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "squareAnnotation"; var e = this.data, t = e.rect[2] - e.rect[0], r = e.rect[3] - e.rect[1], n = this.svgFactory.create(t, r), i = e.borderStyle.width, a = this.svgFactory.createElement("svg:rect"); return a.setAttribute("x", i / 2), a.setAttribute("y", i / 2), a.setAttribute("width", t - i), a.setAttribute("height", r - i), a.setAttribute("stroke-width", i), a.setAttribute("stroke", "transparent"), a.setAttribute("fill", "none"), n.appendChild(a), this.container.append(n), this._createPopup(this.container, a, e), this.container } }]), t }(), w = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "circleAnnotation"; var e = this.data, t = e.rect[2] - e.rect[0], r = e.rect[3] - e.rect[1], n = this.svgFactory.create(t, r), i = e.borderStyle.width, a = this.svgFactory.createElement("svg:ellipse"); return a.setAttribute("cx", t / 2), a.setAttribute("cy", r / 2), a.setAttribute("rx", t / 2 - i / 2), a.setAttribute("ry", r / 2 - i / 2), a.setAttribute("stroke-width", i), a.setAttribute("stroke", "transparent"), a.setAttribute("fill", "none"), n.appendChild(a), this.container.append(n), this._createPopup(this.container, a, e), this.container } }]), t }(), k = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents), n = o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)); return n.containerClassName = "polylineAnnotation", n.svgElementName = "svg:polyline", n } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = this.containerClassName; for (var e = this.data, t = e.rect[2] - e.rect[0], r = e.rect[3] - e.rect[1], n = this.svgFactory.create(t, r), i = e.vertices, a = [], o = 0, s = i.length; o < s; o++) { var u = i[o].x - e.rect[0], l = e.rect[3] - i[o].y; a.push(u + "," + l) } a = a.join(" "); var c = e.borderStyle.width, h = this.svgFactory.createElement(this.svgElementName); return h.setAttribute("points", a), h.setAttribute("stroke-width", c), h.setAttribute("stroke", "transparent"), h.setAttribute("fill", "none"), n.appendChild(h), this.container.append(n), this._createPopup(this.container, h, e), this.container } }]), t }(), P = function (e) { function t(e) { u(this, t); var r = o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); return r.containerClassName = "polygonAnnotation", r.svgElementName = "svg:polygon", r } return s(t, k), t }(), x = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents), n = o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)); return n.containerClassName = "inkAnnotation", n.svgElementName = "svg:polyline", n } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = this.containerClassName; for (var e = this.data, t = e.rect[2] - e.rect[0], r = e.rect[3] - e.rect[1], n = this.svgFactory.create(t, r), i = e.inkLists, a = 0, o = i.length; a < o; a++) { for (var s = i[a], u = [], l = 0, c = s.length; l < c; l++) { var h = s[l].x - e.rect[0], d = e.rect[3] - s[l].y; u.push(h + "," + d) } u = u.join(" "); var f = e.borderStyle.width, p = this.svgFactory.createElement(this.svgElementName); p.setAttribute("points", u), p.setAttribute("stroke-width", f), p.setAttribute("stroke", "transparent"), p.setAttribute("fill", "none"), this._createPopup(this.container, p, e), n.appendChild(p) } return this.container.append(n), this.container } }]), t }(), C = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container.className = "highlightAnnotation", this.data.hasPopup || this._createPopup(this.container, null, this.data), this.container } }]), t }(), R = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container.className = "underlineAnnotation", this.data.hasPopup || this._createPopup(this.container, null, this.data), this.container } }]), t }(), E = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container.className = "squigglyAnnotation", this.data.hasPopup || this._createPopup(this.container, null, this.data), this.container } }]), t }(), T = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container.className = "strikeoutAnnotation", this.data.hasPopup || this._createPopup(this.container, null, this.data), this.container } }]), t }(), O = function (e) { function t(e) { u(this, t); var r = !!(e.data.hasPopup || e.data.title || e.data.contents); return o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, r, !0)) } return s(t, c), n(t, [{ key: "render", value: function () { return this.container.className = "stampAnnotation", this.data.hasPopup || this._createPopup(this.container, null, this.data), this.container } }]), t }(), I = function (e) { function t(e) { u(this, t); var r = o(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e, !0)), n = r.data.file, s = n.filename, l = n.content; return r.filename = (0, i.getFilenameFromUrl)(s), r.content = l, r.linkService.eventBus && r.linkService.eventBus.dispatch("fileattachmentannotation", { source: r, id: (0, a.stringToPDFString)(s), filename: s, content: l }), r } return s(t, c), n(t, [{ key: "render", value: function () { this.container.className = "fileAttachmentAnnotation"; var e = document.createElement("div"); return e.style.height = this.container.style.height, e.style.width = this.container.style.width, e.addEventListener("dblclick", this._download.bind(this)), this.data.hasPopup || !this.data.title && !this.data.contents || this._createPopup(this.container, e, this.data), this.container.appendChild(e), this.container } }, { key: "_download", value: function () { this.downloadManager ? this.downloadManager.downloadData(this.content, this.filename, "") : (0, a.warn)("Download cannot be started due to unavailable download manager") } }]), t }(), F = function () { function e() { u(this, e) } return n(e, null, [{ key: "render", value: function (e) { for (var t = 0, r = e.annotations.length; t < r; t++) { var n = e.annotations[t]; if (n) { var a = l.create({ data: n, layer: e.div, page: e.page, viewport: e.viewport, linkService: e.linkService, downloadManager: e.downloadManager, imageResourcesPath: e.imageResourcesPath || "", renderInteractiveForms: e.renderInteractiveForms || !1, svgFactory: new i.DOMSVGFactory }); a.isRenderable && e.div.appendChild(a.render()) } } } }, { key: "update", value: function (e) { for (var t = 0, r = e.annotations.length; t < r; t++) { var n = e.annotations[t], i = e.div.querySelector('[data-annotation-id="' + n.id + '"]'); i && (i.style.transform = "matrix(" + e.viewport.transform.join(",") + ")") } e.div.removeAttribute("hidden") } }]), e }(); t.AnnotationLayer = F }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.SVGGraphics = void 0; var n, i = r(1), a = r(130), o = r(4), s = (n = o) && n.__esModule ? n : { default: n }; var u, l = { fontStyle: "normal", fontWeight: "normal", fillColor: "#000000" }, c = function () { for (var e = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]), t = 12, r = new Int32Array(256), n = 0; n < 256; n++) { for (var a = n, o = 0; o < 8; o++)a = 1 & a ? 3988292384 ^ a >> 1 & 2147483647 : a >> 1 & 2147483647; r[n] = a } function u(e, t, n, i) { var a = i, o = t.length; n[a] = o >> 24 & 255, n[a + 1] = o >> 16 & 255, n[a + 2] = o >> 8 & 255, n[a + 3] = 255 & o, n[a += 4] = 255 & e.charCodeAt(0), n[a + 1] = 255 & e.charCodeAt(1), n[a + 2] = 255 & e.charCodeAt(2), n[a + 3] = 255 & e.charCodeAt(3), a += 4, n.set(t, a); var s = function (e, t, n) { for (var i = -1, a = t; a < n; a++) { var o = 255 & (i ^ e[a]); i = i >>> 8 ^ r[o] } return -1 ^ i }(n, i + 4, a += t.length); n[a] = s >> 24 & 255, n[a + 1] = s >> 16 & 255, n[a + 2] = s >> 8 & 255, n[a + 3] = 255 & s } function l(e) { var t = e.length, r = Math.ceil(t / 65535), n = new Uint8Array(2 + t + 5 * r + 4), i = 0; n[i++] = 120, n[i++] = 156; for (var a = 0; t > 65535;)n[i++] = 0, n[i++] = 255, n[i++] = 255, n[i++] = 0, n[i++] = 0, n.set(e.subarray(a, a + 65535), i), i += 65535, a += 65535, t -= 65535; n[i++] = 1, n[i++] = 255 & t, n[i++] = t >> 8 & 255, n[i++] = 255 & ~t, n[i++] = (65535 & ~t) >> 8 & 255, n.set(e.subarray(a), i), i += e.length - a; var o = function (e, t, r) { for (var n = 1, i = 0, a = t; a < r; ++a)i = (i + (n = (n + (255 & e[a])) % 65521)) % 65521; return i << 16 | n }(e, 0, e.length); return n[i++] = o >> 24 & 255, n[i++] = o >> 16 & 255, n[i++] = o >> 8 & 255, n[i++] = 255 & o, n } function c(r, n, a, o) { var c, h, d, f = r.width, p = r.height, v = r.data; switch (n) { case i.ImageKind.GRAYSCALE_1BPP: h = 0, c = 1, d = f + 7 >> 3; break; case i.ImageKind.RGB_24BPP: h = 2, c = 8, d = 3 * f; break; case i.ImageKind.RGBA_32BPP: h = 6, c = 8, d = 4 * f; break; default: throw new Error("invalid format") }var m, g, y = new Uint8Array((1 + d) * p), b = 0, _ = 0; for (m = 0; m < p; ++m)y[b++] = 0, y.set(v.subarray(_, _ + d), b), _ += d, b += d; if (n === i.ImageKind.GRAYSCALE_1BPP && o) for (b = 0, m = 0; m < p; m++)for (b++, g = 0; g < d; g++)y[b++] ^= 255; var A = new Uint8Array([f >> 24 & 255, f >> 16 & 255, f >> 8 & 255, 255 & f, p >> 24 & 255, p >> 16 & 255, p >> 8 & 255, 255 & p, c, h, 0, 0, 0]), S = function (e) { if (!(0, s.default)()) return l(e); try { var t; t = parseInt(process.versions.node) >= 8 ? e : new Buffer(e); var r = require("zlib").deflateSync(t, { level: 9 }); return r instanceof Uint8Array ? r : new Uint8Array(r) } catch (e) { (0, i.warn)("Not compressing PNG because zlib.deflateSync is unavailable: " + e) } return l(e) }(y), w = e.length + 3 * t + A.length + S.length, k = new Uint8Array(w), P = 0; return k.set(e, P), u("IHDR", A, k, P += e.length), u("IDATA", S, k, P += t + A.length), P += t + S.length, u("IEND", new Uint8Array(0), k, P), (0, i.createObjectURL)(k, "image/png", a) } return function (e, t, r) { return c(e, void 0 === e.kind ? i.ImageKind.GRAYSCALE_1BPP : e.kind, t, r) } }(), h = function () { function e() { this.fontSizeScale = 1, this.fontWeight = l.fontWeight, this.fontSize = 0, this.textMatrix = i.IDENTITY_MATRIX, this.fontMatrix = i.FONT_IDENTITY_MATRIX, this.leading = 0, this.textRenderingMode = i.TextRenderingMode.FILL, 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 = l.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 = "" } return e.prototype = { clone: function () { return Object.create(this) }, setCurrentPoint: function (e, t) { this.x = e, this.y = t } }, e }(); t.SVGGraphics = u = function () { function e(e) { if (Number.isInteger(e)) return e.toString(); var t = e.toFixed(10), r = t.length - 1; if ("0" !== t[r]) return t; do { r-- } while ("0" === t[r]); return t.substring(0, "." === t[r] ? r : r + 1) } function t(t) { if (0 === t[4] && 0 === t[5]) { if (0 === t[1] && 0 === t[2]) return 1 === t[0] && 1 === t[3] ? "" : "scale(" + e(t[0]) + " " + e(t[3]) + ")"; if (t[0] === t[3] && t[1] === -t[2]) return "rotate(" + e(180 * Math.acos(t[0]) / Math.PI) + ")" } else if (1 === t[0] && 0 === t[1] && 0 === t[2] && 1 === t[3]) return "translate(" + e(t[4]) + " " + e(t[5]) + ")"; return "matrix(" + e(t[0]) + " " + e(t[1]) + " " + e(t[2]) + " " + e(t[3]) + " " + e(t[4]) + " " + e(t[5]) + ")" } function r(e, t, r) { this.svgFactory = new a.DOMSVGFactory, this.current = new h, this.transformMatrix = i.IDENTITY_MATRIX, this.transformStack = [], this.extraStack = [], this.commonObjs = e, this.objs = t, this.pendingClip = null, this.pendingEOFill = !1, this.embedFonts = !1, this.embeddedFonts = Object.create(null), this.cssStyle = null, this.forceDataSchema = !!r } var n = "http://www.w3.org/1999/xlink", o = ["butt", "round", "square"], s = ["miter", "round", "bevel"], u = 0, d = 0; return r.prototype = { save: function () { this.transformStack.push(this.transformMatrix); var e = this.current; this.extraStack.push(e), this.current = e.clone() }, restore: function () { this.transformMatrix = this.transformStack.pop(), this.current = this.extraStack.pop(), this.pendingClip = null, this.tgrp = null }, group: function (e) { this.save(), this.executeOpTree(e), this.restore() }, loadDependencies: function (e) { for (var t = this, r = e.fnArray, n = r.length, a = e.argsArray, o = 0; o < n; o++)if (i.OPS.dependency === r[o]) for (var s = a[o], u = 0, l = s.length; u < l; u++) { var c, h = s[u]; c = "g_" === h.substring(0, 2) ? new Promise(function (e) { t.commonObjs.get(h, e) }) : new Promise(function (e) { t.objs.get(h, e) }), this.current.dependencies.push(c) } return Promise.all(this.current.dependencies) }, transform: function (e, t, r, n, a, o) { var s = [e, t, r, n, a, o]; this.transformMatrix = i.Util.transform(this.transformMatrix, s), this.tgrp = null }, getSVG: function (e, t) { var r = this; this.viewport = t; var n = this._initialize(t); return this.loadDependencies(e).then(function () { r.transformMatrix = i.IDENTITY_MATRIX; var t = r.convertOpList(e); return r.executeOpTree(t), n }) }, convertOpList: function (e) { var t = e.argsArray, r = e.fnArray, n = r.length, a = [], o = []; for (var s in i.OPS) a[i.OPS[s]] = s; for (var u = 0; u < n; u++) { var l = r[u]; o.push({ fnId: l, fn: a[l], args: t[u] }) } return function (e) { for (var t = [], r = [], n = e.length, i = 0; i < n; i++)"save" !== e[i].fn ? "restore" === e[i].fn ? t = r.pop() : t.push(e[i]) : (t.push({ fnId: 92, fn: "group", items: [] }), r.push(t), t = t[t.length - 1].items); return t }(o) }, executeOpTree: function (e) { for (var t = e.length, r = 0; r < t; r++) { var n = e[r].fn, a = e[r].fnId, o = e[r].args; switch (0 | a) { case i.OPS.beginText: this.beginText(); break; case i.OPS.dependency: break; case i.OPS.setLeading: this.setLeading(o); break; case i.OPS.setLeadingMoveText: this.setLeadingMoveText(o[0], o[1]); break; case i.OPS.setFont: this.setFont(o); break; case i.OPS.showText: case i.OPS.showSpacedText: this.showText(o[0]); break; case i.OPS.endText: this.endText(); break; case i.OPS.moveText: this.moveText(o[0], o[1]); break; case i.OPS.setCharSpacing: this.setCharSpacing(o[0]); break; case i.OPS.setWordSpacing: this.setWordSpacing(o[0]); break; case i.OPS.setHScale: this.setHScale(o[0]); break; case i.OPS.setTextMatrix: this.setTextMatrix(o[0], o[1], o[2], o[3], o[4], o[5]); break; case i.OPS.setTextRise: this.setTextRise(o[0]); break; case i.OPS.setTextRenderingMode: this.setTextRenderingMode(o[0]); break; case i.OPS.setLineWidth: this.setLineWidth(o[0]); break; case i.OPS.setLineJoin: this.setLineJoin(o[0]); break; case i.OPS.setLineCap: this.setLineCap(o[0]); break; case i.OPS.setMiterLimit: this.setMiterLimit(o[0]); break; case i.OPS.setFillRGBColor: this.setFillRGBColor(o[0], o[1], o[2]); break; case i.OPS.setStrokeRGBColor: this.setStrokeRGBColor(o[0], o[1], o[2]); break; case i.OPS.setDash: this.setDash(o[0], o[1]); break; case i.OPS.setGState: this.setGState(o[0]); break; case i.OPS.fill: this.fill(); break; case i.OPS.eoFill: this.eoFill(); break; case i.OPS.stroke: this.stroke(); break; case i.OPS.fillStroke: this.fillStroke(); break; case i.OPS.eoFillStroke: this.eoFillStroke(); break; case i.OPS.clip: this.clip("nonzero"); break; case i.OPS.eoClip: this.clip("evenodd"); break; case i.OPS.paintSolidColorImageMask: this.paintSolidColorImageMask(); break; case i.OPS.paintJpegXObject: this.paintJpegXObject(o[0], o[1], o[2]); break; case i.OPS.paintImageXObject: this.paintImageXObject(o[0]); break; case i.OPS.paintInlineImageXObject: this.paintInlineImageXObject(o[0]); break; case i.OPS.paintImageMaskXObject: this.paintImageMaskXObject(o[0]); break; case i.OPS.paintFormXObjectBegin: this.paintFormXObjectBegin(o[0], o[1]); break; case i.OPS.paintFormXObjectEnd: this.paintFormXObjectEnd(); break; case i.OPS.closePath: this.closePath(); break; case i.OPS.closeStroke: this.closeStroke(); break; case i.OPS.closeFillStroke: this.closeFillStroke(); break; case i.OPS.closeEOFillStroke: this.closeEOFillStroke(); break; case i.OPS.nextLine: this.nextLine(); break; case i.OPS.transform: this.transform(o[0], o[1], o[2], o[3], o[4], o[5]); break; case i.OPS.constructPath: this.constructPath(o[0], o[1]); break; case i.OPS.endPath: this.endPath(); break; case 92: this.group(e[r].items); break; default: (0, i.warn)("Unimplemented operator " + n) } } }, setWordSpacing: function (e) { this.current.wordSpacing = e }, setCharSpacing: function (e) { this.current.charSpacing = e }, nextLine: function () { this.moveText(0, this.current.leading) }, setTextMatrix: function (t, r, n, i, a, o) { var s = this.current; this.current.textMatrix = this.current.lineMatrix = [t, r, n, i, a, o], this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0, s.xcoords = [], s.tspan = this.svgFactory.createElement("svg:tspan"), s.tspan.setAttributeNS(null, "font-family", s.fontFamily), s.tspan.setAttributeNS(null, "font-size", e(s.fontSize) + "px"), s.tspan.setAttributeNS(null, "y", e(-s.y)), s.txtElement = this.svgFactory.createElement("svg:text"), s.txtElement.appendChild(s.tspan) }, beginText: function () { this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0, this.current.textMatrix = i.IDENTITY_MATRIX, this.current.lineMatrix = i.IDENTITY_MATRIX, this.current.tspan = this.svgFactory.createElement("svg:tspan"), this.current.txtElement = this.svgFactory.createElement("svg:text"), this.current.txtgrp = this.svgFactory.createElement("svg:g"), this.current.xcoords = [] }, moveText: function (t, r) { var n = this.current; this.current.x = this.current.lineX += t, this.current.y = this.current.lineY += r, n.xcoords = [], n.tspan = this.svgFactory.createElement("svg:tspan"), n.tspan.setAttributeNS(null, "font-family", n.fontFamily), n.tspan.setAttributeNS(null, "font-size", e(n.fontSize) + "px"), n.tspan.setAttributeNS(null, "y", e(-n.y)) }, showText: function (r) { var n = this.current, a = n.font, o = n.fontSize; if (0 !== o) { var s, u = n.charSpacing, c = n.wordSpacing, h = n.fontDirection, d = n.textHScale * h, f = r.length, p = a.vertical, v = o * n.fontMatrix[0], m = 0; for (s = 0; s < f; ++s) { var g = r[s]; if (null !== g) if ((0, i.isNum)(g)) m += -g * o * .001; else { var y = g.width, b = g.fontChar, _ = y * v + ((g.isSpace ? c : 0) + u) * h; g.isInFont || a.missingFile ? (n.xcoords.push(n.x + m * d), n.tspan.textContent += b, m += _) : m += _ } else m += h * c } p ? n.y -= m * d : n.x += m * d, n.tspan.setAttributeNS(null, "x", n.xcoords.map(e).join(" ")), n.tspan.setAttributeNS(null, "y", e(-n.y)), n.tspan.setAttributeNS(null, "font-family", n.fontFamily), n.tspan.setAttributeNS(null, "font-size", e(n.fontSize) + "px"), n.fontStyle !== l.fontStyle && n.tspan.setAttributeNS(null, "font-style", n.fontStyle), n.fontWeight !== l.fontWeight && n.tspan.setAttributeNS(null, "font-weight", n.fontWeight); var A = n.textRenderingMode & i.TextRenderingMode.FILL_STROKE_MASK; A === i.TextRenderingMode.FILL || A === i.TextRenderingMode.FILL_STROKE ? (n.fillColor !== l.fillColor && n.tspan.setAttributeNS(null, "fill", n.fillColor), n.fillAlpha < 1 && n.tspan.setAttributeNS(null, "fill-opacity", n.fillAlpha)) : n.textRenderingMode === i.TextRenderingMode.ADD_TO_PATH ? n.tspan.setAttributeNS(null, "fill", "transparent") : n.tspan.setAttributeNS(null, "fill", "none"), A !== i.TextRenderingMode.STROKE && A !== i.TextRenderingMode.FILL_STROKE || this._setStrokeAttributes(n.tspan); var S = n.textMatrix; 0 !== n.textRise && ((S = S.slice())[5] += n.textRise), n.txtElement.setAttributeNS(null, "transform", t(S) + " scale(1, -1)"), n.txtElement.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"), n.txtElement.appendChild(n.tspan), n.txtgrp.appendChild(n.txtElement), this._ensureTransformGroup().appendChild(n.txtElement) } }, setLeadingMoveText: function (e, t) { this.setLeading(-t), this.moveText(e, t) }, addFontStyle: function (e) { this.cssStyle || (this.cssStyle = this.svgFactory.createElement("svg:style"), this.cssStyle.setAttributeNS(null, "type", "text/css"), this.defs.appendChild(this.cssStyle)); var t = (0, i.createObjectURL)(e.data, e.mimetype, this.forceDataSchema); this.cssStyle.textContent += '@font-face { font-family: "' + e.loadedName + '"; src: url(' + t + "); }\n" }, setFont: function (t) { var r = this.current, n = this.commonObjs.get(t[0]), a = t[1]; this.current.font = n, this.embedFonts && n.data && !this.embeddedFonts[n.loadedName] && (this.addFontStyle(n), this.embeddedFonts[n.loadedName] = n), r.fontMatrix = n.fontMatrix ? n.fontMatrix : i.FONT_IDENTITY_MATRIX; var o = n.black ? n.bold ? "bolder" : "bold" : n.bold ? "bold" : "normal", s = n.italic ? "italic" : "normal"; a < 0 ? (a = -a, r.fontDirection = -1) : r.fontDirection = 1, r.fontSize = a, r.fontFamily = n.loadedName, r.fontWeight = o, r.fontStyle = s, r.tspan = this.svgFactory.createElement("svg:tspan"), r.tspan.setAttributeNS(null, "y", e(-r.y)), r.xcoords = [] }, endText: function () { var e = this.current; e.textRenderingMode & i.TextRenderingMode.ADD_TO_PATH_FLAG && e.txtElement && e.txtElement.hasChildNodes() && (e.element = e.txtElement, this.clip("nonzero"), this.endPath()) }, setLineWidth: function (e) { this.current.lineWidth = e }, setLineCap: function (e) { this.current.lineCap = o[e] }, setLineJoin: function (e) { this.current.lineJoin = s[e] }, setMiterLimit: function (e) { this.current.miterLimit = e }, setStrokeAlpha: function (e) { this.current.strokeAlpha = e }, setStrokeRGBColor: function (e, t, r) { var n = i.Util.makeCssRgb(e, t, r); this.current.strokeColor = n }, setFillAlpha: function (e) { this.current.fillAlpha = e }, setFillRGBColor: function (e, t, r) { var n = i.Util.makeCssRgb(e, t, r); this.current.fillColor = n, this.current.tspan = this.svgFactory.createElement("svg:tspan"), this.current.xcoords = [] }, setDash: function (e, t) { this.current.dashArray = e, this.current.dashPhase = t }, constructPath: function (t, r) { var n = this.current, a = n.x, o = n.y; n.path = this.svgFactory.createElement("svg:path"); for (var s = [], u = t.length, l = 0, c = 0; l < u; l++)switch (0 | t[l]) { case i.OPS.rectangle: a = r[c++], o = r[c++]; var h = a + r[c++], d = o + r[c++]; s.push("M", e(a), e(o), "L", e(h), e(o), "L", e(h), e(d), "L", e(a), e(d), "Z"); break; case i.OPS.moveTo: a = r[c++], o = r[c++], s.push("M", e(a), e(o)); break; case i.OPS.lineTo: a = r[c++], o = r[c++], s.push("L", e(a), e(o)); break; case i.OPS.curveTo: a = r[c + 4], o = r[c + 5], s.push("C", e(r[c]), e(r[c + 1]), e(r[c + 2]), e(r[c + 3]), e(a), e(o)), c += 6; break; case i.OPS.curveTo2: a = r[c + 2], o = r[c + 3], s.push("C", e(a), e(o), e(r[c]), e(r[c + 1]), e(r[c + 2]), e(r[c + 3])), c += 4; break; case i.OPS.curveTo3: a = r[c + 2], o = r[c + 3], s.push("C", e(r[c]), e(r[c + 1]), e(a), e(o), e(a), e(o)), c += 4; break; case i.OPS.closePath: s.push("Z") }n.path.setAttributeNS(null, "d", s.join(" ")), n.path.setAttributeNS(null, "fill", "none"), this._ensureTransformGroup().appendChild(n.path), n.element = n.path, n.setCurrentPoint(a, o) }, endPath: function () { if (this.pendingClip) { var e = this.current, r = "clippath" + u; u++; var n = this.svgFactory.createElement("svg:clipPath"); n.setAttributeNS(null, "id", r), n.setAttributeNS(null, "transform", t(this.transformMatrix)); var i = e.element.cloneNode(!0); "evenodd" === this.pendingClip ? i.setAttributeNS(null, "clip-rule", "evenodd") : i.setAttributeNS(null, "clip-rule", "nonzero"), this.pendingClip = null, n.appendChild(i), this.defs.appendChild(n), e.activeClipUrl && (e.clipGroup = null, this.extraStack.forEach(function (e) { e.clipGroup = null }), n.setAttributeNS(null, "clip-path", e.activeClipUrl)), e.activeClipUrl = "url(#" + r + ")", this.tgrp = null } }, clip: function (e) { this.pendingClip = e }, closePath: function () { var e = this.current; if (e.path) { var t = e.path.getAttributeNS(null, "d"); t += "Z", e.path.setAttributeNS(null, "d", t) } }, setLeading: function (e) { this.current.leading = -e }, setTextRise: function (e) { this.current.textRise = e }, setTextRenderingMode: function (e) { this.current.textRenderingMode = e }, setHScale: function (e) { this.current.textHScale = e / 100 }, setGState: function (e) { for (var t = 0, r = e.length; t < r; t++) { var n = e[t], a = n[0], o = n[1]; switch (a) { case "LW": this.setLineWidth(o); break; case "LC": this.setLineCap(o); break; case "LJ": this.setLineJoin(o); break; case "ML": this.setMiterLimit(o); break; case "D": this.setDash(o[0], o[1]); break; case "Font": this.setFont(o); break; case "CA": this.setStrokeAlpha(o); break; case "ca": this.setFillAlpha(o); break; default: (0, i.warn)("Unimplemented graphic state " + a) } } }, fill: function () { var e = this.current; e.element && (e.element.setAttributeNS(null, "fill", e.fillColor), e.element.setAttributeNS(null, "fill-opacity", e.fillAlpha), this.endPath()) }, stroke: function () { var e = this.current; e.element && (this._setStrokeAttributes(e.element), e.element.setAttributeNS(null, "fill", "none"), this.endPath()) }, _setStrokeAttributes: function (t) { var r = this.current; t.setAttributeNS(null, "stroke", r.strokeColor), t.setAttributeNS(null, "stroke-opacity", r.strokeAlpha), t.setAttributeNS(null, "stroke-miterlimit", e(r.miterLimit)), t.setAttributeNS(null, "stroke-linecap", r.lineCap), t.setAttributeNS(null, "stroke-linejoin", r.lineJoin), t.setAttributeNS(null, "stroke-width", e(r.lineWidth) + "px"), t.setAttributeNS(null, "stroke-dasharray", r.dashArray.map(e).join(" ")), t.setAttributeNS(null, "stroke-dashoffset", e(r.dashPhase) + "px") }, eoFill: function () { this.current.element && this.current.element.setAttributeNS(null, "fill-rule", "evenodd"), this.fill() }, fillStroke: function () { this.stroke(), this.fill() }, eoFillStroke: function () { this.current.element && this.current.element.setAttributeNS(null, "fill-rule", "evenodd"), this.fillStroke() }, closeStroke: function () { this.closePath(), this.stroke() }, closeFillStroke: function () { this.closePath(), this.fillStroke() }, closeEOFillStroke: function () { this.closePath(), this.eoFillStroke() }, paintSolidColorImageMask: function () { var e = this.current, t = this.svgFactory.createElement("svg:rect"); t.setAttributeNS(null, "x", "0"), t.setAttributeNS(null, "y", "0"), t.setAttributeNS(null, "width", "1px"), t.setAttributeNS(null, "height", "1px"), t.setAttributeNS(null, "fill", e.fillColor), this._ensureTransformGroup().appendChild(t) }, paintJpegXObject: function (t, r, i) { var a = this.objs.get(t), o = this.svgFactory.createElement("svg:image"); o.setAttributeNS(n, "xlink:href", a.src), o.setAttributeNS(null, "width", e(r)), o.setAttributeNS(null, "height", e(i)), o.setAttributeNS(null, "x", "0"), o.setAttributeNS(null, "y", e(-i)), o.setAttributeNS(null, "transform", "scale(" + e(1 / r) + " " + e(-1 / i) + ")"), this._ensureTransformGroup().appendChild(o) }, paintImageXObject: function (e) { var t = this.objs.get(e); t ? this.paintInlineImageXObject(t) : (0, i.warn)("Dependent image isn't ready yet") }, paintInlineImageXObject: function (t, r) { var i = t.width, a = t.height, o = c(t, this.forceDataSchema, !!r), s = this.svgFactory.createElement("svg:rect"); s.setAttributeNS(null, "x", "0"), s.setAttributeNS(null, "y", "0"), s.setAttributeNS(null, "width", e(i)), s.setAttributeNS(null, "height", e(a)), this.current.element = s, this.clip("nonzero"); var u = this.svgFactory.createElement("svg:image"); u.setAttributeNS(n, "xlink:href", o), u.setAttributeNS(null, "x", "0"), u.setAttributeNS(null, "y", e(-a)), u.setAttributeNS(null, "width", e(i) + "px"), u.setAttributeNS(null, "height", e(a) + "px"), u.setAttributeNS(null, "transform", "scale(" + e(1 / i) + " " + e(-1 / a) + ")"), r ? r.appendChild(u) : this._ensureTransformGroup().appendChild(u) }, paintImageMaskXObject: function (t) { var r = this.current, n = t.width, i = t.height, a = r.fillColor; r.maskId = "mask" + d++; var o = this.svgFactory.createElement("svg:mask"); o.setAttributeNS(null, "id", r.maskId); var s = this.svgFactory.createElement("svg:rect"); s.setAttributeNS(null, "x", "0"), s.setAttributeNS(null, "y", "0"), s.setAttributeNS(null, "width", e(n)), s.setAttributeNS(null, "height", e(i)), s.setAttributeNS(null, "fill", a), s.setAttributeNS(null, "mask", "url(#" + r.maskId + ")"), this.defs.appendChild(o), this._ensureTransformGroup().appendChild(s), this.paintInlineImageXObject(t, o) }, paintFormXObjectBegin: function (t, r) { if (Array.isArray(t) && 6 === t.length && this.transform(t[0], t[1], t[2], t[3], t[4], t[5]), Array.isArray(r) && 4 === r.length) { var n = r[2] - r[0], i = r[3] - r[1], a = this.svgFactory.createElement("svg:rect"); a.setAttributeNS(null, "x", r[0]), a.setAttributeNS(null, "y", r[1]), a.setAttributeNS(null, "width", e(n)), a.setAttributeNS(null, "height", e(i)), this.current.element = a, this.clip("nonzero"), this.endPath() } }, paintFormXObjectEnd: function () { }, _initialize: function (e) { var r = this.svgFactory.create(e.width, e.height), n = this.svgFactory.createElement("svg:defs"); r.appendChild(n), this.defs = n; var i = this.svgFactory.createElement("svg:g"); return i.setAttributeNS(null, "transform", t(e.transform)), r.appendChild(i), this.svg = i, r }, _ensureClipGroup: function () { if (!this.current.clipGroup) { var e = this.svgFactory.createElement("svg:g"); e.setAttributeNS(null, "clip-path", this.current.activeClipUrl), this.svg.appendChild(e), this.current.clipGroup = e } return this.current.clipGroup }, _ensureTransformGroup: function () { return this.tgrp || (this.tgrp = this.svgFactory.createElement("svg:g"), this.tgrp.setAttributeNS(null, "transform", t(this.transformMatrix)), this.current.activeClipUrl ? this._ensureClipGroup().appendChild(this.tgrp) : this.svg.appendChild(this.tgrp)), this.tgrp } }, r }(), t.SVGGraphics = u }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.PDFNodeStream = void 0; var n, i = r(137), a = (n = i) && n.__esModule ? n : { default: n }, o = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), s = r(1), u = r(149); function l(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || "object" != typeof t && "function" != typeof t ? e : t } function c(e, t) { if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) } function h(e) { return function () { var t = e.apply(this, arguments); return new Promise(function (e, r) { return function n(i, a) { try { var o = t[i](a), s = o.value } catch (e) { return void r(e) } if (!o.done) return Promise.resolve(s).then(function (e) { n("next", e) }, function (e) { n("throw", e) }); e(s) }("next") }) } } function d(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } var f = require("fs"), p = require("http"), v = require("https"), m = require("url"), g = /^file:\/\/\/[a-zA-Z]:\//; var y = function () { function e(t) { var r, n; d(this, e), this.source = t, this.url = (r = t.url, "file:" === (n = m.parse(r)).protocol || n.host ? n : /^[a-z]:[/\\]/i.test(r) ? m.parse("file:///" + r) : (n.host || (n.protocol = "file:"), n)), this.isHttp = "http:" === this.url.protocol || "https:" === this.url.protocol, this.isFsUrl = "file:" === this.url.protocol, this.httpHeaders = this.isHttp && t.httpHeaders || {}, this._fullRequest = null, this._rangeRequestReaders = [] } return o(e, [{ key: "getFullReader", value: function () { return (0, s.assert)(!this._fullRequest), this._fullRequest = this.isFsUrl ? new k(this) : new S(this), this._fullRequest } }, { key: "getRangeReader", value: function (e, t) { var r = this.isFsUrl ? new P(this, e, t) : new w(this, e, t); return this._rangeRequestReaders.push(r), r } }, { key: "cancelAllRequests", value: function (e) { this._fullRequest && this._fullRequest.cancel(e), this._rangeRequestReaders.slice(0).forEach(function (t) { t.cancel(e) }) } }]), e }(), b = function () { function e(t) { d(this, e), this._url = t.url, this._done = !1, this._storedError = null, this.onProgress = null; var r = t.source; this._contentLength = r.length, this._loaded = 0, this._filename = null, this._disableRange = r.disableRange || !1, this._rangeChunkSize = r.rangeChunkSize, this._rangeChunkSize || this._disableRange || (this._disableRange = !0), this._isStreamingSupported = !r.disableStream, this._isRangeSupported = !r.disableRange, this._readableStream = null, this._readCapability = (0, s.createPromiseCapability)(), this._headersCapability = (0, s.createPromiseCapability)() } return o(e, [{ key: "read", value: function () { var e = h(a.default.mark(function e() { var t, r; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: return e.next = 2, this._readCapability.promise; case 2: if (!this._done) { e.next = 4; break } return e.abrupt("return", { value: void 0, done: !0 }); case 4: if (!this._storedError) { e.next = 6; break } throw this._storedError; case 6: if (null !== (t = this._readableStream.read())) { e.next = 10; break } return this._readCapability = (0, s.createPromiseCapability)(), e.abrupt("return", this.read()); case 10: return this._loaded += t.length, this.onProgress && this.onProgress({ loaded: this._loaded, total: this._contentLength }), r = new Uint8Array(t).buffer, e.abrupt("return", { value: r, done: !1 }); case 14: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }() }, { key: "cancel", value: function (e) { this._readableStream ? this._readableStream.destroy(e) : this._error(e) } }, { key: "_error", value: function (e) { this._storedError = e, this._readCapability.resolve() } }, { key: "_setReadableStream", value: function (e) { var t = this; this._readableStream = e, e.on("readable", function () { t._readCapability.resolve() }), e.on("end", function () { e.destroy(), t._done = !0, t._readCapability.resolve() }), e.on("error", function (e) { t._error(e) }), !this._isStreamingSupported && this._isRangeSupported && this._error(new s.AbortException("streaming is disabled")), this._storedError && this._readableStream.destroy(this._storedError) } }, { key: "headersReady", get: function () { return this._headersCapability.promise } }, { key: "filename", get: function () { return this._filename } }, { key: "contentLength", get: function () { return this._contentLength } }, { key: "isRangeSupported", get: function () { return this._isRangeSupported } }, { key: "isStreamingSupported", get: function () { return this._isStreamingSupported } }]), e }(), _ = function () { function e(t) { d(this, e), this._url = t.url, this._done = !1, this._storedError = null, this.onProgress = null, this._loaded = 0, this._readableStream = null, this._readCapability = (0, s.createPromiseCapability)(); var r = t.source; this._isStreamingSupported = !r.disableStream } return o(e, [{ key: "read", value: function () { var e = h(a.default.mark(function e() { var t, r; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: return e.next = 2, this._readCapability.promise; case 2: if (!this._done) { e.next = 4; break } return e.abrupt("return", { value: void 0, done: !0 }); case 4: if (!this._storedError) { e.next = 6; break } throw this._storedError; case 6: if (null !== (t = this._readableStream.read())) { e.next = 10; break } return this._readCapability = (0, s.createPromiseCapability)(), e.abrupt("return", this.read()); case 10: return this._loaded += t.length, this.onProgress && this.onProgress({ loaded: this._loaded }), r = new Uint8Array(t).buffer, e.abrupt("return", { value: r, done: !1 }); case 14: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }() }, { key: "cancel", value: function (e) { this._readableStream ? this._readableStream.destroy(e) : this._error(e) } }, { key: "_error", value: function (e) { this._storedError = e, this._readCapability.resolve() } }, { key: "_setReadableStream", value: function (e) { var t = this; this._readableStream = e, e.on("readable", function () { t._readCapability.resolve() }), e.on("end", function () { e.destroy(), t._done = !0, t._readCapability.resolve() }), e.on("error", function (e) { t._error(e) }), this._storedError && this._readableStream.destroy(this._storedError) } }, { key: "isStreamingSupported", get: function () { return this._isStreamingSupported } }]), e }(); function A(e, t) { return { protocol: e.protocol, auth: e.auth, host: e.hostname, port: e.port, path: e.path, method: "GET", headers: t } } var S = function (e) { function t(e) { d(this, t); var r = l(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)), n = function (t) { if (404 === t.statusCode) { var n = new s.MissingPDFException('Missing PDF "' + r._url + '".'); return r._storedError = n, void r._headersCapability.reject(n) } r._headersCapability.resolve(), r._setReadableStream(t); var i = function (e) { return r._readableStream.headers[e.toLowerCase()] }, a = (0, u.validateRangeRequestCapabilities)({ getResponseHeader: i, isHttp: e.isHttp, rangeChunkSize: r._rangeChunkSize, disableRange: r._disableRange }), o = a.allowRangeRequests, l = a.suggestedLength; r._isRangeSupported = o, r._contentLength = l || r._contentLength, r._filename = (0, u.extractFilenameFromHeader)(i) }; return r._request = null, "http:" === r._url.protocol ? r._request = p.request(A(r._url, e.httpHeaders), n) : r._request = v.request(A(r._url, e.httpHeaders), n), r._request.on("error", function (e) { r._storedError = e, r._headersCapability.reject(e) }), r._request.end(), r } return c(t, b), t }(), w = function (e) { function t(e, r, n) { d(this, t); var i = l(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)); for (var a in i._httpHeaders = {}, e.httpHeaders) { var o = e.httpHeaders[a]; void 0 !== o && (i._httpHeaders[a] = o) } i._httpHeaders.Range = "bytes=" + r + "-" + (n - 1); var u = function (e) { if (404 !== e.statusCode) i._setReadableStream(e); else { var t = new s.MissingPDFException('Missing PDF "' + i._url + '".'); i._storedError = t } }; return i._request = null, "http:" === i._url.protocol ? i._request = p.request(A(i._url, i._httpHeaders), u) : i._request = v.request(A(i._url, i._httpHeaders), u), i._request.on("error", function (e) { i._storedError = e }), i._request.end(), i } return c(t, _), t }(), k = function (e) { function t(e) { d(this, t); var r = l(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)), n = decodeURIComponent(r._url.path); return g.test(r._url.href) && (n = n.replace(/^\//, "")), f.lstat(n, function (e, t) { if (e) return "ENOENT" === e.code && (e = new s.MissingPDFException('Missing PDF "' + n + '".')), r._storedError = e, void r._headersCapability.reject(e); r._contentLength = t.size, r._setReadableStream(f.createReadStream(n)), r._headersCapability.resolve() }), r } return c(t, b), t }(), P = function (e) { function t(e, r, n) { d(this, t); var i = l(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this, e)), a = decodeURIComponent(i._url.path); return g.test(i._url.href) && (a = a.replace(/^\//, "")), i._setReadableStream(f.createReadStream(a, { start: r, end: n - 1 })), i } return c(t, _), t }(); t.PDFNodeStream = y }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.validateResponseStatus = t.validateRangeRequestCapabilities = t.extractFilenameFromHeader = t.createResponseStatusError = void 0; var n = r(1), i = r(150); t.createResponseStatusError = function (e, t) { return 404 === e || 0 === e && /^file:/.test(t) ? new n.MissingPDFException('Missing PDF "' + t + '".') : new n.UnexpectedResponseException("Unexpected server response (" + e + ') while retrieving PDF "' + t + '".', e) }, t.extractFilenameFromHeader = function (e) { var t = e("Content-Disposition"); if (t) { var r = (0, i.getFilenameFromContentDispositionHeader)(t); if (/\.pdf$/i.test(r)) return r } return null }, t.validateRangeRequestCapabilities = function (e) { var t = e.getResponseHeader, r = e.isHttp, i = e.rangeChunkSize, a = e.disableRange; (0, n.assert)(i > 0, "Range chunk size must be larger than zero"); var o = { allowRangeRequests: !1, suggestedLength: void 0 }, s = parseInt(t("Content-Length"), 10); return Number.isInteger(s) ? (o.suggestedLength = s, s <= 2 * i ? o : a || !r ? o : "bytes" !== t("Accept-Ranges") ? o : "identity" !== (t("Content-Encoding") || "identity") ? o : (o.allowRangeRequests = !0, o)) : o }, t.validateResponseStatus = function (e) { return 200 === e || 206 === e } }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }); var n = function () { return function (e, t) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return function (e, t) { var r = [], n = !0, i = !1, a = void 0; try { for (var o, s = e[Symbol.iterator](); !(n = (o = s.next()).done) && (r.push(o.value), !t || r.length !== t); n = !0); } catch (e) { i = !0, a = e } finally { try { !n && s.return && s.return() } finally { if (i) throw a } } return r }(e, t); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(); t.getFilenameFromContentDispositionHeader = function (e) { var t = !0, r = o("filename\\*", "i").exec(e); if (r) { var i = l(r = r[1]); return u(i = h(i = c(i = unescape(i)))) } if (r = function (e) { for (var t = [], r = void 0, i = o("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); null !== (r = i.exec(e));) { var a = r, s = n(a, 4), u = s[1], h = s[2], d = s[3]; if ((u = parseInt(u, 10)) in t) { if (0 === u) break } else t[u] = [h, d] } for (var f = [], p = 0; p < t.length && p in t; ++p) { var v = n(t[p], 2), m = v[0], g = v[1]; g = l(g), m && (g = unescape(g), 0 === p && (g = c(g))), f.push(g) } return f.join("") }(e)) return u(h(r)); if (r = o("filename", "i").exec(e)) { var a = l(r = r[1]); return u(a = h(a)) } function o(e, t) { return new RegExp("(?:^|;)\\s*" + e + '\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)', t) } function s(e, r) { if (e) { if (!/^[\x00-\xFF]+$/.test(r)) return r; try { for (var n = new TextDecoder(e, { fatal: !0 }), i = new Array(r.length), a = 0; a < r.length; ++a)i[a] = r.charCodeAt(a); r = n.decode(new Uint8Array(i)), t = !1 } catch (n) { if (/^utf-?8$/i.test(e)) try { r = decodeURIComponent(escape(r)), t = !1 } catch (e) { } } } return r } function u(e) { return t && /[\x80-\xff]/.test(e) && (e = s("utf-8", e), t && (e = s("iso-8859-1", e))), e } function l(e) { if ('"' === e.charAt(0)) { for (var t = e.slice(1).split('\\"'), r = 0; r < t.length; ++r) { var n = t[r].indexOf('"'); -1 !== n && (t[r] = t[r].slice(0, n), t.length = r + 1), t[r] = t[r].replace(/\\(.)/g, "$1") } e = t.join('"') } return e } function c(e) { var t = e.indexOf("'"); return -1 === t ? e : s(e.slice(0, t), e.slice(t + 1).replace(/^[^']*'/, "")) } function h(e) { return "=?" !== e.slice(0, 2) || /[\x00-\x19\x80-\xff]/.test(e) ? e : e.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (e, t, r, n) { if ("q" === r || "Q" === r) return s(t, n = (n = n.replace(/_/g, " ")).replace(/=([0-9a-fA-F]{2})/g, function (e, t) { return String.fromCharCode(parseInt(t, 16)) })); try { n = atob(n) } catch (e) { } return s(t, n) }) } return "" } }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.PDFFetchStream = void 0; var n, i = r(137), a = (n = i) && n.__esModule ? n : { default: n }, o = function () { function e(e, t) { for (var r = 0; r < t.length; r++) { var n = t[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) } } return function (t, r, n) { return r && e(t.prototype, r), n && e(t, n), t } }(), s = r(1), u = r(149); function l(e) { return function () { var t = e.apply(this, arguments); return new Promise(function (e, r) { return function n(i, a) { try { var o = t[i](a), s = o.value } catch (e) { return void r(e) } if (!o.done) return Promise.resolve(s).then(function (e) { n("next", e) }, function (e) { n("throw", e) }); e(s) }("next") }) } } function c(e, t) { if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") } function h(e, t, r) { return { method: "GET", headers: e, signal: r && r.signal, mode: "cors", credentials: t ? "include" : "same-origin", redirect: "follow" } } var d = function () { function e(t) { c(this, e), this.source = t, this.isHttp = /^https?:/i.test(t.url), this.httpHeaders = this.isHttp && t.httpHeaders || {}, this._fullRequestReader = null, this._rangeRequestReaders = [] } return o(e, [{ key: "getFullReader", value: function () { return (0, s.assert)(!this._fullRequestReader), this._fullRequestReader = new f(this), this._fullRequestReader } }, { key: "getRangeReader", value: function (e, t) { var r = new p(this, e, t); return this._rangeRequestReaders.push(r), r } }, { key: "cancelAllRequests", value: function (e) { this._fullRequestReader && this._fullRequestReader.cancel(e), this._rangeRequestReaders.slice(0).forEach(function (t) { t.cancel(e) }) } }]), e }(), f = function () { function e(t) { var r = this; c(this, e), this._stream = t, this._reader = null, this._loaded = 0, this._filename = null; var n = t.source; for (var i in this._withCredentials = n.withCredentials, this._contentLength = n.length, this._headersCapability = (0, s.createPromiseCapability)(), this._disableRange = n.disableRange || !1, this._rangeChunkSize = n.rangeChunkSize, this._rangeChunkSize || this._disableRange || (this._disableRange = !0), "undefined" != typeof AbortController && (this._abortController = new AbortController), this._isStreamingSupported = !n.disableStream, this._isRangeSupported = !n.disableRange, this._headers = new Headers, this._stream.httpHeaders) { var a = this._stream.httpHeaders[i]; void 0 !== a && this._headers.append(i, a) } var o = n.url; fetch(o, h(this._headers, this._withCredentials, this._abortController)).then(function (e) { if (!(0, u.validateResponseStatus)(e.status)) throw (0, u.createResponseStatusError)(e.status, o); r._reader = e.body.getReader(), r._headersCapability.resolve(); var t = function (t) { return e.headers.get(t) }, n = (0, u.validateRangeRequestCapabilities)({ getResponseHeader: t, isHttp: r._stream.isHttp, rangeChunkSize: r._rangeChunkSize, disableRange: r._disableRange }), i = n.allowRangeRequests, a = n.suggestedLength; r._isRangeSupported = i, r._contentLength = a || r._contentLength, r._filename = (0, u.extractFilenameFromHeader)(t), !r._isStreamingSupported && r._isRangeSupported && r.cancel(new s.AbortException("streaming is disabled")) }).catch(this._headersCapability.reject), this.onProgress = null } return o(e, [{ key: "read", value: function () { var e = l(a.default.mark(function e() { var t, r, n, i; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: return e.next = 2, this._headersCapability.promise; case 2: return e.next = 4, this._reader.read(); case 4: if (t = e.sent, r = t.value, !(n = t.done)) { e.next = 9; break } return e.abrupt("return", { value: r, done: n }); case 9: return this._loaded += r.byteLength, this.onProgress && this.onProgress({ loaded: this._loaded, total: this._contentLength }), i = new Uint8Array(r).buffer, e.abrupt("return", { value: i, done: !1 }); case 13: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }() }, { key: "cancel", value: function (e) { this._reader && this._reader.cancel(e), this._abortController && this._abortController.abort() } }, { key: "headersReady", get: function () { return this._headersCapability.promise } }, { key: "filename", get: function () { return this._filename } }, { key: "contentLength", get: function () { return this._contentLength } }, { key: "isRangeSupported", get: function () { return this._isRangeSupported } }, { key: "isStreamingSupported", get: function () { return this._isStreamingSupported } }]), e }(), p = function () { function e(t, r, n) { var i = this; c(this, e), this._stream = t, this._reader = null, this._loaded = 0; var a = t.source; for (var o in this._withCredentials = a.withCredentials, this._readCapability = (0, s.createPromiseCapability)(), this._isStreamingSupported = !a.disableStream, "undefined" != typeof AbortController && (this._abortController = new AbortController), this._headers = new Headers, this._stream.httpHeaders) { var l = this._stream.httpHeaders[o]; void 0 !== l && this._headers.append(o, l) } var d = r + "-" + (n - 1); this._headers.append("Range", "bytes=" + d); var f = a.url; fetch(f, h(this._headers, this._withCredentials, this._abortController)).then(function (e) { if (!(0, u.validateResponseStatus)(e.status)) throw (0, u.createResponseStatusError)(e.status, f); i._readCapability.resolve(), i._reader = e.body.getReader() }), this.onProgress = null } return o(e, [{ key: "read", value: function () { var e = l(a.default.mark(function e() { var t, r, n, i; return a.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: return e.next = 2, this._readCapability.promise; case 2: return e.next = 4, this._reader.read(); case 4: if (t = e.sent, r = t.value, !(n = t.done)) { e.next = 9; break } return e.abrupt("return", { value: r, done: n }); case 9: return this._loaded += r.byteLength, this.onProgress && this.onProgress({ loaded: this._loaded }), i = new Uint8Array(r).buffer, e.abrupt("return", { value: i, done: !1 }); case 13: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }() }, { key: "cancel", value: function (e) { this._reader && this._reader.cancel(e), this._abortController && this._abortController.abort() } }, { key: "isStreamingSupported", get: function () { return this._isStreamingSupported } }]), e }(); t.PDFFetchStream = d }, function (e, t, r) { "use strict"; Object.defineProperty(t, "__esModule", { value: !0 }), t.NetworkManager = t.PDFNetworkStream = void 0; var n = s(r(137)), i = r(1), a = r(149), o = s(r(3)); function s(e) { return e && e.__esModule ? e : { default: e } } function u(e) { return function () { var t = e.apply(this, arguments); return new Promise(function (e, r) { return function n(i, a) { try { var o = t[i](a), s = o.value } catch (e) { return void r(e) } if (!o.done) return Promise.resolve(s).then(function (e) { n("next", e) }, function (e) { n("throw", e) }); e(s) }("next") }) } } function l(e, t) { this.url = e, t = t || {}, this.isHttp = /^https?:/i.test(e), this.httpHeaders = this.isHttp && t.httpHeaders || {}, this.withCredentials = t.withCredentials || !1, this.getXhr = t.getXhr || function () { return new XMLHttpRequest }, this.currXhrId = 0, this.pendingRequests = Object.create(null), this.loadedRequests = Object.create(null) } function c(e) { var t = e.response; return "string" != typeof t ? t : (0, i.stringToBytes)(t).buffer } var h = function () { try { var e = new XMLHttpRequest; return e.open("GET", o.default.location.href), e.responseType = "moz-chunked-arraybuffer", "moz-chunked-arraybuffer" === e.responseType } catch (e) { return !1 } }(); function d(e) { this._source = e, this._manager = new l(e.url, { httpHeaders: e.httpHeaders, withCredentials: e.withCredentials }), this._rangeChunkSize = e.rangeChunkSize, this._fullRequestReader = null, this._rangeRequestReaders = [] } function f(e, t) { this._manager = e; var r = { onHeadersReceived: this._onHeadersReceived.bind(this), onProgressiveData: t.disableStream ? null : this._onProgressiveData.bind(this), onDone: this._onDone.bind(this), onError: this._onError.bind(this), onProgress: this._onProgress.bind(this) }; this._url = t.url, this._fullRequestId = e.requestFull(r), this._headersReceivedCapability = (0, i.createPromiseCapability)(), this._disableRange = t.disableRange || !1, this._contentLength = t.length, this._rangeChunkSize = t.rangeChunkSize, this._rangeChunkSize || this._disableRange || (this._disableRange = !0), this._isStreamingSupported = !1, this._isRangeSupported = !1, this._cachedChunks = [], this._requests = [], this._done = !1, this._storedError = void 0, this._filename = null, this.onProgress = null } function p(e, t, r) { this._manager = e; var n = { onDone: this._onDone.bind(this), onProgress: this._onProgress.bind(this) }; this._requestId = e.requestRange(t, r, n), this._requests = [], this._queuedChunk = null, this._done = !1, this.onProgress = null, this.onClosed = null } l.prototype = { requestRange: function (e, t, r) { var n = { begin: e, end: t }; for (var i in r) n[i] = r[i]; return this.request(n) }, requestFull: function (e) { return this.request(e) }, request: function (e) { var t = this.getXhr(), r = this.currXhrId++, n = this.pendingRequests[r] = { xhr: t }; for (var i in t.open("GET", this.url), t.withCredentials = this.withCredentials, this.httpHeaders) { var a = this.httpHeaders[i]; void 0 !== a && t.setRequestHeader(i, a) } if (this.isHttp && "begin" in e && "end" in e) { var o = e.begin + "-" + (e.end - 1); t.setRequestHeader("Range", "bytes=" + o), n.expectedStatus = 206 } else n.expectedStatus = 200; return h && !!e.onProgressiveData ? (t.responseType = "moz-chunked-arraybuffer", n.onProgressiveData = e.onProgressiveData, n.mozChunked = !0) : t.responseType = "arraybuffer", e.onError && (t.onerror = function (r) { e.onError(t.status) }), t.onreadystatechange = this.onStateChange.bind(this, r), t.onprogress = this.onProgress.bind(this, r), n.onHeadersReceived = e.onHeadersReceived, n.onDone = e.onDone, n.onError = e.onError, n.onProgress = e.onProgress, t.send(null), r }, onProgress: function (e, t) { var r = this.pendingRequests[e]; if (r) { if (r.mozChunked) { var n = c(r.xhr); r.onProgressiveData(n) } var i = r.onProgress; i && i(t) } }, onStateChange: function (e, t) { var r = this.pendingRequests[e]; if (r) { var n = r.xhr; if (n.readyState >= 2 && r.onHeadersReceived && (r.onHeadersReceived(), delete r.onHeadersReceived), 4 === n.readyState && e in this.pendingRequests) if (delete this.pendingRequests[e], 0 === n.status && this.isHttp) r.onError && r.onError(n.status); else { var i = n.status || 200; if (200 === i && 206 === r.expectedStatus || i === r.expectedStatus) { this.loadedRequests[e] = !0; var a = c(n); if (206 === i) { var o = n.getResponseHeader("Content-Range"), s = /bytes (\d+)-(\d+)\/(\d+)/.exec(o), u = parseInt(s[1], 10); r.onDone({ begin: u, chunk: a }) } else r.onProgressiveData ? r.onDone(null) : a ? r.onDone({ begin: 0, chunk: a }) : r.onError && r.onError(n.status) } else r.onError && r.onError(n.status) } } }, hasPendingRequests: function () { for (var e in this.pendingRequests) return !0; return !1 }, getRequestXhr: function (e) { return this.pendingRequests[e].xhr }, isStreamingRequest: function (e) { return !!this.pendingRequests[e].onProgressiveData }, isPendingRequest: function (e) { return e in this.pendingRequests }, isLoadedRequest: function (e) { return e in this.loadedRequests }, abortAllRequests: function () { for (var e in this.pendingRequests) this.abortRequest(0 | e) }, abortRequest: function (e) { var t = this.pendingRequests[e].xhr; delete this.pendingRequests[e], t.abort() } }, d.prototype = { _onRangeRequestReaderClosed: function (e) { var t = this._rangeRequestReaders.indexOf(e); t >= 0 && this._rangeRequestReaders.splice(t, 1) }, getFullReader: function () { return (0, i.assert)(!this._fullRequestReader), this._fullRequestReader = new f(this._manager, this._source), this._fullRequestReader }, getRangeReader: function (e, t) { var r = new p(this._manager, e, t); return r.onClosed = this._onRangeRequestReaderClosed.bind(this), this._rangeRequestReaders.push(r), r }, cancelAllRequests: function (e) { this._fullRequestReader && this._fullRequestReader.cancel(e), this._rangeRequestReaders.slice(0).forEach(function (t) { t.cancel(e) }) } }, f.prototype = { _onHeadersReceived: function () { var e = this._fullRequestId, t = this._manager.getRequestXhr(e), r = function (e) { return t.getResponseHeader(e) }, n = (0, a.validateRangeRequestCapabilities)({ getResponseHeader: r, isHttp: this._manager.isHttp, rangeChunkSize: this._rangeChunkSize, disableRange: this._disableRange }), i = n.allowRangeRequests, o = n.suggestedLength; i && (this._isRangeSupported = !0), this._contentLength = o || this._contentLength, this._filename = (0, a.extractFilenameFromHeader)(r); var s = this._manager; s.isStreamingRequest(e) ? this._isStreamingSupported = !0 : this._isRangeSupported && s.abortRequest(e), this._headersReceivedCapability.resolve() }, _onProgressiveData: function (e) { this._requests.length > 0 ? this._requests.shift().resolve({ value: e, done: !1 }) : this._cachedChunks.push(e) }, _onDone: function (e) { e && this._onProgressiveData(e.chunk), this._done = !0, this._cachedChunks.length > 0 || (this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = []) }, _onError: function (e) { var t = this._url, r = (0, a.createResponseStatusError)(e, t); this._storedError = r, this._headersReceivedCapability.reject(r), this._requests.forEach(function (e) { e.reject(r) }), this._requests = [], this._cachedChunks = [] }, _onProgress: function (e) { this.onProgress && this.onProgress({ loaded: e.loaded, total: e.lengthComputable ? e.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 }, read: function () { var e = u(n.default.mark(function e() { var t, r; return n.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: if (!this._storedError) { e.next = 2; break } throw this._storedError; case 2: if (!(this._cachedChunks.length > 0)) { e.next = 5; break } return t = this._cachedChunks.shift(), e.abrupt("return", { value: t, done: !1 }); case 5: if (!this._done) { e.next = 7; break } return e.abrupt("return", { value: void 0, done: !0 }); case 7: return r = (0, i.createPromiseCapability)(), this._requests.push(r), e.abrupt("return", r.promise); case 10: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }(), cancel: function (e) { this._done = !0, this._headersReceivedCapability.reject(e), this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = [], this._manager.isPendingRequest(this._fullRequestId) && this._manager.abortRequest(this._fullRequestId), this._fullRequestReader = null } }, p.prototype = { _close: function () { this.onClosed && this.onClosed(this) }, _onDone: function (e) { var t = e.chunk; this._requests.length > 0 ? this._requests.shift().resolve({ value: t, done: !1 }) : this._queuedChunk = t; this._done = !0, this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = [], this._close() }, _onProgress: function (e) { !this.isStreamingSupported && this.onProgress && this.onProgress({ loaded: e.loaded }) }, get isStreamingSupported() { return !1 }, read: function () { var e = u(n.default.mark(function e() { var t, r; return n.default.wrap(function (e) { for (; ;)switch (e.prev = e.next) { case 0: if (null === this._queuedChunk) { e.next = 4; break } return t = this._queuedChunk, this._queuedChunk = null, e.abrupt("return", { value: t, done: !1 }); case 4: if (!this._done) { e.next = 6; break } return e.abrupt("return", { value: void 0, done: !0 }); case 6: return r = (0, i.createPromiseCapability)(), this._requests.push(r), e.abrupt("return", r.promise); case 9: case "end": return e.stop() } }, e, this) })); return function () { return e.apply(this, arguments) } }(), cancel: function (e) { this._done = !0, this._requests.forEach(function (e) { e.resolve({ value: void 0, done: !0 }) }), this._requests = [], this._manager.isPendingRequest(this._requestId) && this._manager.abortRequest(this._requestId), this._close() } }, t.PDFNetworkStream = d, t.NetworkManager = l }]) }); \ No newline at end of file
diff --git a/graphics/figput/javascript/pdf.worker.min.js b/graphics/figput/javascript/pdf.worker.min.js
new file mode 100644
index 0000000000..31516d160a
--- /dev/null
+++ b/graphics/figput/javascript/pdf.worker.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pdfjs-dist/build/pdf.worker",[],t):"object"==typeof exports?exports["pdfjs-dist/build/pdf.worker"]=t():e["pdfjs-dist/build/pdf.worker"]=e.pdfjsWorker=t()}(this,function(){return function(e){var t={};function r(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};e[a].call(i.exports,i,i.exports,r);i.l=!0;return i.exports}r.m=e;r.c=t;r.d=function(e,t,a){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})};r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});Object.defineProperty(e,"__esModule",{value:!0})};r.t=function(e,t){1&t&&(e=r(e));if(8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);r.r(a);Object.defineProperty(a,"default",{enumerable:!0,value:e});if(2&t&&"string"!=typeof e)for(var i in e)r.d(a,i,function(t){return e[t]}.bind(null,i));return a};r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};r.d(t,"a",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p="";return r(r.s=0)}([function(e,t,r){"use strict";var a=r(1);t.WorkerMessageHandler=a.WorkerMessageHandler},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkerMessageHandler=t.WorkerTask=void 0;var a,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,i=!1,n=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){r.push(o.value);if(t&&r.length===t)break}}catch(e){i=!0;n=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw n}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=r(2),s=r(130),c=r(5),l=(a=c)&&a.__esModule?a:{default:a},u=r(172),h=r(138);var f,d=function(){function e(e){this.name=e;this.terminated=!1;this._capability=(0,o.createPromiseCapability)()}e.prototype={get finished(){return this._capability.promise},finish:function(){this._capability.resolve()},terminate:function(){this.terminated=!0},ensureNotTerminated:function(){if(this.terminated)throw new Error("Worker task was terminated")}};return e}(),g=function(){function e(e){this._msgHandler=e;this._contentLength=null;this._fullRequestReader=null;this._rangeRequestReaders=[]}e.prototype={getFullReader:function(){(0,o.assert)(!this._fullRequestReader);this._fullRequestReader=new t(this._msgHandler);return this._fullRequestReader},getRangeReader:function(e,t){var a=new r(e,t,this._msgHandler);this._rangeRequestReaders.push(a);return a},cancelAllRequests:function(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);this._rangeRequestReaders.slice(0).forEach(function(t){t.cancel(e)})}};function t(e){var t=this;this._msgHandler=e;this._contentLength=null;this._isRangeSupported=!1;this._isStreamingSupported=!1;var r=this._msgHandler.sendWithStream("GetReader");this._reader=r.getReader();this._headersReady=this._msgHandler.sendWithPromise("ReaderHeadersReady").then(function(e){t._isStreamingSupported=e.isStreamingSupported;t._isRangeSupported=e.isRangeSupported;t._contentLength=e.contentLength})}t.prototype={get headersReady(){return this._headersReady},get contentLength(){return this._contentLength},get isStreamingSupported(){return this._isStreamingSupported},get isRangeSupported(){return this._isRangeSupported},read:function(){return this._reader.read().then(function(e){var t=e.value;return e.done?{value:void 0,done:!0}:{value:t.buffer,done:!1}})},cancel:function(e){this._reader.cancel(e)}};function r(e,t,r){this._msgHandler=r;this.onProgress=null;var a=this._msgHandler.sendWithStream("GetRangeReader",{begin:e,end:t});this._reader=a.getReader()}r.prototype={get isStreamingSupported(){return!1},read:function(){return this._reader.read().then(function(e){var t=e.value;return e.done?{value:void 0,done:!0}:{value:t.buffer,done:!1}})},cancel:function(e){this._reader.cancel(e)}};return e}(),m={setup:function(e,t){var r=!1;e.on("test",function(t){if(!r){r=!0;if(t instanceof Uint8Array){var a=255===t[0];e.postMessageTransfers=a;var i=new XMLHttpRequest,n="response"in i;try{i.responseType}catch(e){n=!1}n?e.send("test",{supportTypedArray:!0,supportTransfers:a}):e.send("test",!1)}else e.send("test",!1)}});e.on("configure",function(e){(0,o.setVerbosityLevel)(e.verbosity)});e.on("GetDocRequest",function(e){return m.createDocumentHandler(e,t)})},createDocumentHandler:function(e,t){var r,a=!1,c=null,l=[],f=e.apiVersion;if("2.0.943"!==f)throw new Error('The API version "'+f+'" does not match the Worker version "2.0.943".');var m=e.docId,p=e.docBaseUrl,v=e.docId+"_worker",b=new u.MessageHandler(v,m,t);b.postMessageTransfers=e.postMessageTransfers;function y(){if(a)throw new Error("Worker was terminated")}function w(e){l.push(e)}function k(e){e.finish();var t=l.indexOf(e);l.splice(t,1)}function S(e){var t=(0,o.createPromiseCapability)(),a=function(){Promise.all([r.ensureDoc("numPages"),r.ensureDoc("fingerprint")]).then(function(e){var r=n(e,2),a=r[0],i=r[1];t.resolve({numPages:a,fingerprint:i})},i)},i=function(e){t.reject(e)};r.ensureDoc("checkHeader",[]).then(function(){r.ensureDoc("parseStartXRef",[]).then(function(){r.ensureDoc("parse",[e]).then(a,i)},i)},i);return t.promise}function C(e,t){var r,a=(0,o.createPromiseCapability)(),i=e.source;if(i.data){try{r=new s.LocalPdfManager(m,i.data,i.password,t,p);a.resolve(r)}catch(e){a.reject(e)}return a.promise}var n,l=[];try{n=new g(b)}catch(e){a.reject(e);return a.promise}var u=n.getFullReader();u.headersReady.then(function(){if(u.isRangeSupported){var e=i.disableAutoFetch||u.isStreamingSupported;r=new s.NetworkPdfManager(m,n,{msgHandler:b,url:i.url,password:i.password,length:u.contentLength,disableAutoFetch:e,rangeChunkSize:i.rangeChunkSize},t,p);for(var o=0;o<l.length;o++)r.sendProgressiveData(l[o]);l=[];a.resolve(r);c=null}}).catch(function(e){a.reject(e);c=null});var h=0;new Promise(function(e,n){u.read().then(function e(f){try{y();if(f.done){r||function(){var e=(0,o.arraysToBytes)(l);i.length&&e.length!==i.length&&(0,o.warn)("reported HTTP length is different from actual");try{r=new s.LocalPdfManager(m,e,i.password,t,p);a.resolve(r)}catch(e){a.reject(e)}l=[]}();c=null;return}var d=f.value;h+=(0,o.arrayByteLength)(d);u.isStreamingSupported||b.send("DocProgress",{loaded:h,total:Math.max(h,u.contentLength||0)});r?r.sendProgressiveData(d):l.push(d);u.read().then(e,n)}catch(e){n(e)}},n)}).catch(function(e){a.reject(e);c=null});c=function(){n.cancelAllRequests("abort")};return a.promise}b.on("GetPage",function(e){return r.getPage(e.pageIndex).then(function(e){return Promise.all([r.ensure(e,"rotate"),r.ensure(e,"ref"),r.ensure(e,"userUnit"),r.ensure(e,"view")]).then(function(e){var t=n(e,4);return{rotate:t[0],ref:t[1],userUnit:t[2],view:t[3]}})})});b.on("GetPageIndex",function(e){var t=new h.Ref(e.ref.num,e.ref.gen);return r.pdfDocument.catalog.getPageIndex(t)});b.on("GetDestinations",function(e){return r.ensureCatalog("destinations")});b.on("GetDestination",function(e){return r.ensureCatalog("getDestination",[e.id])});b.on("GetPageLabels",function(e){return r.ensureCatalog("pageLabels")});b.on("GetPageMode",function(e){return r.ensureCatalog("pageMode")});b.on("GetAttachments",function(e){return r.ensureCatalog("attachments")});b.on("GetJavaScript",function(e){return r.ensureCatalog("javaScript")});b.on("GetOutline",function(e){return r.ensureCatalog("documentOutline")});b.on("GetPermissions",function(e){return r.ensureCatalog("permissions")});b.on("GetMetadata",function(e){return Promise.all([r.ensureDoc("documentInfo"),r.ensureCatalog("metadata")])});b.on("GetData",function(e){r.requestLoadedStream();return r.onLoadedStream().then(function(e){return e.bytes})});b.on("GetStats",function(e){return r.pdfDocument.xref.stats});b.on("GetAnnotations",function(e){var t=e.pageIndex,a=e.intent;return r.getPage(t).then(function(e){return e.getAnnotationsData(a)})});b.on("RenderPageRequest",function(e){var t=e.pageIndex;r.getPage(t).then(function(r){var a=new d("RenderPageRequest: page "+t);w(a);var n=t+1,s=Date.now();r.getOperatorList({handler:b,task:a,intent:e.intent,renderInteractiveForms:e.renderInteractiveForms}).then(function(e){k(a);(0,o.info)("page="+n+" - getOperatorList: time="+(Date.now()-s)+"ms, len="+e.totalLength)},function(t){k(a);if(!a.terminated){b.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.unknown});var r,s="worker.js: while trying to getPage() and getOperatorList()";r="string"==typeof t?{message:t,stack:s}:"object"===(void 0===t?"undefined":i(t))?{message:t.message||t.toString(),stack:t.stack||s}:{message:"Unknown exception type: "+(void 0===t?"undefined":i(t)),stack:s};b.send("PageError",{pageNum:n,error:r,intent:e.intent})}})})},this);b.on("GetTextContent",function(e,t){var a=e.pageIndex;t.onPull=function(e){};t.onCancel=function(e){};r.getPage(a).then(function(r){var i=new d("GetTextContent: page "+a);w(i);var n=a+1,s=Date.now();r.extractTextContent({handler:b,task:i,sink:t,normalizeWhitespace:e.normalizeWhitespace,combineTextItems:e.combineTextItems}).then(function(){k(i);(0,o.info)("text indexing: page="+n+" - time="+(Date.now()-s)+"ms");t.close()},function(e){k(i);if(!i.terminated){t.error(e);throw e}})})});b.on("Cleanup",function(e){return r.cleanup()});b.on("Terminate",function(e){a=!0;if(r){r.terminate();r=null}c&&c();var t=[];l.forEach(function(e){t.push(e.finished);e.terminate()});return Promise.all(t).then(function(){b.destroy();b=null})});b.on("Ready",function(t){!function(e){function t(e){y();b.send("GetDoc",{pdfInfo:e})}function i(e){y();if(e instanceof o.PasswordException){var t=new d("PasswordException: response "+e.code);w(t);b.sendWithPromise("PasswordRequest",e).then(function(e){k(t);r.updatePassword(e.password);n()}).catch(function(e){k(t);b.send("PasswordException",e)}.bind(null,e))}else e instanceof o.InvalidPDFException?b.send("InvalidPDF",e):e instanceof o.MissingPDFException?b.send("MissingPDF",e):e instanceof o.UnexpectedResponseException?b.send("UnexpectedResponse",e):b.send("UnknownError",new o.UnknownErrorException(e.message,e.toString()))}function n(){y();S(!1).then(t,function(e){y();if(e instanceof o.XRefParseException){r.requestLoadedStream();r.onLoadedStream().then(function(){y();S(!0).then(t,i)})}else i(e)},i)}y();C(e,{forceDataSchema:e.disableCreateObjectURL,maxImageSize:e.maxImageSize,disableFontFace:e.disableFontFace,nativeImageDecoderSupport:e.nativeImageDecoderSupport,ignoreErrors:e.ignoreErrors,isEvalSupported:e.isEvalSupported}).then(function(e){if(a){e.terminate();throw new Error("Worker was terminated")}(r=e).onLoadedStream().then(function(e){b.send("DataLoaded",{length:e.bytes.byteLength})})}).then(n,i)}(e);e=null});return v},initializeFromPort:function(e){var t=new u.MessageHandler("worker","main",e);m.setup(t,e);t.send("ready",null)}};"undefined"==typeof window&&!(0,l.default)()&&"undefined"!=typeof self&&("function"==typeof(f=self).postMessage&&"onmessage"in f)&&m.initializeFromPort(self);t.WorkerTask=d;t.WorkerMessageHandler=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.unreachable=t.warn=t.utf8StringToString=t.stringToUTF8String=t.stringToPDFString=t.stringToBytes=t.string32=t.shadow=t.setVerbosityLevel=t.URL=t.ReadableStream=t.removeNullCharacters=t.readUint32=t.readUint16=t.readInt8=t.log2=t.isEvalSupported=t.isLittleEndian=t.createValidAbsoluteUrl=t.isSameOrigin=t.isSpace=t.isString=t.isNum=t.isEmptyObj=t.isBool=t.isArrayBuffer=t.info=t.getVerbosityLevel=t.getLookupTableFactory=t.getInheritableProperty=t.deprecated=t.createObjectURL=t.createPromiseCapability=t.bytesToString=t.assert=t.arraysToBytes=t.arrayByteLength=t.FormatError=t.XRefParseException=t.toRomanNumerals=t.Util=t.UnknownErrorException=t.UnexpectedResponseException=t.TextRenderingMode=t.StreamType=t.PermissionFlag=t.PasswordResponses=t.PasswordException=t.NativeImageDecoding=t.MissingPDFException=t.MissingDataException=t.InvalidPDFException=t.AbortException=t.CMapCompressionType=t.ImageKind=t.FontType=t.AnnotationType=t.AnnotationFlag=t.AnnotationFieldFlag=t.AnnotationBorderStyleType=t.UNSUPPORTED_FEATURES=t.VerbosityLevel=t.OPS=t.IDENTITY_MATRIX=t.FONT_IDENTITY_MATRIX=void 0;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};r(3);var i=r(126),n=r(128),o={ERRORS:0,WARNINGS:1,INFOS:5},s=o.WARNINGS;function c(e){s>=o.WARNINGS&&console.log("Warning: "+e)}function l(e){throw new Error(e)}function u(e,t){e||l(t)}var h=function(){function e(e,t){this.name="PasswordException";this.message=e;this.code=t}e.prototype=new Error;e.constructor=e;return e}(),f=function(){function e(e,t){this.name="UnknownErrorException";this.message=e;this.details=t}e.prototype=new Error;e.constructor=e;return e}(),d=function(){function e(e){this.name="InvalidPDFException";this.message=e}e.prototype=new Error;e.constructor=e;return e}(),g=function(){function e(e){this.name="MissingPDFException";this.message=e}e.prototype=new Error;e.constructor=e;return e}(),m=function(){function e(e,t){this.name="UnexpectedResponseException";this.message=e;this.status=t}e.prototype=new Error;e.constructor=e;return e}(),p=function(){function e(e,t){this.begin=e;this.end=t;this.message="Missing data ["+e+", "+t+")"}e.prototype=new Error;e.prototype.name="MissingDataException";e.constructor=e;return e}(),v=function(){function e(e){this.message=e}e.prototype=new Error;e.prototype.name="XRefParseException";e.constructor=e;return e}(),b=function(){function e(e){this.message=e}e.prototype=new Error;e.prototype.name="FormatError";e.constructor=e;return e}(),y=function(){function e(e){this.name="AbortException";this.message=e}e.prototype=new Error;e.constructor=e;return e}(),w=/\x00/g;function k(e){u("string"==typeof e,"Invalid argument for stringToBytes");for(var t=e.length,r=new Uint8Array(t),a=0;a<t;++a)r[a]=255&e.charCodeAt(a);return r}function S(e){if(void 0!==e.length)return e.length;u(void 0!==e.byteLength);return e.byteLength}var C=function(){function e(){}var t=["rgb(",0,",",0,",",0,")"];e.makeCssRgb=function(e,r,a){t[1]=e;t[3]=r;t[5]=a;return t.join("")};e.transform=function(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]};e.applyTransform=function(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]};e.applyInverseTransform=function(e,t){var r=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/r,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/r]};e.getAxialAlignedBoundingBox=function(t,r){var a=e.applyTransform(t,r),i=e.applyTransform(t.slice(2,4),r),n=e.applyTransform([t[0],t[3]],r),o=e.applyTransform([t[2],t[1]],r);return[Math.min(a[0],i[0],n[0],o[0]),Math.min(a[1],i[1],n[1],o[1]),Math.max(a[0],i[0],n[0],o[0]),Math.max(a[1],i[1],n[1],o[1])]};e.inverseTransform=function(e){var t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]};e.apply3dTransform=function(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2],e[3]*t[0]+e[4]*t[1]+e[5]*t[2],e[6]*t[0]+e[7]*t[1]+e[8]*t[2]]};e.singularValueDecompose2dScale=function(e){var t=[e[0],e[2],e[1],e[3]],r=e[0]*t[0]+e[1]*t[2],a=e[0]*t[1]+e[1]*t[3],i=e[2]*t[0]+e[3]*t[2],n=e[2]*t[1]+e[3]*t[3],o=(r+n)/2,s=Math.sqrt((r+n)*(r+n)-4*(r*n-i*a))/2,c=o+s||1,l=o-s||1;return[Math.sqrt(c),Math.sqrt(l)]};e.normalizeRect=function(e){var t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t};e.intersect=function(t,r){function a(e,t){return e-t}var i=[t[0],t[2],r[0],r[2]].sort(a),n=[t[1],t[3],r[1],r[3]].sort(a),o=[];t=e.normalizeRect(t);r=e.normalizeRect(r);if(!(i[0]===t[0]&&i[1]===r[0]||i[0]===r[0]&&i[1]===t[0]))return!1;o[0]=i[1];o[2]=i[2];if(!(n[0]===t[1]&&n[1]===r[1]||n[0]===r[1]&&n[1]===t[1]))return!1;o[1]=n[1];o[3]=n[2];return o};return e}(),x=["","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"];var _=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];var A,P=(A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",function(e,t){if(!(arguments.length>2&&void 0!==arguments[2]&&arguments[2])&&n.URL.createObjectURL){var r=new Blob([e],{type:t});return n.URL.createObjectURL(r)}for(var a="data:"+t+";base64,",i=0,o=e.length;i<o;i+=3){var s=255&e[i],c=255&e[i+1],l=255&e[i+2];a+=A[s>>2]+A[(3&s)<<4|c>>4]+A[i+1<o?(15&c)<<2|l>>6:64]+A[i+2<o?63&l:64]}return a});t.FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];t.IDENTITY_MATRIX=[1,0,0,1,0,0];t.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,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};t.VerbosityLevel=o;t.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"};t.AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};t.AnnotationFieldFlag={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};t.AnnotationFlag={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};t.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};t.FontType={UNKNOWN:0,TYPE1:1,TYPE1C:2,CIDFONTTYPE0:3,CIDFONTTYPE0C:4,TRUETYPE:5,CIDFONTTYPE2:6,TYPE3:7,OPENTYPE:8,TYPE0:9,MMTYPE1:10};t.ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};t.CMapCompressionType={NONE:0,BINARY:1,STREAM:2};t.AbortException=y;t.InvalidPDFException=d;t.MissingDataException=p;t.MissingPDFException=g;t.NativeImageDecoding={NONE:"none",DECODE:"decode",DISPLAY:"display"};t.PasswordException=h;t.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};t.PermissionFlag={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048};t.StreamType={UNKNOWN:0,FLATE:1,LZW:2,DCT:3,JPX:4,JBIG:5,A85:6,AHX:7,CCF:8,RL:9};t.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};t.UnexpectedResponseException=m;t.UnknownErrorException=f;t.Util=C;t.toRomanNumerals=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];u(Number.isInteger(e)&&e>0,"The number should be a positive integer.");for(var r=void 0,a=[];e>=1e3;){e-=1e3;a.push("M")}r=e/100|0;e%=100;a.push(x[r]);r=e/10|0;e%=10;a.push(x[10+r]);a.push(x[20+e]);var i=a.join("");return t?i.toLowerCase():i};t.XRefParseException=v;t.FormatError=b;t.arrayByteLength=S;t.arraysToBytes=function(e){if(1===e.length&&e[0]instanceof Uint8Array)return e[0];var t,r,a,i=0,n=e.length;for(t=0;t<n;t++)i+=a=S(r=e[t]);var o=0,s=new Uint8Array(i);for(t=0;t<n;t++){(r=e[t])instanceof Uint8Array||(r="string"==typeof r?k(r):new Uint8Array(r));a=r.byteLength;s.set(r,o);o+=a}return s};t.assert=u;t.bytesToString=function(e){u(null!==e&&"object"===(void 0===e?"undefined":a(e))&&void 0!==e.length,"Invalid argument for bytesToString");var t=e.length;if(t<8192)return String.fromCharCode.apply(null,e);for(var r=[],i=0;i<t;i+=8192){var n=Math.min(i+8192,t),o=e.subarray(i,n);r.push(String.fromCharCode.apply(null,o))}return r.join("")};t.createPromiseCapability=function(){var e={};e.promise=new Promise(function(t,r){e.resolve=t;e.reject=r});return e};t.createObjectURL=P;t.deprecated=function(e){console.log("Deprecated API usage: "+e)};t.getInheritableProperty=function(e){for(var t=e.dict,r=e.key,a=e.getArray,i=void 0!==a&&a,n=e.stopWhenFound,o=void 0===n||n,s=0,l=void 0;t;){var u=i?t.getArray(r):t.get(r);if(void 0!==u){if(o)return u;l||(l=[]);l.push(u)}if(++s>100){c('getInheritableProperty: maximum loop count exceeded for "'+r+'"');break}t=t.get("Parent")}return l};t.getLookupTableFactory=function(e){var t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}};t.getVerbosityLevel=function(){return s};t.info=function(e){s>=o.INFOS&&console.log("Info: "+e)};t.isArrayBuffer=function(e){return"object"===(void 0===e?"undefined":a(e))&&null!==e&&void 0!==e.byteLength};t.isBool=function(e){return"boolean"==typeof e};t.isEmptyObj=function(e){for(var t in e)return!1;return!0};t.isNum=function(e){return"number"==typeof e};t.isString=function(e){return"string"==typeof e};t.isSpace=function(e){return 32===e||9===e||13===e||10===e};t.isSameOrigin=function(e,t){try{var r=new n.URL(e);if(!r.origin||"null"===r.origin)return!1}catch(e){return!1}var a=new n.URL(t,r);return r.origin===a.origin};t.createValidAbsoluteUrl=function(e,t){if(!e)return null;try{var r=t?new n.URL(e,t):new n.URL(e);if(function(e){if(!e)return!1;switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(r))return r}catch(e){}return null};t.isLittleEndian=function(){var e=new Uint8Array(4);e[0]=1;return 1===new Uint32Array(e.buffer,0,1)[0]};t.isEvalSupported=function(){try{new Function("");return!0}catch(e){return!1}};t.log2=function(e){return e<=0?0:Math.ceil(Math.log2(e))};t.readInt8=function(e,t){return e[t]<<24>>24};t.readUint16=function(e,t){return e[t]<<8|e[t+1]};t.readUint32=function(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0};t.removeNullCharacters=function(e){if("string"!=typeof e){c("The argument for removeNullCharacters must be a string.");return e}return e.replace(w,"")};t.ReadableStream=i.ReadableStream;t.URL=n.URL;t.setVerbosityLevel=function(e){Number.isInteger(e)&&(s=e)};t.shadow=function(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!1});return r};t.string32=function(e){return String.fromCharCode(e>>24&255,e>>16&255,e>>8&255,255&e)};t.stringToBytes=k;t.stringToPDFString=function(e){var t,r=e.length,a=[];if("þ"===e[0]&&"ÿ"===e[1])for(t=2;t<r;t+=2)a.push(String.fromCharCode(e.charCodeAt(t)<<8|e.charCodeAt(t+1)));else for(t=0;t<r;++t){var i=_[e.charCodeAt(t)];a.push(i?String.fromCharCode(i):e.charAt(t))}return a.join("")};t.stringToUTF8String=function(e){return decodeURIComponent(escape(e))};t.utf8StringToString=function(e){return unescape(encodeURIComponent(e))};t.warn=c;t.unreachable=l},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(4);if(!i._pdfjsCompatibilityChecked){i._pdfjsCompatibilityChecked=!0;var n=r(5),o="object"===("undefined"==typeof window?"undefined":a(window))&&"object"===("undefined"==typeof document?"undefined":a(document));!i.btoa&&n()&&(i.btoa=function(e){return Buffer.from(e,"binary").toString("base64")});!i.atob&&n()&&(i.atob=function(e){return Buffer.from(e,"base64").toString("binary")});o&&("currentScript"in document||Object.defineProperty(document,"currentScript",{get:function(){var e=document.getElementsByTagName("script");return e[e.length-1]},enumerable:!0,configurable:!0}));o&&void 0===Element.prototype.remove&&(Element.prototype.remove=function(){this.parentNode&&this.parentNode.removeChild(this)});!function(){if(o&&!n()){if(!1!==document.createElement("div").classList.toggle("test",0)){var e=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t){if(arguments.length>1){var r=!!arguments[1];return this[r?"add":"remove"](t),r}return e(t)}}}}();String.prototype.includes||r(6);Array.prototype.includes||r(34);Object.assign||r(43);Math.log2||(Math.log2=r(53));Number.isNaN||(Number.isNaN=r(55));Number.isInteger||(Number.isInteger=r(57));i.Promise||(i.Promise=r(60));i.WeakMap||(i.WeakMap=r(95));String.codePointAt||(String.codePointAt=r(112));String.fromCodePoint||(String.fromCodePoint=r(114));i.Symbol||r(116);Object.values||(Object.values=r(123))}},function(e,t,r){"use strict";e.exports="undefined"!=typeof window&&window.Math===Math?window:"undefined"!=typeof global&&global.Math===Math?global:"undefined"!=typeof self&&self.Math===Math?self:{}},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=function(){return"object"===("undefined"==typeof process?"undefined":a(process))&&process+""=="[object process]"}},function(e,t,r){"use strict";r(7);e.exports=r(10).String.includes},function(e,t,r){"use strict";var a=r(8),i=r(26);a(a.P+a.F*r(33)("includes"),"String",{includes:function(e){return!!~i(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,r){"use strict";var a=r(9),i=r(10),n=r(11),o=r(21),s=r(24),c=function e(t,r,c){var l,u,h,f,d=t&e.F,g=t&e.G,m=t&e.P,p=t&e.B,v=g?a:t&e.S?a[r]||(a[r]={}):(a[r]||{}).prototype,b=g?i:i[r]||(i[r]={}),y=b.prototype||(b.prototype={});g&&(c=r);for(l in c){h=((u=!d&&v&&void 0!==v[l])?v:c)[l];f=p&&u?s(h,a):m&&"function"==typeof h?s(Function.call,h):h;v&&o(v,l,h,t&e.U);b[l]!=h&&n(b,l,f);m&&y[l]!=h&&(y[l]=h)}};a.core=i;c.F=1;c.G=2;c.S=4;c.P=8;c.B=16;c.W=32;c.U=64;c.R=128;e.exports=c},function(e,t,r){"use strict";var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},function(e,t,r){"use strict";var a=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=a)},function(e,t,r){"use strict";var a=r(12),i=r(20);e.exports=r(16)?function(e,t,r){return a.f(e,t,i(1,r))}:function(e,t,r){e[t]=r;return e}},function(e,t,r){"use strict";var a=r(13),i=r(15),n=r(19),o=Object.defineProperty;t.f=r(16)?Object.defineProperty:function(e,t,r){a(e);t=n(t,!0);a(r);if(i)try{return o(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");"value"in r&&(e[t]=r.value);return e}},function(e,t,r){"use strict";var a=r(14);e.exports=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e}},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=function(e){return"object"===(void 0===e?"undefined":a(e))?null!==e:"function"==typeof e}},function(e,t,r){"use strict";e.exports=!r(16)&&!r(17)(function(){return 7!=Object.defineProperty(r(18)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";e.exports=!r(17)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,r){"use strict";var a=r(14),i=r(9).document,n=a(i)&&a(i.createElement);e.exports=function(e){return n?i.createElement(e):{}}},function(e,t,r){"use strict";var a=r(14);e.exports=function(e,t){if(!a(e))return e;var r,i;if(t&&"function"==typeof(r=e.toString)&&!a(i=r.call(e)))return i;if("function"==typeof(r=e.valueOf)&&!a(i=r.call(e)))return i;if(!t&&"function"==typeof(r=e.toString)&&!a(i=r.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){"use strict";var a=r(9),i=r(11),n=r(22),o=r(23)("src"),s=Function.toString,c=(""+s).split("toString");r(10).inspectSource=function(e){return s.call(e)};(e.exports=function(e,t,r,s){var l="function"==typeof r;l&&(n(r,"name")||i(r,"name",t));if(e[t]!==r){l&&(n(r,o)||i(r,o,e[t]?""+e[t]:c.join(String(t))));if(e===a)e[t]=r;else if(s)e[t]?e[t]=r:i(e,t,r);else{delete e[t];i(e,t,r)}}})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||s.call(this)})},function(e,t,r){"use strict";var a={}.hasOwnProperty;e.exports=function(e,t){return a.call(e,t)}},function(e,t,r){"use strict";var a=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++a+i).toString(36))}},function(e,t,r){"use strict";var a=r(25);e.exports=function(e,t,r){a(e);if(void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,a){return e.call(t,r,a)};case 3:return function(r,a,i){return e.call(t,r,a,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,r){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,r){"use strict";var a=r(27),i=r(32);e.exports=function(e,t,r){if(a(t))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(e))}},function(e,t,r){"use strict";var a=r(14),i=r(28),n=r(29)("match");e.exports=function(e){var t;return a(e)&&(void 0!==(t=e[n])?!!t:"RegExp"==i(e))}},function(e,t,r){"use strict";var a={}.toString;e.exports=function(e){return a.call(e).slice(8,-1)}},function(e,t,r){"use strict";var a=r(30)("wks"),i=r(23),n=r(9).Symbol,o="function"==typeof n;(e.exports=function(e){return a[e]||(a[e]=o&&n[e]||(o?n:i)("Symbol."+e))}).store=a},function(e,t,r){"use strict";var a=r(10),i=r(9),n=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(e.exports=function(e,t){return n[e]||(n[e]=void 0!==t?t:{})})("versions",[]).push({version:a.version,mode:r(31)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t,r){"use strict";e.exports=!1},function(e,t,r){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){"use strict";var a=r(29)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{t[a]=!1;return!"/./"[e](t)}catch(e){}}return!0}},function(e,t,r){"use strict";r(35);e.exports=r(10).Array.includes},function(e,t,r){"use strict";var a=r(8),i=r(36)(!0);a(a.P,"Array",{includes:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}});r(42)("includes")},function(e,t,r){"use strict";var a=r(37),i=r(39),n=r(41);e.exports=function(e){return function(t,r,o){var s,c=a(t),l=i(c.length),u=n(o,l);if(e&&r!=r){for(;l>u;)if((s=c[u++])!=s)return!0}else for(;l>u;u++)if((e||u in c)&&c[u]===r)return e||u||0;return!e&&-1}}},function(e,t,r){"use strict";var a=r(38),i=r(32);e.exports=function(e){return a(i(e))}},function(e,t,r){"use strict";var a=r(28);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t,r){"use strict";var a=r(40),i=Math.min;e.exports=function(e){return e>0?i(a(e),9007199254740991):0}},function(e,t,r){"use strict";var a=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:a)(e)}},function(e,t,r){"use strict";var a=r(40),i=Math.max,n=Math.min;e.exports=function(e,t){return(e=a(e))<0?i(e+t,0):n(e,t)}},function(e,t,r){"use strict";var a=r(29)("unscopables"),i=Array.prototype;void 0==i[a]&&r(11)(i,a,{});e.exports=function(e){i[a][e]=!0}},function(e,t,r){"use strict";r(44);e.exports=r(10).Object.assign},function(e,t,r){"use strict";var a=r(8);a(a.S+a.F,"Object",{assign:r(45)})},function(e,t,r){"use strict";var a=r(46),i=r(50),n=r(51),o=r(52),s=r(38),c=Object.assign;e.exports=!c||r(17)(function(){var e={},t={},r=Symbol(),a="abcdefghijklmnopqrst";e[r]=7;a.split("").forEach(function(e){t[e]=e});return 7!=c({},e)[r]||Object.keys(c({},t)).join("")!=a})?function(e,t){for(var r=o(e),c=arguments.length,l=1,u=i.f,h=n.f;c>l;)for(var f,d=s(arguments[l++]),g=u?a(d).concat(u(d)):a(d),m=g.length,p=0;m>p;)h.call(d,f=g[p++])&&(r[f]=d[f]);return r}:c},function(e,t,r){"use strict";var a=r(47),i=r(49);e.exports=Object.keys||function(e){return a(e,i)}},function(e,t,r){"use strict";var a=r(22),i=r(37),n=r(36)(!1),o=r(48)("IE_PROTO");e.exports=function(e,t){var r,s=i(e),c=0,l=[];for(r in s)r!=o&&a(s,r)&&l.push(r);for(;t.length>c;)a(s,r=t[c++])&&(~n(l,r)||l.push(r));return l}},function(e,t,r){"use strict";var a=r(30)("keys"),i=r(23);e.exports=function(e){return a[e]||(a[e]=i(e))}},function(e,t,r){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,r){"use strict";t.f={}.propertyIsEnumerable},function(e,t,r){"use strict";var a=r(32);e.exports=function(e){return Object(a(e))}},function(e,t,r){"use strict";r(54);e.exports=r(10).Math.log2},function(e,t,r){"use strict";var a=r(8);a(a.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,r){"use strict";r(56);e.exports=r(10).Number.isNaN},function(e,t,r){"use strict";var a=r(8);a(a.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,r){"use strict";r(58);e.exports=r(10).Number.isInteger},function(e,t,r){"use strict";var a=r(8);a(a.S,"Number",{isInteger:r(59)})},function(e,t,r){"use strict";var a=r(14),i=Math.floor;e.exports=function(e){return!a(e)&&isFinite(e)&&i(e)===e}},function(e,t,r){"use strict";r(61);r(63);r(73);r(76);r(93);r(94);e.exports=r(10).Promise},function(e,t,r){"use strict";var a=r(62),i={};i[r(29)("toStringTag")]="z";i+""!="[object z]"&&r(21)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},function(e,t,r){"use strict";var a=r(28),i=r(29)("toStringTag"),n="Arguments"==a(function(){return arguments}());e.exports=function(e){var t,r,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?r:n?a(t):"Object"==(o=a(t))&&"function"==typeof t.callee?"Arguments":o}},function(e,t,r){"use strict";var a=r(64)(!0);r(65)(String,"String",function(e){this._t=String(e);this._i=0},function(){var e,t=this._t,r=this._i;if(r>=t.length)return{value:void 0,done:!0};e=a(t,r);this._i+=e.length;return{value:e,done:!1}})},function(e,t,r){"use strict";var a=r(40),i=r(32);e.exports=function(e){return function(t,r){var n,o,s=String(i(t)),c=a(r),l=s.length;return c<0||c>=l?e?"":void 0:(n=s.charCodeAt(c))<55296||n>56319||c+1===l||(o=s.charCodeAt(c+1))<56320||o>57343?e?s.charAt(c):n:e?s.slice(c,c+2):o-56320+(n-55296<<10)+65536}}},function(e,t,r){"use strict";var a=r(31),i=r(8),n=r(21),o=r(11),s=r(66),c=r(67),l=r(71),u=r(72),h=r(29)("iterator"),f=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,t,r,g,m,p,v){c(r,t,g);var b,y,w,k=function(e){if(!f&&e in _)return _[e];switch(e){case"keys":case"values":return function(){return new r(this,e)}}return function(){return new r(this,e)}},S=t+" Iterator",C="values"==m,x=!1,_=e.prototype,A=_[h]||_["@@iterator"]||m&&_[m],P=A||k(m),I=m?C?k("entries"):P:void 0,O="Array"==t&&_.entries||A;if(O&&(w=u(O.call(new e)))!==Object.prototype&&w.next){l(w,S,!0);a||"function"==typeof w[h]||o(w,h,d)}if(C&&A&&"values"!==A.name){x=!0;P=function(){return A.call(this)}}a&&!v||!f&&!x&&_[h]||o(_,h,P);s[t]=P;s[S]=d;if(m){b={values:C?P:k("values"),keys:p?P:k("keys"),entries:I};if(v)for(y in b)y in _||n(_,y,b[y]);else i(i.P+i.F*(f||x),t,b)}return b}},function(e,t,r){"use strict";e.exports={}},function(e,t,r){"use strict";var a=r(68),i=r(20),n=r(71),o={};r(11)(o,r(29)("iterator"),function(){return this});e.exports=function(e,t,r){e.prototype=a(o,{next:i(1,r)});n(e,t+" Iterator")}},function(e,t,r){"use strict";var a=r(13),i=r(69),n=r(49),o=r(48)("IE_PROTO"),s=function(){},c=function(){var e,t=r(18)("iframe"),a=n.length;t.style.display="none";r(70).appendChild(t);t.src="javascript:";(e=t.contentWindow.document).open();e.write("<script>document.F=Object<\/script>");e.close();c=e.F;for(;a--;)delete c.prototype[n[a]];return c()};e.exports=Object.create||function(e,t){var r;if(null!==e){s.prototype=a(e);r=new s;s.prototype=null;r[o]=e}else r=c();return void 0===t?r:i(r,t)}},function(e,t,r){"use strict";var a=r(12),i=r(13),n=r(46);e.exports=r(16)?Object.defineProperties:function(e,t){i(e);for(var r,o=n(t),s=o.length,c=0;s>c;)a.f(e,r=o[c++],t[r]);return e}},function(e,t,r){"use strict";var a=r(9).document;e.exports=a&&a.documentElement},function(e,t,r){"use strict";var a=r(12).f,i=r(22),n=r(29)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,n)&&a(e,n,{configurable:!0,value:t})}},function(e,t,r){"use strict";var a=r(22),i=r(52),n=r(48)("IE_PROTO"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(e){e=i(e);return a(e,n)?e[n]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},function(e,t,r){"use strict";for(var a=r(74),i=r(46),n=r(21),o=r(9),s=r(11),c=r(66),l=r(29),u=l("iterator"),h=l("toStringTag"),f=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},g=i(d),m=0;m<g.length;m++){var p,v=g[m],b=d[v],y=o[v],w=y&&y.prototype;if(w){w[u]||s(w,u,f);w[h]||s(w,h,v);c[v]=f;if(b)for(p in a)w[p]||n(w,p,a[p],!0)}}},function(e,t,r){"use strict";var a=r(42),i=r(75),n=r(66),o=r(37);e.exports=r(65)(Array,"Array",function(e,t){this._t=o(e);this._i=0;this._k=t},function(){var e=this._t,t=this._k,r=this._i++;if(!e||r>=e.length){this._t=void 0;return i(1)}return i(0,"keys"==t?r:"values"==t?e[r]:[r,e[r]])},"values");n.Arguments=n.Array;a("keys");a("values");a("entries")},function(e,t,r){"use strict";e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){"use strict";var a,i,n,o,s=r(31),c=r(9),l=r(24),u=r(62),h=r(8),f=r(14),d=r(25),g=r(77),m=r(78),p=r(82),v=r(83).set,b=r(85)(),y=r(86),w=r(87),k=r(88),S=r(89),C=c.TypeError,x=c.process,_=x&&x.versions,A=_&&_.v8||"",P=c.Promise,I="process"==u(x),O=function(){},T=i=y.f,E=!!function(){try{var e=P.resolve(1),t=(e.constructor={})[r(29)("species")]=function(e){e(O,O)};return(I||"function"==typeof PromiseRejectionEvent)&&e.then(O)instanceof t&&0!==A.indexOf("6.6")&&-1===k.indexOf("Chrome/66")}catch(e){}}(),F=function(e){var t;return!(!f(e)||"function"!=typeof(t=e.then))&&t},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;b(function(){for(var a=e._v,i=1==e._s,n=0,o=function(t){var r,n,o,s=i?t.ok:t.fail,c=t.resolve,l=t.reject,u=t.domain;try{if(s){if(!i){2==e._h&&M(e);e._h=1}if(!0===s)r=a;else{u&&u.enter();r=s(a);if(u){u.exit();o=!0}}r===t.promise?l(C("Promise-chain cycle")):(n=F(r))?n.call(r,c,l):c(r)}else l(a)}catch(e){u&&!o&&u.exit();l(e)}};r.length>n;)o(r[n++]);e._c=[];e._n=!1;t&&!e._h&&B(e)})}},B=function(e){v.call(c,function(){var t,r,a,i=e._v,n=D(e);if(n){t=w(function(){I?x.emit("unhandledRejection",i,e):(r=c.onunhandledrejection)?r({promise:e,reason:i}):(a=c.console)&&a.error&&a.error("Unhandled promise rejection",i)});e._h=I||D(e)?2:1}e._a=void 0;if(n&&t.e)throw t.v})},D=function(e){return 1!==e._h&&0===(e._a||e._c).length},M=function(e){v.call(c,function(){var t;I?x.emit("rejectionHandled",e):(t=c.onrejectionhandled)&&t({promise:e,reason:e._v})})},L=function(e){var t=this;if(!t._d){t._d=!0;(t=t._w||t)._v=e;t._s=2;t._a||(t._a=t._c.slice());R(t,!0)}},N=function e(t){var r,a=this;if(!a._d){a._d=!0;a=a._w||a;try{if(a===t)throw C("Promise can't be resolved itself");if(r=F(t))b(function(){var i={_w:a,_d:!1};try{r.call(t,l(e,i,1),l(L,i,1))}catch(e){L.call(i,e)}});else{a._v=t;a._s=1;R(a,!1)}}catch(e){L.call({_w:a,_d:!1},e)}}};if(!E){P=function(e){g(this,P,"Promise","_h");d(e);a.call(this);try{e(l(N,this,1),l(L,this,1))}catch(e){L.call(this,e)}};(a=function(e){this._c=[];this._a=void 0;this._s=0;this._d=!1;this._v=void 0;this._h=0;this._n=!1}).prototype=r(90)(P.prototype,{then:function(e,t){var r=T(p(this,P));r.ok="function"!=typeof e||e;r.fail="function"==typeof t&&t;r.domain=I?x.domain:void 0;this._c.push(r);this._a&&this._a.push(r);this._s&&R(this,!1);return r.promise},catch:function(e){return this.then(void 0,e)}});n=function(){var e=new a;this.promise=e;this.resolve=l(N,e,1);this.reject=l(L,e,1)};y.f=T=function(e){return e===P||e===o?new n(e):i(e)}}h(h.G+h.W+h.F*!E,{Promise:P});r(71)(P,"Promise");r(91)("Promise");o=r(10).Promise;h(h.S+h.F*!E,"Promise",{reject:function(e){var t=T(this);(0,t.reject)(e);return t.promise}});h(h.S+h.F*(s||!E),"Promise",{resolve:function(e){return S(s&&this===o?P:this,e)}});h(h.S+h.F*!(E&&r(92)(function(e){P.all(e).catch(O)})),"Promise",{all:function(e){var t=this,r=T(t),a=r.resolve,i=r.reject,n=w(function(){var r=[],n=0,o=1;m(e,!1,function(e){var s=n++,c=!1;r.push(void 0);o++;t.resolve(e).then(function(e){if(!c){c=!0;r[s]=e;--o||a(r)}},i)});--o||a(r)});n.e&&i(n.v);return r.promise},race:function(e){var t=this,r=T(t),a=r.reject,i=w(function(){m(e,!1,function(e){t.resolve(e).then(r.resolve,a)})});i.e&&a(i.v);return r.promise}})},function(e,t,r){"use strict";e.exports=function(e,t,r,a){if(!(e instanceof t)||void 0!==a&&a in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){"use strict";var a=r(24),i=r(79),n=r(80),o=r(13),s=r(39),c=r(81),l={},u={},h=e.exports=function(e,t,r,h,f){var d,g,m,p,v=f?function(){return e}:c(e),b=a(r,h,t?2:1),y=0;if("function"!=typeof v)throw TypeError(e+" is not iterable!");if(n(v)){for(d=s(e.length);d>y;y++)if((p=t?b(o(g=e[y])[0],g[1]):b(e[y]))===l||p===u)return p}else for(m=v.call(e);!(g=m.next()).done;)if((p=i(m,b,g.value,t))===l||p===u)return p};h.BREAK=l;h.RETURN=u},function(e,t,r){"use strict";var a=r(13);e.exports=function(e,t,r,i){try{return i?t(a(r)[0],r[1]):t(r)}catch(t){var n=e.return;void 0!==n&&a(n.call(e));throw t}}},function(e,t,r){"use strict";var a=r(66),i=r(29)("iterator"),n=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||n[i]===e)}},function(e,t,r){"use strict";var a=r(62),i=r(29)("iterator"),n=r(66);e.exports=r(10).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e["@@iterator"]||n[a(e)]}},function(e,t,r){"use strict";var a=r(13),i=r(25),n=r(29)("species");e.exports=function(e,t){var r,o=a(e).constructor;return void 0===o||void 0==(r=a(o)[n])?t:i(r)}},function(e,t,r){"use strict";var a,i,n,o=r(24),s=r(84),c=r(70),l=r(18),u=r(9),h=u.process,f=u.setImmediate,d=u.clearImmediate,g=u.MessageChannel,m=u.Dispatch,p=0,v={},b=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e];t()}},y=function(e){b.call(e.data)};if(!f||!d){f=function(e){for(var t=[],r=1;arguments.length>r;)t.push(arguments[r++]);v[++p]=function(){s("function"==typeof e?e:Function(e),t)};a(p);return p};d=function(e){delete v[e]};if("process"==r(28)(h))a=function(e){h.nextTick(o(b,e,1))};else if(m&&m.now)a=function(e){m.now(o(b,e,1))};else if(g){n=(i=new g).port2;i.port1.onmessage=y;a=o(n.postMessage,n,1)}else if(u.addEventListener&&"function"==typeof postMessage&&!u.importScripts){a=function(e){u.postMessage(e+"","*")};u.addEventListener("message",y,!1)}else a="onreadystatechange"in l("script")?function(e){c.appendChild(l("script")).onreadystatechange=function(){c.removeChild(this);b.call(e)}}:function(e){setTimeout(o(b,e,1),0)}}e.exports={set:f,clear:d}},function(e,t,r){"use strict";e.exports=function(e,t,r){var a=void 0===r;switch(t.length){case 0:return a?e():e.call(r);case 1:return a?e(t[0]):e.call(r,t[0]);case 2:return a?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return a?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return a?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},function(e,t,r){"use strict";var a=r(9),i=r(83).set,n=a.MutationObserver||a.WebKitMutationObserver,o=a.process,s=a.Promise,c="process"==r(28)(o);e.exports=function(){var e,t,r,l=function(){var a,i;c&&(a=o.domain)&&a.exit();for(;e;){i=e.fn;e=e.next;try{i()}catch(a){e?r():t=void 0;throw a}}t=void 0;a&&a.enter()};if(c)r=function(){o.nextTick(l)};else if(!n||a.navigator&&a.navigator.standalone)if(s&&s.resolve){var u=s.resolve(void 0);r=function(){u.then(l)}}else r=function(){i.call(a,l)};else{var h=!0,f=document.createTextNode("");new n(l).observe(f,{characterData:!0});r=function(){f.data=h=!h}}return function(a){var i={fn:a,next:void 0};t&&(t.next=i);if(!e){e=i;r()}t=i}}},function(e,t,r){"use strict";var a=r(25);e.exports.f=function(e){return new function(e){var t,r;this.promise=new e(function(e,a){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e;r=a});this.resolve=a(t);this.reject=a(r)}(e)}},function(e,t,r){"use strict";e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,r){"use strict";var a=r(9).navigator;e.exports=a&&a.userAgent||""},function(e,t,r){"use strict";var a=r(13),i=r(14),n=r(86);e.exports=function(e,t){a(e);if(i(t)&&t.constructor===e)return t;var r=n.f(e);(0,r.resolve)(t);return r.promise}},function(e,t,r){"use strict";var a=r(21);e.exports=function(e,t,r){for(var i in t)a(e,i,t[i],r);return e}},function(e,t,r){"use strict";var a=r(9),i=r(12),n=r(16),o=r(29)("species");e.exports=function(e){var t=a[e];n&&t&&!t[o]&&i.f(t,o,{configurable:!0,get:function(){return this}})}},function(e,t,r){"use strict";var a=r(29)("iterator"),i=!1;try{var n=[7][a]();n.return=function(){i=!0};Array.from(n,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var n=[7],o=n[a]();o.next=function(){return{done:r=!0}};n[a]=function(){return o};e(n)}catch(e){}return r}},function(e,t,r){"use strict";var a=r(8),i=r(10),n=r(9),o=r(82),s=r(89);a(a.P+a.R,"Promise",{finally:function(e){var t=o(this,i.Promise||n.Promise),r="function"==typeof e;return this.then(r?function(r){return s(t,e()).then(function(){return r})}:e,r?function(r){return s(t,e()).then(function(){throw r})}:e)}})},function(e,t,r){"use strict";var a=r(8),i=r(86),n=r(87);a(a.S,"Promise",{try:function(e){var t=i.f(this),r=n(e);(r.e?t.reject:t.resolve)(r.v);return t.promise}})},function(e,t,r){"use strict";r(61);r(73);r(96);r(108);r(110);e.exports=r(10).WeakMap},function(e,t,r){"use strict";var a,i=r(97)(0),n=r(21),o=r(101),s=r(45),c=r(102),l=r(14),u=r(17),h=r(103),f=o.getWeak,d=Object.isExtensible,g=c.ufstore,m={},p=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},v={get:function(e){if(l(e)){var t=f(e);return!0===t?g(h(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return c.def(h(this,"WeakMap"),e,t)}},b=e.exports=r(104)("WeakMap",p,v,c,!0,!0);if(u(function(){return 7!=(new b).set((Object.freeze||Object)(m),7).get(m)})){s((a=c.getConstructor(p,"WeakMap")).prototype,v);o.NEED=!0;i(["delete","has","get","set"],function(e){var t=b.prototype,r=t[e];n(t,e,function(t,i){if(l(t)&&!d(t)){this._f||(this._f=new a);var n=this._f[e](t,i);return"set"==e?this:n}return r.call(this,t,i)})})}},function(e,t,r){"use strict";var a=r(24),i=r(38),n=r(52),o=r(39),s=r(98);e.exports=function(e,t){var r=1==e,c=2==e,l=3==e,u=4==e,h=6==e,f=5==e||h,d=t||s;return function(t,s,g){for(var m,p,v=n(t),b=i(v),y=a(s,g,3),w=o(b.length),k=0,S=r?d(t,w):c?d(t,0):void 0;w>k;k++)if(f||k in b){p=y(m=b[k],k,v);if(e)if(r)S[k]=p;else if(p)switch(e){case 3:return!0;case 5:return m;case 6:return k;case 2:S.push(m)}else if(u)return!1}return h?-1:l||u?u:S}}},function(e,t,r){"use strict";var a=r(99);e.exports=function(e,t){return new(a(e))(t)}},function(e,t,r){"use strict";var a=r(14),i=r(100),n=r(29)("species");e.exports=function(e){var t;if(i(e)){"function"!=typeof(t=e.constructor)||t!==Array&&!i(t.prototype)||(t=void 0);a(t)&&null===(t=t[n])&&(t=void 0)}return void 0===t?Array:t}},function(e,t,r){"use strict";var a=r(28);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(23)("meta"),n=r(14),o=r(22),s=r(12).f,c=0,l=Object.isExtensible||function(){return!0},u=!r(17)(function(){return l(Object.preventExtensions({}))}),h=function(e){s(e,i,{value:{i:"O"+ ++c,w:{}}})},f=e.exports={KEY:i,NEED:!1,fastKey:function(e,t){if(!n(e))return"symbol"==(void 0===e?"undefined":a(e))?e:("string"==typeof e?"S":"P")+e;if(!o(e,i)){if(!l(e))return"F";if(!t)return"E";h(e)}return e[i].i},getWeak:function(e,t){if(!o(e,i)){if(!l(e))return!0;if(!t)return!1;h(e)}return e[i].w},onFreeze:function(e){u&&f.NEED&&l(e)&&!o(e,i)&&h(e);return e}}},function(e,t,r){"use strict";var a=r(90),i=r(101).getWeak,n=r(13),o=r(14),s=r(77),c=r(78),l=r(97),u=r(22),h=r(103),f=l(5),d=l(6),g=0,m=function(e){return e._l||(e._l=new p)},p=function(){this.a=[]},v=function(e,t){return f(e.a,function(e){return e[0]===t})};p.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var r=v(this,e);r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=d(this.a,function(t){return t[0]===e});~t&&this.a.splice(t,1);return!!~t}};e.exports={getConstructor:function(e,t,r,n){var l=e(function(e,a){s(e,l,t,"_i");e._t=t;e._i=g++;e._l=void 0;void 0!=a&&c(a,r,e[n],e)});a(l.prototype,{delete:function(e){if(!o(e))return!1;var r=i(e);return!0===r?m(h(this,t)).delete(e):r&&u(r,this._i)&&delete r[this._i]},has:function(e){if(!o(e))return!1;var r=i(e);return!0===r?m(h(this,t)).has(e):r&&u(r,this._i)}});return l},def:function(e,t,r){var a=i(n(t),!0);!0===a?m(e).set(t,r):a[e._i]=r;return e},ufstore:m}},function(e,t,r){"use strict";var a=r(14);e.exports=function(e,t){if(!a(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){"use strict";var a=r(9),i=r(8),n=r(21),o=r(90),s=r(101),c=r(78),l=r(77),u=r(14),h=r(17),f=r(92),d=r(71),g=r(105);e.exports=function(e,t,r,m,p,v){var b=a[e],y=b,w=p?"set":"add",k=y&&y.prototype,S={},C=function(e){var t=k[e];n(k,e,"delete"==e?function(e){return!(v&&!u(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!u(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return v&&!u(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){t.call(this,0===e?0:e);return this}:function(e,r){t.call(this,0===e?0:e,r);return this})};if("function"==typeof y&&(v||k.forEach&&!h(function(){(new y).entries().next()}))){var x=new y,_=x[w](v?{}:-0,1)!=x,A=h(function(){x.has(1)}),P=f(function(e){new y(e)}),I=!v&&h(function(){for(var e=new y,t=5;t--;)e[w](t,t);return!e.has(-0)});if(!P){(y=t(function(t,r){l(t,y,e);var a=g(new b,t,y);void 0!=r&&c(r,p,a[w],a);return a})).prototype=k;k.constructor=y}if(A||I){C("delete");C("has");p&&C("get")}(I||_)&&C(w);v&&k.clear&&delete k.clear}else{y=m.getConstructor(t,e,p,w);o(y.prototype,r);s.NEED=!0}d(y,e);S[e]=y;i(i.G+i.W+i.F*(y!=b),S);v||m.setStrong(y,e,p);return y}},function(e,t,r){"use strict";var a=r(14),i=r(106).set;e.exports=function(e,t,r){var n,o=t.constructor;o!==r&&"function"==typeof o&&(n=o.prototype)!==r.prototype&&a(n)&&i&&i(e,n);return e}},function(e,t,r){"use strict";var a=r(14),i=r(13),n=function(e,t){i(e);if(!a(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,a){try{(a=r(24)(Function.call,r(107).f(Object.prototype,"__proto__").set,2))(e,[]);t=!(e instanceof Array)}catch(e){t=!0}return function(e,r){n(e,r);t?e.__proto__=r:a(e,r);return e}}({},!1):void 0),check:n}},function(e,t,r){"use strict";var a=r(51),i=r(20),n=r(37),o=r(19),s=r(22),c=r(15),l=Object.getOwnPropertyDescriptor;t.f=r(16)?l:function(e,t){e=n(e);t=o(t,!0);if(c)try{return l(e,t)}catch(e){}if(s(e,t))return i(!a.f.call(e,t),e[t])}},function(e,t,r){"use strict";r(109)("WeakMap")},function(e,t,r){"use strict";var a=r(8);e.exports=function(e){a(a.S,e,{of:function(){for(var e=arguments.length,t=new Array(e);e--;)t[e]=arguments[e];return new this(t)}})}},function(e,t,r){"use strict";r(111)("WeakMap")},function(e,t,r){"use strict";var a=r(8),i=r(25),n=r(24),o=r(78);e.exports=function(e){a(a.S,e,{from:function(e){var t,r,a,s,c=arguments[1];i(this);(t=void 0!==c)&&i(c);if(void 0==e)return new this;r=[];if(t){a=0;s=n(c,arguments[2],2);o(e,!1,function(e){r.push(s(e,a++))})}else o(e,!1,r.push,r);return new this(r)}})}},function(e,t,r){"use strict";r(113);e.exports=r(10).String.codePointAt},function(e,t,r){"use strict";var a=r(8),i=r(64)(!1);a(a.P,"String",{codePointAt:function(e){return i(this,e)}})},function(e,t,r){"use strict";r(115);e.exports=r(10).String.fromCodePoint},function(e,t,r){"use strict";var a=r(8),i=r(41),n=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(e){for(var t,r=[],a=arguments.length,o=0;a>o;){t=+arguments[o++];if(i(t,1114111)!==t)throw RangeError(t+" is not a valid code point");r.push(t<65536?n(t):n(55296+((t-=65536)>>10),t%1024+56320))}return r.join("")}})},function(e,t,r){"use strict";r(117);r(61);e.exports=r(10).Symbol},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(9),n=r(22),o=r(16),s=r(8),c=r(21),l=r(101).KEY,u=r(17),h=r(30),f=r(71),d=r(23),g=r(29),m=r(118),p=r(119),v=r(120),b=r(100),y=r(13),w=r(14),k=r(37),S=r(19),C=r(20),x=r(68),_=r(121),A=r(107),P=r(12),I=r(46),O=A.f,T=P.f,E=_.f,F=i.Symbol,R=i.JSON,B=R&&R.stringify,D=g("_hidden"),M=g("toPrimitive"),L={}.propertyIsEnumerable,N=h("symbol-registry"),U=h("symbols"),q=h("op-symbols"),j=Object.prototype,z="function"==typeof F,H=i.QObject,G=!H||!H.prototype||!H.prototype.findChild,W=o&&u(function(){return 7!=x(T({},"a",{get:function(){return T(this,"a",{value:7}).a}})).a})?function(e,t,r){var a=O(j,t);a&&delete j[t];T(e,t,r);a&&e!==j&&T(j,t,a)}:T,X=function(e){var t=U[e]=x(F.prototype);t._k=e;return t},V=z&&"symbol"==a(F.iterator)?function(e){return"symbol"==(void 0===e?"undefined":a(e))}:function(e){return e instanceof F},K=function(e,t,r){e===j&&K(q,t,r);y(e);t=S(t,!0);y(r);if(n(U,t)){if(r.enumerable){n(e,D)&&e[D][t]&&(e[D][t]=!1);r=x(r,{enumerable:C(0,!1)})}else{n(e,D)||T(e,D,C(1,{}));e[D][t]=!0}return W(e,t,r)}return T(e,t,r)},Y=function(e,t){y(e);for(var r,a=v(t=k(t)),i=0,n=a.length;n>i;)K(e,r=a[i++],t[r]);return e},J=function(e){var t=L.call(this,e=S(e,!0));return!(this===j&&n(U,e)&&!n(q,e))&&(!(t||!n(this,e)||!n(U,e)||n(this,D)&&this[D][e])||t)},Z=function(e,t){e=k(e);t=S(t,!0);if(e!==j||!n(U,t)||n(q,t)){var r=O(e,t);!r||!n(U,t)||n(e,D)&&e[D][t]||(r.enumerable=!0);return r}},Q=function(e){for(var t,r=E(k(e)),a=[],i=0;r.length>i;)n(U,t=r[i++])||t==D||t==l||a.push(t);return a},$=function(e){for(var t,r=e===j,a=E(r?q:k(e)),i=[],o=0;a.length>o;)!n(U,t=a[o++])||r&&!n(j,t)||i.push(U[t]);return i};if(!z){c((F=function(){if(this instanceof F)throw TypeError("Symbol is not a constructor!");var e=d(arguments.length>0?arguments[0]:void 0);o&&G&&W(j,e,{configurable:!0,set:function t(r){this===j&&t.call(q,r);n(this,D)&&n(this[D],e)&&(this[D][e]=!1);W(this,e,C(1,r))}});return X(e)}).prototype,"toString",function(){return this._k});A.f=Z;P.f=K;r(122).f=_.f=Q;r(51).f=J;r(50).f=$;o&&!r(31)&&c(j,"propertyIsEnumerable",J,!0);m.f=function(e){return X(g(e))}}s(s.G+s.W+s.F*!z,{Symbol:F});for(var ee="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),te=0;ee.length>te;)g(ee[te++]);for(var re=I(g.store),ae=0;re.length>ae;)p(re[ae++]);s(s.S+s.F*!z,"Symbol",{for:function(e){return n(N,e+="")?N[e]:N[e]=F(e)},keyFor:function(e){if(!V(e))throw TypeError(e+" is not a symbol!");for(var t in N)if(N[t]===e)return t},useSetter:function(){G=!0},useSimple:function(){G=!1}});s(s.S+s.F*!z,"Object",{create:function(e,t){return void 0===t?x(e):Y(x(e),t)},defineProperty:K,defineProperties:Y,getOwnPropertyDescriptor:Z,getOwnPropertyNames:Q,getOwnPropertySymbols:$});R&&s(s.S+s.F*(!z||u(function(){var e=F();return"[null]"!=B([e])||"{}"!=B({a:e})||"{}"!=B(Object(e))})),"JSON",{stringify:function(e){for(var t,r,a=[e],i=1;arguments.length>i;)a.push(arguments[i++]);r=t=a[1];if((w(t)||void 0!==e)&&!V(e)){b(t)||(t=function(e,t){"function"==typeof r&&(t=r.call(this,e,t));if(!V(t))return t});a[1]=t;return B.apply(R,a)}}});F.prototype[M]||r(11)(F.prototype,M,F.prototype.valueOf);f(F,"Symbol");f(Math,"Math",!0);f(i.JSON,"JSON",!0)},function(e,t,r){"use strict";t.f=r(29)},function(e,t,r){"use strict";var a=r(9),i=r(10),n=r(31),o=r(118),s=r(12).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=n?{}:a.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:o.f(e)})}},function(e,t,r){"use strict";var a=r(46),i=r(50),n=r(51);e.exports=function(e){var t=a(e),r=i.f;if(r)for(var o,s=r(e),c=n.f,l=0;s.length>l;)c.call(e,o=s[l++])&&t.push(o);return t}},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(37),n=r(122).f,o={}.toString,s="object"==("undefined"==typeof window?"undefined":a(window))&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"[object Window]"==o.call(e)?function(e){try{return n(e)}catch(e){return s.slice()}}(e):n(i(e))}},function(e,t,r){"use strict";var a=r(47),i=r(49).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,i)}},function(e,t,r){"use strict";r(124);e.exports=r(10).Object.values},function(e,t,r){"use strict";var a=r(8),i=r(125)(!1);a(a.S,"Object",{values:function(e){return i(e)}})},function(e,t,r){"use strict";var a=r(46),i=r(37),n=r(51).f;e.exports=function(e){return function(t){for(var r,o=i(t),s=a(o),c=s.length,l=0,u=[];c>l;)n.call(o,r=s[l++])&&u.push(e?[r,o[r]]:o[r]);return u}}},function(e,t,r){"use strict";var a=!1;if("undefined"!=typeof ReadableStream)try{new ReadableStream({start:function(e){e.close()}});a=!0}catch(e){}t.ReadableStream=a?ReadableStream:r(127).ReadableStream},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(e,t){for(var r in t)e[r]=t[r]}(t,function(e){var t={};function r(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};e[a].call(i.exports,i,i.exports,r);i.l=!0;return i.exports}r.m=e;r.c=t;r.i=function(e){return e};r.d=function(e,t,a){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a})};r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};r.d(t,"a",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p="";return r(r.s=7)}([function(e,t,r){var i="function"==typeof Symbol&&"symbol"===a(Symbol.iterator)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":a(e)},n=r(1).assert;function o(e){return"string"==typeof e||"symbol"===(void 0===e?"undefined":i(e))}t.typeIsObject=function(e){return"object"===(void 0===e?"undefined":i(e))&&null!==e||"function"==typeof e};t.createDataProperty=function(e,r,a){n(t.typeIsObject(e));Object.defineProperty(e,r,{value:a,writable:!0,enumerable:!0,configurable:!0})};t.createArrayFromList=function(e){return e.slice()};t.ArrayBufferCopy=function(e,t,r,a,i){new Uint8Array(e).set(new Uint8Array(r,a,i),t)};t.CreateIterResultObject=function(e,t){n("boolean"==typeof t);var r={};Object.defineProperty(r,"value",{value:e,enumerable:!0,writable:!0,configurable:!0});Object.defineProperty(r,"done",{value:t,enumerable:!0,writable:!0,configurable:!0});return r};t.IsFiniteNonNegativeNumber=function(e){return!Number.isNaN(e)&&(e!==1/0&&!(e<0))};function s(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}t.InvokeOrNoop=function(e,t,r){n(void 0!==e);n(o(t));n(Array.isArray(r));var a=e[t];if(void 0!==a)return s(a,e,r)};t.PromiseInvokeOrNoop=function(e,r,a){n(void 0!==e);n(o(r));n(Array.isArray(a));try{return Promise.resolve(t.InvokeOrNoop(e,r,a))}catch(e){return Promise.reject(e)}};t.PromiseInvokeOrPerformFallback=function(e,t,r,a,i){n(void 0!==e);n(o(t));n(Array.isArray(r));n(Array.isArray(i));var c=void 0;try{c=e[t]}catch(e){return Promise.reject(e)}if(void 0===c)return a.apply(null,i);try{return Promise.resolve(s(c,e,r))}catch(e){return Promise.reject(e)}};t.TransferArrayBuffer=function(e){return e.slice()};t.ValidateAndNormalizeHighWaterMark=function(e){e=Number(e);if(Number.isNaN(e)||e<0)throw new RangeError("highWaterMark property of a queuing strategy must be non-negative and non-NaN");return e};t.ValidateAndNormalizeQueuingStrategy=function(e,r){if(void 0!==e&&"function"!=typeof e)throw new TypeError("size property of a queuing strategy must be a function");return{size:e,highWaterMark:r=t.ValidateAndNormalizeHighWaterMark(r)}}},function(e,t,r){function a(e){this.name="AssertionError";this.message=e||"";this.stack=(new Error).stack}a.prototype=Object.create(Error.prototype);a.prototype.constructor=a;e.exports={rethrowAssertionErrorRejection:function(e){e&&e.constructor===a&&setTimeout(function(){throw e},0)},AssertionError:a,assert:function(e,t){if(!e)throw new a(t)}}},function(e,t,r){var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var n=r(0),o=n.InvokeOrNoop,s=n.PromiseInvokeOrNoop,c=n.ValidateAndNormalizeQueuingStrategy,l=n.typeIsObject,u=r(1),h=u.assert,f=u.rethrowAssertionErrorRejection,d=r(3),g=d.DequeueValue,m=d.EnqueueValueWithSize,p=d.PeekQueueValue,v=d.ResetQueue,b=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=r.size,n=r.highWaterMark,o=void 0===n?1:n;i(this,e);this._state="writable";this._storedError=void 0;this._writer=void 0;this._writableStreamController=void 0;this._writeRequests=[];this._inFlightWriteRequest=void 0;this._closeRequest=void 0;this._inFlightCloseRequest=void 0;this._pendingAbortRequest=void 0;this._backpressure=!1;if(void 0!==t.type)throw new RangeError("Invalid type is specified");this._writableStreamController=new N(this,t,a,o);this._writableStreamController.__startSteps()}a(e,[{key:"abort",value:function(e){return!1===w(this)?Promise.reject(G("abort")):!0===k(this)?Promise.reject(new TypeError("Cannot abort a stream that already has a writer")):S(this,e)}},{key:"getWriter",value:function(){if(!1===w(this))throw G("getWriter");return y(this)}},{key:"locked",get:function(){if(!1===w(this))throw G("locked");return k(this)}}]);return e}();e.exports={AcquireWritableStreamDefaultWriter:y,IsWritableStream:w,IsWritableStreamLocked:k,WritableStream:b,WritableStreamAbort:S,WritableStreamDefaultControllerError:H,WritableStreamDefaultWriterCloseWithErrorPropagation:function(e){var t=e._ownerWritableStream;h(void 0!==t);var r=t._state;if(!0===P(t)||"closed"===r)return Promise.resolve();if("errored"===r)return Promise.reject(t._storedError);h("writable"===r||"erroring"===r);return R(e)},WritableStreamDefaultWriterRelease:M,WritableStreamDefaultWriterWrite:L,WritableStreamCloseQueuedOrInFlight:P};function y(e){return new E(e)}function w(e){return!!l(e)&&!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")}function k(e){h(!0===w(e),"IsWritableStreamLocked should only be used on known writable streams");return void 0!==e._writer}function S(e,t){var r=e._state;if("closed"===r)return Promise.resolve(void 0);if("errored"===r)return Promise.reject(e._storedError);var a=new TypeError("Requested to abort");if(void 0!==e._pendingAbortRequest)return Promise.reject(a);h("writable"===r||"erroring"===r,"state must be writable or erroring");var i=!1;if("erroring"===r){i=!0;t=void 0}var n=new Promise(function(r,a){e._pendingAbortRequest={_resolve:r,_reject:a,_reason:t,_wasAlreadyErroring:i}});!1===i&&x(e,a);return n}function C(e,t){var r=e._state;if("writable"!==r){h("erroring"===r);_(e)}else x(e,t)}function x(e,t){h(void 0===e._storedError,"stream._storedError === undefined");h("writable"===e._state,"state must be writable");var r=e._writableStreamController;h(void 0!==r,"controller must not be undefined");e._state="erroring";e._storedError=t;var a=e._writer;void 0!==a&&D(a,t);!1===I(e)&&!0===r._started&&_(e)}function _(e){h("erroring"===e._state,"stream._state === erroring");h(!1===I(e),"WritableStreamHasOperationMarkedInFlight(stream) === false");e._state="errored";e._writableStreamController.__errorSteps();for(var t=e._storedError,r=0;r<e._writeRequests.length;r++){e._writeRequests[r]._reject(t)}e._writeRequests=[];if(void 0!==e._pendingAbortRequest){var a=e._pendingAbortRequest;e._pendingAbortRequest=void 0;if(!0!==a._wasAlreadyErroring){e._writableStreamController.__abortSteps(a._reason).then(function(){a._resolve();O(e)},function(t){a._reject(t);O(e)})}else{a._reject(t);O(e)}}else O(e)}function A(e){h(void 0!==e._inFlightCloseRequest);e._inFlightCloseRequest._resolve(void 0);e._inFlightCloseRequest=void 0;var t=e._state;h("writable"===t||"erroring"===t);if("erroring"===t){e._storedError=void 0;if(void 0!==e._pendingAbortRequest){e._pendingAbortRequest._resolve();e._pendingAbortRequest=void 0}}e._state="closed";var r=e._writer;void 0!==r&&function(e){h(void 0!==e._closedPromise_resolve,"writer._closedPromise_resolve !== undefined");h(void 0!==e._closedPromise_reject,"writer._closedPromise_reject !== undefined");h("pending"===e._closedPromiseState,"writer._closedPromiseState is pending");e._closedPromise_resolve(void 0);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0;e._closedPromiseState="resolved"}(r);h(void 0===e._pendingAbortRequest,"stream._pendingAbortRequest === undefined");h(void 0===e._storedError,"stream._storedError === undefined")}function P(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function I(e){return void 0!==e._inFlightWriteRequest||void 0!==e._inFlightCloseRequest}function O(e){h("errored"===e._state,'_stream_.[[state]] is `"errored"`');if(void 0!==e._closeRequest){h(void 0===e._inFlightCloseRequest);e._closeRequest._reject(e._storedError);e._closeRequest=void 0}var t=e._writer;if(void 0!==t){K(t,e._storedError);t._closedPromise.catch(function(){})}}function T(e,t){h("writable"===e._state);h(!1===P(e));var r=e._writer;if(void 0!==r&&t!==e._backpressure)if(!0===t)!function(e){h(void 0===e._readyPromise_resolve,"writer._readyPromise_resolve === undefined");h(void 0===e._readyPromise_reject,"writer._readyPromise_reject === undefined");e._readyPromise=new Promise(function(t,r){e._readyPromise_resolve=t;e._readyPromise_reject=r});e._readyPromiseState="pending"}(r);else{h(!1===t);Z(r)}e._backpressure=t}var E=function(){function e(t){i(this,e);if(!1===w(t))throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance");if(!0===k(t))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=t;t._writer=this;var r=t._state;if("writable"===r){!1===P(t)&&!0===t._backpressure?function(e){e._readyPromise=new Promise(function(t,r){e._readyPromise_resolve=t;e._readyPromise_reject=r});e._readyPromiseState="pending"}(this):J(this);V(this)}else if("erroring"===r){Y(this,t._storedError);this._readyPromise.catch(function(){});V(this)}else if("closed"===r){J(this);!function(e){e._closedPromise=Promise.resolve(void 0);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0;e._closedPromiseState="resolved"}(this)}else{h("errored"===r,"state must be errored");var a=t._storedError;Y(this,a);this._readyPromise.catch(function(){});!function(e,t){e._closedPromise=Promise.reject(t);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0;e._closedPromiseState="rejected"}(this,a);this._closedPromise.catch(function(){})}}a(e,[{key:"abort",value:function(e){return!1===F(this)?Promise.reject(W("abort")):void 0===this._ownerWritableStream?Promise.reject(X("abort")):function(e,t){var r=e._ownerWritableStream;h(void 0!==r);return S(r,t)}(this,e)}},{key:"close",value:function(){if(!1===F(this))return Promise.reject(W("close"));var e=this._ownerWritableStream;return void 0===e?Promise.reject(X("close")):!0===P(e)?Promise.reject(new TypeError("cannot close an already-closing stream")):R(this)}},{key:"releaseLock",value:function(){if(!1===F(this))throw W("releaseLock");var e=this._ownerWritableStream;if(void 0!==e){h(void 0!==e._writer);M(this)}}},{key:"write",value:function(e){return!1===F(this)?Promise.reject(W("write")):void 0===this._ownerWritableStream?Promise.reject(X("write to")):L(this,e)}},{key:"closed",get:function(){return!1===F(this)?Promise.reject(W("closed")):this._closedPromise}},{key:"desiredSize",get:function(){if(!1===F(this))throw W("desiredSize");if(void 0===this._ownerWritableStream)throw X("desiredSize");return function(e){var t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return U(t._writableStreamController)}(this)}},{key:"ready",get:function(){return!1===F(this)?Promise.reject(W("ready")):this._readyPromise}}]);return e}();function F(e){return!!l(e)&&!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")}function R(e){var t=e._ownerWritableStream;h(void 0!==t);var r=t._state;if("closed"===r||"errored"===r)return Promise.reject(new TypeError("The stream (in "+r+" state) is not in the writable state and cannot be closed"));h("writable"===r||"erroring"===r);h(!1===P(t));var a=new Promise(function(e,r){var a={_resolve:e,_reject:r};t._closeRequest=a});!0===t._backpressure&&"writable"===r&&Z(e);!function(e){m(e,"close",0);q(e)}(t._writableStreamController);return a}function B(e,t){"pending"===e._closedPromiseState?K(e,t):function(e,t){h(void 0===e._closedPromise_resolve,"writer._closedPromise_resolve === undefined");h(void 0===e._closedPromise_reject,"writer._closedPromise_reject === undefined");h("pending"!==e._closedPromiseState,"writer._closedPromiseState is not pending");e._closedPromise=Promise.reject(t);e._closedPromiseState="rejected"}(e,t);e._closedPromise.catch(function(){})}function D(e,t){"pending"===e._readyPromiseState?function(e,t){h(void 0!==e._readyPromise_resolve,"writer._readyPromise_resolve !== undefined");h(void 0!==e._readyPromise_reject,"writer._readyPromise_reject !== undefined");e._readyPromise_reject(t);e._readyPromise_resolve=void 0;e._readyPromise_reject=void 0;e._readyPromiseState="rejected"}(e,t):function(e,t){h(void 0===e._readyPromise_resolve,"writer._readyPromise_resolve === undefined");h(void 0===e._readyPromise_reject,"writer._readyPromise_reject === undefined");e._readyPromise=Promise.reject(t);e._readyPromiseState="rejected"}(e,t);e._readyPromise.catch(function(){})}function M(e){var t=e._ownerWritableStream;h(void 0!==t);h(t._writer===e);var r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");D(e,r);B(e,r);t._writer=void 0;e._ownerWritableStream=void 0}function L(e,t){var r=e._ownerWritableStream;h(void 0!==r);var a=r._writableStreamController,i=function(e,t){var r=e._strategySize;if(void 0===r)return 1;try{return r(t)}catch(t){j(e,t);return 1}}(a,t);if(r!==e._ownerWritableStream)return Promise.reject(X("write to"));var n=r._state;if("errored"===n)return Promise.reject(r._storedError);if(!0===P(r)||"closed"===n)return Promise.reject(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===n)return Promise.reject(r._storedError);h("writable"===n);var o=function(e){h(!0===k(e));h("writable"===e._state);return new Promise(function(t,r){var a={_resolve:t,_reject:r};e._writeRequests.push(a)})}(r);!function(e,t,r){var a={chunk:t};try{m(e,a,r)}catch(t){j(e,t);return}var i=e._controlledWritableStream;if(!1===P(i)&&"writable"===i._state){var n=z(e);T(i,n)}q(e)}(a,t,i);return o}var N=function(){function e(t,r,a,n){i(this,e);if(!1===w(t))throw new TypeError("WritableStreamDefaultController can only be constructed with a WritableStream instance");if(void 0!==t._writableStreamController)throw new TypeError("WritableStreamDefaultController instances can only be created by the WritableStream constructor");this._controlledWritableStream=t;this._underlyingSink=r;this._queue=void 0;this._queueTotalSize=void 0;v(this);this._started=!1;var o=c(a,n);this._strategySize=o.size;this._strategyHWM=o.highWaterMark;T(t,z(this))}a(e,[{key:"error",value:function(e){if(!1===function(e){if(!l(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_underlyingSink"))return!1;return!0}(this))throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController");"writable"===this._controlledWritableStream._state&&H(this,e)}},{key:"__abortSteps",value:function(e){return s(this._underlyingSink,"abort",[e])}},{key:"__errorSteps",value:function(){v(this)}},{key:"__startSteps",value:function(){var e=this,t=o(this._underlyingSink,"start",[this]),r=this._controlledWritableStream;Promise.resolve(t).then(function(){h("writable"===r._state||"erroring"===r._state);e._started=!0;q(e)},function(t){h("writable"===r._state||"erroring"===r._state);e._started=!0;C(r,t)}).catch(f)}}]);return e}();function U(e){return e._strategyHWM-e._queueTotalSize}function q(e){var t=e._controlledWritableStream;if(!1!==e._started&&void 0===t._inFlightWriteRequest){var r=t._state;if("closed"!==r&&"errored"!==r)if("erroring"!==r){if(0!==e._queue.length){var a=p(e);"close"===a?function(e){var t=e._controlledWritableStream;!function(e){h(void 0===e._inFlightCloseRequest);h(void 0!==e._closeRequest);e._inFlightCloseRequest=e._closeRequest;e._closeRequest=void 0}(t);g(e);h(0===e._queue.length,"queue must be empty once the final write record is dequeued");s(e._underlyingSink,"close",[]).then(function(){A(t)},function(e){!function(e,t){h(void 0!==e._inFlightCloseRequest);e._inFlightCloseRequest._reject(t);e._inFlightCloseRequest=void 0;h("writable"===e._state||"erroring"===e._state);if(void 0!==e._pendingAbortRequest){e._pendingAbortRequest._reject(t);e._pendingAbortRequest=void 0}C(e,t)}(t,e)}).catch(f)}(e):function(e,t){var r=e._controlledWritableStream;!function(e){h(void 0===e._inFlightWriteRequest,"there must be no pending write request");h(0!==e._writeRequests.length,"writeRequests must not be empty");e._inFlightWriteRequest=e._writeRequests.shift()}(r);s(e._underlyingSink,"write",[t,e]).then(function(){!function(e){h(void 0!==e._inFlightWriteRequest);e._inFlightWriteRequest._resolve(void 0);e._inFlightWriteRequest=void 0}(r);var t=r._state;h("writable"===t||"erroring"===t);g(e);if(!1===P(r)&&"writable"===t){var a=z(e);T(r,a)}q(e)},function(e){!function(e,t){h(void 0!==e._inFlightWriteRequest);e._inFlightWriteRequest._reject(t);e._inFlightWriteRequest=void 0;h("writable"===e._state||"erroring"===e._state);C(e,t)}(r,e)}).catch(f)}(e,a.chunk)}}else _(t)}}function j(e,t){"writable"===e._controlledWritableStream._state&&H(e,t)}function z(e){return U(e)<=0}function H(e,t){var r=e._controlledWritableStream;h("writable"===r._state);x(r,t)}function G(e){return new TypeError("WritableStream.prototype."+e+" can only be used on a WritableStream")}function W(e){return new TypeError("WritableStreamDefaultWriter.prototype."+e+" can only be used on a WritableStreamDefaultWriter")}function X(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function V(e){e._closedPromise=new Promise(function(t,r){e._closedPromise_resolve=t;e._closedPromise_reject=r;e._closedPromiseState="pending"})}function K(e,t){h(void 0!==e._closedPromise_resolve,"writer._closedPromise_resolve !== undefined");h(void 0!==e._closedPromise_reject,"writer._closedPromise_reject !== undefined");h("pending"===e._closedPromiseState,"writer._closedPromiseState is pending");e._closedPromise_reject(t);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0;e._closedPromiseState="rejected"}function Y(e,t){e._readyPromise=Promise.reject(t);e._readyPromise_resolve=void 0;e._readyPromise_reject=void 0;e._readyPromiseState="rejected"}function J(e){e._readyPromise=Promise.resolve(void 0);e._readyPromise_resolve=void 0;e._readyPromise_reject=void 0;e._readyPromiseState="fulfilled"}function Z(e){h(void 0!==e._readyPromise_resolve,"writer._readyPromise_resolve !== undefined");h(void 0!==e._readyPromise_reject,"writer._readyPromise_reject !== undefined");e._readyPromise_resolve(void 0);e._readyPromise_resolve=void 0;e._readyPromise_reject=void 0;e._readyPromiseState="fulfilled"}},function(e,t,r){var a=r(0).IsFiniteNonNegativeNumber,i=r(1).assert;t.DequeueValue=function(e){i("_queue"in e&&"_queueTotalSize"in e,"Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].");i(e._queue.length>0,"Spec-level failure: should never dequeue from an empty queue.");var t=e._queue.shift();e._queueTotalSize-=t.size;e._queueTotalSize<0&&(e._queueTotalSize=0);return t.value};t.EnqueueValueWithSize=function(e,t,r){i("_queue"in e&&"_queueTotalSize"in e,"Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and [[queueTotalSize]].");r=Number(r);if(!a(r))throw new RangeError("Size must be a finite, non-NaN, non-negative number.");e._queue.push({value:t,size:r});e._queueTotalSize+=r};t.PeekQueueValue=function(e){i("_queue"in e&&"_queueTotalSize"in e,"Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].");i(e._queue.length>0,"Spec-level failure: should never peek at an empty queue.");return e._queue[0].value};t.ResetQueue=function(e){i("_queue"in e&&"_queueTotalSize"in e,"Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].");e._queue=[];e._queueTotalSize=0}},function(e,t,r){var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var n=r(0),o=n.ArrayBufferCopy,s=n.CreateIterResultObject,c=n.IsFiniteNonNegativeNumber,l=n.InvokeOrNoop,u=n.PromiseInvokeOrNoop,h=n.TransferArrayBuffer,f=n.ValidateAndNormalizeQueuingStrategy,d=n.ValidateAndNormalizeHighWaterMark,g=r(0),m=g.createArrayFromList,p=g.createDataProperty,v=g.typeIsObject,b=r(1),y=b.assert,w=b.rethrowAssertionErrorRejection,k=r(3),S=k.DequeueValue,C=k.EnqueueValueWithSize,x=k.ResetQueue,_=r(2),A=_.AcquireWritableStreamDefaultWriter,P=_.IsWritableStream,I=_.IsWritableStreamLocked,O=_.WritableStreamAbort,T=_.WritableStreamDefaultWriterCloseWithErrorPropagation,E=_.WritableStreamDefaultWriterRelease,F=_.WritableStreamDefaultWriterWrite,R=_.WritableStreamCloseQueuedOrInFlight,B=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=r.size,n=r.highWaterMark;i(this,e);this._state="readable";this._reader=void 0;this._storedError=void 0;this._disturbed=!1;this._readableStreamController=void 0;var o=t.type;if("bytes"===String(o)){void 0===n&&(n=0);this._readableStreamController=new fe(this,t,n)}else{if(void 0!==o)throw new RangeError("Invalid type is specified");void 0===n&&(n=1);this._readableStreamController=new ae(this,t,a,n)}}a(e,[{key:"cancel",value:function(e){return!1===M(this)?Promise.reject(Oe("cancel")):!0===L(this)?Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")):j(this,e)}},{key:"getReader",value:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mode;if(!1===M(this))throw Oe("getReader");if(void 0===e)return D(this);if("byob"===(e=String(e)))return new J(this);throw new RangeError("Invalid mode is specified")}},{key:"pipeThrough",value:function(e,t){var r=e.writable,a=e.readable;!function(e){try{Promise.prototype.then.call(e,void 0,function(){})}catch(e){}}(this.pipeTo(r,t));return a}},{key:"pipeTo",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=r.preventClose,i=r.preventAbort,n=r.preventCancel;if(!1===M(this))return Promise.reject(Oe("pipeTo"));if(!1===P(e))return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));a=Boolean(a);i=Boolean(i);n=Boolean(n);if(!0===L(this))return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream"));if(!0===I(e))return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream"));var o=D(this),s=A(e),c=!1,l=Promise.resolve();return new Promise(function(r,u){p(t,o._closedPromise,function(t){!1===i?v(function(){return O(e,t)},!0,t):b(!0,t)});p(e,s._closedPromise,function(e){!1===n?v(function(){return j(t,e)},!0,e):b(!0,e)});h=t,f=o._closedPromise,d=function(){!1===a?v(function(){return T(s)}):b()},"closed"===h._state?d():f.then(d).catch(w);var h,f,d;if(!0===R(e)||"closed"===e._state){var g=new TypeError("the destination writable stream closed before all data could be piped to it");!1===n?v(function(){return j(t,g)},!0,g):b(!0,g)}(function e(){l=Promise.resolve();return!0===c?Promise.resolve():s._readyPromise.then(function(){return re(o).then(function(e){var t=e.value;!0!==e.done&&(l=F(s,t).catch(function(){}))})}).then(e)})().catch(function(e){l=Promise.resolve();w(e)});function m(){var e=l;return l.then(function(){return e!==l?m():void 0})}function p(e,t,r){"errored"===e._state?r(e._storedError):t.catch(r).catch(w)}function v(t,r,a){if(!0!==c){c=!0;"writable"===e._state&&!1===R(e)?m().then(i):i()}function i(){t().then(function(){return y(r,a)},function(e){return y(!0,e)}).catch(w)}}function b(t,r){if(!0!==c){c=!0;"writable"===e._state&&!1===R(e)?m().then(function(){return y(t,r)}).catch(w):y(t,r)}}function y(e,t){E(s);te(o);e?u(t):r(void 0)}})}},{key:"tee",value:function(){if(!1===M(this))throw Oe("tee");var e=N(this,!1);return m(e)}},{key:"locked",get:function(){if(!1===M(this))throw Oe("locked");return L(this)}}]);return e}();e.exports={ReadableStream:B,IsReadableStreamDisturbed:function(e){y(!0===M(e),"IsReadableStreamDisturbed should only be used on known readable streams");return e._disturbed},ReadableStreamDefaultControllerClose:oe,ReadableStreamDefaultControllerEnqueue:se,ReadableStreamDefaultControllerError:ce,ReadableStreamDefaultControllerGetDesiredSize:ue};function D(e){return new Y(e)}function M(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")}function L(e){y(!0===M(e),"IsReadableStreamLocked should only be used on known readable streams");return void 0!==e._reader}function N(e,t){y(!0===M(e));y("boolean"==typeof t);var r=D(e),a={closedOrErrored:!1,canceled1:!1,canceled2:!1,reason1:void 0,reason2:void 0};a.promise=new Promise(function(e){a._resolve=e});var i=function(){return function e(){var t=e._reader,r=e._branch1,a=e._branch2,i=e._teeState;return re(t).then(function(e){y(v(e));var t=e.value,n=e.done;y("boolean"==typeof n);if(!0===n&&!1===i.closedOrErrored){!1===i.canceled1&&oe(r);!1===i.canceled2&&oe(a);i.closedOrErrored=!0}if(!0!==i.closedOrErrored){var o=t,s=t;!1===i.canceled1&&se(r,o);!1===i.canceled2&&se(a,s)}})}}();i._reader=r;i._teeState=a;i._cloneForBranch2=t;var n=function(){return function e(t){var r=e._stream,a=e._teeState;a.canceled1=!0;a.reason1=t;if(!0===a.canceled2){var i=m([a.reason1,a.reason2]),n=j(r,i);a._resolve(n)}return a.promise}}();n._stream=e;n._teeState=a;var o=function(){return function e(t){var r=e._stream,a=e._teeState;a.canceled2=!0;a.reason2=t;if(!0===a.canceled1){var i=m([a.reason1,a.reason2]),n=j(r,i);a._resolve(n)}return a.promise}}();o._stream=e;o._teeState=a;var s=Object.create(Object.prototype);p(s,"pull",i);p(s,"cancel",n);var c=new B(s),l=Object.create(Object.prototype);p(l,"pull",i);p(l,"cancel",o);var u=new B(l);i._branch1=c._readableStreamController;i._branch2=u._readableStreamController;r._closedPromise.catch(function(e){if(!0!==a.closedOrErrored){ce(i._branch1,e);ce(i._branch2,e);a.closedOrErrored=!0}});return[c,u]}function U(e){y(!0===Z(e._reader));y("readable"===e._state||"closed"===e._state);return new Promise(function(t,r){var a={_resolve:t,_reject:r};e._reader._readIntoRequests.push(a)})}function q(e){y(!0===Q(e._reader));y("readable"===e._state);return new Promise(function(t,r){var a={_resolve:t,_reject:r};e._reader._readRequests.push(a)})}function j(e,t){e._disturbed=!0;if("closed"===e._state)return Promise.resolve(void 0);if("errored"===e._state)return Promise.reject(e._storedError);z(e);return e._readableStreamController.__cancelSteps(t).then(function(){})}function z(e){y("readable"===e._state);e._state="closed";var t=e._reader;if(void 0!==t){if(!0===Q(t)){for(var r=0;r<t._readRequests.length;r++){(0,t._readRequests[r]._resolve)(s(void 0,!0))}t._readRequests=[]}!function(e){y(void 0!==e._closedPromise_resolve);y(void 0!==e._closedPromise_reject);e._closedPromise_resolve(void 0);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0}(t)}}function H(e,t){y(!0===M(e),"stream must be ReadableStream");y("readable"===e._state,"state must be readable");e._state="errored";e._storedError=t;var r=e._reader;if(void 0!==r){if(!0===Q(r)){for(var a=0;a<r._readRequests.length;a++){r._readRequests[a]._reject(t)}r._readRequests=[]}else{y(Z(r),"reader must be ReadableStreamBYOBReader");for(var i=0;i<r._readIntoRequests.length;i++){r._readIntoRequests[i]._reject(t)}r._readIntoRequests=[]}Fe(r,t);r._closedPromise.catch(function(){})}}function G(e,t,r){var a=e._reader;y(a._readRequests.length>0);a._readRequests.shift()._resolve(s(t,r))}function W(e){return e._reader._readIntoRequests.length}function X(e){return e._reader._readRequests.length}function V(e){var t=e._reader;return void 0!==t&&!1!==Z(t)}function K(e){var t=e._reader;return void 0!==t&&!1!==Q(t)}var Y=function(){function e(t){i(this,e);if(!1===M(t))throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance");if(!0===L(t))throw new TypeError("This stream has already been locked for exclusive reading by another reader");$(this,t);this._readRequests=[]}a(e,[{key:"cancel",value:function(e){return!1===Q(this)?Promise.reject(Ee("cancel")):void 0===this._ownerReadableStream?Promise.reject(Te("cancel")):ee(this,e)}},{key:"read",value:function(){return!1===Q(this)?Promise.reject(Ee("read")):void 0===this._ownerReadableStream?Promise.reject(Te("read from")):re(this)}},{key:"releaseLock",value:function(){if(!1===Q(this))throw Ee("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");te(this)}}},{key:"closed",get:function(){return!1===Q(this)?Promise.reject(Ee("closed")):this._closedPromise}}]);return e}(),J=function(){function e(t){i(this,e);if(!M(t))throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source");if(!1===de(t._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");if(L(t))throw new TypeError("This stream has already been locked for exclusive reading by another reader");$(this,t);this._readIntoRequests=[]}a(e,[{key:"cancel",value:function(e){return Z(this)?void 0===this._ownerReadableStream?Promise.reject(Te("cancel")):ee(this,e):Promise.reject(Re("cancel"))}},{key:"read",value:function(e){return Z(this)?void 0===this._ownerReadableStream?Promise.reject(Te("read from")):ArrayBuffer.isView(e)?0===e.byteLength?Promise.reject(new TypeError("view must have non-zero byteLength")):function(e,t){var r=e._ownerReadableStream;y(void 0!==r);r._disturbed=!0;if("errored"===r._state)return Promise.reject(r._storedError);return function(e,t){var r=e._controlledReadableStream,a=1;t.constructor!==DataView&&(a=t.constructor.BYTES_PER_ELEMENT);var i=t.constructor,n={buffer:t.buffer,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:a,ctor:i,readerType:"byob"};if(e._pendingPullIntos.length>0){n.buffer=h(n.buffer);e._pendingPullIntos.push(n);return U(r)}if("closed"===r._state){var o=new t.constructor(n.buffer,n.byteOffset,0);return Promise.resolve(s(o,!0))}if(e._queueTotalSize>0){if(!0===we(e,n)){var c=be(n);Se(e);return Promise.resolve(s(c,!1))}if(!0===e._closeRequested){var l=new TypeError("Insufficient bytes to fill elements in the given buffer");Pe(e,l);return Promise.reject(l)}}n.buffer=h(n.buffer);e._pendingPullIntos.push(n);var u=U(r);me(e);return u}(r._readableStreamController,t)}(this,e):Promise.reject(new TypeError("view must be an array buffer view")):Promise.reject(Re("read"))}},{key:"releaseLock",value:function(){if(!Z(this))throw Re("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");te(this)}}},{key:"closed",get:function(){return Z(this)?this._closedPromise:Promise.reject(Re("closed"))}}]);return e}();function Z(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")}function Q(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readRequests")}function $(e,t){e._ownerReadableStream=t;t._reader=e;if("readable"===t._state)!function(e){e._closedPromise=new Promise(function(t,r){e._closedPromise_resolve=t;e._closedPromise_reject=r})}(e);else if("closed"===t._state)!function(e){e._closedPromise=Promise.resolve(void 0);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0}(e);else{y("errored"===t._state,"state must be errored");!function(e,t){e._closedPromise=Promise.reject(t);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0}(e,t._storedError);e._closedPromise.catch(function(){})}}function ee(e,t){var r=e._ownerReadableStream;y(void 0!==r);return j(r,t)}function te(e){y(void 0!==e._ownerReadableStream);y(e._ownerReadableStream._reader===e);"readable"===e._ownerReadableStream._state?Fe(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){y(void 0===e._closedPromise_resolve);y(void 0===e._closedPromise_reject);e._closedPromise=Promise.reject(t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"));e._closedPromise.catch(function(){});e._ownerReadableStream._reader=void 0;e._ownerReadableStream=void 0}function re(e){var t=e._ownerReadableStream;y(void 0!==t);t._disturbed=!0;if("closed"===t._state)return Promise.resolve(s(void 0,!0));if("errored"===t._state)return Promise.reject(t._storedError);y("readable"===t._state);return t._readableStreamController.__pullSteps()}var ae=function(){function e(t,r,a,n){i(this,e);if(!1===M(t))throw new TypeError("ReadableStreamDefaultController can only be constructed with a ReadableStream instance");if(void 0!==t._readableStreamController)throw new TypeError("ReadableStreamDefaultController instances can only be created by the ReadableStream constructor");this._controlledReadableStream=t;this._underlyingSource=r;this._queue=void 0;this._queueTotalSize=void 0;x(this);this._started=!1;this._closeRequested=!1;this._pullAgain=!1;this._pulling=!1;var o=f(a,n);this._strategySize=o.size;this._strategyHWM=o.highWaterMark;var s=this,c=l(r,"start",[this]);Promise.resolve(c).then(function(){s._started=!0;y(!1===s._pulling);y(!1===s._pullAgain);ne(s)},function(e){le(s,e)}).catch(w)}a(e,[{key:"close",value:function(){if(!1===ie(this))throw Be("close");if(!0===this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");var e=this._controlledReadableStream._state;if("readable"!==e)throw new TypeError("The stream (in "+e+" state) is not in the readable state and cannot be closed");oe(this)}},{key:"enqueue",value:function(e){if(!1===ie(this))throw Be("enqueue");if(!0===this._closeRequested)throw new TypeError("stream is closed or draining");var t=this._controlledReadableStream._state;if("readable"!==t)throw new TypeError("The stream (in "+t+" state) is not in the readable state and cannot be enqueued to");return se(this,e)}},{key:"error",value:function(e){if(!1===ie(this))throw Be("error");var t=this._controlledReadableStream;if("readable"!==t._state)throw new TypeError("The stream is "+t._state+" and so cannot be errored");ce(this,e)}},{key:"__cancelSteps",value:function(e){x(this);return u(this._underlyingSource,"cancel",[e])}},{key:"__pullSteps",value:function(){var e=this._controlledReadableStream;if(this._queue.length>0){var t=S(this);!0===this._closeRequested&&0===this._queue.length?z(e):ne(this);return Promise.resolve(s(t,!1))}var r=q(e);ne(this);return r}},{key:"desiredSize",get:function(){if(!1===ie(this))throw Be("desiredSize");return ue(this)}}]);return e}();function ie(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_underlyingSource")}function ne(e){if(!1!==function(e){var t=e._controlledReadableStream;if("closed"===t._state||"errored"===t._state)return!1;if(!0===e._closeRequested)return!1;if(!1===e._started)return!1;if(!0===L(t)&&X(t)>0)return!0;if(ue(e)>0)return!0;return!1}(e))if(!0!==e._pulling){y(!1===e._pullAgain);e._pulling=!0;u(e._underlyingSource,"pull",[e]).then(function(){e._pulling=!1;if(!0===e._pullAgain){e._pullAgain=!1;return ne(e)}},function(t){le(e,t)}).catch(w)}else e._pullAgain=!0}function oe(e){var t=e._controlledReadableStream;y(!1===e._closeRequested);y("readable"===t._state);e._closeRequested=!0;0===e._queue.length&&z(t)}function se(e,t){var r=e._controlledReadableStream;y(!1===e._closeRequested);y("readable"===r._state);if(!0===L(r)&&X(r)>0)G(r,t,!1);else{var a=1;if(void 0!==e._strategySize){var i=e._strategySize;try{a=i(t)}catch(t){le(e,t);throw t}}try{C(e,t,a)}catch(t){le(e,t);throw t}}ne(e)}function ce(e,t){var r=e._controlledReadableStream;y("readable"===r._state);x(e);H(r,t)}function le(e,t){"readable"===e._controlledReadableStream._state&&ce(e,t)}function ue(e){var t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}var he=function(){function e(t,r){i(this,e);this._associatedReadableByteStreamController=t;this._view=r}a(e,[{key:"respond",value:function(e){if(!1===ge(this))throw De("respond");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");!function(e,t){t=Number(t);if(!1===c(t))throw new RangeError("bytesWritten must be a finite");y(e._pendingPullIntos.length>0);_e(e,t)}(this._associatedReadableByteStreamController,e)}},{key:"respondWithNewView",value:function(e){if(!1===ge(this))throw De("respond");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");if(!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");!function(e,t){y(e._pendingPullIntos.length>0);var r=e._pendingPullIntos[0];if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.byteLength!==t.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");r.buffer=t.buffer;_e(e,t.byteLength)}(this._associatedReadableByteStreamController,e)}},{key:"view",get:function(){return this._view}}]);return e}(),fe=function(){function e(t,r,a){i(this,e);if(!1===M(t))throw new TypeError("ReadableByteStreamController can only be constructed with a ReadableStream instance given a byte source");if(void 0!==t._readableStreamController)throw new TypeError("ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte source");this._controlledReadableStream=t;this._underlyingByteSource=r;this._pullAgain=!1;this._pulling=!1;pe(this);this._queue=this._queueTotalSize=void 0;x(this);this._closeRequested=!1;this._started=!1;this._strategyHWM=d(a);var n=r.autoAllocateChunkSize;if(void 0!==n&&(!1===Number.isInteger(n)||n<=0))throw new RangeError("autoAllocateChunkSize must be a positive integer");this._autoAllocateChunkSize=n;this._pendingPullIntos=[];var o=this,s=l(r,"start",[this]);Promise.resolve(s).then(function(){o._started=!0;y(!1===o._pulling);y(!1===o._pullAgain);me(o)},function(e){"readable"===t._state&&Pe(o,e)}).catch(w)}a(e,[{key:"close",value:function(){if(!1===de(this))throw Me("close");if(!0===this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");var e=this._controlledReadableStream._state;if("readable"!==e)throw new TypeError("The stream (in "+e+" state) is not in the readable state and cannot be closed");!function(e){var t=e._controlledReadableStream;y(!1===e._closeRequested);y("readable"===t._state);if(e._queueTotalSize>0){e._closeRequested=!0;return}if(e._pendingPullIntos.length>0){var r=e._pendingPullIntos[0];if(r.bytesFilled>0){var a=new TypeError("Insufficient bytes to fill elements in the given buffer");Pe(e,a);throw a}}z(t)}(this)}},{key:"enqueue",value:function(e){if(!1===de(this))throw Me("enqueue");if(!0===this._closeRequested)throw new TypeError("stream is closed or draining");var t=this._controlledReadableStream._state;if("readable"!==t)throw new TypeError("The stream (in "+t+" state) is not in the readable state and cannot be enqueued to");if(!ArrayBuffer.isView(e))throw new TypeError("You can only enqueue array buffer views when using a ReadableByteStreamController");!function(e,t){var r=e._controlledReadableStream;y(!1===e._closeRequested);y("readable"===r._state);var a=t.buffer,i=t.byteOffset,n=t.byteLength,o=h(a);if(!0===K(r))if(0===X(r))ye(e,o,i,n);else{y(0===e._queue.length);var s=new Uint8Array(o,i,n);G(r,s,!1)}else if(!0===V(r)){ye(e,o,i,n);xe(e)}else{y(!1===L(r),"stream must not be locked");ye(e,o,i,n)}}(this,e)}},{key:"error",value:function(e){if(!1===de(this))throw Me("error");var t=this._controlledReadableStream;if("readable"!==t._state)throw new TypeError("The stream is "+t._state+" and so cannot be errored");Pe(this,e)}},{key:"__cancelSteps",value:function(e){if(this._pendingPullIntos.length>0){this._pendingPullIntos[0].bytesFilled=0}x(this);return u(this._underlyingByteSource,"cancel",[e])}},{key:"__pullSteps",value:function(){var e=this._controlledReadableStream;y(!0===K(e));if(this._queueTotalSize>0){y(0===X(e));var t=this._queue.shift();this._queueTotalSize-=t.byteLength;Se(this);var r=void 0;try{r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}catch(e){return Promise.reject(e)}return Promise.resolve(s(r,!1))}var a=this._autoAllocateChunkSize;if(void 0!==a){var i=void 0;try{i=new ArrayBuffer(a)}catch(e){return Promise.reject(e)}var n={buffer:i,byteOffset:0,byteLength:a,bytesFilled:0,elementSize:1,ctor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(n)}var o=q(e);me(this);return o}},{key:"byobRequest",get:function(){if(!1===de(this))throw Me("byobRequest");if(void 0===this._byobRequest&&this._pendingPullIntos.length>0){var e=this._pendingPullIntos[0],t=new Uint8Array(e.buffer,e.byteOffset+e.bytesFilled,e.byteLength-e.bytesFilled);this._byobRequest=new he(this,t)}return this._byobRequest}},{key:"desiredSize",get:function(){if(!1===de(this))throw Me("desiredSize");return Ie(this)}}]);return e}();function de(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_underlyingByteSource")}function ge(e){return!!v(e)&&!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")}function me(e){if(!1!==function(e){var t=e._controlledReadableStream;if("readable"!==t._state)return!1;if(!0===e._closeRequested)return!1;if(!1===e._started)return!1;if(!0===K(t)&&X(t)>0)return!0;if(!0===V(t)&&W(t)>0)return!0;if(Ie(e)>0)return!0;return!1}(e))if(!0!==e._pulling){y(!1===e._pullAgain);e._pulling=!0;u(e._underlyingByteSource,"pull",[e]).then(function(){e._pulling=!1;if(!0===e._pullAgain){e._pullAgain=!1;me(e)}},function(t){"readable"===e._controlledReadableStream._state&&Pe(e,t)}).catch(w)}else e._pullAgain=!0}function pe(e){Ce(e);e._pendingPullIntos=[]}function ve(e,t){y("errored"!==e._state,"state must not be errored");var r=!1;if("closed"===e._state){y(0===t.bytesFilled);r=!0}var a=be(t);if("default"===t.readerType)G(e,a,r);else{y("byob"===t.readerType);!function(e,t,r){var a=e._reader;y(a._readIntoRequests.length>0);a._readIntoRequests.shift()._resolve(s(t,r))}(e,a,r)}}function be(e){var t=e.bytesFilled,r=e.elementSize;y(t<=e.byteLength);y(t%r==0);return new e.ctor(e.buffer,e.byteOffset,t/r)}function ye(e,t,r,a){e._queue.push({buffer:t,byteOffset:r,byteLength:a});e._queueTotalSize+=a}function we(e,t){var r=t.elementSize,a=t.bytesFilled-t.bytesFilled%r,i=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),n=t.bytesFilled+i,s=n-n%r,c=i,l=!1;if(s>a){c=s-t.bytesFilled;l=!0}for(var u=e._queue;c>0;){var h=u[0],f=Math.min(c,h.byteLength),d=t.byteOffset+t.bytesFilled;o(t.buffer,d,h.buffer,h.byteOffset,f);if(h.byteLength===f)u.shift();else{h.byteOffset+=f;h.byteLength-=f}e._queueTotalSize-=f;ke(e,f,t);c-=f}if(!1===l){y(0===e._queueTotalSize,"queue must be empty");y(t.bytesFilled>0);y(t.bytesFilled<t.elementSize)}return l}function ke(e,t,r){y(0===e._pendingPullIntos.length||e._pendingPullIntos[0]===r);Ce(e);r.bytesFilled+=t}function Se(e){y("readable"===e._controlledReadableStream._state);0===e._queueTotalSize&&!0===e._closeRequested?z(e._controlledReadableStream):me(e)}function Ce(e){if(void 0!==e._byobRequest){e._byobRequest._associatedReadableByteStreamController=void 0;e._byobRequest._view=void 0;e._byobRequest=void 0}}function xe(e){y(!1===e._closeRequested);for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;var t=e._pendingPullIntos[0];if(!0===we(e,t)){Ae(e);ve(e._controlledReadableStream,t)}}}function _e(e,t){var r=e._pendingPullIntos[0],a=e._controlledReadableStream;if("closed"===a._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream");!function(e,t){t.buffer=h(t.buffer);y(0===t.bytesFilled,"bytesFilled must be 0");var r=e._controlledReadableStream;if(!0===V(r))for(;W(r)>0;)ve(r,Ae(e))}(e,r)}else{y("readable"===a._state);!function(e,t,r){if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range");ke(e,t,r);if(!(r.bytesFilled<r.elementSize)){Ae(e);var a=r.bytesFilled%r.elementSize;if(a>0){var i=r.byteOffset+r.bytesFilled,n=r.buffer.slice(i-a,i);ye(e,n,0,n.byteLength)}r.buffer=h(r.buffer);r.bytesFilled-=a;ve(e._controlledReadableStream,r);xe(e)}}(e,t,r)}}function Ae(e){var t=e._pendingPullIntos.shift();Ce(e);return t}function Pe(e,t){var r=e._controlledReadableStream;y("readable"===r._state);pe(e);x(e);H(r,t)}function Ie(e){var t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Oe(e){return new TypeError("ReadableStream.prototype."+e+" can only be used on a ReadableStream")}function Te(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function Ee(e){return new TypeError("ReadableStreamDefaultReader.prototype."+e+" can only be used on a ReadableStreamDefaultReader")}function Fe(e,t){y(void 0!==e._closedPromise_resolve);y(void 0!==e._closedPromise_reject);e._closedPromise_reject(t);e._closedPromise_resolve=void 0;e._closedPromise_reject=void 0}function Re(e){return new TypeError("ReadableStreamBYOBReader.prototype."+e+" can only be used on a ReadableStreamBYOBReader")}function Be(e){return new TypeError("ReadableStreamDefaultController.prototype."+e+" can only be used on a ReadableStreamDefaultController")}function De(e){return new TypeError("ReadableStreamBYOBRequest.prototype."+e+" can only be used on a ReadableStreamBYOBRequest")}function Me(e){return new TypeError("ReadableByteStreamController.prototype."+e+" can only be used on a ReadableByteStreamController")}},function(e,t,r){var a=r(6),i=r(4),n=r(2);t.TransformStream=a.TransformStream;t.ReadableStream=i.ReadableStream;t.IsReadableStreamDisturbed=i.IsReadableStreamDisturbed;t.ReadableStreamDefaultControllerClose=i.ReadableStreamDefaultControllerClose;t.ReadableStreamDefaultControllerEnqueue=i.ReadableStreamDefaultControllerEnqueue;t.ReadableStreamDefaultControllerError=i.ReadableStreamDefaultControllerError;t.ReadableStreamDefaultControllerGetDesiredSize=i.ReadableStreamDefaultControllerGetDesiredSize;t.AcquireWritableStreamDefaultWriter=n.AcquireWritableStreamDefaultWriter;t.IsWritableStream=n.IsWritableStream;t.IsWritableStreamLocked=n.IsWritableStreamLocked;t.WritableStream=n.WritableStream;t.WritableStreamAbort=n.WritableStreamAbort;t.WritableStreamDefaultControllerError=n.WritableStreamDefaultControllerError;t.WritableStreamDefaultWriterCloseWithErrorPropagation=n.WritableStreamDefaultWriterCloseWithErrorPropagation;t.WritableStreamDefaultWriterRelease=n.WritableStreamDefaultWriterRelease;t.WritableStreamDefaultWriterWrite=n.WritableStreamDefaultWriterWrite},function(e,t,r){var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var n=r(1).assert,o=r(0),s=o.InvokeOrNoop,c=o.PromiseInvokeOrPerformFallback,l=o.PromiseInvokeOrNoop,u=o.typeIsObject,h=r(4),f=h.ReadableStream,d=h.ReadableStreamDefaultControllerClose,g=h.ReadableStreamDefaultControllerEnqueue,m=h.ReadableStreamDefaultControllerError,p=h.ReadableStreamDefaultControllerGetDesiredSize,v=r(2),b=v.WritableStream,y=v.WritableStreamDefaultControllerError;function w(e,t){if(!0===e._errored)throw new TypeError("TransformStream is already errored");if(!0===e._readableClosed)throw new TypeError("Readable side is already closed");var r=e._readableController;try{g(r,t)}catch(t){e._readableClosed=!0;S(e,t);throw e._storedError}!0===p(r)<=0&&!1===e._backpressure&&_(e,!0)}function k(e){n(!1===e._errored);n(!1===e._readableClosed);try{d(e._readableController)}catch(e){n(!1)}e._readableClosed=!0}function S(e,t){!1===e._errored&&C(e,t)}function C(e,t){n(!1===e._errored);e._errored=!0;e._storedError=t;!1===e._writableDone&&y(e._writableController,t);!1===e._readableClosed&&m(e._readableController,t)}function x(e){n(void 0!==e._backpressureChangePromise,"_backpressureChangePromise should have been initialized");if(!1===e._backpressure)return Promise.resolve();n(!0===e._backpressure,"_backpressure should have been initialized");return e._backpressureChangePromise}function _(e,t){n(e._backpressure!==t,"TransformStreamSetBackpressure() should be called only when backpressure is changed");void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(t);e._backpressureChangePromise=new Promise(function(t){e._backpressureChangePromise_resolve=t});e._backpressureChangePromise.then(function(e){n(e!==t,"_backpressureChangePromise should be fulfilled only when backpressure is changed")});e._backpressure=t}function A(e,t){w(t._controlledTransformStream,e);return Promise.resolve()}function P(e){return!!u(e)&&!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")}function I(e){return!!u(e)&&!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")}var O=function(){function e(t,r){i(this,e);this._transformStream=t;this._startPromise=r}a(e,[{key:"start",value:function(e){var t=this._transformStream;t._writableController=e;return this._startPromise.then(function(){return x(t)})}},{key:"write",value:function(e){return function(e,t){n(!1===e._errored);n(!1===e._transforming);n(!1===e._backpressure);e._transforming=!0;var r=e._transformer,a=e._transformStreamController;return c(r,"transform",[t,a],A,[t,a]).then(function(){e._transforming=!1;return x(e)},function(t){S(e,t);return Promise.reject(t)})}(this._transformStream,e)}},{key:"abort",value:function(){var e=this._transformStream;e._writableDone=!0;C(e,new TypeError("Writable side aborted"))}},{key:"close",value:function(){var e=this._transformStream;n(!1===e._transforming);e._writableDone=!0;return l(e._transformer,"flush",[e._transformStreamController]).then(function(){if(!0===e._errored)return Promise.reject(e._storedError);!1===e._readableClosed&&k(e);return Promise.resolve()}).catch(function(t){S(e,t);return Promise.reject(e._storedError)})}}]);return e}(),T=function(){function e(t,r){i(this,e);this._transformStream=t;this._startPromise=r}a(e,[{key:"start",value:function(e){var t=this._transformStream;t._readableController=e;return this._startPromise.then(function(){n(void 0!==t._backpressureChangePromise,"_backpressureChangePromise should have been initialized");if(!0===t._backpressure)return Promise.resolve();n(!1===t._backpressure,"_backpressure should have been initialized");return t._backpressureChangePromise})}},{key:"pull",value:function(){var e=this._transformStream;n(!0===e._backpressure,"pull() should be never called while _backpressure is false");n(void 0!==e._backpressureChangePromise,"_backpressureChangePromise should have been initialized");_(e,!1);return e._backpressureChangePromise}},{key:"cancel",value:function(){var e=this._transformStream;e._readableClosed=!0;C(e,new TypeError("Readable side canceled"))}}]);return e}(),E=function(){function e(t){i(this,e);if(!1===I(t))throw new TypeError("TransformStreamDefaultController can only be constructed with a TransformStream instance");if(void 0!==t._transformStreamController)throw new TypeError("TransformStreamDefaultController instances can only be created by the TransformStream constructor");this._controlledTransformStream=t}a(e,[{key:"enqueue",value:function(e){if(!1===P(this))throw R("enqueue");w(this._controlledTransformStream,e)}},{key:"close",value:function(){if(!1===P(this))throw R("close");!function(e){if(!0===e._errored)throw new TypeError("TransformStream is already errored");if(!0===e._readableClosed)throw new TypeError("Readable side is already closed");k(e)}(this._controlledTransformStream)}},{key:"error",value:function(e){if(!1===P(this))throw R("error");!function(e,t){if(!0===e._errored)throw new TypeError("TransformStream is already errored");C(e,t)}(this._controlledTransformStream,e)}},{key:"desiredSize",get:function(){if(!1===P(this))throw R("desiredSize");var e=this._controlledTransformStream._readableController;return p(e)}}]);return e}(),F=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);this._transformer=t;var r=t.readableStrategy,a=t.writableStrategy;this._transforming=!1;this._errored=!1;this._storedError=void 0;this._writableController=void 0;this._readableController=void 0;this._transformStreamController=void 0;this._writableDone=!1;this._readableClosed=!1;this._backpressure=void 0;this._backpressureChangePromise=void 0;this._backpressureChangePromise_resolve=void 0;this._transformStreamController=new E(this);var o=void 0,c=new Promise(function(e){o=e}),l=new T(this,c);this._readable=new f(l,r);var u=new O(this,c);this._writable=new b(u,a);n(void 0!==this._writableController);n(void 0!==this._readableController);_(this,p(this._readableController)<=0);var h=this,d=s(t,"start",[h._transformStreamController]);o(d);c.catch(function(e){if(!1===h._errored){h._errored=!0;h._storedError=e}})}a(e,[{key:"readable",get:function(){if(!1===I(this))throw B("readable");return this._readable}},{key:"writable",get:function(){if(!1===I(this))throw B("writable");return this._writable}}]);return e}();e.exports={TransformStream:F};function R(e){return new TypeError("TransformStreamDefaultController.prototype."+e+" can only be used on a TransformStreamDefaultController")}function B(e){return new TypeError("TransformStream.prototype."+e+" can only be used on a TransformStream")}},function(e,t,r){e.exports=r(5)}]))},function(e,t,r){"use strict";var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=!1;try{if("function"==typeof URL&&"object"===a(URL.prototype)&&"origin"in URL.prototype){var n=new URL("b","http://a");n.pathname="c%20d";i="http://a/c%20d"===n.href}}catch(e){}if(i)t.URL=URL;else{var o=r(129).URL,s=r(4).URL;if(s){o.createObjectURL=function(e){return s.createObjectURL.apply(s,arguments)};o.revokeObjectURL=function(e){s.revokeObjectURL(e)}}t.URL=o}},function(e,t,r){"use strict";!function(){var e=Object.create(null);e.ftp=21;e.file=0;e.gopher=70;e.http=80;e.https=443;e.ws=80;e.wss=443;var r=Object.create(null);r["%2e"]=".";r[".%2e"]="..";r["%2e."]="..";r["%2e%2e"]="..";function a(t){return void 0!==e[t]}function i(){f.call(this);this._isInvalid=!0}function n(e){""===e&&i.call(this);return e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1===[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function s(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1===[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}var c,l=/[a-zA-Z]/,u=/[a-zA-Z0-9\+\-\.]/;function h(t,h,f){function d(e){y.push(e)}var g=h||"scheme start",m=0,p="",v=!1,b=!1,y=[];e:for(;(t[m-1]!==c||0===m)&&!this._isInvalid;){var w=t[m];switch(g){case"scheme start":if(!w||!l.test(w)){if(h){d("Invalid scheme.");break e}p="";g="no scheme";continue}p+=w.toLowerCase();g="scheme";break;case"scheme":if(w&&u.test(w))p+=w.toLowerCase();else{if(":"!==w){if(h){if(w===c)break e;d("Code point not allowed in scheme: "+w);break e}p="";m=0;g="no scheme";continue}this._scheme=p;p="";if(h)break e;a(this._scheme)&&(this._isRelative=!0);g="file"===this._scheme?"relative":this._isRelative&&f&&f._scheme===this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":if("?"===w){this._query="?";g="query"}else if("#"===w){this._fragment="#";g="fragment"}else w!==c&&"\t"!==w&&"\n"!==w&&"\r"!==w&&(this._schemeData+=o(w));break;case"no scheme":if(f&&a(f._scheme)){g="relative";continue}d("Missing scheme.");i.call(this);break;case"relative or authority":if("/"!==w||"/"!==t[m+1]){d("Expected /, got: "+w);g="relative";continue}g="authority ignore slashes";break;case"relative":this._isRelative=!0;"file"!==this._scheme&&(this._scheme=f._scheme);if(w===c){this._host=f._host;this._port=f._port;this._path=f._path.slice();this._query=f._query;this._username=f._username;this._password=f._password;break e}if("/"===w||"\\"===w){"\\"===w&&d("\\ is an invalid code point.");g="relative slash"}else if("?"===w){this._host=f._host;this._port=f._port;this._path=f._path.slice();this._query="?";this._username=f._username;this._password=f._password;g="query"}else{if("#"!==w){var k=t[m+1],S=t[m+2];if("file"!==this._scheme||!l.test(w)||":"!==k&&"|"!==k||S!==c&&"/"!==S&&"\\"!==S&&"?"!==S&&"#"!==S){this._host=f._host;this._port=f._port;this._username=f._username;this._password=f._password;this._path=f._path.slice();this._path.pop()}g="relative path";continue}this._host=f._host;this._port=f._port;this._path=f._path.slice();this._query=f._query;this._fragment="#";this._username=f._username;this._password=f._password;g="fragment"}break;case"relative slash":if("/"!==w&&"\\"!==w){if("file"!==this._scheme){this._host=f._host;this._port=f._port;this._username=f._username;this._password=f._password}g="relative path";continue}"\\"===w&&d("\\ is an invalid code point.");g="file"===this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!==w){d("Expected '/', got: "+w);g="authority ignore slashes";continue}g="authority second slash";break;case"authority second slash":g="authority ignore slashes";if("/"!==w){d("Expected '/', got: "+w);continue}break;case"authority ignore slashes":if("/"!==w&&"\\"!==w){g="authority";continue}d("Expected authority, got: "+w);break;case"authority":if("@"===w){if(v){d("@ already seen.");p+="%40"}v=!0;for(var C=0;C<p.length;C++){var x=p[C];if("\t"!==x&&"\n"!==x&&"\r"!==x)if(":"!==x||null!==this._password){var _=o(x);null!==this._password?this._password+=_:this._username+=_}else this._password="";else d("Invalid whitespace in authority.")}p=""}else{if(w===c||"/"===w||"\\"===w||"?"===w||"#"===w){m-=p.length;p="";g="host";continue}p+=w}break;case"file host":if(w===c||"/"===w||"\\"===w||"?"===w||"#"===w){if(2!==p.length||!l.test(p[0])||":"!==p[1]&&"|"!==p[1])if(0===p.length)g="relative path start";else{this._host=n.call(this,p);p="";g="relative path start"}else g="relative path";continue}"\t"===w||"\n"===w||"\r"===w?d("Invalid whitespace in file host."):p+=w;break;case"host":case"hostname":if(":"!==w||b){if(w===c||"/"===w||"\\"===w||"?"===w||"#"===w){this._host=n.call(this,p);p="";g="relative path start";if(h)break e;continue}if("\t"!==w&&"\n"!==w&&"\r"!==w){"["===w?b=!0:"]"===w&&(b=!1);p+=w}else d("Invalid code point in host/hostname: "+w)}else{this._host=n.call(this,p);p="";g="port";if("hostname"===h)break e}break;case"port":if(/[0-9]/.test(w))p+=w;else{if(w===c||"/"===w||"\\"===w||"?"===w||"#"===w||h){if(""!==p){var A=parseInt(p,10);A!==e[this._scheme]&&(this._port=A+"");p=""}if(h)break e;g="relative path start";continue}"\t"===w||"\n"===w||"\r"===w?d("Invalid code point in port: "+w):i.call(this)}break;case"relative path start":"\\"===w&&d("'\\' not allowed in path.");g="relative path";if("/"!==w&&"\\"!==w)continue;break;case"relative path":if(w!==c&&"/"!==w&&"\\"!==w&&(h||"?"!==w&&"#"!==w))"\t"!==w&&"\n"!==w&&"\r"!==w&&(p+=o(w));else{"\\"===w&&d("\\ not allowed in relative path.");var P;(P=r[p.toLowerCase()])&&(p=P);if(".."===p){this._path.pop();"/"!==w&&"\\"!==w&&this._path.push("")}else if("."===p&&"/"!==w&&"\\"!==w)this._path.push("");else if("."!==p){"file"===this._scheme&&0===this._path.length&&2===p.length&&l.test(p[0])&&"|"===p[1]&&(p=p[0]+":");this._path.push(p)}p="";if("?"===w){this._query="?";g="query"}else if("#"===w){this._fragment="#";g="fragment"}}break;case"query":if(h||"#"!==w)w!==c&&"\t"!==w&&"\n"!==w&&"\r"!==w&&(this._query+=s(w));else{this._fragment="#";g="fragment"}break;case"fragment":w!==c&&"\t"!==w&&"\n"!==w&&"\r"!==w&&(this._fragment+=w)}m++}}function f(){this._scheme="";this._schemeData="";this._username="";this._password=null;this._host="";this._port="";this._path=[];this._query="";this._fragment="";this._isInvalid=!1;this._isRelative=!1}function d(e,t){void 0===t||t instanceof d||(t=new d(String(t)));this._url=e;f.call(this);var r=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");h.call(this,r,null,t)}d.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";""===this._username&&null===this._password||(e=this._username+(null!==this._password?":"+this._password:"")+"@");return this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){f.call(this);h.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||h.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){if(!this._isInvalid&&this._isRelative){this._path=[];h.call(this,e,"relative path start")}},get search(){return this._isInvalid||!this._query||"?"===this._query?"":this._query},set search(e){if(!this._isInvalid&&this._isRelative){this._query="?";"?"===e[0]&&(e=e.slice(1));h.call(this,e,"query")}},get hash(){return this._isInvalid||!this._fragment||"#"===this._fragment?"":this._fragment},set hash(e){if(!this._isInvalid){this._fragment="#";"#"===e[0]&&(e=e.slice(1));h.call(this,e,"fragment")}},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null";case"blob":try{return new d(this._schemeData).origin||"null"}catch(e){}return"null"}return(e=this.host)?this._scheme+"://"+e:""}};t.URL=d}()},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.NetworkPdfManager=t.LocalPdfManager=void 0;var a,i=r(131),n=(a=i)&&a.__esModule?a:{default:a},o=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),s=r(2),c=r(135),l=r(136),u=r(140);function h(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function d(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,r){return function a(i,n){try{var o=t[i](n),s=o.value}catch(e){r(e);return}if(!o.done)return Promise.resolve(s).then(function(e){a("next",e)},function(e){a("throw",e)});e(s)}("next")})}}function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var m=function(){function e(){g(this,e);this.constructor===e&&(0,s.unreachable)("Cannot initialize BasePdfManager.")}o(e,[{key:"onLoadedStream",value:function(){(0,s.unreachable)("Abstract method `onLoadedStream` called")}},{key:"ensureDoc",value:function(e,t){return this.ensure(this.pdfDocument,e,t)}},{key:"ensureXRef",value:function(e,t){return this.ensure(this.pdfDocument.xref,e,t)}},{key:"ensureCatalog",value:function(e,t){return this.ensure(this.pdfDocument.catalog,e,t)}},{key:"getPage",value:function(e){return this.pdfDocument.getPage(e)}},{key:"cleanup",value:function(){return this.pdfDocument.cleanup()}},{key:"ensure",value:function(){var e=d(n.default.mark(function e(t,r,a){return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:(0,s.unreachable)("Abstract method `ensure` called");case 1:case"end":return e.stop()}},e,this)}));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"requestRange",value:function(e,t){(0,s.unreachable)("Abstract method `requestRange` called")}},{key:"requestLoadedStream",value:function(){(0,s.unreachable)("Abstract method `requestLoadedStream` called")}},{key:"sendProgressiveData",value:function(e){(0,s.unreachable)("Abstract method `sendProgressiveData` called")}},{key:"updatePassword",value:function(e){this._password=e}},{key:"terminate",value:function(){(0,s.unreachable)("Abstract method `terminate` called")}},{key:"docId",get:function(){return this._docId}},{key:"password",get:function(){return this._password}},{key:"docBaseUrl",get:function(){var e=null;if(this._docBaseUrl){var t=(0,s.createValidAbsoluteUrl)(this._docBaseUrl);t?e=t.href:(0,s.warn)('Invalid absolute docBaseUrl: "'+this._docBaseUrl+'".')}return(0,s.shadow)(this,"docBaseUrl",e)}}]);return e}(),p=function(e){f(t,m);function t(e,r,a,i,n){g(this,t);var o=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));o._docId=e;o._password=a;o._docBaseUrl=n;o.evaluatorOptions=i;var s=new u.Stream(r);o.pdfDocument=new l.PDFDocument(o,s);o._loadedStreamPromise=Promise.resolve(s);return o}o(t,[{key:"ensure",value:function(){var e=d(n.default.mark(function e(t,r,a){var i;return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if("function"!=typeof(i=t[r])){e.next=3;break}return e.abrupt("return",i.apply(t,a));case 3:return e.abrupt("return",i);case 4:case"end":return e.stop()}},e,this)}));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"requestRange",value:function(e,t){return Promise.resolve()}},{key:"requestLoadedStream",value:function(){}},{key:"onLoadedStream",value:function(){return this._loadedStreamPromise}},{key:"terminate",value:function(){}}]);return t}(),v=function(e){f(t,m);function t(e,r,a,i,n){g(this,t);var o=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));o._docId=e;o._password=a.password;o._docBaseUrl=n;o.msgHandler=a.msgHandler;o.evaluatorOptions=i;o.streamManager=new c.ChunkedStreamManager(r,{msgHandler:a.msgHandler,url:a.url,length:a.length,disableAutoFetch:a.disableAutoFetch,rangeChunkSize:a.rangeChunkSize});o.pdfDocument=new l.PDFDocument(o,o.streamManager.getStream());return o}o(t,[{key:"ensure",value:function(){var e=d(n.default.mark(function e(t,r,a){var i;return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0;if("function"!=typeof(i=t[r])){e.next=4;break}return e.abrupt("return",i.apply(t,a));case 4:return e.abrupt("return",i);case 7:e.prev=7;e.t0=e.catch(0);if(e.t0 instanceof s.MissingDataException){e.next=11;break}throw e.t0;case 11:e.next=13;return this.requestRange(e.t0.begin,e.t0.end);case 13:return e.abrupt("return",this.ensure(t,r,a));case 14:case"end":return e.stop()}},e,this,[[0,7]])}));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"requestRange",value:function(e,t){return this.streamManager.requestRange(e,t)}},{key:"requestLoadedStream",value:function(){this.streamManager.requestAllChunks()}},{key:"sendProgressiveData",value:function(e){this.streamManager.onReceiveData({chunk:e})}},{key:"onLoadedStream",value:function(){return this.streamManager.onLoadedStream()}},{key:"terminate",value:function(){this.streamManager.abort()}}]);return t}();t.LocalPdfManager=p;t.NetworkPdfManager=v},function(e,t,r){"use strict";e.exports=r(132)},function(e,t,r){"use strict";var a=function(){return this}()||Function("return this")(),i=a.regeneratorRuntime&&Object.getOwnPropertyNames(a).indexOf("regeneratorRuntime")>=0,n=i&&a.regeneratorRuntime;a.regeneratorRuntime=void 0;e.exports=r(133);if(i)a.regeneratorRuntime=n;else try{delete a.regeneratorRuntime}catch(e){a.regeneratorRuntime=void 0}},function(e,t,r){"use strict";(function(e){var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(r){var a,i=Object.prototype,n=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},s=o.iterator||"@@iterator",c=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag",u="object"===t(e),h=r.regeneratorRuntime;if(h)u&&(e.exports=h);else{(h=r.regeneratorRuntime=u?e.exports:{}).wrap=k;var f="suspendedStart",d="suspendedYield",g="executing",m="completed",p={},v={};v[s]=function(){return this};var b=Object.getPrototypeOf,y=b&&b(b(F([])));y&&y!==i&&n.call(y,s)&&(v=y);var w=_.prototype=C.prototype=Object.create(v);x.prototype=w.constructor=_;_.constructor=x;_[l]=x.displayName="GeneratorFunction";h.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===x||"GeneratorFunction"===(t.displayName||t.name))};h.mark=function(e){if(Object.setPrototypeOf)Object.setPrototypeOf(e,_);else{e.__proto__=_;l in e||(e[l]="GeneratorFunction")}e.prototype=Object.create(w);return e};h.awrap=function(e){return{__await:e}};A(P.prototype);P.prototype[c]=function(){return this};h.AsyncIterator=P;h.async=function(e,t,r,a){var i=new P(k(e,t,r,a));return h.isGeneratorFunction(t)?i:i.next().then(function(e){return e.done?e.value:i.next()})};A(w);w[l]="Generator";w[s]=function(){return this};w.toString=function(){return"[object Generator]"};h.keys=function(e){var t=[];for(var r in e)t.push(r);t.reverse();return function r(){for(;t.length;){var a=t.pop();if(a in e){r.value=a;r.done=!1;return r}}r.done=!0;return r}};h.values=F;E.prototype={constructor:E,reset:function(e){this.prev=0;this.next=0;this.sent=this._sent=a;this.done=!1;this.delegate=null;this.method="next";this.arg=a;this.tryEntries.forEach(T);if(!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=a)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(r,i){s.type="throw";s.arg=e;t.next=r;if(i){t.method="next";t.arg=a}return!!i}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var c=n.call(o,"catchLoc"),l=n.call(o,"finallyLoc");if(c&&l){if(this.prev<o.catchLoc)return r(o.catchLoc,!0);if(this.prev<o.finallyLoc)return r(o.finallyLoc)}else if(c){if(this.prev<o.catchLoc)return r(o.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return r(o.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};o.type=e;o.arg=t;if(i){this.method="next";this.next=i.finallyLoc;return p}return this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;if("break"===e.type||"continue"===e.type)this.next=e.arg;else if("return"===e.type){this.rval=this.arg=e.arg;this.method="return";this.next="end"}else"normal"===e.type&&t&&(this.next=t);return p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e){this.complete(r.completion,r.afterLoc);T(r);return p}}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var a=r.completion;if("throw"===a.type){var i=a.arg;T(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){this.delegate={iterator:F(e),resultName:t,nextLoc:r};"next"===this.method&&(this.arg=a);return p}}}function k(e,t,r,a){var i=t&&t.prototype instanceof C?t:C,n=Object.create(i.prototype),o=new E(a||[]);n._invoke=function(e,t,r){var a=f;return function(i,n){if(a===g)throw new Error("Generator is already running");if(a===m){if("throw"===i)throw n;return R()}r.method=i;r.arg=n;for(;;){var o=r.delegate;if(o){var s=I(o,r);if(s){if(s===p)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(a===f){a=m;throw r.arg}r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);a=g;var c=S(e,t,r);if("normal"===c.type){a=r.done?m:d;if(c.arg===p)continue;return{value:c.arg,done:r.done}}if("throw"===c.type){a=m;r.method="throw";r.arg=c.arg}}}}(e,r,o);return n}function S(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function C(){}function x(){}function _(){}function A(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function P(e){var r;this._invoke=function(a,i){function o(){return new Promise(function(r,o){!function r(a,i,o,s){var c=S(e[a],e,i);if("throw"!==c.type){var l=c.arg,u=l.value;return u&&"object"===(void 0===u?"undefined":t(u))&&n.call(u,"__await")?Promise.resolve(u.__await).then(function(e){r("next",e,o,s)},function(e){r("throw",e,o,s)}):Promise.resolve(u).then(function(e){l.value=e;o(l)},s)}s(c.arg)}(a,i,r,o)})}return r=r?r.then(o,o):o()}}function I(e,t){var r=e.iterator[t.method];if(r===a){t.delegate=null;if("throw"===t.method){if(e.iterator.return){t.method="return";t.arg=a;I(e,t);if("throw"===t.method)return p}t.method="throw";t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var i=S(r,e.iterator,t.arg);if("throw"===i.type){t.method="throw";t.arg=i.arg;t.delegate=null;return p}var n=i.arg;if(!n){t.method="throw";t.arg=new TypeError("iterator result is not an object");t.delegate=null;return p}if(!n.done)return n;t[e.resultName]=n.value;t.next=e.nextLoc;if("return"!==t.method){t.method="next";t.arg=a}t.delegate=null;return p}function O(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]);if(2 in e){t.finallyLoc=e[2];t.afterLoc=e[3]}this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal";delete t.arg;e.completion=t}function E(e){this.tryEntries=[{tryLoc:"root"}];e.forEach(O,this);this.reset(!0)}function F(e){if(e){var t=e[s];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r<e.length;)if(n.call(e,r)){t.value=e[r];t.done=!1;return t}t.value=a;t.done=!0;return t};return i.next=i}}return{next:R}}function R(){return{value:a,done:!0}}}(function(){return this}()||Function("return this")())}).call(this,r(134)(e))},function(e,t,r){"use strict";e.exports=function(e){if(!e.webpackPolyfill){e.deprecate=function(){};e.paths=[];e.children||(e.children=[]);Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}});Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}});e.webpackPolyfill=1}return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.ChunkedStreamManager=t.ChunkedStream=void 0;var a=r(2),i=function(){function e(e,t,r){this.bytes=new Uint8Array(e);this.start=0;this.pos=0;this.end=e;this.chunkSize=t;this.loadedChunks=[];this.numChunksLoaded=0;this.numChunks=Math.ceil(e/t);this.manager=r;this.progressiveDataLength=0;this.lastSuccessfulEnsureByteChunk=-1}e.prototype={getMissingChunks:function(){for(var e=[],t=0,r=this.numChunks;t<r;++t)this.loadedChunks[t]||e.push(t);return e},getBaseStreams:function(){return[this]},allChunksLoaded:function(){return this.numChunksLoaded===this.numChunks},onReceiveData:function(e,t){var r=e+t.byteLength;if(e%this.chunkSize!=0)throw new Error("Bad begin offset: "+e);var a=this.bytes.length;if(r%this.chunkSize!=0&&r!==a)throw new Error("Bad end offset: "+r);this.bytes.set(new Uint8Array(t),e);var i,n=this.chunkSize,o=Math.floor(e/n),s=Math.floor((r-1)/n)+1;for(i=o;i<s;++i)if(!this.loadedChunks[i]){this.loadedChunks[i]=!0;++this.numChunksLoaded}},onReceiveProgressiveData:function(e){var t=this.progressiveDataLength,r=Math.floor(t/this.chunkSize);this.bytes.set(new Uint8Array(e),t);t+=e.byteLength;this.progressiveDataLength=t;var a,i=t>=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(a=r;a<i;++a)if(!this.loadedChunks[a]){this.loadedChunks[a]=!0;++this.numChunksLoaded}},ensureByte:function(e){var t=Math.floor(e/this.chunkSize);if(t!==this.lastSuccessfulEnsureByteChunk){if(!this.loadedChunks[t])throw new a.MissingDataException(e,e+1);this.lastSuccessfulEnsureByteChunk=t}},ensureRange:function(e,t){if(!(e>=t||t<=this.progressiveDataLength))for(var r=this.chunkSize,i=Math.floor(e/r),n=Math.floor((t-1)/r)+1,o=i;o<n;++o)if(!this.loadedChunks[o])throw new a.MissingDataException(e,t)},nextEmptyChunk:function(e){for(var t,r=this.numChunks,a=0;a<r;++a){t=(e+a)%r;if(!this.loadedChunks[t])return t}return null},hasChunk:function(e){return!!this.loadedChunks[e]},get length(){return this.end-this.start},get isEmpty(){return 0===this.length},getByte:function(){var e=this.pos;if(e>=this.end)return-1;this.ensureByte(e);return this.bytes[this.pos++]},getUint16:function(){var e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t},getInt32:function(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()},getBytes:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.bytes,a=this.pos,i=this.end;if(!e){this.ensureRange(a,i);var n=r.subarray(a,i);return t?new Uint8ClampedArray(n):n}var o=a+e;o>i&&(o=i);this.ensureRange(a,o);this.pos=o;var s=r.subarray(a,o);return t?new Uint8ClampedArray(s):s},peekByte:function(){var e=this.getByte();this.pos--;return e},peekBytes:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBytes(e,t);this.pos-=r.length;return r},getByteRange:function(e,t){this.ensureRange(e,t);return this.bytes.subarray(e,t)},skip:function(e){e||(e=1);this.pos+=e},reset:function(){this.pos=this.start},moveStart:function(){this.start=this.pos},makeSubStream:function(e,t,r){this.ensureRange(e,e+t);function a(){}a.prototype=Object.create(this);a.prototype.getMissingChunks=function(){for(var e=this.chunkSize,t=Math.floor(this.start/e),r=Math.floor((this.end-1)/e)+1,a=[],i=t;i<r;++i)this.loadedChunks[i]||a.push(i);return a};var i=new a;i.pos=i.start=e;i.end=e+t||this.end;i.dict=r;return i}};return e}(),n=function(){function e(e,t){var r=t.rangeChunkSize,n=t.length;this.stream=new i(n,r,this);this.length=n;this.chunkSize=r;this.pdfNetworkStream=e;this.url=t.url;this.disableAutoFetch=t.disableAutoFetch;this.msgHandler=t.msgHandler;this.currRequestId=0;this.chunksNeededByRequest=Object.create(null);this.requestsByChunk=Object.create(null);this.promisesByRequest=Object.create(null);this.progressiveDataLength=0;this.aborted=!1;this._loadedStreamCapability=(0,a.createPromiseCapability)()}e.prototype={onLoadedStream:function(){return this._loadedStreamCapability.promise},sendRequest:function(e,t){var r=this,i=this.pdfNetworkStream.getRangeReader(e,t);i.isStreamingSupported||(i.onProgress=this.onProgress.bind(this));var n=[],o=0,s=this;new Promise(function(e,t){i.read().then(function r(c){try{if(!c.done){var l=c.value;n.push(l);o+=(0,a.arrayByteLength)(l);i.isStreamingSupported&&s.onProgress({loaded:o});i.read().then(r,t);return}var u=(0,a.arraysToBytes)(n);n=null;e(u)}catch(e){t(e)}},t)}).then(function(t){r.aborted||r.onReceiveData({chunk:t,begin:e})})},requestAllChunks:function(){var e=this.stream.getMissingChunks();this._requestChunks(e);return this._loadedStreamCapability.promise},_requestChunks:function(e){var t,r,i=this.currRequestId++,n=Object.create(null);this.chunksNeededByRequest[i]=n;for(t=0,r=e.length;t<r;t++)this.stream.hasChunk(e[t])||(n[e[t]]=!0);if((0,a.isEmptyObj)(n))return Promise.resolve();var o=(0,a.createPromiseCapability)();this.promisesByRequest[i]=o;var s=[];for(var c in n){if(!((c|=0)in this.requestsByChunk)){this.requestsByChunk[c]=[];s.push(c)}this.requestsByChunk[c].push(i)}if(!s.length)return o.promise;var l=this.groupChunks(s);for(t=0;t<l.length;++t){var u=l[t],h=u.beginChunk*this.chunkSize,f=Math.min(u.endChunk*this.chunkSize,this.length);this.sendRequest(h,f)}return o.promise},getStream:function(){return this.stream},requestRange:function(e,t){t=Math.min(t,this.length);for(var r=this.getBeginChunk(e),a=this.getEndChunk(t),i=[],n=r;n<a;++n)i.push(n);return this._requestChunks(i)},requestRanges:function(e){e=e||[];for(var t=[],r=0;r<e.length;r++)for(var a=this.getBeginChunk(e[r].begin),i=this.getEndChunk(e[r].end),n=a;n<i;++n)t.includes(n)||t.push(n);t.sort(function(e,t){return e-t});return this._requestChunks(t)},groupChunks:function(e){for(var t=[],r=-1,a=-1,i=0;i<e.length;++i){var n=e[i];r<0&&(r=n);if(a>=0&&a+1!==n){t.push({beginChunk:r,endChunk:a+1});r=n}i+1===e.length&&t.push({beginChunk:r,endChunk:n+1});a=n}return t},onProgress:function(e){var t=this.stream.numChunksLoaded*this.chunkSize+e.loaded;this.msgHandler.send("DocProgress",{loaded:t,total:this.length})},onReceiveData:function(e){var t=e.chunk,r=void 0===e.begin,i=r?this.progressiveDataLength:e.begin,n=i+t.byteLength,o=Math.floor(i/this.chunkSize),s=n<this.length?Math.floor(n/this.chunkSize):Math.ceil(n/this.chunkSize);if(r){this.stream.onReceiveProgressiveData(t);this.progressiveDataLength=n}else this.stream.onReceiveData(i,t);this.stream.allChunksLoaded()&&this._loadedStreamCapability.resolve(this.stream);var c,l,u=[];for(t=o;t<s;++t){var h=this.requestsByChunk[t]||[];delete this.requestsByChunk[t];for(c=0;c<h.length;++c){l=h[c];var f=this.chunksNeededByRequest[l];t in f&&delete f[t];(0,a.isEmptyObj)(f)&&u.push(l)}}if(!this.disableAutoFetch&&(0,a.isEmptyObj)(this.requestsByChunk)){var d;if(1===this.stream.numChunksLoaded){var g=this.stream.numChunks-1;this.stream.hasChunk(g)||(d=g)}else d=this.stream.nextEmptyChunk(s);Number.isInteger(d)&&this._requestChunks([d])}for(c=0;c<u.length;++c){l=u[c];var m=this.promisesByRequest[l];delete this.promisesByRequest[l];m.resolve()}this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})},onError:function(e){this._loadedStreamCapability.reject(e)},getBeginChunk:function(e){return Math.floor(e/this.chunkSize)},getEndChunk:function(e){return Math.floor((e-1)/this.chunkSize)+1},abort:function(){this.aborted=!0;this.pdfNetworkStream&&this.pdfNetworkStream.cancelAllRequests("abort");for(var e in this.promisesByRequest){this.promisesByRequest[e].reject(new Error("Request was aborted"))}}};return e}();t.ChunkedStream=i;t.ChunkedStreamManager=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFDocument=t.Page=void 0;var a=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,i=!1,n=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){r.push(o.value);if(t&&r.length===t)break}}catch(e){i=!0;n=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw n}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(2),n=r(137),o=r(138),s=r(140),c=r(152),l=r(150),u=r(139),h=r(153),f=r(154),d=r(168),g=function(){var e=[0,0,612,792];function t(e,t){return"display"===t&&e.viewable||"print"===t&&e.printable}function r(e){var t=e.pdfManager,r=e.xref,a=e.pageIndex,i=e.pageDict,n=e.ref,o=e.fontCache,s=e.builtInCMapCache,c=e.pdfFunctionFactory;this.pdfManager=t;this.pageIndex=a;this.pageDict=i;this.xref=r;this.ref=n;this.fontCache=o;this.builtInCMapCache=s;this.pdfFunctionFactory=c;this.evaluatorOptions=t.evaluatorOptions;this.resourcesPromise=null;var l="p"+this.pageIndex+"_",u={obj:0};this.idFactory={createObjId:function(){return l+ ++u.obj}}}r.prototype={_getInheritableProperty:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=(0,i.getInheritableProperty)({dict:this.pageDict,key:e,getArray:t,stopWhenFound:!1});return Array.isArray(r)?1!==r.length&&(0,o.isDict)(r[0])?o.Dict.merge(this.xref,r):r[0]:r},get content(){return this.pageDict.get("Contents")},get resources(){return(0,i.shadow)(this,"resources",this._getInheritableProperty("Resources")||o.Dict.empty)},get mediaBox(){var t=this._getInheritableProperty("MediaBox",!0);return Array.isArray(t)&&4===t.length?(0,i.shadow)(this,"mediaBox",t):(0,i.shadow)(this,"mediaBox",e)},get cropBox(){var e=this._getInheritableProperty("CropBox",!0);return Array.isArray(e)&&4===e.length?(0,i.shadow)(this,"cropBox",e):(0,i.shadow)(this,"cropBox",this.mediaBox)},get userUnit(){var e=this.pageDict.get("UserUnit");(!(0,i.isNum)(e)||e<=0)&&(e=1);return(0,i.shadow)(this,"userUnit",e)},get view(){var e=this.mediaBox,t=this.cropBox;if(e===t)return(0,i.shadow)(this,"view",e);var r=i.Util.intersect(t,e);return(0,i.shadow)(this,"view",r||e)},get rotate(){var e=this._getInheritableProperty("Rotate")||0;e%90!=0?e=0:e>=360?e%=360:e<0&&(e=(e%360+360)%360);return(0,i.shadow)(this,"rotate",e)},getContentStream:function(){var e,t=this.content;if(Array.isArray(t)){var r,a=this.xref,i=t.length,n=[];for(r=0;r<i;++r)n.push(a.fetchIfRef(t[r]));e=new s.StreamsSequenceStream(n)}else e=(0,o.isStream)(t)?t:new s.NullStream;return e},loadResources:function(e){var t=this;this.resourcesPromise||(this.resourcesPromise=this.pdfManager.ensure(this,"resources"));return this.resourcesPromise.then(function(){return new n.ObjectLoader(t.resources,e,t.xref).load()})},getOperatorList:function(e){var r=this,n=e.handler,o=e.task,s=e.intent,c=e.renderInteractiveForms,l=this.pdfManager.ensure(this,"getContentStream"),u=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]),d=new f.PartialEvaluator({pdfManager:this.pdfManager,xref:this.xref,handler:n,pageIndex:this.pageIndex,idFactory:this.idFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,options:this.evaluatorOptions,pdfFunctionFactory:this.pdfFunctionFactory}),g=Promise.all([l,u]).then(function(e){var t=a(e,1)[0],i=new h.OperatorList(s,n,r.pageIndex);n.send("StartRenderPage",{transparency:d.hasBlendModes(r.resources),pageIndex:r.pageIndex,intent:s});return d.getOperatorList({stream:t,task:o,resources:r.resources,operatorList:i}).then(function(){return i})});return Promise.all([g,this._parsedAnnotations]).then(function(e){var r=a(e,2),n=r[0],l=r[1];if(0===l.length){n.flush(!0);return n}var u,h,f=[];for(u=0,h=l.length;u<h;u++)t(l[u],s)&&f.push(l[u].getOperatorList(d,o,c));return Promise.all(f).then(function(e){n.addOp(i.OPS.beginAnnotations,[]);for(u=0,h=e.length;u<h;u++)n.addOpList(e[u]);n.addOp(i.OPS.endAnnotations,[]);n.flush(!0);return n})})},extractTextContent:function(e){var t=this,r=e.handler,i=e.task,n=e.normalizeWhitespace,o=e.sink,s=e.combineTextItems,c=this.pdfManager.ensure(this,"getContentStream"),l=this.loadResources(["ExtGState","XObject","Font"]);return Promise.all([c,l]).then(function(e){var c=a(e,1)[0];return new f.PartialEvaluator({pdfManager:t.pdfManager,xref:t.xref,handler:r,pageIndex:t.pageIndex,idFactory:t.idFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,options:t.evaluatorOptions,pdfFunctionFactory:t.pdfFunctionFactory}).getTextContent({stream:c,task:i,resources:t.resources,normalizeWhitespace:n,combineTextItems:s,sink:o})})},getAnnotationsData:function(e){return this._parsedAnnotations.then(function(r){for(var a=[],i=0,n=r.length;i<n;i++)e&&!t(r[i],e)||a.push(r[i].data);return a})},get annotations(){return(0,i.shadow)(this,"annotations",this._getInheritableProperty("Annots")||[])},get _parsedAnnotations(){var e=this,t=this.pdfManager.ensure(this,"annotations").then(function(){for(var t=e.annotations,r=[],a=0,n=t.length;a<n;a++)r.push(c.AnnotationFactory.create(e.xref,t[a],e.pdfManager,e.idFactory));return Promise.all(r).then(function(e){return e.filter(function(e){return!!e})},function(e){(0,i.warn)('_parsedAnnotations: "'+e+'".');return[]})});return(0,i.shadow)(this,"_parsedAnnotations",t)}};return r}(),m=function(){function e(e,t){var r;if((0,o.isStream)(t))r=t;else{if(!(0,i.isArrayBuffer)(t))throw new Error("PDFDocument: Unknown argument type");r=new s.Stream(t)}if(r.length<=0)throw new Error("PDFDocument: stream must have data");this.pdfManager=e;this.stream=r;this.xref=new n.XRef(r,e);var a=e.evaluatorOptions;this.pdfFunctionFactory=new d.PDFFunctionFactory({xref:this.xref,isEvalSupported:a.isEvalSupported});this._pagePromises=[]}function t(e,t,r,a){var i=e.pos,n=e.end,o=[];i+r>n&&(r=n-i);for(var s=0;s<r;++s)o.push(String.fromCharCode(e.getByte()));var c=o.join("");e.pos=i;var l=a?c.lastIndexOf(t):c.indexOf(t);if(-1===l)return!1;e.pos+=l;return!0}var r={Title:i.isString,Author:i.isString,Subject:i.isString,Keywords:i.isString,Creator:i.isString,Producer:i.isString,CreationDate:i.isString,ModDate:i.isString,Trapped:o.isName};e.prototype={parse:function(e){this.setup(e);var t=this.catalog.catDict.get("Version");(0,o.isName)(t)&&(this.pdfFormatVersion=t.name);try{this.acroForm=this.catalog.catDict.get("AcroForm");if(this.acroForm){this.xfa=this.acroForm.get("XFA");var r=this.acroForm.get("Fields");r&&Array.isArray(r)&&0!==r.length||this.xfa||(this.acroForm=null)}}catch(e){if(e instanceof i.MissingDataException)throw e;(0,i.info)("Something wrong with AcroForm entry");this.acroForm=null}},get linearization(){var e=null;try{e=u.Linearization.create(this.stream)}catch(e){if(e instanceof i.MissingDataException)throw e;(0,i.info)(e)}return(0,i.shadow)(this,"linearization",e)},get startXRef(){var e=this.stream,r=0;if(this.linearization){e.reset();t(e,"endobj",1024)&&(r=e.pos+6)}else{for(var a=!1,n=e.end;!a&&n>0;){(n-=1024-"startxref".length)<0&&(n=0);e.pos=n;a=t(e,"startxref",1024,!0)}if(a){e.skip(9);var o;do{o=e.getByte()}while((0,i.isSpace)(o));for(var s="";o>=32&&o<=57;){s+=String.fromCharCode(o);o=e.getByte()}r=parseInt(s,10);isNaN(r)&&(r=0)}}return(0,i.shadow)(this,"startXRef",r)},checkHeader:function(){var e=this.stream;e.reset();if(t(e,"%PDF-",1024)){e.moveStart();for(var r,a="";(r=e.getByte())>32&&!(a.length>=12);)a+=String.fromCharCode(r);this.pdfFormatVersion||(this.pdfFormatVersion=a.substring(5))}else;},parseStartXRef:function(){var e=this.startXRef;this.xref.setStartXRef(e)},setup:function(e){this.xref.parse(e);this.catalog=new n.Catalog(this.pdfManager,this.xref)},get numPages(){var e=this.linearization,t=e?e.numPages:this.catalog.numPages;return(0,i.shadow)(this,"numPages",t)},get documentInfo(){var e={PDFFormatVersion:this.pdfFormatVersion,IsLinearized:!!this.linearization,IsAcroFormPresent:!!this.acroForm,IsXFAPresent:!!this.xfa},t=void 0;try{t=this.xref.trailer.get("Info")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,i.info)("The document information dictionary is invalid.")}if((0,o.isDict)(t))for(var a in r)if(t.has(a)){var n=t.get(a);r[a](n)?e[a]="string"!=typeof n?n:(0,i.stringToPDFString)(n):(0,i.info)('Bad value in document info for "'+a+'"')}return(0,i.shadow)(this,"documentInfo",e)},get fingerprint(){var e,t="",r=this.xref.trailer.get("ID");if(Array.isArray(r)&&r[0]&&(0,i.isString)(r[0])&&"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"!==r[0])e=(0,i.stringToBytes)(r[0]);else{this.stream.ensureRange&&this.stream.ensureRange(0,Math.min(1024,this.stream.end));e=(0,l.calculateMD5)(this.stream.bytes.subarray(0,1024),0,1024)}for(var a=0,n=e.length;a<n;a++){var o=e[a].toString(16);t+=1===o.length?"0"+o:o}return(0,i.shadow)(this,"fingerprint",t)},_getLinearizationPage:function(e){var t=this.catalog,r=this.linearization;(0,i.assert)(r&&r.pageFirst===e);var a=new o.Ref(r.objectNumberFirst,0);return this.xref.fetchAsync(a).then(function(e){if((0,o.isDict)(e,"Page")||(0,o.isDict)(e)&&!e.has("Type")&&e.has("Contents")){a&&!t.pageKidsCountCache.has(a)&&t.pageKidsCountCache.put(a,1);return[e,a]}throw new i.FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.")}).catch(function(r){(0,i.info)(r);return t.getPageDict(e)})},getPage:function(e){var t=this;if(void 0!==this._pagePromises[e])return this._pagePromises[e];var r=this.catalog,i=this.linearization,n=i&&i.pageFirst===e?this._getLinearizationPage(e):r.getPageDict(e);return this._pagePromises[e]=n.then(function(i){var n=a(i,2),o=n[0],s=n[1];return new g({pdfManager:t.pdfManager,xref:t.xref,pageIndex:e,pageDict:o,ref:s,fontCache:r.fontCache,builtInCMapCache:r.builtInCMapCache,pdfFunctionFactory:t.pdfFunctionFactory})})},cleanup:function(){return this.catalog.cleanup()}};return e}();t.Page=g;t.PDFDocument=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.FileSpec=t.XRef=t.ObjectLoader=t.Catalog=void 0;var a,i=r(131),n=(a=i)&&a.__esModule?a:{default:a},o=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,i=!1,n=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){r.push(o.value);if(t&&r.length===t)break}}catch(e){i=!0;n=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw n}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),l=r(2),u=r(138),h=r(139),f=r(135),d=r(150),g=r(151);function m(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function v(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,r){return function a(i,n){try{var o=t[i](n),s=o.value}catch(e){r(e);return}if(!o.done)return Promise.resolve(s).then(function(e){a("next",e)},function(e){a("throw",e)});e(s)}("next")})}}function b(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function y(e){return(0,u.isDict)(e)?e.get("D"):e}var w=function(){function e(t,r){b(this,e);this.pdfManager=t;this.xref=r;this.catDict=r.getCatalogObj();if(!(0,u.isDict)(this.catDict))throw new l.FormatError("Catalog object is not a dictionary.");this.fontCache=new u.RefSetCache;this.builtInCMapCache=new Map;this.pageKidsCountCache=new u.RefSetCache}c(e,[{key:"_readDocumentOutline",value:function(){var t=this.catDict.get("Outlines");if(!(0,u.isDict)(t))return null;t=t.getRaw("First");if(!(0,u.isRef)(t))return null;var r={items:[]},a=[{obj:t,parent:r}],i=new u.RefSet;i.put(t);for(var n=this.xref,o=new Uint8ClampedArray(3);a.length>0;){var s=a.shift(),c=n.fetchIfRef(s.obj);if(null!==c){if(!c.has("Title"))throw new l.FormatError("Invalid outline item encountered.");var h={url:null,dest:null};e.parseDestDictionary({destDict:c,resultObj:h,docBaseUrl:this.pdfManager.docBaseUrl});var f=c.get("Title"),d=c.get("F")||0,m=c.getArray("C"),p=o;!Array.isArray(m)||3!==m.length||0===m[0]&&0===m[1]&&0===m[2]||(p=g.ColorSpace.singletons.rgb.getRgb(m,0));var v={dest:h.dest,url:h.url,unsafeUrl:h.unsafeUrl,newWindow:h.newWindow,title:(0,l.stringToPDFString)(f),color:p,count:c.get("Count"),bold:!!(2&d),italic:!!(1&d),items:[]};s.parent.items.push(v);t=c.getRaw("First");if((0,u.isRef)(t)&&!i.has(t)){a.push({obj:t,parent:v});i.put(t)}t=c.getRaw("Next");if((0,u.isRef)(t)&&!i.has(t)){a.push({obj:t,parent:s.parent});i.put(t)}}}return r.items.length>0?r.items:null}},{key:"_readPermissions",value:function(){var e=this.xref.trailer.get("Encrypt");if(!(0,u.isDict)(e))return null;var t=e.get("P");if(!(0,l.isNum)(t))return null;t+=Math.pow(2,32);var r=[];for(var a in l.PermissionFlag){var i=l.PermissionFlag[a];t&i&&r.push(i)}return r}},{key:"getDestination",value:function(e){var t=this._readDests();return t instanceof C||t instanceof u.Dict?y(t.get(e)||null):null}},{key:"_readDests",value:function(){var e=this.catDict.get("Names");return e&&e.has("Dests")?new C(e.getRaw("Dests"),this.xref):this.catDict.has("Dests")?this.catDict.get("Dests"):void 0}},{key:"_readPageLabels",value:function(){var e=this.catDict.getRaw("PageLabels");if(!e)return null;for(var t=new Array(this.numPages),r=null,a="",i=new x(e,this.xref).getAll(),n="",o=1,s=0,c=this.numPages;s<c;s++){if(s in i){var h=i[s];if(!(0,u.isDict)(h))throw new l.FormatError("PageLabel is not a dictionary.");if(h.has("Type")&&!(0,u.isName)(h.get("Type"),"PageLabel"))throw new l.FormatError("Invalid type in PageLabel dictionary.");if(h.has("S")){var f=h.get("S");if(!(0,u.isName)(f))throw new l.FormatError("Invalid style in PageLabel dictionary.");r=f.name}else r=null;if(h.has("P")){var d=h.get("P");if(!(0,l.isString)(d))throw new l.FormatError("Invalid prefix in PageLabel dictionary.");a=(0,l.stringToPDFString)(d)}else a="";if(h.has("St")){var g=h.get("St");if(!(Number.isInteger(g)&&g>=1))throw new l.FormatError("Invalid start in PageLabel dictionary.");o=g}else o=1}switch(r){case"D":n=o;break;case"R":case"r":n=(0,l.toRomanNumerals)(o,"r"===r);break;case"A":case"a":for(var m="a"===r?97:65,p=o-1,v=String.fromCharCode(m+p%26),b=[],y=0,w=p/26|0;y<=w;y++)b.push(v);n=b.join("");break;default:if(r)throw new l.FormatError('Invalid style "'+r+'" in PageLabel dictionary.');n=""}t[s]=a+n;o++}return t}},{key:"cleanup",value:function(){var e=this;this.pageKidsCountCache.clear();var t=[];this.fontCache.forEach(function(e){t.push(e)});return Promise.all(t).then(function(t){for(var r=0,a=t.length;r<a;r++){delete t[r].dict.translated}e.fontCache.clear();e.builtInCMapCache.clear()})}},{key:"getPageDict",value:function(e){var t=(0,l.createPromiseCapability)(),r=[this.catDict.getRaw("Pages")],a=this.xref,i=this.pageKidsCountCache,n=void 0,o=0;!function c(){for(var h=function(){var s=r.pop();if((0,u.isRef)(s)){if((n=i.get(s))>0&&o+n<e){o+=n;return"continue"}a.fetchAsync(s).then(function(a){if((0,u.isDict)(a,"Page")||(0,u.isDict)(a)&&!a.has("Kids"))if(e===o){s&&!i.has(s)&&i.put(s,1);t.resolve([a,s])}else{o++;c()}else{r.push(a);c()}},t.reject);return{v:void 0}}if(!(0,u.isDict)(s)){t.reject(new l.FormatError("Page dictionary kid reference points to wrong type of object."));return{v:void 0}}n=s.get("Count");if(Number.isInteger(n)&&n>=0){var h=s.objId;h&&!i.has(h)&&i.put(h,n);if(o+n<=e){o+=n;return"continue"}}var f=s.get("Kids");if(!Array.isArray(f)){if((0,u.isName)(s.get("Type"),"Page")||!s.has("Type")&&s.has("Contents")){if(o===e){t.resolve([s,null]);return{v:void 0}}o++;return"continue"}t.reject(new l.FormatError("Page dictionary kids object is not an array."));return{v:void 0}}for(var d=f.length-1;d>=0;d--)r.push(f[d])};r.length;){var f=h();switch(f){case"continue":continue;default:if("object"===(void 0===f?"undefined":s(f)))return f.v}}t.reject(new Error("Page index "+e+" not found."))}();return t.promise}},{key:"getPageIndex",value:function(e){var t=this.xref;var r=0;return function a(i){return function(r){var a=0,i=void 0;return t.fetchAsync(r).then(function(t){if((0,u.isRefsEqual)(r,e)&&!(0,u.isDict)(t,"Page")&&(!(0,u.isDict)(t)||t.has("Type")||!t.has("Contents")))throw new l.FormatError("The reference does not point to a /Page dictionary.");if(!t)return null;if(!(0,u.isDict)(t))throw new l.FormatError("Node must be a dictionary.");i=t.getRaw("Parent");return t.getAsync("Parent")}).then(function(e){if(!e)return null;if(!(0,u.isDict)(e))throw new l.FormatError("Parent must be a dictionary.");return e.getAsync("Kids")}).then(function(e){if(!e)return null;for(var n=[],o=!1,s=0,c=e.length;s<c;s++){var h=e[s];if(!(0,u.isRef)(h))throw new l.FormatError("Kid must be a reference.");if((0,u.isRefsEqual)(h,r)){o=!0;break}n.push(t.fetchAsync(h).then(function(e){if(!(0,u.isDict)(e))throw new l.FormatError("Kid node must be a dictionary.");e.has("Count")?a+=e.get("Count"):a++}))}if(!o)throw new l.FormatError("Kid reference not found in parent's kids.");return Promise.all(n).then(function(){return[a,i]})})}(i).then(function(e){if(!e)return r;var t=o(e,2),i=t[0],n=t[1];r+=i;return a(n)})}(e)}},{key:"metadata",get:function(){var e=this.catDict.getRaw("Metadata");if(!(0,u.isRef)(e))return(0,l.shadow)(this,"metadata",null);var t=!(this.xref.encrypt&&this.xref.encrypt.encryptMetadata),r=this.xref.fetch(e,t),a=void 0;if(r&&(0,u.isDict)(r.dict)){var i=r.dict.get("Type"),n=r.dict.get("Subtype");if((0,u.isName)(i,"Metadata")&&(0,u.isName)(n,"XML"))try{a=(0,l.stringToUTF8String)((0,l.bytesToString)(r.getBytes()))}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.info)("Skipping invalid metadata.")}}return(0,l.shadow)(this,"metadata",a)}},{key:"toplevelPagesDict",get:function(){var e=this.catDict.get("Pages");if(!(0,u.isDict)(e))throw new l.FormatError("Invalid top-level pages dictionary.");return(0,l.shadow)(this,"toplevelPagesDict",e)}},{key:"documentOutline",get:function(){var e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.warn)("Unable to read document outline.")}return(0,l.shadow)(this,"documentOutline",e)}},{key:"permissions",get:function(){var e=null;try{e=this._readPermissions()}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.warn)("Unable to read permissions.")}return(0,l.shadow)(this,"permissions",e)}},{key:"numPages",get:function(){var e=this.toplevelPagesDict.get("Count");if(!Number.isInteger(e))throw new l.FormatError("Page count in top-level pages dictionary is not an integer.");return(0,l.shadow)(this,"numPages",e)}},{key:"destinations",get:function(){var e=this._readDests(),t=Object.create(null);if(e instanceof C){var r=e.getAll();for(var a in r)t[a]=y(r[a])}else e instanceof u.Dict&&e.forEach(function(e,r){r&&(t[e]=y(r))});return(0,l.shadow)(this,"destinations",t)}},{key:"pageLabels",get:function(){var e=null;try{e=this._readPageLabels()}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.warn)("Unable to read page labels.")}return(0,l.shadow)(this,"pageLabels",e)}},{key:"pageMode",get:function(){var e=this.catDict.get("PageMode"),t="UseNone";if((0,u.isName)(e))switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return(0,l.shadow)(this,"pageMode",t)}},{key:"attachments",get:function(){var e=this.catDict.get("Names"),t=null;if(e&&e.has("EmbeddedFiles")){var r=new C(e.getRaw("EmbeddedFiles"),this.xref).getAll();for(var a in r){var i=new _(r[a],this.xref);t||(t=Object.create(null));t[(0,l.stringToPDFString)(a)]=i.serializable}}return(0,l.shadow)(this,"attachments",t)}},{key:"javaScript",get:function(){var e=this.catDict.get("Names"),t=null;function r(e){var r=e.get("S");if((0,u.isName)(r,"JavaScript")){var a=e.get("JS");if((0,u.isStream)(a))a=(0,l.bytesToString)(a.getBytes());else if(!(0,l.isString)(a))return;t||(t=[]);t.push((0,l.stringToPDFString)(a))}}if(e&&e.has("JavaScript")){var a=new C(e.getRaw("JavaScript"),this.xref).getAll();for(var i in a){var n=a[i];(0,u.isDict)(n)&&r(n)}}var o=this.catDict.get("OpenAction");if((0,u.isDict)(o,"Action")){var s=o.get("S");if((0,u.isName)(s,"Named")){var c=o.get("N");if((0,u.isName)(c,"Print")){t||(t=[]);t.push("print({});")}}else r(o)}return(0,l.shadow)(this,"javaScript",t)}}],[{key:"parseDestDictionary",value:function(e){var t=e.destDict;if((0,u.isDict)(t)){var r=e.resultObj;if("object"===(void 0===r?"undefined":s(r))){var a=e.docBaseUrl||null,i=t.get("A"),n=void 0,o=void 0;!(0,u.isDict)(i)&&t.has("Dest")&&(i=t.get("Dest"));if((0,u.isDict)(i)){var c=i.get("S");if(!(0,u.isName)(c)){(0,l.warn)("parseDestDictionary: Invalid type in Action dictionary.");return}var h=c.name;switch(h){case"URI":n=i.get("URI");(0,u.isName)(n)?n="/"+n.name:(0,l.isString)(n)&&(n=function(e){return 0===e.indexOf("www.")?"http://"+e:e}(n));break;case"GoTo":o=i.get("D");break;case"Launch":case"GoToR":var f=i.get("F");(0,u.isDict)(f)?n=f.get("F")||null:(0,l.isString)(f)&&(n=f);var d=i.get("D");if(d){(0,u.isName)(d)&&(d=d.name);if((0,l.isString)(n)){var g=n.split("#")[0];(0,l.isString)(d)?n=g+"#"+d:Array.isArray(d)&&(n=g+"#"+JSON.stringify(d))}}var m=i.get("NewWindow");(0,l.isBool)(m)&&(r.newWindow=m);break;case"Named":var p=i.get("N");(0,u.isName)(p)&&(r.action=p.name);break;case"JavaScript":var v=i.get("JS"),b=void 0;(0,u.isStream)(v)?b=(0,l.bytesToString)(v.getBytes()):(0,l.isString)(v)&&(b=v);if(b){var y=new RegExp("^\\s*("+["app.launchURL","window.open"].join("|").split(".").join("\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec((0,l.stringToPDFString)(b));if(y&&y[2]){n=y[2];"true"===y[3]&&"app.launchURL"===y[1]&&(r.newWindow=!0);break}}default:(0,l.warn)('parseDestDictionary: unsupported action type "'+h+'".')}}else t.has("Dest")&&(o=t.get("Dest"));if((0,l.isString)(n)){n=function(e){try{return(0,l.stringToUTF8String)(e)}catch(t){return e}}(n);var w=(0,l.createValidAbsoluteUrl)(n,a);w&&(r.url=w.href);r.unsafeUrl=n}if(o){(0,u.isName)(o)&&(o=o.name);((0,l.isString)(o)||Array.isArray(o))&&(r.dest=o)}}else(0,l.warn)("parseDestDictionary: `resultObj` must be an object.")}else(0,l.warn)("parseDestDictionary: `destDict` must be a dictionary.")}}]);return e}(),k=function(){function e(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this.xrefstms=Object.create(null);this.cache=[];this.stats={streamTypes:[],fontTypes:[]}}e.prototype={setStartXRef:function(e){this.startXRefQueue=[e]},parse:function(e){var t;if(e){(0,l.warn)("Indexing all PDF objects");t=this.indexObjects()}else t=this.readXRef();t.assignXref(this);this.trailer=t;var r=void 0;try{r=t.get("Encrypt")}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.warn)('XRef.parse - Invalid "Encrypt" reference: "'+e+'".')}if((0,u.isDict)(r)){var a=t.get("ID"),i=a&&a.length?a[0]:"";r.suppressEncryption=!0;this.encrypt=new d.CipherTransformFactory(r,i,this.pdfManager.password)}var n=void 0;try{n=t.get("Root")}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.warn)('XRef.parse - Invalid "Root" reference: "'+e+'".')}if(!(0,u.isDict)(n)||!n.has("Pages")){if(!e)throw new l.XRefParseException;throw new l.FormatError("Invalid root reference")}this.root=n},processXRefTable:function(e){"tableState"in this||(this.tableState={entryNum:0,streamPos:e.lexer.stream.pos,parserBuf1:e.buf1,parserBuf2:e.buf2});var t=this.readXRefTable(e);if(!(0,u.isCmd)(t,"trailer"))throw new l.FormatError("Invalid XRef table: could not find trailer dictionary");var r=e.getObj();!(0,u.isDict)(r)&&r.dict&&(r=r.dict);if(!(0,u.isDict)(r))throw new l.FormatError("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return r},readXRefTable:function(e){var t,r=e.lexer.stream,a=this.tableState;r.pos=a.streamPos;e.buf1=a.parserBuf1;e.buf2=a.parserBuf2;for(;;){if(!("firstEntryNum"in a&&"entryCount"in a)){if((0,u.isCmd)(t=e.getObj(),"trailer"))break;a.firstEntryNum=t;a.entryCount=e.getObj()}var i=a.firstEntryNum,n=a.entryCount;if(!Number.isInteger(i)||!Number.isInteger(n))throw new l.FormatError("Invalid XRef table: wrong types in subsection header");for(var o=a.entryNum;o<n;o++){a.streamPos=r.pos;a.entryNum=o;a.parserBuf1=e.buf1;a.parserBuf2=e.buf2;var s={};s.offset=e.getObj();s.gen=e.getObj();var c=e.getObj();(0,u.isCmd)(c,"f")?s.free=!0:(0,u.isCmd)(c,"n")&&(s.uncompressed=!0);if(!Number.isInteger(s.offset)||!Number.isInteger(s.gen)||!s.free&&!s.uncompressed)throw new l.FormatError("Invalid entry in XRef subsection: "+i+", "+n);0===o&&s.free&&1===i&&(i=0);this.entries[o+i]||(this.entries[o+i]=s)}a.entryNum=0;a.streamPos=r.pos;a.parserBuf1=e.buf1;a.parserBuf2=e.buf2;delete a.firstEntryNum;delete a.entryCount}if(this.entries[0]&&!this.entries[0].free)throw new l.FormatError("Invalid XRef table: unexpected first object");return t},processXRefStream:function(e){if(!("streamState"in this)){var t=e.dict,r=t.get("W"),a=t.get("Index");a||(a=[0,t.get("Size")]);this.streamState={entryRanges:a,byteWidths:r,entryNum:0,streamPos:e.pos}}this.readXRefStream(e);delete this.streamState;return e.dict},readXRefStream:function(e){var t,r,a=this.streamState;e.pos=a.streamPos;for(var i=a.byteWidths,n=i[0],o=i[1],s=i[2],c=a.entryRanges;c.length>0;){var u=c[0],h=c[1];if(!Number.isInteger(u)||!Number.isInteger(h))throw new l.FormatError("Invalid XRef range fields: "+u+", "+h);if(!Number.isInteger(n)||!Number.isInteger(o)||!Number.isInteger(s))throw new l.FormatError("Invalid XRef entry fields length: "+u+", "+h);for(t=a.entryNum;t<h;++t){a.entryNum=t;a.streamPos=e.pos;var f=0,d=0,g=0;for(r=0;r<n;++r)f=f<<8|e.getByte();0===n&&(f=1);for(r=0;r<o;++r)d=d<<8|e.getByte();for(r=0;r<s;++r)g=g<<8|e.getByte();var m={};m.offset=d;m.gen=g;switch(f){case 0:m.free=!0;break;case 1:m.uncompressed=!0;break;case 2:break;default:throw new l.FormatError("Invalid XRef entry type: "+f)}this.entries[u+t]||(this.entries[u+t]=m)}a.entryNum=0;a.streamPos=e.pos;c.splice(0,2)}},indexObjects:function(){var e=10,t=13,r=60;function a(a,i){for(var n="",o=a[i];o!==e&&o!==t&&o!==r&&!(++i>=a.length);){n+=String.fromCharCode(o);o=a[i]}return n}function i(e,t,r){for(var a=r.length,i=e.length,n=0;t<i;){for(var o=0;o<a&&e[t+o]===r[o];)++o;if(o>=a)break;t++;n++}return n}var n=/^(\d+)\s+(\d+)\s+obj\b/,o=/\bendobj[\b\s]$/,s=/\s+(\d+\s+\d+\s+obj[\b\s])$/,c=new Uint8Array([116,114,97,105,108,101,114]),f=new Uint8Array([115,116,97,114,116,120,114,101,102]),d=new Uint8Array([111,98,106]),g=new Uint8Array([47,88,82,101,102]);this.entries.length=0;var m=this.stream;m.pos=0;for(var p,v,b=m.getBytes(),y=m.start,w=b.length,k=[],S=[];y<w;){var C=b[y];if(9!==C&&C!==e&&C!==t&&32!==C)if(37!==C){var x,_=a(b,y);if(0!==_.indexOf("xref")||4!==_.length&&!/\s/.test(_[4]))if(x=n.exec(_)){void 0===this.entries[x[1]]&&(this.entries[x[1]]={offset:y-m.start,gen:0|x[2],uncompressed:!0});for(var A=void 0,P=y+_.length;P<b.length;){var I=P+i(b,P,d)+4;A=I-y;var O=Math.max(I-25,P),T=(0,l.bytesToString)(b.subarray(O,I));if(o.test(T))break;var E=s.exec(T);if(E&&E[1]){(0,l.warn)('indexObjects: Found new "obj" inside of another "obj", caused by missing "endobj" -- trying to recover.');A-=E[1].length;break}P=I}var F=b.subarray(y,y+A),R=i(F,0,g);if(R<A&&F[R+5]<64){S.push(y-m.start);this.xrefstms[y-m.start]=1}y+=A}else if(0!==_.indexOf("trailer")||7!==_.length&&!/\s/.test(_[7]))y+=_.length+1;else{k.push(y);y+=i(b,y,f)}else{y+=i(b,y,c);k.push(y);y+=i(b,y,f)}}else do{if(++y>=w)break;C=b[y]}while(C!==e&&C!==t);else++y}for(p=0,v=S.length;p<v;++p){this.startXRefQueue.push(S[p]);this.readXRef(!0)}var B=void 0;for(p=0,v=k.length;p<v;++p){m.pos=k[p];var D=new h.Parser(new h.Lexer(m),!0,this,!0),M=D.getObj();if((0,u.isCmd)(M,"trailer")){var L=D.getObj();if((0,u.isDict)(L)){var N=void 0;try{N=L.get("Root")}catch(e){if(e instanceof l.MissingDataException)throw e;continue}if((0,u.isDict)(N)&&N.has("Pages")){if(L.has("ID"))return L;B=L}}}}if(B)return B;throw new l.InvalidPDFException("Invalid PDF structure")},readXRef:function(e){var t=this.stream,r=Object.create(null);try{for(;this.startXRefQueue.length;){var a=this.startXRefQueue[0];if(r[a]){(0,l.warn)("readXRef - skipping XRef table since it was already parsed.");this.startXRefQueue.shift()}else{r[a]=!0;t.pos=a+t.start;var i,n=new h.Parser(new h.Lexer(t),!0,this),o=n.getObj();if((0,u.isCmd)(o,"xref")){i=this.processXRefTable(n);this.topDict||(this.topDict=i);o=i.get("XRefStm");if(Number.isInteger(o)){var s=o;if(!(s in this.xrefstms)){this.xrefstms[s]=1;this.startXRefQueue.push(s)}}}else{if(!Number.isInteger(o))throw new l.FormatError("Invalid XRef stream header");if(!Number.isInteger(n.getObj())||!(0,u.isCmd)(n.getObj(),"obj")||!(0,u.isStream)(o=n.getObj()))throw new l.FormatError("Invalid XRef stream");i=this.processXRefStream(o);this.topDict||(this.topDict=i);if(!i)throw new l.FormatError("Failed to read XRef stream")}o=i.get("Prev");Number.isInteger(o)?this.startXRefQueue.push(o):(0,u.isRef)(o)&&this.startXRefQueue.push(o.num);this.startXRefQueue.shift()}}return this.topDict}catch(e){if(e instanceof l.MissingDataException)throw e;(0,l.info)("(while reading XRef): "+e)}if(!e)throw new l.XRefParseException},getEntry:function(e){var t=this.entries[e];return t&&!t.free&&t.offset?t:null},fetchIfRef:function(e,t){return(0,u.isRef)(e)?this.fetch(e,t):e},fetch:function(e,t){if(!(0,u.isRef)(e))throw new Error("ref object is not a reference");var r=e.num;if(r in this.cache){var a=this.cache[r];a instanceof u.Dict&&!a.objId&&(a.objId=e.toString());return a}var i=this.getEntry(r);if(null===i)return this.cache[r]=null;i=i.uncompressed?this.fetchUncompressed(e,i,t):this.fetchCompressed(i,t);(0,u.isDict)(i)?i.objId=e.toString():(0,u.isStream)(i)&&(i.dict.objId=e.toString());return i},fetchUncompressed:function(e,t,r){var a=e.gen,i=e.num;if(t.gen!==a)throw new l.FormatError("inconsistent generation in XRef");var n=this.stream.makeSubStream(t.offset+this.stream.start),o=new h.Parser(new h.Lexer(n),!0,this),s=o.getObj(),c=o.getObj(),f=o.getObj();Number.isInteger(s)||(s=parseInt(s,10));Number.isInteger(c)||(c=parseInt(c,10));if(s!==i||c!==a||!(0,u.isCmd)(f))throw new l.FormatError("bad XRef entry");if("obj"!==f.cmd){if(0===f.cmd.indexOf("obj")){i=parseInt(f.cmd.substring(3),10);if(!Number.isNaN(i))return i}throw new l.FormatError("bad XRef entry")}t=this.encrypt&&!r?o.getObj(this.encrypt.createCipherTransform(i,a)):o.getObj();(0,u.isStream)(t)||(this.cache[i]=t);return t},fetchCompressed:function(e,t){var r=e.offset,a=this.fetch(new u.Ref(r,0));if(!(0,u.isStream)(a))throw new l.FormatError("bad ObjStm stream");var i=a.dict.get("First"),n=a.dict.get("N");if(!Number.isInteger(i)||!Number.isInteger(n))throw new l.FormatError("invalid first and n parameters for ObjStm stream");var o=new h.Parser(new h.Lexer(a),!1,this);o.allowStreams=!0;var s,c,f=[],d=[];for(s=0;s<n;++s){c=o.getObj();if(!Number.isInteger(c))throw new l.FormatError("invalid object number in the ObjStm stream: "+c);d.push(c);var g=o.getObj();if(!Number.isInteger(g))throw new l.FormatError("invalid object offset in the ObjStm stream: "+g)}for(s=0;s<n;++s){f.push(o.getObj());(0,u.isCmd)(o.buf1,"endobj")&&o.shift();c=d[s];var m=this.entries[c];m&&m.offset===r&&m.gen===s&&(this.cache[c]=f[s])}if(void 0===(e=f[e.gen]))throw new l.FormatError("bad XRef entry for compressed object");return e},fetchIfRefAsync:function(){var e=v(n.default.mark(function e(t,r){return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if((0,u.isRef)(t)){e.next=2;break}return e.abrupt("return",t);case 2:return e.abrupt("return",this.fetchAsync(t,r));case 3:case"end":return e.stop()}},e,this)}));return function(t,r){return e.apply(this,arguments)}}(),fetchAsync:function(){var e=v(n.default.mark(function e(t,r){return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0;return e.abrupt("return",this.fetch(t,r));case 4:e.prev=4;e.t0=e.catch(0);if(e.t0 instanceof l.MissingDataException){e.next=8;break}throw e.t0;case 8:e.next=10;return this.pdfManager.requestRange(e.t0.begin,e.t0.end);case 10:return e.abrupt("return",this.fetchAsync(t,r));case 11:case"end":return e.stop()}},e,this,[[0,4]])}));return function(t,r){return e.apply(this,arguments)}}(),getCatalogObj:function(){return this.root}};return e}(),S=function(){function e(t,r,a){b(this,e);this.constructor===e&&(0,l.unreachable)("Cannot initialize NameOrNumberTree.");this.root=t;this.xref=r;this._type=a}c(e,[{key:"getAll",value:function(){var e=Object.create(null);if(!this.root)return e;var t=this.xref,r=new u.RefSet;r.put(this.root);for(var a=[this.root];a.length>0;){var i=t.fetchIfRef(a.shift());if((0,u.isDict)(i))if(i.has("Kids"))for(var n=i.get("Kids"),o=0,s=n.length;o<s;o++){var c=n[o];if(r.has(c))throw new l.FormatError('Duplicate entry in "'+this._type+'" tree.');a.push(c);r.put(c)}else{var h=i.get(this._type);if(Array.isArray(h))for(var f=0,d=h.length;f<d;f+=2)e[t.fetchIfRef(h[f])]=t.fetchIfRef(h[f+1])}}return e}},{key:"get",value:function(e){if(!this.root)return null;for(var t=this.xref,r=t.fetchIfRef(this.root),a=0;r.has("Kids");){if(++a>10){(0,l.warn)('Search depth limit reached for "'+this._type+'" tree.');return null}var i=r.get("Kids");if(!Array.isArray(i))return null;for(var n=0,o=i.length-1;n<=o;){var s=n+o>>1,c=t.fetchIfRef(i[s]).get("Limits");if(e<t.fetchIfRef(c[0]))o=s-1;else{if(!(e>t.fetchIfRef(c[1]))){r=t.fetchIfRef(i[s]);break}n=s+1}}if(n>o)return null}var u=r.get(this._type);if(Array.isArray(u))for(var h=0,f=u.length-2;h<=f;){var d=h+f&-2,g=t.fetchIfRef(u[d]);if(e<g)f=d-2;else{if(!(e>g))return t.fetchIfRef(u[d+1]);h=d+2}}return null}}]);return e}(),C=function(e){p(t,S);function t(e,r){b(this,t);return m(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,"Names"))}return t}(),x=function(e){p(t,S);function t(e,r){b(this,t);return m(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,"Nums"))}return t}(),_=function(){function e(e,t){if(e&&(0,u.isDict)(e)){this.xref=t;this.root=e;e.has("FS")&&(this.fs=e.get("FS"));this.description=e.has("Desc")?(0,l.stringToPDFString)(e.get("Desc")):"";e.has("RF")&&(0,l.warn)("Related file specifications are not supported");this.contentAvailable=!0;if(!e.has("EF")){this.contentAvailable=!1;(0,l.warn)("Non-embedded file specifications are not supported")}}}function t(e){return e.has("UF")?e.get("UF"):e.has("F")?e.get("F"):e.has("Unix")?e.get("Unix"):e.has("Mac")?e.get("Mac"):e.has("DOS")?e.get("DOS"):null}e.prototype={get filename(){if(!this._filename&&this.root){var e=t(this.root)||"unnamed";this._filename=(0,l.stringToPDFString)(e).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename},get content(){if(!this.contentAvailable)return null;!this.contentRef&&this.root&&(this.contentRef=t(this.root.get("EF")));var e=null;if(this.contentRef){var r=this.xref.fetchIfRef(this.contentRef);r&&(0,u.isStream)(r)?e=r.getBytes():(0,l.warn)("Embedded file specification points to non-existing/invalid content")}else(0,l.warn)("Embedded file specification does not have a content");return e},get serializable(){return{filename:this.filename,content:this.content}}};return e}(),A=function(){function e(e){return(0,u.isRef)(e)||(0,u.isDict)(e)||Array.isArray(e)||(0,u.isStream)(e)}function t(t,r){if((0,u.isDict)(t)||(0,u.isStream)(t))for(var a=(0,u.isDict)(t)?t:t.dict,i=a.getKeys(),n=0,o=i.length;n<o;n++){var s=a.getRaw(i[n]);e(s)&&r.push(s)}else if(Array.isArray(t))for(var c=0,l=t.length;c<l;c++){var h=t[c];e(h)&&r.push(h)}}function r(e,t,r){this.dict=e;this.keys=t;this.xref=r;this.refSet=null;this.capability=null}r.prototype={load:function(){this.capability=(0,l.createPromiseCapability)();if(!(this.xref.stream instanceof f.ChunkedStream)||0===this.xref.stream.getMissingChunks().length){this.capability.resolve();return this.capability.promise}var e=this.keys,t=this.dict;this.refSet=new u.RefSet;for(var r=[],a=0,i=e.length;a<i;a++){var n=t.getRaw(e[a]);void 0!==n&&r.push(n)}this._walk(r);return this.capability.promise},_walk:function(e){for(var r=this,a=[],i=[];e.length;){var n=e.pop();if((0,u.isRef)(n)){if(this.refSet.has(n))continue;try{this.refSet.put(n);n=this.xref.fetch(n)}catch(e){if(!(e instanceof l.MissingDataException))throw e;a.push(n);i.push({begin:e.begin,end:e.end})}}if(n&&n.getBaseStreams){for(var o=n.getBaseStreams(),s=!1,c=0,h=o.length;c<h;c++){var f=o[c];if(f.getMissingChunks&&f.getMissingChunks().length){s=!0;i.push({begin:f.start,end:f.end})}}s&&a.push(n)}t(n,e)}if(i.length)this.xref.stream.manager.requestRanges(i).then(function(){for(var e=0,t=a.length;e<t;e++){var i=a[e];(0,u.isRef)(i)&&r.refSet.remove(i)}r._walk(a)},this.capability.reject);else{this.refSet=null;this.capability.resolve()}}};return r}();t.Catalog=w;t.ObjectLoader=A;t.XRef=k;t.FileSpec=_},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i={},n=function(){function e(e){this.name=e}e.prototype={};var t=Object.create(null);e.get=function(r){var a=t[r];return a||(t[r]=new e(r))};return e}(),o=function(){function e(e){this.cmd=e}e.prototype={};var t=Object.create(null);e.get=function(r){var a=t[r];return a||(t[r]=new e(r))};return e}(),s=function(){var e=function(){return e};function t(t){this._map=Object.create(null);this.xref=t;this.objId=null;this.suppressEncryption=!1;this.__nonSerializable__=e}t.prototype={assignXref:function(e){this.xref=e},get:function(e,t,r){var a,i=this.xref,n=this.suppressEncryption;if(void 0!==(a=this._map[e])||e in this._map||void 0===t)return i?i.fetchIfRef(a,n):a;if(void 0!==(a=this._map[t])||t in this._map||void 0===r)return i?i.fetchIfRef(a,n):a;a=this._map[r]||null;return i?i.fetchIfRef(a,n):a},getAsync:function(e,t,r){var a,i=this.xref,n=this.suppressEncryption;if(void 0!==(a=this._map[e])||e in this._map||void 0===t)return i?i.fetchIfRefAsync(a,n):Promise.resolve(a);if(void 0!==(a=this._map[t])||t in this._map||void 0===r)return i?i.fetchIfRefAsync(a,n):Promise.resolve(a);a=this._map[r]||null;return i?i.fetchIfRefAsync(a,n):Promise.resolve(a)},getArray:function(e,t,r){var a=this.get(e,t,r),i=this.xref,n=this.suppressEncryption;if(!Array.isArray(a)||!i)return a;for(var o=0,s=(a=a.slice()).length;o<s;o++)d(a[o])&&(a[o]=i.fetch(a[o],n));return a},getRaw:function(e){return this._map[e]},getKeys:function(){return Object.keys(this._map)},set:function(e,t){this._map[e]=t},has:function(e){return e in this._map},forEach:function(e){for(var t in this._map)e(t,this.get(t))}};t.empty=new t(null);t.merge=function(e,r){for(var a=new t(e),i=0,n=r.length;i<n;i++){var o=r[i];if(f(o))for(var s in o._map)void 0===a._map[s]&&(a._map[s]=o._map[s])}return a};return t}(),c=function(){function e(e,t){this.num=e;this.gen=t}e.prototype={toString:function(){var e=this.num+"R";0!==this.gen&&(e+=this.gen);return e}};return e}(),l=function(){function e(){this.dict=Object.create(null)}e.prototype={has:function(e){return e.toString()in this.dict},put:function(e){this.dict[e.toString()]=!0},remove:function(e){delete this.dict[e.toString()]}};return e}(),u=function(){function e(){this.dict=Object.create(null)}e.prototype={get:function(e){return this.dict[e.toString()]},has:function(e){return e.toString()in this.dict},put:function(e,t){this.dict[e.toString()]=t},putAlias:function(e,t){this.dict[e.toString()]=this.get(t)},forEach:function(e,t){for(var r in this.dict)e.call(t,this.dict[r])},clear:function(){this.dict=Object.create(null)}};return e}();function h(e,t){return e instanceof n&&(void 0===t||e.name===t)}function f(e,t){return e instanceof s&&(void 0===t||h(e.get("Type"),t))}function d(e){return e instanceof c}t.EOF=i;t.Cmd=o;t.Dict=s;t.Name=n;t.Ref=c;t.RefSet=l;t.RefSetCache=u;t.isEOF=function(e){return e===i};t.isCmd=function(e,t){return e instanceof o&&(void 0===t||e.cmd===t)};t.isDict=f;t.isName=h;t.isRef=d;t.isRefsEqual=function(e,t){return e.num===t.num&&e.gen===t.gen};t.isStream=function(e){return"object"===(void 0===e?"undefined":a(e))&&null!==e&&void 0!==e.getBytes}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Parser=t.Linearization=t.Lexer=void 0;var a=r(140),i=r(2),n=r(138),o=r(141),s=r(143),c=r(146),l=r(148);function u(e){for(var t=e.length,r=1,a=0,i=0;i<t;++i)a+=r+=255&e[i];return a%65521<<16|r%65521}var h=function(){function e(e,t,r,a){this.lexer=e;this.allowStreams=t;this.xref=r;this.recoveryMode=a||!1;this.imageCache=Object.create(null);this.refill()}e.prototype={refill:function(){this.buf1=this.lexer.getObj();this.buf2=this.lexer.getObj()},shift:function(){if((0,n.isCmd)(this.buf2,"ID")){this.buf1=this.buf2;this.buf2=null}else{this.buf1=this.buf2;this.buf2=this.lexer.getObj()}},tryShift:function(){try{this.shift();return!0}catch(e){if(e instanceof i.MissingDataException)throw e;return!1}},getObj:function(e){var t=this.buf1;this.shift();if(t instanceof n.Cmd)switch(t.cmd){case"BI":return this.makeInlineImage(e);case"[":for(var r=[];!(0,n.isCmd)(this.buf1,"]")&&!(0,n.isEOF)(this.buf1);)r.push(this.getObj(e));if((0,n.isEOF)(this.buf1)){if(!this.recoveryMode)throw new i.FormatError("End of file inside array");return r}this.shift();return r;case"<<":for(var a=new n.Dict(this.xref);!(0,n.isCmd)(this.buf1,">>")&&!(0,n.isEOF)(this.buf1);)if((0,n.isName)(this.buf1)){var o=this.buf1.name;this.shift();if((0,n.isEOF)(this.buf1))break;a.set(o,this.getObj(e))}else{(0,i.info)("Malformed dictionary: key must be a name object");this.shift()}if((0,n.isEOF)(this.buf1)){if(!this.recoveryMode)throw new i.FormatError("End of file inside dictionary");return a}if((0,n.isCmd)(this.buf2,"stream"))return this.allowStreams?this.makeStream(a,e):a;this.shift();return a;default:return t}if(Number.isInteger(t)){var s=t;if(Number.isInteger(this.buf1)&&(0,n.isCmd)(this.buf2,"R")){var c=new n.Ref(s,this.buf1);this.shift();this.shift();return c}return s}if((0,i.isString)(t)){var l=t;e&&(l=e.decryptString(l));return l}return t},findDefaultInlineStreamEnd:function(e){for(var t=e.pos,r=0,a=void 0,n=void 0;-1!==(a=e.getByte());)if(0===r)r=69===a?1:0;else if(1===r)r=73===a?2:0;else{(0,i.assert)(2===r);if(32===a||10===a||13===a){n=e.pos;for(var o=e.peekBytes(10),s=0,c=o.length;s<c;s++)if((0!==(a=o[s])||0===o[s+1])&&10!==a&&13!==a&&(a<32||a>127)){r=0;break}if(2===r)break}else r=0}if(-1===a){(0,i.warn)("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(n){(0,i.warn)('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-n))}}return e.pos-4-t},findDCTDecodeInlineStreamEnd:function(e){for(var t,r,a,n=e.pos,o=!1;-1!==(t=e.getByte());)if(255===t){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:o=!0;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:(r=e.getUint16())>2?e.skip(r-2):e.skip(-2)}if(o)break}a=e.pos-n;if(-1===t){(0,i.warn)("Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.");e.skip(-a);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return a},findASCII85DecodeInlineStreamEnd:function(e){for(var t,r,a=e.pos;-1!==(t=e.getByte());)if(126===t&&62===e.peekByte()){e.skip();break}r=e.pos-a;if(-1===t){(0,i.warn)("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-r);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return r},findASCIIHexDecodeInlineStreamEnd:function(e){for(var t,r,a=e.pos;-1!==(t=e.getByte())&&62!==t;);r=e.pos-a;if(-1===t){(0,i.warn)("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-r);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return r},inlineStreamSkipEI:function(e){for(var t,r=0;-1!==(t=e.getByte());)if(0===r)r=69===t?1:0;else if(1===r)r=73===t?2:0;else if(2===r)break},makeInlineImage:function(e){for(var t=this.lexer,r=t.stream,a=new n.Dict(this.xref),o=void 0;!(0,n.isCmd)(this.buf1,"ID")&&!(0,n.isEOF)(this.buf1);){if(!(0,n.isName)(this.buf1))throw new i.FormatError("Dictionary key must be a name object");var s=this.buf1.name;this.shift();if((0,n.isEOF)(this.buf1))break;a.set(s,this.getObj(e))}-1!==t.beginInlineImagePos&&(o=r.pos-t.beginInlineImagePos);var c,l=a.get("Filter","F");if((0,n.isName)(l))c=l.name;else if(Array.isArray(l)){var h=this.xref.fetchIfRef(l[0]);(0,n.isName)(h)&&(c=h.name)}var f=r.pos,d=void 0;d="DCTDecode"===c||"DCT"===c?this.findDCTDecodeInlineStreamEnd(r):"ASCII85Decode"===c||"A85"===c?this.findASCII85DecodeInlineStreamEnd(r):"ASCIIHexDecode"===c||"AHx"===c?this.findASCIIHexDecodeInlineStreamEnd(r):this.findDefaultInlineStreamEnd(r);var g=r.makeSubStream(f,d,a),m=void 0;if(d<1e3&&o<5552){var p=g.getBytes();g.reset();var v=r.pos;r.pos=t.beginInlineImagePos;var b=r.getBytes(o);r.pos=v;m=u(p)+"_"+u(b);var y=this.imageCache[m];if(void 0!==y){this.buf2=n.Cmd.get("EI");this.shift();y.reset();return y}}e&&(g=e.createStream(g,d));(g=this.filter(g,a,d)).dict=a;if(void 0!==m){g.cacheKey="inline_"+d+"_"+m;this.imageCache[m]=g}this.buf2=n.Cmd.get("EI");this.shift();return g},_findStreamLength:function(e,t){var r=this.lexer.stream;r.pos=e;for(var a=t.length;r.pos<r.end;){var i=r.peekBytes(2048),n=i.length-a;if(n<=0)break;for(var o=0;o<n;){for(var s=0;s<a&&i[o+s]===t[s];)s++;if(s>=a){r.pos+=o;return r.pos-e}o++}r.pos+=n}return-1},makeStream:function(e,t){var r=this.lexer,a=r.stream;r.skipToNextLine();var o=a.pos-1,s=e.get("Length");if(!Number.isInteger(s)){(0,i.info)("Bad "+s+" attribute in stream");s=0}a.pos=o+s;r.nextChar();if(this.tryShift()&&(0,n.isCmd)(this.buf2,"endstream"))this.shift();else{var c=new Uint8Array([101,110,100,115,116,114,101,97,109]),l=this._findStreamLength(o,c);if(l<0){for(var u=1;u<=1;u++){var h=c.length-u,f=c.slice(0,h),d=this._findStreamLength(o,f);if(d>=0){var g=a.peekBytes(h+1)[h];if(!(0,i.isSpace)(g))break;(0,i.info)('Found "'+(0,i.bytesToString)(f)+'" when searching for endstream command.');l=d;break}}if(l<0)throw new i.FormatError("Missing endstream command.")}s=l;r.nextChar();this.shift();this.shift()}this.shift();a=a.makeSubStream(o,s,e);t&&(a=t.createStream(a,s));(a=this.filter(a,e,s)).dict=e;return a},filter:function(e,t,r){var a=t.get("Filter","F"),o=t.get("DecodeParms","DP");if((0,n.isName)(a)){Array.isArray(o)&&(0,i.warn)("/DecodeParms should not contain an Array, when /Filter contains a Name.");return this.makeFilter(e,a.name,r,o)}var s=r;if(Array.isArray(a))for(var c=a,l=o,u=0,h=c.length;u<h;++u){a=this.xref.fetchIfRef(c[u]);if(!(0,n.isName)(a))throw new i.FormatError("Bad filter name: "+a);o=null;Array.isArray(l)&&u in l&&(o=this.xref.fetchIfRef(l[u]));e=this.makeFilter(e,a.name,s,o);s=null}return e},makeFilter:function(e,t,r,n){if(0===r){(0,i.warn)('Empty "'+t+'" stream.');return new a.NullStream}try{var u=this.xref.stats.streamTypes;if("FlateDecode"===t||"Fl"===t){u[i.StreamType.FLATE]=!0;return n?new a.PredictorStream(new a.FlateStream(e,r),r,n):new a.FlateStream(e,r)}if("LZWDecode"===t||"LZW"===t){u[i.StreamType.LZW]=!0;var h=1;if(n){n.has("EarlyChange")&&(h=n.get("EarlyChange"));return new a.PredictorStream(new a.LZWStream(e,r,h),r,n)}return new a.LZWStream(e,r,h)}if("DCTDecode"===t||"DCT"===t){u[i.StreamType.DCT]=!0;return new c.JpegStream(e,r,e.dict,n)}if("JPXDecode"===t||"JPX"===t){u[i.StreamType.JPX]=!0;return new l.JpxStream(e,r,e.dict,n)}if("ASCII85Decode"===t||"A85"===t){u[i.StreamType.A85]=!0;return new a.Ascii85Stream(e,r)}if("ASCIIHexDecode"===t||"AHx"===t){u[i.StreamType.AHX]=!0;return new a.AsciiHexStream(e,r)}if("CCITTFaxDecode"===t||"CCF"===t){u[i.StreamType.CCF]=!0;return new o.CCITTFaxStream(e,r,n)}if("RunLengthDecode"===t||"RL"===t){u[i.StreamType.RL]=!0;return new a.RunLengthStream(e,r)}if("JBIG2Decode"===t){u[i.StreamType.JBIG]=!0;return new s.Jbig2Stream(e,r,e.dict,n)}(0,i.warn)('filter "'+t+'" not supported yet');return e}catch(e){if(e instanceof i.MissingDataException)throw e;(0,i.warn)('Invalid stream: "'+e+'"');return new a.NullStream}}};return e}(),f=function(){function e(e,t){this.stream=e;this.nextChar();this.strBuf=[];this.knownCommands=t;this.beginInlineImagePos=-1}var t=[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 r(e){return e>=48&&e<=57?15&e:e>=65&&e<=70||e>=97&&e<=102?9+(15&e):-1}e.prototype={nextChar:function(){return this.currentChar=this.stream.getByte()},peekChar:function(){return this.stream.peekByte()},getNumber:function(){var e=this.currentChar,t=!1,r=0,a=0;if(45===e){a=-1;45===(e=this.nextChar())&&(e=this.nextChar())}else if(43===e){a=1;e=this.nextChar()}if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){r=10;e=this.nextChar()}if(e<48||e>57){if(10===r&&0===a&&((0,i.isSpace)(e)||-1===e)){(0,i.warn)("Lexer.getNumber - treating a single decimal point as zero.");return 0}throw new i.FormatError("Invalid number: "+String.fromCharCode(e)+" (charCode "+e+")")}a=a||1;for(var n=e-48,o=0,s=1;(e=this.nextChar())>=0;)if(48<=e&&e<=57){var c=e-48;if(t)o=10*o+c;else{0!==r&&(r*=10);n=10*n+c}}else if(46===e){if(0!==r)break;r=1}else if(45===e)(0,i.warn)("Badly formatted number");else{if(69!==e&&101!==e)break;if(43===(e=this.peekChar())||45===e){s=45===e?-1:1;this.nextChar()}else if(e<48||e>57)break;t=!0}0!==r&&(n/=r);t&&(n*=Math.pow(10,s*o));return a*n},getString:function(){var e=1,t=!1,r=this.strBuf;r.length=0;for(var a=this.nextChar();;){var n=!1;switch(0|a){case-1:(0,i.warn)("Unterminated string");t=!0;break;case 40:++e;r.push("(");break;case 41:if(0==--e){this.nextChar();t=!0}else r.push(")");break;case 92:switch(a=this.nextChar()){case-1:(0,i.warn)("Unterminated string");t=!0;break;case 110:r.push("\n");break;case 114:r.push("\r");break;case 116:r.push("\t");break;case 98:r.push("\b");break;case 102:r.push("\f");break;case 92:case 40:case 41:r.push(String.fromCharCode(a));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:var o=15&a;a=this.nextChar();n=!0;if(a>=48&&a<=55){o=(o<<3)+(15&a);if((a=this.nextChar())>=48&&a<=55){n=!1;o=(o<<3)+(15&a)}}r.push(String.fromCharCode(o));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:r.push(String.fromCharCode(a))}break;default:r.push(String.fromCharCode(a))}if(t)break;n||(a=this.nextChar())}return r.join("")},getName:function(){var e,a,o=this.strBuf;o.length=0;for(;(e=this.nextChar())>=0&&!t[e];)if(35===e){e=this.nextChar();if(t[e]){(0,i.warn)("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");o.push("#");break}var s=r(e);if(-1!==s){a=e;var c=r(e=this.nextChar());if(-1===c){(0,i.warn)("Lexer_getName: Illegal digit ("+String.fromCharCode(e)+") in hexadecimal number.");o.push("#",String.fromCharCode(a));if(t[e])break;o.push(String.fromCharCode(e));continue}o.push(String.fromCharCode(s<<4|c))}else o.push("#",String.fromCharCode(e))}else o.push(String.fromCharCode(e));o.length>127&&(0,i.warn)("name token is longer than allowed by the spec: "+o.length);return n.Name.get(o.join(""))},getHexString:function(){var e=this.strBuf;e.length=0;for(var a,n,o=this.currentChar,s=!0;;){if(o<0){(0,i.warn)("Unterminated hex string");break}if(62===o){this.nextChar();break}if(1!==t[o]){if(s){if(-1===(a=r(o))){(0,i.warn)('Ignoring invalid character "'+o+'" in hex string');o=this.nextChar();continue}}else{if(-1===(n=r(o))){(0,i.warn)('Ignoring invalid character "'+o+'" in hex string');o=this.nextChar();continue}e.push(String.fromCharCode(a<<4|n))}s=!s;o=this.nextChar()}else o=this.nextChar()}return e.join("")},getObj:function(){for(var e=!1,r=this.currentChar;;){if(r<0)return n.EOF;if(e)10!==r&&13!==r||(e=!1);else if(37===r)e=!0;else if(1!==t[r])break;r=this.nextChar()}switch(0|r){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return n.Cmd.get("[");case 93:this.nextChar();return n.Cmd.get("]");case 60:if(60===(r=this.nextChar())){this.nextChar();return n.Cmd.get("<<")}return this.getHexString();case 62:if(62===(r=this.nextChar())){this.nextChar();return n.Cmd.get(">>")}return n.Cmd.get(">");case 123:this.nextChar();return n.Cmd.get("{");case 125:this.nextChar();return n.Cmd.get("}");case 41:this.nextChar();throw new i.FormatError("Illegal character: "+r)}for(var a=String.fromCharCode(r),o=this.knownCommands,s=o&&void 0!==o[a];(r=this.nextChar())>=0&&!t[r];){var c=a+String.fromCharCode(r);if(s&&void 0===o[c])break;if(128===a.length)throw new i.FormatError("Command token too long: "+a.length);a=c;s=o&&void 0!==o[a]}if("true"===a)return!0;if("false"===a)return!1;if("null"===a)return null;"BI"===a&&(this.beginInlineImagePos=this.stream.pos);return n.Cmd.get(a)},skipToNextLine:function(){for(var e=this.currentChar;e>=0;){if(13===e){10===(e=this.nextChar())&&this.nextChar();break}if(10===e){this.nextChar();break}e=this.nextChar()}}};return e}(),d={create:function(e){function t(e,t){var r=u.get(e);if(Number.isInteger(r)&&(t?r>=0:r>0))return r;throw new Error('The "'+e+'" parameter in the linearization dictionary is invalid.')}var r,a,o=new h(new f(e),!1,null),s=o.getObj(),c=o.getObj(),l=o.getObj(),u=o.getObj();if(!(Number.isInteger(s)&&Number.isInteger(c)&&(0,n.isCmd)(l,"obj")&&(0,n.isDict)(u)&&(0,i.isNum)(r=u.get("Linearized"))&&r>0))return null;if((a=t("L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:a,hints:function(){var e,t,r=u.get("H");if(Array.isArray(r)&&(2===(e=r.length)||4===e)){for(var a=0;a<e;a++)if(!(Number.isInteger(t=r[a])&&t>0))throw new Error("Hint ("+a+") in the linearization dictionary is invalid.");return r}throw new Error("Hint array in the linearization dictionary is invalid.")}(),objectNumberFirst:t("O"),endFirst:t("E"),numPages:t("N"),mainXRefEntriesOffset:t("T"),pageFirst:u.has("P")?t("P",!0):0}}};t.Lexer=f;t.Linearization=d;t.Parser=h},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LZWStream=t.StringStream=t.StreamsSequenceStream=t.Stream=t.RunLengthStream=t.PredictorStream=t.NullStream=t.FlateStream=t.DecodeStream=t.DecryptStream=t.AsciiHexStream=t.Ascii85Stream=void 0;var a=r(2),i=r(138);function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}var o=function(){function e(e,t,r,a){this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+r||this.bytes.length;this.dict=a}e.prototype={get length(){return this.end-this.start},get isEmpty(){return 0===this.length},getByte:function(){return this.pos>=this.end?-1:this.bytes[this.pos++]},getUint16:function(){var e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t},getInt32:function(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()},getBytes:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.bytes,a=this.pos,i=this.end;if(!e){var n=r.subarray(a,i);return t?new Uint8ClampedArray(n):n}var o=a+e;o>i&&(o=i);this.pos=o;var s=r.subarray(a,o);return t?new Uint8ClampedArray(s):s},peekByte:function(){var e=this.getByte();this.pos--;return e},peekBytes:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBytes(e,t);this.pos-=r.length;return r},skip:function(e){e||(e=1);this.pos+=e},reset:function(){this.pos=this.start},moveStart:function(){this.start=this.pos},makeSubStream:function(t,r,a){return new e(this.bytes.buffer,t,r,a)}};return e}(),s=function(){function e(e){var t=(0,a.stringToBytes)(e);o.call(this,t)}e.prototype=o.prototype;return e}(),c=function(){var e=new Uint8Array(0);function t(t){this._rawMinBufferLength=t||0;this.pos=0;this.bufferLength=0;this.eof=!1;this.buffer=e;this.minBufferLength=512;if(t)for(;this.minBufferLength<t;)this.minBufferLength*=2}t.prototype={get isEmpty(){for(;!this.eof&&0===this.bufferLength;)this.readBlock();return 0===this.bufferLength},ensureBuffer:function(e){var t=this.buffer;if(e<=t.byteLength)return t;for(var r=this.minBufferLength;r<e;)r*=2;var a=new Uint8Array(r);a.set(t);return this.buffer=a},getByte:function(){for(var e=this.pos;this.bufferLength<=e;){if(this.eof)return-1;this.readBlock()}return this.buffer[this.pos++]},getUint16:function(){var e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t},getInt32:function(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()},getBytes:function(e){var t,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=this.pos;if(e){this.ensureBuffer(a+e);t=a+e;for(;!this.eof&&this.bufferLength<t;)this.readBlock();var i=this.bufferLength;t>i&&(t=i)}else{for(;!this.eof;)this.readBlock();t=this.bufferLength}this.pos=t;var n=this.buffer.subarray(a,t);return!r||n instanceof Uint8ClampedArray?n:new Uint8ClampedArray(n)},peekByte:function(){var e=this.getByte();this.pos--;return e},peekBytes:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBytes(e,t);this.pos-=r.length;return r},makeSubStream:function(e,t,r){for(var a=e+t;this.bufferLength<=a&&!this.eof;)this.readBlock();return new o(this.buffer,e,t,r)},skip:function(e){e||(e=1);this.pos+=e},reset:function(){this.pos=0},getBaseStreams:function(){return this.str&&this.str.getBaseStreams?this.str.getBaseStreams():[]}};return t}(),l=function(){function e(e){this.streams=e;for(var t=0,r=0,a=e.length;r<a;r++){var i=e[r];t+=i instanceof c?i._rawMinBufferLength:i.length}c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBlock=function(){var e=this.streams;if(0!==e.length){var t=e.shift().getBytes(),r=this.bufferLength,a=r+t.length;this.ensureBuffer(a).set(t,r);this.bufferLength=a}else this.eof=!0};e.prototype.getBaseStreams=function(){for(var e=[],t=0,r=this.streams.length;t<r;t++){var a=this.streams[t];a.getBaseStreams&&e.push.apply(e,n(a.getBaseStreams()))}return e};return e}(),u=function(){var e=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),t=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),r=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),i=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59e4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],n=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];function o(e,t){this.str=e;this.dict=e.dict;var r=e.getByte(),i=e.getByte();if(-1===r||-1===i)throw new a.FormatError("Invalid header in flate stream: "+r+", "+i);if(8!=(15&r))throw new a.FormatError("Unknown compression method in flate stream: "+r+", "+i);if(((r<<8)+i)%31!=0)throw new a.FormatError("Bad FCHECK in flate stream: "+r+", "+i);if(32&i)throw new a.FormatError("FDICT bit set in flate stream: "+r+", "+i);this.codeSize=0;this.codeBuf=0;c.call(this,t)}o.prototype=Object.create(c.prototype);o.prototype.getBits=function(e){for(var t,r=this.str,i=this.codeSize,n=this.codeBuf;i<e;){if(-1===(t=r.getByte()))throw new a.FormatError("Bad encoding in flate stream");n|=t<<i;i+=8}t=n&(1<<e)-1;this.codeBuf=n>>e;this.codeSize=i-=e;return t};o.prototype.getCode=function(e){for(var t,r=this.str,i=e[0],n=e[1],o=this.codeSize,s=this.codeBuf;o<n&&-1!==(t=r.getByte());){s|=t<<o;o+=8}var c=i[s&(1<<n)-1],l=c>>16,u=65535&c;if(l<1||o<l)throw new a.FormatError("Bad encoding in flate stream");this.codeBuf=s>>l;this.codeSize=o-l;return u};o.prototype.generateHuffmanTable=function(e){var t,r=e.length,a=0;for(t=0;t<r;++t)e[t]>a&&(a=e[t]);for(var i=1<<a,n=new Int32Array(i),o=1,s=0,c=2;o<=a;++o,s<<=1,c<<=1)for(var l=0;l<r;++l)if(e[l]===o){var u=0,h=s;for(t=0;t<o;++t){u=u<<1|1&h;h>>=1}for(t=u;t<i;t+=c)n[t]=o<<16|l;++s}return[n,a]};o.prototype.readBlock=function(){var o,s,c=this.str,l=this.getBits(3);1&l&&(this.eof=!0);if(0!==(l>>=1)){var u,h;if(1===l){u=i;h=n}else{if(2!==l)throw new a.FormatError("Unknown block type in flate stream");var f,d=this.getBits(5)+257,g=this.getBits(5)+1,m=this.getBits(4)+4,p=new Uint8Array(e.length);for(f=0;f<m;++f)p[e[f]]=this.getBits(3);var v=this.generateHuffmanTable(p);s=0;f=0;for(var b,y,w,k=d+g,S=new Uint8Array(k);f<k;){var C=this.getCode(v);if(16===C){b=2;y=3;w=s}else if(17===C){b=3;y=3;w=s=0}else{if(18!==C){S[f++]=s=C;continue}b=7;y=11;w=s=0}for(var x=this.getBits(b)+y;x-- >0;)S[f++]=w}u=this.generateHuffmanTable(S.subarray(0,d));h=this.generateHuffmanTable(S.subarray(d,k))}for(var _=(o=this.buffer)?o.length:0,A=this.bufferLength;;){var P=this.getCode(u);if(P<256){A+1>=_&&(_=(o=this.ensureBuffer(A+1)).length);o[A++]=P}else{if(256===P){this.bufferLength=A;return}var I=(P=t[P-=257])>>16;I>0&&(I=this.getBits(I));s=(65535&P)+I;P=this.getCode(h);(I=(P=r[P])>>16)>0&&(I=this.getBits(I));var O=(65535&P)+I;A+s>=_&&(_=(o=this.ensureBuffer(A+s)).length);for(var T=0;T<s;++T,++A)o[A]=o[A-O]}}}else{var E;if(-1===(E=c.getByte()))throw new a.FormatError("Bad block header in flate stream");var F=E;if(-1===(E=c.getByte()))throw new a.FormatError("Bad block header in flate stream");F|=E<<8;if(-1===(E=c.getByte()))throw new a.FormatError("Bad block header in flate stream");var R=E;if(-1===(E=c.getByte()))throw new a.FormatError("Bad block header in flate stream");if((R|=E<<8)!==(65535&~F)&&(0!==F||0!==R))throw new a.FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;var B=this.bufferLength;o=this.ensureBuffer(B+F);var D=B+F;this.bufferLength=D;if(0===F)-1===c.peekByte()&&(this.eof=!0);else for(var M=B;M<D;++M){if(-1===(E=c.getByte())){this.eof=!0;break}o[M]=E}}};return o}(),h=function(){function e(e,t,r){if(!(0,i.isDict)(r))return e;var n=this.predictor=r.get("Predictor")||1;if(n<=1)return e;if(2!==n&&(n<10||n>15))throw new a.FormatError("Unsupported predictor: "+n);this.readBlock=2===n?this.readBlockTiff:this.readBlockPng;this.str=e;this.dict=e.dict;var o=this.colors=r.get("Colors")||1,s=this.bits=r.get("BitsPerComponent")||8,l=this.columns=r.get("Columns")||1;this.pixBytes=o*s+7>>3;this.rowBytes=l*o*s+7>>3;c.call(this,t);return this}e.prototype=Object.create(c.prototype);e.prototype.readBlockTiff=function(){var e=this.rowBytes,t=this.bufferLength,r=this.ensureBuffer(t+e),a=this.bits,i=this.colors,n=this.str.getBytes(e);this.eof=!n.length;if(!this.eof){var o,s=0,c=0,l=0,u=0,h=t;if(1===a&&1===i)for(o=0;o<e;++o){var f=n[o]^s;f^=f>>1;f^=f>>2;s=(1&(f^=f>>4))<<7;r[h++]=f}else if(8===a){for(o=0;o<i;++o)r[h++]=n[o];for(;o<e;++o){r[h]=r[h-i]+n[o];h++}}else if(16===a){var d=2*i;for(o=0;o<d;++o)r[h++]=n[o];for(;o<e;o+=2){var g=((255&n[o])<<8)+(255&n[o+1])+((255&r[h-d])<<8)+(255&r[h-d+1]);r[h++]=g>>8&255;r[h++]=255&g}}else{var m=new Uint8Array(i+1),p=(1<<a)-1,v=0,b=t,y=this.columns;for(o=0;o<y;++o)for(var w=0;w<i;++w){if(l<a){s=s<<8|255&n[v++];l+=8}m[w]=m[w]+(s>>l-a)&p;l-=a;c=c<<a|m[w];if((u+=a)>=8){r[b++]=c>>u-8&255;u-=8}}u>0&&(r[b++]=(c<<8-u)+(s&(1<<8-u)-1))}this.bufferLength+=e}};e.prototype.readBlockPng=function(){var e=this.rowBytes,t=this.pixBytes,r=this.str.getByte(),i=this.str.getBytes(e);this.eof=!i.length;if(!this.eof){var n=this.bufferLength,o=this.ensureBuffer(n+e),s=o.subarray(n-e,n);0===s.length&&(s=new Uint8Array(e));var c,l,u,h=n;switch(r){case 0:for(c=0;c<e;++c)o[h++]=i[c];break;case 1:for(c=0;c<t;++c)o[h++]=i[c];for(;c<e;++c){o[h]=o[h-t]+i[c]&255;h++}break;case 2:for(c=0;c<e;++c)o[h++]=s[c]+i[c]&255;break;case 3:for(c=0;c<t;++c)o[h++]=(s[c]>>1)+i[c];for(;c<e;++c){o[h]=(s[c]+o[h-t]>>1)+i[c]&255;h++}break;case 4:for(c=0;c<t;++c){l=s[c];u=i[c];o[h++]=l+u}for(;c<e;++c){l=s[c];var f=s[c-t],d=o[h-t],g=d+l-f,m=g-d;m<0&&(m=-m);var p=g-l;p<0&&(p=-p);var v=g-f;v<0&&(v=-v);u=i[c];o[h++]=m<=p&&m<=v?d+u:p<=v?l+u:f+u}break;default:throw new a.FormatError("Unsupported predictor: "+r)}this.bufferLength+=e}};return e}(),f=function(){function e(e,t,r){this.str=e;this.dict=e.dict;this.decrypt=r;this.nextChunk=null;this.initialized=!1;c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBlock=function(){var e;if(this.initialized)e=this.nextChunk;else{e=this.str.getBytes(512);this.initialized=!0}if(e&&0!==e.length){this.nextChunk=this.str.getBytes(512);var t=this.nextChunk&&this.nextChunk.length>0;e=(0,this.decrypt)(e,!t);var r,a=this.bufferLength,i=e.length,n=this.ensureBuffer(a+i);for(r=0;r<i;r++)n[a++]=e[r];this.bufferLength=a}else this.eof=!0};return e}(),d=function(){function e(e,t){this.str=e;this.dict=e.dict;this.input=new Uint8Array(5);t&&(t*=.8);c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBlock=function(){for(var e=this.str,t=e.getByte();(0,a.isSpace)(t);)t=e.getByte();if(-1!==t&&126!==t){var r,i,n=this.bufferLength;if(122===t){r=this.ensureBuffer(n+4);for(i=0;i<4;++i)r[n+i]=0;this.bufferLength+=4}else{var o=this.input;o[0]=t;for(i=1;i<5;++i){t=e.getByte();for(;(0,a.isSpace)(t);)t=e.getByte();o[i]=t;if(-1===t||126===t)break}r=this.ensureBuffer(n+i-1);this.bufferLength+=i-1;if(i<5){for(;i<5;++i)o[i]=117;this.eof=!0}var s=0;for(i=0;i<5;++i)s=85*s+(o[i]-33);for(i=3;i>=0;--i){r[n+i]=255&s;s>>=8}}}else this.eof=!0};return e}(),g=function(){function e(e,t){this.str=e;this.dict=e.dict;this.firstDigit=-1;t&&(t*=.5);c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBlock=function(){var e=this.str.getBytes(8e3);if(e.length){for(var t=e.length+1>>1,r=this.ensureBuffer(this.bufferLength+t),a=this.bufferLength,i=this.firstDigit,n=0,o=e.length;n<o;n++){var s,c=e[n];if(c>=48&&c<=57)s=15&c;else{if(!(c>=65&&c<=70||c>=97&&c<=102)){if(62===c){this.eof=!0;break}continue}s=9+(15&c)}if(i<0)i=s;else{r[a++]=i<<4|s;i=-1}}if(i>=0&&this.eof){r[a++]=i<<4;i=-1}this.firstDigit=i;this.bufferLength=a}else this.eof=!0};return e}(),m=function(){function e(e,t){this.str=e;this.dict=e.dict;c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBlock=function(){var e=this.str.getBytes(2);if(!e||e.length<2||128===e[0])this.eof=!0;else{var t,r=this.bufferLength,a=e[0];if(a<128){(t=this.ensureBuffer(r+a+1))[r++]=e[1];if(a>0){var i=this.str.getBytes(a);t.set(i,r);r+=a}}else{a=257-a;var n=e[1];t=this.ensureBuffer(r+a+1);for(var o=0;o<a;o++)t[r++]=n}this.bufferLength=r}};return e}(),p=function(){function e(e,t,r){this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;for(var a={earlyChange:r,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(4096),dictionaryLengths:new Uint16Array(4096),dictionaryPrevCodes:new Uint16Array(4096),currentSequence:new Uint8Array(4096),currentSequenceLength:0},i=0;i<256;++i){a.dictionaryValues[i]=i;a.dictionaryLengths[i]=1}this.lzwState=a;c.call(this,t)}e.prototype=Object.create(c.prototype);e.prototype.readBits=function(e){for(var t=this.bitsCached,r=this.cachedData;t<e;){var a=this.str.getByte();if(-1===a){this.eof=!0;return null}r=r<<8|a;t+=8}this.bitsCached=t-=e;this.cachedData=r;this.lastCode=null;return r>>>t&(1<<e)-1};e.prototype.readBlock=function(){var e,t,r,a=1024,i=this.lzwState;if(i){var n=i.earlyChange,o=i.nextCode,s=i.dictionaryValues,c=i.dictionaryLengths,l=i.dictionaryPrevCodes,u=i.codeLength,h=i.prevCode,f=i.currentSequence,d=i.currentSequenceLength,g=0,m=this.bufferLength,p=this.ensureBuffer(this.bufferLength+a);for(e=0;e<512;e++){var v=this.readBits(u),b=d>0;if(v<256){f[0]=v;d=1}else{if(!(v>=258)){if(256===v){u=9;o=258;d=0;continue}this.eof=!0;delete this.lzwState;break}if(v<o)for(t=(d=c[v])-1,r=v;t>=0;t--){f[t]=s[r];r=l[r]}else f[d++]=f[0]}if(b){l[o]=h;c[o]=c[h]+1;s[o]=f[0];u=++o+n&o+n-1?u:0|Math.min(Math.log(o+n)/.6931471805599453+1,12)}h=v;if(a<(g+=d)){do{a+=512}while(a<g);p=this.ensureBuffer(this.bufferLength+a)}for(t=0;t<d;t++)p[m++]=f[t]}i.nextCode=o;i.codeLength=u;i.prevCode=h;i.currentSequenceLength=d;this.bufferLength=m}};return e}(),v=function(){function e(){o.call(this,new Uint8Array(0))}e.prototype=o.prototype;return e}();t.Ascii85Stream=d;t.AsciiHexStream=g;t.DecryptStream=f;t.DecodeStream=c;t.FlateStream=u;t.NullStream=v;t.PredictorStream=h;t.RunLengthStream=m;t.Stream=o;t.StreamsSequenceStream=l;t.StringStream=s;t.LZWStream=p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxStream=void 0;var a=r(138),i=r(142),n=r(140),o=function(){function e(e,t,r){this.str=e;this.dict=e.dict;(0,a.isDict)(r)||(r=a.Dict.empty);var o={next:function(){return e.getByte()}};this.ccittFaxDecoder=new i.CCITTFaxDecoder(o,{K:r.get("K"),EndOfLine:r.get("EndOfLine"),EncodedByteAlign:r.get("EncodedByteAlign"),Columns:r.get("Columns"),Rows:r.get("Rows"),EndOfBlock:r.get("EndOfBlock"),BlackIs1:r.get("BlackIs1")});n.DecodeStream.call(this,t)}e.prototype=Object.create(n.DecodeStream.prototype);e.prototype.readBlock=function(){for(;!this.eof;){var e=this.ccittFaxDecoder.readNextChar();if(-1===e){this.eof=!0;return}this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=e}};return e}();t.CCITTFaxStream=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxDecoder=void 0;var a=r(2),i=function(){var e=[[-1,-1],[-1,-1],[7,8],[7,7],[6,6],[6,6],[6,5],[6,5],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[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],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2]],t=[[-1,-1],[12,-2],[-1,-1],[-1,-1],[-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]],r=[[-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]],i=[[-1,-1],[-1,-1],[12,-2],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-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]],n=[[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]],o=[[-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]];function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e||"function"!=typeof e.next)throw new Error('CCITTFaxDecoder - invalid "source" parameter.');this.source=e;this.eof=!1;this.encoding=t.K||0;this.eoline=t.EndOfLine||!1;this.byteAlign=t.EncodedByteAlign||!1;this.columns=t.Columns||1728;this.rows=t.Rows||0;var r=t.EndOfBlock;null!==r&&void 0!==r||(r=!0);this.eoblock=r;this.black=t.BlackIs1||!1;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=!1;for(var a=void 0;0===(a=this._lookBits(12));)this._eatBits(1);1===a&&this._eatBits(12);if(this.encoding>0){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}}s.prototype={readNextChar:function(){if(this.eof)return-1;var e=this.refLine,t=this.codingLine,r=this.columns,i=void 0,n=void 0,o=void 0,s=void 0;if(0===this.outputBits){this.rowsDone&&(this.eof=!0);if(this.eof)return-1;this.err=!1;var c=void 0,l=void 0,u=void 0;if(this.nextLine2D){for(s=0;t[s]<r;++s)e[s]=t[s];e[s++]=r;e[s]=r;t[0]=0;this.codingPos=0;i=0;n=0;for(;t[this.codingPos]<r;)switch(c=this._getTwoDimCode()){case 0:this._addPixels(e[i+1],n);e[i+1]<r&&(i+=2);break;case 1:c=l=0;if(n){do{c+=u=this._getBlackCode()}while(u>=64);do{l+=u=this._getWhiteCode()}while(u>=64)}else{do{c+=u=this._getWhiteCode()}while(u>=64);do{l+=u=this._getBlackCode()}while(u>=64)}this._addPixels(t[this.codingPos]+c,n);t[this.codingPos]<r&&this._addPixels(t[this.codingPos]+l,1^n);for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2;break;case 7:this._addPixels(e[i]+3,n);n^=1;if(t[this.codingPos]<r){++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 5:this._addPixels(e[i]+2,n);n^=1;if(t[this.codingPos]<r){++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 3:this._addPixels(e[i]+1,n);n^=1;if(t[this.codingPos]<r){++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 2:this._addPixels(e[i],n);n^=1;if(t[this.codingPos]<r){++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 8:this._addPixelsNeg(e[i]-3,n);n^=1;if(t[this.codingPos]<r){i>0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 6:this._addPixelsNeg(e[i]-2,n);n^=1;if(t[this.codingPos]<r){i>0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case 4:this._addPixelsNeg(e[i]-1,n);n^=1;if(t[this.codingPos]<r){i>0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]<r;)i+=2}break;case-1:this._addPixels(r,0);this.eof=!0;break;default:(0,a.info)("bad 2d code");this._addPixels(r,0);this.err=!0}}else{t[0]=0;this.codingPos=0;n=0;for(;t[this.codingPos]<r;){c=0;if(n)do{c+=u=this._getBlackCode()}while(u>=64);else do{c+=u=this._getWhiteCode()}while(u>=64);this._addPixels(t[this.codingPos]+c,n);n^=1}}var h=!1;this.byteAlign&&(this.inputBits&=-8);if(this.eoblock||this.row!==this.rows-1){c=this._lookBits(12);if(this.eoline)for(;-1!==c&&1!==c;){this._eatBits(1);c=this._lookBits(12)}else for(;0===c;){this._eatBits(1);c=this._lookBits(12)}if(1===c){this._eatBits(12);h=!0}else-1===c&&(this.eof=!0)}else this.rowsDone=!0;if(!this.eof&&this.encoding>0&&!this.rowsDone){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}if(this.eoblock&&h&&this.byteAlign){if(1===(c=this._lookBits(12))){this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}if(this.encoding>=0)for(s=0;s<4;++s){1!==(c=this._lookBits(12))&&(0,a.info)("bad rtc code: "+c);this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}}this.eof=!0}}else if(this.err&&this.eoline){for(;;){if(-1===(c=this._lookBits(13))){this.eof=!0;return-1}if(c>>1==1)break;this._eatBits(1)}this._eatBits(12);if(this.encoding>0){this._eatBits(1);this.nextLine2D=!(1&c)}}t[0]>0?this.outputBits=t[this.codingPos=0]:this.outputBits=t[this.codingPos=1];this.row++}var f=void 0;if(this.outputBits>=8){f=1&this.codingPos?0:255;this.outputBits-=8;if(0===this.outputBits&&t[this.codingPos]<r){this.codingPos++;this.outputBits=t[this.codingPos]-t[this.codingPos-1]}}else{o=8;f=0;do{if(this.outputBits>o){f<<=o;1&this.codingPos||(f|=255>>8-o);this.outputBits-=o;o=0}else{f<<=this.outputBits;1&this.codingPos||(f|=255>>8-this.outputBits);o-=this.outputBits;this.outputBits=0;if(t[this.codingPos]<r){this.codingPos++;this.outputBits=t[this.codingPos]-t[this.codingPos-1]}else if(o>0){f<<=o;o=0}}}while(o)}this.black&&(f^=255);return f},_addPixels:function(e,t){var r=this.codingLine,i=this.codingPos;if(e>r[i]){if(e>this.columns){(0,a.info)("row is wrong length");this.err=!0;e=this.columns}1&i^t&&++i;r[i]=e}this.codingPos=i},_addPixelsNeg:function(e,t){var r=this.codingLine,i=this.codingPos;if(e>r[i]){if(e>this.columns){(0,a.info)("row is wrong length");this.err=!0;e=this.columns}1&i^t&&++i;r[i]=e}else if(e<r[i]){if(e<0){(0,a.info)("invalid code");this.err=!0;e=0}for(;i>0&&e<r[i-1];)--i;r[i]=e}this.codingPos=i},_findTableCode:function(e,t,r,a){for(var i=a||0,n=e;n<=t;++n){var o=this._lookBits(n);if(-1===o)return[!0,1,!1];n<t&&(o<<=t-n);if(!i||o>=i){var s=r[o-i];if(s[0]===n){this._eatBits(n);return[!0,s[1],!0]}}}return[!1,0,!1]},_getTwoDimCode:function(){var t=0,r=void 0;if(this.eoblock){t=this._lookBits(7);if((r=e[t])&&r[0]>0){this._eatBits(r[0]);return r[1]}}else{var i=this._findTableCode(1,7,e);if(i[0]&&i[2])return i[1]}(0,a.info)("Bad two dim code");return-1},_getWhiteCode:function(){var e=0,i=void 0;if(this.eoblock){if(-1===(e=this._lookBits(12)))return 1;if((i=e>>5==0?t[e]:r[e>>3])[0]>0){this._eatBits(i[0]);return i[1]}}else{var n=this._findTableCode(1,9,r);if(n[0])return n[1];if((n=this._findTableCode(11,12,t))[0])return n[1]}(0,a.info)("bad white code");this._eatBits(1);return 1},_getBlackCode:function(){var e=void 0,t=void 0;if(this.eoblock){if(-1===(e=this._lookBits(13)))return 1;if((t=e>>7==0?i[e]:e>>9==0&&e>>7!=0?n[(e>>1)-64]:o[e>>7])[0]>0){this._eatBits(t[0]);return t[1]}}else{var r=this._findTableCode(2,6,o);if(r[0])return r[1];if((r=this._findTableCode(7,12,n,64))[0])return r[1];if((r=this._findTableCode(10,13,i))[0])return r[1]}(0,a.info)("bad black code");this._eatBits(1);return 1},_lookBits:function(e){for(var t=void 0;this.inputBits<e;){if(-1===(t=this.source.next()))return 0===this.inputBits?-1:this.inputBuf<<e-this.inputBits&65535>>16-e;this.inputBuf=this.inputBuf<<8|t;this.inputBits+=8}return this.inputBuf>>this.inputBits-e&65535>>16-e},_eatBits:function(e){(this.inputBits-=e)<0&&(this.inputBits=0)}};return s}();t.CCITTFaxDecoder=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Stream=void 0;var a=r(138),i=r(140),n=r(144),o=r(2),s=function(){function e(e,t,r,a){this.stream=e;this.maybeLength=t;this.dict=r;this.params=a;i.DecodeStream.call(this,t)}e.prototype=Object.create(i.DecodeStream.prototype);Object.defineProperty(e.prototype,"bytes",{get:function(){return(0,o.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:!0});e.prototype.ensureBuffer=function(e){};e.prototype.readBlock=function(){if(!this.eof){var e=new n.Jbig2Image,t=[];if((0,a.isDict)(this.params)){var r=this.params.get("JBIG2Globals");if((0,a.isStream)(r)){var i=r.getBytes();t.push({data:i,start:0,end:i.length})}}t.push({data:this.bytes,start:0,end:this.bytes.length});for(var o=e.parseChunks(t),s=o.length,c=0;c<s;c++)o[c]^=255;this.buffer=o;this.bufferLength=s;this.eof=!0}};return e}();t.Jbig2Stream=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Image=void 0;var a=r(2),i=r(145),n=r(142),o=function(){function e(e){this.message="JBIG2 error: "+e}e.prototype=new Error;e.prototype.name="Jbig2Error";e.constructor=e;return e}(),s=function(){function e(){}e.prototype={getContexts:function(e){return e in this?this[e]:this[e]=new Int8Array(65536)}};function t(e,t,r){this.data=e;this.start=t;this.end=r}t.prototype={get decoder(){var e=new i.ArithmeticDecoder(this.data,this.start,this.end);return(0,a.shadow)(this,"decoder",e)},get contextCache(){var t=new e;return(0,a.shadow)(this,"contextCache",t)}};function r(e,t,r){var a=e.getContexts(t),i=1;function n(e){for(var t=0,n=0;n<e;n++){var o=r.readBit(a,i);i=i<256?i<<1|o:511&(i<<1|o)|256;t=t<<1|o}return t>>>0}var o=n(1),s=n(1)?n(1)?n(1)?n(1)?n(1)?n(32)+4436:n(12)+340:n(8)+84:n(6)+20:n(4)+4:n(2);return 0===o?s:s>0?-s:null}function s(e,t,r){for(var a=e.getContexts("IAID"),i=1,n=0;n<r;n++){i=i<<1|t.readBit(a,i)}return r<31?i&(1<<r)-1:2147483647&i}var c=["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"],l=[[{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}]],u=[{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}]}],h=[39717,1941,229,405],f=[32,8];function d(e,t,r,a,i,n,o,s){if(e){return E(new I(s.data,s.start,s.end),t,r,!1)}if(0===a&&!n&&!i&&4===o.length&&3===o[0].x&&-1===o[0].y&&-3===o[1].x&&-1===o[1].y&&2===o[2].x&&-2===o[2].y&&-2===o[3].x&&-2===o[3].y)return function(e,t,r){var a,i,n,o,s,c,l,u=r.decoder,h=r.contextCache.getContexts("GB"),f=[];for(i=0;i<t;i++){s=f[i]=new Uint8Array(e);c=i<1?s:f[i-1];a=(l=i<2?s:f[i-2])[0]<<13|l[1]<<12|l[2]<<11|c[0]<<7|c[1]<<6|c[2]<<5|c[3]<<4;for(n=0;n<e;n++){s[n]=o=u.readBit(h,a);a=(31735&a)<<1|(n+3<e?l[n+3]<<11:0)|(n+4<e?c[n+4]<<4:0)|o}}return f}(t,r,s);var c=!!n,u=l[a].concat(o);u.sort(function(e,t){return e.y-t.y||e.x-t.x});var f,d,g=u.length,m=new Int8Array(g),p=new Int8Array(g),v=[],b=0,y=0,w=0,k=0;for(d=0;d<g;d++){m[d]=u[d].x;p[d]=u[d].y;y=Math.min(y,u[d].x);w=Math.max(w,u[d].x);k=Math.min(k,u[d].y);d<g-1&&u[d].y===u[d+1].y&&u[d].x===u[d+1].x-1?b|=1<<g-1-d:v.push(d)}var S=v.length,C=new Int8Array(S),x=new Int8Array(S),_=new Uint16Array(S);for(f=0;f<S;f++){d=v[f];C[f]=u[d].x;x[f]=u[d].y;_[f]=1<<g-1-d}for(var A,P,O,T,F,R=-y,B=-k,D=t-w,M=h[a],L=new Uint8Array(t),N=[],U=s.decoder,q=s.contextCache.getContexts("GB"),j=0,z=0,H=0;H<r;H++){if(i){if(j^=U.readBit(q,M)){N.push(L);continue}}L=new Uint8Array(L);N.push(L);for(A=0;A<t;A++)if(c&&n[H][A])L[A]=0;else{if(A>=R&&A<D&&H>=B){z=z<<1&b;for(d=0;d<S;d++){P=H+x[d];O=A+C[d];(T=N[P][O])&&(z|=T=_[d])}}else{z=0;F=g-1;for(d=0;d<g;d++,F--)(O=A+m[d])>=0&&O<t&&(P=H+p[d])>=0&&(T=N[P][O])&&(z|=T<<F)}var G=U.readBit(q,z);L[A]=G}}return N}function g(e,t,r,a,i,n,s,c,l){var h=u[r].coding;0===r&&(h=h.concat([c[0]]));var d,g=h.length,m=new Int32Array(g),p=new Int32Array(g);for(d=0;d<g;d++){m[d]=h[d].x;p[d]=h[d].y}var v=u[r].reference;0===r&&(v=v.concat([c[1]]));var b=v.length,y=new Int32Array(b),w=new Int32Array(b);for(d=0;d<b;d++){y[d]=v[d].x;w[d]=v[d].y}for(var k=a[0].length,S=a.length,C=f[r],x=[],_=l.decoder,A=l.contextCache.getContexts("GR"),P=0,I=0;I<t;I++){if(s){if(P^=_.readBit(A,C))throw new o("prediction is not supported")}var O=new Uint8Array(e);x.push(O);for(var T=0;T<e;T++){var E,F,R=0;for(d=0;d<g;d++){E=I+p[d];F=T+m[d];E<0||F<0||F>=e?R<<=1:R=R<<1|x[E][F]}for(d=0;d<b;d++){E=I+w[d]-n;F=T+y[d]-i;E<0||E>=S||F<0||F>=k?R<<=1:R=R<<1|a[E][F]}var B=_.readBit(A,R);O[T]=B}}return x}function m(e,t,a,i,n,c,l,u,h,f,d,m,p,v,b,y,w,k,S){if(e&&t)throw new o("refinement with Huffman is not supported");var C,x,_=[];for(C=0;C<i;C++){x=new Uint8Array(a);if(n)for(var A=0;A<a;A++)x[A]=n;_.push(x)}var P=w.decoder,I=w.contextCache,O=e?-v.tableDeltaT.decode(S):-r(I,"IADT",P),T=0;C=0;for(;C<c;){O+=e?v.tableDeltaT.decode(S):r(I,"IADT",P);for(var E=T+=e?v.tableFirstS.decode(S):r(I,"IAFS",P);;){var F=0;l>1&&(F=e?S.readBits(k):r(I,"IAIT",P));var R=l*O+F,B=e?v.symbolIDTable.decode(S):s(I,P,h),D=t&&(e?S.readBit():r(I,"IARI",P)),M=u[B],L=M[0].length,N=M.length;if(D){var U=r(I,"IARDW",P),q=r(I,"IARDH",P);M=g(L+=U,N+=q,b,M,(U>>1)+r(I,"IARDX",P),(q>>1)+r(I,"IARDY",P),!1,y,w)}var j,z,H,G=R-(1&m?0:N-1),W=E-(2&m?L-1:0);if(f){for(j=0;j<N;j++)if(x=_[W+j]){H=M[j];var X=Math.min(a-G,L);switch(p){case 0:for(z=0;z<X;z++)x[G+z]|=H[z];break;case 2:for(z=0;z<X;z++)x[G+z]^=H[z];break;default:throw new o("operator "+p+" is not supported")}}E+=N-1}else{for(z=0;z<N;z++)if(x=_[G+z]){H=M[z];switch(p){case 0:for(j=0;j<L;j++)x[W+j]|=H[j];break;case 2:for(j=0;j<L;j++)x[W+j]^=H[j];break;default:throw new o("operator "+p+" is not supported")}}E+=L-1}C++;var V=e?v.tableDeltaS.decode(S):r(I,"IADS",P);if(null===V)break;E+=V+d}}return _}function p(e,t){var r={};r.number=(0,a.readUint32)(e,t);var i=e[t+4],n=63&i;if(!c[n])throw new o("invalid segment type: "+n);r.type=n;r.typeName=c[n];r.deferredNonRetain=!!(128&i);var s=!!(64&i),l=e[t+5],u=l>>5&7,h=[31&l],f=t+6;if(7===l){u=536870911&(0,a.readUint32)(e,f-1);f+=3;var d=u+7>>3;h[0]=e[f++];for(;--d>0;)h.push(e[f++])}else if(5===l||6===l)throw new o("invalid referred-to flags");r.retainBits=h;var g,m,p=r.number<=256?1:r.number<=65536?2:4,v=[];for(g=0;g<u;g++){var w=1===p?e[f]:2===p?(0,a.readUint16)(e,f):(0,a.readUint32)(e,f);v.push(w);f+=p}r.referredTo=v;if(s){r.pageAssociation=(0,a.readUint32)(e,f);f+=4}else r.pageAssociation=e[f++];r.length=(0,a.readUint32)(e,f);f+=4;if(4294967295===r.length){if(38!==n)throw new o("invalid unknown segment length");var k=b(e,f),S=!!(1&e[f+y]),C=new Uint8Array(6);if(!S){C[0]=255;C[1]=172}C[2]=k.height>>>24&255;C[3]=k.height>>16&255;C[4]=k.height>>8&255;C[5]=255&k.height;for(g=f,m=e.length;g<m;g++){for(var x=0;x<6&&C[x]===e[g+x];)x++;if(6===x){r.length=g+6;break}}if(4294967295===r.length)throw new o("segment end was not found")}r.headerEnd=f;return r}function v(e,t,r,a){for(var i=[],n=r;n<a;){var o=p(t,n);n=o.headerEnd;var s={header:o,data:t};if(!e.randomAccess){s.start=n;n+=o.length;s.end=n}i.push(s);if(51===o.type)break}if(e.randomAccess)for(var c=0,l=i.length;c<l;c++){i[c].start=n;n+=i[c].header.length;i[c].end=n}return i}function b(e,t){return{width:(0,a.readUint32)(e,t),height:(0,a.readUint32)(e,t+4),x:(0,a.readUint32)(e,t+8),y:(0,a.readUint32)(e,t+12),combinationOperator:7&e[t+16]}}var y=17;function w(e,t){var r,i,n,s,c=e.header,l=e.data,u=e.start,h=e.end;switch(c.type){case 0:var f={},d=(0,a.readUint16)(l,u);f.huffman=!!(1&d);f.refinement=!!(2&d);f.huffmanDHSelector=d>>2&3;f.huffmanDWSelector=d>>4&3;f.bitmapSizeSelector=d>>6&1;f.aggregationInstancesSelector=d>>7&1;f.bitmapCodingContextUsed=!!(256&d);f.bitmapCodingContextRetained=!!(512&d);f.template=d>>10&3;f.refinementTemplate=d>>12&1;u+=2;if(!f.huffman){s=0===f.template?4:1;i=[];for(n=0;n<s;n++){i.push({x:(0,a.readInt8)(l,u),y:(0,a.readInt8)(l,u+1)});u+=2}f.at=i}if(f.refinement&&!f.refinementTemplate){i=[];for(n=0;n<2;n++){i.push({x:(0,a.readInt8)(l,u),y:(0,a.readInt8)(l,u+1)});u+=2}f.refinementAt=i}f.numberOfExportedSymbols=(0,a.readUint32)(l,u);u+=4;f.numberOfNewSymbols=(0,a.readUint32)(l,u);u+=4;r=[f,c.number,c.referredTo,l,u,h];break;case 6:case 7:var g={};g.info=b(l,u);u+=y;var m=(0,a.readUint16)(l,u);u+=2;g.huffman=!!(1&m);g.refinement=!!(2&m);g.logStripSize=m>>2&3;g.stripSize=1<<g.logStripSize;g.referenceCorner=m>>4&3;g.transposed=!!(64&m);g.combinationOperator=m>>7&3;g.defaultPixelValue=m>>9&1;g.dsOffset=m<<17>>27;g.refinementTemplate=m>>15&1;if(g.huffman){var p=(0,a.readUint16)(l,u);u+=2;g.huffmanFS=3&p;g.huffmanDS=p>>2&3;g.huffmanDT=p>>4&3;g.huffmanRefinementDW=p>>6&3;g.huffmanRefinementDH=p>>8&3;g.huffmanRefinementDX=p>>10&3;g.huffmanRefinementDY=p>>12&3;g.huffmanRefinementSizeSelector=!!(16384&p)}if(g.refinement&&!g.refinementTemplate){i=[];for(n=0;n<2;n++){i.push({x:(0,a.readInt8)(l,u),y:(0,a.readInt8)(l,u+1)});u+=2}g.refinementAt=i}g.numberOfSymbolInstances=(0,a.readUint32)(l,u);u+=4;r=[g,c.referredTo,l,u,h];break;case 16:var v={},w=l[u++];v.mmr=!!(1&w);v.template=w>>1&3;v.patternWidth=l[u++];v.patternHeight=l[u++];v.maxPatternIndex=(0,a.readUint32)(l,u);u+=4;r=[v,c.number,l,u,h];break;case 22:case 23:var k={};k.info=b(l,u);u+=y;var S=l[u++];k.mmr=!!(1&S);k.template=S>>1&3;k.enableSkip=!!(8&S);k.combinationOperator=S>>4&7;k.defaultPixelValue=S>>7&1;k.gridWidth=(0,a.readUint32)(l,u);u+=4;k.gridHeight=(0,a.readUint32)(l,u);u+=4;k.gridOffsetX=4294967295&(0,a.readUint32)(l,u);u+=4;k.gridOffsetY=4294967295&(0,a.readUint32)(l,u);u+=4;k.gridVectorX=(0,a.readUint16)(l,u);u+=2;k.gridVectorY=(0,a.readUint16)(l,u);u+=2;r=[k,c.referredTo,l,u,h];break;case 38:case 39:var C={};C.info=b(l,u);u+=y;var x=l[u++];C.mmr=!!(1&x);C.template=x>>1&3;C.prediction=!!(8&x);if(!C.mmr){s=0===C.template?4:1;i=[];for(n=0;n<s;n++){i.push({x:(0,a.readInt8)(l,u),y:(0,a.readInt8)(l,u+1)});u+=2}C.at=i}r=[C,l,u,h];break;case 48:var _={width:(0,a.readUint32)(l,u),height:(0,a.readUint32)(l,u+4),resolutionX:(0,a.readUint32)(l,u+8),resolutionY:(0,a.readUint32)(l,u+12)};4294967295===_.height&&delete _.height;var A=l[u+16];(0,a.readUint16)(l,u+17);_.lossless=!!(1&A);_.refinement=!!(2&A);_.defaultPixelValue=A>>2&1;_.combinationOperator=A>>3&3;_.requiresBuffer=!!(32&A);_.combinationOperatorOverride=!!(64&A);r=[_];break;case 49:case 50:case 51:break;case 53:r=[c.number,l,u,h];break;case 62:break;default:throw new o("segment type "+c.typeName+"("+c.type+") is not implemented")}var P="on"+c.typeName;P in t&&t[P].apply(t,r)}function k(e,t){for(var r=0,a=e.length;r<a;r++)w(e[r],t)}function S(){}S.prototype={onPageInformation:function(e){this.currentPageInfo=e;var t=e.width+7>>3,r=new Uint8ClampedArray(t*e.height);if(e.defaultPixelValue)for(var a=0,i=r.length;a<i;a++)r[a]=255;this.buffer=r},drawBitmap:function(e,t){var r,a,i,n,s=this.currentPageInfo,c=e.width,l=e.height,u=s.width+7>>3,h=s.combinationOperatorOverride?e.combinationOperator:s.combinationOperator,f=this.buffer,d=128>>(7&e.x),g=e.y*u+(e.x>>3);switch(h){case 0:for(r=0;r<l;r++){i=d;n=g;for(a=0;a<c;a++){t[r][a]&&(f[n]|=i);if(!(i>>=1)){i=128;n++}}g+=u}break;case 2:for(r=0;r<l;r++){i=d;n=g;for(a=0;a<c;a++){t[r][a]&&(f[n]^=i);if(!(i>>=1)){i=128;n++}}g+=u}break;default:throw new o("operator "+h+" is not supported")}},onImmediateGenericRegion:function(e,r,a,i){var n=e.info,o=new t(r,a,i),s=d(e.mmr,n.width,n.height,e.template,e.prediction,null,e.at,o);this.drawBitmap(n,s)},onImmediateLosslessGenericRegion:function(){this.onImmediateGenericRegion.apply(this,arguments)},onSymbolDictionary:function(e,i,n,c,l,u){var h=void 0,f=void 0;if(e.huffman){h=function(e,t,r){var a=0,i=void 0,n=void 0;switch(e.huffmanDHSelector){case 0:case 1:i=P(e.huffmanDHSelector+4);break;case 3:i=O(a,t,r);a++;break;default:throw new o("invalid Huffman DH selector")}switch(e.huffmanDWSelector){case 0:case 1:n=P(e.huffmanDWSelector+2);break;case 3:n=O(a,t,r);a++;break;default:throw new o("invalid Huffman DW selector")}var s=void 0,c=void 0;if(e.bitmapSizeSelector){s=O(a,t,r);a++}else s=P(1);c=e.aggregationInstancesSelector?O(a,t,r):P(1);return{tableDeltaHeight:i,tableDeltaWidth:n,tableBitmapSize:s,tableAggregateInstances:c}}(e,n,this.customTables);f=new I(c,l,u)}var p=this.symbols;p||(this.symbols=p={});for(var v=[],b=0,y=n.length;b<y;b++){var w=p[n[b]];w&&(v=v.concat(w))}var k=new t(c,l,u);p[i]=function(e,t,i,n,c,l,u,h,f,p,v,b){if(e&&t)throw new o("symbol refinement with Huffman is not supported");var y=[],w=0,k=(0,a.log2)(i.length+n),S=v.decoder,C=v.contextCache,x=void 0,_=void 0;if(e){x=P(1);_=[];k=Math.max(k,1)}for(;y.length<n;){w+=e?l.tableDeltaHeight.decode(b):r(C,"IADH",S);for(var A=0,I=0,O=e?_.length:0;;){var F,R=e?l.tableDeltaWidth.decode(b):r(C,"IADW",S);if(null===R)break;I+=A+=R;if(t){var B=r(C,"IAAI",S);if(B>1)F=m(e,t,A,w,0,B,1,i.concat(y),k,0,0,1,0,l,f,p,v,0,b);else{var D=s(C,S,k),M=r(C,"IARDX",S),L=r(C,"IARDY",S);F=g(A,w,f,D<i.length?i[D]:y[D-i.length],M,L,!1,p,v)}y.push(F)}else if(e)_.push(A);else{F=d(!1,A,w,u,!1,null,h,v);y.push(F)}}if(e&&!t){var N=l.tableBitmapSize.decode(b);b.byteAlign();var U=void 0;if(0===N)U=T(b,I,w);else{var q=b.end,j=b.position+N;b.end=j;U=E(b,I,w,!1);b.end=q;b.position=j}var z=_.length;if(O===z-1)y.push(U);else{var H=void 0,G=void 0,W=0,X=void 0,V=void 0;for(H=O;H<z;H++){X=W+_[H];V=[];for(G=0;G<w;G++)V.push(U[G].subarray(W,X));y.push(V);W=X}}}}for(var K=[],Y=[],J=!1,Z=i.length+n;Y.length<Z;){for(var Q=e?x.decode(b):r(C,"IAEX",S);Q--;)Y.push(J);J=!J}for(var $=0,ee=i.length;$<ee;$++)Y[$]&&K.push(i[$]);for(var te=0;te<n;$++,te++)Y[$]&&K.push(y[te]);return K}(e.huffman,e.refinement,v,e.numberOfNewSymbols,e.numberOfExportedSymbols,h,e.template,e.at,e.refinementTemplate,e.refinementAt,k,f)},onImmediateTextRegion:function(e,r,i,n,s){for(var c=e.info,l=void 0,u=void 0,h=this.symbols,f=[],d=0,g=r.length;d<g;d++){var p=h[r[d]];p&&(f=f.concat(p))}var v=(0,a.log2)(f.length);if(e.huffman){u=new I(i,n,s);l=function(e,t,r,a,i){var n=[],s=void 0,c=void 0;for(s=0;s<=34;s++){c=i.readBits(4);n.push(new C([s,c,0,0]))}var l=new _(n,!1);n.length=0;for(s=0;s<a;)if((c=l.decode(i))>=32){var u=void 0,h=void 0,f=void 0;switch(c){case 32:if(0===s)throw new o("no previous value in symbol ID table");h=i.readBits(2)+3;u=n[s-1].prefixLength;break;case 33:h=i.readBits(3)+3;u=0;break;case 34:h=i.readBits(7)+11;u=0;break;default:throw new o("invalid code length in symbol ID table")}for(f=0;f<h;f++){n.push(new C([s,u,0,0]));s++}}else{n.push(new C([s,c,0,0]));s++}i.byteAlign();var d=new _(n,!1),g=0,m=void 0,p=void 0,v=void 0;switch(e.huffmanFS){case 0:case 1:m=P(e.huffmanFS+6);break;case 3:m=O(g,t,r);g++;break;default:throw new o("invalid Huffman FS selector")}switch(e.huffmanDS){case 0:case 1:case 2:p=P(e.huffmanDS+8);break;case 3:p=O(g,t,r);g++;break;default:throw new o("invalid Huffman DS selector")}switch(e.huffmanDT){case 0:case 1:case 2:v=P(e.huffmanDT+11);break;case 3:v=O(g,t,r);g++;break;default:throw new o("invalid Huffman DT selector")}if(e.refinement)throw new o("refinement with Huffman is not supported");return{symbolIDTable:d,tableFirstS:m,tableDeltaS:p,tableDeltaT:v}}(e,r,this.customTables,f.length,u)}var b=new t(i,n,s),y=m(e.huffman,e.refinement,c.width,c.height,e.defaultPixelValue,e.numberOfSymbolInstances,e.stripSize,f,v,e.transposed,e.dsOffset,e.referenceCorner,e.combinationOperator,l,e.refinementTemplate,e.refinementAt,b,e.logStripSize,u);this.drawBitmap(c,y)},onImmediateLosslessTextRegion:function(){this.onImmediateTextRegion.apply(this,arguments)},onPatternDictionary:function(e,r,a,i,n){var o=this.patterns;o||(this.patterns=o={});var s=new t(a,i,n);o[r]=function(e,t,r,a,i,n){var o=[];if(!e){o.push({x:-t,y:0});if(0===i){o.push({x:-3,y:-1});o.push({x:2,y:-2});o.push({x:-2,y:-2})}}for(var s=d(e,(a+1)*t,r,i,!1,null,o,n),c=[],l=0,u=void 0,h=void 0,f=void 0,g=void 0;l<=a;){u=[];f=(h=t*l)+t;for(g=0;g<r;g++)u.push(s[g].subarray(h,f));c.push(u);l++}return c}(e.mmr,e.patternWidth,e.patternHeight,e.maxPatternIndex,e.template,s)},onImmediateHalftoneRegion:function(e,r,i,n,s){var c=this.patterns[r[0]],l=e.info,u=new t(i,n,s),h=function(e,t,r,i,n,s,c,l,u,h,f,g,m,p,v){if(c)throw new o("skip is not supported");if(0!==l)throw new o("operator "+l+" is not supported in halftone region");var b=[],y=void 0,w=void 0,k=void 0;for(y=0;y<n;y++){k=new Uint8Array(i);if(s)for(w=0;w<i;w++)k[w]=s;b.push(k)}var S=t.length,C=t[0],x=C[0].length,_=C.length,A=(0,a.log2)(S),P=[];if(!e){P.push({x:r<=1?3:2,y:-1});if(0===r){P.push({x:-3,y:-1});P.push({x:2,y:-2});P.push({x:-2,y:-2})}}var O=[],T=void 0,F=void 0;e&&(T=new I(v.data,v.start,v.end));for(y=A-1;y>=0;y--){F=e?E(T,u,h,!0):d(!1,u,h,r,!1,null,P,v);O[y]=F}var R=void 0,B=void 0,D=void 0,M=void 0,L=void 0,N=void 0,U=void 0,q=void 0,j=void 0;for(R=0;R<h;R++)for(B=0;B<u;B++){D=0;M=0;for(w=A-1;w>=0;w--)M|=(D=O[w][R][B]^D)<<w;L=t[M];U=g+R*m-B*p>>8;if((N=f+R*p+B*m>>8)>=0&&N+x<=i&&U>=0&&U+_<=n)for(y=0;y<_;y++){j=b[U+y];q=L[y];for(w=0;w<x;w++)j[N+w]|=q[w]}else{var z=void 0,H=void 0;for(y=0;y<_;y++)if(!((H=U+y)<0||H>=n)){j=b[H];q=L[y];for(w=0;w<x;w++)(z=N+w)>=0&&z<i&&(j[z]|=q[w])}}}return b}(e.mmr,c,e.template,l.width,l.height,e.defaultPixelValue,e.enableSkip,e.combinationOperator,e.gridWidth,e.gridHeight,e.gridOffsetX,e.gridOffsetY,e.gridVectorX,e.gridVectorY,u);this.drawBitmap(l,h)},onImmediateLosslessHalftoneRegion:function(){this.onImmediateHalftoneRegion.apply(this,arguments)},onTables:function(e,t,r,i){var n=this.customTables;n||(this.customTables=n={});n[e]=function(e,t,r){var i=e[t],n=4294967295&(0,a.readUint32)(e,t+1),o=4294967295&(0,a.readUint32)(e,t+5),s=new I(e,t+9,r),c=1+(i>>1&7),l=1+(i>>4&7),u=[],h=void 0,f=void 0,d=n;do{h=s.readBits(c);f=s.readBits(l);u.push(new C([d,h,f,0]));d+=1<<f}while(d<o);h=s.readBits(c);u.push(new C([n-1,h,32,0,"lower"]));h=s.readBits(c);u.push(new C([o,h,32,0]));if(1&i){h=s.readBits(c);u.push(new C([h,0]))}return new _(u,!1)}(t,r,i)}};function C(e){if(2===e.length){this.isOOB=!0;this.rangeLow=0;this.prefixLength=e[0];this.rangeLength=0;this.prefixCode=e[1];this.isLowerRange=!1}else{this.isOOB=!1;this.rangeLow=e[0];this.prefixLength=e[1];this.rangeLength=e[2];this.prefixCode=e[3];this.isLowerRange="lower"===e[4]}}function x(e){this.children=[];if(e){this.isLeaf=!0;this.rangeLength=e.rangeLength;this.rangeLow=e.rangeLow;this.isLowerRange=e.isLowerRange;this.isOOB=e.isOOB}else this.isLeaf=!1}x.prototype={buildTree:function(e,t){var r=e.prefixCode>>t&1;if(t<=0)this.children[r]=new x(e);else{var a=this.children[r];a||(this.children[r]=a=new x(null));a.buildTree(e,t-1)}},decodeNode:function(e){if(this.isLeaf){if(this.isOOB)return null;var t=e.readBits(this.rangeLength);return this.rangeLow+(this.isLowerRange?-t:t)}var r=this.children[e.readBit()];if(!r)throw new o("invalid Huffman data");return r.decodeNode(e)}};function _(e,t){t||this.assignPrefixCodes(e);this.rootNode=new x(null);var r=void 0,a=e.length,i=void 0;for(r=0;r<a;r++)(i=e[r]).prefixLength>0&&this.rootNode.buildTree(i,i.prefixLength-1)}_.prototype={decode:function(e){return this.rootNode.decodeNode(e)},assignPrefixCodes:function(e){var t=e.length,r=0,a=void 0;for(a=0;a<t;a++)r=Math.max(r,e[a].prefixLength);var i=new Uint32Array(r+1);for(a=0;a<t;a++)i[e[a].prefixLength]++;var n=1,o=0,s=void 0,c=void 0,l=void 0;i[0]=0;for(;n<=r;){s=o=o+i[n-1]<<1;c=0;for(;c<t;){if((l=e[c]).prefixLength===n){l.prefixCode=s;s++}c++}n++}}};var A={};function P(e){var t=A[e];if(t)return t;var r=void 0;switch(e){case 1:r=[[0,1,4,0],[16,2,8,2],[272,3,16,6],[65808,3,32,7]];break;case 2:r=[[0,1,0,0],[1,2,0,2],[2,3,0,6],[3,4,3,14],[11,5,6,30],[75,6,32,62],[6,63]];break;case 3:r=[[-256,8,8,254],[0,1,0,0],[1,2,0,2],[2,3,0,6],[3,4,3,14],[11,5,6,30],[-257,8,32,255,"lower"],[75,7,32,126],[6,62]];break;case 4:r=[[1,1,0,0],[2,2,0,2],[3,3,0,6],[4,4,3,14],[12,5,6,30],[76,5,32,31]];break;case 5:r=[[-255,7,8,126],[1,1,0,0],[2,2,0,2],[3,3,0,6],[4,4,3,14],[12,5,6,30],[-256,7,32,127,"lower"],[76,6,32,62]];break;case 6:r=[[-2048,5,10,28],[-1024,4,9,8],[-512,4,8,9],[-256,4,7,10],[-128,5,6,29],[-64,5,5,30],[-32,4,5,11],[0,2,7,0],[128,3,7,2],[256,3,8,3],[512,4,9,12],[1024,4,10,13],[-2049,6,32,62,"lower"],[2048,6,32,63]];break;case 7:r=[[-1024,4,9,8],[-512,3,8,0],[-256,4,7,9],[-128,5,6,26],[-64,5,5,27],[-32,4,5,10],[0,4,5,11],[32,5,5,28],[64,5,6,29],[128,4,7,12],[256,3,8,1],[512,3,9,2],[1024,3,10,3],[-1025,5,32,30,"lower"],[2048,5,32,31]];break;case 8:r=[[-15,8,3,252],[-7,9,1,508],[-5,8,1,253],[-3,9,0,509],[-2,7,0,124],[-1,4,0,10],[0,2,1,0],[2,5,0,26],[3,6,0,58],[4,3,4,4],[20,6,1,59],[22,4,4,11],[38,4,5,12],[70,5,6,27],[134,5,7,28],[262,6,7,60],[390,7,8,125],[646,6,10,61],[-16,9,32,510,"lower"],[1670,9,32,511],[2,1]];break;case 9:r=[[-31,8,4,252],[-15,9,2,508],[-11,8,2,253],[-7,9,1,509],[-5,7,1,124],[-3,4,1,10],[-1,3,1,2],[1,3,1,3],[3,5,1,26],[5,6,1,58],[7,3,5,4],[39,6,2,59],[43,4,5,11],[75,4,6,12],[139,5,7,27],[267,5,8,28],[523,6,8,60],[779,7,9,125],[1291,6,11,61],[-32,9,32,510,"lower"],[3339,9,32,511],[2,0]];break;case 10:r=[[-21,7,4,122],[-5,8,0,252],[-4,7,0,123],[-3,5,0,24],[-2,2,2,0],[2,5,0,25],[3,6,0,54],[4,7,0,124],[5,8,0,253],[6,2,6,1],[70,5,5,26],[102,6,5,55],[134,6,6,56],[198,6,7,57],[326,6,8,58],[582,6,9,59],[1094,6,10,60],[2118,7,11,125],[-22,8,32,254,"lower"],[4166,8,32,255],[2,2]];break;case 11:r=[[1,1,0,0],[2,2,1,2],[4,4,0,12],[5,4,1,13],[7,5,1,28],[9,5,2,29],[13,6,2,60],[17,7,2,122],[21,7,3,123],[29,7,4,124],[45,7,5,125],[77,7,6,126],[141,7,32,127]];break;case 12:r=[[1,1,0,0],[2,2,0,2],[3,3,1,6],[5,5,0,28],[6,5,1,29],[8,6,1,60],[10,7,0,122],[11,7,1,123],[13,7,2,124],[17,7,3,125],[25,7,4,126],[41,8,5,254],[73,8,32,255]];break;case 13:r=[[1,1,0,0],[2,3,0,4],[3,4,0,12],[4,5,0,28],[5,4,1,13],[7,3,3,5],[15,6,1,58],[17,6,2,59],[21,6,3,60],[29,6,4,61],[45,6,5,62],[77,7,6,126],[141,7,32,127]];break;case 14:r=[[-2,3,0,4],[-1,3,0,5],[0,1,0,0],[1,3,0,6],[2,3,0,7]];break;case 15:r=[[-24,7,4,124],[-8,6,2,60],[-4,5,1,28],[-2,4,0,12],[-1,3,0,4],[0,1,0,0],[1,3,0,5],[2,4,0,13],[3,5,1,29],[5,6,2,61],[9,7,4,125],[-25,7,32,126,"lower"],[25,7,32,127]];break;default:throw new o("standard table B."+e+" does not exist")}var a=r.length,i=void 0;for(i=0;i<a;i++)r[i]=new C(r[i]);t=new _(r,!0);A[e]=t;return t}function I(e,t,r){this.data=e;this.start=t;this.end=r;this.position=t;this.shift=-1;this.currentByte=0}I.prototype={readBit:function(){if(this.shift<0){if(this.position>=this.end)throw new o("end of data while reading bit");this.currentByte=this.data[this.position++];this.shift=7}var e=this.currentByte>>this.shift&1;this.shift--;return e},readBits:function(e){var t=0,r=void 0;for(r=e-1;r>=0;r--)t|=this.readBit()<<r;return t},byteAlign:function(){this.shift=-1},next:function(){return this.position>=this.end?-1:this.data[this.position++]}};function O(e,t,r){var a=0,i=void 0,n=t.length,s=void 0;for(i=0;i<n;i++)if(s=r[t[i]]){if(e===a)return s;a++}throw new o("can't find custom Huffman table")}function T(e,t,r){var a=[],i=void 0,n=void 0,o=void 0;for(n=0;n<r;n++){o=new Uint8Array(t);a.push(o);for(i=0;i<t;i++)o[i]=e.readBit();e.byteAlign()}return a}function E(e,t,r,a){var i={K:-1,Columns:t,Rows:r,BlackIs1:!0,EndOfBlock:a},o=new n.CCITTFaxDecoder(e,i),s=[],c=void 0,l=void 0,u=void 0,h=void 0,f=void 0,d=!1;for(l=0;l<r;l++){u=new Uint8Array(t);s.push(u);f=-1;for(c=0;c<t;c++){if(f<0){if(-1===(h=o.readNextChar())){h=0;d=!0}f=7}u[c]=h>>f&1;f--}}if(a&&!d)for(var g=0;g<5&&-1!==o.readNextChar();g++);return s}function F(){}F.prototype={parseChunks:function(e){return function(e){for(var t=new S,r=0,a=e.length;r<a;r++){var i=e[r];k(v({},i.data,i.start,i.end),t)}return t.buffer}(e)},parse:function(e){var t=function(e){var t=0,r=e.length;if(151!==e[t]||74!==e[t+1]||66!==e[t+2]||50!==e[t+3]||13!==e[t+4]||10!==e[t+5]||26!==e[t+6]||10!==e[t+7])throw new o("parseJbig2 - invalid header.");var i=Object.create(null);t+=8;var n=e[t++];i.randomAccess=!(1&n);if(!(2&n)){i.numberOfPages=(0,a.readUint32)(e,t);t+=4}var s=v(i,e,t,r),c=new S;k(s,c);for(var l=c.currentPageInfo,u=l.width,h=l.height,f=c.buffer,d=new Uint8ClampedArray(u*h),g=0,m=0,p=0;p<h;p++)for(var b=0,y=void 0,w=0;w<u;w++){if(!b){b=128;y=f[m++]}d[g++]=y&b?0:255;b>>=1}return{imgData:d,width:u,height:h}}(e),r=t.imgData,i=t.width,n=t.height;this.width=i;this.height=n;return r}};return F}();t.Jbig2Image=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){var e=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];function t(e,t,r){this.data=e;this.bp=t;this.dataEnd=r;this.chigh=e[t];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}t.prototype={byteIn:function(){var e=this.data,t=this.bp;if(255===e[t]){if(e[t+1]>143){this.clow+=65280;this.ct=8}else{t++;this.clow+=e[t]<<9;this.ct=7;this.bp=t}}else{t++;this.clow+=t<this.dataEnd?e[t]<<8:65280;this.ct=8;this.bp=t}if(this.clow>65535){this.chigh+=this.clow>>16;this.clow&=65535}},readBit:function(t,r){var a,i=t[r]>>1,n=1&t[r],o=e[i],s=o.qe,c=this.a-s;if(this.chigh<s)if(c<s){c=s;a=n;i=o.nmps}else{c=s;a=1^n;1===o.switchFlag&&(n=a);i=o.nlps}else{this.chigh-=s;if(0!=(32768&c)){this.a=c;return n}if(c<s){a=1^n;1===o.switchFlag&&(n=a);i=o.nlps}else{a=n;i=o.nmps}}do{0===this.ct&&this.byteIn();c<<=1;this.chigh=this.chigh<<1&65535|this.clow>>15&1;this.clow=this.clow<<1&65535;this.ct--}while(0==(32768&c));this.a=c;t[r]=i<<1|n;return a}};return t}();t.ArithmeticDecoder=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.JpegStream=void 0;var a=r(2),i=r(140),n=r(138),o=r(147),s=function(){function e(e,t,r,a){for(var n=void 0;-1!==(n=e.getByte());)if(255===n){e.skip(-1);break}this.stream=e;this.maybeLength=t;this.dict=r;this.params=a;i.DecodeStream.call(this,t)}e.prototype=Object.create(i.DecodeStream.prototype);Object.defineProperty(e.prototype,"bytes",{get:function(){return(0,a.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:!0});e.prototype.ensureBuffer=function(e){};e.prototype.readBlock=function(){if(!this.eof){var e={decodeTransform:void 0,colorTransform:void 0},t=this.dict.getArray("Decode","D");if(this.forceRGB&&Array.isArray(t)){for(var r=this.dict.get("BitsPerComponent")||8,a=t.length,i=new Int32Array(a),s=!1,c=(1<<r)-1,l=0;l<a;l+=2){i[l]=256*(t[l+1]-t[l])|0;i[l+1]=t[l]*c|0;256===i[l]&&0===i[l+1]||(s=!0)}s&&(e.decodeTransform=i)}if((0,n.isDict)(this.params)){var u=this.params.get("ColorTransform");Number.isInteger(u)&&(e.colorTransform=u)}var h=new o.JpegImage(e);h.parse(this.bytes);var f=h.getData({width:this.drawWidth,height:this.drawHeight,forceRGB:this.forceRGB,isSourcePDF:!0});this.buffer=f;this.bufferLength=f.length;this.eof=!0}};e.prototype.getIR=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return(0,a.createObjectURL)(this.bytes,"image/jpeg",e)};return e}();t.JpegStream=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.JpegImage=void 0;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(2),n=function(){function e(e){this.message="JPEG error: "+e}e.prototype=new Error;e.prototype.name="JpegError";e.constructor=e;return e}(),o=function(){function e(e,t){this.message=e;this.scanLines=t}e.prototype=new Error;e.prototype.name="DNLMarkerError";e.constructor=e;return e}(),s=function(){function e(e){this.message=e}e.prototype=new Error;e.prototype.name="EOIMarkerError";e.constructor=e;return e}(),c=function(){var e=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]),t=4017,r=799,c=3406,l=2276,u=1567,h=3784,f=5793,d=2896;function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.decodeTransform,r=void 0===t?null:t,a=e.colorTransform,i=void 0===a?-1:a;this._decodeTransform=r;this._colorTransform=i}function m(e,t){for(var r,a,i=0,n=[],o=16;o>0&&!e[o-1];)o--;n.push({children:[],index:0});var s,c=n[0];for(r=0;r<o;r++){for(a=0;a<e[r];a++){(c=n.pop()).children[c.index]=t[i];for(;c.index>0;)c=n.pop();c.index++;n.push(c);for(;n.length<=r;){n.push(s={children:[],index:0});c.children[c.index]=s.children;c=s}i++}if(r+1<o){n.push(s={children:[],index:0});c.children[c.index]=s.children;c=s}}return n[0].children}function p(e,t,r){return 64*((e.blocksPerLine+1)*t+r)}function v(t,r,c,l,u,h,f,d,g){var m=arguments.length>9&&void 0!==arguments[9]&&arguments[9],v=c.mcusPerLine,b=c.progressive,y=r,k=0,S=0;function C(){if(S>0)return k>>--S&1;if(255===(k=t[r++])){var e=t[r++];if(e){if(220===e&&m){r+=2;var a=t[r++]<<8|t[r++];if(a>0&&a!==c.scanLines)throw new o("Found DNL marker (0xFFDC) while parsing scan data",a)}else if(217===e)throw new s("Found EOI marker (0xFFD9) while parsing scan data");throw new n("unexpected marker "+(k<<8|e).toString(16))}}S=7;return k>>>7}function x(e){for(var t=e;;){if("number"==typeof(t=t[C()]))return t;if("object"!==(void 0===t?"undefined":a(t)))throw new n("invalid huffman sequence")}}function _(e){for(var t=0;e>0;){t=t<<1|C();e--}return t}function A(e){if(1===e)return 1===C()?1:-1;var t=_(e);return t>=1<<e-1?t:t+(-1<<e)+1}var P=0;var I,O=0;function T(e,t,r,a,i){var n=r%v;t(e,p(e,(r/v|0)*e.v+a,n*e.h+i))}function E(e,t,r){t(e,p(e,r/e.blocksPerLine|0,r%e.blocksPerLine))}var F,R,B,D,M,L,N=l.length;L=b?0===h?0===d?function(e,t){var r=x(e.huffmanTableDC),a=0===r?0:A(r)<<g;e.blockData[t]=e.pred+=a}:function(e,t){e.blockData[t]|=C()<<g}:0===d?function(t,r){if(P>0)P--;else for(var a=h,i=f;a<=i;){var n=x(t.huffmanTableAC),o=15&n,s=n>>4;if(0!==o){var c=e[a+=s];t.blockData[r+c]=A(o)*(1<<g);a++}else{if(s<15){P=_(s)+(1<<s)-1;break}a+=16}}}:function(t,r){for(var a,i,o=h,s=f,c=0;o<=s;){var l=r+e[o],u=t.blockData[l]<0?-1:1;switch(O){case 0:c=(i=x(t.huffmanTableAC))>>4;if(0==(a=15&i))if(c<15){P=_(c)+(1<<c);O=4}else{c=16;O=1}else{if(1!==a)throw new n("invalid ACn encoding");I=A(a);O=c?2:3}continue;case 1:case 2:t.blockData[l]?t.blockData[l]+=u*(C()<<g):0==--c&&(O=2===O?3:0);break;case 3:if(t.blockData[l])t.blockData[l]+=u*(C()<<g);else{t.blockData[l]=I<<g;O=0}break;case 4:t.blockData[l]&&(t.blockData[l]+=u*(C()<<g))}o++}4===O&&0==--P&&(O=0)}:function(t,r){var a=x(t.huffmanTableDC),i=0===a?0:A(a);t.blockData[r]=t.pred+=i;for(var n=1;n<64;){var o=x(t.huffmanTableAC),s=15&o,c=o>>4;if(0!==s){var l=e[n+=c];t.blockData[r+l]=A(s);n++}else{if(c<15)break;n+=16}}};var U,q,j,z,H=0;q=1===N?l[0].blocksPerLine*l[0].blocksPerColumn:v*c.mcusPerColumn;for(;H<q;){var G=u?Math.min(q-H,u):q;for(R=0;R<N;R++)l[R].pred=0;P=0;if(1===N){F=l[0];for(M=0;M<G;M++){E(F,L,H);H++}}else for(M=0;M<G;M++){for(R=0;R<N;R++){j=(F=l[R]).h;z=F.v;for(B=0;B<z;B++)for(D=0;D<j;D++)T(F,L,H,B,D)}H++}S=0;if((U=w(t,r))&&U.invalid){(0,i.warn)("decodeScan - unexpected MCU data, current marker is: "+U.invalid);r=U.offset}var W=U&&U.marker;if(!W||W<=65280)throw new n("marker was not found");if(!(W>=65488&&W<=65495))break;r+=2}if((U=w(t,r))&&U.invalid){(0,i.warn)("decodeScan - unexpected Scan data, current marker is: "+U.invalid);r=U.offset}return r-y}function b(e,a,i){var o,s,g,m,p,v,b,y,w,k,S,C,x,_,A,P,I,O=e.quantizationTable,T=e.blockData;if(!O)throw new n("missing required Quantization Table.");for(var E=0;E<64;E+=8){w=T[a+E];k=T[a+E+1];S=T[a+E+2];C=T[a+E+3];x=T[a+E+4];_=T[a+E+5];A=T[a+E+6];P=T[a+E+7];w*=O[E];if(0!=(k|S|C|x|_|A|P)){k*=O[E+1];S*=O[E+2];C*=O[E+3];x*=O[E+4];_*=O[E+5];A*=O[E+6];P*=O[E+7];s=(o=(o=f*w+128>>8)+(s=f*x+128>>8)+1>>1)-s;I=(g=S)*h+(m=A)*u+128>>8;g=g*u-m*h+128>>8;b=(p=(p=d*(k-P)+128>>8)+(b=_<<4)+1>>1)-b;v=(y=(y=d*(k+P)+128>>8)+(v=C<<4)+1>>1)-v;m=(o=o+(m=I)+1>>1)-m;g=(s=s+g+1>>1)-g;I=p*l+y*c+2048>>12;p=p*c-y*l+2048>>12;y=I;I=v*r+b*t+2048>>12;v=v*t-b*r+2048>>12;b=I;i[E]=o+y;i[E+7]=o-y;i[E+1]=s+b;i[E+6]=s-b;i[E+2]=g+v;i[E+5]=g-v;i[E+3]=m+p;i[E+4]=m-p}else{I=f*w+512>>10;i[E]=I;i[E+1]=I;i[E+2]=I;i[E+3]=I;i[E+4]=I;i[E+5]=I;i[E+6]=I;i[E+7]=I}}for(var F=0;F<8;++F){w=i[F];if(0!=((k=i[F+8])|(S=i[F+16])|(C=i[F+24])|(x=i[F+32])|(_=i[F+40])|(A=i[F+48])|(P=i[F+56]))){s=(o=4112+((o=f*w+2048>>12)+(s=f*x+2048>>12)+1>>1))-s;I=(g=S)*h+(m=A)*u+2048>>12;g=g*u-m*h+2048>>12;m=I;b=(p=(p=d*(k-P)+2048>>12)+(b=_)+1>>1)-b;v=(y=(y=d*(k+P)+2048>>12)+(v=C)+1>>1)-v;I=p*l+y*c+2048>>12;p=p*c-y*l+2048>>12;y=I;I=v*r+b*t+2048>>12;v=v*t-b*r+2048>>12;P=(o=o+m+1>>1)-y;k=(s=s+g+1>>1)+(b=I);A=s-b;S=(g=s-g)+v;_=g-v;C=(m=o-m)+p;x=m-p;w=(w=o+y)<16?0:w>=4080?255:w>>4;k=k<16?0:k>=4080?255:k>>4;S=S<16?0:S>=4080?255:S>>4;C=C<16?0:C>=4080?255:C>>4;x=x<16?0:x>=4080?255:x>>4;_=_<16?0:_>=4080?255:_>>4;A=A<16?0:A>=4080?255:A>>4;P=P<16?0:P>=4080?255:P>>4;T[a+F]=w;T[a+F+8]=k;T[a+F+16]=S;T[a+F+24]=C;T[a+F+32]=x;T[a+F+40]=_;T[a+F+48]=A;T[a+F+56]=P}else{I=(I=f*w+8192>>14)<-2040?0:I>=2024?255:I+2056>>4;T[a+F]=I;T[a+F+8]=I;T[a+F+16]=I;T[a+F+24]=I;T[a+F+32]=I;T[a+F+40]=I;T[a+F+48]=I;T[a+F+56]=I}}}function y(e,t){for(var r=t.blocksPerLine,a=t.blocksPerColumn,i=new Int16Array(64),n=0;n<a;n++)for(var o=0;o<r;o++){b(t,p(t,n,o),i)}return t.blockData}function w(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;function a(t){return e[t]<<8|e[t+1]}var i=e.length-1,n=r<t?r:t;if(t>=i)return null;var o=a(t);if(o>=65472&&o<=65534)return{invalid:null,marker:o,offset:t};for(var s=a(n);!(s>=65472&&s<=65534);){if(++n>=i)return null;s=a(n)}return{invalid:o.toString(16),marker:s,offset:n}}g.prototype={parse:function(t){var r=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).dnlScanLines,a=void 0===r?null:r;function c(){var e=t[d]<<8|t[d+1];d+=2;return e}function l(){var e=c(),r=d+e-2,a=w(t,r,d);if(a&&a.invalid){(0,i.warn)("readDataBlock - incorrect length, current marker is: "+a.invalid);r=a.offset}var n=t.subarray(d,r);d+=n.length;return n}function u(e){for(var t=Math.ceil(e.samplesPerLine/8/e.maxH),r=Math.ceil(e.scanLines/8/e.maxV),a=0;a<e.components.length;a++){X=e.components[a];var i=Math.ceil(Math.ceil(e.samplesPerLine/8)*X.h/e.maxH),n=Math.ceil(Math.ceil(e.scanLines/8)*X.v/e.maxV),o=t*X.h,s=64*(r*X.v)*(o+1);X.blockData=new Int16Array(s);X.blocksPerLine=i;X.blocksPerColumn=n}e.mcusPerLine=t;e.mcusPerColumn=r}var h,f,d=0,g=null,p=null,b=0,k=[],S=[],C=[],x=c();if(65496!==x)throw new n("SOI not found");x=c();e:for(;65497!==x;){var _,A,P;switch(x){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var I=l();65504===x&&74===I[0]&&70===I[1]&&73===I[2]&&70===I[3]&&0===I[4]&&(g={version:{major:I[5],minor:I[6]},densityUnits:I[7],xDensity:I[8]<<8|I[9],yDensity:I[10]<<8|I[11],thumbWidth:I[12],thumbHeight:I[13],thumbData:I.subarray(14,14+3*I[12]*I[13])});65518===x&&65===I[0]&&100===I[1]&&111===I[2]&&98===I[3]&&101===I[4]&&(p={version:I[5]<<8|I[6],flags0:I[7]<<8|I[8],flags1:I[9]<<8|I[10],transformCode:I[11]});break;case 65499:for(var O=c()+d-2;d<O;){var T=t[d++],E=new Uint16Array(64);if(T>>4==0)for(A=0;A<64;A++)E[e[A]]=t[d++];else{if(T>>4!=1)throw new n("DQT - invalid table spec");for(A=0;A<64;A++)E[e[A]]=c()}k[15&T]=E}break;case 65472:case 65473:case 65474:if(h)throw new n("Only single frame JPEGs supported");c();(h={}).extended=65473===x;h.progressive=65474===x;h.precision=t[d++];var F=c();h.scanLines=a||F;h.samplesPerLine=c();h.components=[];h.componentIds={};var R,B=t[d++],D=0,M=0;for(_=0;_<B;_++){R=t[d];var L=t[d+1]>>4,N=15&t[d+1];D<L&&(D=L);M<N&&(M=N);var U=t[d+2];P=h.components.push({h:L,v:N,quantizationId:U,quantizationTable:null});h.componentIds[R]=P-1;d+=3}h.maxH=D;h.maxV=M;u(h);break;case 65476:var q=c();for(_=2;_<q;){var j=t[d++],z=new Uint8Array(16),H=0;for(A=0;A<16;A++,d++)H+=z[A]=t[d];var G=new Uint8Array(H);for(A=0;A<H;A++,d++)G[A]=t[d];_+=17+H;(j>>4==0?C:S)[15&j]=m(z,G)}break;case 65501:c();f=c();break;case 65498:var W=1==++b&&!a;c();var X,V=t[d++],K=[];for(_=0;_<V;_++){var Y=h.componentIds[t[d++]];X=h.components[Y];var J=t[d++];X.huffmanTableDC=C[J>>4];X.huffmanTableAC=S[15&J];K.push(X)}var Z=t[d++],Q=t[d++],$=t[d++];try{var ee=v(t,d,h,K,f,Z,Q,$>>4,15&$,W);d+=ee}catch(e){if(e instanceof o){(0,i.warn)(e.message+" -- attempting to re-parse the JPEG image.");return this.parse(t,{dnlScanLines:e.scanLines})}if(e instanceof s){(0,i.warn)(e.message+" -- ignoring the rest of the image data.");break e}throw e}break;case 65500:d+=4;break;case 65535:255!==t[d]&&d--;break;default:if(255===t[d-3]&&t[d-2]>=192&&t[d-2]<=254){d-=3;break}var te=w(t,d-2);if(te&&te.invalid){(0,i.warn)("JpegImage.parse - unexpected data, current marker is: "+te.invalid);d=te.offset;break}throw new n("unknown marker "+x.toString(16))}x=c()}this.width=h.samplesPerLine;this.height=h.scanLines;this.jfif=g;this.adobe=p;this.components=[];for(_=0;_<h.components.length;_++){var re=k[(X=h.components[_]).quantizationId];re&&(X.quantizationTable=re);this.components.push({output:y(0,X),scaleX:X.h/h.maxH,scaleY:X.v/h.maxV,blocksPerLine:X.blocksPerLine,blocksPerColumn:X.blocksPerColumn})}this.numComponents=this.components.length},_getLinearizedBlockData:function(e,t){var r,a,i,n,o,s,c,l,u,h,f,d=arguments.length>2&&void 0!==arguments[2]&&arguments[2],g=this.width/e,m=this.height/t,p=0,v=this.components.length,b=e*t*v,y=new Uint8ClampedArray(b),w=new Uint32Array(e);for(c=0;c<v;c++){a=(r=this.components[c]).scaleX*g;i=r.scaleY*m;p=c;f=r.output;n=r.blocksPerLine+1<<3;for(o=0;o<e;o++){l=0|o*a;w[o]=(4294967288&l)<<3|7&l}for(s=0;s<t;s++){h=n*(4294967288&(l=0|s*i))|(7&l)<<3;for(o=0;o<e;o++){y[p]=f[h+w[o]];p+=v}}}var k=this._decodeTransform;d||4!==v||k||(k=new Int32Array([-256,255,-256,255,-256,255,-256,255]));if(k)for(c=0;c<b;)for(l=0,u=0;l<v;l++,c++,u+=2)y[c]=(y[c]*k[u]>>8)+k[u+1];return y},get _isColorConversionNeeded(){return this.adobe?!!this.adobe.transformCode:3===this.numComponents?0!==this._colorTransform:1===this._colorTransform},_convertYccToRgb:function(e){for(var t,r,a,i=0,n=e.length;i<n;i+=3){t=e[i];r=e[i+1];a=e[i+2];e[i]=t-179.456+1.402*a;e[i+1]=t+135.459-.344*r-.714*a;e[i+2]=t-226.816+1.772*r}return e},_convertYcckToRgb:function(e){for(var t,r,a,i,n=0,o=0,s=e.length;o<s;o+=4){t=e[o];r=e[o+1];a=e[o+2];i=e[o+3];e[n++]=r*(-660635669420364e-19*r+.000437130475926232*a-54080610064599e-18*t+.00048449797120281*i-.154362151871126)-122.67195406894+a*(-.000957964378445773*a+.000817076911346625*t-.00477271405408747*i+1.53380253221734)+t*(.000961250184130688*t-.00266257332283933*i+.48357088451265)+i*(-.000336197177618394*i+.484791561490776);e[n++]=107.268039397724+r*(219927104525741e-19*r-.000640992018297945*a+.000659397001245577*t+.000426105652938837*i-.176491792462875)+a*(-.000778269941513683*a+.00130872261408275*t+.000770482631801132*i-.151051492775562)+t*(.00126935368114843*t-.00265090189010898*i+.25802910206845)+i*(-.000318913117588328*i-.213742400323665);e[n++]=r*(-.000570115196973677*r-263409051004589e-19*a+.0020741088115012*t-.00288260236853442*i+.814272968359295)-20.810012546947+a*(-153496057440975e-19*a-.000132689043961446*t+.000560833691242812*i-.195152027534049)+t*(.00174418132927582*t-.00255243321439347*i+.116935020465145)+i*(-.000343531996510555*i+.24165260232407)}return e.subarray(0,n)},_convertYcckToCmyk:function(e){for(var t,r,a,i=0,n=e.length;i<n;i+=4){t=e[i];r=e[i+1];a=e[i+2];e[i]=434.456-t-1.402*a;e[i+1]=119.541-t+.344*r+.714*a;e[i+2]=481.816-t-1.772*r}return e},_convertCmykToRgb:function(e){for(var t,r,a,i,n=0,o=0,s=e.length;o<s;o+=4){t=e[o]*(1/255);r=e[o+1]*(1/255);a=e[o+2]*(1/255);i=e[o+3]*(1/255);e[n++]=255+t*(-4.387332384609988*t+54.48615194189176*r+18.82290502165302*a+212.25662451639585*i-285.2331026137004)+r*(1.7149763477362134*r-5.6096736904047315*a-17.873870861415444*i-5.497006427196366)+a*(-2.5217340131683033*a-21.248923337353073*i+17.5119270841813)-i*(21.86122147463605*i+189.48180835922747);e[n++]=255+t*(8.841041422036149*t+60.118027045597366*r+6.871425592049007*a+31.159100130055922*i-79.2970844816548)+r*(-15.310361306967817*r+17.575251261109482*a+131.35250912493976*i-190.9453302588951)+a*(4.444339102852739*a+9.8632861493405*i-24.86741582555878)-i*(20.737325471181034*i+187.80453709719578);e[n++]=255+t*(.8842522430003296*t+8.078677503112928*r+30.89978309703729*a-.23883238689178934*i-14.183576799673286)+r*(10.49593273432072*r+63.02378494754052*a+50.606957656360734*i-112.23884253719248)+a*(.03296041114873217*a+115.60384449646641*i-193.58209356861505)-i*(22.33816807309886*i+180.12613974708367)}return e.subarray(0,n)},getData:function(e){var t=e.width,r=e.height,a=e.forceRGB,i=void 0!==a&&a,o=e.isSourcePDF,s=void 0!==o&&o;if(this.numComponents>4)throw new n("Unsupported color mode");var c=this._getLinearizedBlockData(t,r,s);if(1===this.numComponents&&i){for(var l=c.length,u=new Uint8ClampedArray(3*l),h=0,f=0;f<l;f++){var d=c[f];u[h++]=d;u[h++]=d;u[h++]=d}return u}if(3===this.numComponents&&this._isColorConversionNeeded)return this._convertYccToRgb(c);if(4===this.numComponents){if(this._isColorConversionNeeded)return i?this._convertYcckToRgb(c):this._convertYcckToCmyk(c);if(i)return this._convertCmykToRgb(c)}return c}};return g}();t.JpegImage=c},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.JpxStream=void 0;var a=r(140),i=r(149),n=r(2),o=function(){function e(e,t,r,i){this.stream=e;this.maybeLength=t;this.dict=r;this.params=i;a.DecodeStream.call(this,t)}e.prototype=Object.create(a.DecodeStream.prototype);Object.defineProperty(e.prototype,"bytes",{get:function(){return(0,n.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:!0});e.prototype.ensureBuffer=function(e){};e.prototype.readBlock=function(){if(!this.eof){var e=new i.JpxImage;e.parse(this.bytes);var t=e.width,r=e.height,a=e.componentsCount,n=e.tiles.length;if(1===n)this.buffer=e.tiles[0].items;else{for(var o=new Uint8ClampedArray(t*r*a),s=0;s<n;s++)for(var c=e.tiles[s],l=c.width,u=c.height,h=c.left,f=c.top,d=c.items,g=0,m=(t*f+h)*a,p=t*a,v=l*a,b=0;b<u;b++){var y=d.subarray(g,g+v);o.set(y,m);g+=v;m+=p}this.buffer=o}this.bufferLength=this.buffer.length;this.eof=!0}};return e}();t.JpxStream=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.JpxImage=void 0;var a=r(2),i=r(145),n=function(){function e(e){this.message="JPX error: "+e}e.prototype=new Error;e.prototype.name="JpxError";e.constructor=e;return e}(),o=function(){var e={LL:0,LH:1,HL:1,HH:2};function t(){this.failOnCorruptedImage=!1}t.prototype={parse:function(e){if(65359!==(0,a.readUint16)(e,0))for(var t=0,r=e.length;t<r;){var i=8,o=(0,a.readUint32)(e,t),s=(0,a.readUint32)(e,t+4);t+=i;if(1===o){o=4294967296*(0,a.readUint32)(e,t)+(0,a.readUint32)(e,t+4);t+=8;i+=8}0===o&&(o=r-t+i);if(o<i)throw new n("Invalid box field size");var c=o-i,l=!0;switch(s){case 1785737832:l=!1;break;case 1668246642:var u=e[t];if(1===u){var h=(0,a.readUint32)(e,t+3);switch(h){case 16:case 17:case 18:break;default:(0,a.warn)("Unknown colorspace "+h)}}else 2===u&&(0,a.info)("ICC profile not supported");break;case 1785737827:this.parseCodestream(e,t,t+c);break;case 1783636e3:218793738!==(0,a.readUint32)(e,t)&&(0,a.warn)("Invalid JP2 signature");break;case 1783634458:case 1718909296:case 1920099697:case 1919251232:case 1768449138:break;default:var f=String.fromCharCode(s>>24&255,s>>16&255,s>>8&255,255&s);(0,a.warn)("Unsupported header type "+s+" ("+f+")")}l&&(t+=c)}else this.parseCodestream(e,0,e.length)},parseImageProperties:function(e){for(var t=e.getByte();t>=0;){if(65361===(t<<8|(t=e.getByte()))){e.skip(4);var r=e.getInt32()>>>0,a=e.getInt32()>>>0,i=e.getInt32()>>>0,o=e.getInt32()>>>0;e.skip(16);var s=e.getUint16();this.width=r-i;this.height=a-o;this.componentsCount=s;this.bitsPerComponent=8;return}}throw new n("No size marker found in JPX stream")},parseCodestream:function(e,t,i){var s={},c=!1;try{for(var l=t;l+1<i;){var u=(0,a.readUint16)(e,l);l+=2;var h,f,m,b,y,w,k=0;switch(u){case 65359:s.mainHeader=!0;break;case 65497:break;case 65361:k=(0,a.readUint16)(e,l);var S={};S.Xsiz=(0,a.readUint32)(e,l+4);S.Ysiz=(0,a.readUint32)(e,l+8);S.XOsiz=(0,a.readUint32)(e,l+12);S.YOsiz=(0,a.readUint32)(e,l+16);S.XTsiz=(0,a.readUint32)(e,l+20);S.YTsiz=(0,a.readUint32)(e,l+24);S.XTOsiz=(0,a.readUint32)(e,l+28);S.YTOsiz=(0,a.readUint32)(e,l+32);var C=(0,a.readUint16)(e,l+36);S.Csiz=C;var x=[];h=l+38;for(var _=0;_<C;_++){var A={precision:1+(127&e[h]),isSigned:!!(128&e[h]),XRsiz:e[h+1],YRsiz:e[h+2]};h+=3;r(A,S);x.push(A)}s.SIZ=S;s.components=x;o(s,x);s.QCC=[];s.COC=[];break;case 65372:k=(0,a.readUint16)(e,l);var P={};h=l+2;switch(31&(f=e[h++])){case 0:b=8;y=!0;break;case 1:b=16;y=!1;break;case 2:b=16;y=!0;break;default:throw new Error("Invalid SQcd value "+f)}P.noQuantization=8===b;P.scalarExpounded=y;P.guardBits=f>>5;m=[];for(;h<k+l;){var I={};if(8===b){I.epsilon=e[h++]>>3;I.mu=0}else{I.epsilon=e[h]>>3;I.mu=(7&e[h])<<8|e[h+1];h+=2}m.push(I)}P.SPqcds=m;if(s.mainHeader)s.QCD=P;else{s.currentTile.QCD=P;s.currentTile.QCC=[]}break;case 65373:k=(0,a.readUint16)(e,l);var O,T={};h=l+2;if(s.SIZ.Csiz<257)O=e[h++];else{O=(0,a.readUint16)(e,h);h+=2}switch(31&(f=e[h++])){case 0:b=8;y=!0;break;case 1:b=16;y=!1;break;case 2:b=16;y=!0;break;default:throw new Error("Invalid SQcd value "+f)}T.noQuantization=8===b;T.scalarExpounded=y;T.guardBits=f>>5;m=[];for(;h<k+l;){I={};if(8===b){I.epsilon=e[h++]>>3;I.mu=0}else{I.epsilon=e[h]>>3;I.mu=(7&e[h])<<8|e[h+1];h+=2}m.push(I)}T.SPqcds=m;s.mainHeader?s.QCC[O]=T:s.currentTile.QCC[O]=T;break;case 65362:k=(0,a.readUint16)(e,l);var E={};h=l+2;var F=e[h++];E.entropyCoderWithCustomPrecincts=!!(1&F);E.sopMarkerUsed=!!(2&F);E.ephMarkerUsed=!!(4&F);E.progressionOrder=e[h++];E.layersCount=(0,a.readUint16)(e,h);h+=2;E.multipleComponentTransform=e[h++];E.decompositionLevelsCount=e[h++];E.xcb=2+(15&e[h++]);E.ycb=2+(15&e[h++]);var R=e[h++];E.selectiveArithmeticCodingBypass=!!(1&R);E.resetContextProbabilities=!!(2&R);E.terminationOnEachCodingPass=!!(4&R);E.verticallyStripe=!!(8&R);E.predictableTermination=!!(16&R);E.segmentationSymbolUsed=!!(32&R);E.reversibleTransformation=e[h++];if(E.entropyCoderWithCustomPrecincts){for(var B=[];h<k+l;){var D=e[h++];B.push({PPx:15&D,PPy:D>>4})}E.precinctsSizes=B}var M=[];E.selectiveArithmeticCodingBypass&&M.push("selectiveArithmeticCodingBypass");E.resetContextProbabilities&&M.push("resetContextProbabilities");E.terminationOnEachCodingPass&&M.push("terminationOnEachCodingPass");E.verticallyStripe&&M.push("verticallyStripe");E.predictableTermination&&M.push("predictableTermination");if(M.length>0){c=!0;throw new Error("Unsupported COD options ("+M.join(", ")+")")}if(s.mainHeader)s.COD=E;else{s.currentTile.COD=E;s.currentTile.COC=[]}break;case 65424:k=(0,a.readUint16)(e,l);(w={}).index=(0,a.readUint16)(e,l+2);w.length=(0,a.readUint32)(e,l+4);w.dataEnd=w.length+l-2;w.partIndex=e[l+8];w.partsCount=e[l+9];s.mainHeader=!1;if(0===w.partIndex){w.COD=s.COD;w.COC=s.COC.slice(0);w.QCD=s.QCD;w.QCC=s.QCC.slice(0)}s.currentTile=w;break;case 65427:if(0===(w=s.currentTile).partIndex){v(s,w.index);d(s)}g(s,e,l,k=w.dataEnd-l);break;case 65365:case 65367:case 65368:case 65380:k=(0,a.readUint16)(e,l);break;case 65363:throw new Error("Codestream code 0xFF53 (COC) is not implemented");default:throw new Error("Unknown codestream code: "+u.toString(16))}l+=k}}catch(e){if(c||this.failOnCorruptedImage)throw new n(e.message);(0,a.warn)("JPX: Trying to recover from: "+e.message)}this.tiles=function(e){for(var t=e.SIZ,r=e.components,a=t.Csiz,i=[],n=0,o=e.tiles.length;n<o;n++){var s,c=e.tiles[n],l=[];for(s=0;s<a;s++)l[s]=p(e,c,s);var u,h,f,d,g,m,v,b=l[0],y=new Uint8ClampedArray(b.items.length*a),w={left:b.left,top:b.top,width:b.width,height:b.height,items:y},k=0;if(c.codingStyleDefaultParameters.multipleComponentTransform){var S=4===a,C=l[0].items,x=l[1].items,_=l[2].items,A=S?l[3].items:null;u=r[0].precision-8;h=.5+(128<<u);var P=c.components[0],I=a-3;d=C.length;if(P.codingStyleParameters.reversibleTransformation)for(f=0;f<d;f++,k+=I){g=C[f]+h;m=x[f];v=_[f];var O=g-(v+m>>2);y[k++]=O+v>>u;y[k++]=O>>u;y[k++]=O+m>>u}else for(f=0;f<d;f++,k+=I){g=C[f]+h;m=x[f];v=_[f];y[k++]=g+1.402*v>>u;y[k++]=g-.34413*m-.71414*v>>u;y[k++]=g+1.772*m>>u}if(S)for(f=0,k=3;f<d;f++,k+=4)y[k]=A[f]+h>>u}else for(s=0;s<a;s++){var T=l[s].items;u=r[s].precision-8;h=.5+(128<<u);for(k=s,f=0,d=T.length;f<d;f++){y[k]=T[f]+h>>u;k+=a}}i.push(w)}return i}(s);this.width=s.SIZ.Xsiz-s.SIZ.XOsiz;this.height=s.SIZ.Ysiz-s.SIZ.YOsiz;this.componentsCount=s.SIZ.Csiz}};function r(e,t){e.x0=Math.ceil(t.XOsiz/e.XRsiz);e.x1=Math.ceil(t.Xsiz/e.XRsiz);e.y0=Math.ceil(t.YOsiz/e.YRsiz);e.y1=Math.ceil(t.Ysiz/e.YRsiz);e.width=e.x1-e.x0;e.height=e.y1-e.y0}function o(e,t){for(var r,a=e.SIZ,i=[],n=Math.ceil((a.Xsiz-a.XTOsiz)/a.XTsiz),o=Math.ceil((a.Ysiz-a.YTOsiz)/a.YTsiz),s=0;s<o;s++)for(var c=0;c<n;c++){(r={}).tx0=Math.max(a.XTOsiz+c*a.XTsiz,a.XOsiz);r.ty0=Math.max(a.YTOsiz+s*a.YTsiz,a.YOsiz);r.tx1=Math.min(a.XTOsiz+(c+1)*a.XTsiz,a.Xsiz);r.ty1=Math.min(a.YTOsiz+(s+1)*a.YTsiz,a.Ysiz);r.width=r.tx1-r.tx0;r.height=r.ty1-r.ty0;r.components=[];i.push(r)}e.tiles=i;for(var l=0,u=a.Csiz;l<u;l++)for(var h=t[l],f=0,d=i.length;f<d;f++){var g={};r=i[f];g.tcx0=Math.ceil(r.tx0/h.XRsiz);g.tcy0=Math.ceil(r.ty0/h.YRsiz);g.tcx1=Math.ceil(r.tx1/h.XRsiz);g.tcy1=Math.ceil(r.ty1/h.YRsiz);g.width=g.tcx1-g.tcx0;g.height=g.tcy1-g.tcy0;r.components[l]=g}}function s(e,t,r){var a=t.codingStyleParameters,i={};if(a.entropyCoderWithCustomPrecincts){i.PPx=a.precinctsSizes[r].PPx;i.PPy=a.precinctsSizes[r].PPy}else{i.PPx=15;i.PPy=15}i.xcb_=r>0?Math.min(a.xcb,i.PPx-1):Math.min(a.xcb,i.PPx);i.ycb_=r>0?Math.min(a.ycb,i.PPy-1):Math.min(a.ycb,i.PPy);return i}function c(e,t,r){var a=1<<r.PPx,i=1<<r.PPy,n=0===t.resLevel,o=1<<r.PPx+(n?0:-1),s=1<<r.PPy+(n?0:-1),c=t.trx1>t.trx0?Math.ceil(t.trx1/a)-Math.floor(t.trx0/a):0,l=t.try1>t.try0?Math.ceil(t.try1/i)-Math.floor(t.try0/i):0,u=c*l;t.precinctParameters={precinctWidth:a,precinctHeight:i,numprecinctswide:c,numprecinctshigh:l,numprecincts:u,precinctWidthInSubband:o,precinctHeightInSubband:s}}function l(e,t,r){var a,i,n,o,s=r.xcb_,c=r.ycb_,l=1<<s,u=1<<c,h=t.tbx0>>s,f=t.tby0>>c,d=t.tbx1+l-1>>s,g=t.tby1+u-1>>c,m=t.resolution.precinctParameters,p=[],v=[];for(i=f;i<g;i++)for(a=h;a<d;a++){(n={cbx:a,cby:i,tbx0:l*a,tby0:u*i,tbx1:l*(a+1),tby1:u*(i+1)}).tbx0_=Math.max(t.tbx0,n.tbx0);n.tby0_=Math.max(t.tby0,n.tby0);n.tbx1_=Math.min(t.tbx1,n.tbx1);n.tby1_=Math.min(t.tby1,n.tby1);o=Math.floor((n.tbx0_-t.tbx0)/m.precinctWidthInSubband)+Math.floor((n.tby0_-t.tby0)/m.precinctHeightInSubband)*m.numprecinctswide;n.precinctNumber=o;n.subbandType=t.type;n.Lblock=3;if(!(n.tbx1_<=n.tbx0_||n.tby1_<=n.tby0_)){p.push(n);var b=v[o];if(void 0!==b){a<b.cbxMin?b.cbxMin=a:a>b.cbxMax&&(b.cbxMax=a);i<b.cbyMin?b.cbxMin=i:i>b.cbyMax&&(b.cbyMax=i)}else v[o]=b={cbxMin:a,cbyMin:i,cbxMax:a,cbyMax:i};n.precinct=b}}t.codeblockParameters={codeblockWidth:s,codeblockHeight:c,numcodeblockwide:d-h+1,numcodeblockhigh:g-f+1};t.codeblocks=p;t.precincts=v}function u(e,t,r){for(var a=[],i=e.subbands,n=0,o=i.length;n<o;n++)for(var s=i[n].codeblocks,c=0,l=s.length;c<l;c++){var u=s[c];u.precinctNumber===t&&a.push(u)}return{layerNumber:r,codeblocks:a}}function h(e,t,r,a,i){var n=e*a.minWidth,o=t*a.minHeight;if(n%r.width!=0||o%r.height!=0)return null;var s=o/r.width*i.precinctParameters.numprecinctswide;return n/r.height+s}function f(e){for(var t=e.components.length,r=Number.MAX_VALUE,a=Number.MAX_VALUE,i=0,n=0,o=new Array(t),s=0;s<t;s++){for(var c=e.components[s],l=c.codingStyleParameters.decompositionLevelsCount,u=new Array(l+1),h=Number.MAX_VALUE,f=Number.MAX_VALUE,d=0,g=0,m=1,p=l;p>=0;--p){var v=c.resolutions[p],b=m*v.precinctParameters.precinctWidth,y=m*v.precinctParameters.precinctHeight;h=Math.min(h,b);f=Math.min(f,y);d=Math.max(d,v.precinctParameters.numprecinctswide);g=Math.max(g,v.precinctParameters.numprecinctshigh);u[p]={width:b,height:y};m<<=1}r=Math.min(r,h);a=Math.min(a,f);i=Math.max(i,d);n=Math.max(n,g);o[s]={resolutions:u,minWidth:h,minHeight:f,maxNumWide:d,maxNumHigh:g}}return{components:o,minWidth:r,minHeight:a,maxNumWide:i,maxNumHigh:n}}function d(e){for(var t=e.SIZ,r=e.currentTile.index,a=e.tiles[r],i=t.Csiz,o=0;o<i;o++){for(var d=a.components[o],g=d.codingStyleParameters.decompositionLevelsCount,m=[],p=[],v=0;v<=g;v++){var b,y=s(0,d,v),w={},k=1<<g-v;w.trx0=Math.ceil(d.tcx0/k);w.try0=Math.ceil(d.tcy0/k);w.trx1=Math.ceil(d.tcx1/k);w.try1=Math.ceil(d.tcy1/k);w.resLevel=v;c(0,w,y);m.push(w);if(0===v){(b={}).type="LL";b.tbx0=Math.ceil(d.tcx0/k);b.tby0=Math.ceil(d.tcy0/k);b.tbx1=Math.ceil(d.tcx1/k);b.tby1=Math.ceil(d.tcy1/k);b.resolution=w;l(0,b,y);p.push(b);w.subbands=[b]}else{var S=1<<g-v+1,C=[];(b={}).type="HL";b.tbx0=Math.ceil(d.tcx0/S-.5);b.tby0=Math.ceil(d.tcy0/S);b.tbx1=Math.ceil(d.tcx1/S-.5);b.tby1=Math.ceil(d.tcy1/S);b.resolution=w;l(0,b,y);p.push(b);C.push(b);(b={}).type="LH";b.tbx0=Math.ceil(d.tcx0/S);b.tby0=Math.ceil(d.tcy0/S-.5);b.tbx1=Math.ceil(d.tcx1/S);b.tby1=Math.ceil(d.tcy1/S-.5);b.resolution=w;l(0,b,y);p.push(b);C.push(b);(b={}).type="HH";b.tbx0=Math.ceil(d.tcx0/S-.5);b.tby0=Math.ceil(d.tcy0/S-.5);b.tbx1=Math.ceil(d.tcx1/S-.5);b.tby1=Math.ceil(d.tcy1/S-.5);b.resolution=w;l(0,b,y);p.push(b);C.push(b);w.subbands=C}}d.resolutions=m;d.subbands=p}var x=a.codingStyleDefaultParameters.progressionOrder;switch(x){case 0:a.packetsIterator=new function(e){for(var t=e.SIZ,r=e.currentTile.index,a=e.tiles[r],i=a.codingStyleDefaultParameters.layersCount,o=t.Csiz,s=0,c=0;c<o;c++)s=Math.max(s,a.components[c].codingStyleParameters.decompositionLevelsCount);var l=0,h=0,f=0,d=0;this.nextPacket=function(){for(;l<i;l++){for(;h<=s;h++){for(;f<o;f++){var e=a.components[f];if(!(h>e.codingStyleParameters.decompositionLevelsCount)){for(var t=e.resolutions[h],r=t.precinctParameters.numprecincts;d<r;){var c=u(t,d,l);d++;return c}d=0}}f=0}h=0}throw new n("Out of packets")}}(e);break;case 1:a.packetsIterator=new function(e){for(var t=e.SIZ,r=e.currentTile.index,a=e.tiles[r],i=a.codingStyleDefaultParameters.layersCount,o=t.Csiz,s=0,c=0;c<o;c++)s=Math.max(s,a.components[c].codingStyleParameters.decompositionLevelsCount);var l=0,h=0,f=0,d=0;this.nextPacket=function(){for(;l<=s;l++){for(;h<i;h++){for(;f<o;f++){var e=a.components[f];if(!(l>e.codingStyleParameters.decompositionLevelsCount)){for(var t=e.resolutions[l],r=t.precinctParameters.numprecincts;d<r;){var c=u(t,d,h);d++;return c}d=0}}f=0}h=0}throw new n("Out of packets")}}(e);break;case 2:a.packetsIterator=new function(e){var t,r,a,i,o=e.SIZ,s=e.currentTile.index,c=e.tiles[s],l=c.codingStyleDefaultParameters.layersCount,h=o.Csiz,f=0;for(a=0;a<h;a++){var d=c.components[a];f=Math.max(f,d.codingStyleParameters.decompositionLevelsCount)}var g=new Int32Array(f+1);for(r=0;r<=f;++r){var m=0;for(a=0;a<h;++a){var p=c.components[a].resolutions;r<p.length&&(m=Math.max(m,p[r].precinctParameters.numprecincts))}g[r]=m}t=0;r=0;a=0;i=0;this.nextPacket=function(){for(;r<=f;r++){for(;i<g[r];i++){for(;a<h;a++){var e=c.components[a];if(!(r>e.codingStyleParameters.decompositionLevelsCount)){var o=e.resolutions[r],s=o.precinctParameters.numprecincts;if(!(i>=s)){for(;t<l;){var d=u(o,i,t);t++;return d}t=0}}}a=0}i=0}throw new n("Out of packets")}}(e);break;case 3:a.packetsIterator=new function(e){var t=e.SIZ,r=e.currentTile.index,a=e.tiles[r],i=a.codingStyleDefaultParameters.layersCount,o=t.Csiz,s=f(a),c=s,l=0,d=0,g=0,m=0,p=0;this.nextPacket=function(){for(;p<c.maxNumHigh;p++){for(;m<c.maxNumWide;m++){for(;g<o;g++){for(var e=a.components[g],t=e.codingStyleParameters.decompositionLevelsCount;d<=t;d++){var r=e.resolutions[d],f=s.components[g].resolutions[d],v=h(m,p,f,c,r);if(null!==v){for(;l<i;){var b=u(r,v,l);l++;return b}l=0}}d=0}g=0}m=0}throw new n("Out of packets")}}(e);break;case 4:a.packetsIterator=new function(e){var t=e.SIZ,r=e.currentTile.index,a=e.tiles[r],i=a.codingStyleDefaultParameters.layersCount,o=t.Csiz,s=f(a),c=0,l=0,d=0,g=0,m=0;this.nextPacket=function(){for(;d<o;++d){for(var e=a.components[d],t=s.components[d],r=e.codingStyleParameters.decompositionLevelsCount;m<t.maxNumHigh;m++){for(;g<t.maxNumWide;g++){for(;l<=r;l++){var f=e.resolutions[l],p=t.resolutions[l],v=h(g,m,p,t,f);if(null!==v){for(;c<i;){var b=u(f,v,c);c++;return b}c=0}}l=0}g=0}m=0}throw new n("Out of packets")}}(e);break;default:throw new n("Unsupported progression order "+x)}}function g(e,t,r,i){var n,o=0,s=0,c=!1;function l(e){for(;s<e;){var a=t[r+o];o++;if(c){n=n<<7|a;s+=7;c=!1}else{n=n<<8|a;s+=8}255===a&&(c=!0)}return n>>>(s-=e)&(1<<e)-1}function u(e){if(255===t[r+o-1]&&t[r+o]===e){h(1);return!0}if(255===t[r+o]&&t[r+o+1]===e){h(2);return!0}return!1}function h(e){o+=e}function f(){s=0;if(c){o++;c=!1}}function d(){if(0===l(1))return 1;if(0===l(1))return 2;var e=l(2);return e<3?e+3:(e=l(5))<31?e+6:(e=l(7))+37}for(var g=e.currentTile.index,m=e.tiles[g],p=e.COD.sopMarkerUsed,v=e.COD.ephMarkerUsed,w=m.packetsIterator;o<i;){f();p&&u(145)&&h(4);var k=w.nextPacket();if(l(1)){for(var S,C=k.layerNumber,x=[],_=0,A=k.codeblocks.length;_<A;_++){var P=(S=k.codeblocks[_]).precinct,I=S.cbx-P.cbxMin,O=S.cby-P.cbyMin,T=!1,E=!1;if(void 0!==S.included)T=!!l(1);else{var F,R;if(void 0!==(P=S.precinct).inclusionTree)F=P.inclusionTree;else{var B=P.cbxMax-P.cbxMin+1,D=P.cbyMax-P.cbyMin+1;F=new y(B,D,C);R=new b(B,D);P.inclusionTree=F;P.zeroBitPlanesTree=R}if(F.reset(I,O,C))for(;;){if(!l(1)){F.incrementValue(C);break}if(!F.nextLevel()){S.included=!0;T=E=!0;break}}}if(T){if(E){(R=P.zeroBitPlanesTree).reset(I,O);for(;;)if(l(1)){if(!R.nextLevel())break}else R.incrementValue();S.zeroBitPlanes=R.value}for(var M=d();l(1);)S.Lblock++;var L=(0,a.log2)(M),N=l((M<1<<L?L-1:L)+S.Lblock);x.push({codeblock:S,codingpasses:M,dataLength:N})}}f();v&&u(146);for(;x.length>0;){var U=x.shift();void 0===(S=U.codeblock).data&&(S.data=[]);S.data.push({data:t,start:r+o,end:r+o+U.dataLength,codingpasses:U.codingpasses});o+=U.dataLength}}}return o}function m(e,t,r,a,n,o,s,c){for(var l=a.tbx0,u=a.tby0,h=a.tbx1-a.tbx0,f=a.codeblocks,d="H"===a.type.charAt(0)?1:0,g="H"===a.type.charAt(1)?t:0,m=0,p=f.length;m<p;++m){var v=f[m],b=v.tbx1_-v.tbx0_,y=v.tby1_-v.tby0_;if(0!==b&&0!==y&&void 0!==v.data){var k,S;k=new w(b,y,v.subbandType,v.zeroBitPlanes,o);S=2;var C,x,_,A=v.data,P=0,I=0;for(C=0,x=A.length;C<x;C++){P+=(_=A[C]).end-_.start;I+=_.codingpasses}var O=new Uint8Array(P),T=0;for(C=0,x=A.length;C<x;C++){var E=(_=A[C]).data.subarray(_.start,_.end);O.set(E,T);T+=E.length}var F=new i.ArithmeticDecoder(O,0,P);k.setDecoder(F);for(C=0;C<I;C++){switch(S){case 0:k.runSignificancePropagationPass();break;case 1:k.runMagnitudeRefinementPass();break;case 2:k.runCleanupPass();c&&k.checkSegmentationSymbol()}S=(S+1)%3}var R,B,D,M=v.tbx0_-l+(v.tby0_-u)*h,L=k.coefficentsSign,N=k.coefficentsMagnitude,U=k.bitsDecoded,q=s?0:.5;T=0;var j="LL"!==a.type;for(C=0;C<y;C++){var z=2*(M/h|0)*(t-h)+d+g;for(R=0;R<b;R++){if(0!==(B=N[T])){B=(B+q)*n;0!==L[T]&&(B=-B);D=U[T];var H=j?z+(M<<1):M;e[H]=s&&D>=o?B:B*(1<<o-D)}M++;T++}M+=h-b}}}}function p(t,r,a){for(var i=r.components[a],n=i.codingStyleParameters,o=i.quantizationParameters,s=n.decompositionLevelsCount,c=o.SPqcds,l=o.scalarExpounded,u=o.guardBits,h=n.segmentationSymbolUsed,f=t.components[a].precision,d=n.reversibleTransformation,g=d?new C:new S,p=[],v=0,b=0;b<=s;b++){for(var y=i.resolutions[b],w=y.trx1-y.trx0,k=y.try1-y.try0,x=new Float32Array(w*k),_=0,A=y.subbands.length;_<A;_++){var P,I;if(l){P=c[v].mu;I=c[v].epsilon;v++}else{P=c[0].mu;I=c[0].epsilon+(b>0?1-b:0)}var O=y.subbands[_],T=e[O.type];m(x,w,0,O,d?1:Math.pow(2,f+T-I)*(1+P/2048),u+I-1,d,h)}p.push({width:w,height:k,items:x})}var E=g.calculate(p,i.tcx0,i.tcy0);return{left:i.tcx0,top:i.tcy0,width:E.width,height:E.height,items:E.items}}function v(e,t){for(var r=e.SIZ.Csiz,a=e.tiles[t],i=0;i<r;i++){var n=a.components[i],o=void 0!==e.currentTile.QCC[i]?e.currentTile.QCC[i]:e.currentTile.QCD;n.quantizationParameters=o;var s=void 0!==e.currentTile.COC[i]?e.currentTile.COC[i]:e.currentTile.COD;n.codingStyleParameters=s}a.codingStyleDefaultParameters=e.currentTile.COD}var b=function(){function e(e,t){var r=(0,a.log2)(Math.max(e,t))+1;this.levels=[];for(var i=0;i<r;i++){var n={width:e,height:t,items:[]};this.levels.push(n);e=Math.ceil(e/2);t=Math.ceil(t/2)}}e.prototype={reset:function(e,t){for(var r,a=0,i=0;a<this.levels.length;){var n=e+t*(r=this.levels[a]).width;if(void 0!==r.items[n]){i=r.items[n];break}r.index=n;e>>=1;t>>=1;a++}a--;(r=this.levels[a]).items[r.index]=i;this.currentLevel=a;delete this.value},incrementValue:function(){var e=this.levels[this.currentLevel];e.items[e.index]++},nextLevel:function(){var e=this.currentLevel,t=this.levels[e],r=t.items[t.index];if(--e<0){this.value=r;return!1}this.currentLevel=e;(t=this.levels[e]).items[t.index]=r;return!0}};return e}(),y=function(){function e(e,t,r){var i=(0,a.log2)(Math.max(e,t))+1;this.levels=[];for(var n=0;n<i;n++){for(var o=new Uint8Array(e*t),s=0,c=o.length;s<c;s++)o[s]=r;var l={width:e,height:t,items:o};this.levels.push(l);e=Math.ceil(e/2);t=Math.ceil(t/2)}}e.prototype={reset:function(e,t,r){for(var a=0;a<this.levels.length;){var i=this.levels[a],n=e+t*i.width;i.index=n;var o=i.items[n];if(255===o)break;if(o>r){this.currentLevel=a;this.propagateValues();return!1}e>>=1;t>>=1;a++}this.currentLevel=a-1;return!0},incrementValue:function(e){var t=this.levels[this.currentLevel];t.items[t.index]=e+1;this.propagateValues()},propagateValues:function(){for(var e=this.currentLevel,t=this.levels[e],r=t.items[t.index];--e>=0;)(t=this.levels[e]).items[t.index]=r},nextLevel:function(){var e=this.currentLevel,t=this.levels[e],r=t.items[t.index];t.items[t.index]=255;if(--e<0)return!1;this.currentLevel=e;(t=this.levels[e]).items[t.index]=r;return!0}};return e}(),w=function(){var e=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]),t=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]),r=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]);function a(a,i,n,o,s){this.width=a;this.height=i;this.contextLabelTable="HH"===n?r:"HL"===n?t:e;var c=a*i;this.neighborsSignificance=new Uint8Array(c);this.coefficentsSign=new Uint8Array(c);this.coefficentsMagnitude=s>14?new Uint32Array(c):s>6?new Uint16Array(c):new Uint8Array(c);this.processingFlags=new Uint8Array(c);var l=new Uint8Array(c);if(0!==o)for(var u=0;u<c;u++)l[u]=o;this.bitsDecoded=l;this.reset()}a.prototype={setDecoder:function(e){this.decoder=e},reset:function(){this.contexts=new Int8Array(19);this.contexts[0]=8;this.contexts[17]=92;this.contexts[18]=6},setNeighborsSignificance:function(e,t,r){var a,i=this.neighborsSignificance,n=this.width,o=this.height,s=t>0,c=t+1<n;if(e>0){a=r-n;s&&(i[a-1]+=16);c&&(i[a+1]+=16);i[a]+=4}if(e+1<o){a=r+n;s&&(i[a-1]+=16);c&&(i[a+1]+=16);i[a]+=4}s&&(i[r-1]+=1);c&&(i[r+1]+=1);i[r]|=128},runSignificancePropagationPass:function(){for(var e=this.decoder,t=this.width,r=this.height,a=this.coefficentsMagnitude,i=this.coefficentsSign,n=this.neighborsSignificance,o=this.processingFlags,s=this.contexts,c=this.contextLabelTable,l=this.bitsDecoded,u=0;u<r;u+=4)for(var h=0;h<t;h++)for(var f=u*t+h,d=0;d<4;d++,f+=t){var g=u+d;if(g>=r)break;o[f]&=-2;if(!a[f]&&n[f]){var m=c[n[f]];if(e.readBit(s,m)){var p=this.decodeSignBit(g,h,f);i[f]=p;a[f]=1;this.setNeighborsSignificance(g,h,f);o[f]|=2}l[f]++;o[f]|=1}}},decodeSignBit:function(e,t,r){var a,i,n,o,s,c,l=this.width,u=this.height,h=this.coefficentsMagnitude,f=this.coefficentsSign;o=t>0&&0!==h[r-1];if(t+1<l&&0!==h[r+1]){n=f[r+1];a=o?1-n-(i=f[r-1]):1-n-n}else a=o?1-(i=f[r-1])-i:0;var d=3*a;o=e>0&&0!==h[r-l];if(e+1<u&&0!==h[r+l]){n=f[r+l];a=o?1-n-(i=f[r-l])+d:1-n-n+d}else a=o?1-(i=f[r-l])-i+d:d;if(a>=0){s=9+a;c=this.decoder.readBit(this.contexts,s)}else{s=9-a;c=1^this.decoder.readBit(this.contexts,s)}return c},runMagnitudeRefinementPass:function(){for(var e,t=this.decoder,r=this.width,a=this.height,i=this.coefficentsMagnitude,n=this.neighborsSignificance,o=this.contexts,s=this.bitsDecoded,c=this.processingFlags,l=r*a,u=4*r,h=0;h<l;h=e){e=Math.min(l,h+u);for(var f=0;f<r;f++)for(var d=h+f;d<e;d+=r)if(i[d]&&0==(1&c[d])){var g=16;if(0!=(2&c[d])){c[d]^=2;g=0===(127&n[d])?15:14}var m=t.readBit(o,g);i[d]=i[d]<<1|m;s[d]++;c[d]|=1}}},runCleanupPass:function(){for(var e,t=this.decoder,r=this.width,a=this.height,i=this.neighborsSignificance,n=this.coefficentsMagnitude,o=this.coefficentsSign,s=this.contexts,c=this.contextLabelTable,l=this.bitsDecoded,u=this.processingFlags,h=r,f=2*r,d=3*r,g=0;g<a;g=e){e=Math.min(g+4,a);for(var m=g*r,p=g+3<a,v=0;v<r;v++){var b,y=m+v,w=0,k=y,S=g;if(p&&0===u[y]&&0===u[y+h]&&0===u[y+f]&&0===u[y+d]&&0===i[y]&&0===i[y+h]&&0===i[y+f]&&0===i[y+d]){if(!t.readBit(s,18)){l[y]++;l[y+h]++;l[y+f]++;l[y+d]++;continue}if(0!==(w=t.readBit(s,17)<<1|t.readBit(s,17))){S=g+w;k+=w*r}b=this.decodeSignBit(S,v,k);o[k]=b;n[k]=1;this.setNeighborsSignificance(S,v,k);u[k]|=2;k=y;for(var C=g;C<=S;C++,k+=r)l[k]++;w++}for(S=g+w;S<e;S++,k+=r)if(!n[k]&&0==(1&u[k])){var x=c[i[k]];if(1===t.readBit(s,x)){b=this.decodeSignBit(S,v,k);o[k]=b;n[k]=1;this.setNeighborsSignificance(S,v,k);u[k]|=2}l[k]++}}}},checkSegmentationSymbol:function(){var e=this.decoder,t=this.contexts;if(10!==(e.readBit(t,17)<<3|e.readBit(t,17)<<2|e.readBit(t,17)<<1|e.readBit(t,17)))throw new n("Invalid segmentation symbol")}};return a}(),k=function(){function e(){}e.prototype.calculate=function(e,t,r){for(var a=e[0],i=1,n=e.length;i<n;i++)a=this.iterate(a,e[i],t,r);return a};e.prototype.extend=function(e,t,r){var a=t-1,i=t+1,n=t+r-2,o=t+r;e[a--]=e[i++];e[o++]=e[n--];e[a--]=e[i++];e[o++]=e[n--];e[a--]=e[i++];e[o++]=e[n--];e[a]=e[i];e[o]=e[n]};e.prototype.iterate=function(e,t,r,a){var i,n,o,s,c,l,u=e.width,h=e.height,f=e.items,d=t.width,g=t.height,m=t.items;for(o=0,i=0;i<h;i++){s=2*i*d;for(n=0;n<u;n++,o++,s+=2)m[s]=f[o]}f=e.items=null;var p=new Float32Array(d+8);if(1===d){if(0!=(1&r))for(l=0,o=0;l<g;l++,o+=d)m[o]*=.5}else for(l=0,o=0;l<g;l++,o+=d){p.set(m.subarray(o,o+d),4);this.extend(p,4,d);this.filter(p,4,d);m.set(p.subarray(4,4+d),o)}var v=16,b=[];for(i=0;i<v;i++)b.push(new Float32Array(g+8));var y,w=0;e=4+g;if(1===g){if(0!=(1&a))for(c=0;c<d;c++)m[c]*=.5}else for(c=0;c<d;c++){if(0===w){v=Math.min(d-c,v);for(o=c,s=4;s<e;o+=d,s++)for(y=0;y<v;y++)b[y][s]=m[o+y];w=v}var k=b[--w];this.extend(k,4,g);this.filter(k,4,g);if(0===w){o=c-v+1;for(s=4;s<e;o+=d,s++)for(y=0;y<v;y++)m[o+y]=b[y][s]}}return{width:d,height:g,items:m}};return e}(),S=function(){function e(){k.call(this)}e.prototype=Object.create(k.prototype);e.prototype.filter=function(e,t,r){var a,i,n,o,s=r>>1,c=-1.586134342059924,l=-.052980118572961,u=.882911075530934,h=.443506852043971,f=1.230174104914001;a=(t|=0)-3;for(i=s+4;i--;a+=2)e[a]*=.8128930661159609;n=h*e[(a=t-2)-1];for(i=s+3;i--;a+=2){o=h*e[a+1];e[a]=f*e[a]-n-o;if(!i--)break;n=h*e[(a+=2)+1];e[a]=f*e[a]-n-o}n=u*e[(a=t-1)-1];for(i=s+2;i--;a+=2){o=u*e[a+1];e[a]-=n+o;if(!i--)break;n=u*e[(a+=2)+1];e[a]-=n+o}n=l*e[(a=t)-1];for(i=s+1;i--;a+=2){o=l*e[a+1];e[a]-=n+o;if(!i--)break;n=l*e[(a+=2)+1];e[a]-=n+o}if(0!==s){n=c*e[(a=t+1)-1];for(i=s;i--;a+=2){o=c*e[a+1];e[a]-=n+o;if(!i--)break;n=c*e[(a+=2)+1];e[a]-=n+o}}};return e}(),C=function(){function e(){k.call(this)}e.prototype=Object.create(k.prototype);e.prototype.filter=function(e,t,r){var a,i,n=r>>1;for(a=t|=0,i=n+1;i--;a+=2)e[a]-=e[a-1]+e[a+1]+2>>2;for(a=t+1,i=n;i--;a+=2)e[a]+=e[a-1]+e[a+1]>>1};return e}();return t}();t.JpxImage=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.calculateSHA512=t.calculateSHA384=t.calculateSHA256=t.calculateMD5=t.PDF20=t.PDF17=t.CipherTransformFactory=t.ARCFourCipher=t.AES256Cipher=t.AES128Cipher=void 0;var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),i=r(2),n=r(138),o=r(140);function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var u=function(){function e(e){this.a=0;this.b=0;var t,r,a=new Uint8Array(256),i=0,n=e.length;for(t=0;t<256;++t)a[t]=t;for(t=0;t<256;++t){i=i+(r=a[t])+e[t%n]&255;a[t]=a[i];a[i]=r}this.s=a}e.prototype={encryptBlock:function(e){var t,r,a,i=e.length,n=this.a,o=this.b,s=this.s,c=new Uint8Array(i);for(t=0;t<i;++t){a=s[o=o+(r=s[n=n+1&255])&255];s[n]=a;s[o]=r;c[t]=e[t]^s[r+a&255]}this.a=n;this.b=o;return c}};e.prototype.decryptBlock=e.prototype.encryptBlock;return e}(),h=function(){var e=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]),t=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]);return function(r,a,i){var n,o,s,c=1732584193,l=-271733879,u=-1732584194,h=271733878,f=i+72&-64,d=new Uint8Array(f);for(n=0;n<i;++n)d[n]=r[a++];d[n++]=128;s=f-8;for(;n<s;)d[n++]=0;d[n++]=i<<3&255;d[n++]=i>>5&255;d[n++]=i>>13&255;d[n++]=i>>21&255;d[n++]=i>>>29&255;d[n++]=0;d[n++]=0;d[n++]=0;var g=new Int32Array(16);for(n=0;n<f;){for(o=0;o<16;++o,n+=4)g[o]=d[n]|d[n+1]<<8|d[n+2]<<16|d[n+3]<<24;var m,p,v=c,b=l,y=u,w=h;for(o=0;o<64;++o){if(o<16){m=b&y|~b&w;p=o}else if(o<32){m=w&b|~w&y;p=5*o+1&15}else if(o<48){m=b^y^w;p=3*o+5&15}else{m=y^(b|~w);p=7*o&15}var k=w,S=v+m+t[o]+g[p]|0,C=e[o];w=y;y=b;b=b+(S<<C|S>>>32-C)|0;v=k}c=c+v|0;l=l+b|0;u=u+y|0;h=h+w|0}return new Uint8Array([255&c,c>>8&255,c>>16&255,c>>>24&255,255&l,l>>8&255,l>>16&255,l>>>24&255,255&u,u>>8&255,u>>16&255,u>>>24&255,255&h,h>>8&255,h>>16&255,h>>>24&255])}}(),f=function(){function e(e,t){this.high=0|e;this.low=0|t}e.prototype={and:function(e){this.high&=e.high;this.low&=e.low},xor:function(e){this.high^=e.high;this.low^=e.low},or:function(e){this.high|=e.high;this.low|=e.low},shiftRight:function(e){if(e>=32){this.low=this.high>>>e-32|0;this.high=0}else{this.low=this.low>>>e|this.high<<32-e;this.high=this.high>>>e|0}},shiftLeft:function(e){if(e>=32){this.high=this.low<<e-32;this.low=0}else{this.high=this.high<<e|this.low>>>32-e;this.low=this.low<<e}},rotateRight:function(e){var t,r;if(32&e){r=this.low;t=this.high}else{t=this.low;r=this.high}e&=31;this.low=t>>>e|r<<32-e;this.high=r>>>e|t<<32-e},not:function(){this.high=~this.high;this.low=~this.low},add:function(e){var t=(this.low>>>0)+(e.low>>>0),r=(this.high>>>0)+(e.high>>>0);t>4294967295&&(r+=1);this.low=0|t;this.high=0|r},copyTo:function(e,t){e[t]=this.high>>>24&255;e[t+1]=this.high>>16&255;e[t+2]=this.high>>8&255;e[t+3]=255&this.high;e[t+4]=this.low>>>24&255;e[t+5]=this.low>>16&255;e[t+6]=this.low>>8&255;e[t+7]=255&this.low},assign:function(e){this.high=e.high;this.low=e.low}};return e}(),d=function(){function e(e,t){return e>>>t|e<<32-t}function t(e,t,r){return e&t^~e&r}function r(e,t,r){return e&t^e&r^t&r}function a(t){return e(t,2)^e(t,13)^e(t,22)}function i(t){return e(t,6)^e(t,11)^e(t,25)}function n(t){return e(t,7)^e(t,18)^t>>>3}var o=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];return function(s,c,l){var u,h,f,d=1779033703,g=3144134277,m=1013904242,p=2773480762,v=1359893119,b=2600822924,y=528734635,w=1541459225,k=64*Math.ceil((l+9)/64),S=new Uint8Array(k);for(u=0;u<l;++u)S[u]=s[c++];S[u++]=128;f=k-8;for(;u<f;)S[u++]=0;S[u++]=0;S[u++]=0;S[u++]=0;S[u++]=l>>>29&255;S[u++]=l>>21&255;S[u++]=l>>13&255;S[u++]=l>>5&255;S[u++]=l<<3&255;var C,x=new Uint32Array(64);for(u=0;u<k;){for(h=0;h<16;++h){x[h]=S[u]<<24|S[u+1]<<16|S[u+2]<<8|S[u+3];u+=4}for(h=16;h<64;++h)x[h]=(e(C=x[h-2],17)^e(C,19)^C>>>10)+x[h-7]+n(x[h-15])+x[h-16]|0;var _,A,P=d,I=g,O=m,T=p,E=v,F=b,R=y,B=w;for(h=0;h<64;++h){_=B+i(E)+t(E,F,R)+o[h]+x[h];A=a(P)+r(P,I,O);B=R;R=F;F=E;E=T+_|0;T=O;O=I;I=P;P=_+A|0}d=d+P|0;g=g+I|0;m=m+O|0;p=p+T|0;v=v+E|0;b=b+F|0;y=y+R|0;w=w+B|0}return new Uint8Array([d>>24&255,d>>16&255,d>>8&255,255&d,g>>24&255,g>>16&255,g>>8&255,255&g,m>>24&255,m>>16&255,m>>8&255,255&m,p>>24&255,p>>16&255,p>>8&255,255&p,v>>24&255,v>>16&255,v>>8&255,255&v,b>>24&255,b>>16&255,b>>8&255,255&b,y>>24&255,y>>16&255,y>>8&255,255&y,w>>24&255,w>>16&255,w>>8&255,255&w])}}(),g=function(){function e(e,t,r,a,i){e.assign(t);e.and(r);i.assign(t);i.not();i.and(a);e.xor(i)}function t(e,t,r,a,i){e.assign(t);e.and(r);i.assign(t);i.and(a);e.xor(i);i.assign(r);i.and(a);e.xor(i)}function r(e,t,r){e.assign(t);e.rotateRight(28);r.assign(t);r.rotateRight(34);e.xor(r);r.assign(t);r.rotateRight(39);e.xor(r)}function a(e,t,r){e.assign(t);e.rotateRight(14);r.assign(t);r.rotateRight(18);e.xor(r);r.assign(t);r.rotateRight(41);e.xor(r)}function i(e,t,r){e.assign(t);e.rotateRight(1);r.assign(t);r.rotateRight(8);e.xor(r);r.assign(t);r.shiftRight(7);e.xor(r)}function n(e,t,r){e.assign(t);e.rotateRight(19);r.assign(t);r.rotateRight(61);e.xor(r);r.assign(t);r.shiftRight(6);e.xor(r)}var o=[new f(1116352408,3609767458),new f(1899447441,602891725),new f(3049323471,3964484399),new f(3921009573,2173295548),new f(961987163,4081628472),new f(1508970993,3053834265),new f(2453635748,2937671579),new f(2870763221,3664609560),new f(3624381080,2734883394),new f(310598401,1164996542),new f(607225278,1323610764),new f(1426881987,3590304994),new f(1925078388,4068182383),new f(2162078206,991336113),new f(2614888103,633803317),new f(3248222580,3479774868),new f(3835390401,2666613458),new f(4022224774,944711139),new f(264347078,2341262773),new f(604807628,2007800933),new f(770255983,1495990901),new f(1249150122,1856431235),new f(1555081692,3175218132),new f(1996064986,2198950837),new f(2554220882,3999719339),new f(2821834349,766784016),new f(2952996808,2566594879),new f(3210313671,3203337956),new f(3336571891,1034457026),new f(3584528711,2466948901),new f(113926993,3758326383),new f(338241895,168717936),new f(666307205,1188179964),new f(773529912,1546045734),new f(1294757372,1522805485),new f(1396182291,2643833823),new f(1695183700,2343527390),new f(1986661051,1014477480),new f(2177026350,1206759142),new f(2456956037,344077627),new f(2730485921,1290863460),new f(2820302411,3158454273),new f(3259730800,3505952657),new f(3345764771,106217008),new f(3516065817,3606008344),new f(3600352804,1432725776),new f(4094571909,1467031594),new f(275423344,851169720),new f(430227734,3100823752),new f(506948616,1363258195),new f(659060556,3750685593),new f(883997877,3785050280),new f(958139571,3318307427),new f(1322822218,3812723403),new f(1537002063,2003034995),new f(1747873779,3602036899),new f(1955562222,1575990012),new f(2024104815,1125592928),new f(2227730452,2716904306),new f(2361852424,442776044),new f(2428436474,593698344),new f(2756734187,3733110249),new f(3204031479,2999351573),new f(3329325298,3815920427),new f(3391569614,3928383900),new f(3515267271,566280711),new f(3940187606,3454069534),new f(4118630271,4000239992),new f(116418474,1914138554),new f(174292421,2731055270),new f(289380356,3203993006),new f(460393269,320620315),new f(685471733,587496836),new f(852142971,1086792851),new f(1017036298,365543100),new f(1126000580,2618297676),new f(1288033470,3409855158),new f(1501505948,4234509866),new f(1607167915,987167468),new f(1816402316,1246189591)];return function(s,c,l,u){var h,d,g,m,p,v,b,y;if(u=!!u){h=new f(3418070365,3238371032);d=new f(1654270250,914150663);g=new f(2438529370,812702999);m=new f(355462360,4144912697);p=new f(1731405415,4290775857);v=new f(2394180231,1750603025);b=new f(3675008525,1694076839);y=new f(1203062813,3204075428)}else{h=new f(1779033703,4089235720);d=new f(3144134277,2227873595);g=new f(1013904242,4271175723);m=new f(2773480762,1595750129);p=new f(1359893119,2917565137);v=new f(2600822924,725511199);b=new f(528734635,4215389547);y=new f(1541459225,327033209)}var w,k,S,C=128*Math.ceil((l+17)/128),x=new Uint8Array(C);for(w=0;w<l;++w)x[w]=s[c++];x[w++]=128;S=C-16;for(;w<S;)x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=0;x[w++]=l>>>29&255;x[w++]=l>>21&255;x[w++]=l>>13&255;x[w++]=l>>5&255;x[w++]=l<<3&255;var _=new Array(80);for(w=0;w<80;w++)_[w]=new f(0,0);var A,P,I=new f(0,0),O=new f(0,0),T=new f(0,0),E=new f(0,0),F=new f(0,0),R=new f(0,0),B=new f(0,0),D=new f(0,0),M=new f(0,0),L=new f(0,0),N=new f(0,0),U=new f(0,0);for(w=0;w<C;){for(k=0;k<16;++k){_[k].high=x[w]<<24|x[w+1]<<16|x[w+2]<<8|x[w+3];_[k].low=x[w+4]<<24|x[w+5]<<16|x[w+6]<<8|x[w+7];w+=8}for(k=16;k<80;++k){n(A=_[k],_[k-2],U);A.add(_[k-7]);i(N,_[k-15],U);A.add(N);A.add(_[k-16])}I.assign(h);O.assign(d);T.assign(g);E.assign(m);F.assign(p);R.assign(v);B.assign(b);D.assign(y);for(k=0;k<80;++k){M.assign(D);a(N,F,U);M.add(N);e(N,F,R,B,U);M.add(N);M.add(o[k]);M.add(_[k]);r(L,I,U);t(N,I,O,T,U);L.add(N);A=D;D=B;B=R;R=F;E.add(M);F=E;E=T;T=O;O=I;A.assign(M);A.add(L);I=A}h.add(I);d.add(O);g.add(T);m.add(E);p.add(F);v.add(R);b.add(B);y.add(D)}if(u){P=new Uint8Array(48);h.copyTo(P,0);d.copyTo(P,8);g.copyTo(P,16);m.copyTo(P,24);p.copyTo(P,32);v.copyTo(P,40)}else{P=new Uint8Array(64);h.copyTo(P,0);d.copyTo(P,8);g.copyTo(P,16);m.copyTo(P,24);p.copyTo(P,32);v.copyTo(P,40);b.copyTo(P,48);y.copyTo(P,56)}return P}}(),m=function(){return function(e,t,r){return g(e,t,r,!0)}}(),p=function(){function e(){}e.prototype={decryptBlock:function(e){return e}};return e}(),v=function(){function e(){l(this,e);this.constructor===e&&(0,i.unreachable)("Cannot initialize AESBaseCipher.");this._s=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]);this._inv_s=new Uint8Array([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125]);this._mix=new Uint32Array([0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795]);this._mixCol=new Uint8Array(256);for(var t=0;t<256;t++)this._mixCol[t]=t<128?t<<1:t<<1^27;this.buffer=new Uint8Array(16);this.bufferPosition=0}a(e,[{key:"_expandKey",value:function(e){(0,i.unreachable)("Cannot call `_expandKey` on the base class")}},{key:"_decrypt",value:function(e,t){var r=void 0,a=void 0,i=void 0,n=new Uint8Array(16);n.set(e);for(var o=0,s=this._keySize;o<16;++o,++s)n[o]^=t[s];for(var c=this._cyclesOfRepetition-1;c>=1;--c){r=n[13];n[13]=n[9];n[9]=n[5];n[5]=n[1];n[1]=r;r=n[14];a=n[10];n[14]=n[6];n[10]=n[2];n[6]=r;n[2]=a;r=n[15];a=n[11];i=n[7];n[15]=n[3];n[11]=r;n[7]=a;n[3]=i;for(var l=0;l<16;++l)n[l]=this._inv_s[n[l]];for(var u=0,h=16*c;u<16;++u,++h)n[u]^=t[h];for(var f=0;f<16;f+=4){var d=this._mix[n[f]],g=this._mix[n[f+1]],m=this._mix[n[f+2]],p=this._mix[n[f+3]];r=d^g>>>8^g<<24^m>>>16^m<<16^p>>>24^p<<8;n[f]=r>>>24&255;n[f+1]=r>>16&255;n[f+2]=r>>8&255;n[f+3]=255&r}}r=n[13];n[13]=n[9];n[9]=n[5];n[5]=n[1];n[1]=r;r=n[14];a=n[10];n[14]=n[6];n[10]=n[2];n[6]=r;n[2]=a;r=n[15];a=n[11];i=n[7];n[15]=n[3];n[11]=r;n[7]=a;n[3]=i;for(var v=0;v<16;++v){n[v]=this._inv_s[n[v]];n[v]^=t[v]}return n}},{key:"_encrypt",value:function(e,t){var r=this._s,a=void 0,i=void 0,n=void 0,o=new Uint8Array(16);o.set(e);for(var s=0;s<16;++s)o[s]^=t[s];for(var c=1;c<this._cyclesOfRepetition;c++){for(var l=0;l<16;++l)o[l]=r[o[l]];n=o[1];o[1]=o[5];o[5]=o[9];o[9]=o[13];o[13]=n;n=o[2];i=o[6];o[2]=o[10];o[6]=o[14];o[10]=n;o[14]=i;n=o[3];i=o[7];a=o[11];o[3]=o[15];o[7]=n;o[11]=i;o[15]=a;for(var u=0;u<16;u+=4){var h=o[u+0],f=o[u+1],d=o[u+2],g=o[u+3];a=h^f^d^g;o[u+0]^=a^this._mixCol[h^f];o[u+1]^=a^this._mixCol[f^d];o[u+2]^=a^this._mixCol[d^g];o[u+3]^=a^this._mixCol[g^h]}for(var m=0,p=16*c;m<16;++m,++p)o[m]^=t[p]}for(var v=0;v<16;++v)o[v]=r[o[v]];n=o[1];o[1]=o[5];o[5]=o[9];o[9]=o[13];o[13]=n;n=o[2];i=o[6];o[2]=o[10];o[6]=o[14];o[10]=n;o[14]=i;n=o[3];i=o[7];a=o[11];o[3]=o[15];o[7]=n;o[11]=i;o[15]=a;for(var b=0,y=this._keySize;b<16;++b,++y)o[b]^=t[y];return o}},{key:"_decryptBlock2",value:function(e,t){for(var r=e.length,a=this.buffer,i=this.bufferPosition,n=[],o=this.iv,s=0;s<r;++s){a[i]=e[s];if(!(++i<16)){for(var c=this._decrypt(a,this._key),l=0;l<16;++l)c[l]^=o[l];o=a;n.push(c);a=new Uint8Array(16);i=0}}this.buffer=a;this.bufferLength=i;this.iv=o;if(0===n.length)return new Uint8Array(0);var u=16*n.length;if(t){var h=n[n.length-1],f=h[15];if(f<=16){for(var d=15,g=16-f;d>=g;--d)if(h[d]!==f){f=0;break}u-=f;n[n.length-1]=h.subarray(0,16-f)}}for(var m=new Uint8Array(u),p=0,v=0,b=n.length;p<b;++p,v+=16)m.set(n[p],v);return m}},{key:"decryptBlock",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=e.length,i=this.buffer,n=this.bufferPosition;if(r)this.iv=r;else{for(var o=0;n<16&&o<a;++o,++n)i[n]=e[o];if(n<16){this.bufferLength=n;return new Uint8Array(0)}this.iv=i;e=e.subarray(16)}this.buffer=new Uint8Array(16);this.bufferLength=0;this.decryptBlock=this._decryptBlock2;return this.decryptBlock(e,t)}},{key:"encrypt",value:function(e,t){var r=e.length,a=this.buffer,i=this.bufferPosition,n=[];t||(t=new Uint8Array(16));for(var o=0;o<r;++o){a[i]=e[o];if(!(++i<16)){for(var s=0;s<16;++s)a[s]^=t[s];var c=this._encrypt(a,this._key);t=c;n.push(c);a=new Uint8Array(16);i=0}}this.buffer=a;this.bufferLength=i;this.iv=t;if(0===n.length)return new Uint8Array(0);for(var l=16*n.length,u=new Uint8Array(l),h=0,f=0,d=n.length;h<d;++h,f+=16)u.set(n[h],f);return u}}]);return e}(),b=function(e){c(t,v);function t(e){l(this,t);var r=s(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));r._cyclesOfRepetition=10;r._keySize=160;r._rcon=new Uint8Array([141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141]);r._key=r._expandKey(e);return r}a(t,[{key:"_expandKey",value:function(e){var t=this._s,r=this._rcon,a=new Uint8Array(176);a.set(e);for(var i=16,n=1;i<176;++n){var o=a[i-3],s=a[i-2],c=a[i-1],l=a[i-4];o=t[o];s=t[s];c=t[c];l=t[l];o^=r[n];for(var u=0;u<4;++u){a[i]=o^=a[i-16];a[++i]=s^=a[i-16];a[++i]=c^=a[i-16];a[++i]=l^=a[i-16];i++}}return a}}]);return t}(),y=function(e){c(t,v);function t(e){l(this,t);var r=s(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));r._cyclesOfRepetition=14;r._keySize=224;r._key=r._expandKey(e);return r}a(t,[{key:"_expandKey",value:function(e){var t=this._s,r=new Uint8Array(240);r.set(e);for(var a=1,i=void 0,n=void 0,o=void 0,s=void 0,c=32,l=1;c<240;++l){if(c%32==16){i=t[i];n=t[n];o=t[o];s=t[s]}else if(c%32==0){i=r[c-3];n=r[c-2];o=r[c-1];s=r[c-4];i=t[i];n=t[n];o=t[o];s=t[s];i^=a;(a<<=1)>=256&&(a=255&(27^a))}for(var u=0;u<4;++u){r[c]=i^=r[c-32];r[++c]=n^=r[c-32];r[++c]=o^=r[c-32];r[++c]=s^=r[c-32];c++}}return r}}]);return t}(),w=function(){function e(e,t){if(e.length!==t.length)return!1;for(var r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}function t(){}t.prototype={checkOwnerPassword:function(t,r,a,i){var n=new Uint8Array(t.length+56);n.set(t,0);n.set(r,t.length);n.set(a,t.length+r.length);return e(d(n,0,n.length),i)},checkUserPassword:function(t,r,a){var i=new Uint8Array(t.length+8);i.set(t,0);i.set(r,t.length);return e(d(i,0,i.length),a)},getOwnerKey:function(e,t,r,a){var i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(r,e.length+t.length);var n=d(i,0,i.length);return new y(n).decryptBlock(a,!1,new Uint8Array(16))},getUserKey:function(e,t,r){var a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);var i=d(a,0,a.length);return new y(i).decryptBlock(r,!1,new Uint8Array(16))}};return t}(),k=function(){function e(e,t){var r=new Uint8Array(e.length+t.length);r.set(e,0);r.set(t,e.length);return r}function t(t,r,a){for(var i=d(r,0,r.length).subarray(0,32),n=[0],o=0;o<64||n[n.length-1]>o-32;){var s=t.length+i.length+a.length,c=new Uint8Array(64*s),l=e(t,i);l=e(l,a);for(var u=0,h=0;u<64;u++,h+=s)c.set(l,h);n=new b(i.subarray(0,16)).encrypt(c,i.subarray(16,32));for(var f=0,p=0;p<16;p++){f*=1;f%=3;f+=(n[p]>>>0)%3;f%=3}0===f?i=d(n,0,n.length):1===f?i=m(n,0,n.length):2===f&&(i=g(n,0,n.length));o++}return i.subarray(0,32)}function r(){}function a(e,t){if(e.length!==t.length)return!1;for(var r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}r.prototype={hash:function(e,r,a){return t(e,r,a)},checkOwnerPassword:function(e,r,i,n){var o=new Uint8Array(e.length+56);o.set(e,0);o.set(r,e.length);o.set(i,e.length+r.length);return a(t(e,o,i),n)},checkUserPassword:function(e,r,i){var n=new Uint8Array(e.length+8);n.set(e,0);n.set(r,e.length);return a(t(e,n,[]),i)},getOwnerKey:function(e,r,a,i){var n=new Uint8Array(e.length+56);n.set(e,0);n.set(r,e.length);n.set(a,e.length+r.length);var o=t(e,n,a);return new y(o).decryptBlock(i,!1,new Uint8Array(16))},getUserKey:function(e,r,a){var i=new Uint8Array(e.length+8);i.set(e,0);i.set(r,e.length);var n=t(e,i,[]);return new y(n).decryptBlock(a,!1,new Uint8Array(16))}};return r}(),S=function(){function e(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}e.prototype={createStream:function(e,t){var r=new this.StreamCipherConstructor;return new o.DecryptStream(e,t,function(e,t){return r.decryptBlock(e,t)})},decryptString:function(e){var t=new this.StringCipherConstructor,r=(0,i.stringToBytes)(e);r=t.decryptBlock(r,!0);return(0,i.bytesToString)(r)}};return e}(),C=function(){var e=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]);function t(t,r,a,i,n,o,s,c){var l,f,d=40+a.length+t.length,g=new Uint8Array(d),m=0;if(r){f=Math.min(32,r.length);for(;m<f;++m)g[m]=r[m]}l=0;for(;m<32;)g[m++]=e[l++];for(l=0,f=a.length;l<f;++l)g[m++]=a[l];g[m++]=255&n;g[m++]=n>>8&255;g[m++]=n>>16&255;g[m++]=n>>>24&255;for(l=0,f=t.length;l<f;++l)g[m++]=t[l];if(o>=4&&!c){g[m++]=255;g[m++]=255;g[m++]=255;g[m++]=255}var p=h(g,0,m),v=s>>3;if(o>=3)for(l=0;l<50;++l)p=h(p,0,v);var b,y=p.subarray(0,v);if(o>=3){for(m=0;m<32;++m)g[m]=e[m];for(l=0,f=t.length;l<f;++l)g[m++]=t[l];b=new u(y).encryptBlock(h(g,0,m));f=y.length;var w,k=new Uint8Array(f);for(l=1;l<=19;++l){for(w=0;w<f;++w)k[w]=y[w]^l;b=new u(k).encryptBlock(b)}for(l=0,f=b.length;l<f;++l)if(i[l]!==b[l])return null}else for(l=0,f=(b=new u(y).encryptBlock(e)).length;l<f;++l)if(i[l]!==b[l])return null;return y}var r=n.Name.get("Identity");function a(a,o,s){var c=a.get("Filter");if(!(0,n.isName)(c,"Standard"))throw new i.FormatError("unknown encryption method");this.dict=a;var l=a.get("V");if(!Number.isInteger(l)||1!==l&&2!==l&&4!==l&&5!==l)throw new i.FormatError("unsupported encryption algorithm");this.algorithm=l;var f=a.get("Length");if(!f)if(l<=3)f=40;else{var d=a.get("CF"),g=a.get("StmF");if((0,n.isDict)(d)&&(0,n.isName)(g)){d.suppressEncryption=!0;var m=d.get(g.name);(f=m&&m.get("Length")||128)<40&&(f<<=3)}}if(!Number.isInteger(f)||f<40||f%8!=0)throw new i.FormatError("invalid key length");var p=(0,i.stringToBytes)(a.get("O")).subarray(0,32),v=(0,i.stringToBytes)(a.get("U")).subarray(0,32),b=a.get("P"),y=a.get("R"),S=(4===l||5===l)&&!1!==a.get("EncryptMetadata");this.encryptMetadata=S;var C,x,_=(0,i.stringToBytes)(o);if(s){if(6===y)try{s=(0,i.utf8StringToString)(s)}catch(e){(0,i.warn)("CipherTransformFactory: Unable to convert UTF8 encoded password.")}C=(0,i.stringToBytes)(s)}if(5!==l)x=t(_,C,p,v,b,y,f,S);else{var A=(0,i.stringToBytes)(a.get("O")).subarray(32,40),P=(0,i.stringToBytes)(a.get("O")).subarray(40,48),I=(0,i.stringToBytes)(a.get("U")).subarray(0,48),O=(0,i.stringToBytes)(a.get("U")).subarray(32,40),T=(0,i.stringToBytes)(a.get("U")).subarray(40,48),E=(0,i.stringToBytes)(a.get("OE")),F=(0,i.stringToBytes)(a.get("UE"));(0,i.stringToBytes)(a.get("Perms"));x=function(e,t,r,a,i,n,o,s,c,l,u,h){if(t){var f=Math.min(127,t.length);t=t.subarray(0,f)}else t=[];var d;return(d=6===e?new k:new w).checkUserPassword(t,s,o)?d.getUserKey(t,c,u):t.length&&d.checkOwnerPassword(t,a,n,r)?d.getOwnerKey(t,i,n,l):null}(y,C,p,A,P,I,v,O,T,E,F)}if(!x&&!s)throw new i.PasswordException("No password given",i.PasswordResponses.NEED_PASSWORD);if(!x&&s){x=t(_,function(t,r,a,i){var n,o,s=new Uint8Array(32),c=0;o=Math.min(32,t.length);for(;c<o;++c)s[c]=t[c];n=0;for(;c<32;)s[c++]=e[n++];var l,f=h(s,0,c),d=i>>3;if(a>=3)for(n=0;n<50;++n)f=h(f,0,f.length);if(a>=3){l=r;var g,m=new Uint8Array(d);for(n=19;n>=0;n--){for(g=0;g<d;++g)m[g]=f[g]^n;l=new u(m).encryptBlock(l)}}else l=new u(f.subarray(0,d)).encryptBlock(r);return l}(C,p,y,f),p,v,b,y,f,S)}if(!x)throw new i.PasswordException("Incorrect Password",i.PasswordResponses.INCORRECT_PASSWORD);this.encryptionKey=x;if(l>=4){var R=a.get("CF");(0,n.isDict)(R)&&(R.suppressEncryption=!0);this.cf=R;this.stmf=a.get("StmF")||r;this.strf=a.get("StrF")||r;this.eff=a.get("EFF")||this.stmf}}function o(e,t,r,a){var i,n,o=new Uint8Array(r.length+9);for(i=0,n=r.length;i<n;++i)o[i]=r[i];o[i++]=255&e;o[i++]=e>>8&255;o[i++]=e>>16&255;o[i++]=255&t;o[i++]=t>>8&255;if(a){o[i++]=115;o[i++]=65;o[i++]=108;o[i++]=84}return h(o,0,i).subarray(0,Math.min(r.length+5,16))}function s(e,t,r,a,s){if(!(0,n.isName)(t))throw new i.FormatError("Invalid crypt filter name.");var c,l=e.get(t.name);null!==l&&void 0!==l&&(c=l.get("CFM"));if(!c||"None"===c.name)return function(){return new p};if("V2"===c.name)return function(){return new u(o(r,a,s,!1))};if("AESV2"===c.name)return function(){return new b(o(r,a,s,!0))};if("AESV3"===c.name)return function(){return new y(s)};throw new i.FormatError("Unknown crypto method")}a.prototype={createCipherTransform:function(e,t){if(4===this.algorithm||5===this.algorithm)return new S(s(this.cf,this.stmf,e,t,this.encryptionKey),s(this.cf,this.strf,e,t,this.encryptionKey));var r=o(e,t,this.encryptionKey,!1),a=function(){return new u(r)};return new S(a,a)}};return a}();t.AES128Cipher=b;t.AES256Cipher=y;t.ARCFourCipher=u;t.CipherTransformFactory=C;t.PDF17=w;t.PDF20=k;t.calculateMD5=h;t.calculateSHA256=d;t.calculateSHA384=m;t.calculateSHA512=g},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.ColorSpace=void 0;var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),i=r(2),n=r(138);function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var l=function(){function e(t,r){c(this,e);this.constructor===e&&(0,i.unreachable)("Cannot initialize ColorSpace.");this.name=t;this.numComps=r}a(e,[{key:"getRgb",value:function(e,t){var r=new Uint8ClampedArray(3);this.getRgbItem(e,t,r,0);return r}},{key:"getRgbItem",value:function(e,t,r,a){(0,i.unreachable)("Should not call ColorSpace.getRgbItem")}},{key:"getRgbBuffer",value:function(e,t,r,a,n,o,s){(0,i.unreachable)("Should not call ColorSpace.getRgbBuffer")}},{key:"getOutputLength",value:function(e,t){(0,i.unreachable)("Should not call ColorSpace.getOutputLength")}},{key:"isPassthrough",value:function(e){return!1}},{key:"fillRgb",value:function(e,t,r,a,i,n,o,s,c){var l=t*r,u=null,h=1<<o,f=r!==i||t!==a;if(this.isPassthrough(o))u=s;else if(1===this.numComps&&l>h&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){for(var d=o<=8?new Uint8Array(h):new Uint16Array(h),g=0;g<h;g++)d[g]=g;var m=new Uint8ClampedArray(3*h);this.getRgbBuffer(d,0,h,m,0,o,0);if(f){u=new Uint8Array(3*l);for(var p=0,v=0;v<l;++v){var b=3*s[v];u[p++]=m[b];u[p++]=m[b+1];u[p++]=m[b+2]}}else for(var y=0,w=0;w<l;++w){var k=3*s[w];e[y++]=m[k];e[y++]=m[k+1];e[y++]=m[k+2];y+=c}}else if(f){u=new Uint8ClampedArray(3*l);this.getRgbBuffer(s,0,l,u,0,o,0)}else this.getRgbBuffer(s,0,a*n,e,0,o,c);if(u)if(f)!function(e,t,r,a,i,n,o){o=1!==o?0:o;for(var s=r/i,c=a/n,l=0,u=void 0,h=new Uint16Array(i),f=3*r,d=0;d<i;d++)h[d]=3*Math.floor(d*s);for(var g=0;g<n;g++)for(var m=Math.floor(g*c)*f,p=0;p<i;p++){u=m+h[p];t[l++]=e[u++];t[l++]=e[u++];t[l++]=e[u++];l+=o}}(u,e,t,r,a,i,c);else for(var S=0,C=0,x=0,_=a*n;x<_;x++){e[S++]=u[C++];e[S++]=u[C++];e[S++]=u[C++];S+=c}}},{key:"usesZeroToOneRange",get:function(){return(0,i.shadow)(this,"usesZeroToOneRange",!0)}}],[{key:"parse",value:function(e,t,r,a){var i=this.parseToIR(e,t,r,a);return this.fromIR(i)}},{key:"fromIR",value:function(e){var t=Array.isArray(e)?e[0]:e,r=void 0,a=void 0,n=void 0;switch(t){case"DeviceGrayCS":return this.singletons.gray;case"DeviceRgbCS":return this.singletons.rgb;case"DeviceCmykCS":return this.singletons.cmyk;case"CalGrayCS":r=e[1];a=e[2];n=e[3];return new p(r,a,n);case"CalRGBCS":r=e[1];a=e[2];n=e[3];var o=e[4];return new v(r,a,n,o);case"PatternCS":var s=e[1];s&&(s=this.fromIR(s));return new h(s);case"IndexedCS":var c=e[1],l=e[2],d=e[3];return new f(this.fromIR(c),l,d);case"AlternateCS":var g=e[1],m=e[2],y=e[3];return new u(g,this.fromIR(m),y);case"LabCS":r=e[1];a=e[2];var w=e[3];return new b(r,a,w);default:throw new i.FormatError("Unknown colorspace name: "+t)}}},{key:"parseToIR",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments[3];e=t.fetchIfRef(e);if((0,n.isName)(e))switch(e.name){case"DeviceGray":case"G":return"DeviceGrayCS";case"DeviceRGB":case"RGB":return"DeviceRgbCS";case"DeviceCMYK":case"CMYK":return"DeviceCmykCS";case"Pattern":return["PatternCS",null];default:if((0,n.isDict)(r)){var o=r.get("ColorSpace");if((0,n.isDict)(o)){var s=o.get(e.name);if(s){if((0,n.isName)(s))return this.parseToIR(s,t,r,a);e=s;break}}}throw new i.FormatError("unrecognized colorspace "+e.name)}if(Array.isArray(e)){var c=t.fetchIfRef(e[0]).name,l=void 0,u=void 0,h=void 0;switch(c){case"DeviceGray":case"G":return"DeviceGrayCS";case"DeviceRGB":case"RGB":return"DeviceRgbCS";case"DeviceCMYK":case"CMYK":return"DeviceCmykCS";case"CalGray":return["CalGrayCS",(u=t.fetchIfRef(e[1])).getArray("WhitePoint"),u.getArray("BlackPoint"),u.get("Gamma")];case"CalRGB":return["CalRGBCS",(u=t.fetchIfRef(e[1])).getArray("WhitePoint"),u.getArray("BlackPoint"),u.getArray("Gamma"),u.getArray("Matrix")];case"ICCBased":var f=t.fetchIfRef(e[1]).dict;l=f.get("N");if(h=f.get("Alternate")){var d=this.parseToIR(h,t,r,a);if(this.fromIR(d,a).numComps===l)return d;(0,i.warn)("ICCBased color space: Ignoring incorrect /Alternate entry.")}if(1===l)return"DeviceGrayCS";if(3===l)return"DeviceRgbCS";if(4===l)return"DeviceCmykCS";break;case"Pattern":var g=e[1]||null;g&&(g=this.parseToIR(g,t,r,a));return["PatternCS",g];case"Indexed":case"I":var m=this.parseToIR(e[1],t,r,a),p=t.fetchIfRef(e[2])+1,v=t.fetchIfRef(e[3]);(0,n.isStream)(v)&&(v=v.getBytes());return["IndexedCS",m,p,v];case"Separation":case"DeviceN":var b=t.fetchIfRef(e[1]);return["AlternateCS",l=Array.isArray(b)?b.length:1,h=this.parseToIR(e[2],t,r,a),a.create(t.fetchIfRef(e[3]))];case"Lab":return["LabCS",(u=t.fetchIfRef(e[1])).getArray("WhitePoint"),u.getArray("BlackPoint"),u.getArray("Range")];default:throw new i.FormatError('unimplemented color space object "'+c+'"')}}throw new i.FormatError('unrecognized color space object: "'+e+'"')}},{key:"isDefaultDecode",value:function(e,t){if(!Array.isArray(e))return!0;if(2*t!==e.length){(0,i.warn)("The decode map is not the correct length");return!0}for(var r=0,a=e.length;r<a;r+=2)if(0!==e[r]||1!==e[r+1])return!1;return!0}},{key:"singletons",get:function(){return(0,i.shadow)(this,"singletons",{get gray(){return(0,i.shadow)(this,"gray",new d)},get rgb(){return(0,i.shadow)(this,"rgb",new g)},get cmyk(){return(0,i.shadow)(this,"cmyk",new m)}})}}]);return e}(),u=function(e){s(t,l);function t(e,r,a){c(this,t);var i=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"Alternate",e));i.base=r;i.tintFn=a;i.tmpBuf=new Float32Array(r.numComps);return i}a(t,[{key:"getRgbItem",value:function(e,t,r,a){var i=this.tmpBuf;this.tintFn(e,t,i,0);this.base.getRgbItem(i,0,r,a)}},{key:"getRgbBuffer",value:function(e,t,r,a,i,n,o){var s=this.tintFn,c=this.base,l=1/((1<<n)-1),u=c.numComps,h=c.usesZeroToOneRange,f=(c.isPassthrough(8)||!h)&&0===o,d=f?i:0,g=f?a:new Uint8ClampedArray(u*r),m=this.numComps,p=new Float32Array(m),v=new Float32Array(u),b=void 0,y=void 0;for(b=0;b<r;b++){for(y=0;y<m;y++)p[y]=e[t++]*l;s(p,0,v,0);if(h)for(y=0;y<u;y++)g[d++]=255*v[y];else{c.getRgbItem(v,0,g,d);d+=u}}f||c.getRgbBuffer(g,0,r,a,i,8,o)}},{key:"getOutputLength",value:function(e,t){return this.base.getOutputLength(e*this.base.numComps/this.numComps,t)}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return t}(),h=function(e){s(t,l);function t(e){c(this,t);var r=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"Pattern",null));r.base=e;return r}return t}(),f=function(e){s(t,l);function t(e,r,a){c(this,t);var s=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"Indexed",1));s.base=e;s.highVal=r;var l=e.numComps*r;if((0,n.isStream)(a)){s.lookup=new Uint8Array(l);var u=a.getBytes(l);s.lookup.set(u)}else if((0,i.isString)(a)){s.lookup=new Uint8Array(l);for(var h=0;h<l;++h)s.lookup[h]=a.charCodeAt(h)}else{if(!(a instanceof Uint8Array))throw new i.FormatError("Unrecognized lookup table: "+a);s.lookup=a}return s}a(t,[{key:"getRgbItem",value:function(e,t,r,a){var i=this.base.numComps,n=e[t]*i;this.base.getRgbBuffer(this.lookup,n,1,r,a,8,0)}},{key:"getRgbBuffer",value:function(e,t,r,a,i,n,o){for(var s=this.base,c=s.numComps,l=s.getOutputLength(c,o),u=this.lookup,h=0;h<r;++h){var f=e[t++]*c;s.getRgbBuffer(u,f,1,a,i,8,o);i+=l}}},{key:"getOutputLength",value:function(e,t){return this.base.getOutputLength(e*this.base.numComps,t)}},{key:"isDefaultDecode",value:function(e){return!0}}]);return t}(),d=function(e){s(t,l);function t(){c(this,t);return o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"DeviceGray",1))}a(t,[{key:"getRgbItem",value:function(e,t,r,a){var i=255*e[t];r[a]=r[a+1]=r[a+2]=i}},{key:"getRgbBuffer",value:function(e,t,r,a,i,n,o){for(var s=255/((1<<n)-1),c=t,l=i,u=0;u<r;++u){var h=s*e[c++];a[l++]=h;a[l++]=h;a[l++]=h;l+=o}}},{key:"getOutputLength",value:function(e,t){return e*(3+t)}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return t}(),g=function(e){s(t,l);function t(){c(this,t);return o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"DeviceRGB",3))}a(t,[{key:"getRgbItem",value:function(e,t,r,a){r[a]=255*e[t];r[a+1]=255*e[t+1];r[a+2]=255*e[t+2]}},{key:"getRgbBuffer",value:function(e,t,r,a,i,n,o){if(8!==n||0!==o)for(var s=255/((1<<n)-1),c=t,l=i,u=0;u<r;++u){a[l++]=s*e[c++];a[l++]=s*e[c++];a[l++]=s*e[c++];l+=o}else a.set(e.subarray(t,t+3*r),i)}},{key:"getOutputLength",value:function(e,t){return e*(3+t)/3|0}},{key:"isPassthrough",value:function(e){return 8===e}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return t}(),m=function(){function e(e,t,r,a,i){var n=e[t]*r,o=e[t+1]*r,s=e[t+2]*r,c=e[t+3]*r;a[i]=255+n*(-4.387332384609988*n+54.48615194189176*o+18.82290502165302*s+212.25662451639585*c-285.2331026137004)+o*(1.7149763477362134*o-5.6096736904047315*s+-17.873870861415444*c-5.497006427196366)+s*(-2.5217340131683033*s-21.248923337353073*c+17.5119270841813)+c*(-21.86122147463605*c-189.48180835922747);a[i+1]=255+n*(8.841041422036149*n+60.118027045597366*o+6.871425592049007*s+31.159100130055922*c-79.2970844816548)+o*(-15.310361306967817*o+17.575251261109482*s+131.35250912493976*c-190.9453302588951)+s*(4.444339102852739*s+9.8632861493405*c-24.86741582555878)+c*(-20.737325471181034*c-187.80453709719578);a[i+2]=255+n*(.8842522430003296*n+8.078677503112928*o+30.89978309703729*s-.23883238689178934*c-14.183576799673286)+o*(10.49593273432072*o+63.02378494754052*s+50.606957656360734*c-112.23884253719248)+s*(.03296041114873217*s+115.60384449646641*c-193.58209356861505)+c*(-22.33816807309886*c-180.12613974708367)}return function(t){s(r,l);function r(){c(this,r);return o(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,"DeviceCMYK",4))}a(r,[{key:"getRgbItem",value:function(t,r,a,i){e(t,r,1,a,i)}},{key:"getRgbBuffer",value:function(t,r,a,i,n,o,s){for(var c=1/((1<<o)-1),l=0;l<a;l++){e(t,r,c,i,n);r+=4;n+=3+s}}},{key:"getOutputLength",value:function(e,t){return e/4*(3+t)|0}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return r}()}(),p=function(){function e(e,t,r,a,i,n){var o=t[r]*n,s=Math.pow(o,e.G),c=e.YW*s,l=Math.max(295.8*Math.pow(c,.3333333333333333)-40.8,0);a[i]=l;a[i+1]=l;a[i+2]=l}return function(t){s(r,l);function r(e,t,a){c(this,r);var n=o(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,"CalGray",1));if(!e)throw new i.FormatError("WhitePoint missing - required for color space CalGray");t=t||[0,0,0];a=a||1;n.XW=e[0];n.YW=e[1];n.ZW=e[2];n.XB=t[0];n.YB=t[1];n.ZB=t[2];n.G=a;if(n.XW<0||n.ZW<0||1!==n.YW)throw new i.FormatError("Invalid WhitePoint components for "+n.name+", no fallback available");if(n.XB<0||n.YB<0||n.ZB<0){(0,i.info)("Invalid BlackPoint for "+n.name+", falling back to default.");n.XB=n.YB=n.ZB=0}0===n.XB&&0===n.YB&&0===n.ZB||(0,i.warn)(n.name+", BlackPoint: XB: "+n.XB+", YB: "+n.YB+", ZB: "+n.ZB+", only default values are supported.");if(n.G<1){(0,i.info)("Invalid Gamma: "+n.G+" for "+n.name+", falling back to default.");n.G=1}return n}a(r,[{key:"getRgbItem",value:function(t,r,a,i){e(this,t,r,a,i,1)}},{key:"getRgbBuffer",value:function(t,r,a,i,n,o,s){for(var c=1/((1<<o)-1),l=0;l<a;++l){e(this,t,r,i,n,c);r+=1;n+=3+s}}},{key:"getOutputLength",value:function(e,t){return e*(3+t)}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return r}()}(),v=function(){var e=new Float32Array([.8951,.2664,-.1614,-.7502,1.7135,.0367,.0389,-.0685,1.0296]),t=new Float32Array([.9869929,-.1470543,.1599627,.4323053,.5183603,.0492912,-.0085287,.0400428,.9684867]),r=new Float32Array([3.2404542,-1.5371385,-.4985314,-.969266,1.8760108,.041556,.0556434,-.2040259,1.0572252]),n=new Float32Array([1,1,1]),u=new Float32Array(3),h=new Float32Array(3),f=new Float32Array(3),d=Math.pow(24/116,3)/8;function g(e,t,r){r[0]=e[0]*t[0]+e[1]*t[1]+e[2]*t[2];r[1]=e[3]*t[0]+e[4]*t[1]+e[5]*t[2];r[2]=e[6]*t[0]+e[7]*t[1]+e[8]*t[2]}function m(e){return p(0,1,e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function p(e,t,r){return Math.max(e,Math.min(t,r))}function v(e){return e<0?-v(-e):e>8?Math.pow((e+16)/116,3):e*d}function b(a,i,o,s,c,l){var d=p(0,1,i[o]*l),b=p(0,1,i[o+1]*l),y=p(0,1,i[o+2]*l),w=Math.pow(d,a.GR),k=Math.pow(b,a.GG),S=Math.pow(y,a.GB),C=a.MXA*w+a.MXB*k+a.MXC*S,x=a.MYA*w+a.MYB*k+a.MYC*S,_=a.MZA*w+a.MZB*k+a.MZC*S,A=h;A[0]=C;A[1]=x;A[2]=_;var P=f;!function(r,a,i){if(1!==r[0]||1!==r[2]){var n=i;g(e,a,n);var o=u;!function(e,t,r){r[0]=1*t[0]/e[0];r[1]=1*t[1]/e[1];r[2]=1*t[2]/e[2]}(r,n,o);g(t,o,i)}else{i[0]=a[0];i[1]=a[1];i[2]=a[2]}}(a.whitePoint,A,P);var I=h;!function(e,t,r){if(0!==e[0]||0!==e[1]||0!==e[2]){var a=v(0),i=(1-a)/(1-v(e[0])),n=1-i,o=(1-a)/(1-v(e[1])),s=1-o,c=(1-a)/(1-v(e[2])),l=1-c;r[0]=t[0]*i+n;r[1]=t[1]*o+s;r[2]=t[2]*c+l}else{r[0]=t[0];r[1]=t[1];r[2]=t[2]}}(a.blackPoint,P,I);var O=f;!function(r,a,i){var n=i;g(e,a,n);var o=u;!function(e,t,r){r[0]=.95047*t[0]/e[0];r[1]=1*t[1]/e[1];r[2]=1.08883*t[2]/e[2]}(r,n,o);g(t,o,i)}(n,I,O);var T=h;g(r,O,T);s[c]=255*m(T[0]);s[c+1]=255*m(T[1]);s[c+2]=255*m(T[2])}return function(e){s(t,l);function t(e,r,a,n){c(this,t);var s=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"CalRGB",3));if(!e)throw new i.FormatError("WhitePoint missing - required for color space CalRGB");r=r||new Float32Array(3);a=a||new Float32Array([1,1,1]);n=n||new Float32Array([1,0,0,0,1,0,0,0,1]);var l=e[0],u=e[1],h=e[2];s.whitePoint=e;var f=r[0],d=r[1],g=r[2];s.blackPoint=r;s.GR=a[0];s.GG=a[1];s.GB=a[2];s.MXA=n[0];s.MYA=n[1];s.MZA=n[2];s.MXB=n[3];s.MYB=n[4];s.MZB=n[5];s.MXC=n[6];s.MYC=n[7];s.MZC=n[8];if(l<0||h<0||1!==u)throw new i.FormatError("Invalid WhitePoint components for "+s.name+", no fallback available");if(f<0||d<0||g<0){(0,i.info)("Invalid BlackPoint for "+s.name+" ["+f+", "+d+", "+g+"], falling back to default.");s.blackPoint=new Float32Array(3)}if(s.GR<0||s.GG<0||s.GB<0){(0,i.info)("Invalid Gamma ["+s.GR+", "+s.GG+", "+s.GB+"] for "+s.name+", falling back to default.");s.GR=s.GG=s.GB=1}return s}a(t,[{key:"getRgbItem",value:function(e,t,r,a){b(this,e,t,r,a,1)}},{key:"getRgbBuffer",value:function(e,t,r,a,i,n,o){for(var s=1/((1<<n)-1),c=0;c<r;++c){b(this,e,t,a,i,s);t+=3;i+=3+o}}},{key:"getOutputLength",value:function(e,t){return e*(3+t)/3|0}},{key:"isDefaultDecode",value:function(e){return l.isDefaultDecode(e,this.numComps)}}]);return t}()}(),b=function(){function e(e){return e>=6/29?e*e*e:108/841*(e-4/29)}function t(e,t,r,a){return r+e*(a-r)/t}function r(r,a,i,n,o,s){var c=a[i],l=a[i+1],u=a[i+2];if(!1!==n){c=t(c,n,0,100);l=t(l,n,r.amin,r.amax);u=t(u,n,r.bmin,r.bmax)}var h=(c+16)/116,f=h+(l=l>r.amax?r.amax:l<r.amin?r.amin:l)/500,d=h-(u=u>r.bmax?r.bmax:u<r.bmin?r.bmin:u)/200,g=r.XW*e(f),m=r.YW*e(h),p=r.ZW*e(d),v=void 0,b=void 0,y=void 0;if(r.ZW<1){v=3.1339*g+-1.617*m+-.4906*p;b=-.9785*g+1.916*m+.0333*p;y=.072*g+-.229*m+1.4057*p}else{v=3.2406*g+-1.5372*m+-.4986*p;b=-.9689*g+1.8758*m+.0415*p;y=.0557*g+-.204*m+1.057*p}o[s]=255*Math.sqrt(v);o[s+1]=255*Math.sqrt(b);o[s+2]=255*Math.sqrt(y)}return function(e){s(t,l);function t(e,r,a){c(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,"Lab",3));if(!e)throw new i.FormatError("WhitePoint missing - required for color space Lab");r=r||[0,0,0];a=a||[-100,100,-100,100];n.XW=e[0];n.YW=e[1];n.ZW=e[2];n.amin=a[0];n.amax=a[1];n.bmin=a[2];n.bmax=a[3];n.XB=r[0];n.YB=r[1];n.ZB=r[2];if(n.XW<0||n.ZW<0||1!==n.YW)throw new i.FormatError("Invalid WhitePoint components, no fallback available");if(n.XB<0||n.YB<0||n.ZB<0){(0,i.info)("Invalid BlackPoint, falling back to default");n.XB=n.YB=n.ZB=0}if(n.amin>n.amax||n.bmin>n.bmax){(0,i.info)("Invalid Range, falling back to defaults");n.amin=-100;n.amax=100;n.bmin=-100;n.bmax=100}return n}a(t,[{key:"getRgbItem",value:function(e,t,a,i){r(this,e,t,!1,a,i)}},{key:"getRgbBuffer",value:function(e,t,a,i,n,o,s){for(var c=(1<<o)-1,l=0;l<a;l++){r(this,e,t,c,i,n);t+=3;n+=3+s}}},{key:"getOutputLength",value:function(e,t){return e*(3+t)/3|0}},{key:"isDefaultDecode",value:function(e){return!0}},{key:"usesZeroToOneRange",get:function(){return(0,i.shadow)(this,"usesZeroToOneRange",!1)}}]);return t}()}();t.ColorSpace=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.AnnotationFactory=t.AnnotationBorderStyle=t.Annotation=void 0;var a=function e(t,r,a){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,r);if(void 0===i){var n=Object.getPrototypeOf(t);return null===n?void 0:e(n,r,a)}if("value"in i)return i.value;var o=i.get;return void 0!==o?o.call(a):void 0},i=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),n=r(2),o=r(137),s=r(138),c=r(151),l=r(153),u=r(140);function h(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var g=function(){function e(){d(this,e)}i(e,null,[{key:"create",value:function(e,t,r,a){return r.ensure(this,"_create",[e,t,r,a])}},{key:"_create",value:function(e,t,r,a){var i=e.fetchIfRef(t);if((0,s.isDict)(i)){var o=(0,s.isRef)(t)?t.toString():"annot_"+a.createObjId(),c=i.get("Subtype");c=(0,s.isName)(c)?c.name:null;var l={xref:e,dict:i,ref:(0,s.isRef)(t)?t:null,subtype:c,id:o,pdfManager:r};switch(c){case"Link":return new S(l);case"Text":return new k(l);case"Widget":var u=(0,n.getInheritableProperty)({dict:i,key:"FT"});switch(u=(0,s.isName)(u)?u.name:null){case"Tx":return new b(l);case"Btn":return new y(l);case"Ch":return new w(l)}(0,n.warn)('Unimplemented widget field type "'+u+'", falling back to base field type.');return new v(l);case"Popup":return new C(l);case"Line":return new x(l);case"Square":return new _(l);case"Circle":return new A(l);case"PolyLine":return new P(l);case"Polygon":return new I(l);case"Ink":return new O(l);case"Highlight":return new T(l);case"Underline":return new E(l);case"Squiggly":return new F(l);case"StrikeOut":return new R(l);case"Stamp":return new B(l);case"FileAttachment":return new D(l);default:c?(0,n.warn)('Unimplemented annotation type "'+c+'", falling back to base annotation.'):(0,n.warn)("Annotation is missing the required /Subtype.");return new m(l)}}}}]);return e}();var m=function(){function e(t){d(this,e);var r=t.dict;this.setFlags(r.get("F"));this.setRectangle(r.getArray("Rect"));this.setColor(r.getArray("C"));this.setBorderStyle(r);this.setAppearance(r);this.data={annotationFlags:this.flags,borderStyle:this.borderStyle,color:this.color,hasAppearance:!!this.appearance,id:t.id,rect:this.rectangle,subtype:t.subtype}}i(e,[{key:"_hasFlag",value:function(e,t){return!!(e&t)}},{key:"_isViewable",value:function(e){return!this._hasFlag(e,n.AnnotationFlag.INVISIBLE)&&!this._hasFlag(e,n.AnnotationFlag.HIDDEN)&&!this._hasFlag(e,n.AnnotationFlag.NOVIEW)}},{key:"_isPrintable",value:function(e){return this._hasFlag(e,n.AnnotationFlag.PRINT)&&!this._hasFlag(e,n.AnnotationFlag.INVISIBLE)&&!this._hasFlag(e,n.AnnotationFlag.HIDDEN)}},{key:"setFlags",value:function(e){this.flags=Number.isInteger(e)&&e>0?e:0}},{key:"hasFlag",value:function(e){return this._hasFlag(this.flags,e)}},{key:"setRectangle",value:function(e){Array.isArray(e)&&4===e.length?this.rectangle=n.Util.normalizeRect(e):this.rectangle=[0,0,0,0]}},{key:"setColor",value:function(e){var t=new Uint8ClampedArray(3);if(Array.isArray(e))switch(e.length){case 0:this.color=null;break;case 1:c.ColorSpace.singletons.gray.getRgbItem(e,0,t,0);this.color=t;break;case 3:c.ColorSpace.singletons.rgb.getRgbItem(e,0,t,0);this.color=t;break;case 4:c.ColorSpace.singletons.cmyk.getRgbItem(e,0,t,0);this.color=t;break;default:this.color=t}else this.color=t}},{key:"setBorderStyle",value:function(e){this.borderStyle=new p;if((0,s.isDict)(e))if(e.has("BS")){var t=e.get("BS"),r=t.get("Type");if(!r||(0,s.isName)(r,"Border")){this.borderStyle.setWidth(t.get("W"));this.borderStyle.setStyle(t.get("S"));this.borderStyle.setDashArray(t.getArray("D"))}}else if(e.has("Border")){var a=e.getArray("Border");if(Array.isArray(a)&&a.length>=3){this.borderStyle.setHorizontalCornerRadius(a[0]);this.borderStyle.setVerticalCornerRadius(a[1]);this.borderStyle.setWidth(a[2]);4===a.length&&this.borderStyle.setDashArray(a[3])}}else this.borderStyle.setWidth(0)}},{key:"setAppearance",value:function(e){this.appearance=null;var t=e.get("AP");if((0,s.isDict)(t)){var r=t.get("N");if((0,s.isStream)(r))this.appearance=r;else if((0,s.isDict)(r)){var a=e.get("AS");(0,s.isName)(a)&&r.has(a.name)&&(this.appearance=r.get(a.name))}}}},{key:"_preparePopup",value:function(e){e.has("C")||(this.data.color=null);this.data.hasPopup=e.has("Popup");this.data.title=(0,n.stringToPDFString)(e.get("T")||"");this.data.contents=(0,n.stringToPDFString)(e.get("Contents")||"")}},{key:"loadResources",value:function(e){return this.appearance.dict.getAsync("Resources").then(function(t){if(t){return new o.ObjectLoader(t,e,t.xref).load().then(function(){return t})}})}},{key:"getOperatorList",value:function(e,t,r){var a=this;if(!this.appearance)return Promise.resolve(new l.OperatorList);var i=this.data,o=this.appearance.dict,s=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]),c=o.getArray("BBox")||[0,0,1,1],u=o.getArray("Matrix")||[1,0,0,1,0,0],h=function(e,t,r){var a=n.Util.getAxialAlignedBoundingBox(t,r),i=a[0],o=a[1],s=a[2],c=a[3];if(i===s||o===c)return[1,0,0,1,e[0],e[1]];var l=(e[2]-e[0])/(s-i),u=(e[3]-e[1])/(c-o);return[l,0,0,u,e[0]-i*l,e[1]-o*u]}(i.rect,c,u);return s.then(function(r){var o=new l.OperatorList;o.addOp(n.OPS.beginAnnotation,[i.rect,h,u]);return e.getOperatorList({stream:a.appearance,task:t,resources:r,operatorList:o}).then(function(){o.addOp(n.OPS.endAnnotation,[]);a.appearance.reset();return o})})}},{key:"viewable",get:function(){return 0===this.flags||this._isViewable(this.flags)}},{key:"printable",get:function(){return 0!==this.flags&&this._isPrintable(this.flags)}}]);return e}(),p=function(){function e(){d(this,e);this.width=1;this.style=n.AnnotationBorderStyleType.SOLID;this.dashArray=[3];this.horizontalCornerRadius=0;this.verticalCornerRadius=0}i(e,[{key:"setWidth",value:function(e){Number.isInteger(e)&&(this.width=e)}},{key:"setStyle",value:function(e){if(e)switch(e.name){case"S":this.style=n.AnnotationBorderStyleType.SOLID;break;case"D":this.style=n.AnnotationBorderStyleType.DASHED;break;case"B":this.style=n.AnnotationBorderStyleType.BEVELED;break;case"I":this.style=n.AnnotationBorderStyleType.INSET;break;case"U":this.style=n.AnnotationBorderStyleType.UNDERLINE}}},{key:"setDashArray",value:function(e){if(Array.isArray(e)&&e.length>0){for(var t=!0,r=!0,a=0,i=e.length;a<i;a++){var n=e[a];if(!(+n>=0)){t=!1;break}n>0&&(r=!1)}t&&!r?this.dashArray=e:this.width=0}else e&&(this.width=0)}},{key:"setHorizontalCornerRadius",value:function(e){Number.isInteger(e)&&(this.horizontalCornerRadius=e)}},{key:"setVerticalCornerRadius",value:function(e){Number.isInteger(e)&&(this.verticalCornerRadius=e)}}]);return e}(),v=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),a=e.dict,i=r.data;i.annotationType=n.AnnotationType.WIDGET;i.fieldName=r._constructFieldName(a);i.fieldValue=(0,n.getInheritableProperty)({dict:a,key:"V",getArray:!0});i.alternativeText=(0,n.stringToPDFString)(a.get("TU")||"");i.defaultAppearance=(0,n.getInheritableProperty)({dict:a,key:"DA"})||"";var o=(0,n.getInheritableProperty)({dict:a,key:"FT"});i.fieldType=(0,s.isName)(o)?o.name:null;r.fieldResources=(0,n.getInheritableProperty)({dict:a,key:"DR"})||s.Dict.empty;i.fieldFlags=(0,n.getInheritableProperty)({dict:a,key:"Ff"});(!Number.isInteger(i.fieldFlags)||i.fieldFlags<0)&&(i.fieldFlags=0);i.readOnly=r.hasFieldFlag(n.AnnotationFieldFlag.READONLY);"Sig"===i.fieldType&&r.setFlags(n.AnnotationFlag.HIDDEN);return r}i(t,[{key:"_constructFieldName",value:function(e){if(!e.has("T")&&!e.has("Parent")){(0,n.warn)("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return(0,n.stringToPDFString)(e.get("T"));var t=[];e.has("T")&&t.unshift((0,n.stringToPDFString)(e.get("T")));for(var r=e;r.has("Parent");){r=r.get("Parent");if(!(0,s.isDict)(r))break;r.has("T")&&t.unshift((0,n.stringToPDFString)(r.get("T")))}return t.join(".")}},{key:"hasFieldFlag",value:function(e){return!!(this.data.fieldFlags&e)}},{key:"getOperatorList",value:function(e,r,i){return i?Promise.resolve(new l.OperatorList):a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"getOperatorList",this).call(this,e,r,i)}}]);return t}(),b=function(e){f(t,v);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),a=e.dict;r.data.fieldValue=(0,n.stringToPDFString)(r.data.fieldValue||"");var i=(0,n.getInheritableProperty)({dict:a,key:"Q"});(!Number.isInteger(i)||i<0||i>2)&&(i=null);r.data.textAlignment=i;var o=(0,n.getInheritableProperty)({dict:a,key:"MaxLen"});(!Number.isInteger(o)||o<0)&&(o=null);r.data.maxLen=o;r.data.multiLine=r.hasFieldFlag(n.AnnotationFieldFlag.MULTILINE);r.data.comb=r.hasFieldFlag(n.AnnotationFieldFlag.COMB)&&!r.hasFieldFlag(n.AnnotationFieldFlag.MULTILINE)&&!r.hasFieldFlag(n.AnnotationFieldFlag.PASSWORD)&&!r.hasFieldFlag(n.AnnotationFieldFlag.FILESELECT)&&null!==r.data.maxLen;return r}i(t,[{key:"getOperatorList",value:function(e,r,i){if(i||this.appearance)return a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"getOperatorList",this).call(this,e,r,i);var o=new l.OperatorList;if(!this.data.defaultAppearance)return Promise.resolve(o);var s=new u.Stream((0,n.stringToBytes)(this.data.defaultAppearance));return e.getOperatorList({stream:s,task:r,resources:this.fieldResources,operatorList:o}).then(function(){return o})}}]);return t}(),y=function(e){f(t,v);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.checkBox=!r.hasFieldFlag(n.AnnotationFieldFlag.RADIO)&&!r.hasFieldFlag(n.AnnotationFieldFlag.PUSHBUTTON);r.data.radioButton=r.hasFieldFlag(n.AnnotationFieldFlag.RADIO)&&!r.hasFieldFlag(n.AnnotationFieldFlag.PUSHBUTTON);r.data.pushButton=r.hasFieldFlag(n.AnnotationFieldFlag.PUSHBUTTON);r.data.checkBox?r._processCheckBox(e):r.data.radioButton?r._processRadioButton(e):r.data.pushButton?r._processPushButton(e):(0,n.warn)("Invalid field flags for button widget annotation");return r}i(t,[{key:"_processCheckBox",value:function(e){(0,s.isName)(this.data.fieldValue)&&(this.data.fieldValue=this.data.fieldValue.name);var t=e.dict.get("AP");if((0,s.isDict)(t)){var r=t.get("D");if((0,s.isDict)(r)){var a=r.getKeys();2===a.length&&(this.data.exportValue="Off"===a[0]?a[1]:a[0])}}}},{key:"_processRadioButton",value:function(e){this.data.fieldValue=this.data.buttonValue=null;var t=e.dict.get("Parent");if((0,s.isDict)(t)&&t.has("V")){var r=t.get("V");(0,s.isName)(r)&&(this.data.fieldValue=r.name)}var a=e.dict.get("AP");if((0,s.isDict)(a)){var i=a.get("N");if((0,s.isDict)(i))for(var n=i.getKeys(),o=0,c=n.length;o<c;o++)if("Off"!==n[o]){this.data.buttonValue=n[o];break}}}},{key:"_processPushButton",value:function(e){e.dict.has("A")?o.Catalog.parseDestDictionary({destDict:e.dict,resultObj:this.data,docBaseUrl:e.pdfManager.docBaseUrl}):(0,n.warn)("Push buttons without action dictionaries are not supported")}}]);return t}(),w=function(e){f(t,v);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.options=[];var a=(0,n.getInheritableProperty)({dict:e.dict,key:"Opt"});if(Array.isArray(a))for(var i=e.xref,o=0,s=a.length;o<s;o++){var c=i.fetchIfRef(a[o]),l=Array.isArray(c);r.data.options[o]={exportValue:l?i.fetchIfRef(c[0]):c,displayValue:(0,n.stringToPDFString)(l?i.fetchIfRef(c[1]):c)}}Array.isArray(r.data.fieldValue)||(r.data.fieldValue=[r.data.fieldValue]);r.data.combo=r.hasFieldFlag(n.AnnotationFieldFlag.COMBO);r.data.multiSelect=r.hasFieldFlag(n.AnnotationFieldFlag.MULTISELECT);return r}return t}(),k=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.TEXT;if(r.data.hasAppearance)r.data.name="NoIcon";else{r.data.rect[1]=r.data.rect[3]-22;r.data.rect[2]=r.data.rect[0]+22;r.data.name=e.dict.has("Name")?e.dict.get("Name").name:"Note"}r._preparePopup(e.dict);return r}return t}(),S=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.LINK;o.Catalog.parseDestDictionary({destDict:e.dict,resultObj:r.data,docBaseUrl:e.pdfManager.docBaseUrl});return r}return t}(),C=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.POPUP;var a=e.dict,i=a.get("Parent");if(!i){(0,n.warn)("Popup annotation has a missing or invalid parent annotation.");return h(r)}var o=i.get("Subtype");r.data.parentType=(0,s.isName)(o)?o.name:null;r.data.parentId=a.getRaw("Parent").toString();r.data.title=(0,n.stringToPDFString)(i.get("T")||"");r.data.contents=(0,n.stringToPDFString)(i.get("Contents")||"");if(i.has("C")){r.setColor(i.getArray("C"));r.data.color=r.color}else r.data.color=null;if(!r.viewable){var c=i.get("F");r._isViewable(c)&&r.setFlags(c)}return r}return t}(),x=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.LINE;var a=e.dict;r.data.lineCoordinates=n.Util.normalizeRect(a.getArray("L"));r._preparePopup(a);return r}return t}(),_=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.SQUARE;r._preparePopup(e.dict);return r}return t}(),A=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.CIRCLE;r._preparePopup(e.dict);return r}return t}(),P=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.POLYLINE;var a=e.dict,i=a.getArray("Vertices");r.data.vertices=[];for(var o=0,s=i.length;o<s;o+=2)r.data.vertices.push({x:i[o],y:i[o+1]});r._preparePopup(a);return r}return t}(),I=function(e){f(t,P);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.POLYGON;return r}return t}(),O=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.INK;var a=e.dict,i=e.xref,o=a.getArray("InkList");r.data.inkLists=[];for(var s=0,c=o.length;s<c;++s){r.data.inkLists.push([]);for(var l=0,u=o[s].length;l<u;l+=2)r.data.inkLists[s].push({x:i.fetchIfRef(o[s][l]),y:i.fetchIfRef(o[s][l+1])})}r._preparePopup(a);return r}return t}(),T=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.HIGHLIGHT;r._preparePopup(e.dict);return r}return t}(),E=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.UNDERLINE;r._preparePopup(e.dict);return r}return t}(),F=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.SQUIGGLY;r._preparePopup(e.dict);return r}return t}(),R=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.STRIKEOUT;r._preparePopup(e.dict);return r}return t}(),B=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));r.data.annotationType=n.AnnotationType.STAMP;r._preparePopup(e.dict);return r}return t}(),D=function(e){f(t,m);function t(e){d(this,t);var r=h(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),a=new o.FileSpec(e.dict.get("FS"),e.xref);r.data.annotationType=n.AnnotationType.FILEATTACHMENT;r.data.file=a.serializable;r._preparePopup(e.dict);return r}return t}();t.Annotation=m;t.AnnotationBorderStyle=p;t.AnnotationFactory=g},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.OperatorList=void 0;var a=r(2),i=function(){function e(e,t,r,a,i){for(var n=e,o=0,s=t.length-1;o<s;o++){var c=t[o];n=n[c]||(n[c]=[])}n[t[t.length-1]]={checkFn:r,iterateFn:a,processFn:i}}var t=[];e(t,[a.OPS.save,a.OPS.transform,a.OPS.paintInlineImageXObject,a.OPS.restore],null,function(e,t){var r=e.fnArray;switch((t-(e.iCurr-3))%4){case 0:return r[t]===a.OPS.save;case 1:return r[t]===a.OPS.transform;case 2:return r[t]===a.OPS.paintInlineImageXObject;case 3:return r[t]===a.OPS.restore}},function(e,t){var r=e.fnArray,i=e.argsArray,n=e.iCurr,o=n-3,s=n-2,c=n-1,l=Math.min(Math.floor((t-o)/4),200);if(l<10)return t-(t-o)%4;var u,h=0,f=[],d=0,g=1,m=1;for(u=0;u<l;u++){var p=i[s+(u<<2)],v=i[c+(u<<2)][0];if(g+v.width>1e3){h=Math.max(h,g);m+=d+2;g=0;d=0}f.push({transform:p,x:g,y:m,w:v.width,h:v.height});g+=v.width+2;d=Math.max(d,v.height)}var b=Math.max(h,g)+1,y=m+d+1,w=new Uint8ClampedArray(b*y*4),k=b<<2;for(u=0;u<l;u++){var S=i[c+(u<<2)][0].data,C=f[u].w<<2,x=0,_=f[u].x+f[u].y*b<<2;w.set(S.subarray(0,C),_-k);for(var A=0,P=f[u].h;A<P;A++){w.set(S.subarray(x,x+C),_);x+=C;_+=k}w.set(S.subarray(x-C,x),_);for(;_>=0;){S[_-4]=S[_];S[_-3]=S[_+1];S[_-2]=S[_+2];S[_-1]=S[_+3];S[_+C]=S[_+C-4];S[_+C+1]=S[_+C-3];S[_+C+2]=S[_+C-2];S[_+C+3]=S[_+C-1];_-=k}}r.splice(o,4*l,a.OPS.paintInlineImageXObjectGroup);i.splice(o,4*l,[{width:b,height:y,kind:a.ImageKind.RGBA_32BPP,data:w},f]);return o+1});e(t,[a.OPS.save,a.OPS.transform,a.OPS.paintImageMaskXObject,a.OPS.restore],null,function(e,t){var r=e.fnArray;switch((t-(e.iCurr-3))%4){case 0:return r[t]===a.OPS.save;case 1:return r[t]===a.OPS.transform;case 2:return r[t]===a.OPS.paintImageMaskXObject;case 3:return r[t]===a.OPS.restore}},function(e,t){var r,i=e.fnArray,n=e.argsArray,o=e.iCurr,s=o-3,c=o-2,l=o-1,u=Math.floor((t-s)/4);if((u=function(e,t,r,i){for(var n=e+2,o=0;o<t;o++){var s=i[n+4*o],c=1===s.length&&s[0];if(!c||1!==c.width||1!==c.height||c.data.length&&(1!==c.data.length||0!==c.data[0]))break;r[n+4*o]=a.OPS.paintSolidColorImageMask}return t-o}(s,u,i,n))<10)return t-(t-s)%4;var h,f,d=!1,g=n[l][0];if(0===n[c][1]&&0===n[c][2]){d=!0;var m=n[c][0],p=n[c][3];h=c+4;var v=l+4;for(r=1;r<u;r++,h+=4,v+=4){f=n[h];if(n[v][0]!==g||f[0]!==m||0!==f[1]||0!==f[2]||f[3]!==p){r<10?d=!1:u=r;break}}}if(d){u=Math.min(u,1e3);var b=new Float32Array(2*u);h=c;for(r=0;r<u;r++,h+=4){f=n[h];b[r<<1]=f[4];b[1+(r<<1)]=f[5]}i.splice(s,4*u,a.OPS.paintImageMaskXObjectRepeat);n.splice(s,4*u,[g,m,p,b])}else{u=Math.min(u,100);var y=[];for(r=0;r<u;r++){f=n[c+(r<<2)];var w=n[l+(r<<2)][0];y.push({data:w.data,width:w.width,height:w.height,transform:f})}i.splice(s,4*u,a.OPS.paintImageMaskXObjectGroup);n.splice(s,4*u,[y])}return s+1});e(t,[a.OPS.save,a.OPS.transform,a.OPS.paintImageXObject,a.OPS.restore],function(e){var t=e.argsArray,r=e.iCurr-2;return 0===t[r][1]&&0===t[r][2]},function(e,t){var r=e.fnArray,i=e.argsArray;switch((t-(e.iCurr-3))%4){case 0:return r[t]===a.OPS.save;case 1:if(r[t]!==a.OPS.transform)return!1;var n=e.iCurr-2,o=i[n][0],s=i[n][3];return i[t][0]===o&&0===i[t][1]&&0===i[t][2]&&i[t][3]===s;case 2:if(r[t]!==a.OPS.paintImageXObject)return!1;var c=i[e.iCurr-1][0];return i[t][0]===c;case 3:return r[t]===a.OPS.restore}},function(e,t){var r=e.fnArray,i=e.argsArray,n=e.iCurr,o=n-3,s=n-2,c=i[n-1][0],l=i[s][0],u=i[s][3],h=Math.min(Math.floor((t-o)/4),1e3);if(h<3)return t-(t-o)%4;for(var f=new Float32Array(2*h),d=s,g=0;g<h;g++,d+=4){var m=i[d];f[g<<1]=m[4];f[1+(g<<1)]=m[5]}var p=[c,l,u,f];r.splice(o,4*h,a.OPS.paintImageXObjectRepeat);i.splice(o,4*h,p);return o+1});e(t,[a.OPS.beginText,a.OPS.setFont,a.OPS.setTextMatrix,a.OPS.showText,a.OPS.endText],null,function(e,t){var r=e.fnArray,i=e.argsArray;switch((t-(e.iCurr-4))%5){case 0:return r[t]===a.OPS.beginText;case 1:return r[t]===a.OPS.setFont;case 2:return r[t]===a.OPS.setTextMatrix;case 3:if(r[t]!==a.OPS.showText)return!1;var n=e.iCurr-3,o=i[n][0],s=i[n][1];return i[t][0]===o&&i[t][1]===s;case 4:return r[t]===a.OPS.endText}},function(e,t){var r=e.fnArray,a=e.argsArray,i=e.iCurr,n=i-4,o=i-3,s=i-2,c=i-1,l=i,u=a[o][0],h=a[o][1],f=Math.min(Math.floor((t-n)/5),1e3);if(f<3)return t-(t-n)%5;var d=n;if(n>=4&&r[n-4]===r[o]&&r[n-3]===r[s]&&r[n-2]===r[c]&&r[n-1]===r[l]&&a[n-4][0]===u&&a[n-4][1]===h){f++;d-=5}for(var g=d+4,m=1;m<f;m++){r.splice(g,3);a.splice(g,3);g+=2}return g+1});function r(e){this.queue=e;this.state=null;this.context={iCurr:0,fnArray:e.fnArray,argsArray:e.argsArray};this.match=null;this.lastProcessed=0}r.prototype={_optimize:function(){var e=this.queue.fnArray,r=this.lastProcessed,a=e.length,i=this.state,n=this.match;if(i||n||r+1!==a||t[e[r]]){for(var o=this.context;r<a;){if(n){if((0,n.iterateFn)(o,r)){r++;continue}r=(0,n.processFn)(o,r+1);a=e.length;n=null;i=null;if(r>=a)break}if((i=(i||t)[e[r]])&&!Array.isArray(i)){o.iCurr=r;r++;if(!i.checkFn||(0,i.checkFn)(o)){n=i;i=null}else i=null}else r++}this.state=i;this.match=n;this.lastProcessed=r}else this.lastProcessed=a},push:function(e,t){this.queue.fnArray.push(e);this.queue.argsArray.push(t);this._optimize()},flush:function(){for(;this.match;){var e=this.queue.fnArray.length;this.lastProcessed=(0,this.match.processFn)(this.context,e);this.match=null;this.state=null;this._optimize()}},reset:function(){this.state=null;this.match=null;this.lastProcessed=0}};return r}(),n=function(){function e(e){this.queue=e}e.prototype={push:function(e,t){this.queue.fnArray.push(e);this.queue.argsArray.push(t)},flush:function(){}};return e}(),o=function(){function e(e,t,r){this.messageHandler=t;this.fnArray=[];this.argsArray=[];t&&"oplist"!==this.intent?this.optimizer=new i(this):this.optimizer=new n(this);this.dependencies=Object.create(null);this._totalLength=0;this.pageIndex=r;this.intent=e;this.weight=0}e.prototype={get length(){return this.argsArray.length},get totalLength(){return this._totalLength+this.length},addOp:function(e,t){this.optimizer.push(e,t);this.weight++;this.messageHandler&&(this.weight>=1e3?this.flush():this.weight>=995&&(e===a.OPS.restore||e===a.OPS.endText)&&this.flush())},addDependency:function(e){if(!(e in this.dependencies)){this.dependencies[e]=!0;this.addOp(a.OPS.dependency,[e])}},addDependencies:function(e){for(var t in e)this.addDependency(t)},addOpList:function(e){Object.assign(this.dependencies,e.dependencies);for(var t=0,r=e.length;t<r;t++)this.addOp(e.fnArray[t],e.argsArray[t])},getIR:function(){return{fnArray:this.fnArray,argsArray:this.argsArray,length:this.length}},flush:function(e){this.optimizer.flush();var t=function(e){for(var t=[],r=e.fnArray,i=e.argsArray,n=0,o=e.length;n<o;n++)switch(r[n]){case a.OPS.paintInlineImageXObject:case a.OPS.paintInlineImageXObjectGroup:case a.OPS.paintImageMaskXObject:var s=i[n][0];s.cached||t.push(s.data.buffer)}return t}(this),r=this.length;this._totalLength+=r;this.messageHandler.send("RenderPageChunk",{operatorList:{fnArray:this.fnArray,argsArray:this.argsArray,lastChunk:e,length:r},pageIndex:this.pageIndex,intent:this.intent},t);this.dependencies=Object.create(null);this.fnArray.length=0;this.argsArray.length=0;this.weight=0;this.optimizer.reset()}};return e}();t.OperatorList=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PartialEvaluator=void 0;var a,i=r(131),n=(a=i)&&a.__esModule?a:{default:a},o=r(2),s=r(155),c=r(140),l=r(138),u=r(156),h=r(159),f=r(162),d=r(161),g=r(165),m=r(139),p=r(166),v=r(151),b=r(160),y=r(167),w=r(168),k=r(146),S=r(170),C=r(153),x=r(171);var _=function(){var e={forceDataSchema:!1,maxImageSize:-1,disableFontFace:!1,nativeImageDecoderSupport:o.NativeImageDecoding.DECODE,ignoreErrors:!1,isEvalSupported:!0};function t(e){var t=e.xref,r=e.resources,a=e.handler,i=e.forceDataSchema,n=void 0!==i&&i,o=e.pdfFunctionFactory;this.xref=t;this.resources=r;this.handler=a;this.forceDataSchema=n;this.pdfFunctionFactory=o}t.prototype={canDecode:function(e){return e instanceof k.JpegStream&&t.isDecodable(e,this.xref,this.resources,this.pdfFunctionFactory)},decode:function(e){var t=e.dict.get("ColorSpace","CS");t=v.ColorSpace.parse(t,this.xref,this.resources,this.pdfFunctionFactory);return this.handler.sendWithPromise("JpegDecode",[e.getIR(this.forceDataSchema),t.numComps]).then(function(t){var r=t.data;t.width,t.height;return new c.Stream(r,0,r.length,e.dict)})}};t.isSupported=function(e,t,r,a){var i=e.dict;if(i.has("DecodeParms")||i.has("DP"))return!1;var n=v.ColorSpace.parse(i.get("ColorSpace","CS"),t,r,a);return("DeviceGray"===n.name||"DeviceRGB"===n.name)&&n.isDefaultDecode(i.getArray("Decode","D"))};t.isDecodable=function(e,t,r,a){var i=e.dict;if(i.has("DecodeParms")||i.has("DP"))return!1;var n=v.ColorSpace.parse(i.get("ColorSpace","CS"),t,r,a);return(1===n.numComps||3===n.numComps)&&n.isDefaultDecode(i.getArray("Decode","D"))};function r(t){var r,a,i=this,s=t.pdfManager,c=t.xref,l=t.handler,u=t.pageIndex,h=t.idFactory,f=t.fontCache,d=t.builtInCMapCache,g=t.options,m=void 0===g?null:g,p=t.pdfFunctionFactory;this.pdfManager=s;this.xref=c;this.handler=l;this.pageIndex=u;this.idFactory=h;this.fontCache=f;this.builtInCMapCache=d;this.options=m||e;this.pdfFunctionFactory=p;this.fetchBuiltInCMap=(a=(r=n.default.mark(function e(t){var r;return n.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!i.builtInCMapCache.has(t)){e.next=2;break}return e.abrupt("return",i.builtInCMapCache.get(t));case 2:e.next=4;return i.handler.sendWithPromise("FetchBuiltInCMap",{name:t});case 4:(r=e.sent).compressionType!==o.CMapCompressionType.NONE&&i.builtInCMapCache.set(t,r);return e.abrupt("return",r);case 7:case"end":return e.stop()}},e,i)}),function(){var e=r.apply(this,arguments);return new Promise(function(t,r){return function a(i,n){try{var o=e[i](n),s=o.value}catch(e){r(e);return}if(!o.done)return Promise.resolve(s).then(function(e){a("next",e)},function(e){a("throw",e)});t(s)}("next")})}),function(e){return a.apply(this,arguments)})}function a(){this.reset()}a.prototype={check:function(){if(++this.checked<100)return!1;this.checked=0;return this.endTime<=Date.now()},reset:function(){this.endTime=Date.now()+20;this.checked=0}};var i=Promise.resolve();r.prototype={clone:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:e,r=Object.create(this);r.options=t;return r},hasBlendModes:function(e){if(!(0,l.isDict)(e))return!1;var t=Object.create(null);e.objId&&(t[e.objId]=!0);for(var r=[e],a=this.xref;r.length;){var i,n,o,s=r.shift(),c=s.get("ExtGState");if((0,l.isDict)(c)){var u=c.getKeys();for(n=0,o=u.length;n<o;n++){i=u[n];var h=c.get(i).get("BM");if((0,l.isName)(h)&&"Normal"!==h.name)return!0}}var f=s.get("XObject");if((0,l.isDict)(f)){var d=f.getKeys();for(n=0,o=d.length;n<o;n++){i=d[n];var g=f.getRaw(i);if((0,l.isRef)(g)){if(t[g.toString()])continue;g=a.fetch(g)}if((0,l.isStream)(g)){if(g.dict.objId){if(t[g.dict.objId])continue;t[g.dict.objId]=!0}var m=g.dict.get("Resources");if((0,l.isDict)(m)&&(!m.objId||!t[m.objId])){r.push(m);m.objId&&(t[m.objId]=!0)}}}}}return!1},buildFormXObject:function(e,t,r,a,i,n){var s=t.dict,c=s.getArray("Matrix"),u=s.getArray("BBox"),h=s.get("Group");if(h){var f={matrix:c,bbox:u,smask:r,isolated:!1,knockout:!1},d=h.get("S"),g=null;if((0,l.isName)(d,"Transparency")){f.isolated=h.get("I")||!1;f.knockout=h.get("K")||!1;h.has("CS")&&(g=v.ColorSpace.parse(h.get("CS"),this.xref,e,this.pdfFunctionFactory))}if(r&&r.backdrop){g=g||v.ColorSpace.singletons.rgb;r.backdrop=g.getRgb(r.backdrop,0)}a.addOp(o.OPS.beginGroup,[f])}a.addOp(o.OPS.paintFormXObjectBegin,[c,u]);return this.getOperatorList({stream:t,task:i,resources:s.get("Resources")||e,operatorList:a,initialState:n}).then(function(){a.addOp(o.OPS.paintFormXObjectEnd,[]);h&&a.addOp(o.OPS.endGroup,[f])})},buildPaintImageXObject:function(e){var r=this,a=e.resources,i=e.image,n=e.isInline,s=void 0!==n&&n,l=e.operatorList,u=e.cacheKey,h=e.imageCache,f=e.forceDisableNativeImageDecoder,d=void 0!==f&&f,g=i.dict,m=g.get("Width","W"),p=g.get("Height","H");if(!(m&&(0,o.isNum)(m)&&p&&(0,o.isNum)(p))){(0,o.warn)("Image dimensions are missing, or not numbers.");return Promise.resolve()}var v,b,y=this.options.maxImageSize;if(-1!==y&&m*p>y){(0,o.warn)("Image exceeded maximum allowed size and was removed.");return Promise.resolve()}if(g.get("ImageMask","IM")||!1){var w=g.get("Width","W"),S=g.get("Height","H"),C=w+7>>3,_=i.getBytes(C*S,!0),A=g.getArray("Decode","D");(v=x.PDFImage.createMask({imgArray:_,width:w,height:S,imageIsFromDecodeStream:i instanceof c.DecodeStream,inverseDecode:!!A&&A[0]>0})).cached=!0;b=[v];l.addOp(o.OPS.paintImageMaskXObject,b);u&&(h[u]={fn:o.OPS.paintImageMaskXObject,args:b});return Promise.resolve()}var P=g.get("SMask","SM")||!1,I=g.get("Mask")||!1;if(s&&!P&&!I&&!(i instanceof k.JpegStream)&&m+p<200){v=new x.PDFImage({xref:this.xref,res:a,image:i,isInline:s,pdfFunctionFactory:this.pdfFunctionFactory}).createImageData(!0);l.addOp(o.OPS.paintInlineImageXObject,[v]);return Promise.resolve()}var O=d?o.NativeImageDecoding.NONE:this.options.nativeImageDecoderSupport,T="img_"+this.idFactory.createObjId();if(O!==o.NativeImageDecoding.NONE&&!P&&!I&&i instanceof k.JpegStream&&t.isSupported(i,this.xref,a,this.pdfFunctionFactory))return this.handler.sendWithPromise("obj",[T,this.pageIndex,"JpegStream",i.getIR(this.options.forceDataSchema)]).then(function(){l.addDependency(T);b=[T,m,p];l.addOp(o.OPS.paintJpegXObject,b);u&&(h[u]={fn:o.OPS.paintJpegXObject,args:b})},function(e){(0,o.warn)("Native JPEG decoding failed -- trying to recover: "+(e&&e.message));return r.buildPaintImageXObject({resources:a,image:i,isInline:s,operatorList:l,cacheKey:u,imageCache:h,forceDisableNativeImageDecoder:!0})});var E=null;O===o.NativeImageDecoding.DECODE&&(i instanceof k.JpegStream||I instanceof k.JpegStream||P instanceof k.JpegStream)&&(E=new t({xref:this.xref,resources:a,handler:this.handler,forceDataSchema:this.options.forceDataSchema,pdfFunctionFactory:this.pdfFunctionFactory}));l.addDependency(T);b=[T,m,p];x.PDFImage.buildImage({handler:this.handler,xref:this.xref,res:a,image:i,isInline:s,nativeDecoder:E,pdfFunctionFactory:this.pdfFunctionFactory}).then(function(e){var t=e.createImageData(!1);r.handler.send("obj",[T,r.pageIndex,"Image",t],[t.data.buffer])}).catch(function(e){(0,o.warn)("Unable to decode image: "+e);r.handler.send("obj",[T,r.pageIndex,"Image",null])});l.addOp(o.OPS.paintImageXObject,b);u&&(h[u]={fn:o.OPS.paintImageXObject,args:b});return Promise.resolve()},handleSMask:function(e,t,r,a,i){var n=e.get("G"),o={subtype:e.get("S").name,backdrop:e.get("BC")},s=e.get("TR");if((0,w.isPDFFunction)(s)){for(var c=this.pdfFunctionFactory.create(s),l=new Uint8Array(256),u=new Float32Array(1),h=0;h<256;h++){u[0]=h/255;c(u,0,u,0);l[h]=255*u[0]|0}o.transferMap=l}return this.buildFormXObject(t,n,o,r,a,i.state.clone())},handleTilingType:function(e,t,r,a,i,n,s){var c=this,u=new C.OperatorList,h=[i.get("Resources"),r],f=l.Dict.merge(this.xref,h);return this.getOperatorList({stream:a,task:s,resources:f,operatorList:u}).then(function(){return(0,g.getTilingPatternIR)({fnArray:u.fnArray,argsArray:u.argsArray},i,t)}).then(function(t){n.addDependencies(u.dependencies);n.addOp(e,t)},function(e){if(!c.options.ignoreErrors)throw e;c.handler.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.unknown});(0,o.warn)('handleTilingType - ignoring pattern: "'+e+'".')})},handleSetFont:function(e,t,r,a,i,n){var s,c=this;t&&(s=(t=t.slice())[0].name);return this.loadFont(s,r,e).then(function(t){return t.font.isType3Font?t.loadType3Data(c,e,a,i).then(function(){return t}).catch(function(e){c.handler.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.font});return new A("g_font_error",new u.ErrorFont("Type3 font load error: "+e),t.font)}):t}).then(function(e){n.font=e.font;e.send(c.handler);return e.loadedName})},handleText:function(e,t){var r=this,a=t.font,i=a.charsToGlyphs(e),n=!!(t.textRenderingMode&o.TextRenderingMode.ADD_TO_PATH_FLAG);if(a.data&&(n||this.options.disableFontFace||"Pattern"===t.fillColorSpace.name))for(var s=function(e){if(!a.renderer.hasBuiltPath(e)){var t=a.renderer.getPathJs(e);r.handler.send("commonobj",[a.loadedName+"_path_"+e,"FontPath",t])}},c=0,l=i.length;c<l;c++){var u=i[c];s(u.fontChar);var h=u.accent;h&&h.fontChar&&s(h.fontChar)}return i},setGState:function(e,t,r,a,i){for(var n=this,s=[],c=t.getKeys(),u=Promise.resolve(),h=function(){var h=c[f],d=t.get(h);switch(h){case"Type":break;case"LW":case"LC":case"LJ":case"ML":case"D":case"RI":case"FL":case"CA":case"ca":s.push([h,d]);break;case"Font":u=u.then(function(){return n.handleSetFont(e,null,d[0],r,a,i.state).then(function(e){r.addDependency(e);s.push([h,[e,d[1]]])})});break;case"BM":s.push([h,function(e){if(!(0,l.isName)(e))return"source-over";switch(e.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"}(0,o.warn)("Unsupported blend mode: "+e.name);return"source-over"}(d)]);break;case"SMask":if((0,l.isName)(d,"None")){s.push([h,!1]);break}if((0,l.isDict)(d)){u=u.then(function(){return n.handleSMask(d,e,r,a,i)});s.push([h,!0])}else(0,o.warn)("Unsupported SMask type");break;case"OP":case"op":case"OPM":case"BG":case"BG2":case"UCR":case"UCR2":case"TR":case"TR2":case"HT":case"SM":case"SA":case"AIS":case"TK":(0,o.info)("graphic state operator "+h);break;default:(0,o.info)("Unknown graphic state operator "+h)}},f=0,d=c.length;f<d;f++)h();return u.then(function(){s.length>0&&r.addOp(o.OPS.setGState,[s])})},loadFont:function(e,t,r){var a=this;function i(){return Promise.resolve(new A("g_font_error",new u.ErrorFont("Font "+e+" is not available"),t))}var n,s=this.xref;if(t){if(!(0,l.isRef)(t))throw new Error('The "font" object should be a reference.');n=t}else{var c=r.get("Font");if(!c){(0,o.warn)("fontRes not available");return i()}n=c.getRaw(e)}if(!n){(0,o.warn)("fontRef not available");return i()}if(this.fontCache.has(n))return this.fontCache.get(n);t=s.fetchIfRef(n);if(!(0,l.isDict)(t))return i();if(t.translated)return t.translated;var h,f,d=(0,o.createPromiseCapability)(),g=this.preEvaluateFont(t),m=g.descriptor,p=(0,l.isRef)(n);p&&(h=n.toString());if((0,l.isDict)(m)){m.fontAliases||(m.fontAliases=Object.create(null));var v=m.fontAliases,b=g.hash;if(v[b]){var y=v[b].aliasRef;if(p&&y&&this.fontCache.has(y)){this.fontCache.putAlias(n,y);return this.fontCache.get(n)}}else v[b]={fontID:u.Font.getFontID()};p&&(v[b].aliasRef=n);h=v[b].fontID}if(p)this.fontCache.put(n,d.promise);else{h||(h=this.idFactory.createObjId());this.fontCache.put("id_"+h,d.promise)}(0,o.assert)(h,'The "fontID" must be defined.');t.loadedName="g_"+this.pdfManager.docId+"_f"+h;t.translated=d.promise;try{f=this.translateFont(g)}catch(e){f=Promise.reject(e)}f.then(function(e){if(void 0!==e.fontType){s.stats.fontTypes[e.fontType]=!0}d.resolve(new A(t.loadedName,e,t))}).catch(function(e){a.handler.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.font});try{var r=g.descriptor,i=r&&r.get("FontFile3"),n=i&&i.get("Subtype"),c=(0,u.getFontType)(g.type,n&&n.name);s.stats.fontTypes[c]=!0}catch(e){}d.resolve(new A(t.loadedName,new u.ErrorFont(e instanceof Error?e.message:e),t))});return d.promise},buildPath:function(e,t,r){var a=e.length-1;r||(r=[]);if(a<0||e.fnArray[a]!==o.OPS.constructPath)e.addOp(o.OPS.constructPath,[[t],r]);else{var i=e.argsArray[a];i[0].push(t);Array.prototype.push.apply(i[1],r)}},handleColorN:function(e,t,r,a,i,n,o){var s,c=r[r.length-1];if((0,l.isName)(c)&&(s=i.get(c.name))){var u=(0,l.isStream)(s)?s.dict:s,h=u.get("PatternType");if(1===h){var f=a.base?a.base.getRgb(r,0):null;return this.handleTilingType(t,f,n,s,u,e,o)}if(2===h){var d=u.get("Shading"),m=u.getArray("Matrix");s=g.Pattern.parseShading(d,m,this.xref,n,this.handler,this.pdfFunctionFactory);e.addOp(t,s.getIR());return Promise.resolve()}return Promise.reject(new Error("Unknown PatternType: "+h))}e.addOp(t,r);return Promise.resolve()},getOperatorList:function(e){var t=this,r=e.stream,n=e.task,s=e.resources,c=e.operatorList,u=e.initialState,h=void 0===u?null:u;s=s||l.Dict.empty;h=h||new O;if(!c)throw new Error('getOperatorList: missing "operatorList" parameter');var f=this,d=this.xref,m=Object.create(null),p=s.get("XObject")||l.Dict.empty,b=s.get("Pattern")||l.Dict.empty,y=new P(h),w=new T(r,d,y),k=new a;function S(e){for(var t=0,r=w.savedStatesDepth;t<r;t++)c.addOp(o.OPS.restore,[])}return new Promise(function e(t,r){var a=function(a){a.then(function(){try{e(t,r)}catch(e){r(e)}},r)};n.ensureNotTerminated();k.reset();for(var u,h,C,x,_={};!(u=k.check());){_.args=null;if(!w.read(_))break;var A=_.args,P=_.fn;switch(0|P){case o.OPS.paintXObject:var I=A[0].name;if(I&&void 0!==m[I]){c.addOp(m[I].fn,m[I].args);A=null;continue}a(new Promise(function(e,t){if(!I)throw new o.FormatError("XObject must be referred to by name.");var r=p.get(I);if(r){if(!(0,l.isStream)(r))throw new o.FormatError("XObject should be a stream");var a=r.dict.get("Subtype");if(!(0,l.isName)(a))throw new o.FormatError("XObject should have a Name subtype");if("Form"!==a.name)if("Image"!==a.name){if("PS"!==a.name)throw new o.FormatError("Unhandled XObject subtype "+a.name);(0,o.info)("Ignored XObject subtype PS");e()}else f.buildPaintImageXObject({resources:s,image:r,operatorList:c,cacheKey:I,imageCache:m}).then(e,t);else{y.save();f.buildFormXObject(s,r,null,c,n,y.state.clone()).then(function(){y.restore();e()},t)}}else{c.addOp(P,A);e()}}).catch(function(e){if(!f.options.ignoreErrors)throw e;f.handler.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.unknown});(0,o.warn)('getOperatorList - ignoring XObject: "'+e+'".')}));return;case o.OPS.setFont:var O=A[1];a(f.handleSetFont(s,A,null,c,n,y.state).then(function(e){c.addDependency(e);c.addOp(o.OPS.setFont,[e,O])}));return;case o.OPS.endInlineImage:var T=A[0].cacheKey;if(T){var E=m[T];if(void 0!==E){c.addOp(E.fn,E.args);A=null;continue}}a(f.buildPaintImageXObject({resources:s,image:A[0],isInline:!0,operatorList:c,cacheKey:T,imageCache:m}));return;case o.OPS.showText:A[0]=f.handleText(A[0],y.state);break;case o.OPS.showSpacedText:var F=A[0],R=[],B=F.length,D=y.state;for(h=0;h<B;++h){var M=F[h];(0,o.isString)(M)?Array.prototype.push.apply(R,f.handleText(M,D)):(0,o.isNum)(M)&&R.push(M)}A[0]=R;P=o.OPS.showText;break;case o.OPS.nextLineShowText:c.addOp(o.OPS.nextLine);A[0]=f.handleText(A[0],y.state);P=o.OPS.showText;break;case o.OPS.nextLineSetSpacingShowText:c.addOp(o.OPS.nextLine);c.addOp(o.OPS.setWordSpacing,[A.shift()]);c.addOp(o.OPS.setCharSpacing,[A.shift()]);A[0]=f.handleText(A[0],y.state);P=o.OPS.showText;break;case o.OPS.setTextRenderingMode:y.state.textRenderingMode=A[0];break;case o.OPS.setFillColorSpace:y.state.fillColorSpace=v.ColorSpace.parse(A[0],d,s,f.pdfFunctionFactory);continue;case o.OPS.setStrokeColorSpace:y.state.strokeColorSpace=v.ColorSpace.parse(A[0],d,s,f.pdfFunctionFactory);continue;case o.OPS.setFillColor:x=y.state.fillColorSpace;A=x.getRgb(A,0);P=o.OPS.setFillRGBColor;break;case o.OPS.setStrokeColor:x=y.state.strokeColorSpace;A=x.getRgb(A,0);P=o.OPS.setStrokeRGBColor;break;case o.OPS.setFillGray:y.state.fillColorSpace=v.ColorSpace.singletons.gray;A=v.ColorSpace.singletons.gray.getRgb(A,0);P=o.OPS.setFillRGBColor;break;case o.OPS.setStrokeGray:y.state.strokeColorSpace=v.ColorSpace.singletons.gray;A=v.ColorSpace.singletons.gray.getRgb(A,0);P=o.OPS.setStrokeRGBColor;break;case o.OPS.setFillCMYKColor:y.state.fillColorSpace=v.ColorSpace.singletons.cmyk;A=v.ColorSpace.singletons.cmyk.getRgb(A,0);P=o.OPS.setFillRGBColor;break;case o.OPS.setStrokeCMYKColor:y.state.strokeColorSpace=v.ColorSpace.singletons.cmyk;A=v.ColorSpace.singletons.cmyk.getRgb(A,0);P=o.OPS.setStrokeRGBColor;break;case o.OPS.setFillRGBColor:y.state.fillColorSpace=v.ColorSpace.singletons.rgb;A=v.ColorSpace.singletons.rgb.getRgb(A,0);break;case o.OPS.setStrokeRGBColor:y.state.strokeColorSpace=v.ColorSpace.singletons.rgb;A=v.ColorSpace.singletons.rgb.getRgb(A,0);break;case o.OPS.setFillColorN:if("Pattern"===(x=y.state.fillColorSpace).name){a(f.handleColorN(c,o.OPS.setFillColorN,A,x,b,s,n));return}A=x.getRgb(A,0);P=o.OPS.setFillRGBColor;break;case o.OPS.setStrokeColorN:if("Pattern"===(x=y.state.strokeColorSpace).name){a(f.handleColorN(c,o.OPS.setStrokeColorN,A,x,b,s,n));return}A=x.getRgb(A,0);P=o.OPS.setStrokeRGBColor;break;case o.OPS.shadingFill:var L=s.get("Shading");if(!L)throw new o.FormatError("No shading resource found");var N=L.get(A[0].name);if(!N)throw new o.FormatError("No shading object found");var U=g.Pattern.parseShading(N,null,d,s,f.handler,f.pdfFunctionFactory).getIR();A=[U];P=o.OPS.shadingFill;break;case o.OPS.setGState:var q=A[0],j=s.get("ExtGState");if(!(0,l.isDict)(j)||!j.has(q.name))break;var z=j.get(q.name);a(f.setGState(s,z,c,n,y));return;case o.OPS.moveTo:case o.OPS.lineTo:case o.OPS.curveTo:case o.OPS.curveTo2:case o.OPS.curveTo3:case o.OPS.closePath:case o.OPS.rectangle:f.buildPath(c,P,A);continue;case o.OPS.markPoint:case o.OPS.markPointProps:case o.OPS.beginMarkedContent:case o.OPS.beginMarkedContentProps:case o.OPS.endMarkedContent:case o.OPS.beginCompat:case o.OPS.endCompat:continue;default:if(null!==A){for(h=0,C=A.length;h<C&&!(A[h]instanceof l.Dict);h++);if(h<C){(0,o.warn)("getOperatorList - ignoring operator: "+P);continue}}}c.addOp(P,A)}if(u)a(i);else{S();t()}}).catch(function(e){if(!t.options.ignoreErrors)throw e;t.handler.send("UnsupportedFeature",{featureId:o.UNSUPPORTED_FEATURES.unknown});(0,o.warn)('getOperatorList - ignoring errors during "'+n.name+'" task: "'+e+'".');S()})},getTextContent:function(e){var t=this,r=e.stream,n=e.task,s=e.resources,c=e.stateManager,u=void 0===c?null:c,h=e.normalizeWhitespace,d=void 0!==h&&h,g=e.combineTextItems,m=void 0!==g&&g,v=e.sink,b=e.seenStyles,y=void 0===b?Object.create(null):b;s=s||l.Dict.empty;u=u||new P(new I);var w,k=/\s/g,S={items:[],styles:Object.create(null)},C={initialized:!1,str:[],width:0,height:0,vertical:!1,lastAdvanceWidth:0,lastAdvanceHeight:0,textAdvanceScale:0,spaceWidth:0,fakeSpaceMin:1/0,fakeMultiSpaceMin:1/0,fakeMultiSpaceMax:-0,textRunBreakAllowed:!1,transform:null,fontName:null},x=.3,_=1.5,A=4,O=this,E=this.xref,F=null,R=Object.create(null),B=new T(r,E,u);function D(){if(C.initialized)return C;var e=w.font;if(!(e.loadedName in y)){y[e.loadedName]=!0;S.styles[e.loadedName]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical}}C.fontName=e.loadedName;var t=[w.fontSize*w.textHScale,0,0,w.fontSize,0,w.textRise];if(e.isType3Font&&w.fontMatrix!==o.FONT_IDENTITY_MATRIX&&1===w.fontSize){var r=e.bbox[3]-e.bbox[1];if(r>0){r*=w.fontMatrix[3];t[3]*=r}}var a=o.Util.transform(w.ctm,o.Util.transform(w.textMatrix,t));C.transform=a;if(e.vertical){C.width=Math.sqrt(a[0]*a[0]+a[1]*a[1]);C.height=0;C.vertical=!0}else{C.width=0;C.height=Math.sqrt(a[2]*a[2]+a[3]*a[3]);C.vertical=!1}var i=w.textLineMatrix[0],n=w.textLineMatrix[1],s=Math.sqrt(i*i+n*n);i=w.ctm[0];n=w.ctm[1];var c=Math.sqrt(i*i+n*n);C.textAdvanceScale=c*s;C.lastAdvanceWidth=0;C.lastAdvanceHeight=0;var l=e.spaceWidth/1e3*w.fontSize;if(l){C.spaceWidth=l;C.fakeSpaceMin=l*x;C.fakeMultiSpaceMin=l*_;C.fakeMultiSpaceMax=l*A;C.textRunBreakAllowed=!e.isMonospace}else{C.spaceWidth=0;C.fakeSpaceMin=1/0;C.fakeMultiSpaceMin=1/0;C.fakeMultiSpaceMax=0;C.textRunBreakAllowed=!1}C.initialized=!0;return C}function M(e){var t=e.str.join(""),r=(0,p.bidi)(t,-1,e.vertical);return{str:d?function(e){for(var t,r=0,a=e.length;r<a&&(t=e.charCodeAt(r))>=32&&t<=127;)r++;return r<a?e.replace(k," "):e}(r.str):r.str,dir:r.dir,width:e.width,height:e.height,transform:e.transform,fontName:e.fontName}}function L(e,t){return O.loadFont(e,t,s).then(function(e){w.font=e.font;w.fontMatrix=e.font.fontMatrix||o.FONT_IDENTITY_MATRIX})}function N(e){for(var t=w.font,r=D(),a=0,i=0,n=t.charsToGlyphs(e),o=0;o<n.length;o++){var s=n[o],c=null;c=t.vertical&&s.vmetric?s.vmetric[0]:s.width;var l=s.unicode,u=(0,f.getNormalizedUnicodes)();void 0!==u[l]&&(l=u[l]);l=(0,f.reverseIfRtl)(l);var h=w.charSpacing;if(s.isSpace){var d=w.wordSpacing;h+=d;d>0&&U(d,r.str)}var g=0,m=0;if(t.vertical){i+=m=c*w.fontMatrix[0]*w.fontSize+h}else{a+=g=(c*w.fontMatrix[0]*w.fontSize+h)*w.textHScale}w.translateTextMatrix(g,m);r.str.push(l)}if(t.vertical){r.lastAdvanceHeight=i;r.height+=Math.abs(i)}else{r.lastAdvanceWidth=a;r.width+=a}return r}function U(e,t){if(!(e<C.fakeSpaceMin))if(e<C.fakeMultiSpaceMin)t.push(" ");else for(var r=Math.round(e/C.spaceWidth);r-- >0;)t.push(" ")}function q(){if(C.initialized){C.width*=C.textAdvanceScale;C.height*=C.textAdvanceScale;S.items.push(M(C));C.initialized=!1;C.str.length=0}}function j(){var e=S.items.length;if(e>0){v.enqueue(S,e);S.items=[];S.styles=Object.create(null)}}var z=new a;return new Promise(function e(t,r){var a=function(a){j();Promise.all([a,v.ready]).then(function(){try{e(t,r)}catch(e){r(e)}},r)};n.ensureNotTerminated();z.reset();for(var c,h={},f=[];!(c=z.check());){f.length=0;h.args=f;if(!B.read(h))break;w=u.state;var g,p=h.fn;f=h.args;switch(0|p){case o.OPS.setFont:var b=f[0].name,k=f[1];if(w.font&&b===w.fontName&&k===w.fontSize)break;q();w.fontName=b;w.fontSize=k;a(L(b,null));return;case o.OPS.setTextRise:q();w.textRise=f[0];break;case o.OPS.setHScale:q();w.textHScale=f[0]/100;break;case o.OPS.setLeading:q();w.leading=f[0];break;case o.OPS.moveText:var x=!!w.font&&0===(w.font.vertical?f[0]:f[1]);g=f[0]-f[1];if(m&&x&&C.initialized&&g>0&&g<=C.fakeMultiSpaceMax){w.translateTextLineMatrix(f[0],f[1]);C.width+=f[0]-C.lastAdvanceWidth;C.height+=f[1]-C.lastAdvanceHeight;U(f[0]-C.lastAdvanceWidth-(f[1]-C.lastAdvanceHeight),C.str);break}q();w.translateTextLineMatrix(f[0],f[1]);w.textMatrix=w.textLineMatrix.slice();break;case o.OPS.setLeadingMoveText:q();w.leading=-f[1];w.translateTextLineMatrix(f[0],f[1]);w.textMatrix=w.textLineMatrix.slice();break;case o.OPS.nextLine:q();w.carriageReturn();break;case o.OPS.setTextMatrix:g=w.calcTextLineMatrixAdvance(f[0],f[1],f[2],f[3],f[4],f[5]);if(m&&null!==g&&C.initialized&&g.value>0&&g.value<=C.fakeMultiSpaceMax){w.translateTextLineMatrix(g.width,g.height);C.width+=g.width-C.lastAdvanceWidth;C.height+=g.height-C.lastAdvanceHeight;U(g.width-C.lastAdvanceWidth-(g.height-C.lastAdvanceHeight),C.str);break}q();w.setTextMatrix(f[0],f[1],f[2],f[3],f[4],f[5]);w.setTextLineMatrix(f[0],f[1],f[2],f[3],f[4],f[5]);break;case o.OPS.setCharSpacing:w.charSpacing=f[0];break;case o.OPS.setWordSpacing:w.wordSpacing=f[0];break;case o.OPS.beginText:q();w.textMatrix=o.IDENTITY_MATRIX.slice();w.textLineMatrix=o.IDENTITY_MATRIX.slice();break;case o.OPS.showSpacedText:for(var _,A=f[0],I=0,T=A.length;I<T;I++)if("string"==typeof A[I])N(A[I]);else if((0,o.isNum)(A[I])){D();g=A[I]*w.fontSize/1e3;var E=!1;if(w.font.vertical){_=g;w.translateTextMatrix(0,_);(E=C.textRunBreakAllowed&&g>C.fakeMultiSpaceMax)||(C.height+=_)}else{_=(g=-g)*w.textHScale;w.translateTextMatrix(_,0);(E=C.textRunBreakAllowed&&g>C.fakeMultiSpaceMax)||(C.width+=_)}E?q():g>0&&U(g,C.str)}break;case o.OPS.showText:N(f[0]);break;case o.OPS.nextLineShowText:q();w.carriageReturn();N(f[0]);break;case o.OPS.nextLineSetSpacingShowText:q();w.wordSpacing=f[0];w.charSpacing=f[1];w.carriageReturn();N(f[2]);break;case o.OPS.paintXObject:q();F||(F=s.get("XObject")||l.Dict.empty);var M=f[0].name;if(M&&void 0!==R[M])break;a(new Promise(function(e,t){if(!M)throw new o.FormatError("XObject must be referred to by name.");var r=F.get(M);if(r){if(!(0,l.isStream)(r))throw new o.FormatError("XObject should be a stream");var a=r.dict.get("Subtype");if(!(0,l.isName)(a))throw new o.FormatError("XObject should have a Name subtype");if("Form"===a.name){var i=u.state.clone(),c=new P(i),h=r.dict.getArray("Matrix");Array.isArray(h)&&6===h.length&&c.transform(h);j();var f={enqueueInvoked:!1,enqueue:function(e,t){this.enqueueInvoked=!0;v.enqueue(e,t)},get desiredSize(){return v.desiredSize},get ready(){return v.ready}};O.getTextContent({stream:r,task:n,resources:r.dict.get("Resources")||s,stateManager:c,normalizeWhitespace:d,combineTextItems:m,sink:f,seenStyles:y}).then(function(){f.enqueueInvoked||(R[M]=!0);e()},t)}else{R[M]=!0;e()}}else e()}).catch(function(e){if(!(e instanceof o.AbortException)){if(!O.options.ignoreErrors)throw e;(0,o.warn)('getTextContent - ignoring XObject: "'+e+'".')}}));return;case o.OPS.setGState:q();var H=f[0],G=s.get("ExtGState");if(!(0,l.isDict)(G)||!(0,l.isName)(H))break;var W=G.get(H.name);if(!(0,l.isDict)(W))break;var X=W.get("Font");if(X){w.fontName=null;w.fontSize=X[1];a(L(null,X[0]));return}}if(S.items.length>=v.desiredSize){c=!0;break}}if(c)a(i);else{q();j();t()}}).catch(function(e){if(!(e instanceof o.AbortException)){if(!t.options.ignoreErrors)throw e;(0,o.warn)('getTextContent - ignoring errors during "'+n.name+'" task: "'+e+'".');q();j()}})},extractDataStructures:function(e,t,r){var a=this,i=this.xref,n=e.get("ToUnicode")||t.get("ToUnicode"),s=n?this.readToUnicode(n):Promise.resolve(void 0);if(r.composite){var c=e.get("CIDSystemInfo");(0,l.isDict)(c)&&(r.cidSystemInfo={registry:(0,o.stringToPDFString)(c.get("Registry")),ordering:(0,o.stringToPDFString)(c.get("Ordering")),supplement:c.get("Supplement")});var f=e.get("CIDToGIDMap");(0,l.isStream)(f)&&(r.cidToGidMap=this.readCidToGidMap(f))}var d,g=[],m=null;if(e.has("Encoding")){d=e.get("Encoding");if((0,l.isDict)(d)){m=d.get("BaseEncoding");m=(0,l.isName)(m)?m.name:null;if(d.has("Differences"))for(var p=d.get("Differences"),v=0,b=0,y=p.length;b<y;b++){var w=i.fetchIfRef(p[b]);if((0,o.isNum)(w))v=w;else{if(!(0,l.isName)(w))throw new o.FormatError("Invalid entry in 'Differences' array: "+w);g[v++]=w.name}}}else{if(!(0,l.isName)(d))throw new o.FormatError("Encoding is not a Name nor a Dict");m=d.name}"MacRomanEncoding"!==m&&"MacExpertEncoding"!==m&&"WinAnsiEncoding"!==m&&(m=null)}if(m)r.defaultEncoding=(0,h.getEncoding)(m).slice();else{var k=!!(r.flags&u.FontFlags.Symbolic),S=!!(r.flags&u.FontFlags.Nonsymbolic);d=h.StandardEncoding;"TrueType"!==r.type||S||(d=h.WinAnsiEncoding);if(k){d=h.MacRomanEncoding;r.file||(/Symbol/i.test(r.name)?d=h.SymbolSetEncoding:/Dingbats/i.test(r.name)&&(d=h.ZapfDingbatsEncoding))}r.defaultEncoding=d}r.differences=g;r.baseEncodingName=m;r.hasEncoding=!!m||g.length>0;r.dict=e;return s.then(function(e){r.toUnicode=e;return a.buildToUnicode(r)}).then(function(e){r.toUnicode=e;return r})},_buildSimpleFontToUnicode:function(e){(0,o.assert)(!e.composite,"Must be a simple font.");var t=[],r=void 0,a=void 0,i=e.defaultEncoding.slice(),n=e.baseEncodingName,s=e.differences;for(r in s)".notdef"!==(a=s[r])&&(i[r]=a);var c=(0,b.getGlyphsUnicode)();for(r in i)if(""!==(a=i[r]))if(void 0!==c[a])t[r]=String.fromCharCode(c[a]);else{var l=0;switch(a[0]){case"G":3===a.length&&(l=parseInt(a.substring(1),16));break;case"g":5===a.length&&(l=parseInt(a.substring(1),16));break;case"C":case"c":a.length>=3&&(l=+a.substring(1));break;default:var d=(0,f.getUnicodeForGlyph)(a,c);-1!==d&&(l=d)}if(l){if(n&&l===+r){var g=(0,h.getEncoding)(n);if(g&&(a=g[r])){t[r]=String.fromCharCode(c[a]);continue}}t[r]=String.fromCharCode(l)}}return new u.ToUnicodeMap(t)},buildToUnicode:function(e){e.hasIncludedToUnicodeMap=!!e.toUnicode&&e.toUnicode.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._buildSimpleFontToUnicode(e));return Promise.resolve(e.toUnicode)}if(!e.composite)return Promise.resolve(this._buildSimpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof s.IdentityCMap)||"Adobe"===e.cidSystemInfo.registry&&("GB1"===e.cidSystemInfo.ordering||"CNS1"===e.cidSystemInfo.ordering||"Japan1"===e.cidSystemInfo.ordering||"Korea1"===e.cidSystemInfo.ordering))){var t=e.cidSystemInfo.registry,r=e.cidSystemInfo.ordering,a=l.Name.get(t+"-"+r+"-UCS2");return s.CMapFactory.create({encoding:a,fetchBuiltInCMap:this.fetchBuiltInCMap,useCMap:null}).then(function(t){var r=[];e.cMap.forEach(function(e,a){if(a>65535)throw new o.FormatError("Max size of CID is 65,535");var i=t.lookup(a);i&&(r[e]=String.fromCharCode((i.charCodeAt(0)<<8)+i.charCodeAt(1)))});return new u.ToUnicodeMap(r)})}return Promise.resolve(new u.IdentityToUnicodeMap(e.firstChar,e.lastChar))},readToUnicode:function(e){var t=e;return(0,l.isName)(t)?s.CMapFactory.create({encoding:t,fetchBuiltInCMap:this.fetchBuiltInCMap,useCMap:null}).then(function(e){return e instanceof s.IdentityCMap?new u.IdentityToUnicodeMap(0,65535):new u.ToUnicodeMap(e.getMap())}):(0,l.isStream)(t)?s.CMapFactory.create({encoding:t,fetchBuiltInCMap:this.fetchBuiltInCMap,useCMap:null}).then(function(e){if(e instanceof s.IdentityCMap)return new u.IdentityToUnicodeMap(0,65535);var t=new Array(e.length);e.forEach(function(e,r){for(var a=[],i=0;i<r.length;i+=2){var n=r.charCodeAt(i)<<8|r.charCodeAt(i+1);if(55296==(63488&n)){i+=2;var o=r.charCodeAt(i)<<8|r.charCodeAt(i+1);a.push(((1023&n)<<10)+(1023&o)+65536)}else a.push(n)}t[e]=String.fromCharCode.apply(String,a)});return new u.ToUnicodeMap(t)}):Promise.resolve(null)},readCidToGidMap:function(e){for(var t=e.getBytes(),r=[],a=0,i=t.length;a<i;a++){var n=t[a++]<<8|t[a];if(0!==n){r[a>>1]=n}}return r},extractWidths:function(e,t,r){var a,i,n,o,s,c,h,f,d=this.xref,g=[],m=0,p=[];if(r.composite){m=e.has("DW")?e.get("DW"):1e3;if(f=e.get("W"))for(i=0,n=f.length;i<n;i++){c=d.fetchIfRef(f[i++]);h=d.fetchIfRef(f[i]);if(Array.isArray(h))for(o=0,s=h.length;o<s;o++)g[c++]=d.fetchIfRef(h[o]);else{var v=d.fetchIfRef(f[++i]);for(o=c;o<=h;o++)g[o]=v}}if(r.vertical){var b=e.getArray("DW2")||[880,-1e3];a=[b[1],.5*m,b[0]];if(b=e.get("W2"))for(i=0,n=b.length;i<n;i++){c=d.fetchIfRef(b[i++]);h=d.fetchIfRef(b[i]);if(Array.isArray(h))for(o=0,s=h.length;o<s;o++)p[c++]=[d.fetchIfRef(h[o++]),d.fetchIfRef(h[o++]),d.fetchIfRef(h[o])];else{var y=[d.fetchIfRef(b[++i]),d.fetchIfRef(b[++i]),d.fetchIfRef(b[++i])];for(o=c;o<=h;o++)p[o]=y}}}}else{var w=r.firstChar;if(f=e.get("Widths")){o=w;for(i=0,n=f.length;i<n;i++)g[o++]=d.fetchIfRef(f[i]);m=parseFloat(t.get("MissingWidth"))||0}else{var k=e.get("BaseFont");if((0,l.isName)(k)){var S=this.getBaseFontMetrics(k.name);g=this.buildCharCodeToWidth(S.widths,r);m=S.defaultWidth}}}var C=!0,x=m;for(var _ in g){var A=g[_];if(A)if(x){if(x!==A){C=!1;break}}else x=A}C&&(r.flags|=u.FontFlags.FixedPitch);r.defaultWidth=m;r.widths=g;r.defaultVMetrics=a;r.vmetrics=p},isSerifFont:function(e){var t=e.split("-")[0];return t in(0,d.getSerifFonts)()||-1!==t.search(/serif/gi)},getBaseFontMetrics:function(e){var t=0,r=[],a=!1,i=(0,d.getStdFontMap)()[e]||e,n=(0,y.getMetrics)();i in n||(i=this.isSerifFont(e)?"Times-Roman":"Helvetica");var s=n[i];if((0,o.isNum)(s)){t=s;a=!0}else r=s();return{defaultWidth:t,monospace:a,widths:r}},buildCharCodeToWidth:function(e,t){for(var r=Object.create(null),a=t.differences,i=t.defaultEncoding,n=0;n<256;n++)n in a&&e[a[n]]?r[n]=e[a[n]]:n in i&&e[i[n]]&&(r[n]=e[i[n]]);return r},preEvaluateFont:function(e){var t=e,r=e.get("Subtype");if(!(0,l.isName)(r))throw new o.FormatError("invalid font Subtype");var a,i=!1;if("Type0"===r.name){var n=e.get("DescendantFonts");if(!n)throw new o.FormatError("Descendant fonts are not specified");r=(e=Array.isArray(n)?this.xref.fetchIfRef(n[0]):n).get("Subtype");if(!(0,l.isName)(r))throw new o.FormatError("invalid font Subtype");i=!0}var s=e.get("FontDescriptor");if(s){var c=new S.MurmurHash3_64,u=t.getRaw("Encoding");if((0,l.isName)(u))c.update(u.name);else if((0,l.isRef)(u))c.update(u.toString());else if((0,l.isDict)(u))for(var h=u.getKeys(),f=0,d=h.length;f<d;f++){var g=u.getRaw(h[f]);if((0,l.isName)(g))c.update(g.name);else if((0,l.isRef)(g))c.update(g.toString());else if(Array.isArray(g)){for(var m=g.length,p=new Array(m),v=0;v<m;v++){var b=g[v];(0,l.isName)(b)?p[v]=b.name:((0,o.isNum)(b)||(0,l.isRef)(b))&&(p[v]=b.toString())}c.update(p.join())}}var y=e.get("ToUnicode")||t.get("ToUnicode");if((0,l.isStream)(y)){var w=y.str||y;a=w.buffer?new Uint8Array(w.buffer.buffer,0,w.bufferLength):new Uint8Array(w.bytes.buffer,w.start,w.end-w.start);c.update(a)}else(0,l.isName)(y)&&c.update(y.name);var k=e.get("Widths")||t.get("Widths");if(k){a=new Uint8Array(new Uint32Array(k).buffer);c.update(a)}}return{descriptor:s,dict:e,baseDict:t,composite:i,type:r.name,hash:c?c.hexdigest():""}},translateFont:function(e){var t,r=this,a=e.baseDict,i=e.dict,n=e.composite,c=e.descriptor,h=e.type,f=n?65535:255;if(!c){if("Type3"!==h){var g=i.get("BaseFont");if(!(0,l.isName)(g))throw new o.FormatError("Base font is not specified");g=g.name.replace(/[,_]/g,"-");var m=this.getBaseFontMetrics(g),p=g.split("-")[0],v=(this.isSerifFont(p)?u.FontFlags.Serif:0)|(m.monospace?u.FontFlags.FixedPitch:0)|((0,d.getSymbolsFonts)()[p]?u.FontFlags.Symbolic:u.FontFlags.Nonsymbolic);t={type:h,name:g,widths:m.widths,defaultWidth:m.defaultWidth,flags:v,firstChar:0,lastChar:f};return this.extractDataStructures(i,i,t).then(function(e){e.widths=r.buildCharCodeToWidth(m.widths,e);return new u.Font(g,null,e)})}(c=new l.Dict(null)).set("FontName",l.Name.get(h));c.set("FontBBox",i.getArray("FontBBox"))}var b=i.get("FirstChar")||0,y=i.get("LastChar")||f,w=c.get("FontName"),k=i.get("BaseFont");(0,o.isString)(w)&&(w=l.Name.get(w));(0,o.isString)(k)&&(k=l.Name.get(k));if("Type3"!==h){var S=w&&w.name,C=k&&k.name;if(S!==C){(0,o.info)("The FontDescriptor's FontName is \""+S+'" but should be the same as the Font\'s BaseFont "'+C+'"');S&&C&&0===C.indexOf(S)&&(w=k)}}w=w||k;if(!(0,l.isName)(w))throw new o.FormatError("invalid font name");var x,_=c.get("FontFile","FontFile2","FontFile3");if(_&&_.dict){var A=_.dict.get("Subtype");A&&(A=A.name);var P=_.dict.get("Length1"),I=_.dict.get("Length2"),O=_.dict.get("Length3")}t={type:h,name:w.name,subtype:A,file:_,length1:P,length2:I,length3:O,loadedName:a.loadedName,composite:n,wideChars:n,fixedPitch:!1,fontMatrix:i.getArray("FontMatrix")||o.FONT_IDENTITY_MATRIX,firstChar:b||0,lastChar:y||f,bbox:c.getArray("FontBBox"),ascent:c.get("Ascent"),descent:c.get("Descent"),xHeight:c.get("XHeight"),capHeight:c.get("CapHeight"),flags:c.get("Flags"),italicAngle:c.get("ItalicAngle"),isType3Font:!1};if(n){var T=a.get("Encoding");(0,l.isName)(T)&&(t.cidEncoding=T.name);x=s.CMapFactory.create({encoding:T,fetchBuiltInCMap:this.fetchBuiltInCMap,useCMap:null}).then(function(e){t.cMap=e;t.vertical=t.cMap.vertical})}else x=Promise.resolve(void 0);return x.then(function(){return r.extractDataStructures(i,a,t)}).then(function(e){r.extractWidths(i,c,e);"Type3"===h&&(e.isType3Font=!0);return new u.Font(w.name,_,e)})}};return r}(),A=function(){function e(e,t,r){this.loadedName=e;this.font=t;this.dict=r;this.type3Loaded=null;this.sent=!1}e.prototype={send:function(e){if(!this.sent){var t=this.font.exportData();e.send("commonobj",[this.loadedName,"Font",t]);this.sent=!0}},loadType3Data:function(e,t,r,a){if(!this.font.isType3Font)throw new Error("Must be a Type3 font.");if(this.type3Loaded)return this.type3Loaded;var i=Object.create(e.options);i.ignoreErrors=!1;for(var n=e.clone(i),s=this.font,c=Promise.resolve(),l=this.dict.get("CharProcs"),u=this.dict.get("Resources")||t,h=l.getKeys(),f=Object.create(null),d=function(){var e=h[g];c=c.then(function(){var t=l.get(e),i=new C.OperatorList;return n.getOperatorList({stream:t,task:a,resources:u,operatorList:i}).then(function(){f[e]=i.getIR();r.addDependencies(i.dependencies)}).catch(function(t){(0,o.warn)('Type3 font resource "'+e+'" is not available.');var r=new C.OperatorList;f[e]=r.getIR()})})},g=0,m=h.length;g<m;++g)d();this.type3Loaded=c.then(function(){s.charProcOperatorList=f});return this.type3Loaded}};return e}(),P=function(){function e(e){this.state=e;this.stateStack=[]}e.prototype={save:function(){var e=this.state;this.stateStack.push(this.state);this.state=e.clone()},restore:function(){var e=this.stateStack.pop();e&&(this.state=e)},transform:function(e){this.state.ctm=o.Util.transform(this.state.ctm,e)}};return e}(),I=function(){function e(){this.ctm=new Float32Array(o.IDENTITY_MATRIX);this.fontName=null;this.fontSize=0;this.font=null;this.fontMatrix=o.FONT_IDENTITY_MATRIX;this.textMatrix=o.IDENTITY_MATRIX.slice();this.textLineMatrix=o.IDENTITY_MATRIX.slice();this.charSpacing=0;this.wordSpacing=0;this.leading=0;this.textHScale=1;this.textRise=0}e.prototype={setTextMatrix:function(e,t,r,a,i,n){var o=this.textMatrix;o[0]=e;o[1]=t;o[2]=r;o[3]=a;o[4]=i;o[5]=n},setTextLineMatrix:function(e,t,r,a,i,n){var o=this.textLineMatrix;o[0]=e;o[1]=t;o[2]=r;o[3]=a;o[4]=i;o[5]=n},translateTextMatrix:function(e,t){var r=this.textMatrix;r[4]=r[0]*e+r[2]*t+r[4];r[5]=r[1]*e+r[3]*t+r[5]},translateTextLineMatrix:function(e,t){var r=this.textLineMatrix;r[4]=r[0]*e+r[2]*t+r[4];r[5]=r[1]*e+r[3]*t+r[5]},calcTextLineMatrixAdvance:function(e,t,r,a,i,n){var o=this.font;if(!o)return null;var s=this.textLineMatrix;if(e!==s[0]||t!==s[1]||r!==s[2]||a!==s[3])return null;var c=i-s[4],l=n-s[5];if(o.vertical&&0!==c||!o.vertical&&0!==l)return null;var u,h,f=e*a-t*r;if(o.vertical){u=-l*r/f;h=l*e/f}else{u=c*a/f;h=-c*t/f}return{width:u,height:h,value:o.vertical?h:u}},calcRenderMatrix:function(e){var t=[this.fontSize*this.textHScale,0,0,this.fontSize,0,this.textRise];return o.Util.transform(e,o.Util.transform(this.textMatrix,t))},carriageReturn:function(){this.translateTextLineMatrix(0,-this.leading);this.textMatrix=this.textLineMatrix.slice()},clone:function(){var e=Object.create(this);e.textMatrix=this.textMatrix.slice();e.textLineMatrix=this.textLineMatrix.slice();e.fontMatrix=this.fontMatrix.slice();return e}};return e}(),O=function(){function e(){this.ctm=new Float32Array(o.IDENTITY_MATRIX);this.font=null;this.textRenderingMode=o.TextRenderingMode.FILL;this.fillColorSpace=v.ColorSpace.singletons.gray;this.strokeColorSpace=v.ColorSpace.singletons.gray}e.prototype={clone:function(){return Object.create(this)}};return e}(),T=function(){var e=(0,o.getLookupTableFactory)(function(e){e.w={id:o.OPS.setLineWidth,numArgs:1,variableArgs:!1};e.J={id:o.OPS.setLineCap,numArgs:1,variableArgs:!1};e.j={id:o.OPS.setLineJoin,numArgs:1,variableArgs:!1};e.M={id:o.OPS.setMiterLimit,numArgs:1,variableArgs:!1};e.d={id:o.OPS.setDash,numArgs:2,variableArgs:!1};e.ri={id:o.OPS.setRenderingIntent,numArgs:1,variableArgs:!1};e.i={id:o.OPS.setFlatness,numArgs:1,variableArgs:!1};e.gs={id:o.OPS.setGState,numArgs:1,variableArgs:!1};e.q={id:o.OPS.save,numArgs:0,variableArgs:!1};e.Q={id:o.OPS.restore,numArgs:0,variableArgs:!1};e.cm={id:o.OPS.transform,numArgs:6,variableArgs:!1};e.m={id:o.OPS.moveTo,numArgs:2,variableArgs:!1};e.l={id:o.OPS.lineTo,numArgs:2,variableArgs:!1};e.c={id:o.OPS.curveTo,numArgs:6,variableArgs:!1};e.v={id:o.OPS.curveTo2,numArgs:4,variableArgs:!1};e.y={id:o.OPS.curveTo3,numArgs:4,variableArgs:!1};e.h={id:o.OPS.closePath,numArgs:0,variableArgs:!1};e.re={id:o.OPS.rectangle,numArgs:4,variableArgs:!1};e.S={id:o.OPS.stroke,numArgs:0,variableArgs:!1};e.s={id:o.OPS.closeStroke,numArgs:0,variableArgs:!1};e.f={id:o.OPS.fill,numArgs:0,variableArgs:!1};e.F={id:o.OPS.fill,numArgs:0,variableArgs:!1};e["f*"]={id:o.OPS.eoFill,numArgs:0,variableArgs:!1};e.B={id:o.OPS.fillStroke,numArgs:0,variableArgs:!1};e["B*"]={id:o.OPS.eoFillStroke,numArgs:0,variableArgs:!1};e.b={id:o.OPS.closeFillStroke,numArgs:0,variableArgs:!1};e["b*"]={id:o.OPS.closeEOFillStroke,numArgs:0,variableArgs:!1};e.n={id:o.OPS.endPath,numArgs:0,variableArgs:!1};e.W={id:o.OPS.clip,numArgs:0,variableArgs:!1};e["W*"]={id:o.OPS.eoClip,numArgs:0,variableArgs:!1};e.BT={id:o.OPS.beginText,numArgs:0,variableArgs:!1};e.ET={id:o.OPS.endText,numArgs:0,variableArgs:!1};e.Tc={id:o.OPS.setCharSpacing,numArgs:1,variableArgs:!1};e.Tw={id:o.OPS.setWordSpacing,numArgs:1,variableArgs:!1};e.Tz={id:o.OPS.setHScale,numArgs:1,variableArgs:!1};e.TL={id:o.OPS.setLeading,numArgs:1,variableArgs:!1};e.Tf={id:o.OPS.setFont,numArgs:2,variableArgs:!1};e.Tr={id:o.OPS.setTextRenderingMode,numArgs:1,variableArgs:!1};e.Ts={id:o.OPS.setTextRise,numArgs:1,variableArgs:!1};e.Td={id:o.OPS.moveText,numArgs:2,variableArgs:!1};e.TD={id:o.OPS.setLeadingMoveText,numArgs:2,variableArgs:!1};e.Tm={id:o.OPS.setTextMatrix,numArgs:6,variableArgs:!1};e["T*"]={id:o.OPS.nextLine,numArgs:0,variableArgs:!1};e.Tj={id:o.OPS.showText,numArgs:1,variableArgs:!1};e.TJ={id:o.OPS.showSpacedText,numArgs:1,variableArgs:!1};e["'"]={id:o.OPS.nextLineShowText,numArgs:1,variableArgs:!1};e['"']={id:o.OPS.nextLineSetSpacingShowText,numArgs:3,variableArgs:!1};e.d0={id:o.OPS.setCharWidth,numArgs:2,variableArgs:!1};e.d1={id:o.OPS.setCharWidthAndBounds,numArgs:6,variableArgs:!1};e.CS={id:o.OPS.setStrokeColorSpace,numArgs:1,variableArgs:!1};e.cs={id:o.OPS.setFillColorSpace,numArgs:1,variableArgs:!1};e.SC={id:o.OPS.setStrokeColor,numArgs:4,variableArgs:!0};e.SCN={id:o.OPS.setStrokeColorN,numArgs:33,variableArgs:!0};e.sc={id:o.OPS.setFillColor,numArgs:4,variableArgs:!0};e.scn={id:o.OPS.setFillColorN,numArgs:33,variableArgs:!0};e.G={id:o.OPS.setStrokeGray,numArgs:1,variableArgs:!1};e.g={id:o.OPS.setFillGray,numArgs:1,variableArgs:!1};e.RG={id:o.OPS.setStrokeRGBColor,numArgs:3,variableArgs:!1};e.rg={id:o.OPS.setFillRGBColor,numArgs:3,variableArgs:!1};e.K={id:o.OPS.setStrokeCMYKColor,numArgs:4,variableArgs:!1};e.k={id:o.OPS.setFillCMYKColor,numArgs:4,variableArgs:!1};e.sh={id:o.OPS.shadingFill,numArgs:1,variableArgs:!1};e.BI={id:o.OPS.beginInlineImage,numArgs:0,variableArgs:!1};e.ID={id:o.OPS.beginImageData,numArgs:0,variableArgs:!1};e.EI={id:o.OPS.endInlineImage,numArgs:1,variableArgs:!1};e.Do={id:o.OPS.paintXObject,numArgs:1,variableArgs:!1};e.MP={id:o.OPS.markPoint,numArgs:1,variableArgs:!1};e.DP={id:o.OPS.markPointProps,numArgs:2,variableArgs:!1};e.BMC={id:o.OPS.beginMarkedContent,numArgs:1,variableArgs:!1};e.BDC={id:o.OPS.beginMarkedContentProps,numArgs:2,variableArgs:!1};e.EMC={id:o.OPS.endMarkedContent,numArgs:0,variableArgs:!1};e.BX={id:o.OPS.beginCompat,numArgs:0,variableArgs:!1};e.EX={id:o.OPS.endCompat,numArgs:0,variableArgs:!1};e.BM=null;e.BD=null;e.true=null;e.fa=null;e.fal=null;e.fals=null;e.false=null;e.nu=null;e.nul=null;e.null=null});function t(t,r,a){this.opMap=e();this.parser=new m.Parser(new m.Lexer(t,this.opMap),!1,r);this.stateManager=a;this.nonProcessedArgs=[];this._numInvalidPathOPS=0}t.prototype={get savedStatesDepth(){return this.stateManager.stateStack.length},read:function(e){for(var t=e.args;;){var r=this.parser.getObj();if((0,l.isCmd)(r)){var a=r.cmd,i=this.opMap[a];if(!i){(0,o.warn)('Unknown command "'+a+'".');continue}var n=i.id,s=i.numArgs,c=null!==t?t.length:0;if(i.variableArgs)c>s&&(0,o.info)("Command "+a+": expected [0, "+s+"] args, but received "+c+" args.");else{if(c!==s){for(var u=this.nonProcessedArgs;c>s;){u.push(t.shift());c--}for(;c<s&&0!==u.length;){null===t&&(t=[]);t.unshift(u.pop());c++}}if(c<s){var h="command "+a+": expected "+s+" args, but received "+c+" args.";if(n>=o.OPS.moveTo&&n<=o.OPS.endPath&&++this._numInvalidPathOPS>20)throw new o.FormatError("Invalid "+h);(0,o.warn)("Skipping "+h);null!==t&&(t.length=0);continue}}this.preprocessCommand(n,t);e.fn=n;e.args=t;return!0}if((0,l.isEOF)(r))return!1;if(null!==r){null===t&&(t=[]);t.push(r);if(t.length>33)throw new o.FormatError("Too many arguments")}}},preprocessCommand:function(e,t){switch(0|e){case o.OPS.save:this.stateManager.save();break;case o.OPS.restore:this.stateManager.restore();break;case o.OPS.transform:this.stateManager.transform(t)}}};return t}();t.PartialEvaluator=_},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CMapFactory=t.IdentityCMap=t.CMap=void 0;var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),i=r(2),n=r(138),o=r(139),s=r(140);function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var l=["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"],u=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];c(this,e);this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.name="";this.vertical=!1;this.useCMap=null;this.builtInCMap=t}a(e,[{key:"addCodespaceRange",value:function(e,t,r){this.codespaceRanges[e-1].push(t,r);this.numCodespaceRanges++}},{key:"mapCidRange",value:function(e,t,r){for(;e<=t;)this._map[e++]=r++}},{key:"mapBfRange",value:function(e,t,r){for(var a=r.length-1;e<=t;){this._map[e++]=r;r=r.substring(0,a)+String.fromCharCode(r.charCodeAt(a)+1)}}},{key:"mapBfRangeToArray",value:function(e,t,r){for(var a=0,i=r.length;e<=t&&a<i;){this._map[e]=r[a++];++e}}},{key:"mapOne",value:function(e,t){this._map[e]=t}},{key:"lookup",value:function(e){return this._map[e]}},{key:"contains",value:function(e){return void 0!==this._map[e]}},{key:"forEach",value:function(e){var t=this._map,r=t.length;if(r<=65536)for(var a=0;a<r;a++)void 0!==t[a]&&e(a,t[a]);else for(var i in t)e(i,t[i])}},{key:"charCodeOf",value:function(e){var t=this._map;if(t.length<=65536)return t.indexOf(e);for(var r in t)if(t[r]===e)return 0|r;return-1}},{key:"getMap",value:function(){return this._map}},{key:"readCharCode",value:function(e,t,r){for(var a=0,i=this.codespaceRanges,n=0,o=i.length;n<o;n++){a=(a<<8|e.charCodeAt(t+n))>>>0;for(var s=i[n],c=0,l=s.length;c<l;){var u=s[c++],h=s[c++];if(a>=u&&a<=h){r.charcode=a;r.length=n+1;return}}}r.charcode=0;r.length=1}},{key:"length",get:function(){return this._map.length}},{key:"isIdentityCMap",get:function(){if("Identity-H"!==this.name&&"Identity-V"!==this.name)return!1;if(65536!==this._map.length)return!1;for(var e=0;e<65536;e++)if(this._map[e]!==e)return!1;return!0}}]);return e}(),h=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,u);function t(e,r){c(this,t);var a=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));a.vertical=e;a.addCodespaceRange(r,0,65535);return a}a(t,[{key:"mapCidRange",value:function(e,t,r){(0,i.unreachable)("should not call mapCidRange")}},{key:"mapBfRange",value:function(e,t,r){(0,i.unreachable)("should not call mapBfRange")}},{key:"mapBfRangeToArray",value:function(e,t,r){(0,i.unreachable)("should not call mapBfRangeToArray")}},{key:"mapOne",value:function(e,t){(0,i.unreachable)("should not call mapCidOne")}},{key:"lookup",value:function(e){return Number.isInteger(e)&&e<=65535?e:void 0}},{key:"contains",value:function(e){return Number.isInteger(e)&&e<=65535}},{key:"forEach",value:function(e){for(var t=0;t<=65535;t++)e(t,t)}},{key:"charCodeOf",value:function(e){return Number.isInteger(e)&&e<=65535?e:-1}},{key:"getMap",value:function(){for(var e=new Array(65536),t=0;t<=65535;t++)e[t]=t;return e}},{key:"length",get:function(){return 65536}},{key:"isIdentityCMap",get:function(){(0,i.unreachable)("should not access .isIdentityCMap")}}]);return t}(),f=function(){function e(e,t){for(var r=0,a=0;a<=t;a++)r=r<<8|e[a];return r>>>0}function t(e,t){return 1===t?String.fromCharCode(e[0],e[1]):3===t?String.fromCharCode(e[0],e[1],e[2],e[3]):String.fromCharCode.apply(null,e.subarray(0,t+1))}function r(e,t,r){for(var a=0,i=r;i>=0;i--){a+=e[i]+t[i];e[i]=255&a;a>>=8}}function a(e,t){for(var r=1,a=t;a>=0&&r>0;a--){r+=e[a];e[a]=255&r;r>>=8}}var n=16,o=19;function s(e){this.buffer=e;this.pos=0;this.end=e.length;this.tmpBuf=new Uint8Array(o)}s.prototype={readByte:function(){return this.pos>=this.end?-1:this.buffer[this.pos++]},readNumber:function(){var e,t=0;do{var r=this.readByte();if(r<0)throw new i.FormatError("unexpected EOF in bcmap");e=!(128&r);t=t<<7|127&r}while(!e);return t},readSigned:function(){var e=this.readNumber();return 1&e?~(e>>>1):e>>>1},readHex:function(e,t){e.set(this.buffer.subarray(this.pos,this.pos+t+1));this.pos+=t+1},readHexNumber:function(e,t){var r,a=this.tmpBuf,n=0;do{var o=this.readByte();if(o<0)throw new i.FormatError("unexpected EOF in bcmap");r=!(128&o);a[n++]=127&o}while(!r);for(var s=t,c=0,l=0;s>=0;){for(;l<8&&a.length>0;){c=a[--n]<<l|c;l+=7}e[s]=255&c;s--;c>>=8;l-=8}},readHexSigned:function(e,t){this.readHexNumber(e,t);for(var r=1&e[t]?255:0,a=0,i=0;i<=t;i++){a=(1&a)<<8|e[i];e[i]=a>>1^r}},readString:function(){for(var e=this.readNumber(),t="",r=0;r<e;r++)t+=String.fromCharCode(this.readNumber());return t}};function c(){}c.prototype={process:function(i,o,c){return new Promise(function(l,u){var h=new s(i),f=h.readByte();o.vertical=!!(1&f);for(var d,g,m=null,p=new Uint8Array(n),v=new Uint8Array(n),b=new Uint8Array(n),y=new Uint8Array(n),w=new Uint8Array(n);(g=h.readByte())>=0;){var k=g>>5;if(7!==k){var S=!!(16&g),C=15&g;if(C+1>n)throw new Error("processBinaryCMap: Invalid dataSize.");var x,_=h.readNumber();switch(k){case 0:h.readHex(p,C);h.readHexNumber(v,C);r(v,p,C);o.addCodespaceRange(C+1,e(p,C),e(v,C));for(x=1;x<_;x++){a(v,C);h.readHexNumber(p,C);r(p,v,C);h.readHexNumber(v,C);r(v,p,C);o.addCodespaceRange(C+1,e(p,C),e(v,C))}break;case 1:h.readHex(p,C);h.readHexNumber(v,C);r(v,p,C);h.readNumber();for(x=1;x<_;x++){a(v,C);h.readHexNumber(p,C);r(p,v,C);h.readHexNumber(v,C);r(v,p,C);h.readNumber()}break;case 2:h.readHex(b,C);d=h.readNumber();o.mapOne(e(b,C),d);for(x=1;x<_;x++){a(b,C);if(!S){h.readHexNumber(w,C);r(b,w,C)}d=h.readSigned()+(d+1);o.mapOne(e(b,C),d)}break;case 3:h.readHex(p,C);h.readHexNumber(v,C);r(v,p,C);d=h.readNumber();o.mapCidRange(e(p,C),e(v,C),d);for(x=1;x<_;x++){a(v,C);if(S)p.set(v);else{h.readHexNumber(p,C);r(p,v,C)}h.readHexNumber(v,C);r(v,p,C);d=h.readNumber();o.mapCidRange(e(p,C),e(v,C),d)}break;case 4:h.readHex(b,1);h.readHex(y,C);o.mapOne(e(b,1),t(y,C));for(x=1;x<_;x++){a(b,1);if(!S){h.readHexNumber(w,1);r(b,w,1)}a(y,C);h.readHexSigned(w,C);r(y,w,C);o.mapOne(e(b,1),t(y,C))}break;case 5:h.readHex(p,1);h.readHexNumber(v,1);r(v,p,1);h.readHex(y,C);o.mapBfRange(e(p,1),e(v,1),t(y,C));for(x=1;x<_;x++){a(v,1);if(S)p.set(v);else{h.readHexNumber(p,1);r(p,v,1)}h.readHexNumber(v,1);r(v,p,1);h.readHex(y,C);o.mapBfRange(e(p,1),e(v,1),t(y,C))}break;default:u(new Error("processBinaryCMap: Unknown type: "+k));return}}else switch(31&g){case 0:h.readString();break;case 1:m=h.readString()}}l(m?c(m):o)})}};return c}(),d=function(){function e(e){for(var t=0,r=0;r<e.length;r++)t=t<<8|e.charCodeAt(r);return t>>>0}function t(e){if(!(0,i.isString)(e))throw new i.FormatError("Malformed CMap: expected string.")}function r(e){if(!Number.isInteger(e))throw new i.FormatError("Malformed CMap: expected int.")}function a(r,a){for(;;){var i=a.getObj();if((0,n.isEOF)(i))break;if((0,n.isCmd)(i,"endbfchar"))return;t(i);var o=e(i);t(i=a.getObj());var s=i;r.mapOne(o,s)}}function c(r,a){for(;;){var o=a.getObj();if((0,n.isEOF)(o))break;if((0,n.isCmd)(o,"endbfrange"))return;t(o);var s=e(o);t(o=a.getObj());var c=e(o);o=a.getObj();if(Number.isInteger(o)||(0,i.isString)(o)){var l=Number.isInteger(o)?String.fromCharCode(o):o;r.mapBfRange(s,c,l)}else{if(!(0,n.isCmd)(o,"["))break;o=a.getObj();for(var u=[];!(0,n.isCmd)(o,"]")&&!(0,n.isEOF)(o);){u.push(o);o=a.getObj()}r.mapBfRangeToArray(s,c,u)}}throw new i.FormatError("Invalid bf range.")}function d(a,i){for(;;){var o=i.getObj();if((0,n.isEOF)(o))break;if((0,n.isCmd)(o,"endcidchar"))return;t(o);var s=e(o);r(o=i.getObj());var c=o;a.mapOne(s,c)}}function g(a,i){for(;;){var o=i.getObj();if((0,n.isEOF)(o))break;if((0,n.isCmd)(o,"endcidrange"))return;t(o);var s=e(o);t(o=i.getObj());var c=e(o);r(o=i.getObj());var l=o;a.mapCidRange(s,c,l)}}function m(t,r){for(;;){var a=r.getObj();if((0,n.isEOF)(a))break;if((0,n.isCmd)(a,"endcodespacerange"))return;if(!(0,i.isString)(a))break;var o=e(a);a=r.getObj();if(!(0,i.isString)(a))break;var s=e(a);t.addCodespaceRange(a.length,o,s)}throw new i.FormatError("Invalid codespace range.")}function p(e,t){var r=t.getObj();Number.isInteger(r)&&(e.vertical=!!r)}function v(e,t){var r=t.getObj();(0,n.isName)(r)&&(0,i.isString)(r.name)&&(e.name=r.name)}function b(e,t,r,o){var s,l;e:for(;;)try{var u=t.getObj();if((0,n.isEOF)(u))break;if((0,n.isName)(u)){"WMode"===u.name?p(e,t):"CMapName"===u.name&&v(e,t);s=u}else if((0,n.isCmd)(u))switch(u.cmd){case"endcmap":break e;case"usecmap":(0,n.isName)(s)&&(l=s.name);break;case"begincodespacerange":m(e,t);break;case"beginbfchar":a(e,t);break;case"begincidchar":d(e,t);break;case"beginbfrange":c(e,t);break;case"begincidrange":g(e,t)}}catch(e){if(e instanceof i.MissingDataException)throw e;(0,i.warn)("Invalid cMap data: "+e);continue}!o&&l&&(o=l);return o?y(e,r,o):Promise.resolve(e)}function y(e,t,r){return w(r,t).then(function(t){e.useCMap=t;if(0===e.numCodespaceRanges){for(var r=e.useCMap.codespaceRanges,a=0;a<r.length;a++)e.codespaceRanges[a]=r[a].slice();e.numCodespaceRanges=e.useCMap.numCodespaceRanges}e.useCMap.forEach(function(t,r){e.contains(t)||e.mapOne(t,e.useCMap.lookup(t))});return e})}function w(e,t){return"Identity-H"===e?Promise.resolve(new h(!1,2)):"Identity-V"===e?Promise.resolve(new h(!0,2)):l.includes(e)?t?t(e).then(function(e){var r=e.cMapData,a=e.compressionType,n=new u(!0);if(a===i.CMapCompressionType.BINARY)return(new f).process(r,n,function(e){return y(n,t,e)});if(a===i.CMapCompressionType.NONE){var c=new o.Lexer(new s.Stream(r));return b(n,c,t,null)}return Promise.reject(new Error("TODO: Only BINARY/NONE CMap compression is currently supported."))}):Promise.reject(new Error("Built-in CMap parameters are not provided.")):Promise.reject(new Error("Unknown CMap name: "+e))}return{create:function(e){var t=e.encoding,r=e.fetchBuiltInCMap,a=e.useCMap;if((0,n.isName)(t))return w(t.name,r);if((0,n.isStream)(t)){return b(new u,new o.Lexer(t),r,a).then(function(e){return e.isIdentityCMap?w(e.name,r):e})}return Promise.reject(new Error("Encoding required."))}}}();t.CMap=u;t.IdentityCMap=h;t.CMapFactory=d},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getFontType=t.IdentityToUnicodeMap=t.ToUnicodeMap=t.FontFlags=t.Font=t.ErrorFont=t.SEAC_ANALYSIS_ENABLED=void 0;var a=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,i=!1,n=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){r.push(o.value);if(t&&r.length===t)break}}catch(e){i=!0;n=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw n}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(2),n=r(157),o=r(160),s=r(159),c=r(161),l=r(162),u=r(163),h=r(155),f=r(140),d=r(164),g=[[57344,63743],[1048576,1114109]],m=1e3,p=!0,v={FixedPitch:1,Serif:2,Symbolic:4,Script:8,Nonsymbolic:32,Italic:64,AllCap:65536,SmallCap:131072,ForceBold:262144},b=[".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"];function y(e){if(e.fontMatrix&&e.fontMatrix[0]!==i.FONT_IDENTITY_MATRIX[0]){var t=.001/e.fontMatrix[0],r=e.widths;for(var a in r)r[a]*=t;e.defaultWidth*=t}}function w(e,t){switch(e){case"Type1":return"Type1C"===t?i.FontType.TYPE1C:i.FontType.TYPE1;case"CIDFontType0":return"CIDFontType0C"===t?i.FontType.CIDFONTTYPE0C:i.FontType.CIDFONTTYPE0;case"OpenType":return i.FontType.OPENTYPE;case"TrueType":return i.FontType.TRUETYPE;case"CIDFontType2":return i.FontType.CIDFONTTYPE2;case"MMType1":return i.FontType.MMTYPE1;case"Type0":return i.FontType.TYPE0;default:return i.FontType.UNKNOWN}}function k(e,t){if(void 0!==t[e])return e;var r=(0,l.getUnicodeForGlyph)(e,t);if(-1!==r)for(var a in t)if(t[a]===r)return a;(0,i.info)("Unable to recover a standard glyph name for: "+e);return e}var S=function(){function e(e,t,r,a,i,n,o,s){this.fontChar=e;this.unicode=t;this.accent=r;this.width=a;this.vmetric=i;this.operatorListId=n;this.isSpace=o;this.isInFont=s}e.prototype.matchesForCache=function(e,t,r,a,i,n,o,s){return this.fontChar===e&&this.unicode===t&&this.accent===r&&this.width===a&&this.vmetric===i&&this.operatorListId===n&&this.isSpace===o&&this.isInFont===s};return e}(),C=function(){function e(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this._map=e}e.prototype={get length(){return this._map.length},forEach:function(e){for(var t in this._map)e(t,this._map[t].charCodeAt(0))},has:function(e){return void 0!==this._map[e]},get:function(e){return this._map[e]},charCodeOf:function(e){var t=this._map;if(t.length<=65536)return t.indexOf(e);for(var r in t)if(t[r]===e)return 0|r;return-1},amend:function(e){for(var t in e)this._map[t]=e[t]}};return e}(),x=function(){function e(e,t){this.firstChar=e;this.lastChar=t}e.prototype={get length(){return this.lastChar+1-this.firstChar},forEach:function(e){for(var t=this.firstChar,r=this.lastChar;t<=r;t++)e(t,t)},has:function(e){return this.firstChar<=e&&e<=this.lastChar},get:function(e){if(this.firstChar<=e&&e<=this.lastChar)return String.fromCharCode(e)},charCodeOf:function(e){return Number.isInteger(e)&&e>=this.firstChar&&e<=this.lastChar?e:-1},amend:function(e){(0,i.unreachable)("Should not call amend()")}};return e}(),_=function(){function e(e,t,r){e[t]=r>>8&255;e[t+1]=255&r}function t(e,t,r){e[t]=r>>24&255;e[t+1]=r>>16&255;e[t+2]=r>>8&255;e[t+3]=255&r}function r(e,t,r){var a,i;if(r instanceof Uint8Array)e.set(r,t);else if("string"==typeof r)for(a=0,i=r.length;a<i;a++)e[t++]=255&r.charCodeAt(a);else for(a=0,i=r.length;a<i;a++)e[t++]=255&r[a]}function a(e){this.sfnt=e;this.tables=Object.create(null)}a.getSearchParams=function(e,t){for(var r=1,a=0;(r^e)>r;){r<<=1;a++}var i=r*t;return{range:i,entry:a,rangeShift:t*e-i}};a.prototype={toArray:function(){var n=this.sfnt,o=this.tables,s=Object.keys(o);s.sort();var c,l,u,h,f,d=s.length,g=12+16*d,m=[g];for(c=0;c<d;c++){g+=((h=o[s[c]]).length+3&-4)>>>0;m.push(g)}var p=new Uint8Array(g);for(c=0;c<d;c++){h=o[s[c]];r(p,m[c],h)}"true"===n&&(n=(0,i.string32)(65536));p[0]=255&n.charCodeAt(0);p[1]=255&n.charCodeAt(1);p[2]=255&n.charCodeAt(2);p[3]=255&n.charCodeAt(3);e(p,4,d);var v=a.getSearchParams(d,16);e(p,6,v.range);e(p,8,v.entry);e(p,10,v.rangeShift);g=12;for(c=0;c<d;c++){f=s[c];p[g]=255&f.charCodeAt(0);p[g+1]=255&f.charCodeAt(1);p[g+2]=255&f.charCodeAt(2);p[g+3]=255&f.charCodeAt(3);var b=0;for(l=m[c],u=m[c+1];l<u;l+=4){b=b+(0,i.readUint32)(p,l)>>>0}t(p,g+4,b);t(p,g+8,m[c]);t(p,g+12,o[f].length);g+=16}return p},addTable:function(e,t){if(e in this.tables)throw new Error("Table "+e+" already exists");this.tables[e]=t}};return a}(),A=function(){function e(e,t,r){var n;this.name=e;this.loadedName=r.loadedName;this.isType3Font=r.isType3Font;this.sizes=[];this.missingFile=!1;this.glyphCache=Object.create(null);this.isSerifFont=!!(r.flags&v.Serif);this.isSymbolicFont=!!(r.flags&v.Symbolic);this.isMonospace=!!(r.flags&v.FixedPitch);var o=r.type,s=r.subtype;this.type=o;this.subtype=s;this.fallbackName=this.isMonospace?"monospace":this.isSerifFont?"serif":"sans-serif";this.differences=r.differences;this.widths=r.widths;this.defaultWidth=r.defaultWidth;this.composite=r.composite;this.wideChars=r.wideChars;this.cMap=r.cMap;this.ascent=r.ascent/m;this.descent=r.descent/m;this.fontMatrix=r.fontMatrix;this.bbox=r.bbox;this.defaultEncoding=r.defaultEncoding;this.toUnicode=r.toUnicode;this.fallbackToUnicode=r.fallbackToUnicode||new C;this.toFontChar=[];if("Type3"!==r.type){this.cidEncoding=r.cidEncoding;this.vertical=r.vertical;if(this.vertical){this.vmetrics=r.vmetrics;this.defaultVMetrics=r.defaultVMetrics}if(t&&!t.isEmpty){var c=function(e,t){var r=t.type,a=t.subtype,n=t.composite,o=void 0,s=void 0;if(function(e){var t=e.peekBytes(4);return 65536===(0,i.readUint32)(t,0)||"true"===(0,i.bytesToString)(t)}(e)||I(e))o=n?"CIDFontType2":"TrueType";else if(function(e){var t=e.peekBytes(4);return"OTTO"===(0,i.bytesToString)(t)}(e))o=n?"CIDFontType2":"OpenType";else if(function(e){var t=e.peekBytes(2);if(37===t[0]&&33===t[1])return!0;if(128===t[0]&&1===t[1])return!0;return!1}(e))o=n?"CIDFontType0":"MMType1"===r?"MMType1":"Type1";else if(function(e){var t=e.peekBytes(4);if(t[0]>=1&&t[3]>=1&&t[3]<=4)return!0;return!1}(e))if(n){o="CIDFontType0";s="CIDFontType0C"}else{o="MMType1"===r?"MMType1":"Type1";s="Type1C"}else{(0,i.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");o=r;s=a}return[o,s]}(t,r),l=a(c,2);o=l[0];s=l[1];o===this.type&&s===this.subtype||(0,i.info)("Inconsistent font file Type/SubType, expected: "+this.type+"/"+this.subtype+" but found: "+o+"/"+s+".");try{var u;switch(o){case"MMType1":(0,i.info)("MMType1 font ("+e+"), falling back to Type1.");case"Type1":case"CIDFontType0":this.mimetype="font/opentype";var h="Type1C"===s||"CIDFontType0C"===s?new T(t,r):new O(e,t,r);y(r);u=this.convert(e,h,r);break;case"OpenType":case"TrueType":case"CIDFontType2":this.mimetype="font/opentype";u=this.checkAndRepair(e,t,r);if(this.isOpenType){y(r);o="OpenType"}break;default:throw new i.FormatError("Font "+o+" is not supported")}}catch(e){(0,i.warn)(e);this.fallbackToSystemFont();return}this.data=u;this.fontType=w(o,s);this.fontMatrix=r.fontMatrix;this.widths=r.widths;this.defaultWidth=r.defaultWidth;this.toUnicode=r.toUnicode;this.encoding=r.baseEncoding;this.seacMap=r.seacMap}else{t&&(0,i.warn)('Font file is empty in "'+e+'" ('+this.loadedName+")");this.fallbackToSystemFont()}}else{for(n=0;n<256;n++)this.toFontChar[n]=this.differences[n]||r.defaultEncoding[n];this.fontType=i.FontType.TYPE3}}e.getFontID=(t=1,function(){return String(t++)});var t;function r(e,t){return(e<<8)+t}function d(e,t){var r=(e<<8)+t;return 32768&r?r-65536:r}function A(e){return String.fromCharCode(e>>8&255,255&e)}function P(e){e=e>32767?32767:e<-32768?-32768:e;return String.fromCharCode(e>>8&255,255&e)}function I(e){var t=e.peekBytes(4);return"ttcf"===(0,i.bytesToString)(t)}function E(e,t,r){for(var a,i=[],n=0,o=e.length;n<o;n++)-1!==(a=(0,l.getUnicodeForGlyph)(e[n],t))&&(i[n]=a);for(var s in r)-1!==(a=(0,l.getUnicodeForGlyph)(r[s],t))&&(i[+s]=a);return i}function F(e,t,r){var a=Object.create(null),n=[],o=0,s=g[o][0],c=g[o][1];for(var l in e){var u=e[l|=0];if(t(u)){if(s>c){if(++o>=g.length){(0,i.warn)("Ran out of space in font private use area.");break}s=g[o][0];c=g[o][1]}var h=s++;0===u&&(u=r);a[h]=u;n[l]=h}}return{toFontChar:n,charCodeToGlyphId:a,nextAvailableFontCharCode:s}}function R(e,t){var r,a,n,o,s=function(e,t){var r=[];for(var a in e)e[a]>=t||r.push({fontCharCode:0|a,glyphId:e[a]});0===r.length&&r.push({fontCharCode:0,glyphId:0});r.sort(function(e,t){return e.fontCharCode-t.fontCharCode});for(var i=[],n=r.length,o=0;o<n;){var s=r[o].fontCharCode,c=[r[o].glyphId];++o;for(var l=s;o<n&&l+1===r[o].fontCharCode;){c.push(r[o].glyphId);++o;if(65535==++l)break}i.push([s,l,c])}return i}(e,t),c=s[s.length-1][1]>65535?2:1,l="\0\0"+A(c)+"\0\0"+(0,i.string32)(4+8*c);for(r=s.length-1;r>=0&&!(s[r][0]<=65535);--r);var u=r+1;s[r][0]<65535&&65535===s[r][1]&&(s[r][1]=65534);var h,f,d,g,m=s[r][1]<65535?1:0,p=u+m,v=_.getSearchParams(p,2),b="",y="",w="",k="",S="",C=0;for(r=0,a=u;r<a;r++){f=(h=s[r])[0];d=h[1];b+=A(f);y+=A(d);var x=!0;for(n=1,o=(g=h[2]).length;n<o;++n)if(g[n]!==g[n-1]+1){x=!1;break}if(x){w+=A(g[0]-f&65535);k+=A(0)}else{var P=2*(p-r)+2*C;C+=d-f+1;w+=A(0);k+=A(P);for(n=0,o=g.length;n<o;++n)S+=A(g[n])}}if(m>0){y+="ÿÿ";b+="ÿÿ";w+="\0";k+="\0\0"}var I="\0\0"+A(2*p)+A(v.range)+A(v.entry)+A(v.rangeShift)+y+"\0\0"+b+w+k+S,O="",T="";if(c>1){l+="\0\0\n"+(0,i.string32)(4+8*c+4+I.length);O="";for(r=0,a=s.length;r<a;r++){f=(h=s[r])[0];var E=(g=h[2])[0];for(n=1,o=g.length;n<o;++n)if(g[n]!==g[n-1]+1){d=h[0]+n-1;O+=(0,i.string32)(f)+(0,i.string32)(d)+(0,i.string32)(E);f=d+1;E=g[n]}O+=(0,i.string32)(f)+(0,i.string32)(h[1])+(0,i.string32)(E)}T="\0\f\0\0"+(0,i.string32)(O.length+16)+"\0\0\0\0"+(0,i.string32)(O.length/12)}return l+"\0"+A(I.length+4)+I+T+O}function B(e,t,r){r=r||{unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};var a=0,n=0,o=0,s=0,c=null,u=0;if(t){for(var h in t){(c>(h|=0)||!c)&&(c=h);u<h&&(u=h);var f=(0,l.getUnicodeRangeFor)(h);if(f<32)a|=1<<f;else if(f<64)n|=1<<f-32;else if(f<96)o|=1<<f-64;else{if(!(f<123))throw new i.FormatError("Unicode ranges Bits > 123 are reserved for internal usage");s|=1<<f-96}}u>65535&&(u=65535)}else{c=0;u=255}var d=e.bbox||[0,0,0,0],g=r.unitsPerEm||1/(e.fontMatrix||i.FONT_IDENTITY_MATRIX)[0],p=e.ascentScaled?1:g/m,v=r.ascent||Math.round(p*(e.ascent||d[3])),b=r.descent||Math.round(p*(e.descent||d[1]));b>0&&e.descent>0&&d[1]<0&&(b=-b);var y=r.yMax||v,w=-r.yMin||-b;return"\0$ô\0\0\0Š»\0\0\0ÂŒŠ»\0\0ß\x001\0\0\0\0"+String.fromCharCode(e.fixedPitch?9:0)+"\0\0\0\0\0\0"+(0,i.string32)(a)+(0,i.string32)(n)+(0,i.string32)(o)+(0,i.string32)(s)+"*21*"+A(e.italicAngle?1:0)+A(c||e.firstChar)+A(u||e.lastChar)+A(v)+A(b)+"\0d"+A(y)+A(w)+"\0\0\0\0\0\0\0\0"+A(e.xHeight)+A(e.capHeight)+A(0)+A(c||e.firstChar)+"\0"}function D(e){var t=Math.floor(e.italicAngle*Math.pow(2,16));return"\0\0\0"+(0,i.string32)(t)+"\0\0\0\0"+(0,i.string32)(e.fixedPitch)+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}function M(e,t){t||(t=[[],[]]);var r,a,i,n,o,s=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||"",t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"],c=[];for(r=0,a=s.length;r<a;r++){var l=[];for(i=0,n=(o=t[1][r]||s[r]).length;i<n;i++)l.push(A(o.charCodeAt(i)));c.push(l.join(""))}var u=[s,c],h=["\0","\0"],f=["\0\0","\0"],d=["\0\0","\t"],g=s.length*h.length,m="\0\0"+A(g)+A(12*g+6),p=0;for(r=0,a=h.length;r<a;r++){var v=u[r];for(i=0,n=v.length;i<n;i++){o=v[i];m+=h[r]+f[r]+d[r]+A(i)+A(o.length)+A(p);p+=o.length}}return m+=s.join("")+c.join("")}e.prototype={name:null,font:null,mimetype:null,encoding:null,get renderer(){var e=u.FontRendererFactory.create(this,p);return(0,i.shadow)(this,"renderer",e)},exportData:function(){var e={};for(var t in this)this.hasOwnProperty(t)&&(e[t]=this[t]);return e},fallbackToSystemFont:function(){var e,t,r=this;this.missingFile=!0;var a=this.name,n=this.type,u=this.subtype,h=a.replace(/[,_]/g,"-"),f=(0,c.getStdFontMap)(),d=(0,c.getNonStdFontMap)(),g=!!f[h]||!(!d[h]||!f[d[h]]);h=f[h]||d[h]||h;this.bold=-1!==h.search(/bold/gi);this.italic=-1!==h.search(/oblique/gi)||-1!==h.search(/italic/gi);this.black=-1!==a.search(/Black/g);this.remeasure=Object.keys(this.widths).length>0;if(g&&"CIDFontType2"===n&&0===this.cidEncoding.indexOf("Identity-")){var m=(0,c.getGlyphMapForStandardFonts)(),p=[];for(e in m)p[+e]=m[e];if(/Arial-?Black/i.test(a)){var v=(0,c.getSupplementalGlyphMapForArialBlack)();for(e in v)p[+e]=v[e]}else if(/Calibri/i.test(a)){var b=(0,c.getSupplementalGlyphMapForCalibri)();for(e in b)p[+e]=b[e]}this.toUnicode instanceof x||this.toUnicode.forEach(function(e,t){p[+e]=t});this.toFontChar=p;this.toUnicode=new C(p)}else if(/Symbol/i.test(h))this.toFontChar=E(s.SymbolSetEncoding,(0,o.getGlyphsUnicode)(),this.differences);else if(/Dingbats/i.test(h)){/Wingdings/i.test(a)&&(0,i.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats.");this.toFontChar=E(s.ZapfDingbatsEncoding,(0,o.getDingbatsGlyphsUnicode)(),this.differences)}else if(g)this.toFontChar=E(this.defaultEncoding,(0,o.getGlyphsUnicode)(),this.differences);else{var y=(0,o.getGlyphsUnicode)();this.toUnicode.forEach(function(e,a){if(!r.composite){var i=r.differences[e]||r.defaultEncoding[e];-1!==(t=(0,l.getUnicodeForGlyph)(i,y))&&(a=t)}r.toFontChar[e]=a})}this.loadedName=h.split("-")[0];this.fontType=w(n,u)},checkAndRepair:function(e,t,a){var c=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function l(e,r){var a=Object.create(null);a["OS/2"]=null;a.cmap=null;a.head=null;a.hhea=null;a.hmtx=null;a.maxp=null;a.name=null;a.post=null;for(var i=0;i<r;i++){var n=u(t);c.includes(n.tag)&&(0!==n.length&&(a[n.tag]=n))}return a}function u(e){var t=(0,i.bytesToString)(e.getBytes(4)),r=e.getInt32()>>>0,a=e.getInt32()>>>0,n=e.getInt32()>>>0,o=e.pos;e.pos=e.start?e.start:0;e.skip(a);var s=e.getBytes(n);e.pos=o;if("head"===t){s[8]=s[9]=s[10]=s[11]=0;s[17]|=32}return{tag:t,checksum:r,length:n,offset:a,data:s}}function g(e){return{version:(0,i.bytesToString)(e.getBytes(4)),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function m(e,t,r,a,i,n){var o={length:0,sizeOfInstructions:0};if(r-t<=12)return o;var s=e.subarray(t,r),c=d(s[0],s[1]);if(c<0){!function(e,t,r){e[t+1]=r;e[t]=r>>>8}(s,0,c=-1);a.set(s,i);o.length=s.length;return o}var l,u=10,h=0;for(l=0;l<c;l++){h=(s[u]<<8|s[u+1])+1;u+=2}var f=u,g=s[u]<<8|s[u+1];o.sizeOfInstructions=g;var m=u+=2+g,p=0;for(l=0;l<h;l++){var v=s[u++];192&v&&(s[u-1]=63&v);var b=(2&v?1:16&v?0:2)+(4&v?1:32&v?0:2);p+=b;if(8&v){var y=s[u++];l+=y;p+=y*b}}if(0===p)return o;var w=u+p;if(w>s.length)return o;if(!n&&g>0){a.set(s.subarray(0,f),i);a.set([0,0],i+f);a.set(s.subarray(m,w),i+f+2);w-=g;s.length-w>3&&(w=w+3&-4);o.length=w;return o}if(s.length-w>3){w=w+3&-4;a.set(s.subarray(0,w),i);o.length=w;return o}a.set(s,i);o.length=s.length;return o}function v(e){var r=(t.start?t.start:0)+e.offset;t.pos=r;var a=[[],[]],n=e.length,o=r+n;if(0!==t.getUint16()||n<6)return a;var s,c,l=t.getUint16(),u=t.getUint16(),h=[];for(s=0;s<l&&t.pos+12<=o;s++){var f={platform:t.getUint16(),encoding:t.getUint16(),language:t.getUint16(),name:t.getUint16(),length:t.getUint16(),offset:t.getUint16()};(1===f.platform&&0===f.encoding&&0===f.language||3===f.platform&&1===f.encoding&&1033===f.language)&&h.push(f)}for(s=0,c=h.length;s<c;s++){var d=h[s];if(!(d.length<=0)){var g=r+u+d.offset;if(!(g+d.length>o)){t.pos=g;var m=d.name;if(d.encoding){for(var p="",v=0,b=d.length;v<b;v+=2)p+=String.fromCharCode(t.getUint16());a[1][m]=p}else a[0][m]=(0,i.bytesToString)(t.getBytes(d.length))}}}return a}var w=[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 S(e,t){for(var r,a,n,o,s,c=e.data,l=0,u=0,h=0,f=[],d=[],g=[],m=t.tooComplexToFollowFunctions,p=!1,v=0,b=0,y=c.length;l<y;){var k=c[l++];if(64===k){a=c[l++];if(p||b)l+=a;else for(r=0;r<a;r++)f.push(c[l++])}else if(65===k){a=c[l++];if(p||b)l+=2*a;else for(r=0;r<a;r++){n=c[l++];f.push(n<<8|c[l++])}}else if(176==(248&k)){a=k-176+1;if(p||b)l+=a;else for(r=0;r<a;r++)f.push(c[l++])}else if(184==(248&k)){a=k-184+1;if(p||b)l+=2*a;else for(r=0;r<a;r++){n=c[l++];f.push(n<<8|c[l++])}}else if(43!==k||m)if(44!==k||m){if(45===k)if(p){p=!1;u=l}else{if(!(s=d.pop())){(0,i.warn)("TT: ENDF bad stack");t.hintsValid=!1;return}o=g.pop();c=s.data;l=s.i;t.functionsStackDeltas[o]=f.length-s.stackTop}else if(137===k){if(p||b){(0,i.warn)("TT: nested IDEFs not allowed");m=!0}p=!0;h=l}else if(88===k)++v;else if(27===k)b=v;else if(89===k){b===v&&(b=0);--v}else if(28===k&&!p&&!b){var S=f[f.length-1];S>0&&(l+=S-1)}}else{if(p||b){(0,i.warn)("TT: nested FDEFs not allowed");m=!0}p=!0;h=l;o=f.pop();t.functionsDefined[o]={data:c,i:l}}else if(!p&&!b){o=f[f.length-1];if(isNaN(o))(0,i.info)("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[o]=!0;if(o in t.functionsStackDeltas){var C=f.length+t.functionsStackDeltas[o];if(C<0){(0,i.warn)("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}f.length=C}else if(o in t.functionsDefined&&!g.includes(o)){d.push({data:c,i:l,stackTop:f.length-1});g.push(o);if(!(s=t.functionsDefined[o])){(0,i.warn)("TT: CALL non-existent function");t.hintsValid=!1;return}c=s.data;l=s.i}}}if(!p&&!b){var x=k<=142?w[k]:k>=192&&k<=223?-1:k>=224?-2:0;if(k>=113&&k<=117){a=f.pop();isNaN(a)||(x=2*-a)}for(;x<0&&f.length>0;){f.pop();x++}for(;x>0;){f.push(NaN);x--}}}t.tooComplexToFollowFunctions=m;var _=[c];l>c.length&&_.push(new Uint8Array(l-c.length));if(h>u){(0,i.warn)("TT: complementing a missing function tail");_.push(new Uint8Array([34,45]))}!function(e,t){if(t.length>1){var r,a,i=0;for(r=0,a=t.length;r<a;r++)i+=t[r].length;i=i+3&-4;var n=new Uint8Array(i),o=0;for(r=0,a=t.length;r<a;r++){n.set(t[r],o);o+=t[r].length}e.data=n;e.length=i}}(e,_)}var C=void 0,x=void 0;if(I(t=new f.Stream(new Uint8Array(t.getBytes())))){var A=function(e,t){for(var r=function(e){var t=(0,i.bytesToString)(e.getBytes(4));(0,i.assert)("ttcf"===t,"Must be a TrueType Collection font.");for(var r=e.getUint16(),a=e.getUint16(),n=e.getInt32()>>>0,o=[],s=0;s<n;s++)o.push(e.getInt32()>>>0);var c={ttcTag:t,majorVersion:r,minorVersion:a,numFonts:n,offsetTable:o};switch(r){case 1:return c;case 2:c.dsigTag=e.getInt32()>>>0;c.dsigLength=e.getInt32()>>>0;c.dsigOffset=e.getInt32()>>>0;return c}throw new i.FormatError("Invalid TrueType Collection majorVersion: "+r+".")}(e),a=r.numFonts,n=r.offsetTable,o=0;o<a;o++){e.pos=(e.start||0)+n[o];var s=g(e),c=l(0,s.numTables);if(!c.name)throw new i.FormatError('TrueType Collection font must contain a "name" table.');for(var u=v(c.name),h=0,f=u.length;h<f;h++)for(var d=0,m=u[h].length;d<m;d++){var p=u[h][d];if(p&&p.replace(/\s/g,"")===t)return{header:s,tables:c}}}throw new i.FormatError('TrueType Collection does not contain "'+t+'" font.')}(t,this.name);C=A.header;x=A.tables}else x=l(0,(C=g(t)).numTables);var P=void 0,O=void 0,E=!x["CFF "];if(E){if(!x.loca)throw new i.FormatError('Required "loca" table is not found');if(!x.glyf){(0,i.warn)('Required "glyf" table is not found -- trying to recover.');x.glyf={tag:"glyf",data:new Uint8Array(0)}}this.isOpenType=!1}else{var L=a.composite&&((a.cidToGidMap||[]).length>0||!(a.cMap instanceof h.IdentityCMap));if("OTTO"===C.version&&!L||!x.head||!x.hhea||!x.maxp||!x.post){O=new f.Stream(x["CFF "].data);P=new T(O,a);y(a);return this.convert(e,P,a)}delete x.glyf;delete x.loca;delete x.fpgm;delete x.prep;delete x["cvt "];this.isOpenType=!0}if(!x.maxp)throw new i.FormatError('Required "maxp" table is not found');t.pos=(t.start||0)+x.maxp.offset;var N=t.getInt32(),U=t.getUint16(),q=U+1,j=!0;if(q>65535){j=!1;q=U;(0,i.warn)("Not enough space in glyfs to duplicate first glyph.")}var z=0,H=0;if(N>=65536&&x.maxp.length>=22){t.pos+=8;if(t.getUint16()>2){x.maxp.data[14]=0;x.maxp.data[15]=2}t.pos+=4;z=t.getUint16();t.pos+=4;H=t.getUint16()}x.maxp.data[4]=q>>8;x.maxp.data[5]=255&q;var G=function(e,t,r,a){var n={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&S(e,n);t&&S(t,n);e&&function(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){(0,i.warn)("TT: more functions defined than expected");e.hintsValid=!1}else for(var r=0,a=e.functionsUsed.length;r<a;r++){if(r>t){(0,i.warn)("TT: invalid function id: "+r);e.hintsValid=!1;return}if(e.functionsUsed[r]&&!e.functionsDefined[r]){(0,i.warn)("TT: undefined function: "+r);e.hintsValid=!1;return}}}(n,a);if(r&&1&r.length){var o=new Uint8Array(r.length+1);o.set(r.data);r.data=o}return n.hintsValid}(x.fpgm,x.prep,x["cvt "],z);if(!G){delete x.fpgm;delete x.prep;delete x["cvt "]}!function(e,t,r,a){if(t){e.pos=(e.start?e.start:0)+t.offset;e.pos+=t.length-2;var n=e.getUint16();if(n>a){(0,i.info)("The numOfMetrics ("+n+") should not be greater than the numGlyphs ("+a+")");n=a;t.data[34]=(65280&n)>>8;t.data[35]=255&n}var o=a-n-(r.length-4*n>>1);if(o>0){var s=new Uint8Array(r.length+2*o);s.set(r.data);r.data=s}}else r&&(r.data=null)}(t,x.hhea,x.hmtx,q);if(!x.head)throw new i.FormatError('Required "head" table is not found');!function(e,t,a){var n,o,s,c,l=e.data,u=(n=l[0],o=l[1],s=l[2],c=l[3],(n<<24)+(o<<16)+(s<<8)+c);if(u>>16!=1){(0,i.info)("Attempting to fix invalid version in head table: "+u);l[0]=0;l[1]=1;l[2]=0;l[3]=0}var h=r(l[50],l[51]);if(h<0||h>1){(0,i.info)("Attempting to fix invalid indexToLocFormat in head table: "+h);var f=t+1;if(a===f<<1){l[50]=0;l[51]=0}else{if(a!==f<<2)throw new i.FormatError("Could not fix indexToLocFormat: "+h);l[50]=0;l[51]=1}}}(x.head,U,E?x.loca.length:0);var W=Object.create(null);if(E){var X=r(x.head.data[50],x.head.data[51]),V=function(e,t,r,a,i,n,o){var s,c,l;if(a){s=4;c=function(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};l=function(e,t,r){e[t]=r>>>24&255;e[t+1]=r>>16&255;e[t+2]=r>>8&255;e[t+3]=255&r}}else{s=2;c=function(e,t){return e[t]<<9|e[t+1]<<1};l=function(e,t,r){e[t]=r>>9&255;e[t+1]=r>>1&255}}var u=n?r+1:r,h=e.data,f=s*(1+u);(h=new Uint8Array(f)).set(e.data.subarray(0,f));e.data=h;var d,g,p=t.data,v=p.length,b=new Uint8Array(v),y=c(h,0),w=0,k=Object.create(null);l(h,0,w);for(d=0,g=s;d<r;d++,g+=s){var S=c(h,g);0===S&&(S=y);S>v&&(v+3&-4)===S&&(S=v);S>v&&(y=S);var C=m(p,y,S,b,w,i),x=C.length;0===x&&(k[d]=!0);C.sizeOfInstructions>o&&(o=C.sizeOfInstructions);l(h,g,w+=x);y=S}if(0===w){var _=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(d=0,g=s;d<u;d++,g+=s)l(h,g,_.length);t.data=_}else if(n){var A=c(h,s);if(b.length>A+w)t.data=b.subarray(0,A+w);else{t.data=new Uint8Array(A+w);t.data.set(b.subarray(0,w))}t.data.set(b.subarray(0,A),w);l(e.data,h.length-s,w+A)}else t.data=b.subarray(0,w);return{missingGlyphs:k,maxSizeOfInstructions:o}}(x.loca,x.glyf,U,X,G,j,H);W=V.missingGlyphs;if(N>=65536&&x.maxp.length>=22){x.maxp.data[26]=V.maxSizeOfInstructions>>8;x.maxp.data[27]=255&V.maxSizeOfInstructions}}if(!x.hhea)throw new i.FormatError('Required "hhea" table is not found');if(0===x.hhea.data[10]&&0===x.hhea.data[11]){x.hhea.data[10]=255;x.hhea.data[11]=255}var K={unitsPerEm:r(x.head.data[18],x.head.data[19]),yMax:r(x.head.data[42],x.head.data[43]),yMin:d(x.head.data[38],x.head.data[39]),ascent:r(x.hhea.data[4],x.hhea.data[5]),descent:d(x.hhea.data[6],x.hhea.data[7])};this.ascent=K.ascent/K.unitsPerEm;this.descent=K.descent/K.unitsPerEm;x.post&&function(e,r,a){var n=(t.start?t.start:0)+e.offset;t.pos=n;var o,s=n+e.length,c=t.getInt32();t.getBytes(28);var l,u=!0;switch(c){case 65536:o=b;break;case 131072:var h=t.getUint16();if(h!==a){u=!1;break}var f=[];for(l=0;l<h;++l){var d=t.getUint16();if(d>=32768){u=!1;break}f.push(d)}if(!u)break;for(var g=[],m=[];t.pos<s;){var p=t.getByte();m.length=p;for(l=0;l<p;++l)m[l]=String.fromCharCode(t.getByte());g.push(m.join(""))}o=[];for(l=0;l<h;++l){var v=f[l];v<258?o.push(b[v]):o.push(g[v-258])}break;case 196608:break;default:(0,i.warn)("Unknown/unsupported post table version "+c);u=!1;r.defaultEncoding&&(o=r.defaultEncoding)}r.glyphNames=o}(x.post,a,U);x.post={tag:"post",data:D(a)};var Y,J=[];function Z(e){return!W[e]}if(a.composite){var Q=a.cidToGidMap||[],$=0===Q.length;a.cMap.forEach(function(e,t){if(t>65535)throw new i.FormatError("Max size of CID is 65,535");var r=-1;$?r=t:void 0!==Q[t]&&(r=Q[t]);r>=0&&r<U&&Z(r)&&(J[e]=r)})}else{var ee=function(e,t,r,a){if(!e){(0,i.warn)("No cmap table available.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}var n,o=(t.start?t.start:0)+e.offset;t.pos=o;t.getUint16();for(var s,c=t.getUint16(),l=!1,u=0;u<c;u++){var h=t.getUint16(),f=t.getUint16(),d=t.getInt32()>>>0,g=!1;if(!s||s.platformId!==h||s.encodingId!==f){if(0===h&&0===f)g=!0;else if(1===h&&0===f)g=!0;else if(3!==h||1!==f||!a&&s){if(r&&3===h&&0===f){g=!0;l=!0}}else{g=!0;r||(l=!0)}g&&(s={platformId:h,encodingId:f,offset:d});if(l)break}}s&&(t.pos=o+s.offset);if(!s||-1===t.peekByte()){(0,i.warn)("Could not find a preferred cmap table.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}var m=t.getUint16();t.getUint16();t.getUint16();var p,v,b=!1,y=[];if(0===m){for(p=0;p<256;p++){var w=t.getByte();w&&y.push({charCode:p,glyphId:w})}b=!0}else if(4===m){var k=t.getUint16()>>1;t.getBytes(6);var S,C=[];for(S=0;S<k;S++)C.push({end:t.getUint16()});t.getUint16();for(S=0;S<k;S++)C[S].start=t.getUint16();for(S=0;S<k;S++)C[S].delta=t.getUint16();var x=0;for(S=0;S<k;S++){n=C[S];var _=t.getUint16();if(_){var A=(_>>1)-(k-S);n.offsetIndex=A;x=Math.max(x,A+n.end-n.start+1)}else n.offsetIndex=-1}var P=[];for(p=0;p<x;p++)P.push(t.getUint16());for(S=0;S<k;S++){o=(n=C[S]).start;var I=n.end,O=n.delta;A=n.offsetIndex;for(p=o;p<=I;p++)if(65535!==p){v=(v=A<0?p:P[A+p-o])+O&65535;y.push({charCode:p,glyphId:v})}}}else{if(6!==m){(0,i.warn)("cmap table has unsupported format: "+m);return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}var T=t.getUint16(),E=t.getUint16();for(p=0;p<E;p++){v=t.getUint16();var F=T+p;y.push({charCode:F,glyphId:v})}}y.sort(function(e,t){return e.charCode-t.charCode});for(u=1;u<y.length;u++)if(y[u-1].charCode===y[u].charCode){y.splice(u,1);u--}return{platformId:s.platformId,encodingId:s.encodingId,mappings:y,hasShortCmap:b}}(x.cmap,t,this.isSymbolicFont,a.hasEncoding),te=ee.platformId,re=ee.encodingId,ae=ee.mappings,ie=ae.length;if(a.hasEncoding&&(3===te&&1===re||1===te&&0===re)||-1===te&&-1===re&&(0,s.getEncoding)(a.baseEncodingName)){var ne=[];"MacRomanEncoding"!==a.baseEncodingName&&"WinAnsiEncoding"!==a.baseEncodingName||(ne=(0,s.getEncoding)(a.baseEncodingName));var oe=(0,o.getGlyphsUnicode)();for(Y=0;Y<256;Y++){var se,ce;if(se=this.differences&&Y in this.differences?this.differences[Y]:Y in ne&&""!==ne[Y]?ne[Y]:s.StandardEncoding[Y]){ce=k(se,oe);var le;3===te&&1===re?le=oe[ce]:1===te&&0===re&&(le=s.MacRomanEncoding.indexOf(ce));for(var ue=!1,he=0;he<ie;++he)if(ae[he].charCode===le){J[Y]=ae[he].glyphId;ue=!0;break}if(!ue&&a.glyphNames){var fe=a.glyphNames.indexOf(se);-1===fe&&ce!==se&&(fe=a.glyphNames.indexOf(ce));fe>0&&Z(fe)&&(J[Y]=fe)}}}}else if(0===te&&0===re)for(var de=0;de<ie;++de)J[ae[de].charCode]=ae[de].glyphId;else for(var ge=0;ge<ie;++ge){Y=ae[ge].charCode;3===te&&Y>=61440&&Y<=61695&&(Y&=255);J[Y]=ae[ge].glyphId}}0===J.length&&(J[0]=0);var me=q-1;j||(me=0);var pe=F(J,Z,me);this.toFontChar=pe.toFontChar;x.cmap={tag:"cmap",data:R(pe.charCodeToGlyphId,q)};x["OS/2"]&&function(e){var t=new f.Stream(e.data),r=t.getUint16();t.getBytes(60);var a=t.getUint16();if(r<4&&768&a)return!1;if(t.getUint16()>t.getUint16())return!1;t.getBytes(6);if(0===t.getUint16())return!1;e.data[8]=e.data[9]=0;return!0}(x["OS/2"])||(x["OS/2"]={tag:"OS/2",data:B(a,pe.charCodeToGlyphId,K)});if(!E)try{O=new f.Stream(x["CFF "].data);(P=new n.CFFParser(O,a,p).parse()).duplicateFirstGlyph();var ve=new n.CFFCompiler(P);x["CFF "].data=ve.compile()}catch(e){(0,i.warn)("Failed to compile font "+a.loadedName)}if(x.name){var be=v(x.name);x.name.data=M(e,be)}else x.name={tag:"name",data:M(this.name)};var ye=new _(C.version);for(var we in x)ye.addTable(we,x[we].data);return ye.toArray()},convert:function(e,t,r){r.fixedPitch=!1;r.builtInEncoding&&function(e,t){if(!e.hasIncludedToUnicodeMap&&!(e.hasEncoding||t===e.defaultEncoding||e.toUnicode instanceof x)){var r=[],a=(0,o.getGlyphsUnicode)();for(var i in t){var n=t[i],s=(0,l.getUnicodeForGlyph)(n,a);-1!==s&&(r[i]=String.fromCharCode(s))}e.toUnicode.amend(r)}}(r,r.builtInEncoding);var a=1;t instanceof T&&(a=t.numGlyphs-1);var n=t.getGlyphMapping(r),c=F(n,t.hasGlyphId.bind(t),a);this.toFontChar=c.toFontChar;var u=t.numGlyphs;function h(e,t){var r=null;for(var a in e)if(t===e[a]){r||(r=[]);r.push(0|a)}return r}function f(e,t){for(var r in e)if(t===e[r])return 0|r;c.charCodeToGlyphId[c.nextAvailableFontCharCode]=t;return c.nextAvailableFontCharCode++}var d=t.seacs;if(p&&d&&d.length){var g=r.fontMatrix||i.FONT_IDENTITY_MATRIX,m=t.getCharset(),v=Object.create(null);for(var b in d){var y=d[b|=0],w=s.StandardEncoding[y[2]],k=s.StandardEncoding[y[3]],S=m.indexOf(w),C=m.indexOf(k);if(!(S<0||C<0)){var I={x:y[0]*g[0]+y[1]*g[2]+g[4],y:y[0]*g[1]+y[1]*g[3]+g[5]},O=h(n,b);if(O)for(var E=0,L=O.length;E<L;E++){var N=O[E],U=c.charCodeToGlyphId,q=f(U,S),j=f(U,C);v[N]={baseFontCharCode:q,accentFontCharCode:j,accentOffset:I}}}}r.seacMap=v}var z=1/(r.fontMatrix||i.FONT_IDENTITY_MATRIX)[0],H=new _("OTTO");H.addTable("CFF ",t.data);H.addTable("OS/2",B(r,c.charCodeToGlyphId));H.addTable("cmap",R(c.charCodeToGlyphId,u));H.addTable("head","\0\0\0\0\0\0\0\0\0\0_<õ\0\0"+P(z)+"\0\0\0\0ž\v~'\0\0\0\0ž\v~'\0\0"+P(r.descent)+"ÿ"+P(r.ascent)+A(r.italicAngle?2:0)+"\0\0\0\0\0\0\0");H.addTable("hhea","\0\0\0"+P(r.ascent)+P(r.descent)+"\0\0ÿÿ\0\0\0\0\0\0"+P(r.capHeight)+P(Math.tan(r.italicAngle)*r.xHeight)+"\0\0\0\0\0\0\0\0\0\0\0\0"+A(u));H.addTable("hmtx",function(){for(var e=t.charstrings,r=t.cff?t.cff.widths:null,a="\0\0\0\0",i=1,n=u;i<n;i++){var o=0;if(e){var s=e[i-1];o="width"in s?s.width:0}else r&&(o=Math.ceil(r[i]||0));a+=A(o)+A(0)}return a}());H.addTable("maxp","\0\0P\0"+A(u));H.addTable("name",M(e));H.addTable("post",D(r));return H.toArray()},get spaceWidth(){if("_shadowWidth"in this)return this._shadowWidth;for(var e,t=["space","minus","one","i","I"],r=0,a=t.length;r<a;r++){var i=t[r];if(i in this.widths){e=this.widths[i];break}var n=(0,o.getGlyphsUnicode)()[i],s=0;this.composite&&this.cMap.contains(n)&&(s=this.cMap.lookup(n));!s&&this.toUnicode&&(s=this.toUnicode.charCodeOf(n));s<=0&&(s=n);if(e=this.widths[s])break}e=e||this.defaultWidth;this._shadowWidth=e;return e},charToGlyph:function(e,t){var r,a,n,o=e;this.cMap&&this.cMap.contains(e)&&(o=this.cMap.lookup(e));a=this.widths[o];a=(0,i.isNum)(a)?a:this.defaultWidth;var s=this.vmetrics&&this.vmetrics[o],c=this.toUnicode.get(e)||this.fallbackToUnicode.get(e)||e;"number"==typeof c&&(c=String.fromCharCode(c));var u=e in this.toFontChar;r=this.toFontChar[e]||e;this.missingFile&&(r=(0,l.mapSpecialUnicodeValues)(r));this.isType3Font&&(n=r);var h=null;if(this.seacMap&&this.seacMap[e]){u=!0;var f=this.seacMap[e];r=f.baseFontCharCode;h={fontChar:String.fromCodePoint(f.accentFontCharCode),offset:f.accentOffset}}var d="number"==typeof r?String.fromCodePoint(r):"",g=this.glyphCache[e];if(!g||!g.matchesForCache(d,c,h,a,s,n,t,u)){g=new S(d,c,h,a,s,n,t,u);this.glyphCache[e]=g}return g},charsToGlyphs:function(e){var t,r,a,i=this.charsCache;if(i&&(t=i[e]))return t;i||(i=this.charsCache=Object.create(null));t=[];var n,o=e,s=0;if(this.cMap)for(var c=Object.create(null);s<e.length;){this.cMap.readCharCode(e,s,c);a=c.charcode;var l=c.length;s+=l;var u=1===l&&32===e.charCodeAt(s-1);r=this.charToGlyph(a,u);t.push(r)}else for(s=0,n=e.length;s<n;++s){a=e.charCodeAt(s);r=this.charToGlyph(a,32===a);t.push(r)}return i[o]=t}};return e}(),P=function(){function e(e){this.error=e;this.loadedName="g_font_error";this.missingFile=!0}e.prototype={charsToGlyphs:function(){return[]},exportData:function(){return{error:this.error}}};return e}();function I(e,t,r){var a,i,n,c=Object.create(null),l=!!(e.flags&v.Symbolic);if(e.baseEncodingName){n=(0,s.getEncoding)(e.baseEncodingName);for(i=0;i<n.length;i++){a=r.indexOf(n[i]);c[i]=a>=0?a:0}}else if(l)for(i in t)c[i]=t[i];else{n=s.StandardEncoding;for(i=0;i<n.length;i++){a=r.indexOf(n[i]);c[i]=a>=0?a:0}}var u,h=e.differences;if(h)for(i in h){var f=h[i];if(-1===(a=r.indexOf(f))){u||(u=(0,o.getGlyphsUnicode)());var d=k(f,u);d!==f&&(a=r.indexOf(d))}c[i]=a>=0?a:0}return c}var O=function(){function e(e,t,r){for(var a,n=e.length,o=t.length,s=n-o,c=r,l=!1;c<s;){a=0;for(;a<o&&e[c+a]===t[a];)a++;if(a>=o){c+=a;for(;c<n&&(0,i.isSpace)(e[c]);)c++;l=!0;break}c++}return{found:l,length:c}}function t(t,r,a){var n=a.length1,o=(a.length2,r.peekBytes(6)),s=128===o[0]&&1===o[1];if(s){r.skip(6);n=o[5]<<24|o[4]<<16|o[3]<<8|o[2]}var c=function(t,r){var a,n,o,s,c=[101,101,120,101,99],l=t.pos;try{n=(a=t.getBytes(r)).length}catch(e){if(e instanceof i.MissingDataException)throw e}if(n===r&&(o=e(a,c,r-2*c.length)).found&&o.length===r)return{stream:new f.Stream(a),length:r};(0,i.warn)('Invalid "Length1" property in Type1 font -- trying to recover.');t.pos=l;for(;0!==(o=e(t.peekBytes(2048),c,0)).length;){t.pos+=o.length;if(o.found){s=t.pos-l;break}}t.pos=l;if(s)return{stream:new f.Stream(t.getBytes(s)),length:s};(0,i.warn)('Unable to recover "Length1" property in Type1 font -- using as is.');return{stream:new f.Stream(t.getBytes(r)),length:r}}(r,n);new d.Type1Parser(c.stream,!1,p).extractFontHeader(a);s&&(o=r.getBytes(6))[5]<<24|o[4]<<16|o[3]<<8|o[2];var l,u=(l=r.getBytes(),{stream:new f.Stream(l),length:l.length}),h=new d.Type1Parser(u.stream,!0,p).extractFontProgram();for(var g in h.properties)a[g]=h.properties[g];var m=h.charstrings,v=this.getType2Charstrings(m),b=this.getType2Subrs(h.subrs);this.charstrings=m;this.data=this.wrap(t,v,this.charstrings,b,a);this.seacs=this.getSeacs(h.charstrings)}t.prototype={get numGlyphs(){return this.charstrings.length+1},getCharset:function(){for(var e=[".notdef"],t=this.charstrings,r=0;r<t.length;r++)e.push(t[r].glyphName);return e},getGlyphMapping:function(e){var t,r=this.charstrings,a=[".notdef"];for(t=0;t<r.length;t++)a.push(r[t].glyphName);var i=e.builtInEncoding;if(i){var n=Object.create(null);for(var o in i)(t=a.indexOf(i[o]))>=0&&(n[o]=t)}return I(e,n,a)},hasGlyphId:function(e){return!(e<0||e>=this.numGlyphs)&&(0===e||this.charstrings[e-1].charstring.length>0)},getSeacs:function(e){var t,r,a=[];for(t=0,r=e.length;t<r;t++){var i=e[t];i.seac&&(a[t+1]=i.seac)}return a},getType2Charstrings:function(e){for(var t=[],r=0,a=e.length;r<a;r++)t.push(e[r].charstring);return t},getType2Subrs:function(e){var t=0,r=e.length;t=r<1133?107:r<33769?1131:32768;var a,i=[];for(a=0;a<t;a++)i.push([11]);for(a=0;a<r;a++)i.push(e[a]);return i},wrap:function(e,t,r,a,i){var o=new n.CFF;o.header=new n.CFFHeader(1,0,4,4);o.names=[e];var s=new n.CFFTopDict;s.setByName("version",391);s.setByName("Notice",392);s.setByName("FullName",393);s.setByName("FamilyName",394);s.setByName("Weight",395);s.setByName("Encoding",null);s.setByName("FontMatrix",i.fontMatrix);s.setByName("FontBBox",i.bbox);s.setByName("charset",null);s.setByName("CharStrings",null);s.setByName("Private",null);o.topDict=s;var c=new n.CFFStrings;c.add("Version 0.11");c.add("See original notice");c.add(e);c.add(e);c.add("Medium");o.strings=c;o.globalSubrIndex=new n.CFFIndex;var l,u,h=t.length,f=[0];for(l=0;l<h;l++){var d=n.CFFStandardStrings.indexOf(r[l].glyphName);-1===d&&(d=0);f.push(d>>8&255,255&d)}o.charset=new n.CFFCharset(!1,0,[],f);var g=new n.CFFIndex;g.add([139,14]);for(l=0;l<h;l++)g.add(t[l]);o.charStrings=g;var m=new n.CFFPrivateDict;m.setByName("Subrs",null);var p=["BlueValues","OtherBlues","FamilyBlues","FamilyOtherBlues","StemSnapH","StemSnapV","BlueShift","BlueFuzz","BlueScale","LanguageGroup","ExpansionFactor","ForceBold","StdHW","StdVW"];for(l=0,u=p.length;l<u;l++){var v=p[l];if(v in i.privateData){var b=i.privateData[v];if(Array.isArray(b))for(var y=b.length-1;y>0;y--)b[y]-=b[y-1];m.setByName(v,b)}}o.topDict.privateDict=m;var w=new n.CFFIndex;for(l=0,u=a.length;l<u;l++)w.add(a[l]);m.subrsIndex=w;return new n.CFFCompiler(o).compile()}};return t}(),T=function(){function e(e,t){this.properties=t;var r=new n.CFFParser(e,t,p);this.cff=r.parse();this.cff.duplicateFirstGlyph();var a=new n.CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=a.compile()}catch(r){(0,i.warn)("Failed to compile font "+t.loadedName);this.data=e}}e.prototype={get numGlyphs(){return this.cff.charStrings.count},getCharset:function(){return this.cff.charset.charset},getGlyphMapping:function(){var e,t,r=this.cff,a=this.properties,i=r.charset.charset;if(a.composite){e=Object.create(null);if(r.isCIDFont)for(t=0;t<i.length;t++){var n=i[t];e[a.cMap.charCodeOf(n)]=t}else for(t=0;t<r.charStrings.count;t++)e[t]=t;return e}return e=I(a,r.encoding?r.encoding.encoding:null,i)},hasGlyphId:function(e){return this.cff.hasGlyphId(e)}};return e}();t.SEAC_ANALYSIS_ENABLED=p;t.ErrorFont=P;t.Font=A;t.FontFlags=v;t.ToUnicodeMap=C;t.IdentityToUnicodeMap=x;t.getFontType=w},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CFFFDSelect=t.CFFCompiler=t.CFFPrivateDict=t.CFFTopDict=t.CFFCharset=t.CFFIndex=t.CFFStrings=t.CFFHeader=t.CFF=t.CFFParser=t.CFFStandardStrings=void 0;var a=r(2),i=r(158),n=r(159),o=[".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"],s=function(){var e=[null,{id:"hstem",min:2,stackClearing:!0,stem:!0},null,{id:"vstem",min:2,stackClearing:!0,stem:!0},{id:"vmoveto",min:1,stackClearing:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1,undefStack:!0},{id:"return",min:0,undefStack:!0},null,null,{id:"endchar",min:0,stackClearing:!0},null,null,null,{id:"hstemhm",min:2,stackClearing:!0,stem:!0},{id:"hintmask",min:0,stackClearing:!0},{id:"cntrmask",min:0,stackClearing:!0},{id:"rmoveto",min:2,stackClearing:!0},{id:"hmoveto",min:1,stackClearing:!0},{id:"vstemhm",min:2,stackClearing:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1,undefStack:!0},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],t=[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:function(e,t){e[t-2]=e[t-2]+e[t-1]}},{id:"sub",min:2,stackDelta:-1,stackFn:function(e,t){e[t-2]=e[t-2]-e[t-1]}},{id:"div",min:2,stackDelta:-1,stackFn:function(e,t){e[t-2]=e[t-2]/e[t-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn:function(e,t){e[t-1]=-e[t-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:function(e,t){e[t-2]=e[t-2]*e[t-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:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];function r(e,t,r){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!r}r.prototype={parse:function(){var e=this.properties,t=new c;this.cff=t;var r=this.parseHeader(),a=this.parseIndex(r.endPos),i=this.parseIndex(a.endPos),n=this.parseIndex(i.endPos),o=this.parseIndex(n.endPos),s=this.parseDict(i.obj.get(0)),l=this.createDict(d,s,t.strings);t.header=r.obj;t.names=this.parseNameIndex(a.obj);t.strings=this.parseStringIndex(n.obj);t.topDict=l;t.globalSubrIndex=o.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=l.hasName("ROS");var u=l.getByName("CharStrings"),h=this.parseIndex(u).obj,f=l.getByName("FontMatrix");f&&(e.fontMatrix=f);var g,m,p=l.getByName("FontBBox");if(p){e.ascent=Math.max(p[3],p[1]);e.descent=Math.min(p[1],p[3]);e.ascentScaled=!0}if(t.isCIDFont){for(var v=this.parseIndex(l.getByName("FDArray")).obj,b=0,y=v.count;b<y;++b){var w=v.get(b),k=this.createDict(d,this.parseDict(w),t.strings);this.parsePrivateDict(k);t.fdArray.push(k)}m=null;g=this.parseCharsets(l.getByName("charset"),h.count,t.strings,!0);t.fdSelect=this.parseFDSelect(l.getByName("FDSelect"),h.count)}else{g=this.parseCharsets(l.getByName("charset"),h.count,t.strings,!1);m=this.parseEncoding(l.getByName("Encoding"),e,t.strings,g.charset)}t.charset=g;t.encoding=m;var S=this.parseCharStrings({charStrings:h,localSubrIndex:l.privateDict.subrsIndex,globalSubrIndex:o.obj,fdSelect:t.fdSelect,fdArray:t.fdArray,privateDict:l.privateDict});t.charStrings=S.charStrings;t.seacs=S.seacs;t.widths=S.widths;return t},parseHeader:function(){for(var e=this.bytes,t=e.length,r=0;r<t&&1!==e[r];)++r;if(r>=t)throw new a.FormatError("Invalid CFF header");if(0!==r){(0,a.info)("cff data is shifted");e=e.subarray(r);this.bytes=e}var i=e[0],n=e[1],o=e[2],s=e[3];return{obj:new l(i,n,o,s),endPos:o}},parseDict:function(e){var t=0;function r(){var r=e[t++];if(30===r)return function(){var r="",a=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],i=e.length;for(;t<i;){var n=e[t++],o=n>>4,s=15&n;if(15===o)break;r+=a[o];if(15===s)break;r+=a[s]}return parseFloat(r)}();if(28===r)return r=((r=e[t++])<<24|e[t++]<<16)>>16;if(29===r)return r=(r=(r=(r=e[t++])<<8|e[t++])<<8|e[t++])<<8|e[t++];if(r>=32&&r<=246)return r-139;if(r>=247&&r<=250)return 256*(r-247)+e[t++]+108;if(r>=251&&r<=254)return-256*(r-251)-e[t++]-108;(0,a.warn)('CFFParser_parseDict: "'+r+'" is a reserved command.');return NaN}var i=[],n=[];t=0;for(var o=e.length;t<o;){var s=e[t];if(s<=21){12===s&&(s=s<<8|e[++t]);n.push([s,i]);i=[];++t}else i.push(r())}return n},parseIndex:function(e){var t,r,a=new h,i=this.bytes,n=i[e++]<<8|i[e++],o=[],s=e;if(0!==n){var c=i[e++],l=e+(n+1)*c-1;for(t=0,r=n+1;t<r;++t){for(var u=0,f=0;f<c;++f){u<<=8;u+=i[e++]}o.push(l+u)}s=o[n]}for(t=0,r=o.length-1;t<r;++t){var d=o[t],g=o[t+1];a.add(i.subarray(d,g))}return{obj:a,endPos:s}},parseNameIndex:function(e){for(var t=[],r=0,i=e.count;r<i;++r){var n=e.get(r);t.push((0,a.bytesToString)(n))}return t},parseStringIndex:function(e){for(var t=new u,r=0,i=e.count;r<i;++r){var n=e.get(r);t.add((0,a.bytesToString)(n))}return t},createDict:function(e,t,r){for(var a=new e(r),i=0,n=t.length;i<n;++i){var o=t[i],s=o[0],c=o[1];a.setByKey(s,c)}return a},parseCharString:function(r,i,n,o){if(!i||r.callDepth>10)return!1;for(var s=r.stackSize,c=r.stack,l=i.length,u=0;u<l;){var h=i[u++],f=null;if(12===h){var d=i[u++];if(0===d){i[u-2]=139;i[u-1]=22;s=0}else f=t[d]}else if(28===h){c[s]=(i[u]<<24|i[u+1]<<16)>>16;u+=2;s++}else if(14===h){if(s>=4){s-=4;if(this.seacAnalysisEnabled){r.seac=c.slice(s,s+4);return!1}}f=e[h]}else if(h>=32&&h<=246){c[s]=h-139;s++}else if(h>=247&&h<=254){c[s]=h<251?(h-247<<8)+i[u]+108:-(h-251<<8)-i[u]-108;u++;s++}else if(255===h){c[s]=(i[u]<<24|i[u+1]<<16|i[u+2]<<8|i[u+3])/65536;u+=4;s++}else if(19===h||20===h){r.hints+=s>>1;u+=r.hints+7>>3;s%=2;f=e[h]}else{if(10===h||29===h){var g;if(!(g=10===h?n:o)){f=e[h];(0,a.warn)("Missing subrsIndex for "+f.id);return!1}var m=32768;g.count<1240?m=107:g.count<33900&&(m=1131);var p=c[--s]+m;if(p<0||p>=g.count||isNaN(p)){f=e[h];(0,a.warn)("Out of bounds subrIndex for "+f.id);return!1}r.stackSize=s;r.callDepth++;if(!this.parseCharString(r,g.get(p),n,o))return!1;r.callDepth--;s=r.stackSize;continue}if(11===h){r.stackSize=s;return!0}f=e[h]}if(f){f.stem&&(r.hints+=s>>1);if("min"in f&&!r.undefStack&&s<f.min){(0,a.warn)("Not enough parameters for "+f.id+"; actual: "+s+", expected: "+f.min);return!1}if(r.firstStackClearing&&f.stackClearing){r.firstStackClearing=!1;(s-=f.min)>=2&&f.stem?s%=2:s>1&&(0,a.warn)("Found too many parameters for stack-clearing command");s>0&&c[s-1]>=0&&(r.width=c[s-1])}if("stackDelta"in f){"stackFn"in f&&f.stackFn(c,s);s+=f.stackDelta}else if(f.stackClearing)s=0;else if(f.resetStack){s=0;r.undefStack=!1}else if(f.undefStack){s=0;r.undefStack=!0;r.firstStackClearing=!1}}}r.stackSize=s;return!0},parseCharStrings:function(e){for(var t=e.charStrings,r=e.localSubrIndex,i=e.globalSubrIndex,n=e.fdSelect,o=e.fdArray,s=e.privateDict,c=[],l=[],u=t.count,h=0;h<u;h++){var f=t.get(h),d={callDepth:0,stackSize:0,stack:[],undefStack:!0,hints:0,firstStackClearing:!0,seac:null,width:null},g=!0,m=null,p=s;if(n&&o.length){var v=n.getFDIndex(h);if(-1===v){(0,a.warn)("Glyph index is not in fd select.");g=!1}if(v>=o.length){(0,a.warn)("Invalid fd index for glyph index.");g=!1}g&&(m=(p=o[v].privateDict).subrsIndex)}else r&&(m=r);g&&(g=this.parseCharString(d,f,m,i));if(null!==d.width){var b=p.getByName("nominalWidthX");l[h]=b+d.width}else{var y=p.getByName("defaultWidthX");l[h]=y}null!==d.seac&&(c[h]=d.seac);g||t.set(h,new Uint8Array([14]))}return{charStrings:t,seacs:c,widths:l}},emptyPrivateDictionary:function(e){var t=this.createDict(g,[],e.strings);e.setByKey(18,[0,0]);e.privateDict=t},parsePrivateDict:function(e){if(e.hasName("Private")){var t=e.getByName("Private");if(Array.isArray(t)&&2===t.length){var r=t[0],a=t[1];if(0===r||a>=this.bytes.length)this.emptyPrivateDictionary(e);else{var i=a+r,n=this.bytes.subarray(a,i),o=this.parseDict(n),s=this.createDict(g,o,e.strings);e.privateDict=s;if(s.getByName("Subrs")){var c=s.getByName("Subrs"),l=a+c;if(0===c||l>=this.bytes.length)this.emptyPrivateDictionary(e);else{var u=this.parseIndex(l);s.subrsIndex=u.obj}}}}else e.removeByName("Private")}else this.emptyPrivateDictionary(e)},parseCharsets:function(e,t,r,n){if(0===e)return new p(!0,m.ISO_ADOBE,i.ISOAdobeCharset);if(1===e)return new p(!0,m.EXPERT,i.ExpertCharset);if(2===e)return new p(!0,m.EXPERT_SUBSET,i.ExpertSubsetCharset);var o,s,c,l=this.bytes,u=e,h=l[e++],f=[".notdef"];t-=1;switch(h){case 0:for(c=0;c<t;c++){o=l[e++]<<8|l[e++];f.push(n?o:r.get(o))}break;case 1:for(;f.length<=t;){o=l[e++]<<8|l[e++];s=l[e++];for(c=0;c<=s;c++)f.push(n?o++:r.get(o++))}break;case 2:for(;f.length<=t;){o=l[e++]<<8|l[e++];s=l[e++]<<8|l[e++];for(c=0;c<=s;c++)f.push(n?o++:r.get(o++))}break;default:throw new a.FormatError("Unknown charset format")}var d=e,g=l.subarray(u,d);return new p(!1,h,f,g)},parseEncoding:function(e,t,r,i){var o,s,c,l=Object.create(null),u=this.bytes,h=!1,f=null;if(0===e||1===e){h=!0;o=e;var d=e?n.ExpertEncoding:n.StandardEncoding;for(s=0,c=i.length;s<c;s++){var g=d.indexOf(i[s]);-1!==g&&(l[g]=s)}}else{var m=e;switch(127&(o=u[e++])){case 0:var p=u[e++];for(s=1;s<=p;s++)l[u[e++]]=s;break;case 1:var b=u[e++],y=1;for(s=0;s<b;s++)for(var w=u[e++],k=u[e++],S=w;S<=w+k;S++)l[S]=y++;break;default:throw new a.FormatError("Unknown encoding format: "+o+" in CFF")}var C=e;if(128&o){u[m]&=127;!function(){var t=u[e++];for(s=0;s<t;s++){var a=u[e++],n=(u[e++]<<8)+(255&u[e++]);l[a]=i.indexOf(r.get(n))}}()}f=u.subarray(m,C)}return new v(h,o&=127,l,f)},parseFDSelect:function(e,t){var r,i=this.bytes,n=i[e++],o=[];switch(n){case 0:for(r=0;r<t;++r){var s=i[e++];o.push(s)}break;case 3:var c=i[e++]<<8|i[e++];for(r=0;r<c;++r){var l=i[e++]<<8|i[e++];if(0===r&&0!==l){(0,a.warn)("parseFDSelect: The first range must have a first GID of 0 -- trying to recover.");l=0}for(var u=i[e++],h=i[e]<<8|i[e+1],f=l;f<h;++f)o.push(u)}e+=2;break;default:throw new a.FormatError('parseFDSelect: Unknown format "'+n+'".')}if(o.length!==t)throw new a.FormatError("parseFDSelect: Invalid font data.");return new b(n,o)}};return r}(),c=function(){function e(){this.header=null;this.names=[];this.topDict=null;this.strings=new u;this.globalSubrIndex=null;this.encoding=null;this.charset=null;this.charStrings=null;this.fdArray=[];this.fdSelect=null;this.isCIDFont=!1}e.prototype={duplicateFirstGlyph:function(){if(this.charStrings.count>=65535)(0,a.warn)("Not enough space in charstrings to duplicate first glyph.");else{var e=this.charStrings.get(0);this.charStrings.add(e);this.isCIDFont&&this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0])}},hasGlyphId:function(e){return!(e<0||e>=this.charStrings.count)&&this.charStrings.get(e).length>0}};return e}(),l=function(){return function(e,t,r,a){this.major=e;this.minor=t;this.hdrSize=r;this.offSize=a}}(),u=function(){function e(){this.strings=[]}e.prototype={get:function(e){return e>=0&&e<=390?o[e]:e-391<=this.strings.length?this.strings[e-391]:o[0]},add:function(e){this.strings.push(e)},get count(){return this.strings.length}};return e}(),h=function(){function e(){this.objects=[];this.length=0}e.prototype={add:function(e){this.length+=e.length;this.objects.push(e)},set:function(e,t){this.length+=t.length-this.objects[e].length;this.objects[e]=t},get:function(e){return this.objects[e]},get count(){return this.objects.length}};return e}(),f=function(){function e(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}e.prototype={setByKey:function(e,t){if(!(e in this.keyToNameMap))return!1;var r=t.length;if(0===r)return!0;for(var i=0;i<r;i++)if(isNaN(t[i])){(0,a.warn)('Invalid CFFDict value: "'+t+'" for key "'+e+'".');return!0}var n=this.types[e];"num"!==n&&"sid"!==n&&"offset"!==n||(t=t[0]);this.values[e]=t;return!0},setByName:function(e,t){if(!(e in this.nameToKeyMap))throw new a.FormatError('Invalid dictionary name "'+e+'"');this.values[this.nameToKeyMap[e]]=t},hasName:function(e){return this.nameToKeyMap[e]in this.values},getByName:function(e){if(!(e in this.nameToKeyMap))throw new a.FormatError("Invalid dictionary name "+e+'"');var t=this.nameToKeyMap[e];return t in this.values?this.values[t]:this.defaults[t]},removeByName:function(e){delete this.values[this.nameToKeyMap[e]]}};e.createTables=function(e){for(var t={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]},r=0,a=e.length;r<a;++r){var i=e[r],n=Array.isArray(i[0])?(i[0][0]<<8)+i[0][1]:i[0];t.keyToNameMap[n]=i[1];t.nameToKeyMap[i[1]]=n;t.types[n]=i[2];t.defaults[n]=i[3];t.opcodes[n]=Array.isArray(i[0])?i[0]:[i[0]];t.order.push(n)}return t};return e}(),d=function(){var e=[[[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"],[.001,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]],t=null;function r(r){null===t&&(t=f.createTables(e));f.call(this,t,r);this.privateDict=null}r.prototype=Object.create(f.prototype);return r}(),g=function(){var e=[[6,"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",.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",.06],[[12,19],"initialRandomSeed","num",0],[20,"defaultWidthX","num",0],[21,"nominalWidthX","num",0],[19,"Subrs","offset",null]],t=null;function r(r){null===t&&(t=f.createTables(e));f.call(this,t,r);this.subrsIndex=null}r.prototype=Object.create(f.prototype);return r}(),m={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2},p=function(){return function(e,t,r,a){this.predefined=e;this.format=t;this.charset=r;this.raw=a}}(),v=function(){return function(e,t,r,a){this.predefined=e;this.format=t;this.encoding=r;this.raw=a}}(),b=function(){function e(e,t){this.format=e;this.fdSelect=t}e.prototype={getFDIndex:function(e){return e<0||e>=this.fdSelect.length?-1:this.fdSelect[e]}};return e}(),y=function(){function e(){this.offsets=Object.create(null)}e.prototype={isTracking:function(e){return e in this.offsets},track:function(e,t){if(e in this.offsets)throw new a.FormatError("Already tracking location of "+e);this.offsets[e]=t},offset:function(e){for(var t in this.offsets)this.offsets[t]+=e},setEntryLocation:function(e,t,r){if(!(e in this.offsets))throw new a.FormatError("Not tracking location of "+e);for(var i=r.data,n=this.offsets[e],o=0,s=t.length;o<s;++o){var c=5*o+n,l=c+1,u=c+2,h=c+3,f=c+4;if(29!==i[c]||0!==i[l]||0!==i[u]||0!==i[h]||0!==i[f])throw new a.FormatError("writing to an offset that is not empty");var d=t[o];i[c]=29;i[l]=d>>24&255;i[u]=d>>16&255;i[h]=d>>8&255;i[f]=255&d}}};return e}(),w=function(){function e(e){this.cff=e}e.prototype={compile:function(){var e=this.cff,t={data:[],length:0,add:function(e){this.data=this.data.concat(e);this.length=this.data.length}},r=this.compileHeader(e.header);t.add(r);var i=this.compileNameIndex(e.names);t.add(i);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){var n=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(var o=0,s=e.fdArray.length;o<s;o++){var c=e.fdArray[o],l=n.slice(0);c.hasName("FontMatrix")&&(l=a.Util.transform(l,c.getByName("FontMatrix")));c.setByName("FontMatrix",l)}}e.topDict.setByName("charset",0);var u=this.compileTopDicts([e.topDict],t.length,e.isCIDFont);t.add(u.output);var h=u.trackers[0],f=this.compileStringIndex(e.strings.strings);t.add(f);var d=this.compileIndex(e.globalSubrIndex);t.add(d);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)h.setEntryLocation("Encoding",[e.encoding.format],t);else{var g=this.compileEncoding(e.encoding);h.setEntryLocation("Encoding",[t.length],t);t.add(g)}var m=this.compileCharset(e.charset);h.setEntryLocation("charset",[t.length],t);t.add(m);var p=this.compileCharStrings(e.charStrings);h.setEntryLocation("CharStrings",[t.length],t);t.add(p);if(e.isCIDFont){h.setEntryLocation("FDSelect",[t.length],t);var v=this.compileFDSelect(e.fdSelect);t.add(v);u=this.compileTopDicts(e.fdArray,t.length,!0);h.setEntryLocation("FDArray",[t.length],t);t.add(u.output);var b=u.trackers;this.compilePrivateDicts(e.fdArray,b,t)}this.compilePrivateDicts([e.topDict],[h],t);t.add([0]);return t.data},encodeNumber:function(e){return parseFloat(e)!==parseInt(e,10)||isNaN(e)?this.encodeFloat(e):this.encodeInteger(e)},encodeFloat:function(e){var t=e.toString(),r=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(t);if(r){var a=parseFloat("1e"+((r[2]?+r[2]:0)+r[1].length));t=(Math.round(e*a)/a).toString()}var i,n,o="";for(i=0,n=t.length;i<n;++i){var s=t[i];o+="e"===s?"-"===t[++i]?"c":"b":"."===s?"a":"-"===s?"e":s}var c=[30];for(i=0,n=(o+=1&o.length?"f":"ff").length;i<n;i+=2)c.push(parseInt(o.substring(i,i+2),16));return c},encodeInteger:function(e){return e>=-107&&e<=107?[e+139]:e>=108&&e<=1131?[247+((e-=108)>>8),255&e]:e>=-1131&&e<=-108?[251+((e=-e-108)>>8),255&e]:e>=-32768&&e<=32767?[28,e>>8&255,255&e]:[29,e>>24&255,e>>16&255,e>>8&255,255&e]},compileHeader:function(e){return[e.major,e.minor,e.hdrSize,e.offSize]},compileNameIndex:function(e){for(var t=new h,r=0,i=e.length;r<i;++r){for(var n=e[r],o=Math.min(n.length,127),s=new Array(o),c=0;c<o;c++){var l=n[c];(l<"!"||l>"~"||"["===l||"]"===l||"("===l||")"===l||"{"===l||"}"===l||"<"===l||">"===l||"/"===l||"%"===l)&&(l="_");s[c]=l}""===(s=s.join(""))&&(s="Bad_Font_Name");t.add((0,a.stringToBytes)(s))}return this.compileIndex(t)},compileTopDicts:function(e,t,r){for(var a=[],i=new h,n=0,o=e.length;n<o;++n){var s=e[n];if(r){s.removeByName("CIDFontVersion");s.removeByName("CIDFontRevision");s.removeByName("CIDFontType");s.removeByName("CIDCount");s.removeByName("UIDBase")}var c=new y,l=this.compileDict(s,c);a.push(c);i.add(l);c.offset(t)}return{trackers:a,output:i=this.compileIndex(i,a)}},compilePrivateDicts:function(e,t,r){for(var i=0,n=e.length;i<n;++i){var o=e[i],s=o.privateDict;if(!s||!o.hasName("Private"))throw new a.FormatError("There must be a private dictionary.");var c=new y,l=this.compileDict(s,c),u=r.length;c.offset(u);l.length||(u=0);t[i].setEntryLocation("Private",[l.length,u],r);r.add(l);if(s.subrsIndex&&s.hasName("Subrs")){var h=this.compileIndex(s.subrsIndex);c.setEntryLocation("Subrs",[l.length],r);r.add(h)}}},compileDict:function(e,t){for(var r=[],i=e.order,n=0;n<i.length;++n){var o=i[n];if(o in e.values){var s=e.values[o],c=e.types[o];Array.isArray(c)||(c=[c]);Array.isArray(s)||(s=[s]);if(0!==s.length){for(var l=0,u=c.length;l<u;++l){var h=c[l],f=s[l];switch(h){case"num":case"sid":r=r.concat(this.encodeNumber(f));break;case"offset":var d=e.keyToNameMap[o];t.isTracking(d)||t.track(d,r.length);r=r.concat([29,0,0,0,0]);break;case"array":case"delta":r=r.concat(this.encodeNumber(f));for(var g=1,m=s.length;g<m;++g)r=r.concat(this.encodeNumber(s[g]));break;default:throw new a.FormatError("Unknown data type of "+h)}}r=r.concat(e.opcodes[o])}}}return r},compileStringIndex:function(e){for(var t=new h,r=0,i=e.length;r<i;++r)t.add((0,a.stringToBytes)(e[r]));return this.compileIndex(t)},compileGlobalSubrIndex:function(){var e=this.cff.globalSubrIndex;this.out.writeByteArray(this.compileIndex(e))},compileCharStrings:function(e){for(var t=new h,r=0;r<e.count;r++){var a=e.get(r);0!==a.length?t.add(a):t.add(new Uint8Array([139,14]))}return this.compileIndex(t)},compileCharset:function(e){var t=1+2*(this.cff.charStrings.count-1),r=new Uint8Array(t);return this.compileTypedArray(r)},compileEncoding:function(e){return this.compileTypedArray(e.raw)},compileFDSelect:function(e){var t=e.format,r=void 0,a=void 0;switch(t){case 0:(r=new Uint8Array(1+e.fdSelect.length))[0]=t;for(a=0;a<e.fdSelect.length;a++)r[a+1]=e.fdSelect[a];break;case 3:var i=e.fdSelect[0],n=[t,0,0,0,0,i];for(a=1;a<e.fdSelect.length;a++){var o=e.fdSelect[a];if(o!==i){n.push(a>>8&255,255&a,o);i=o}}var s=(n.length-3)/3;n[1]=s>>8&255;n[2]=255&s;n.push(a>>8&255,255&a);r=new Uint8Array(n)}return this.compileTypedArray(r)},compileTypedArray:function(e){for(var t=[],r=0,a=e.length;r<a;++r)t[r]=e[r];return t},compileIndex:function(e,t){t=t||[];var r=e.objects,a=r.length;if(0===a)return[0,0,0];var i,n,o=[a>>8&255,255&a],s=1;for(i=0;i<a;++i)s+=r[i].length;n=s<256?1:s<65536?2:s<16777216?3:4;o.push(n);var c=1;for(i=0;i<a+1;i++){1===n?o.push(255&c):2===n?o.push(c>>8&255,255&c):3===n?o.push(c>>16&255,c>>8&255,255&c):o.push(c>>>24&255,c>>16&255,c>>8&255,255&c);r[i]&&(c+=r[i].length)}for(i=0;i<a;i++){t[i]&&t[i].offset(o.length);for(var l=0,u=r[i].length;l<u;l++)o.push(r[i][l])}return o}};return e}();t.CFFStandardStrings=o;t.CFFParser=s;t.CFF=c;t.CFFHeader=l;t.CFFStrings=u;t.CFFIndex=h;t.CFFCharset=p;t.CFFTopDict=d;t.CFFPrivateDict=g;t.CFFCompiler=w;t.CFFFDSelect=b},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.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"];t.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"];t.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"]},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],i=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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","","","",""],n=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],o=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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","","","",""],s=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],c=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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",""],l=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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",""];t.WinAnsiEncoding=s;t.StandardEncoding=o;t.MacRomanEncoding=n;t.SymbolSetEncoding=c;t.ZapfDingbatsEncoding=l;t.ExpertEncoding=a;t.getEncoding=function(e){switch(e){case"WinAnsiEncoding":return s;case"StandardEncoding":return o;case"MacRomanEncoding":return n;case"SymbolSetEncoding":return c;case"ZapfDingbatsEncoding":return l;case"ExpertEncoding":return a;case"MacExpertEncoding":return i;default:return null}}},function(e,t,r){var a=r(2).getLookupTableFactory,i=a(function(e){e.A=65;e.AE=198;e.AEacute=508;e.AEmacron=482;e.AEsmall=63462;e.Aacute=193;e.Aacutesmall=63457;e.Abreve=258;e.Abreveacute=7854;e.Abrevecyrillic=1232;e.Abrevedotbelow=7862;e.Abrevegrave=7856;e.Abrevehookabove=7858;e.Abrevetilde=7860;e.Acaron=461;e.Acircle=9398;e.Acircumflex=194;e.Acircumflexacute=7844;e.Acircumflexdotbelow=7852;e.Acircumflexgrave=7846;e.Acircumflexhookabove=7848;e.Acircumflexsmall=63458;e.Acircumflextilde=7850;e.Acute=63177;e.Acutesmall=63412;e.Acyrillic=1040;e.Adblgrave=512;e.Adieresis=196;e.Adieresiscyrillic=1234;e.Adieresismacron=478;e.Adieresissmall=63460;e.Adotbelow=7840;e.Adotmacron=480;e.Agrave=192;e.Agravesmall=63456;e.Ahookabove=7842;e.Aiecyrillic=1236;e.Ainvertedbreve=514;e.Alpha=913;e.Alphatonos=902;e.Amacron=256;e.Amonospace=65313;e.Aogonek=260;e.Aring=197;e.Aringacute=506;e.Aringbelow=7680;e.Aringsmall=63461;e.Asmall=63329;e.Atilde=195;e.Atildesmall=63459;e.Aybarmenian=1329;e.B=66;e.Bcircle=9399;e.Bdotaccent=7682;e.Bdotbelow=7684;e.Becyrillic=1041;e.Benarmenian=1330;e.Beta=914;e.Bhook=385;e.Blinebelow=7686;e.Bmonospace=65314;e.Brevesmall=63220;e.Bsmall=63330;e.Btopbar=386;e.C=67;e.Caarmenian=1342;e.Cacute=262;e.Caron=63178;e.Caronsmall=63221;e.Ccaron=268;e.Ccedilla=199;e.Ccedillaacute=7688;e.Ccedillasmall=63463;e.Ccircle=9400;e.Ccircumflex=264;e.Cdot=266;e.Cdotaccent=266;e.Cedillasmall=63416;e.Chaarmenian=1353;e.Cheabkhasiancyrillic=1212;e.Checyrillic=1063;e.Chedescenderabkhasiancyrillic=1214;e.Chedescendercyrillic=1206;e.Chedieresiscyrillic=1268;e.Cheharmenian=1347;e.Chekhakassiancyrillic=1227;e.Cheverticalstrokecyrillic=1208;e.Chi=935;e.Chook=391;e.Circumflexsmall=63222;e.Cmonospace=65315;e.Coarmenian=1361;e.Csmall=63331;e.D=68;e.DZ=497;e.DZcaron=452;e.Daarmenian=1332;e.Dafrican=393;e.Dcaron=270;e.Dcedilla=7696;e.Dcircle=9401;e.Dcircumflexbelow=7698;e.Dcroat=272;e.Ddotaccent=7690;e.Ddotbelow=7692;e.Decyrillic=1044;e.Deicoptic=1006;e.Delta=8710;e.Deltagreek=916;e.Dhook=394;e.Dieresis=63179;e.DieresisAcute=63180;e.DieresisGrave=63181;e.Dieresissmall=63400;e.Digammagreek=988;e.Djecyrillic=1026;e.Dlinebelow=7694;e.Dmonospace=65316;e.Dotaccentsmall=63223;e.Dslash=272;e.Dsmall=63332;e.Dtopbar=395;e.Dz=498;e.Dzcaron=453;e.Dzeabkhasiancyrillic=1248;e.Dzecyrillic=1029;e.Dzhecyrillic=1039;e.E=69;e.Eacute=201;e.Eacutesmall=63465;e.Ebreve=276;e.Ecaron=282;e.Ecedillabreve=7708;e.Echarmenian=1333;e.Ecircle=9402;e.Ecircumflex=202;e.Ecircumflexacute=7870;e.Ecircumflexbelow=7704;e.Ecircumflexdotbelow=7878;e.Ecircumflexgrave=7872;e.Ecircumflexhookabove=7874;e.Ecircumflexsmall=63466;e.Ecircumflextilde=7876;e.Ecyrillic=1028;e.Edblgrave=516;e.Edieresis=203;e.Edieresissmall=63467;e.Edot=278;e.Edotaccent=278;e.Edotbelow=7864;e.Efcyrillic=1060;e.Egrave=200;e.Egravesmall=63464;e.Eharmenian=1335;e.Ehookabove=7866;e.Eightroman=8551;e.Einvertedbreve=518;e.Eiotifiedcyrillic=1124;e.Elcyrillic=1051;e.Elevenroman=8554;e.Emacron=274;e.Emacronacute=7702;e.Emacrongrave=7700;e.Emcyrillic=1052;e.Emonospace=65317;e.Encyrillic=1053;e.Endescendercyrillic=1186;e.Eng=330;e.Enghecyrillic=1188;e.Enhookcyrillic=1223;e.Eogonek=280;e.Eopen=400;e.Epsilon=917;e.Epsilontonos=904;e.Ercyrillic=1056;e.Ereversed=398;e.Ereversedcyrillic=1069;e.Escyrillic=1057;e.Esdescendercyrillic=1194;e.Esh=425;e.Esmall=63333;e.Eta=919;e.Etarmenian=1336;e.Etatonos=905;e.Eth=208;e.Ethsmall=63472;e.Etilde=7868;e.Etildebelow=7706;e.Euro=8364;e.Ezh=439;e.Ezhcaron=494;e.Ezhreversed=440;e.F=70;e.Fcircle=9403;e.Fdotaccent=7710;e.Feharmenian=1366;e.Feicoptic=996;e.Fhook=401;e.Fitacyrillic=1138;e.Fiveroman=8548;e.Fmonospace=65318;e.Fourroman=8547;e.Fsmall=63334;e.G=71;e.GBsquare=13191;e.Gacute=500;e.Gamma=915;e.Gammaafrican=404;e.Gangiacoptic=1002;e.Gbreve=286;e.Gcaron=486;e.Gcedilla=290;e.Gcircle=9404;e.Gcircumflex=284;e.Gcommaaccent=290;e.Gdot=288;e.Gdotaccent=288;e.Gecyrillic=1043;e.Ghadarmenian=1346;e.Ghemiddlehookcyrillic=1172;e.Ghestrokecyrillic=1170;e.Gheupturncyrillic=1168;e.Ghook=403;e.Gimarmenian=1331;e.Gjecyrillic=1027;e.Gmacron=7712;e.Gmonospace=65319;e.Grave=63182;e.Gravesmall=63328;e.Gsmall=63335;e.Gsmallhook=667;e.Gstroke=484;e.H=72;e.H18533=9679;e.H18543=9642;e.H18551=9643;e.H22073=9633;e.HPsquare=13259;e.Haabkhasiancyrillic=1192;e.Hadescendercyrillic=1202;e.Hardsigncyrillic=1066;e.Hbar=294;e.Hbrevebelow=7722;e.Hcedilla=7720;e.Hcircle=9405;e.Hcircumflex=292;e.Hdieresis=7718;e.Hdotaccent=7714;e.Hdotbelow=7716;e.Hmonospace=65320;e.Hoarmenian=1344;e.Horicoptic=1e3;e.Hsmall=63336;e.Hungarumlaut=63183;e.Hungarumlautsmall=63224;e.Hzsquare=13200;e.I=73;e.IAcyrillic=1071;e.IJ=306;e.IUcyrillic=1070;e.Iacute=205;e.Iacutesmall=63469;e.Ibreve=300;e.Icaron=463;e.Icircle=9406;e.Icircumflex=206;e.Icircumflexsmall=63470;e.Icyrillic=1030;e.Idblgrave=520;e.Idieresis=207;e.Idieresisacute=7726;e.Idieresiscyrillic=1252;e.Idieresissmall=63471;e.Idot=304;e.Idotaccent=304;e.Idotbelow=7882;e.Iebrevecyrillic=1238;e.Iecyrillic=1045;e.Ifraktur=8465;e.Igrave=204;e.Igravesmall=63468;e.Ihookabove=7880;e.Iicyrillic=1048;e.Iinvertedbreve=522;e.Iishortcyrillic=1049;e.Imacron=298;e.Imacroncyrillic=1250;e.Imonospace=65321;e.Iniarmenian=1339;e.Iocyrillic=1025;e.Iogonek=302;e.Iota=921;e.Iotaafrican=406;e.Iotadieresis=938;e.Iotatonos=906;e.Ismall=63337;e.Istroke=407;e.Itilde=296;e.Itildebelow=7724;e.Izhitsacyrillic=1140;e.Izhitsadblgravecyrillic=1142;e.J=74;e.Jaarmenian=1345;e.Jcircle=9407;e.Jcircumflex=308;e.Jecyrillic=1032;e.Jheharmenian=1355;e.Jmonospace=65322;e.Jsmall=63338;e.K=75;e.KBsquare=13189;e.KKsquare=13261;e.Kabashkircyrillic=1184;e.Kacute=7728;e.Kacyrillic=1050;e.Kadescendercyrillic=1178;e.Kahookcyrillic=1219;e.Kappa=922;e.Kastrokecyrillic=1182;e.Kaverticalstrokecyrillic=1180;e.Kcaron=488;e.Kcedilla=310;e.Kcircle=9408;e.Kcommaaccent=310;e.Kdotbelow=7730;e.Keharmenian=1364;e.Kenarmenian=1343;e.Khacyrillic=1061;e.Kheicoptic=998;e.Khook=408;e.Kjecyrillic=1036;e.Klinebelow=7732;e.Kmonospace=65323;e.Koppacyrillic=1152;e.Koppagreek=990;e.Ksicyrillic=1134;e.Ksmall=63339;e.L=76;e.LJ=455;e.LL=63167;e.Lacute=313;e.Lambda=923;e.Lcaron=317;e.Lcedilla=315;e.Lcircle=9409;e.Lcircumflexbelow=7740;e.Lcommaaccent=315;e.Ldot=319;e.Ldotaccent=319;e.Ldotbelow=7734;e.Ldotbelowmacron=7736;e.Liwnarmenian=1340;e.Lj=456;e.Ljecyrillic=1033;e.Llinebelow=7738;e.Lmonospace=65324;e.Lslash=321;e.Lslashsmall=63225;e.Lsmall=63340;e.M=77;e.MBsquare=13190;e.Macron=63184;e.Macronsmall=63407;e.Macute=7742;e.Mcircle=9410;e.Mdotaccent=7744;e.Mdotbelow=7746;e.Menarmenian=1348;e.Mmonospace=65325;e.Msmall=63341;e.Mturned=412;e.Mu=924;e.N=78;e.NJ=458;e.Nacute=323;e.Ncaron=327;e.Ncedilla=325;e.Ncircle=9411;e.Ncircumflexbelow=7754;e.Ncommaaccent=325;e.Ndotaccent=7748;e.Ndotbelow=7750;e.Nhookleft=413;e.Nineroman=8552;e.Nj=459;e.Njecyrillic=1034;e.Nlinebelow=7752;e.Nmonospace=65326;e.Nowarmenian=1350;e.Nsmall=63342;e.Ntilde=209;e.Ntildesmall=63473;e.Nu=925;e.O=79;e.OE=338;e.OEsmall=63226;e.Oacute=211;e.Oacutesmall=63475;e.Obarredcyrillic=1256;e.Obarreddieresiscyrillic=1258;e.Obreve=334;e.Ocaron=465;e.Ocenteredtilde=415;e.Ocircle=9412;e.Ocircumflex=212;e.Ocircumflexacute=7888;e.Ocircumflexdotbelow=7896;e.Ocircumflexgrave=7890;e.Ocircumflexhookabove=7892;e.Ocircumflexsmall=63476;e.Ocircumflextilde=7894;e.Ocyrillic=1054;e.Odblacute=336;e.Odblgrave=524;e.Odieresis=214;e.Odieresiscyrillic=1254;e.Odieresissmall=63478;e.Odotbelow=7884;e.Ogoneksmall=63227;e.Ograve=210;e.Ogravesmall=63474;e.Oharmenian=1365;e.Ohm=8486;e.Ohookabove=7886;e.Ohorn=416;e.Ohornacute=7898;e.Ohorndotbelow=7906;e.Ohorngrave=7900;e.Ohornhookabove=7902;e.Ohorntilde=7904;e.Ohungarumlaut=336;e.Oi=418;e.Oinvertedbreve=526;e.Omacron=332;e.Omacronacute=7762;e.Omacrongrave=7760;e.Omega=8486;e.Omegacyrillic=1120;e.Omegagreek=937;e.Omegaroundcyrillic=1146;e.Omegatitlocyrillic=1148;e.Omegatonos=911;e.Omicron=927;e.Omicrontonos=908;e.Omonospace=65327;e.Oneroman=8544;e.Oogonek=490;e.Oogonekmacron=492;e.Oopen=390;e.Oslash=216;e.Oslashacute=510;e.Oslashsmall=63480;e.Osmall=63343;e.Ostrokeacute=510;e.Otcyrillic=1150;e.Otilde=213;e.Otildeacute=7756;e.Otildedieresis=7758;e.Otildesmall=63477;e.P=80;e.Pacute=7764;e.Pcircle=9413;e.Pdotaccent=7766;e.Pecyrillic=1055;e.Peharmenian=1354;e.Pemiddlehookcyrillic=1190;e.Phi=934;e.Phook=420;e.Pi=928;e.Piwrarmenian=1363;e.Pmonospace=65328;e.Psi=936;e.Psicyrillic=1136;e.Psmall=63344;e.Q=81;e.Qcircle=9414;e.Qmonospace=65329;e.Qsmall=63345;e.R=82;e.Raarmenian=1356;e.Racute=340;e.Rcaron=344;e.Rcedilla=342;e.Rcircle=9415;e.Rcommaaccent=342;e.Rdblgrave=528;e.Rdotaccent=7768;e.Rdotbelow=7770;e.Rdotbelowmacron=7772;e.Reharmenian=1360;e.Rfraktur=8476;e.Rho=929;e.Ringsmall=63228;e.Rinvertedbreve=530;e.Rlinebelow=7774;e.Rmonospace=65330;e.Rsmall=63346;e.Rsmallinverted=641;e.Rsmallinvertedsuperior=694;e.S=83;e.SF010000=9484;e.SF020000=9492;e.SF030000=9488;e.SF040000=9496;e.SF050000=9532;e.SF060000=9516;e.SF070000=9524;e.SF080000=9500;e.SF090000=9508;e.SF100000=9472;e.SF110000=9474;e.SF190000=9569;e.SF200000=9570;e.SF210000=9558;e.SF220000=9557;e.SF230000=9571;e.SF240000=9553;e.SF250000=9559;e.SF260000=9565;e.SF270000=9564;e.SF280000=9563;e.SF360000=9566;e.SF370000=9567;e.SF380000=9562;e.SF390000=9556;e.SF400000=9577;e.SF410000=9574;e.SF420000=9568;e.SF430000=9552;e.SF440000=9580;e.SF450000=9575;e.SF460000=9576;e.SF470000=9572;e.SF480000=9573;e.SF490000=9561;e.SF500000=9560;e.SF510000=9554;e.SF520000=9555;e.SF530000=9579;e.SF540000=9578;e.Sacute=346;e.Sacutedotaccent=7780;e.Sampigreek=992;e.Scaron=352;e.Scarondotaccent=7782;e.Scaronsmall=63229;e.Scedilla=350;e.Schwa=399;e.Schwacyrillic=1240;e.Schwadieresiscyrillic=1242;e.Scircle=9416;e.Scircumflex=348;e.Scommaaccent=536;e.Sdotaccent=7776;e.Sdotbelow=7778;e.Sdotbelowdotaccent=7784;e.Seharmenian=1357;e.Sevenroman=8550;e.Shaarmenian=1351;e.Shacyrillic=1064;e.Shchacyrillic=1065;e.Sheicoptic=994;e.Shhacyrillic=1210;e.Shimacoptic=1004;e.Sigma=931;e.Sixroman=8549;e.Smonospace=65331;e.Softsigncyrillic=1068;e.Ssmall=63347;e.Stigmagreek=986;e.T=84;e.Tau=932;e.Tbar=358;e.Tcaron=356;e.Tcedilla=354;e.Tcircle=9417;e.Tcircumflexbelow=7792;e.Tcommaaccent=354;e.Tdotaccent=7786;e.Tdotbelow=7788;e.Tecyrillic=1058;e.Tedescendercyrillic=1196;e.Tenroman=8553;e.Tetsecyrillic=1204;e.Theta=920;e.Thook=428;e.Thorn=222;e.Thornsmall=63486;e.Threeroman=8546;e.Tildesmall=63230;e.Tiwnarmenian=1359;e.Tlinebelow=7790;e.Tmonospace=65332;e.Toarmenian=1337;e.Tonefive=444;e.Tonesix=388;e.Tonetwo=423;e.Tretroflexhook=430;e.Tsecyrillic=1062;e.Tshecyrillic=1035;e.Tsmall=63348;e.Twelveroman=8555;e.Tworoman=8545;e.U=85;e.Uacute=218;e.Uacutesmall=63482;e.Ubreve=364;e.Ucaron=467;e.Ucircle=9418;e.Ucircumflex=219;e.Ucircumflexbelow=7798;e.Ucircumflexsmall=63483;e.Ucyrillic=1059;e.Udblacute=368;e.Udblgrave=532;e.Udieresis=220;e.Udieresisacute=471;e.Udieresisbelow=7794;e.Udieresiscaron=473;e.Udieresiscyrillic=1264;e.Udieresisgrave=475;e.Udieresismacron=469;e.Udieresissmall=63484;e.Udotbelow=7908;e.Ugrave=217;e.Ugravesmall=63481;e.Uhookabove=7910;e.Uhorn=431;e.Uhornacute=7912;e.Uhorndotbelow=7920;e.Uhorngrave=7914;e.Uhornhookabove=7916;e.Uhorntilde=7918;e.Uhungarumlaut=368;e.Uhungarumlautcyrillic=1266;e.Uinvertedbreve=534;e.Ukcyrillic=1144;e.Umacron=362;e.Umacroncyrillic=1262;e.Umacrondieresis=7802;e.Umonospace=65333;e.Uogonek=370;e.Upsilon=933;e.Upsilon1=978;e.Upsilonacutehooksymbolgreek=979;e.Upsilonafrican=433;e.Upsilondieresis=939;e.Upsilondieresishooksymbolgreek=980;e.Upsilonhooksymbol=978;e.Upsilontonos=910;e.Uring=366;e.Ushortcyrillic=1038;e.Usmall=63349;e.Ustraightcyrillic=1198;e.Ustraightstrokecyrillic=1200;e.Utilde=360;e.Utildeacute=7800;e.Utildebelow=7796;e.V=86;e.Vcircle=9419;e.Vdotbelow=7806;e.Vecyrillic=1042;e.Vewarmenian=1358;e.Vhook=434;e.Vmonospace=65334;e.Voarmenian=1352;e.Vsmall=63350;e.Vtilde=7804;e.W=87;e.Wacute=7810;e.Wcircle=9420;e.Wcircumflex=372;e.Wdieresis=7812;e.Wdotaccent=7814;e.Wdotbelow=7816;e.Wgrave=7808;e.Wmonospace=65335;e.Wsmall=63351;e.X=88;e.Xcircle=9421;e.Xdieresis=7820;e.Xdotaccent=7818;e.Xeharmenian=1341;e.Xi=926;e.Xmonospace=65336;e.Xsmall=63352;e.Y=89;e.Yacute=221;e.Yacutesmall=63485;e.Yatcyrillic=1122;e.Ycircle=9422;e.Ycircumflex=374;e.Ydieresis=376;e.Ydieresissmall=63487;e.Ydotaccent=7822;e.Ydotbelow=7924;e.Yericyrillic=1067;e.Yerudieresiscyrillic=1272;e.Ygrave=7922;e.Yhook=435;e.Yhookabove=7926;e.Yiarmenian=1349;e.Yicyrillic=1031;e.Yiwnarmenian=1362;e.Ymonospace=65337;e.Ysmall=63353;e.Ytilde=7928;e.Yusbigcyrillic=1130;e.Yusbigiotifiedcyrillic=1132;e.Yuslittlecyrillic=1126;e.Yuslittleiotifiedcyrillic=1128;e.Z=90;e.Zaarmenian=1334;e.Zacute=377;e.Zcaron=381;e.Zcaronsmall=63231;e.Zcircle=9423;e.Zcircumflex=7824;e.Zdot=379;e.Zdotaccent=379;e.Zdotbelow=7826;e.Zecyrillic=1047;e.Zedescendercyrillic=1176;e.Zedieresiscyrillic=1246;e.Zeta=918;e.Zhearmenian=1338;e.Zhebrevecyrillic=1217;e.Zhecyrillic=1046;e.Zhedescendercyrillic=1174;e.Zhedieresiscyrillic=1244;e.Zlinebelow=7828;e.Zmonospace=65338;e.Zsmall=63354;e.Zstroke=437;e.a=97;e.aabengali=2438;e.aacute=225;e.aadeva=2310;e.aagujarati=2694;e.aagurmukhi=2566;e.aamatragurmukhi=2622;e.aarusquare=13059;e.aavowelsignbengali=2494;e.aavowelsigndeva=2366;e.aavowelsigngujarati=2750;e.abbreviationmarkarmenian=1375;e.abbreviationsigndeva=2416;e.abengali=2437;e.abopomofo=12570;e.abreve=259;e.abreveacute=7855;e.abrevecyrillic=1233;e.abrevedotbelow=7863;e.abrevegrave=7857;e.abrevehookabove=7859;e.abrevetilde=7861;e.acaron=462;e.acircle=9424;e.acircumflex=226;e.acircumflexacute=7845;e.acircumflexdotbelow=7853;e.acircumflexgrave=7847;e.acircumflexhookabove=7849;e.acircumflextilde=7851;e.acute=180;e.acutebelowcmb=791;e.acutecmb=769;e.acutecomb=769;e.acutedeva=2388;e.acutelowmod=719;e.acutetonecmb=833;e.acyrillic=1072;e.adblgrave=513;e.addakgurmukhi=2673;e.adeva=2309;e.adieresis=228;e.adieresiscyrillic=1235;e.adieresismacron=479;e.adotbelow=7841;e.adotmacron=481;e.ae=230;e.aeacute=509;e.aekorean=12624;e.aemacron=483;e.afii00208=8213;e.afii08941=8356;e.afii10017=1040;e.afii10018=1041;e.afii10019=1042;e.afii10020=1043;e.afii10021=1044;e.afii10022=1045;e.afii10023=1025;e.afii10024=1046;e.afii10025=1047;e.afii10026=1048;e.afii10027=1049;e.afii10028=1050;e.afii10029=1051;e.afii10030=1052;e.afii10031=1053;e.afii10032=1054;e.afii10033=1055;e.afii10034=1056;e.afii10035=1057;e.afii10036=1058;e.afii10037=1059;e.afii10038=1060;e.afii10039=1061;e.afii10040=1062;e.afii10041=1063;e.afii10042=1064;e.afii10043=1065;e.afii10044=1066;e.afii10045=1067;e.afii10046=1068;e.afii10047=1069;e.afii10048=1070;e.afii10049=1071;e.afii10050=1168;e.afii10051=1026;e.afii10052=1027;e.afii10053=1028;e.afii10054=1029;e.afii10055=1030;e.afii10056=1031;e.afii10057=1032;e.afii10058=1033;e.afii10059=1034;e.afii10060=1035;e.afii10061=1036;e.afii10062=1038;e.afii10063=63172;e.afii10064=63173;e.afii10065=1072;e.afii10066=1073;e.afii10067=1074;e.afii10068=1075;e.afii10069=1076;e.afii10070=1077;e.afii10071=1105;e.afii10072=1078;e.afii10073=1079;e.afii10074=1080;e.afii10075=1081;e.afii10076=1082;e.afii10077=1083;e.afii10078=1084;e.afii10079=1085;e.afii10080=1086;e.afii10081=1087;e.afii10082=1088;e.afii10083=1089;e.afii10084=1090;e.afii10085=1091;e.afii10086=1092;e.afii10087=1093;e.afii10088=1094;e.afii10089=1095;e.afii10090=1096;e.afii10091=1097;e.afii10092=1098;e.afii10093=1099;e.afii10094=1100;e.afii10095=1101;e.afii10096=1102;e.afii10097=1103;e.afii10098=1169;e.afii10099=1106;e.afii10100=1107;e.afii10101=1108;e.afii10102=1109;e.afii10103=1110;e.afii10104=1111;e.afii10105=1112;e.afii10106=1113;e.afii10107=1114;e.afii10108=1115;e.afii10109=1116;e.afii10110=1118;e.afii10145=1039;e.afii10146=1122;e.afii10147=1138;e.afii10148=1140;e.afii10192=63174;e.afii10193=1119;e.afii10194=1123;e.afii10195=1139;e.afii10196=1141;e.afii10831=63175;e.afii10832=63176;e.afii10846=1241;e.afii299=8206;e.afii300=8207;e.afii301=8205;e.afii57381=1642;e.afii57388=1548;e.afii57392=1632;e.afii57393=1633;e.afii57394=1634;e.afii57395=1635;e.afii57396=1636;e.afii57397=1637;e.afii57398=1638;e.afii57399=1639;e.afii57400=1640;e.afii57401=1641;e.afii57403=1563;e.afii57407=1567;e.afii57409=1569;e.afii57410=1570;e.afii57411=1571;e.afii57412=1572;e.afii57413=1573;e.afii57414=1574;e.afii57415=1575;e.afii57416=1576;e.afii57417=1577;e.afii57418=1578;e.afii57419=1579;e.afii57420=1580;e.afii57421=1581;e.afii57422=1582;e.afii57423=1583;e.afii57424=1584;e.afii57425=1585;e.afii57426=1586;e.afii57427=1587;e.afii57428=1588;e.afii57429=1589;e.afii57430=1590;e.afii57431=1591;e.afii57432=1592;e.afii57433=1593;e.afii57434=1594;e.afii57440=1600;e.afii57441=1601;e.afii57442=1602;e.afii57443=1603;e.afii57444=1604;e.afii57445=1605;e.afii57446=1606;e.afii57448=1608;e.afii57449=1609;e.afii57450=1610;e.afii57451=1611;e.afii57452=1612;e.afii57453=1613;e.afii57454=1614;e.afii57455=1615;e.afii57456=1616;e.afii57457=1617;e.afii57458=1618;e.afii57470=1607;e.afii57505=1700;e.afii57506=1662;e.afii57507=1670;e.afii57508=1688;e.afii57509=1711;e.afii57511=1657;e.afii57512=1672;e.afii57513=1681;e.afii57514=1722;e.afii57519=1746;e.afii57534=1749;e.afii57636=8362;e.afii57645=1470;e.afii57658=1475;e.afii57664=1488;e.afii57665=1489;e.afii57666=1490;e.afii57667=1491;e.afii57668=1492;e.afii57669=1493;e.afii57670=1494;e.afii57671=1495;e.afii57672=1496;e.afii57673=1497;e.afii57674=1498;e.afii57675=1499;e.afii57676=1500;e.afii57677=1501;e.afii57678=1502;e.afii57679=1503;e.afii57680=1504;e.afii57681=1505;e.afii57682=1506;e.afii57683=1507;e.afii57684=1508;e.afii57685=1509;e.afii57686=1510;e.afii57687=1511;e.afii57688=1512;e.afii57689=1513;e.afii57690=1514;e.afii57694=64298;e.afii57695=64299;e.afii57700=64331;e.afii57705=64287;e.afii57716=1520;e.afii57717=1521;e.afii57718=1522;e.afii57723=64309;e.afii57793=1460;e.afii57794=1461;e.afii57795=1462;e.afii57796=1467;e.afii57797=1464;e.afii57798=1463;e.afii57799=1456;e.afii57800=1458;e.afii57801=1457;e.afii57802=1459;e.afii57803=1474;e.afii57804=1473;e.afii57806=1465;e.afii57807=1468;e.afii57839=1469;e.afii57841=1471;e.afii57842=1472;e.afii57929=700;e.afii61248=8453;e.afii61289=8467;e.afii61352=8470;e.afii61573=8236;e.afii61574=8237;e.afii61575=8238;e.afii61664=8204;e.afii63167=1645;e.afii64937=701;e.agrave=224;e.agujarati=2693;e.agurmukhi=2565;e.ahiragana=12354;e.ahookabove=7843;e.aibengali=2448;e.aibopomofo=12574;e.aideva=2320;e.aiecyrillic=1237;e.aigujarati=2704;e.aigurmukhi=2576;e.aimatragurmukhi=2632;e.ainarabic=1593;e.ainfinalarabic=65226;e.aininitialarabic=65227;e.ainmedialarabic=65228;e.ainvertedbreve=515;e.aivowelsignbengali=2504;e.aivowelsigndeva=2376;e.aivowelsigngujarati=2760;e.akatakana=12450;e.akatakanahalfwidth=65393;e.akorean=12623;e.alef=1488;e.alefarabic=1575;e.alefdageshhebrew=64304;e.aleffinalarabic=65166;e.alefhamzaabovearabic=1571;e.alefhamzaabovefinalarabic=65156;e.alefhamzabelowarabic=1573;e.alefhamzabelowfinalarabic=65160;e.alefhebrew=1488;e.aleflamedhebrew=64335;e.alefmaddaabovearabic=1570;e.alefmaddaabovefinalarabic=65154;e.alefmaksuraarabic=1609;e.alefmaksurafinalarabic=65264;e.alefmaksurainitialarabic=65267;e.alefmaksuramedialarabic=65268;e.alefpatahhebrew=64302;e.alefqamatshebrew=64303;e.aleph=8501;e.allequal=8780;e.alpha=945;e.alphatonos=940;e.amacron=257;e.amonospace=65345;e.ampersand=38;e.ampersandmonospace=65286;e.ampersandsmall=63270;e.amsquare=13250;e.anbopomofo=12578;e.angbopomofo=12580;e.angbracketleft=12296;e.angbracketright=12297;e.angkhankhuthai=3674;e.angle=8736;e.anglebracketleft=12296;e.anglebracketleftvertical=65087;e.anglebracketright=12297;e.anglebracketrightvertical=65088;e.angleleft=9001;e.angleright=9002;e.angstrom=8491;e.anoteleia=903;e.anudattadeva=2386;e.anusvarabengali=2434;e.anusvaradeva=2306;e.anusvaragujarati=2690;e.aogonek=261;e.apaatosquare=13056;e.aparen=9372;e.apostrophearmenian=1370;e.apostrophemod=700;e.apple=63743;e.approaches=8784;e.approxequal=8776;e.approxequalorimage=8786;e.approximatelyequal=8773;e.araeaekorean=12686;e.araeakorean=12685;e.arc=8978;e.arighthalfring=7834;e.aring=229;e.aringacute=507;e.aringbelow=7681;e.arrowboth=8596;e.arrowdashdown=8675;e.arrowdashleft=8672;e.arrowdashright=8674;e.arrowdashup=8673;e.arrowdblboth=8660;e.arrowdbldown=8659;e.arrowdblleft=8656;e.arrowdblright=8658;e.arrowdblup=8657;e.arrowdown=8595;e.arrowdownleft=8601;e.arrowdownright=8600;e.arrowdownwhite=8681;e.arrowheaddownmod=709;e.arrowheadleftmod=706;e.arrowheadrightmod=707;e.arrowheadupmod=708;e.arrowhorizex=63719;e.arrowleft=8592;e.arrowleftdbl=8656;e.arrowleftdblstroke=8653;e.arrowleftoverright=8646;e.arrowleftwhite=8678;e.arrowright=8594;e.arrowrightdblstroke=8655;e.arrowrightheavy=10142;e.arrowrightoverleft=8644;e.arrowrightwhite=8680;e.arrowtableft=8676;e.arrowtabright=8677;e.arrowup=8593;e.arrowupdn=8597;e.arrowupdnbse=8616;e.arrowupdownbase=8616;e.arrowupleft=8598;e.arrowupleftofdown=8645;e.arrowupright=8599;e.arrowupwhite=8679;e.arrowvertex=63718;e.asciicircum=94;e.asciicircummonospace=65342;e.asciitilde=126;e.asciitildemonospace=65374;e.ascript=593;e.ascriptturned=594;e.asmallhiragana=12353;e.asmallkatakana=12449;e.asmallkatakanahalfwidth=65383;e.asterisk=42;e.asteriskaltonearabic=1645;e.asteriskarabic=1645;e.asteriskmath=8727;e.asteriskmonospace=65290;e.asterisksmall=65121;e.asterism=8258;e.asuperior=63209;e.asymptoticallyequal=8771;e.at=64;e.atilde=227;e.atmonospace=65312;e.atsmall=65131;e.aturned=592;e.aubengali=2452;e.aubopomofo=12576;e.audeva=2324;e.augujarati=2708;e.augurmukhi=2580;e.aulengthmarkbengali=2519;e.aumatragurmukhi=2636;e.auvowelsignbengali=2508;e.auvowelsigndeva=2380;e.auvowelsigngujarati=2764;e.avagrahadeva=2365;e.aybarmenian=1377;e.ayin=1506;e.ayinaltonehebrew=64288;e.ayinhebrew=1506;e.b=98;e.babengali=2476;e.backslash=92;e.backslashmonospace=65340;e.badeva=2348;e.bagujarati=2732;e.bagurmukhi=2604;e.bahiragana=12400;e.bahtthai=3647;e.bakatakana=12496;e.bar=124;e.barmonospace=65372;e.bbopomofo=12549;e.bcircle=9425;e.bdotaccent=7683;e.bdotbelow=7685;e.beamedsixteenthnotes=9836;e.because=8757;e.becyrillic=1073;e.beharabic=1576;e.behfinalarabic=65168;e.behinitialarabic=65169;e.behiragana=12409;e.behmedialarabic=65170;e.behmeeminitialarabic=64671;e.behmeemisolatedarabic=64520;e.behnoonfinalarabic=64621;e.bekatakana=12505;e.benarmenian=1378;e.bet=1489;e.beta=946;e.betasymbolgreek=976;e.betdagesh=64305;e.betdageshhebrew=64305;e.bethebrew=1489;e.betrafehebrew=64332;e.bhabengali=2477;e.bhadeva=2349;e.bhagujarati=2733;e.bhagurmukhi=2605;e.bhook=595;e.bihiragana=12403;e.bikatakana=12499;e.bilabialclick=664;e.bindigurmukhi=2562;e.birusquare=13105;e.blackcircle=9679;e.blackdiamond=9670;e.blackdownpointingtriangle=9660;e.blackleftpointingpointer=9668;e.blackleftpointingtriangle=9664;e.blacklenticularbracketleft=12304;e.blacklenticularbracketleftvertical=65083;e.blacklenticularbracketright=12305;e.blacklenticularbracketrightvertical=65084;e.blacklowerlefttriangle=9699;e.blacklowerrighttriangle=9698;e.blackrectangle=9644;e.blackrightpointingpointer=9658;e.blackrightpointingtriangle=9654;e.blacksmallsquare=9642;e.blacksmilingface=9787;e.blacksquare=9632;e.blackstar=9733;e.blackupperlefttriangle=9700;e.blackupperrighttriangle=9701;e.blackuppointingsmalltriangle=9652;e.blackuppointingtriangle=9650;e.blank=9251;e.blinebelow=7687;e.block=9608;e.bmonospace=65346;e.bobaimaithai=3610;e.bohiragana=12412;e.bokatakana=12508;e.bparen=9373;e.bqsquare=13251;e.braceex=63732;e.braceleft=123;e.braceleftbt=63731;e.braceleftmid=63730;e.braceleftmonospace=65371;e.braceleftsmall=65115;e.bracelefttp=63729;e.braceleftvertical=65079;e.braceright=125;e.bracerightbt=63742;e.bracerightmid=63741;e.bracerightmonospace=65373;e.bracerightsmall=65116;e.bracerighttp=63740;e.bracerightvertical=65080;e.bracketleft=91;e.bracketleftbt=63728;e.bracketleftex=63727;e.bracketleftmonospace=65339;e.bracketlefttp=63726;e.bracketright=93;e.bracketrightbt=63739;e.bracketrightex=63738;e.bracketrightmonospace=65341;e.bracketrighttp=63737;e.breve=728;e.brevebelowcmb=814;e.brevecmb=774;e.breveinvertedbelowcmb=815;e.breveinvertedcmb=785;e.breveinverteddoublecmb=865;e.bridgebelowcmb=810;e.bridgeinvertedbelowcmb=826;e.brokenbar=166;e.bstroke=384;e.bsuperior=63210;e.btopbar=387;e.buhiragana=12406;e.bukatakana=12502;e.bullet=8226;e.bulletinverse=9688;e.bulletoperator=8729;e.bullseye=9678;e.c=99;e.caarmenian=1390;e.cabengali=2458;e.cacute=263;e.cadeva=2330;e.cagujarati=2714;e.cagurmukhi=2586;e.calsquare=13192;e.candrabindubengali=2433;e.candrabinducmb=784;e.candrabindudeva=2305;e.candrabindugujarati=2689;e.capslock=8682;e.careof=8453;e.caron=711;e.caronbelowcmb=812;e.caroncmb=780;e.carriagereturn=8629;e.cbopomofo=12568;e.ccaron=269;e.ccedilla=231;e.ccedillaacute=7689;e.ccircle=9426;e.ccircumflex=265;e.ccurl=597;e.cdot=267;e.cdotaccent=267;e.cdsquare=13253;e.cedilla=184;e.cedillacmb=807;e.cent=162;e.centigrade=8451;e.centinferior=63199;e.centmonospace=65504;e.centoldstyle=63394;e.centsuperior=63200;e.chaarmenian=1401;e.chabengali=2459;e.chadeva=2331;e.chagujarati=2715;e.chagurmukhi=2587;e.chbopomofo=12564;e.cheabkhasiancyrillic=1213;e.checkmark=10003;e.checyrillic=1095;e.chedescenderabkhasiancyrillic=1215;e.chedescendercyrillic=1207;e.chedieresiscyrillic=1269;e.cheharmenian=1395;e.chekhakassiancyrillic=1228;e.cheverticalstrokecyrillic=1209;e.chi=967;e.chieuchacirclekorean=12919;e.chieuchaparenkorean=12823;e.chieuchcirclekorean=12905;e.chieuchkorean=12618;e.chieuchparenkorean=12809;e.chochangthai=3594;e.chochanthai=3592;e.chochingthai=3593;e.chochoethai=3596;e.chook=392;e.cieucacirclekorean=12918;e.cieucaparenkorean=12822;e.cieuccirclekorean=12904;e.cieuckorean=12616;e.cieucparenkorean=12808;e.cieucuparenkorean=12828;e.circle=9675;e.circlecopyrt=169;e.circlemultiply=8855;e.circleot=8857;e.circleplus=8853;e.circlepostalmark=12342;e.circlewithlefthalfblack=9680;e.circlewithrighthalfblack=9681;e.circumflex=710;e.circumflexbelowcmb=813;e.circumflexcmb=770;e.clear=8999;e.clickalveolar=450;e.clickdental=448;e.clicklateral=449;e.clickretroflex=451;e.club=9827;e.clubsuitblack=9827;e.clubsuitwhite=9831;e.cmcubedsquare=13220;e.cmonospace=65347;e.cmsquaredsquare=13216;e.coarmenian=1409;e.colon=58;e.colonmonetary=8353;e.colonmonospace=65306;e.colonsign=8353;e.colonsmall=65109;e.colontriangularhalfmod=721;e.colontriangularmod=720;e.comma=44;e.commaabovecmb=787;e.commaaboverightcmb=789;e.commaaccent=63171;e.commaarabic=1548;e.commaarmenian=1373;e.commainferior=63201;e.commamonospace=65292;e.commareversedabovecmb=788;e.commareversedmod=701;e.commasmall=65104;e.commasuperior=63202;e.commaturnedabovecmb=786;e.commaturnedmod=699;e.compass=9788;e.congruent=8773;e.contourintegral=8750;e.control=8963;e.controlACK=6;e.controlBEL=7;e.controlBS=8;e.controlCAN=24;e.controlCR=13;e.controlDC1=17;e.controlDC2=18;e.controlDC3=19;e.controlDC4=20;e.controlDEL=127;e.controlDLE=16;e.controlEM=25;e.controlENQ=5;e.controlEOT=4;e.controlESC=27;e.controlETB=23;e.controlETX=3;e.controlFF=12;e.controlFS=28;e.controlGS=29;e.controlHT=9;e.controlLF=10;e.controlNAK=21;e.controlNULL=0;e.controlRS=30;e.controlSI=15;e.controlSO=14;e.controlSOT=2;e.controlSTX=1;e.controlSUB=26;e.controlSYN=22;e.controlUS=31;e.controlVT=11;e.copyright=169;e.copyrightsans=63721;e.copyrightserif=63193;e.cornerbracketleft=12300;e.cornerbracketlefthalfwidth=65378;e.cornerbracketleftvertical=65089;e.cornerbracketright=12301;e.cornerbracketrighthalfwidth=65379;e.cornerbracketrightvertical=65090;e.corporationsquare=13183;e.cosquare=13255;e.coverkgsquare=13254;e.cparen=9374;e.cruzeiro=8354;e.cstretched=663;e.curlyand=8911;e.curlyor=8910;e.currency=164;e.cyrBreve=63185;e.cyrFlex=63186;e.cyrbreve=63188;e.cyrflex=63189;e.d=100;e.daarmenian=1380;e.dabengali=2470;e.dadarabic=1590;e.dadeva=2342;e.dadfinalarabic=65214;e.dadinitialarabic=65215;e.dadmedialarabic=65216;e.dagesh=1468;e.dageshhebrew=1468;e.dagger=8224;e.daggerdbl=8225;e.dagujarati=2726;e.dagurmukhi=2598;e.dahiragana=12384;e.dakatakana=12480;e.dalarabic=1583;e.dalet=1491;e.daletdagesh=64307;e.daletdageshhebrew=64307;e.dalethebrew=1491;e.dalfinalarabic=65194;e.dammaarabic=1615;e.dammalowarabic=1615;e.dammatanaltonearabic=1612;e.dammatanarabic=1612;e.danda=2404;e.dargahebrew=1447;e.dargalefthebrew=1447;e.dasiapneumatacyrilliccmb=1157;e.dblGrave=63187;e.dblanglebracketleft=12298;e.dblanglebracketleftvertical=65085;e.dblanglebracketright=12299;e.dblanglebracketrightvertical=65086;e.dblarchinvertedbelowcmb=811;e.dblarrowleft=8660;e.dblarrowright=8658;e.dbldanda=2405;e.dblgrave=63190;e.dblgravecmb=783;e.dblintegral=8748;e.dbllowline=8215;e.dbllowlinecmb=819;e.dbloverlinecmb=831;e.dblprimemod=698;e.dblverticalbar=8214;e.dblverticallineabovecmb=782;e.dbopomofo=12553;e.dbsquare=13256;e.dcaron=271;e.dcedilla=7697;e.dcircle=9427;e.dcircumflexbelow=7699;e.dcroat=273;e.ddabengali=2465;e.ddadeva=2337;e.ddagujarati=2721;e.ddagurmukhi=2593;e.ddalarabic=1672;e.ddalfinalarabic=64393;e.dddhadeva=2396;e.ddhabengali=2466;e.ddhadeva=2338;e.ddhagujarati=2722;e.ddhagurmukhi=2594;e.ddotaccent=7691;e.ddotbelow=7693;e.decimalseparatorarabic=1643;e.decimalseparatorpersian=1643;e.decyrillic=1076;e.degree=176;e.dehihebrew=1453;e.dehiragana=12391;e.deicoptic=1007;e.dekatakana=12487;e.deleteleft=9003;e.deleteright=8998;e.delta=948;e.deltaturned=397;e.denominatorminusonenumeratorbengali=2552;e.dezh=676;e.dhabengali=2471;e.dhadeva=2343;e.dhagujarati=2727;e.dhagurmukhi=2599;e.dhook=599;e.dialytikatonos=901;e.dialytikatonoscmb=836;e.diamond=9830;e.diamondsuitwhite=9826;e.dieresis=168;e.dieresisacute=63191;e.dieresisbelowcmb=804;e.dieresiscmb=776;e.dieresisgrave=63192;e.dieresistonos=901;e.dihiragana=12386;e.dikatakana=12482;e.dittomark=12291;e.divide=247;e.divides=8739;e.divisionslash=8725;e.djecyrillic=1106;e.dkshade=9619;e.dlinebelow=7695;e.dlsquare=13207;e.dmacron=273;e.dmonospace=65348;e.dnblock=9604;e.dochadathai=3598;e.dodekthai=3604;e.dohiragana=12393;e.dokatakana=12489;e.dollar=36;e.dollarinferior=63203;e.dollarmonospace=65284;e.dollaroldstyle=63268;e.dollarsmall=65129;e.dollarsuperior=63204;e.dong=8363;e.dorusquare=13094;e.dotaccent=729;e.dotaccentcmb=775;e.dotbelowcmb=803;e.dotbelowcomb=803;e.dotkatakana=12539;e.dotlessi=305;e.dotlessj=63166;e.dotlessjstrokehook=644;e.dotmath=8901;e.dottedcircle=9676;e.doubleyodpatah=64287;e.doubleyodpatahhebrew=64287;e.downtackbelowcmb=798;e.downtackmod=725;e.dparen=9375;e.dsuperior=63211;e.dtail=598;e.dtopbar=396;e.duhiragana=12389;e.dukatakana=12485;e.dz=499;e.dzaltone=675;e.dzcaron=454;e.dzcurl=677;e.dzeabkhasiancyrillic=1249;e.dzecyrillic=1109;e.dzhecyrillic=1119;e.e=101;e.eacute=233;e.earth=9793;e.ebengali=2447;e.ebopomofo=12572;e.ebreve=277;e.ecandradeva=2317;e.ecandragujarati=2701;e.ecandravowelsigndeva=2373;e.ecandravowelsigngujarati=2757;e.ecaron=283;e.ecedillabreve=7709;e.echarmenian=1381;e.echyiwnarmenian=1415;e.ecircle=9428;e.ecircumflex=234;e.ecircumflexacute=7871;e.ecircumflexbelow=7705;e.ecircumflexdotbelow=7879;e.ecircumflexgrave=7873;e.ecircumflexhookabove=7875;e.ecircumflextilde=7877;e.ecyrillic=1108;e.edblgrave=517;e.edeva=2319;e.edieresis=235;e.edot=279;e.edotaccent=279;e.edotbelow=7865;e.eegurmukhi=2575;e.eematragurmukhi=2631;e.efcyrillic=1092;e.egrave=232;e.egujarati=2703;e.eharmenian=1383;e.ehbopomofo=12573;e.ehiragana=12360;e.ehookabove=7867;e.eibopomofo=12575;e.eight=56;e.eightarabic=1640;e.eightbengali=2542;e.eightcircle=9319;e.eightcircleinversesansserif=10129;e.eightdeva=2414;e.eighteencircle=9329;e.eighteenparen=9349;e.eighteenperiod=9369;e.eightgujarati=2798;e.eightgurmukhi=2670;e.eighthackarabic=1640;e.eighthangzhou=12328;e.eighthnotebeamed=9835;e.eightideographicparen=12839;e.eightinferior=8328;e.eightmonospace=65304;e.eightoldstyle=63288;e.eightparen=9339;e.eightperiod=9359;e.eightpersian=1784;e.eightroman=8567;e.eightsuperior=8312;e.eightthai=3672;e.einvertedbreve=519;e.eiotifiedcyrillic=1125;e.ekatakana=12456;e.ekatakanahalfwidth=65396;e.ekonkargurmukhi=2676;e.ekorean=12628;e.elcyrillic=1083;e.element=8712;e.elevencircle=9322;e.elevenparen=9342;e.elevenperiod=9362;e.elevenroman=8570;e.ellipsis=8230;e.ellipsisvertical=8942;e.emacron=275;e.emacronacute=7703;e.emacrongrave=7701;e.emcyrillic=1084;e.emdash=8212;e.emdashvertical=65073;e.emonospace=65349;e.emphasismarkarmenian=1371;e.emptyset=8709;e.enbopomofo=12579;e.encyrillic=1085;e.endash=8211;e.endashvertical=65074;e.endescendercyrillic=1187;e.eng=331;e.engbopomofo=12581;e.enghecyrillic=1189;e.enhookcyrillic=1224;e.enspace=8194;e.eogonek=281;e.eokorean=12627;e.eopen=603;e.eopenclosed=666;e.eopenreversed=604;e.eopenreversedclosed=606;e.eopenreversedhook=605;e.eparen=9376;e.epsilon=949;e.epsilontonos=941;e.equal=61;e.equalmonospace=65309;e.equalsmall=65126;e.equalsuperior=8316;e.equivalence=8801;e.erbopomofo=12582;e.ercyrillic=1088;e.ereversed=600;e.ereversedcyrillic=1101;e.escyrillic=1089;e.esdescendercyrillic=1195;e.esh=643;e.eshcurl=646;e.eshortdeva=2318;e.eshortvowelsigndeva=2374;e.eshreversedloop=426;e.eshsquatreversed=645;e.esmallhiragana=12359;e.esmallkatakana=12455;e.esmallkatakanahalfwidth=65386;e.estimated=8494;e.esuperior=63212;e.eta=951;e.etarmenian=1384;e.etatonos=942;e.eth=240;e.etilde=7869;e.etildebelow=7707;e.etnahtafoukhhebrew=1425;e.etnahtafoukhlefthebrew=1425;e.etnahtahebrew=1425;e.etnahtalefthebrew=1425;e.eturned=477;e.eukorean=12641;e.euro=8364;e.evowelsignbengali=2503;e.evowelsigndeva=2375;e.evowelsigngujarati=2759;e.exclam=33;e.exclamarmenian=1372;e.exclamdbl=8252;e.exclamdown=161;e.exclamdownsmall=63393;e.exclammonospace=65281;e.exclamsmall=63265;e.existential=8707;e.ezh=658;e.ezhcaron=495;e.ezhcurl=659;e.ezhreversed=441;e.ezhtail=442;e.f=102;e.fadeva=2398;e.fagurmukhi=2654;e.fahrenheit=8457;e.fathaarabic=1614;e.fathalowarabic=1614;e.fathatanarabic=1611;e.fbopomofo=12552;e.fcircle=9429;e.fdotaccent=7711;e.feharabic=1601;e.feharmenian=1414;e.fehfinalarabic=65234;e.fehinitialarabic=65235;e.fehmedialarabic=65236;e.feicoptic=997;e.female=9792;e.ff=64256;e.ffi=64259;e.ffl=64260;e.fi=64257;e.fifteencircle=9326;e.fifteenparen=9346;e.fifteenperiod=9366;e.figuredash=8210;e.filledbox=9632;e.filledrect=9644;e.finalkaf=1498;e.finalkafdagesh=64314;e.finalkafdageshhebrew=64314;e.finalkafhebrew=1498;e.finalmem=1501;e.finalmemhebrew=1501;e.finalnun=1503;e.finalnunhebrew=1503;e.finalpe=1507;e.finalpehebrew=1507;e.finaltsadi=1509;e.finaltsadihebrew=1509;e.firsttonechinese=713;e.fisheye=9673;e.fitacyrillic=1139;e.five=53;e.fivearabic=1637;e.fivebengali=2539;e.fivecircle=9316;e.fivecircleinversesansserif=10126;e.fivedeva=2411;e.fiveeighths=8541;e.fivegujarati=2795;e.fivegurmukhi=2667;e.fivehackarabic=1637;e.fivehangzhou=12325;e.fiveideographicparen=12836;e.fiveinferior=8325;e.fivemonospace=65301;e.fiveoldstyle=63285;e.fiveparen=9336;e.fiveperiod=9356;e.fivepersian=1781;e.fiveroman=8564;e.fivesuperior=8309;e.fivethai=3669;e.fl=64258;e.florin=402;e.fmonospace=65350;e.fmsquare=13209;e.fofanthai=3615;e.fofathai=3613;e.fongmanthai=3663;e.forall=8704;e.four=52;e.fourarabic=1636;e.fourbengali=2538;e.fourcircle=9315;e.fourcircleinversesansserif=10125;e.fourdeva=2410;e.fourgujarati=2794;e.fourgurmukhi=2666;e.fourhackarabic=1636;e.fourhangzhou=12324;e.fourideographicparen=12835;e.fourinferior=8324;e.fourmonospace=65300;e.fournumeratorbengali=2551;e.fouroldstyle=63284;e.fourparen=9335;e.fourperiod=9355;e.fourpersian=1780;e.fourroman=8563;e.foursuperior=8308;e.fourteencircle=9325;e.fourteenparen=9345;e.fourteenperiod=9365;e.fourthai=3668;e.fourthtonechinese=715;e.fparen=9377;e.fraction=8260;e.franc=8355;e.g=103;e.gabengali=2455;e.gacute=501;e.gadeva=2327;e.gafarabic=1711;e.gaffinalarabic=64403;e.gafinitialarabic=64404;e.gafmedialarabic=64405;e.gagujarati=2711;e.gagurmukhi=2583;e.gahiragana=12364;e.gakatakana=12460;e.gamma=947;e.gammalatinsmall=611;e.gammasuperior=736;e.gangiacoptic=1003;e.gbopomofo=12557;e.gbreve=287;e.gcaron=487;e.gcedilla=291;e.gcircle=9430;e.gcircumflex=285;e.gcommaaccent=291;e.gdot=289;e.gdotaccent=289;e.gecyrillic=1075;e.gehiragana=12370;e.gekatakana=12466;e.geometricallyequal=8785;e.gereshaccenthebrew=1436;e.gereshhebrew=1523;e.gereshmuqdamhebrew=1437;e.germandbls=223;e.gershayimaccenthebrew=1438;e.gershayimhebrew=1524;e.getamark=12307;e.ghabengali=2456;e.ghadarmenian=1394;e.ghadeva=2328;e.ghagujarati=2712;e.ghagurmukhi=2584;e.ghainarabic=1594;e.ghainfinalarabic=65230;e.ghaininitialarabic=65231;e.ghainmedialarabic=65232;e.ghemiddlehookcyrillic=1173;e.ghestrokecyrillic=1171;e.gheupturncyrillic=1169;e.ghhadeva=2394;e.ghhagurmukhi=2650;e.ghook=608;e.ghzsquare=13203;e.gihiragana=12366;e.gikatakana=12462;e.gimarmenian=1379;e.gimel=1490;e.gimeldagesh=64306;e.gimeldageshhebrew=64306;e.gimelhebrew=1490;e.gjecyrillic=1107;e.glottalinvertedstroke=446;e.glottalstop=660;e.glottalstopinverted=662;e.glottalstopmod=704;e.glottalstopreversed=661;e.glottalstopreversedmod=705;e.glottalstopreversedsuperior=740;e.glottalstopstroke=673;e.glottalstopstrokereversed=674;e.gmacron=7713;e.gmonospace=65351;e.gohiragana=12372;e.gokatakana=12468;e.gparen=9378;e.gpasquare=13228;e.gradient=8711;e.grave=96;e.gravebelowcmb=790;e.gravecmb=768;e.gravecomb=768;e.gravedeva=2387;e.gravelowmod=718;e.gravemonospace=65344;e.gravetonecmb=832;e.greater=62;e.greaterequal=8805;e.greaterequalorless=8923;e.greatermonospace=65310;e.greaterorequivalent=8819;e.greaterorless=8823;e.greateroverequal=8807;e.greatersmall=65125;e.gscript=609;e.gstroke=485;e.guhiragana=12368;e.guillemotleft=171;e.guillemotright=187;e.guilsinglleft=8249;e.guilsinglright=8250;e.gukatakana=12464;e.guramusquare=13080;e.gysquare=13257;e.h=104;e.haabkhasiancyrillic=1193;e.haaltonearabic=1729;e.habengali=2489;e.hadescendercyrillic=1203;e.hadeva=2361;e.hagujarati=2745;e.hagurmukhi=2617;e.haharabic=1581;e.hahfinalarabic=65186;e.hahinitialarabic=65187;e.hahiragana=12399;e.hahmedialarabic=65188;e.haitusquare=13098;e.hakatakana=12495;e.hakatakanahalfwidth=65418;e.halantgurmukhi=2637;e.hamzaarabic=1569;e.hamzalowarabic=1569;e.hangulfiller=12644;e.hardsigncyrillic=1098;e.harpoonleftbarbup=8636;e.harpoonrightbarbup=8640;e.hasquare=13258;e.hatafpatah=1458;e.hatafpatah16=1458;e.hatafpatah23=1458;e.hatafpatah2f=1458;e.hatafpatahhebrew=1458;e.hatafpatahnarrowhebrew=1458;e.hatafpatahquarterhebrew=1458;e.hatafpatahwidehebrew=1458;e.hatafqamats=1459;e.hatafqamats1b=1459;e.hatafqamats28=1459;e.hatafqamats34=1459;e.hatafqamatshebrew=1459;e.hatafqamatsnarrowhebrew=1459;e.hatafqamatsquarterhebrew=1459;e.hatafqamatswidehebrew=1459;e.hatafsegol=1457;e.hatafsegol17=1457;e.hatafsegol24=1457;e.hatafsegol30=1457;e.hatafsegolhebrew=1457;e.hatafsegolnarrowhebrew=1457;e.hatafsegolquarterhebrew=1457;e.hatafsegolwidehebrew=1457;e.hbar=295;e.hbopomofo=12559;e.hbrevebelow=7723;e.hcedilla=7721;e.hcircle=9431;e.hcircumflex=293;e.hdieresis=7719;e.hdotaccent=7715;e.hdotbelow=7717;e.he=1492;e.heart=9829;e.heartsuitblack=9829;e.heartsuitwhite=9825;e.hedagesh=64308;e.hedageshhebrew=64308;e.hehaltonearabic=1729;e.heharabic=1607;e.hehebrew=1492;e.hehfinalaltonearabic=64423;e.hehfinalalttwoarabic=65258;e.hehfinalarabic=65258;e.hehhamzaabovefinalarabic=64421;e.hehhamzaaboveisolatedarabic=64420;e.hehinitialaltonearabic=64424;e.hehinitialarabic=65259;e.hehiragana=12408;e.hehmedialaltonearabic=64425;e.hehmedialarabic=65260;e.heiseierasquare=13179;e.hekatakana=12504;e.hekatakanahalfwidth=65421;e.hekutaarusquare=13110;e.henghook=615;e.herutusquare=13113;e.het=1495;e.hethebrew=1495;e.hhook=614;e.hhooksuperior=689;e.hieuhacirclekorean=12923;e.hieuhaparenkorean=12827;e.hieuhcirclekorean=12909;e.hieuhkorean=12622;e.hieuhparenkorean=12813;e.hihiragana=12402;e.hikatakana=12498;e.hikatakanahalfwidth=65419;e.hiriq=1460;e.hiriq14=1460;e.hiriq21=1460;e.hiriq2d=1460;e.hiriqhebrew=1460;e.hiriqnarrowhebrew=1460;e.hiriqquarterhebrew=1460;e.hiriqwidehebrew=1460;e.hlinebelow=7830;e.hmonospace=65352;e.hoarmenian=1392;e.hohipthai=3627;e.hohiragana=12411;e.hokatakana=12507;e.hokatakanahalfwidth=65422;e.holam=1465;e.holam19=1465;e.holam26=1465;e.holam32=1465;e.holamhebrew=1465;e.holamnarrowhebrew=1465;e.holamquarterhebrew=1465;e.holamwidehebrew=1465;e.honokhukthai=3630;e.hookabovecomb=777;e.hookcmb=777;e.hookpalatalizedbelowcmb=801;e.hookretroflexbelowcmb=802;e.hoonsquare=13122;e.horicoptic=1001;e.horizontalbar=8213;e.horncmb=795;e.hotsprings=9832;e.house=8962;e.hparen=9379;e.hsuperior=688;e.hturned=613;e.huhiragana=12405;e.huiitosquare=13107;e.hukatakana=12501;e.hukatakanahalfwidth=65420;e.hungarumlaut=733;e.hungarumlautcmb=779;e.hv=405;e.hyphen=45;e.hypheninferior=63205;e.hyphenmonospace=65293;e.hyphensmall=65123;e.hyphensuperior=63206;e.hyphentwo=8208;e.i=105;e.iacute=237;e.iacyrillic=1103;e.ibengali=2439;e.ibopomofo=12583;e.ibreve=301;e.icaron=464;e.icircle=9432;e.icircumflex=238;e.icyrillic=1110;e.idblgrave=521;e.ideographearthcircle=12943;e.ideographfirecircle=12939;e.ideographicallianceparen=12863;e.ideographiccallparen=12858;e.ideographiccentrecircle=12965;e.ideographicclose=12294;e.ideographiccomma=12289;e.ideographiccommaleft=65380;e.ideographiccongratulationparen=12855;e.ideographiccorrectcircle=12963;e.ideographicearthparen=12847;e.ideographicenterpriseparen=12861;e.ideographicexcellentcircle=12957;e.ideographicfestivalparen=12864;e.ideographicfinancialcircle=12950;e.ideographicfinancialparen=12854;e.ideographicfireparen=12843;e.ideographichaveparen=12850;e.ideographichighcircle=12964;e.ideographiciterationmark=12293;e.ideographiclaborcircle=12952;e.ideographiclaborparen=12856;e.ideographicleftcircle=12967;e.ideographiclowcircle=12966;e.ideographicmedicinecircle=12969;e.ideographicmetalparen=12846;e.ideographicmoonparen=12842;e.ideographicnameparen=12852;e.ideographicperiod=12290;e.ideographicprintcircle=12958;e.ideographicreachparen=12867;e.ideographicrepresentparen=12857;e.ideographicresourceparen=12862;e.ideographicrightcircle=12968;e.ideographicsecretcircle=12953;e.ideographicselfparen=12866;e.ideographicsocietyparen=12851;e.ideographicspace=12288;e.ideographicspecialparen=12853;e.ideographicstockparen=12849;e.ideographicstudyparen=12859;e.ideographicsunparen=12848;e.ideographicsuperviseparen=12860;e.ideographicwaterparen=12844;e.ideographicwoodparen=12845;e.ideographiczero=12295;e.ideographmetalcircle=12942;e.ideographmooncircle=12938;e.ideographnamecircle=12948;e.ideographsuncircle=12944;e.ideographwatercircle=12940;e.ideographwoodcircle=12941;e.ideva=2311;e.idieresis=239;e.idieresisacute=7727;e.idieresiscyrillic=1253;e.idotbelow=7883;e.iebrevecyrillic=1239;e.iecyrillic=1077;e.ieungacirclekorean=12917;e.ieungaparenkorean=12821;e.ieungcirclekorean=12903;e.ieungkorean=12615;e.ieungparenkorean=12807;e.igrave=236;e.igujarati=2695;e.igurmukhi=2567;e.ihiragana=12356;e.ihookabove=7881;e.iibengali=2440;e.iicyrillic=1080;e.iideva=2312;e.iigujarati=2696;e.iigurmukhi=2568;e.iimatragurmukhi=2624;e.iinvertedbreve=523;e.iishortcyrillic=1081;e.iivowelsignbengali=2496;e.iivowelsigndeva=2368;e.iivowelsigngujarati=2752;e.ij=307;e.ikatakana=12452;e.ikatakanahalfwidth=65394;e.ikorean=12643;e.ilde=732;e.iluyhebrew=1452;e.imacron=299;e.imacroncyrillic=1251;e.imageorapproximatelyequal=8787;e.imatragurmukhi=2623;e.imonospace=65353;e.increment=8710;e.infinity=8734;e.iniarmenian=1387;e.integral=8747;e.integralbottom=8993;e.integralbt=8993;e.integralex=63733;e.integraltop=8992;e.integraltp=8992;e.intersection=8745;e.intisquare=13061;e.invbullet=9688;e.invcircle=9689;e.invsmileface=9787;e.iocyrillic=1105;e.iogonek=303;e.iota=953;e.iotadieresis=970;e.iotadieresistonos=912;e.iotalatin=617;e.iotatonos=943;e.iparen=9380;e.irigurmukhi=2674;e.ismallhiragana=12355;e.ismallkatakana=12451;e.ismallkatakanahalfwidth=65384;e.issharbengali=2554;e.istroke=616;e.isuperior=63213;e.iterationhiragana=12445;e.iterationkatakana=12541;e.itilde=297;e.itildebelow=7725;e.iubopomofo=12585;e.iucyrillic=1102;e.ivowelsignbengali=2495;e.ivowelsigndeva=2367;e.ivowelsigngujarati=2751;e.izhitsacyrillic=1141;e.izhitsadblgravecyrillic=1143;e.j=106;e.jaarmenian=1393;e.jabengali=2460;e.jadeva=2332;e.jagujarati=2716;e.jagurmukhi=2588;e.jbopomofo=12560;e.jcaron=496;e.jcircle=9433;e.jcircumflex=309;e.jcrossedtail=669;e.jdotlessstroke=607;e.jecyrillic=1112;e.jeemarabic=1580;e.jeemfinalarabic=65182;e.jeeminitialarabic=65183;e.jeemmedialarabic=65184;e.jeharabic=1688;e.jehfinalarabic=64395;e.jhabengali=2461;e.jhadeva=2333;e.jhagujarati=2717;e.jhagurmukhi=2589;e.jheharmenian=1403;e.jis=12292;e.jmonospace=65354;e.jparen=9381;e.jsuperior=690;e.k=107;e.kabashkircyrillic=1185;e.kabengali=2453;e.kacute=7729;e.kacyrillic=1082;e.kadescendercyrillic=1179;e.kadeva=2325;e.kaf=1499;e.kafarabic=1603;e.kafdagesh=64315;e.kafdageshhebrew=64315;e.kaffinalarabic=65242;e.kafhebrew=1499;e.kafinitialarabic=65243;e.kafmedialarabic=65244;e.kafrafehebrew=64333;e.kagujarati=2709;e.kagurmukhi=2581;e.kahiragana=12363;e.kahookcyrillic=1220;e.kakatakana=12459;e.kakatakanahalfwidth=65398;e.kappa=954;e.kappasymbolgreek=1008;e.kapyeounmieumkorean=12657;e.kapyeounphieuphkorean=12676;e.kapyeounpieupkorean=12664;e.kapyeounssangpieupkorean=12665;e.karoriisquare=13069;e.kashidaautoarabic=1600;e.kashidaautonosidebearingarabic=1600;e.kasmallkatakana=12533;e.kasquare=13188;e.kasraarabic=1616;e.kasratanarabic=1613;e.kastrokecyrillic=1183;e.katahiraprolongmarkhalfwidth=65392;e.kaverticalstrokecyrillic=1181;e.kbopomofo=12558;e.kcalsquare=13193;e.kcaron=489;e.kcedilla=311;e.kcircle=9434;e.kcommaaccent=311;e.kdotbelow=7731;e.keharmenian=1412;e.kehiragana=12369;e.kekatakana=12465;e.kekatakanahalfwidth=65401;e.kenarmenian=1391;e.kesmallkatakana=12534;e.kgreenlandic=312;e.khabengali=2454;e.khacyrillic=1093;e.khadeva=2326;e.khagujarati=2710;e.khagurmukhi=2582;e.khaharabic=1582;e.khahfinalarabic=65190;e.khahinitialarabic=65191;e.khahmedialarabic=65192;e.kheicoptic=999;e.khhadeva=2393;e.khhagurmukhi=2649;e.khieukhacirclekorean=12920;e.khieukhaparenkorean=12824;e.khieukhcirclekorean=12906;e.khieukhkorean=12619;e.khieukhparenkorean=12810;e.khokhaithai=3586;e.khokhonthai=3589;e.khokhuatthai=3587;e.khokhwaithai=3588;e.khomutthai=3675;e.khook=409;e.khorakhangthai=3590;e.khzsquare=13201;e.kihiragana=12365;e.kikatakana=12461;e.kikatakanahalfwidth=65399;e.kiroguramusquare=13077;e.kiromeetorusquare=13078;e.kirosquare=13076;e.kiyeokacirclekorean=12910;e.kiyeokaparenkorean=12814;e.kiyeokcirclekorean=12896;e.kiyeokkorean=12593;e.kiyeokparenkorean=12800;e.kiyeoksioskorean=12595;e.kjecyrillic=1116;e.klinebelow=7733;e.klsquare=13208;e.kmcubedsquare=13222;e.kmonospace=65355;e.kmsquaredsquare=13218;e.kohiragana=12371;e.kohmsquare=13248;e.kokaithai=3585;e.kokatakana=12467;e.kokatakanahalfwidth=65402;e.kooposquare=13086;e.koppacyrillic=1153;e.koreanstandardsymbol=12927;e.koroniscmb=835;e.kparen=9382;e.kpasquare=13226;e.ksicyrillic=1135;e.ktsquare=13263;e.kturned=670;e.kuhiragana=12367;e.kukatakana=12463;e.kukatakanahalfwidth=65400;e.kvsquare=13240;e.kwsquare=13246;e.l=108;e.labengali=2482;e.lacute=314;e.ladeva=2354;e.lagujarati=2738;e.lagurmukhi=2610;e.lakkhangyaothai=3653;e.lamaleffinalarabic=65276;e.lamalefhamzaabovefinalarabic=65272;e.lamalefhamzaaboveisolatedarabic=65271;e.lamalefhamzabelowfinalarabic=65274;e.lamalefhamzabelowisolatedarabic=65273;e.lamalefisolatedarabic=65275;e.lamalefmaddaabovefinalarabic=65270;e.lamalefmaddaaboveisolatedarabic=65269;e.lamarabic=1604;e.lambda=955;e.lambdastroke=411;e.lamed=1500;e.lameddagesh=64316;e.lameddageshhebrew=64316;e.lamedhebrew=1500;e.lamfinalarabic=65246;e.lamhahinitialarabic=64714;e.laminitialarabic=65247;e.lamjeeminitialarabic=64713;e.lamkhahinitialarabic=64715;e.lamlamhehisolatedarabic=65010;e.lammedialarabic=65248;e.lammeemhahinitialarabic=64904;e.lammeeminitialarabic=64716;e.largecircle=9711;e.lbar=410;e.lbelt=620;e.lbopomofo=12556;e.lcaron=318;e.lcedilla=316;e.lcircle=9435;e.lcircumflexbelow=7741;e.lcommaaccent=316;e.ldot=320;e.ldotaccent=320;e.ldotbelow=7735;e.ldotbelowmacron=7737;e.leftangleabovecmb=794;e.lefttackbelowcmb=792;e.less=60;e.lessequal=8804;e.lessequalorgreater=8922;e.lessmonospace=65308;e.lessorequivalent=8818;e.lessorgreater=8822;e.lessoverequal=8806;e.lesssmall=65124;e.lezh=622;e.lfblock=9612;e.lhookretroflex=621;e.lira=8356;e.liwnarmenian=1388;e.lj=457;e.ljecyrillic=1113;e.ll=63168;e.lladeva=2355;e.llagujarati=2739;e.llinebelow=7739;e.llladeva=2356;e.llvocalicbengali=2529;e.llvocalicdeva=2401;e.llvocalicvowelsignbengali=2531;e.llvocalicvowelsigndeva=2403;e.lmiddletilde=619;e.lmonospace=65356;e.lmsquare=13264;e.lochulathai=3628;e.logicaland=8743;e.logicalnot=172;e.logicalnotreversed=8976;e.logicalor=8744;e.lolingthai=3621;e.longs=383;e.lowlinecenterline=65102;e.lowlinecmb=818;e.lowlinedashed=65101;e.lozenge=9674;e.lparen=9383;e.lslash=322;e.lsquare=8467;e.lsuperior=63214;e.ltshade=9617;e.luthai=3622;e.lvocalicbengali=2444;e.lvocalicdeva=2316;e.lvocalicvowelsignbengali=2530;e.lvocalicvowelsigndeva=2402;e.lxsquare=13267;e.m=109;e.mabengali=2478;e.macron=175;e.macronbelowcmb=817;e.macroncmb=772;e.macronlowmod=717;e.macronmonospace=65507;e.macute=7743;e.madeva=2350;e.magujarati=2734;e.magurmukhi=2606;e.mahapakhhebrew=1444;e.mahapakhlefthebrew=1444;e.mahiragana=12414;e.maichattawalowleftthai=63637;e.maichattawalowrightthai=63636;e.maichattawathai=3659;e.maichattawaupperleftthai=63635;e.maieklowleftthai=63628;e.maieklowrightthai=63627;e.maiekthai=3656;e.maiekupperleftthai=63626;e.maihanakatleftthai=63620;e.maihanakatthai=3633;e.maitaikhuleftthai=63625;e.maitaikhuthai=3655;e.maitholowleftthai=63631;e.maitholowrightthai=63630;e.maithothai=3657;e.maithoupperleftthai=63629;e.maitrilowleftthai=63634;e.maitrilowrightthai=63633;e.maitrithai=3658;e.maitriupperleftthai=63632;e.maiyamokthai=3654;e.makatakana=12510;e.makatakanahalfwidth=65423;e.male=9794;e.mansyonsquare=13127;e.maqafhebrew=1470;e.mars=9794;e.masoracirclehebrew=1455;e.masquare=13187;e.mbopomofo=12551;e.mbsquare=13268;e.mcircle=9436;e.mcubedsquare=13221;e.mdotaccent=7745;e.mdotbelow=7747;e.meemarabic=1605;e.meemfinalarabic=65250;e.meeminitialarabic=65251;e.meemmedialarabic=65252;e.meemmeeminitialarabic=64721;e.meemmeemisolatedarabic=64584;e.meetorusquare=13133;e.mehiragana=12417;e.meizierasquare=13182;e.mekatakana=12513;e.mekatakanahalfwidth=65426;e.mem=1502;e.memdagesh=64318;e.memdageshhebrew=64318;e.memhebrew=1502;e.menarmenian=1396;e.merkhahebrew=1445;e.merkhakefulahebrew=1446;e.merkhakefulalefthebrew=1446;e.merkhalefthebrew=1445;e.mhook=625;e.mhzsquare=13202;e.middledotkatakanahalfwidth=65381;e.middot=183;e.mieumacirclekorean=12914;e.mieumaparenkorean=12818;e.mieumcirclekorean=12900;e.mieumkorean=12609;e.mieumpansioskorean=12656;e.mieumparenkorean=12804;e.mieumpieupkorean=12654;e.mieumsioskorean=12655;e.mihiragana=12415;e.mikatakana=12511;e.mikatakanahalfwidth=65424;e.minus=8722;e.minusbelowcmb=800;e.minuscircle=8854;e.minusmod=727;e.minusplus=8723;e.minute=8242;e.miribaarusquare=13130;e.mirisquare=13129;e.mlonglegturned=624;e.mlsquare=13206;e.mmcubedsquare=13219;e.mmonospace=65357;e.mmsquaredsquare=13215;e.mohiragana=12418;e.mohmsquare=13249;e.mokatakana=12514;e.mokatakanahalfwidth=65427;e.molsquare=13270;e.momathai=3617;e.moverssquare=13223;e.moverssquaredsquare=13224;e.mparen=9384;e.mpasquare=13227;e.mssquare=13235;e.msuperior=63215;e.mturned=623;e.mu=181;e.mu1=181;e.muasquare=13186;e.muchgreater=8811;e.muchless=8810;e.mufsquare=13196;e.mugreek=956;e.mugsquare=13197;e.muhiragana=12416;e.mukatakana=12512;e.mukatakanahalfwidth=65425;e.mulsquare=13205;e.multiply=215;e.mumsquare=13211;e.munahhebrew=1443;e.munahlefthebrew=1443;e.musicalnote=9834;e.musicalnotedbl=9835;e.musicflatsign=9837;e.musicsharpsign=9839;e.mussquare=13234;e.muvsquare=13238;e.muwsquare=13244;e.mvmegasquare=13241;e.mvsquare=13239;e.mwmegasquare=13247;e.mwsquare=13245;e.n=110;e.nabengali=2472;e.nabla=8711;e.nacute=324;e.nadeva=2344;e.nagujarati=2728;e.nagurmukhi=2600;e.nahiragana=12394;e.nakatakana=12490;e.nakatakanahalfwidth=65413;e.napostrophe=329;e.nasquare=13185;e.nbopomofo=12555;e.nbspace=160;e.ncaron=328;e.ncedilla=326;e.ncircle=9437;e.ncircumflexbelow=7755;e.ncommaaccent=326;e.ndotaccent=7749;e.ndotbelow=7751;e.nehiragana=12397;e.nekatakana=12493;e.nekatakanahalfwidth=65416;e.newsheqelsign=8362;e.nfsquare=13195;e.ngabengali=2457;e.ngadeva=2329;e.ngagujarati=2713;e.ngagurmukhi=2585;e.ngonguthai=3591;e.nhiragana=12435;e.nhookleft=626;e.nhookretroflex=627;e.nieunacirclekorean=12911;e.nieunaparenkorean=12815;e.nieuncieuckorean=12597;e.nieuncirclekorean=12897;e.nieunhieuhkorean=12598;e.nieunkorean=12596;e.nieunpansioskorean=12648;e.nieunparenkorean=12801;e.nieunsioskorean=12647;e.nieuntikeutkorean=12646;e.nihiragana=12395;e.nikatakana=12491;e.nikatakanahalfwidth=65414;e.nikhahitleftthai=63641;e.nikhahitthai=3661;e.nine=57;e.ninearabic=1641;e.ninebengali=2543;e.ninecircle=9320;e.ninecircleinversesansserif=10130;e.ninedeva=2415;e.ninegujarati=2799;e.ninegurmukhi=2671;e.ninehackarabic=1641;e.ninehangzhou=12329;e.nineideographicparen=12840;e.nineinferior=8329;e.ninemonospace=65305;e.nineoldstyle=63289;e.nineparen=9340;e.nineperiod=9360;e.ninepersian=1785;e.nineroman=8568;e.ninesuperior=8313;e.nineteencircle=9330;e.nineteenparen=9350;e.nineteenperiod=9370;e.ninethai=3673;e.nj=460;e.njecyrillic=1114;e.nkatakana=12531;e.nkatakanahalfwidth=65437;e.nlegrightlong=414;e.nlinebelow=7753;e.nmonospace=65358;e.nmsquare=13210;e.nnabengali=2467;e.nnadeva=2339;e.nnagujarati=2723;e.nnagurmukhi=2595;e.nnnadeva=2345;e.nohiragana=12398;e.nokatakana=12494;e.nokatakanahalfwidth=65417;e.nonbreakingspace=160;e.nonenthai=3603;e.nonuthai=3609;e.noonarabic=1606;e.noonfinalarabic=65254;e.noonghunnaarabic=1722;e.noonghunnafinalarabic=64415;e.nooninitialarabic=65255;e.noonjeeminitialarabic=64722;e.noonjeemisolatedarabic=64587;e.noonmedialarabic=65256;e.noonmeeminitialarabic=64725;e.noonmeemisolatedarabic=64590;e.noonnoonfinalarabic=64653;e.notcontains=8716;e.notelement=8713;e.notelementof=8713;e.notequal=8800;e.notgreater=8815;e.notgreaternorequal=8817;e.notgreaternorless=8825;e.notidentical=8802;e.notless=8814;e.notlessnorequal=8816;e.notparallel=8742;e.notprecedes=8832;e.notsubset=8836;e.notsucceeds=8833;e.notsuperset=8837;e.nowarmenian=1398;e.nparen=9385;e.nssquare=13233;e.nsuperior=8319;e.ntilde=241;e.nu=957;e.nuhiragana=12396;e.nukatakana=12492;e.nukatakanahalfwidth=65415;e.nuktabengali=2492;e.nuktadeva=2364;e.nuktagujarati=2748;e.nuktagurmukhi=2620;e.numbersign=35;e.numbersignmonospace=65283;e.numbersignsmall=65119;e.numeralsigngreek=884;e.numeralsignlowergreek=885;e.numero=8470;e.nun=1504;e.nundagesh=64320;e.nundageshhebrew=64320;e.nunhebrew=1504;e.nvsquare=13237;e.nwsquare=13243;e.nyabengali=2462;e.nyadeva=2334;e.nyagujarati=2718;e.nyagurmukhi=2590;e.o=111;e.oacute=243;e.oangthai=3629;e.obarred=629;e.obarredcyrillic=1257;e.obarreddieresiscyrillic=1259;e.obengali=2451;e.obopomofo=12571;e.obreve=335;e.ocandradeva=2321;e.ocandragujarati=2705;e.ocandravowelsigndeva=2377;e.ocandravowelsigngujarati=2761;e.ocaron=466;e.ocircle=9438;e.ocircumflex=244;e.ocircumflexacute=7889;e.ocircumflexdotbelow=7897;e.ocircumflexgrave=7891;e.ocircumflexhookabove=7893;e.ocircumflextilde=7895;e.ocyrillic=1086;e.odblacute=337;e.odblgrave=525;e.odeva=2323;e.odieresis=246;e.odieresiscyrillic=1255;e.odotbelow=7885;e.oe=339;e.oekorean=12634;e.ogonek=731;e.ogonekcmb=808;e.ograve=242;e.ogujarati=2707;e.oharmenian=1413;e.ohiragana=12362;e.ohookabove=7887;e.ohorn=417;e.ohornacute=7899;e.ohorndotbelow=7907;e.ohorngrave=7901;e.ohornhookabove=7903;e.ohorntilde=7905;e.ohungarumlaut=337;e.oi=419;e.oinvertedbreve=527;e.okatakana=12458;e.okatakanahalfwidth=65397;e.okorean=12631;e.olehebrew=1451;e.omacron=333;e.omacronacute=7763;e.omacrongrave=7761;e.omdeva=2384;e.omega=969;e.omega1=982;e.omegacyrillic=1121;e.omegalatinclosed=631;e.omegaroundcyrillic=1147;e.omegatitlocyrillic=1149;e.omegatonos=974;e.omgujarati=2768;e.omicron=959;e.omicrontonos=972;e.omonospace=65359;e.one=49;e.onearabic=1633;e.onebengali=2535;e.onecircle=9312;e.onecircleinversesansserif=10122;e.onedeva=2407;e.onedotenleader=8228;e.oneeighth=8539;e.onefitted=63196;e.onegujarati=2791;e.onegurmukhi=2663;e.onehackarabic=1633;e.onehalf=189;e.onehangzhou=12321;e.oneideographicparen=12832;e.oneinferior=8321;e.onemonospace=65297;e.onenumeratorbengali=2548;e.oneoldstyle=63281;e.oneparen=9332;e.oneperiod=9352;e.onepersian=1777;e.onequarter=188;e.oneroman=8560;e.onesuperior=185;e.onethai=3665;e.onethird=8531;e.oogonek=491;e.oogonekmacron=493;e.oogurmukhi=2579;e.oomatragurmukhi=2635;e.oopen=596;e.oparen=9386;e.openbullet=9702;e.option=8997;e.ordfeminine=170;e.ordmasculine=186;e.orthogonal=8735;e.oshortdeva=2322;e.oshortvowelsigndeva=2378;e.oslash=248;e.oslashacute=511;e.osmallhiragana=12361;e.osmallkatakana=12457;e.osmallkatakanahalfwidth=65387;e.ostrokeacute=511;e.osuperior=63216;e.otcyrillic=1151;e.otilde=245;e.otildeacute=7757;e.otildedieresis=7759;e.oubopomofo=12577;e.overline=8254;e.overlinecenterline=65098;e.overlinecmb=773;e.overlinedashed=65097;e.overlinedblwavy=65100;e.overlinewavy=65099;e.overscore=175;e.ovowelsignbengali=2507;e.ovowelsigndeva=2379;e.ovowelsigngujarati=2763;e.p=112;e.paampssquare=13184;e.paasentosquare=13099;e.pabengali=2474;e.pacute=7765;e.padeva=2346;e.pagedown=8671;e.pageup=8670;e.pagujarati=2730;e.pagurmukhi=2602;e.pahiragana=12401;e.paiyannoithai=3631;e.pakatakana=12497;e.palatalizationcyrilliccmb=1156;e.palochkacyrillic=1216;e.pansioskorean=12671;e.paragraph=182;e.parallel=8741;e.parenleft=40;e.parenleftaltonearabic=64830;e.parenleftbt=63725;e.parenleftex=63724;e.parenleftinferior=8333;e.parenleftmonospace=65288;e.parenleftsmall=65113;e.parenleftsuperior=8317;e.parenlefttp=63723;e.parenleftvertical=65077;e.parenright=41;e.parenrightaltonearabic=64831;e.parenrightbt=63736;e.parenrightex=63735;e.parenrightinferior=8334;e.parenrightmonospace=65289;e.parenrightsmall=65114;e.parenrightsuperior=8318;e.parenrighttp=63734;e.parenrightvertical=65078;e.partialdiff=8706;e.paseqhebrew=1472;e.pashtahebrew=1433;e.pasquare=13225;e.patah=1463;e.patah11=1463;e.patah1d=1463;e.patah2a=1463;e.patahhebrew=1463;e.patahnarrowhebrew=1463;e.patahquarterhebrew=1463;e.patahwidehebrew=1463;e.pazerhebrew=1441;e.pbopomofo=12550;e.pcircle=9439;e.pdotaccent=7767;e.pe=1508;e.pecyrillic=1087;e.pedagesh=64324;e.pedageshhebrew=64324;e.peezisquare=13115;e.pefinaldageshhebrew=64323;e.peharabic=1662;e.peharmenian=1402;e.pehebrew=1508;e.pehfinalarabic=64343;e.pehinitialarabic=64344;e.pehiragana=12410;e.pehmedialarabic=64345;e.pekatakana=12506;e.pemiddlehookcyrillic=1191;e.perafehebrew=64334;e.percent=37;e.percentarabic=1642;e.percentmonospace=65285;e.percentsmall=65130;e.period=46;e.periodarmenian=1417;e.periodcentered=183;e.periodhalfwidth=65377;e.periodinferior=63207;e.periodmonospace=65294;e.periodsmall=65106;e.periodsuperior=63208;e.perispomenigreekcmb=834;e.perpendicular=8869;e.perthousand=8240;e.peseta=8359;e.pfsquare=13194;e.phabengali=2475;e.phadeva=2347;e.phagujarati=2731;e.phagurmukhi=2603;e.phi=966;e.phi1=981;e.phieuphacirclekorean=12922;e.phieuphaparenkorean=12826;e.phieuphcirclekorean=12908;e.phieuphkorean=12621;e.phieuphparenkorean=12812;e.philatin=632;e.phinthuthai=3642;e.phisymbolgreek=981;e.phook=421;e.phophanthai=3614;e.phophungthai=3612;e.phosamphaothai=3616;e.pi=960;e.pieupacirclekorean=12915;e.pieupaparenkorean=12819;e.pieupcieuckorean=12662;e.pieupcirclekorean=12901;e.pieupkiyeokkorean=12658;e.pieupkorean=12610;e.pieupparenkorean=12805;e.pieupsioskiyeokkorean=12660;e.pieupsioskorean=12612;e.pieupsiostikeutkorean=12661;e.pieupthieuthkorean=12663;e.pieuptikeutkorean=12659;e.pihiragana=12404;e.pikatakana=12500;e.pisymbolgreek=982;e.piwrarmenian=1411;e.plus=43;e.plusbelowcmb=799;e.pluscircle=8853;e.plusminus=177;e.plusmod=726;e.plusmonospace=65291;e.plussmall=65122;e.plussuperior=8314;e.pmonospace=65360;e.pmsquare=13272;e.pohiragana=12413;e.pointingindexdownwhite=9759;e.pointingindexleftwhite=9756;e.pointingindexrightwhite=9758;e.pointingindexupwhite=9757;e.pokatakana=12509;e.poplathai=3611;e.postalmark=12306;e.postalmarkface=12320;e.pparen=9387;e.precedes=8826;e.prescription=8478;e.primemod=697;e.primereversed=8245;e.product=8719;e.projective=8965;e.prolongedkana=12540;e.propellor=8984;e.propersubset=8834;e.propersuperset=8835;e.proportion=8759;e.proportional=8733;e.psi=968;e.psicyrillic=1137;e.psilipneumatacyrilliccmb=1158;e.pssquare=13232;e.puhiragana=12407;e.pukatakana=12503;e.pvsquare=13236;e.pwsquare=13242;e.q=113;e.qadeva=2392;e.qadmahebrew=1448;e.qafarabic=1602;e.qaffinalarabic=65238;e.qafinitialarabic=65239;e.qafmedialarabic=65240;e.qamats=1464;e.qamats10=1464;e.qamats1a=1464;e.qamats1c=1464;e.qamats27=1464;e.qamats29=1464;e.qamats33=1464;e.qamatsde=1464;e.qamatshebrew=1464;e.qamatsnarrowhebrew=1464;e.qamatsqatanhebrew=1464;e.qamatsqatannarrowhebrew=1464;e.qamatsqatanquarterhebrew=1464;e.qamatsqatanwidehebrew=1464;e.qamatsquarterhebrew=1464;e.qamatswidehebrew=1464;e.qarneyparahebrew=1439;e.qbopomofo=12561;e.qcircle=9440;e.qhook=672;e.qmonospace=65361;e.qof=1511;e.qofdagesh=64327;e.qofdageshhebrew=64327;e.qofhebrew=1511;e.qparen=9388;e.quarternote=9833;e.qubuts=1467;e.qubuts18=1467;e.qubuts25=1467;e.qubuts31=1467;e.qubutshebrew=1467;e.qubutsnarrowhebrew=1467;e.qubutsquarterhebrew=1467;e.qubutswidehebrew=1467;e.question=63;e.questionarabic=1567;e.questionarmenian=1374;e.questiondown=191;e.questiondownsmall=63423;e.questiongreek=894;e.questionmonospace=65311;e.questionsmall=63295;e.quotedbl=34;e.quotedblbase=8222;e.quotedblleft=8220;e.quotedblmonospace=65282;e.quotedblprime=12318;e.quotedblprimereversed=12317;e.quotedblright=8221;e.quoteleft=8216;e.quoteleftreversed=8219;e.quotereversed=8219;e.quoteright=8217;e.quoterightn=329;e.quotesinglbase=8218;e.quotesingle=39;e.quotesinglemonospace=65287;e.r=114;e.raarmenian=1404;e.rabengali=2480;e.racute=341;e.radeva=2352;e.radical=8730;e.radicalex=63717;e.radoverssquare=13230;e.radoverssquaredsquare=13231;e.radsquare=13229;e.rafe=1471;e.rafehebrew=1471;e.ragujarati=2736;e.ragurmukhi=2608;e.rahiragana=12425;e.rakatakana=12521;e.rakatakanahalfwidth=65431;e.ralowerdiagonalbengali=2545;e.ramiddlediagonalbengali=2544;e.ramshorn=612;e.ratio=8758;e.rbopomofo=12566;e.rcaron=345;e.rcedilla=343;e.rcircle=9441;e.rcommaaccent=343;e.rdblgrave=529;e.rdotaccent=7769;e.rdotbelow=7771;e.rdotbelowmacron=7773;e.referencemark=8251;e.reflexsubset=8838;e.reflexsuperset=8839;e.registered=174;e.registersans=63720;e.registerserif=63194;e.reharabic=1585;e.reharmenian=1408;e.rehfinalarabic=65198;e.rehiragana=12428;e.rekatakana=12524;e.rekatakanahalfwidth=65434;e.resh=1512;e.reshdageshhebrew=64328;e.reshhebrew=1512;e.reversedtilde=8765;e.reviahebrew=1431;e.reviamugrashhebrew=1431;e.revlogicalnot=8976;e.rfishhook=638;e.rfishhookreversed=639;e.rhabengali=2525;e.rhadeva=2397;e.rho=961;e.rhook=637;e.rhookturned=635;e.rhookturnedsuperior=693;e.rhosymbolgreek=1009;e.rhotichookmod=734;e.rieulacirclekorean=12913;e.rieulaparenkorean=12817;e.rieulcirclekorean=12899;e.rieulhieuhkorean=12608;e.rieulkiyeokkorean=12602;e.rieulkiyeoksioskorean=12649;e.rieulkorean=12601;e.rieulmieumkorean=12603;e.rieulpansioskorean=12652;e.rieulparenkorean=12803;e.rieulphieuphkorean=12607;e.rieulpieupkorean=12604;e.rieulpieupsioskorean=12651;e.rieulsioskorean=12605;e.rieulthieuthkorean=12606;e.rieultikeutkorean=12650;e.rieulyeorinhieuhkorean=12653;e.rightangle=8735;e.righttackbelowcmb=793;e.righttriangle=8895;e.rihiragana=12426;e.rikatakana=12522;e.rikatakanahalfwidth=65432;e.ring=730;e.ringbelowcmb=805;e.ringcmb=778;e.ringhalfleft=703;e.ringhalfleftarmenian=1369;e.ringhalfleftbelowcmb=796;e.ringhalfleftcentered=723;e.ringhalfright=702;e.ringhalfrightbelowcmb=825;e.ringhalfrightcentered=722;e.rinvertedbreve=531;e.rittorusquare=13137;e.rlinebelow=7775;e.rlongleg=636;e.rlonglegturned=634;e.rmonospace=65362;e.rohiragana=12429;e.rokatakana=12525;e.rokatakanahalfwidth=65435;e.roruathai=3619;e.rparen=9389;e.rrabengali=2524;e.rradeva=2353;e.rragurmukhi=2652;e.rreharabic=1681;e.rrehfinalarabic=64397;e.rrvocalicbengali=2528;e.rrvocalicdeva=2400;e.rrvocalicgujarati=2784;e.rrvocalicvowelsignbengali=2500;e.rrvocalicvowelsigndeva=2372;e.rrvocalicvowelsigngujarati=2756;e.rsuperior=63217;e.rtblock=9616;e.rturned=633;e.rturnedsuperior=692;e.ruhiragana=12427;e.rukatakana=12523;e.rukatakanahalfwidth=65433;e.rupeemarkbengali=2546;e.rupeesignbengali=2547;e.rupiah=63197;e.ruthai=3620;e.rvocalicbengali=2443;e.rvocalicdeva=2315;e.rvocalicgujarati=2699;e.rvocalicvowelsignbengali=2499;e.rvocalicvowelsigndeva=2371;e.rvocalicvowelsigngujarati=2755;e.s=115;e.sabengali=2488;e.sacute=347;e.sacutedotaccent=7781;e.sadarabic=1589;e.sadeva=2360;e.sadfinalarabic=65210;e.sadinitialarabic=65211;e.sadmedialarabic=65212;e.sagujarati=2744;e.sagurmukhi=2616;e.sahiragana=12373;e.sakatakana=12469;e.sakatakanahalfwidth=65403;e.sallallahoualayhewasallamarabic=65018;e.samekh=1505;e.samekhdagesh=64321;e.samekhdageshhebrew=64321;e.samekhhebrew=1505;e.saraaathai=3634;e.saraaethai=3649;e.saraaimaimalaithai=3652;e.saraaimaimuanthai=3651;e.saraamthai=3635;e.saraathai=3632;e.saraethai=3648;e.saraiileftthai=63622;e.saraiithai=3637;e.saraileftthai=63621;e.saraithai=3636;e.saraothai=3650;e.saraueeleftthai=63624;e.saraueethai=3639;e.saraueleftthai=63623;e.sarauethai=3638;e.sarauthai=3640;e.sarauuthai=3641;e.sbopomofo=12569;e.scaron=353;e.scarondotaccent=7783;e.scedilla=351;e.schwa=601;e.schwacyrillic=1241;e.schwadieresiscyrillic=1243;e.schwahook=602;e.scircle=9442;e.scircumflex=349;e.scommaaccent=537;e.sdotaccent=7777;e.sdotbelow=7779;e.sdotbelowdotaccent=7785;e.seagullbelowcmb=828;e.second=8243;e.secondtonechinese=714;e.section=167;e.seenarabic=1587;e.seenfinalarabic=65202;e.seeninitialarabic=65203;e.seenmedialarabic=65204;e.segol=1462;e.segol13=1462;e.segol1f=1462;e.segol2c=1462;e.segolhebrew=1462;e.segolnarrowhebrew=1462;e.segolquarterhebrew=1462;e.segoltahebrew=1426;e.segolwidehebrew=1462;e.seharmenian=1405;e.sehiragana=12379;e.sekatakana=12475;e.sekatakanahalfwidth=65406;e.semicolon=59;e.semicolonarabic=1563;e.semicolonmonospace=65307;e.semicolonsmall=65108;e.semivoicedmarkkana=12444;e.semivoicedmarkkanahalfwidth=65439;e.sentisquare=13090;e.sentosquare=13091;e.seven=55;e.sevenarabic=1639;e.sevenbengali=2541;e.sevencircle=9318;e.sevencircleinversesansserif=10128;e.sevendeva=2413;e.seveneighths=8542;e.sevengujarati=2797;e.sevengurmukhi=2669;e.sevenhackarabic=1639;e.sevenhangzhou=12327;e.sevenideographicparen=12838;e.seveninferior=8327;e.sevenmonospace=65303;e.sevenoldstyle=63287;e.sevenparen=9338;e.sevenperiod=9358;e.sevenpersian=1783;e.sevenroman=8566;e.sevensuperior=8311;e.seventeencircle=9328;e.seventeenparen=9348;e.seventeenperiod=9368;e.seventhai=3671;e.sfthyphen=173;e.shaarmenian=1399;e.shabengali=2486;e.shacyrillic=1096;e.shaddaarabic=1617;e.shaddadammaarabic=64609;e.shaddadammatanarabic=64606;e.shaddafathaarabic=64608;e.shaddakasraarabic=64610;e.shaddakasratanarabic=64607;e.shade=9618;e.shadedark=9619;e.shadelight=9617;e.shademedium=9618;e.shadeva=2358;e.shagujarati=2742;e.shagurmukhi=2614;e.shalshelethebrew=1427;e.shbopomofo=12565;e.shchacyrillic=1097;e.sheenarabic=1588;e.sheenfinalarabic=65206;e.sheeninitialarabic=65207;e.sheenmedialarabic=65208;e.sheicoptic=995;e.sheqel=8362;e.sheqelhebrew=8362;e.sheva=1456;e.sheva115=1456;e.sheva15=1456;e.sheva22=1456;e.sheva2e=1456;e.shevahebrew=1456;e.shevanarrowhebrew=1456;e.shevaquarterhebrew=1456;e.shevawidehebrew=1456;e.shhacyrillic=1211;e.shimacoptic=1005;e.shin=1513;e.shindagesh=64329;e.shindageshhebrew=64329;e.shindageshshindot=64300;e.shindageshshindothebrew=64300;e.shindageshsindot=64301;e.shindageshsindothebrew=64301;e.shindothebrew=1473;e.shinhebrew=1513;e.shinshindot=64298;e.shinshindothebrew=64298;e.shinsindot=64299;e.shinsindothebrew=64299;e.shook=642;e.sigma=963;e.sigma1=962;e.sigmafinal=962;e.sigmalunatesymbolgreek=1010;e.sihiragana=12375;e.sikatakana=12471;e.sikatakanahalfwidth=65404;e.siluqhebrew=1469;e.siluqlefthebrew=1469;e.similar=8764;e.sindothebrew=1474;e.siosacirclekorean=12916;e.siosaparenkorean=12820;e.sioscieuckorean=12670;e.sioscirclekorean=12902;e.sioskiyeokkorean=12666;e.sioskorean=12613;e.siosnieunkorean=12667;e.siosparenkorean=12806;e.siospieupkorean=12669;e.siostikeutkorean=12668;e.six=54;e.sixarabic=1638;e.sixbengali=2540;e.sixcircle=9317;e.sixcircleinversesansserif=10127;e.sixdeva=2412;e.sixgujarati=2796;e.sixgurmukhi=2668;e.sixhackarabic=1638;e.sixhangzhou=12326;e.sixideographicparen=12837;e.sixinferior=8326;e.sixmonospace=65302;e.sixoldstyle=63286;e.sixparen=9337;e.sixperiod=9357;e.sixpersian=1782;e.sixroman=8565;e.sixsuperior=8310;e.sixteencircle=9327;e.sixteencurrencydenominatorbengali=2553;e.sixteenparen=9347;e.sixteenperiod=9367;e.sixthai=3670;e.slash=47;e.slashmonospace=65295;e.slong=383;e.slongdotaccent=7835;e.smileface=9786;e.smonospace=65363;e.sofpasuqhebrew=1475;e.softhyphen=173;e.softsigncyrillic=1100;e.sohiragana=12381;e.sokatakana=12477;e.sokatakanahalfwidth=65407;e.soliduslongoverlaycmb=824;e.solidusshortoverlaycmb=823;e.sorusithai=3625;e.sosalathai=3624;e.sosothai=3595;e.sosuathai=3626;e.space=32;e.spacehackarabic=32;e.spade=9824;e.spadesuitblack=9824;e.spadesuitwhite=9828;e.sparen=9390;e.squarebelowcmb=827;e.squarecc=13252;e.squarecm=13213;e.squarediagonalcrosshatchfill=9641;e.squarehorizontalfill=9636;e.squarekg=13199;e.squarekm=13214;e.squarekmcapital=13262;e.squareln=13265;e.squarelog=13266;e.squaremg=13198;e.squaremil=13269;e.squaremm=13212;e.squaremsquared=13217;e.squareorthogonalcrosshatchfill=9638;e.squareupperlefttolowerrightfill=9639;e.squareupperrighttolowerleftfill=9640;e.squareverticalfill=9637;e.squarewhitewithsmallblack=9635;e.srsquare=13275;e.ssabengali=2487;e.ssadeva=2359;e.ssagujarati=2743;e.ssangcieuckorean=12617;e.ssanghieuhkorean=12677;e.ssangieungkorean=12672;e.ssangkiyeokkorean=12594;e.ssangnieunkorean=12645;e.ssangpieupkorean=12611;e.ssangsioskorean=12614;e.ssangtikeutkorean=12600;e.ssuperior=63218;e.sterling=163;e.sterlingmonospace=65505;e.strokelongoverlaycmb=822;e.strokeshortoverlaycmb=821;e.subset=8834;e.subsetnotequal=8842;e.subsetorequal=8838;e.succeeds=8827;e.suchthat=8715;e.suhiragana=12377;e.sukatakana=12473;e.sukatakanahalfwidth=65405;e.sukunarabic=1618;e.summation=8721;e.sun=9788;e.superset=8835;e.supersetnotequal=8843;e.supersetorequal=8839;e.svsquare=13276;e.syouwaerasquare=13180;e.t=116;e.tabengali=2468;e.tackdown=8868;e.tackleft=8867;e.tadeva=2340;e.tagujarati=2724;e.tagurmukhi=2596;e.taharabic=1591;e.tahfinalarabic=65218;e.tahinitialarabic=65219;e.tahiragana=12383;e.tahmedialarabic=65220;e.taisyouerasquare=13181;e.takatakana=12479;e.takatakanahalfwidth=65408;e.tatweelarabic=1600;e.tau=964;e.tav=1514;e.tavdages=64330;e.tavdagesh=64330;e.tavdageshhebrew=64330;e.tavhebrew=1514;e.tbar=359;e.tbopomofo=12554;e.tcaron=357;e.tccurl=680;e.tcedilla=355;e.tcheharabic=1670;e.tchehfinalarabic=64379;e.tchehinitialarabic=64380;e.tchehmedialarabic=64381;e.tcircle=9443;e.tcircumflexbelow=7793;e.tcommaaccent=355;e.tdieresis=7831;e.tdotaccent=7787;e.tdotbelow=7789;e.tecyrillic=1090;e.tedescendercyrillic=1197;e.teharabic=1578;e.tehfinalarabic=65174;e.tehhahinitialarabic=64674;e.tehhahisolatedarabic=64524;e.tehinitialarabic=65175;e.tehiragana=12390;e.tehjeeminitialarabic=64673;e.tehjeemisolatedarabic=64523;e.tehmarbutaarabic=1577;e.tehmarbutafinalarabic=65172;e.tehmedialarabic=65176;e.tehmeeminitialarabic=64676;e.tehmeemisolatedarabic=64526;e.tehnoonfinalarabic=64627;e.tekatakana=12486;e.tekatakanahalfwidth=65411;e.telephone=8481;e.telephoneblack=9742;e.telishagedolahebrew=1440;e.telishaqetanahebrew=1449;e.tencircle=9321;e.tenideographicparen=12841;e.tenparen=9341;e.tenperiod=9361;e.tenroman=8569;e.tesh=679;e.tet=1496;e.tetdagesh=64312;e.tetdageshhebrew=64312;e.tethebrew=1496;e.tetsecyrillic=1205;e.tevirhebrew=1435;e.tevirlefthebrew=1435;e.thabengali=2469;e.thadeva=2341;e.thagujarati=2725;e.thagurmukhi=2597;e.thalarabic=1584;e.thalfinalarabic=65196;e.thanthakhatlowleftthai=63640;e.thanthakhatlowrightthai=63639;e.thanthakhatthai=3660;e.thanthakhatupperleftthai=63638;e.theharabic=1579;e.thehfinalarabic=65178;e.thehinitialarabic=65179;e.thehmedialarabic=65180;e.thereexists=8707;e.therefore=8756;e.theta=952;e.theta1=977;e.thetasymbolgreek=977;e.thieuthacirclekorean=12921;e.thieuthaparenkorean=12825;e.thieuthcirclekorean=12907;e.thieuthkorean=12620;e.thieuthparenkorean=12811;e.thirteencircle=9324;e.thirteenparen=9344;e.thirteenperiod=9364;e.thonangmonthothai=3601;e.thook=429;e.thophuthaothai=3602;e.thorn=254;e.thothahanthai=3607;e.thothanthai=3600;e.thothongthai=3608;e.thothungthai=3606;e.thousandcyrillic=1154;e.thousandsseparatorarabic=1644;e.thousandsseparatorpersian=1644;e.three=51;e.threearabic=1635;e.threebengali=2537;e.threecircle=9314;e.threecircleinversesansserif=10124;e.threedeva=2409;e.threeeighths=8540;e.threegujarati=2793;e.threegurmukhi=2665;e.threehackarabic=1635;e.threehangzhou=12323;e.threeideographicparen=12834;e.threeinferior=8323;e.threemonospace=65299;e.threenumeratorbengali=2550;e.threeoldstyle=63283;e.threeparen=9334;e.threeperiod=9354;e.threepersian=1779;e.threequarters=190;e.threequartersemdash=63198;e.threeroman=8562;e.threesuperior=179;e.threethai=3667;e.thzsquare=13204;e.tihiragana=12385;e.tikatakana=12481;e.tikatakanahalfwidth=65409;e.tikeutacirclekorean=12912;e.tikeutaparenkorean=12816;e.tikeutcirclekorean=12898;e.tikeutkorean=12599;e.tikeutparenkorean=12802;e.tilde=732;e.tildebelowcmb=816;e.tildecmb=771;e.tildecomb=771;e.tildedoublecmb=864;e.tildeoperator=8764;e.tildeoverlaycmb=820;e.tildeverticalcmb=830;e.timescircle=8855;e.tipehahebrew=1430;e.tipehalefthebrew=1430;e.tippigurmukhi=2672;e.titlocyrilliccmb=1155;e.tiwnarmenian=1407;e.tlinebelow=7791;e.tmonospace=65364;e.toarmenian=1385;e.tohiragana=12392;e.tokatakana=12488;e.tokatakanahalfwidth=65412;e.tonebarextrahighmod=741;e.tonebarextralowmod=745;e.tonebarhighmod=742;e.tonebarlowmod=744;e.tonebarmidmod=743;e.tonefive=445;e.tonesix=389;e.tonetwo=424;e.tonos=900;e.tonsquare=13095;e.topatakthai=3599;e.tortoiseshellbracketleft=12308;e.tortoiseshellbracketleftsmall=65117;e.tortoiseshellbracketleftvertical=65081;e.tortoiseshellbracketright=12309;e.tortoiseshellbracketrightsmall=65118;e.tortoiseshellbracketrightvertical=65082;e.totaothai=3605;e.tpalatalhook=427;e.tparen=9391;e.trademark=8482;e.trademarksans=63722;e.trademarkserif=63195;e.tretroflexhook=648;e.triagdn=9660;e.triaglf=9668;e.triagrt=9658;e.triagup=9650;e.ts=678;e.tsadi=1510;e.tsadidagesh=64326;e.tsadidageshhebrew=64326;e.tsadihebrew=1510;e.tsecyrillic=1094;e.tsere=1461;e.tsere12=1461;e.tsere1e=1461;e.tsere2b=1461;e.tserehebrew=1461;e.tserenarrowhebrew=1461;e.tserequarterhebrew=1461;e.tserewidehebrew=1461;e.tshecyrillic=1115;e.tsuperior=63219;e.ttabengali=2463;e.ttadeva=2335;e.ttagujarati=2719;e.ttagurmukhi=2591;e.tteharabic=1657;e.ttehfinalarabic=64359;e.ttehinitialarabic=64360;e.ttehmedialarabic=64361;e.tthabengali=2464;e.tthadeva=2336;e.tthagujarati=2720;e.tthagurmukhi=2592;e.tturned=647;e.tuhiragana=12388;e.tukatakana=12484;e.tukatakanahalfwidth=65410;e.tusmallhiragana=12387;e.tusmallkatakana=12483;e.tusmallkatakanahalfwidth=65391;e.twelvecircle=9323;e.twelveparen=9343;e.twelveperiod=9363;e.twelveroman=8571;e.twentycircle=9331;e.twentyhangzhou=21316;e.twentyparen=9351;e.twentyperiod=9371;e.two=50;e.twoarabic=1634;e.twobengali=2536;e.twocircle=9313;e.twocircleinversesansserif=10123;e.twodeva=2408;e.twodotenleader=8229;e.twodotleader=8229;e.twodotleadervertical=65072;e.twogujarati=2792;e.twogurmukhi=2664;e.twohackarabic=1634;e.twohangzhou=12322;e.twoideographicparen=12833;e.twoinferior=8322;e.twomonospace=65298;e.twonumeratorbengali=2549;e.twooldstyle=63282;e.twoparen=9333;e.twoperiod=9353;e.twopersian=1778;e.tworoman=8561;e.twostroke=443;e.twosuperior=178;e.twothai=3666;e.twothirds=8532;e.u=117;e.uacute=250;e.ubar=649;e.ubengali=2441;e.ubopomofo=12584;e.ubreve=365;e.ucaron=468;e.ucircle=9444;e.ucircumflex=251;e.ucircumflexbelow=7799;e.ucyrillic=1091;e.udattadeva=2385;e.udblacute=369;e.udblgrave=533;e.udeva=2313;e.udieresis=252;e.udieresisacute=472;e.udieresisbelow=7795;e.udieresiscaron=474;e.udieresiscyrillic=1265;e.udieresisgrave=476;e.udieresismacron=470;e.udotbelow=7909;e.ugrave=249;e.ugujarati=2697;e.ugurmukhi=2569;e.uhiragana=12358;e.uhookabove=7911;e.uhorn=432;e.uhornacute=7913;e.uhorndotbelow=7921;e.uhorngrave=7915;e.uhornhookabove=7917;e.uhorntilde=7919;e.uhungarumlaut=369;e.uhungarumlautcyrillic=1267;e.uinvertedbreve=535;e.ukatakana=12454;e.ukatakanahalfwidth=65395;e.ukcyrillic=1145;e.ukorean=12636;e.umacron=363;e.umacroncyrillic=1263;e.umacrondieresis=7803;e.umatragurmukhi=2625;e.umonospace=65365;e.underscore=95;e.underscoredbl=8215;e.underscoremonospace=65343;e.underscorevertical=65075;e.underscorewavy=65103;e.union=8746;e.universal=8704;e.uogonek=371;e.uparen=9392;e.upblock=9600;e.upperdothebrew=1476;e.upsilon=965;e.upsilondieresis=971;e.upsilondieresistonos=944;e.upsilonlatin=650;e.upsilontonos=973;e.uptackbelowcmb=797;e.uptackmod=724;e.uragurmukhi=2675;e.uring=367;e.ushortcyrillic=1118;e.usmallhiragana=12357;e.usmallkatakana=12453;e.usmallkatakanahalfwidth=65385;e.ustraightcyrillic=1199;e.ustraightstrokecyrillic=1201;e.utilde=361;e.utildeacute=7801;e.utildebelow=7797;e.uubengali=2442;e.uudeva=2314;e.uugujarati=2698;e.uugurmukhi=2570;e.uumatragurmukhi=2626;e.uuvowelsignbengali=2498;e.uuvowelsigndeva=2370;e.uuvowelsigngujarati=2754;e.uvowelsignbengali=2497;e.uvowelsigndeva=2369;e.uvowelsigngujarati=2753;e.v=118;e.vadeva=2357;e.vagujarati=2741;e.vagurmukhi=2613;e.vakatakana=12535;e.vav=1493;e.vavdagesh=64309;e.vavdagesh65=64309;e.vavdageshhebrew=64309;e.vavhebrew=1493;e.vavholam=64331;e.vavholamhebrew=64331;e.vavvavhebrew=1520;e.vavyodhebrew=1521;e.vcircle=9445;e.vdotbelow=7807;e.vecyrillic=1074;e.veharabic=1700;e.vehfinalarabic=64363;e.vehinitialarabic=64364;e.vehmedialarabic=64365;e.vekatakana=12537;e.venus=9792;e.verticalbar=124;e.verticallineabovecmb=781;e.verticallinebelowcmb=809;e.verticallinelowmod=716;e.verticallinemod=712;e.vewarmenian=1406;e.vhook=651;e.vikatakana=12536;e.viramabengali=2509;e.viramadeva=2381;e.viramagujarati=2765;e.visargabengali=2435;e.visargadeva=2307;e.visargagujarati=2691;e.vmonospace=65366;e.voarmenian=1400;e.voicediterationhiragana=12446;e.voicediterationkatakana=12542;e.voicedmarkkana=12443;e.voicedmarkkanahalfwidth=65438;e.vokatakana=12538;e.vparen=9393;e.vtilde=7805;e.vturned=652;e.vuhiragana=12436;e.vukatakana=12532;e.w=119;e.wacute=7811;e.waekorean=12633;e.wahiragana=12431;e.wakatakana=12527;e.wakatakanahalfwidth=65436;e.wakorean=12632;e.wasmallhiragana=12430;e.wasmallkatakana=12526;e.wattosquare=13143;e.wavedash=12316;e.wavyunderscorevertical=65076;e.wawarabic=1608;e.wawfinalarabic=65262;e.wawhamzaabovearabic=1572;e.wawhamzaabovefinalarabic=65158;e.wbsquare=13277;e.wcircle=9446;e.wcircumflex=373;e.wdieresis=7813;e.wdotaccent=7815;e.wdotbelow=7817;e.wehiragana=12433;e.weierstrass=8472;e.wekatakana=12529;e.wekorean=12638;e.weokorean=12637;e.wgrave=7809;e.whitebullet=9702;e.whitecircle=9675;e.whitecircleinverse=9689;e.whitecornerbracketleft=12302;e.whitecornerbracketleftvertical=65091;e.whitecornerbracketright=12303;e.whitecornerbracketrightvertical=65092;e.whitediamond=9671;e.whitediamondcontainingblacksmalldiamond=9672;e.whitedownpointingsmalltriangle=9663;e.whitedownpointingtriangle=9661;e.whiteleftpointingsmalltriangle=9667;e.whiteleftpointingtriangle=9665;e.whitelenticularbracketleft=12310;e.whitelenticularbracketright=12311;e.whiterightpointingsmalltriangle=9657;e.whiterightpointingtriangle=9655;e.whitesmallsquare=9643;e.whitesmilingface=9786;e.whitesquare=9633;e.whitestar=9734;e.whitetelephone=9743;e.whitetortoiseshellbracketleft=12312;e.whitetortoiseshellbracketright=12313;e.whiteuppointingsmalltriangle=9653;e.whiteuppointingtriangle=9651;e.wihiragana=12432;e.wikatakana=12528;e.wikorean=12639;e.wmonospace=65367;e.wohiragana=12434;e.wokatakana=12530;e.wokatakanahalfwidth=65382;e.won=8361;e.wonmonospace=65510;e.wowaenthai=3623;e.wparen=9394;e.wring=7832;e.wsuperior=695;e.wturned=653;e.wynn=447;e.x=120;e.xabovecmb=829;e.xbopomofo=12562;e.xcircle=9447;e.xdieresis=7821;e.xdotaccent=7819;e.xeharmenian=1389;e.xi=958;e.xmonospace=65368;e.xparen=9395;e.xsuperior=739;e.y=121;e.yaadosquare=13134;e.yabengali=2479;e.yacute=253;e.yadeva=2351;e.yaekorean=12626;e.yagujarati=2735;e.yagurmukhi=2607;e.yahiragana=12420;e.yakatakana=12516;e.yakatakanahalfwidth=65428;e.yakorean=12625;e.yamakkanthai=3662;e.yasmallhiragana=12419;e.yasmallkatakana=12515;e.yasmallkatakanahalfwidth=65388;e.yatcyrillic=1123;e.ycircle=9448;e.ycircumflex=375;e.ydieresis=255;e.ydotaccent=7823;e.ydotbelow=7925;e.yeharabic=1610;e.yehbarreearabic=1746;e.yehbarreefinalarabic=64431;e.yehfinalarabic=65266;e.yehhamzaabovearabic=1574;e.yehhamzaabovefinalarabic=65162;e.yehhamzaaboveinitialarabic=65163;e.yehhamzaabovemedialarabic=65164;e.yehinitialarabic=65267;e.yehmedialarabic=65268;e.yehmeeminitialarabic=64733;e.yehmeemisolatedarabic=64600;e.yehnoonfinalarabic=64660;e.yehthreedotsbelowarabic=1745;e.yekorean=12630;e.yen=165;e.yenmonospace=65509;e.yeokorean=12629;e.yeorinhieuhkorean=12678;e.yerahbenyomohebrew=1450;e.yerahbenyomolefthebrew=1450;e.yericyrillic=1099;e.yerudieresiscyrillic=1273;e.yesieungkorean=12673;e.yesieungpansioskorean=12675;e.yesieungsioskorean=12674;e.yetivhebrew=1434;e.ygrave=7923;e.yhook=436;e.yhookabove=7927;e.yiarmenian=1397;e.yicyrillic=1111;e.yikorean=12642;e.yinyang=9775;e.yiwnarmenian=1410;e.ymonospace=65369;e.yod=1497;e.yoddagesh=64313;e.yoddageshhebrew=64313;e.yodhebrew=1497;e.yodyodhebrew=1522;e.yodyodpatahhebrew=64287;e.yohiragana=12424;e.yoikorean=12681;e.yokatakana=12520;e.yokatakanahalfwidth=65430;e.yokorean=12635;e.yosmallhiragana=12423;e.yosmallkatakana=12519;e.yosmallkatakanahalfwidth=65390;e.yotgreek=1011;e.yoyaekorean=12680;e.yoyakorean=12679;e.yoyakthai=3618;e.yoyingthai=3597;e.yparen=9396;e.ypogegrammeni=890;e.ypogegrammenigreekcmb=837;e.yr=422;e.yring=7833;e.ysuperior=696;e.ytilde=7929;e.yturned=654;e.yuhiragana=12422;e.yuikorean=12684;e.yukatakana=12518;e.yukatakanahalfwidth=65429;e.yukorean=12640;e.yusbigcyrillic=1131;e.yusbigiotifiedcyrillic=1133;e.yuslittlecyrillic=1127;e.yuslittleiotifiedcyrillic=1129;e.yusmallhiragana=12421;e.yusmallkatakana=12517;e.yusmallkatakanahalfwidth=65389;e.yuyekorean=12683;e.yuyeokorean=12682;e.yyabengali=2527;e.yyadeva=2399;e.z=122;e.zaarmenian=1382;e.zacute=378;e.zadeva=2395;e.zagurmukhi=2651;e.zaharabic=1592;e.zahfinalarabic=65222;e.zahinitialarabic=65223;e.zahiragana=12374;e.zahmedialarabic=65224;e.zainarabic=1586;e.zainfinalarabic=65200;e.zakatakana=12470;e.zaqefgadolhebrew=1429;e.zaqefqatanhebrew=1428;e.zarqahebrew=1432;e.zayin=1494;e.zayindagesh=64310;e.zayindageshhebrew=64310;e.zayinhebrew=1494;e.zbopomofo=12567;e.zcaron=382;e.zcircle=9449;e.zcircumflex=7825;e.zcurl=657;e.zdot=380;e.zdotaccent=380;e.zdotbelow=7827;e.zecyrillic=1079;e.zedescendercyrillic=1177;e.zedieresiscyrillic=1247;e.zehiragana=12380;e.zekatakana=12476;e.zero=48;e.zeroarabic=1632;e.zerobengali=2534;e.zerodeva=2406;e.zerogujarati=2790;e.zerogurmukhi=2662;e.zerohackarabic=1632;e.zeroinferior=8320;e.zeromonospace=65296;e.zerooldstyle=63280;e.zeropersian=1776;e.zerosuperior=8304;e.zerothai=3664;e.zerowidthjoiner=65279;e.zerowidthnonjoiner=8204;e.zerowidthspace=8203;e.zeta=950;e.zhbopomofo=12563;e.zhearmenian=1386;e.zhebrevecyrillic=1218;e.zhecyrillic=1078;e.zhedescendercyrillic=1175;e.zhedieresiscyrillic=1245;e.zihiragana=12376;e.zikatakana=12472;e.zinorhebrew=1454;e.zlinebelow=7829;e.zmonospace=65370;e.zohiragana=12382;e.zokatakana=12478;e.zparen=9397;e.zretroflexhook=656;e.zstroke=438;e.zuhiragana=12378;e.zukatakana=12474;e[".notdef"]=0;e.angbracketleftbig=9001;e.angbracketleftBig=9001;e.angbracketleftbigg=9001;e.angbracketleftBigg=9001;e.angbracketrightBig=9002;e.angbracketrightbig=9002;e.angbracketrightBigg=9002;e.angbracketrightbigg=9002;e.arrowhookleft=8618;e.arrowhookright=8617;e.arrowlefttophalf=8636;e.arrowleftbothalf=8637;e.arrownortheast=8599;e.arrownorthwest=8598;e.arrowrighttophalf=8640;e.arrowrightbothalf=8641;e.arrowsoutheast=8600;e.arrowsouthwest=8601;e.backslashbig=8726;e.backslashBig=8726;e.backslashBigg=8726;e.backslashbigg=8726;e.bardbl=8214;e.bracehtipdownleft=65079;e.bracehtipdownright=65079;e.bracehtipupleft=65080;e.bracehtipupright=65080;e.braceleftBig=123;e.braceleftbig=123;e.braceleftbigg=123;e.braceleftBigg=123;e.bracerightBig=125;e.bracerightbig=125;e.bracerightbigg=125;e.bracerightBigg=125;e.bracketleftbig=91;e.bracketleftBig=91;e.bracketleftbigg=91;e.bracketleftBigg=91;e.bracketrightBig=93;e.bracketrightbig=93;e.bracketrightbigg=93;e.bracketrightBigg=93;e.ceilingleftbig=8968;e.ceilingleftBig=8968;e.ceilingleftBigg=8968;e.ceilingleftbigg=8968;e.ceilingrightbig=8969;e.ceilingrightBig=8969;e.ceilingrightbigg=8969;e.ceilingrightBigg=8969;e.circledotdisplay=8857;e.circledottext=8857;e.circlemultiplydisplay=8855;e.circlemultiplytext=8855;e.circleplusdisplay=8853;e.circleplustext=8853;e.contintegraldisplay=8750;e.contintegraltext=8750;e.coproductdisplay=8720;e.coproducttext=8720;e.floorleftBig=8970;e.floorleftbig=8970;e.floorleftbigg=8970;e.floorleftBigg=8970;e.floorrightbig=8971;e.floorrightBig=8971;e.floorrightBigg=8971;e.floorrightbigg=8971;e.hatwide=770;e.hatwider=770;e.hatwidest=770;e.intercal=7488;e.integraldisplay=8747;e.integraltext=8747;e.intersectiondisplay=8898;e.intersectiontext=8898;e.logicalanddisplay=8743;e.logicalandtext=8743;e.logicalordisplay=8744;e.logicalortext=8744;e.parenleftBig=40;e.parenleftbig=40;e.parenleftBigg=40;e.parenleftbigg=40;e.parenrightBig=41;e.parenrightbig=41;e.parenrightBigg=41;e.parenrightbigg=41;e.prime=8242;e.productdisplay=8719;e.producttext=8719;e.radicalbig=8730;e.radicalBig=8730;e.radicalBigg=8730;e.radicalbigg=8730;e.radicalbt=8730;e.radicaltp=8730;e.radicalvertex=8730;e.slashbig=47;e.slashBig=47;e.slashBigg=47;e.slashbigg=47;e.summationdisplay=8721;e.summationtext=8721;e.tildewide=732;e.tildewider=732;e.tildewidest=732;e.uniondisplay=8899;e.unionmultidisplay=8846;e.unionmultitext=8846;e.unionsqdisplay=8852;e.unionsqtext=8852;e.uniontext=8899;e.vextenddouble=8741;e.vextendsingle=8739}),n=a(function(e){e.space=32;e.a1=9985;e.a2=9986;e.a202=9987;e.a3=9988;e.a4=9742;e.a5=9990;e.a119=9991;e.a118=9992;e.a117=9993;e.a11=9755;e.a12=9758;e.a13=9996;e.a14=9997;e.a15=9998;e.a16=9999;e.a105=1e4;e.a17=10001;e.a18=10002;e.a19=10003;e.a20=10004;e.a21=10005;e.a22=10006;e.a23=10007;e.a24=10008;e.a25=10009;e.a26=10010;e.a27=10011;e.a28=10012;e.a6=10013;e.a7=10014;e.a8=10015;e.a9=10016;e.a10=10017;e.a29=10018;e.a30=10019;e.a31=10020;e.a32=10021;e.a33=10022;e.a34=10023;e.a35=9733;e.a36=10025;e.a37=10026;e.a38=10027;e.a39=10028;e.a40=10029;e.a41=10030;e.a42=10031;e.a43=10032;e.a44=10033;e.a45=10034;e.a46=10035;e.a47=10036;e.a48=10037;e.a49=10038;e.a50=10039;e.a51=10040;e.a52=10041;e.a53=10042;e.a54=10043;e.a55=10044;e.a56=10045;e.a57=10046;e.a58=10047;e.a59=10048;e.a60=10049;e.a61=10050;e.a62=10051;e.a63=10052;e.a64=10053;e.a65=10054;e.a66=10055;e.a67=10056;e.a68=10057;e.a69=10058;e.a70=10059;e.a71=9679;e.a72=10061;e.a73=9632;e.a74=10063;e.a203=10064;e.a75=10065;e.a204=10066;e.a76=9650;e.a77=9660;e.a78=9670;e.a79=10070;e.a81=9687;e.a82=10072;e.a83=10073;e.a84=10074;e.a97=10075;e.a98=10076;e.a99=10077;e.a100=10078;e.a101=10081;e.a102=10082;e.a103=10083;e.a104=10084;e.a106=10085;e.a107=10086;e.a108=10087;e.a112=9827;e.a111=9830;e.a110=9829;e.a109=9824;e.a120=9312;e.a121=9313;e.a122=9314;e.a123=9315;e.a124=9316;e.a125=9317;e.a126=9318;e.a127=9319;e.a128=9320;e.a129=9321;e.a130=10102;e.a131=10103;e.a132=10104;e.a133=10105;e.a134=10106;e.a135=10107;e.a136=10108;e.a137=10109;e.a138=10110;e.a139=10111;e.a140=10112;e.a141=10113;e.a142=10114;e.a143=10115;e.a144=10116;e.a145=10117;e.a146=10118;e.a147=10119;e.a148=10120;e.a149=10121;e.a150=10122;e.a151=10123;e.a152=10124;e.a153=10125;e.a154=10126;e.a155=10127;e.a156=10128;e.a157=10129;e.a158=10130;e.a159=10131;e.a160=10132;e.a161=8594;e.a163=8596;e.a164=8597;e.a196=10136;e.a165=10137;e.a192=10138;e.a166=10139;e.a167=10140;e.a168=10141;e.a169=10142;e.a170=10143;e.a171=10144;e.a172=10145;e.a173=10146;e.a162=10147;e.a174=10148;e.a175=10149;e.a176=10150;e.a177=10151;e.a178=10152;e.a179=10153;e.a193=10154;e.a180=10155;e.a199=10156;e.a181=10157;e.a200=10158;e.a182=10159;e.a201=10161;e.a183=10162;e.a184=10163;e.a197=10164;e.a185=10165;e.a194=10166;e.a198=10167;e.a186=10168;e.a195=10169;e.a187=10170;e.a188=10171;e.a189=10172;e.a190=10173;e.a191=10174;e.a89=10088;e.a90=10089;e.a93=10090;e.a94=10091;e.a91=10092;e.a92=10093;e.a205=10094;e.a85=10095;e.a206=10096;e.a86=10097;e.a87=10098;e.a88=10099;e.a95=10100;e.a96=10101;e[".notdef"]=0});t.getGlyphsUnicode=i;t.getDingbatsGlyphsUnicode=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getSupplementalGlyphMapForCalibri=t.getSupplementalGlyphMapForArialBlack=t.getGlyphMapForStandardFonts=t.getSymbolsFonts=t.getSerifFonts=t.getNonStdFontMap=t.getStdFontMap=void 0;var a=r(2),i=(0,a.getLookupTableFactory)(function(e){e.ArialNarrow="Helvetica";e["ArialNarrow-Bold"]="Helvetica-Bold";e["ArialNarrow-BoldItalic"]="Helvetica-BoldOblique";e["ArialNarrow-Italic"]="Helvetica-Oblique";e.ArialBlack="Helvetica";e["ArialBlack-Bold"]="Helvetica-Bold";e["ArialBlack-BoldItalic"]="Helvetica-BoldOblique";e["ArialBlack-Italic"]="Helvetica-Oblique";e["Arial-Black"]="Helvetica";e["Arial-Black-Bold"]="Helvetica-Bold";e["Arial-Black-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Black-Italic"]="Helvetica-Oblique";e.Arial="Helvetica";e["Arial-Bold"]="Helvetica-Bold";e["Arial-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Italic"]="Helvetica-Oblique";e["Arial-BoldItalicMT"]="Helvetica-BoldOblique";e["Arial-BoldMT"]="Helvetica-Bold";e["Arial-ItalicMT"]="Helvetica-Oblique";e.ArialMT="Helvetica";e["Courier-Bold"]="Courier-Bold";e["Courier-BoldItalic"]="Courier-BoldOblique";e["Courier-Italic"]="Courier-Oblique";e.CourierNew="Courier";e["CourierNew-Bold"]="Courier-Bold";e["CourierNew-BoldItalic"]="Courier-BoldOblique";e["CourierNew-Italic"]="Courier-Oblique";e["CourierNewPS-BoldItalicMT"]="Courier-BoldOblique";e["CourierNewPS-BoldMT"]="Courier-Bold";e["CourierNewPS-ItalicMT"]="Courier-Oblique";e.CourierNewPSMT="Courier";e.Helvetica="Helvetica";e["Helvetica-Bold"]="Helvetica-Bold";e["Helvetica-BoldItalic"]="Helvetica-BoldOblique";e["Helvetica-BoldOblique"]="Helvetica-BoldOblique";e["Helvetica-Italic"]="Helvetica-Oblique";e["Helvetica-Oblique"]="Helvetica-Oblique";e.SegoeUISymbol="Helvetica";e["Symbol-Bold"]="Symbol";e["Symbol-BoldItalic"]="Symbol";e["Symbol-Italic"]="Symbol";e.TimesNewRoman="Times-Roman";e["TimesNewRoman-Bold"]="Times-Bold";e["TimesNewRoman-BoldItalic"]="Times-BoldItalic";e["TimesNewRoman-Italic"]="Times-Italic";e.TimesNewRomanPS="Times-Roman";e["TimesNewRomanPS-Bold"]="Times-Bold";e["TimesNewRomanPS-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPS-BoldItalicMT"]="Times-BoldItalic";e["TimesNewRomanPS-BoldMT"]="Times-Bold";e["TimesNewRomanPS-Italic"]="Times-Italic";e["TimesNewRomanPS-ItalicMT"]="Times-Italic";e.TimesNewRomanPSMT="Times-Roman";e["TimesNewRomanPSMT-Bold"]="Times-Bold";e["TimesNewRomanPSMT-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPSMT-Italic"]="Times-Italic"}),n=(0,a.getLookupTableFactory)(function(e){e.Calibri="Helvetica";e["Calibri-Bold"]="Helvetica-Bold";e["Calibri-BoldItalic"]="Helvetica-BoldOblique";e["Calibri-Italic"]="Helvetica-Oblique";e.CenturyGothic="Helvetica";e["CenturyGothic-Bold"]="Helvetica-Bold";e["CenturyGothic-BoldItalic"]="Helvetica-BoldOblique";e["CenturyGothic-Italic"]="Helvetica-Oblique";e.ComicSansMS="Comic Sans MS";e["ComicSansMS-Bold"]="Comic Sans MS-Bold";e["ComicSansMS-BoldItalic"]="Comic Sans MS-BoldItalic";e["ComicSansMS-Italic"]="Comic Sans MS-Italic";e.LucidaConsole="Courier";e["LucidaConsole-Bold"]="Courier-Bold";e["LucidaConsole-BoldItalic"]="Courier-BoldOblique";e["LucidaConsole-Italic"]="Courier-Oblique";e["LucidaSans-Demi"]="Helvetica-Bold";e["MS-Gothic"]="MS Gothic";e["MS-Gothic-Bold"]="MS Gothic-Bold";e["MS-Gothic-BoldItalic"]="MS Gothic-BoldItalic";e["MS-Gothic-Italic"]="MS Gothic-Italic";e["MS-Mincho"]="MS Mincho";e["MS-Mincho-Bold"]="MS Mincho-Bold";e["MS-Mincho-BoldItalic"]="MS Mincho-BoldItalic";e["MS-Mincho-Italic"]="MS Mincho-Italic";e["MS-PGothic"]="MS PGothic";e["MS-PGothic-Bold"]="MS PGothic-Bold";e["MS-PGothic-BoldItalic"]="MS PGothic-BoldItalic";e["MS-PGothic-Italic"]="MS PGothic-Italic";e["MS-PMincho"]="MS PMincho";e["MS-PMincho-Bold"]="MS PMincho-Bold";e["MS-PMincho-BoldItalic"]="MS PMincho-BoldItalic";e["MS-PMincho-Italic"]="MS PMincho-Italic";e.NuptialScript="Times-Italic";e.Wingdings="ZapfDingbats"}),o=(0,a.getLookupTableFactory)(function(e){e["Adobe Jenson"]=!0;e["Adobe Text"]=!0;e.Albertus=!0;e.Aldus=!0;e.Alexandria=!0;e.Algerian=!0;e["American Typewriter"]=!0;e.Antiqua=!0;e.Apex=!0;e.Arno=!0;e.Aster=!0;e.Aurora=!0;e.Baskerville=!0;e.Bell=!0;e.Bembo=!0;e["Bembo Schoolbook"]=!0;e.Benguiat=!0;e["Berkeley Old Style"]=!0;e["Bernhard Modern"]=!0;e["Berthold City"]=!0;e.Bodoni=!0;e["Bauer Bodoni"]=!0;e["Book Antiqua"]=!0;e.Bookman=!0;e["Bordeaux Roman"]=!0;e["Californian FB"]=!0;e.Calisto=!0;e.Calvert=!0;e.Capitals=!0;e.Cambria=!0;e.Cartier=!0;e.Caslon=!0;e.Catull=!0;e.Centaur=!0;e["Century Old Style"]=!0;e["Century Schoolbook"]=!0;e.Chaparral=!0;e["Charis SIL"]=!0;e.Cheltenham=!0;e["Cholla Slab"]=!0;e.Clarendon=!0;e.Clearface=!0;e.Cochin=!0;e.Colonna=!0;e["Computer Modern"]=!0;e["Concrete Roman"]=!0;e.Constantia=!0;e["Cooper Black"]=!0;e.Corona=!0;e.Ecotype=!0;e.Egyptienne=!0;e.Elephant=!0;e.Excelsior=!0;e.Fairfield=!0;e["FF Scala"]=!0;e.Folkard=!0;e.Footlight=!0;e.FreeSerif=!0;e["Friz Quadrata"]=!0;e.Garamond=!0;e.Gentium=!0;e.Georgia=!0;e.Gloucester=!0;e["Goudy Old Style"]=!0;e["Goudy Schoolbook"]=!0;e["Goudy Pro Font"]=!0;e.Granjon=!0;e["Guardian Egyptian"]=!0;e.Heather=!0;e.Hercules=!0;e["High Tower Text"]=!0;e.Hiroshige=!0;e["Hoefler Text"]=!0;e["Humana Serif"]=!0;e.Imprint=!0;e["Ionic No. 5"]=!0;e.Janson=!0;e.Joanna=!0;e.Korinna=!0;e.Lexicon=!0;e["Liberation Serif"]=!0;e["Linux Libertine"]=!0;e.Literaturnaya=!0;e.Lucida=!0;e["Lucida Bright"]=!0;e.Melior=!0;e.Memphis=!0;e.Miller=!0;e.Minion=!0;e.Modern=!0;e["Mona Lisa"]=!0;e["Mrs Eaves"]=!0;e["MS Serif"]=!0;e["Museo Slab"]=!0;e["New York"]=!0;e["Nimbus Roman"]=!0;e["NPS Rawlinson Roadway"]=!0;e.NuptialScript=!0;e.Palatino=!0;e.Perpetua=!0;e.Plantin=!0;e["Plantin Schoolbook"]=!0;e.Playbill=!0;e["Poor Richard"]=!0;e["Rawlinson Roadway"]=!0;e.Renault=!0;e.Requiem=!0;e.Rockwell=!0;e.Roman=!0;e["Rotis Serif"]=!0;e.Sabon=!0;e.Scala=!0;e.Seagull=!0;e.Sistina=!0;e.Souvenir=!0;e.STIX=!0;e["Stone Informal"]=!0;e["Stone Serif"]=!0;e.Sylfaen=!0;e.Times=!0;e.Trajan=!0;e["Trinité"]=!0;e["Trump Mediaeval"]=!0;e.Utopia=!0;e["Vale Type"]=!0;e["Bitstream Vera"]=!0;e["Vera Serif"]=!0;e.Versailles=!0;e.Wanted=!0;e.Weiss=!0;e["Wide Latin"]=!0;e.Windsor=!0;e.XITS=!0}),s=(0,a.getLookupTableFactory)(function(e){e.Dingbats=!0;e.Symbol=!0;e.ZapfDingbats=!0}),c=(0,a.getLookupTableFactory)(function(e){e[2]=10;e[3]=32;e[4]=33;e[5]=34;e[6]=35;e[7]=36;e[8]=37;e[9]=38;e[10]=39;e[11]=40;e[12]=41;e[13]=42;e[14]=43;e[15]=44;e[16]=45;e[17]=46;e[18]=47;e[19]=48;e[20]=49;e[21]=50;e[22]=51;e[23]=52;e[24]=53;e[25]=54;e[26]=55;e[27]=56;e[28]=57;e[29]=58;e[30]=894;e[31]=60;e[32]=61;e[33]=62;e[34]=63;e[35]=64;e[36]=65;e[37]=66;e[38]=67;e[39]=68;e[40]=69;e[41]=70;e[42]=71;e[43]=72;e[44]=73;e[45]=74;e[46]=75;e[47]=76;e[48]=77;e[49]=78;e[50]=79;e[51]=80;e[52]=81;e[53]=82;e[54]=83;e[55]=84;e[56]=85;e[57]=86;e[58]=87;e[59]=88;e[60]=89;e[61]=90;e[62]=91;e[63]=92;e[64]=93;e[65]=94;e[66]=95;e[67]=96;e[68]=97;e[69]=98;e[70]=99;e[71]=100;e[72]=101;e[73]=102;e[74]=103;e[75]=104;e[76]=105;e[77]=106;e[78]=107;e[79]=108;e[80]=109;e[81]=110;e[82]=111;e[83]=112;e[84]=113;e[85]=114;e[86]=115;e[87]=116;e[88]=117;e[89]=118;e[90]=119;e[91]=120;e[92]=121;e[93]=122;e[94]=123;e[95]=124;e[96]=125;e[97]=126;e[98]=196;e[99]=197;e[100]=199;e[101]=201;e[102]=209;e[103]=214;e[104]=220;e[105]=225;e[106]=224;e[107]=226;e[108]=228;e[109]=227;e[110]=229;e[111]=231;e[112]=233;e[113]=232;e[114]=234;e[115]=235;e[116]=237;e[117]=236;e[118]=238;e[119]=239;e[120]=241;e[121]=243;e[122]=242;e[123]=244;e[124]=246;e[125]=245;e[126]=250;e[127]=249;e[128]=251;e[129]=252;e[130]=8224;e[131]=176;e[132]=162;e[133]=163;e[134]=167;e[135]=8226;e[136]=182;e[137]=223;e[138]=174;e[139]=169;e[140]=8482;e[141]=180;e[142]=168;e[143]=8800;e[144]=198;e[145]=216;e[146]=8734;e[147]=177;e[148]=8804;e[149]=8805;e[150]=165;e[151]=181;e[152]=8706;e[153]=8721;e[154]=8719;e[156]=8747;e[157]=170;e[158]=186;e[159]=8486;e[160]=230;e[161]=248;e[162]=191;e[163]=161;e[164]=172;e[165]=8730;e[166]=402;e[167]=8776;e[168]=8710;e[169]=171;e[170]=187;e[171]=8230;e[210]=218;e[223]=711;e[224]=321;e[225]=322;e[227]=353;e[229]=382;e[234]=253;e[252]=263;e[253]=268;e[254]=269;e[258]=258;e[260]=260;e[261]=261;e[265]=280;e[266]=281;e[268]=283;e[269]=313;e[275]=323;e[276]=324;e[278]=328;e[284]=345;e[285]=346;e[286]=347;e[292]=367;e[295]=377;e[296]=378;e[298]=380;e[305]=963;e[306]=964;e[307]=966;e[308]=8215;e[309]=8252;e[310]=8319;e[311]=8359;e[312]=8592;e[313]=8593;e[337]=9552;e[493]=1039;e[494]=1040;e[705]=1524;e[706]=8362;e[710]=64288;e[711]=64298;e[759]=1617;e[761]=1776;e[763]=1778;e[775]=1652;e[777]=1764;e[778]=1780;e[779]=1781;e[780]=1782;e[782]=771;e[783]=64726;e[786]=8363;e[788]=8532;e[790]=768;e[791]=769;e[792]=768;e[795]=803;e[797]=64336;e[798]=64337;e[799]=64342;e[800]=64343;e[801]=64344;e[802]=64345;e[803]=64362;e[804]=64363;e[805]=64364;e[2424]=7821;e[2425]=7822;e[2426]=7823;e[2427]=7824;e[2428]=7825;e[2429]=7826;e[2430]=7827;e[2433]=7682;e[2678]=8045;e[2679]=8046;e[2830]=1552;e[2838]=686;e[2840]=751;e[2842]=753;e[2843]=754;e[2844]=755;e[2846]=757;e[2856]=767;e[2857]=848;e[2858]=849;e[2862]=853;e[2863]=854;e[2864]=855;e[2865]=861;e[2866]=862;e[2906]=7460;e[2908]=7462;e[2909]=7463;e[2910]=7464;e[2912]=7466;e[2913]=7467;e[2914]=7468;e[2916]=7470;e[2917]=7471;e[2918]=7472;e[2920]=7474;e[2921]=7475;e[2922]=7476;e[2924]=7478;e[2925]=7479;e[2926]=7480;e[2928]=7482;e[2929]=7483;e[2930]=7484;e[2932]=7486;e[2933]=7487;e[2934]=7488;e[2936]=7490;e[2937]=7491;e[2938]=7492;e[2940]=7494;e[2941]=7495;e[2942]=7496;e[2944]=7498;e[2946]=7500;e[2948]=7502;e[2950]=7504;e[2951]=7505;e[2952]=7506;e[2954]=7508;e[2955]=7509;e[2956]=7510;e[2958]=7512;e[2959]=7513;e[2960]=7514;e[2962]=7516;e[2963]=7517;e[2964]=7518;e[2966]=7520;e[2967]=7521;e[2968]=7522;e[2970]=7524;e[2971]=7525;e[2972]=7526;e[2974]=7528;e[2975]=7529;e[2976]=7530;e[2978]=1537;e[2979]=1538;e[2980]=1539;e[2982]=1549;e[2983]=1551;e[2984]=1552;e[2986]=1554;e[2987]=1555;e[2988]=1556;e[2990]=1623;e[2991]=1624;e[2995]=1775;e[2999]=1791;e[3002]=64290;e[3003]=64291;e[3004]=64292;e[3006]=64294;e[3007]=64295;e[3008]=64296;e[3011]=1900;e[3014]=8223;e[3015]=8244;e[3017]=7532;e[3018]=7533;e[3019]=7534;e[3075]=7590;e[3076]=7591;e[3079]=7594;e[3080]=7595;e[3083]=7598;e[3084]=7599;e[3087]=7602;e[3088]=7603;e[3091]=7606;e[3092]=7607;e[3095]=7610;e[3096]=7611;e[3099]=7614;e[3100]=7615;e[3103]=7618;e[3104]=7619;e[3107]=8337;e[3108]=8338;e[3116]=1884;e[3119]=1885;e[3120]=1885;e[3123]=1886;e[3124]=1886;e[3127]=1887;e[3128]=1887;e[3131]=1888;e[3132]=1888;e[3135]=1889;e[3136]=1889;e[3139]=1890;e[3140]=1890;e[3143]=1891;e[3144]=1891;e[3147]=1892;e[3148]=1892;e[3153]=580;e[3154]=581;e[3157]=584;e[3158]=585;e[3161]=588;e[3162]=589;e[3165]=891;e[3166]=892;e[3169]=1274;e[3170]=1275;e[3173]=1278;e[3174]=1279;e[3181]=7622;e[3182]=7623;e[3282]=11799;e[3316]=578;e[3379]=42785;e[3393]=1159;e[3416]=8377}),l=(0,a.getLookupTableFactory)(function(e){e[227]=322;e[264]=261;e[291]=346}),u=(0,a.getLookupTableFactory)(function(e){e[1]=32;e[4]=65;e[17]=66;e[18]=67;e[24]=68;e[28]=69;e[38]=70;e[39]=71;e[44]=72;e[47]=73;e[58]=74;e[60]=75;e[62]=76;e[68]=77;e[69]=78;e[75]=79;e[87]=80;e[89]=81;e[90]=82;e[94]=83;e[100]=84;e[104]=85;e[115]=86;e[116]=87;e[121]=88;e[122]=89;e[127]=90;e[258]=97;e[268]=261;e[271]=98;e[272]=99;e[273]=263;e[282]=100;e[286]=101;e[295]=281;e[296]=102;e[336]=103;e[346]=104;e[349]=105;e[361]=106;e[364]=107;e[367]=108;e[371]=322;e[373]=109;e[374]=110;e[381]=111;e[383]=243;e[393]=112;e[395]=113;e[396]=114;e[400]=115;e[401]=347;e[410]=116;e[437]=117;e[448]=118;e[449]=119;e[454]=120;e[455]=121;e[460]=122;e[463]=380;e[853]=44;e[855]=58;e[856]=46;e[876]=47;e[878]=45;e[882]=45;e[894]=40;e[895]=41;e[896]=91;e[897]=93;e[923]=64;e[1004]=48;e[1005]=49;e[1006]=50;e[1007]=51;e[1008]=52;e[1009]=53;e[1010]=54;e[1011]=55;e[1012]=56;e[1013]=57;e[1081]=37;e[1085]=43;e[1086]=45});t.getStdFontMap=i;t.getNonStdFontMap=n;t.getSerifFonts=o;t.getSymbolsFonts=s;t.getGlyphMapForStandardFonts=c;t.getSupplementalGlyphMapForArialBlack=l;t.getSupplementalGlyphMapForCalibri=u},function(e,t,r){var a=r(2).getLookupTableFactory,i=a(function(e){e[63721]=169;e[63193]=169;e[63720]=174;e[63194]=174;e[63722]=8482;e[63195]=8482;e[63729]=9127;e[63730]=9128;e[63731]=9129;e[63740]=9131;e[63741]=9132;e[63742]=9133;e[63726]=9121;e[63727]=9122;e[63728]=9123;e[63737]=9124;e[63738]=9125;e[63739]=9126;e[63723]=9115;e[63724]=9116;e[63725]=9117;e[63734]=9118;e[63735]=9119;e[63736]=9120});var n=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];var o=a(function(e){e["¨"]=" ̈";e["¯"]=" Ì„";e["´"]=" Ì";e["µ"]="μ";e["¸"]=" ̧";e["IJ"]="IJ";e["ij"]="ij";e["Ä¿"]="L·";e["Å€"]="l·";e["ʼn"]="ʼn";e["Å¿"]="s";e["Ç„"]="DŽ";e["Ç…"]="Dž";e["dž"]="dž";e["LJ"]="LJ";e["Lj"]="Lj";e["lj"]="lj";e["ÇŠ"]="NJ";e["Ç‹"]="Nj";e["ÇŒ"]="nj";e["DZ"]="DZ";e["Dz"]="Dz";e["dz"]="dz";e["˘"]=" ̆";e["Ë™"]=" ̇";e["Ëš"]=" ÌŠ";e["Ë›"]=" ̨";e["Ëœ"]=" ̃";e["Ë"]=" Ì‹";e["ͺ"]=" Í…";e["΄"]=" Ì";e["Ï"]="β";e["Ï‘"]="θ";e["Ï’"]="Î¥";e["Ï•"]="φ";e["Ï–"]="Ï€";e["Ï°"]="κ";e["ϱ"]="Ï";e["ϲ"]="Ï‚";e["Ï´"]="Θ";e["ϵ"]="ε";e["Ϲ"]="Σ";e["Ö‡"]="Õ¥Ö‚";e["Ùµ"]="اٴ";e["Ù¶"]="وٴ";e["Ù·"]="Û‡Ù´";e["Ù¸"]="يٴ";e["ำ"]="à¹à¸²";e["ຳ"]="à»àº²";e["ໜ"]="ຫນ";e["à»"]="ຫມ";e["ཷ"]="ྲà¾";e["ཹ"]="ླà¾";e["ẚ"]="aʾ";e["á¾½"]=" Ì“";e["᾿"]=" Ì“";e["á¿€"]=" Í‚";e["῾"]=" Ì”";e[" "]=" ";e[" "]=" ";e[" "]=" ";e[" "]=" ";e[" "]=" ";e[" "]=" ";e[" "]=" ";e[" "]=" ";e["‗"]=" ̳";e["․"]=".";e["‥"]="..";e["…"]="...";e["″"]="′′";e["‴"]="′′′";e["‶"]="‵‵";e["‷"]="‵‵‵";e["‼"]="!!";e["‾"]=" Ì…";e["â‡"]="??";e["âˆ"]="?!";e["â‰"]="!?";e["â—"]="′′′′";e["âŸ"]=" ";e["₨"]="Rs";e["â„€"]="a/c";e["â„"]="a/s";e["℃"]="°C";e["â„…"]="c/o";e["℆"]="c/u";e["ℇ"]="Æ";e["℉"]="°F";e["â„–"]="No";e["â„¡"]="TEL";e["ℵ"]="×";e["ℶ"]="ב";e["â„·"]="×’";e["ℸ"]="ד";e["â„»"]="FAX";e["â… "]="I";e["â…¡"]="II";e["â…¢"]="III";e["â…£"]="IV";e["â…¤"]="V";e["â…¥"]="VI";e["â…¦"]="VII";e["â…§"]="VIII";e["â…¨"]="IX";e["â…©"]="X";e["â…ª"]="XI";e["â…«"]="XII";e["â…¬"]="L";e["â…­"]="C";e["â…®"]="D";e["â…¯"]="M";e["â…°"]="i";e["â…±"]="ii";e["â…²"]="iii";e["â…³"]="iv";e["â…´"]="v";e["â…µ"]="vi";e["â…¶"]="vii";e["â…·"]="viii";e["â…¸"]="ix";e["â…¹"]="x";e["â…º"]="xi";e["â…»"]="xii";e["â…¼"]="l";e["â…½"]="c";e["â…¾"]="d";e["â…¿"]="m";e["∬"]="∫∫";e["∭"]="∫∫∫";e["∯"]="∮∮";e["∰"]="∮∮∮";e["â‘´"]="(1)";e["⑵"]="(2)";e["⑶"]="(3)";e["â‘·"]="(4)";e["⑸"]="(5)";e["⑹"]="(6)";e["⑺"]="(7)";e["â‘»"]="(8)";e["⑼"]="(9)";e["⑽"]="(10)";e["⑾"]="(11)";e["â‘¿"]="(12)";e["â’€"]="(13)";e["â’"]="(14)";e["â’‚"]="(15)";e["â’ƒ"]="(16)";e["â’„"]="(17)";e["â’…"]="(18)";e["â’†"]="(19)";e["â’‡"]="(20)";e["â’ˆ"]="1.";e["â’‰"]="2.";e["â’Š"]="3.";e["â’‹"]="4.";e["â’Œ"]="5.";e["â’"]="6.";e["â’Ž"]="7.";e["â’"]="8.";e["â’"]="9.";e["â’‘"]="10.";e["â’’"]="11.";e["â’“"]="12.";e["â’”"]="13.";e["â’•"]="14.";e["â’–"]="15.";e["â’—"]="16.";e["â’˜"]="17.";e["â’™"]="18.";e["â’š"]="19.";e["â’›"]="20.";e["â’œ"]="(a)";e["â’"]="(b)";e["â’ž"]="(c)";e["â’Ÿ"]="(d)";e["â’ "]="(e)";e["â’¡"]="(f)";e["â’¢"]="(g)";e["â’£"]="(h)";e["â’¤"]="(i)";e["â’¥"]="(j)";e["â’¦"]="(k)";e["â’§"]="(l)";e["â’¨"]="(m)";e["â’©"]="(n)";e["â’ª"]="(o)";e["â’«"]="(p)";e["â’¬"]="(q)";e["â’­"]="(r)";e["â’®"]="(s)";e["â’¯"]="(t)";e["â’°"]="(u)";e["â’±"]="(v)";e["â’²"]="(w)";e["â’³"]="(x)";e["â’´"]="(y)";e["â’µ"]="(z)";e["⨌"]="∫∫∫∫";e["â©´"]="::=";e["⩵"]="==";e["⩶"]="===";e["⺟"]="æ¯";e["⻳"]="龟";e["â¼€"]="一";e["â¼"]="丨";e["⼂"]="丶";e["⼃"]="丿";e["⼄"]="ä¹™";e["â¼…"]="亅";e["⼆"]="二";e["⼇"]="亠";e["⼈"]="人";e["⼉"]="å„¿";e["⼊"]="å…¥";e["⼋"]="å…«";e["⼌"]="冂";e["â¼"]="冖";e["⼎"]="冫";e["â¼"]="几";e["â¼"]="凵";e["⼑"]="刀";e["â¼’"]="力";e["⼓"]="勹";e["â¼”"]="匕";e["⼕"]="匚";e["â¼–"]="匸";e["â¼—"]="å";e["⼘"]="åœ";e["â¼™"]="å©";e["⼚"]="厂";e["â¼›"]="厶";e["⼜"]="åˆ";e["â¼"]="å£";e["⼞"]="å›—";e["⼟"]="土";e["â¼ "]="士";e["⼡"]="夂";e["â¼¢"]="夊";e["â¼£"]="夕";e["⼤"]="大";e["â¼¥"]="女";e["⼦"]="å­";e["⼧"]="宀";e["⼨"]="寸";e["⼩"]="å°";e["⼪"]="å°¢";e["⼫"]="å°¸";e["⼬"]="å±®";e["â¼­"]="å±±";e["â¼®"]="å·›";e["⼯"]="å·¥";e["â¼°"]="å·±";e["â¼±"]="å·¾";e["â¼²"]="å¹²";e["â¼³"]="幺";e["â¼´"]="广";e["â¼µ"]="å»´";e["⼶"]="廾";e["â¼·"]="弋";e["⼸"]="弓";e["â¼¹"]="å½";e["⼺"]="彡";e["â¼»"]="å½³";e["â¼¼"]="心";e["â¼½"]="戈";e["â¼¾"]="戶";e["⼿"]="手";e["â½€"]="支";e["â½"]="æ”´";e["⽂"]="æ–‡";e["⽃"]="æ–—";e["⽄"]="æ–¤";e["â½…"]="æ–¹";e["⽆"]="æ— ";e["⽇"]="æ—¥";e["⽈"]="æ›°";e["⽉"]="月";e["⽊"]="木";e["⽋"]="欠";e["⽌"]="æ­¢";e["â½"]="æ­¹";e["⽎"]="殳";e["â½"]="毋";e["â½"]="比";e["⽑"]="毛";e["â½’"]="æ°";e["⽓"]="æ°”";e["â½”"]="æ°´";e["⽕"]="ç«";e["â½–"]="爪";e["â½—"]="父";e["⽘"]="爻";e["â½™"]="爿";e["⽚"]="片";e["â½›"]="牙";e["⽜"]="牛";e["â½"]="犬";e["⽞"]="玄";e["⽟"]="玉";e["â½ "]="ç“œ";e["⽡"]="瓦";e["â½¢"]="甘";e["â½£"]="生";e["⽤"]="用";e["â½¥"]="ç”°";e["⽦"]="ç–‹";e["⽧"]="ç–’";e["⽨"]="癶";e["⽩"]="白";e["⽪"]="çš®";e["⽫"]="çš¿";e["⽬"]="ç›®";e["â½­"]="矛";e["â½®"]="矢";e["⽯"]="石";e["â½°"]="示";e["â½±"]="禸";e["â½²"]="禾";e["â½³"]="ç©´";e["â½´"]="ç«‹";e["â½µ"]="竹";e["⽶"]="ç±³";e["â½·"]="糸";e["⽸"]="缶";e["â½¹"]="网";e["⽺"]="羊";e["â½»"]="ç¾½";e["â½¼"]="è€";e["â½½"]="而";e["â½¾"]="耒";e["⽿"]="耳";e["â¾€"]="è¿";e["â¾"]="肉";e["⾂"]="臣";e["⾃"]="自";e["⾄"]="至";e["â¾…"]="臼";e["⾆"]="舌";e["⾇"]="舛";e["⾈"]="舟";e["⾉"]="艮";e["⾊"]="色";e["⾋"]="艸";e["⾌"]="è™";e["â¾"]="虫";e["⾎"]="è¡€";e["â¾"]="è¡Œ";e["â¾"]="è¡£";e["⾑"]="襾";e["â¾’"]="見";e["⾓"]="角";e["â¾”"]="言";e["⾕"]="è°·";e["â¾–"]="豆";e["â¾—"]="豕";e["⾘"]="豸";e["â¾™"]="è²";e["⾚"]="赤";e["â¾›"]="èµ°";e["⾜"]="足";e["â¾"]="身";e["⾞"]="車";e["⾟"]="è¾›";e["â¾ "]="è¾°";e["⾡"]="è¾µ";e["â¾¢"]="é‚‘";e["â¾£"]="é…‰";e["⾤"]="釆";e["â¾¥"]="里";e["⾦"]="金";e["⾧"]="é•·";e["⾨"]="é–€";e["⾩"]="阜";e["⾪"]="隶";e["⾫"]="éš¹";e["⾬"]="雨";e["â¾­"]="é‘";e["â¾®"]="éž";e["⾯"]="é¢";e["â¾°"]="é©";e["â¾±"]="韋";e["â¾²"]="韭";e["â¾³"]="音";e["â¾´"]="é ";e["â¾µ"]="風";e["⾶"]="飛";e["â¾·"]="食";e["⾸"]="首";e["â¾¹"]="香";e["⾺"]="馬";e["â¾»"]="骨";e["â¾¼"]="高";e["â¾½"]="é«Ÿ";e["â¾¾"]="鬥";e["⾿"]="鬯";e["â¿€"]="鬲";e["â¿"]="鬼";e["â¿‚"]="é­š";e["⿃"]="é³¥";e["â¿„"]="é¹µ";e["â¿…"]="鹿";e["⿆"]="麥";e["⿇"]="麻";e["⿈"]="黃";e["⿉"]="é»";e["â¿Š"]="黑";e["â¿‹"]="黹";e["â¿Œ"]="黽";e["â¿"]="鼎";e["â¿Ž"]="鼓";e["â¿"]="é¼ ";e["â¿"]="é¼»";e["â¿‘"]="齊";e["â¿’"]="é½’";e["â¿“"]="é¾";e["â¿”"]="龜";e["â¿•"]="é¾ ";e["〶"]="〒";e["〸"]="å";e["〹"]="å„";e["〺"]="å…";e["ã‚›"]=" ã‚™";e["ã‚œ"]=" ã‚š";e["ㄱ"]="á„€";e["ㄲ"]="á„";e["ㄳ"]="ᆪ";e["ã„´"]="á„‚";e["ㄵ"]="ᆬ";e["ㄶ"]="ᆭ";e["ã„·"]="ᄃ";e["ㄸ"]="á„„";e["ㄹ"]="á„…";e["ㄺ"]="ᆰ";e["ã„»"]="ᆱ";e["ㄼ"]="ᆲ";e["ㄽ"]="ᆳ";e["ㄾ"]="ᆴ";e["ã„¿"]="ᆵ";e["ã…€"]="á„š";e["ã…"]="ᄆ";e["ã…‚"]="ᄇ";e["ã…ƒ"]="ᄈ";e["ã…„"]="á„¡";e["ã……"]="ᄉ";e["ã…†"]="á„Š";e["ã…‡"]="á„‹";e["ã…ˆ"]="á„Œ";e["ã…‰"]="á„";e["ã…Š"]="á„Ž";e["ã…‹"]="á„";e["ã…Œ"]="á„";e["ã…"]="á„‘";e["ã…Ž"]="á„’";e["ã…"]="á…¡";e["ã…"]="á…¢";e["ã…‘"]="á…£";e["ã…’"]="á…¤";e["ã…“"]="á…¥";e["ã…”"]="á…¦";e["ã…•"]="á…§";e["ã…–"]="á…¨";e["ã…—"]="á…©";e["ã…˜"]="á…ª";e["ã…™"]="á…«";e["ã…š"]="á…¬";e["ã…›"]="á…­";e["ã…œ"]="á…®";e["ã…"]="á…¯";e["ã…ž"]="á…°";e["ã…Ÿ"]="á…±";e["ã… "]="á…²";e["ã…¡"]="á…³";e["ã…¢"]="á…´";e["ã…£"]="á…µ";e["ã…¤"]="á… ";e["ã…¥"]="á„”";e["ã…¦"]="á„•";e["ã…§"]="ᇇ";e["ã…¨"]="ᇈ";e["ã…©"]="ᇌ";e["ã…ª"]="ᇎ";e["ã…«"]="ᇓ";e["ã…¬"]="ᇗ";e["ã…­"]="ᇙ";e["ã…®"]="á„œ";e["ã…¯"]="á‡";e["ã…°"]="ᇟ";e["ã…±"]="á„";e["ã…²"]="á„ž";e["ã…³"]="á„ ";e["ã…´"]="á„¢";e["ã…µ"]="á„£";e["ã…¶"]="ᄧ";e["ã…·"]="á„©";e["ã…¸"]="á„«";e["ã…¹"]="ᄬ";e["ã…º"]="á„­";e["ã…»"]="á„®";e["ã…¼"]="ᄯ";e["ã…½"]="ᄲ";e["ã…¾"]="ᄶ";e["ã…¿"]="á…€";e["ㆀ"]="á…‡";e["ã†"]="á…Œ";e["ㆂ"]="ᇱ";e["ㆃ"]="ᇲ";e["ㆄ"]="á…—";e["ㆅ"]="á…˜";e["ㆆ"]="á…™";e["ㆇ"]="ᆄ";e["ㆈ"]="ᆅ";e["ㆉ"]="ᆈ";e["ㆊ"]="ᆑ";e["ㆋ"]="ᆒ";e["ㆌ"]="ᆔ";e["ã†"]="ᆞ";e["ㆎ"]="ᆡ";e["㈀"]="(á„€)";e["ãˆ"]="(á„‚)";e["㈂"]="(ᄃ)";e["㈃"]="(á„…)";e["㈄"]="(ᄆ)";e["㈅"]="(ᄇ)";e["㈆"]="(ᄉ)";e["㈇"]="(á„‹)";e["㈈"]="(á„Œ)";e["㈉"]="(á„Ž)";e["㈊"]="(á„)";e["㈋"]="(á„)";e["㈌"]="(á„‘)";e["ãˆ"]="(á„’)";e["㈎"]="(가)";e["ãˆ"]="(á„‚á…¡)";e["ãˆ"]="(다)";e["㈑"]="(á„…á…¡)";e["㈒"]="(마)";e["㈓"]="(바)";e["㈔"]="(사)";e["㈕"]="(á„‹á…¡)";e["㈖"]="(자)";e["㈗"]="(á„Žá…¡)";e["㈘"]="(á„á…¡)";e["㈙"]="(á„á…¡)";e["㈚"]="(á„‘á…¡)";e["㈛"]="(á„’á…¡)";e["㈜"]="(주)";e["ãˆ"]="(오전)";e["㈞"]="(á„‹á…©á„’á…®)";e["㈠"]="(一)";e["㈡"]="(二)";e["㈢"]="(三)";e["㈣"]="(å››)";e["㈤"]="(五)";e["㈥"]="(å…­)";e["㈦"]="(七)";e["㈧"]="(å…«)";e["㈨"]="(ä¹)";e["㈩"]="(å)";e["㈪"]="(月)";e["㈫"]="(ç«)";e["㈬"]="(æ°´)";e["㈭"]="(木)";e["㈮"]="(金)";e["㈯"]="(土)";e["㈰"]="(æ—¥)";e["㈱"]="(æ ª)";e["㈲"]="(有)";e["㈳"]="(社)";e["㈴"]="(å)";e["㈵"]="(特)";e["㈶"]="(財)";e["㈷"]="(ç¥)";e["㈸"]="(労)";e["㈹"]="(代)";e["㈺"]="(呼)";e["㈻"]="(å­¦)";e["㈼"]="(監)";e["㈽"]="(ä¼)";e["㈾"]="(資)";e["㈿"]="(å”)";e["㉀"]="(祭)";e["ã‰"]="(休)";e["㉂"]="(自)";e["㉃"]="(至)";e["ã‹€"]="1月";e["ã‹"]="2月";e["ã‹‚"]="3月";e["㋃"]="4月";e["ã‹„"]="5月";e["ã‹…"]="6月";e["㋆"]="7月";e["㋇"]="8月";e["㋈"]="9月";e["㋉"]="10月";e["ã‹Š"]="11月";e["ã‹‹"]="12月";e["ã˜"]="0点";e["ã™"]="1点";e["ãš"]="2点";e["ã›"]="3点";e["ãœ"]="4点";e["ã"]="5点";e["ãž"]="6点";e["ãŸ"]="7点";e["ã "]="8点";e["ã¡"]="9点";e["ã¢"]="10点";e["ã£"]="11点";e["ã¤"]="12点";e["ã¥"]="13点";e["ã¦"]="14点";e["ã§"]="15点";e["ã¨"]="16点";e["ã©"]="17点";e["ãª"]="18点";e["ã«"]="19点";e["ã¬"]="20点";e["ã­"]="21点";e["ã®"]="22点";e["ã¯"]="23点";e["ã°"]="24点";e["ã "]="1æ—¥";e["ã¡"]="2æ—¥";e["ã¢"]="3æ—¥";e["ã£"]="4æ—¥";e["ã¤"]="5æ—¥";e["ã¥"]="6æ—¥";e["ã¦"]="7æ—¥";e["ã§"]="8æ—¥";e["ã¨"]="9æ—¥";e["ã©"]="10æ—¥";e["ãª"]="11æ—¥";e["ã«"]="12æ—¥";e["ã¬"]="13æ—¥";e["ã­"]="14æ—¥";e["ã®"]="15æ—¥";e["ã¯"]="16æ—¥";e["ã°"]="17æ—¥";e["ã±"]="18æ—¥";e["ã²"]="19æ—¥";e["ã³"]="20æ—¥";e["ã´"]="21æ—¥";e["ãµ"]="22æ—¥";e["ã¶"]="23æ—¥";e["ã·"]="24æ—¥";e["ã¸"]="25æ—¥";e["ã¹"]="26æ—¥";e["ãº"]="27æ—¥";e["ã»"]="28æ—¥";e["ã¼"]="29æ—¥";e["ã½"]="30æ—¥";e["ã¾"]="31æ—¥";e["ff"]="ff";e["ï¬"]="fi";e["fl"]="fl";e["ffi"]="ffi";e["ffl"]="ffl";e["ſt"]="Å¿t";e["st"]="st";e["ﬓ"]="Õ´Õ¶";e["ﬔ"]="Õ´Õ¥";e["ﬕ"]="Õ´Õ«";e["ﬖ"]="Õ¾Õ¶";e["ﬗ"]="Õ´Õ­";e["ï­"]="×ל";e["ï­"]="Ù±";e["ï­‘"]="Ù±";e["ï­’"]="Ù»";e["ï­“"]="Ù»";e["ï­”"]="Ù»";e["ï­•"]="Ù»";e["ï­–"]="Ù¾";e["ï­—"]="Ù¾";e["ï­˜"]="Ù¾";e["ï­™"]="Ù¾";e["ï­š"]="Ú€";e["ï­›"]="Ú€";e["ï­œ"]="Ú€";e["ï­"]="Ú€";e["ï­ž"]="Ùº";e["ï­Ÿ"]="Ùº";e["ï­ "]="Ùº";e["ï­¡"]="Ùº";e["ï­¢"]="Ù¿";e["ï­£"]="Ù¿";e["ï­¤"]="Ù¿";e["ï­¥"]="Ù¿";e["ï­¦"]="Ù¹";e["ï­§"]="Ù¹";e["ï­¨"]="Ù¹";e["ï­©"]="Ù¹";e["ï­ª"]="Ú¤";e["ï­«"]="Ú¤";e["ï­¬"]="Ú¤";e["ï­­"]="Ú¤";e["ï­®"]="Ú¦";e["ï­¯"]="Ú¦";e["ï­°"]="Ú¦";e["ï­±"]="Ú¦";e["ï­²"]="Ú„";e["ï­³"]="Ú„";e["ï­´"]="Ú„";e["ï­µ"]="Ú„";e["ï­¶"]="Úƒ";e["ï­·"]="Úƒ";e["ï­¸"]="Úƒ";e["ï­¹"]="Úƒ";e["ï­º"]="Ú†";e["ï­»"]="Ú†";e["ï­¼"]="Ú†";e["ï­½"]="Ú†";e["ï­¾"]="Ú‡";e["ï­¿"]="Ú‡";e["ﮀ"]="Ú‡";e["ï®"]="Ú‡";e["ﮂ"]="Ú";e["ﮃ"]="Ú";e["ﮄ"]="ÚŒ";e["ï®…"]="ÚŒ";e["ﮆ"]="ÚŽ";e["ﮇ"]="ÚŽ";e["ﮈ"]="Úˆ";e["ﮉ"]="Úˆ";e["ﮊ"]="Ú˜";e["ﮋ"]="Ú˜";e["ﮌ"]="Ú‘";e["ï®"]="Ú‘";e["ﮎ"]="Ú©";e["ï®"]="Ú©";e["ï®"]="Ú©";e["ﮑ"]="Ú©";e["ï®’"]="Ú¯";e["ﮓ"]="Ú¯";e["ï®”"]="Ú¯";e["ﮕ"]="Ú¯";e["ï®–"]="Ú³";e["ï®—"]="Ú³";e["ﮘ"]="Ú³";e["ï®™"]="Ú³";e["ﮚ"]="Ú±";e["ï®›"]="Ú±";e["ﮜ"]="Ú±";e["ï®"]="Ú±";e["ﮞ"]="Úº";e["ﮟ"]="Úº";e["ï® "]="Ú»";e["ﮡ"]="Ú»";e["ﮢ"]="Ú»";e["ﮣ"]="Ú»";e["ﮤ"]="Û€";e["ﮥ"]="Û€";e["ﮦ"]="Û";e["ﮧ"]="Û";e["ﮨ"]="Û";e["ﮩ"]="Û";e["ﮪ"]="Ú¾";e["ﮫ"]="Ú¾";e["ﮬ"]="Ú¾";e["ï®­"]="Ú¾";e["ï®®"]="Û’";e["ﮯ"]="Û’";e["ï®°"]="Û“";e["ï®±"]="Û“";e["ﯓ"]="Ú­";e["ﯔ"]="Ú­";e["ﯕ"]="Ú­";e["ﯖ"]="Ú­";e["ﯗ"]="Û‡";e["ﯘ"]="Û‡";e["ﯙ"]="Û†";e["ﯚ"]="Û†";e["ﯛ"]="Ûˆ";e["ﯜ"]="Ûˆ";e["ï¯"]="Ù·";e["ﯞ"]="Û‹";e["ﯟ"]="Û‹";e["ﯠ"]="Û…";e["ﯡ"]="Û…";e["ﯢ"]="Û‰";e["ﯣ"]="Û‰";e["ﯤ"]="Û";e["ﯥ"]="Û";e["ﯦ"]="Û";e["ﯧ"]="Û";e["ﯨ"]="Ù‰";e["ﯩ"]="Ù‰";e["ﯪ"]="ئا";e["ﯫ"]="ئا";e["ﯬ"]="ئە";e["ﯭ"]="ئە";e["ﯮ"]="ئو";e["ﯯ"]="ئو";e["ﯰ"]="ئۇ";e["ﯱ"]="ئۇ";e["ﯲ"]="ئۆ";e["ﯳ"]="ئۆ";e["ﯴ"]="ئۈ";e["ﯵ"]="ئۈ";e["ﯶ"]="ئÛ";e["ﯷ"]="ئÛ";e["ﯸ"]="ئÛ";e["ﯹ"]="ئى";e["ﯺ"]="ئى";e["ﯻ"]="ئى";e["ﯼ"]="ÛŒ";e["ﯽ"]="ÛŒ";e["ﯾ"]="ÛŒ";e["ﯿ"]="ÛŒ";e["ï°€"]="ئج";e["ï°"]="ئح";e["ï°‚"]="ئم";e["ï°ƒ"]="ئى";e["ï°„"]="ئي";e["ï°…"]="بج";e["ï°†"]="بح";e["ï°‡"]="بخ";e["ï°ˆ"]="بم";e["ï°‰"]="بى";e["ï°Š"]="بي";e["ï°‹"]="تج";e["ï°Œ"]="تح";e["ï°"]="تخ";e["ï°Ž"]="تم";e["ï°"]="تى";e["ï°"]="تي";e["ï°‘"]="ثج";e["ï°’"]="ثم";e["ï°“"]="ثى";e["ï°”"]="ثي";e["ï°•"]="جح";e["ï°–"]="جم";e["ï°—"]="حج";e["ï°˜"]="حم";e["ï°™"]="خج";e["ï°š"]="خح";e["ï°›"]="خم";e["ï°œ"]="سج";e["ï°"]="سح";e["ï°ž"]="سخ";e["ï°Ÿ"]="سم";e["ï° "]="صح";e["ï°¡"]="صم";e["ï°¢"]="ضج";e["ï°£"]="ضح";e["ï°¤"]="ضخ";e["ï°¥"]="ضم";e["ï°¦"]="طح";e["ï°§"]="طم";e["ï°¨"]="ظم";e["ï°©"]="عج";e["ï°ª"]="عم";e["ï°«"]="غج";e["ï°¬"]="غم";e["ï°­"]="Ùج";e["ï°®"]="ÙØ­";e["ï°¯"]="ÙØ®";e["ï°°"]="ÙÙ…";e["ï°±"]="ÙÙ‰";e["ï°²"]="ÙÙŠ";e["ï°³"]="قح";e["ï°´"]="قم";e["ï°µ"]="قى";e["ï°¶"]="قي";e["ï°·"]="كا";e["ï°¸"]="كج";e["ï°¹"]="كح";e["ï°º"]="كخ";e["ï°»"]="كل";e["ï°¼"]="كم";e["ï°½"]="كى";e["ï°¾"]="كي";e["ï°¿"]="لج";e["ï±€"]="لح";e["ï±"]="لخ";e["ﱂ"]="لم";e["ﱃ"]="لى";e["ﱄ"]="لي";e["ï±…"]="مج";e["ﱆ"]="مح";e["ﱇ"]="مخ";e["ﱈ"]="مم";e["ﱉ"]="مى";e["ﱊ"]="مي";e["ﱋ"]="نج";e["ﱌ"]="نح";e["ï±"]="نخ";e["ﱎ"]="نم";e["ï±"]="نى";e["ï±"]="ني";e["ﱑ"]="هج";e["ï±’"]="هم";e["ﱓ"]="هى";e["ï±”"]="هي";e["ﱕ"]="يج";e["ï±–"]="يح";e["ï±—"]="يخ";e["ﱘ"]="يم";e["ï±™"]="يى";e["ﱚ"]="يي";e["ï±›"]="ذٰ";e["ﱜ"]="رٰ";e["ï±"]="ىٰ";e["ﱞ"]=" ٌّ";e["ﱟ"]=" ÙÙ‘";e["ï± "]=" ÙŽÙ‘";e["ﱡ"]=" ÙÙ‘";e["ï±¢"]=" ÙÙ‘";e["ï±£"]=" ّٰ";e["ﱤ"]="ئر";e["ï±¥"]="ئز";e["ﱦ"]="ئم";e["ﱧ"]="ئن";e["ﱨ"]="ئى";e["ﱩ"]="ئي";e["ﱪ"]="بر";e["ﱫ"]="بز";e["ﱬ"]="بم";e["ï±­"]="بن";e["ï±®"]="بى";e["ﱯ"]="بي";e["ï±°"]="تر";e["ï±±"]="تز";e["ï±²"]="تم";e["ï±³"]="تن";e["ï±´"]="تى";e["ï±µ"]="تي";e["ﱶ"]="ثر";e["ï±·"]="ثز";e["ﱸ"]="ثم";e["ï±¹"]="ثن";e["ﱺ"]="ثى";e["ï±»"]="ثي";e["ï±¼"]="ÙÙ‰";e["ï±½"]="ÙÙŠ";e["ï±¾"]="قى";e["ﱿ"]="قي";e["ï²€"]="كا";e["ï²"]="كل";e["ﲂ"]="كم";e["ﲃ"]="كى";e["ﲄ"]="كي";e["ï²…"]="لم";e["ﲆ"]="لى";e["ﲇ"]="لي";e["ﲈ"]="ما";e["ﲉ"]="مم";e["ﲊ"]="نر";e["ﲋ"]="نز";e["ﲌ"]="نم";e["ï²"]="نن";e["ﲎ"]="نى";e["ï²"]="ني";e["ï²"]="ىٰ";e["ﲑ"]="ير";e["ï²’"]="يز";e["ﲓ"]="يم";e["ï²”"]="ين";e["ﲕ"]="يى";e["ï²–"]="يي";e["ï²—"]="ئج";e["ﲘ"]="ئح";e["ï²™"]="ئخ";e["ﲚ"]="ئم";e["ï²›"]="ئه";e["ﲜ"]="بج";e["ï²"]="بح";e["ﲞ"]="بخ";e["ﲟ"]="بم";e["ï² "]="به";e["ﲡ"]="تج";e["ï²¢"]="تح";e["ï²£"]="تخ";e["ﲤ"]="تم";e["ï²¥"]="ته";e["ﲦ"]="ثم";e["ﲧ"]="جح";e["ﲨ"]="جم";e["ﲩ"]="حج";e["ﲪ"]="حم";e["ﲫ"]="خج";e["ﲬ"]="خم";e["ï²­"]="سج";e["ï²®"]="سح";e["ﲯ"]="سخ";e["ï²°"]="سم";e["ï²±"]="صح";e["ï²²"]="صخ";e["ï²³"]="صم";e["ï²´"]="ضج";e["ï²µ"]="ضح";e["ﲶ"]="ضخ";e["ï²·"]="ضم";e["ﲸ"]="طح";e["ï²¹"]="ظم";e["ﲺ"]="عج";e["ï²»"]="عم";e["ï²¼"]="غج";e["ï²½"]="غم";e["ï²¾"]="Ùج";e["ﲿ"]="ÙØ­";e["ï³€"]="ÙØ®";e["ï³"]="ÙÙ…";e["ﳂ"]="قح";e["ﳃ"]="قم";e["ﳄ"]="كج";e["ï³…"]="كح";e["ﳆ"]="كخ";e["ﳇ"]="كل";e["ﳈ"]="كم";e["ﳉ"]="لج";e["ﳊ"]="لح";e["ﳋ"]="لخ";e["ﳌ"]="لم";e["ï³"]="له";e["ﳎ"]="مج";e["ï³"]="مح";e["ï³"]="مخ";e["ﳑ"]="مم";e["ï³’"]="نج";e["ﳓ"]="نح";e["ï³”"]="نخ";e["ﳕ"]="نم";e["ï³–"]="نه";e["ï³—"]="هج";e["ﳘ"]="هم";e["ï³™"]="هٰ";e["ﳚ"]="يج";e["ï³›"]="يح";e["ﳜ"]="يخ";e["ï³"]="يم";e["ﳞ"]="يه";e["ﳟ"]="ئم";e["ï³ "]="ئه";e["ﳡ"]="بم";e["ï³¢"]="به";e["ï³£"]="تم";e["ﳤ"]="ته";e["ï³¥"]="ثم";e["ﳦ"]="ثه";e["ﳧ"]="سم";e["ﳨ"]="سه";e["ﳩ"]="شم";e["ﳪ"]="شه";e["ﳫ"]="كل";e["ﳬ"]="كم";e["ï³­"]="لم";e["ï³®"]="نم";e["ﳯ"]="نه";e["ï³°"]="يم";e["ï³±"]="يه";e["ï³²"]="Ù€ÙŽÙ‘";e["ï³³"]="Ù€ÙÙ‘";e["ï³´"]="Ù€ÙÙ‘";e["ï³µ"]="طى";e["ﳶ"]="طي";e["ï³·"]="عى";e["ﳸ"]="عي";e["ï³¹"]="غى";e["ﳺ"]="غي";e["ï³»"]="سى";e["ï³¼"]="سي";e["ï³½"]="شى";e["ï³¾"]="شي";e["ﳿ"]="حى";e["ï´€"]="حي";e["ï´"]="جى";e["ï´‚"]="جي";e["ï´ƒ"]="خى";e["ï´„"]="خي";e["ï´…"]="صى";e["ï´†"]="صي";e["ï´‡"]="ضى";e["ï´ˆ"]="ضي";e["ï´‰"]="شج";e["ï´Š"]="شح";e["ï´‹"]="شخ";e["ï´Œ"]="شم";e["ï´"]="شر";e["ï´Ž"]="سر";e["ï´"]="صر";e["ï´"]="ضر";e["ï´‘"]="طى";e["ï´’"]="طي";e["ï´“"]="عى";e["ï´”"]="عي";e["ï´•"]="غى";e["ï´–"]="غي";e["ï´—"]="سى";e["ï´˜"]="سي";e["ï´™"]="شى";e["ï´š"]="شي";e["ï´›"]="حى";e["ï´œ"]="حي";e["ï´"]="جى";e["ï´ž"]="جي";e["ï´Ÿ"]="خى";e["ï´ "]="خي";e["ï´¡"]="صى";e["ï´¢"]="صي";e["ï´£"]="ضى";e["ï´¤"]="ضي";e["ï´¥"]="شج";e["ï´¦"]="شح";e["ï´§"]="شخ";e["ï´¨"]="شم";e["ï´©"]="شر";e["ï´ª"]="سر";e["ï´«"]="صر";e["ï´¬"]="ضر";e["ï´­"]="شج";e["ï´®"]="شح";e["ï´¯"]="شخ";e["ï´°"]="شم";e["ï´±"]="سه";e["ï´²"]="شه";e["ï´³"]="طم";e["ï´´"]="سج";e["ï´µ"]="سح";e["ï´¶"]="سخ";e["ï´·"]="شج";e["ï´¸"]="شح";e["ï´¹"]="شخ";e["ï´º"]="طم";e["ï´»"]="ظم";e["ï´¼"]="اً";e["ï´½"]="اً";e["ïµ"]="تجم";e["ﵑ"]="تحج";e["ïµ’"]="تحج";e["ﵓ"]="تحم";e["ïµ”"]="تخم";e["ﵕ"]="تمج";e["ïµ–"]="تمح";e["ïµ—"]="تمخ";e["ﵘ"]="جمح";e["ïµ™"]="جمح";e["ﵚ"]="حمي";e["ïµ›"]="حمى";e["ﵜ"]="سحج";e["ïµ"]="سجح";e["ﵞ"]="سجى";e["ﵟ"]="سمح";e["ïµ "]="سمح";e["ﵡ"]="سمج";e["ïµ¢"]="سمم";e["ïµ£"]="سمم";e["ﵤ"]="صحح";e["ïµ¥"]="صحح";e["ﵦ"]="صمم";e["ﵧ"]="شحم";e["ﵨ"]="شحم";e["ﵩ"]="شجي";e["ﵪ"]="شمخ";e["ﵫ"]="شمخ";e["ﵬ"]="شمم";e["ïµ­"]="شمم";e["ïµ®"]="ضحى";e["ﵯ"]="ضخم";e["ïµ°"]="ضخم";e["ïµ±"]="طمح";e["ïµ²"]="طمح";e["ïµ³"]="طمم";e["ïµ´"]="طمي";e["ïµµ"]="عجم";e["ﵶ"]="عمم";e["ïµ·"]="عمم";e["ﵸ"]="عمى";e["ïµ¹"]="غمم";e["ﵺ"]="غمي";e["ïµ»"]="غمى";e["ïµ¼"]="Ùخم";e["ïµ½"]="Ùخم";e["ïµ¾"]="قمح";e["ﵿ"]="قمم";e["ﶀ"]="لحم";e["ï¶"]="لحي";e["ﶂ"]="لحى";e["ﶃ"]="لجج";e["ﶄ"]="لجج";e["ﶅ"]="لخم";e["ﶆ"]="لخم";e["ﶇ"]="لمح";e["ﶈ"]="لمح";e["ﶉ"]="محج";e["ﶊ"]="محم";e["ﶋ"]="محي";e["ﶌ"]="مجح";e["ï¶"]="مجم";e["ﶎ"]="مخج";e["ï¶"]="مخم";e["ﶒ"]="مجخ";e["ﶓ"]="همج";e["ﶔ"]="همم";e["ﶕ"]="نحم";e["ﶖ"]="نحى";e["ﶗ"]="نجم";e["ﶘ"]="نجم";e["ﶙ"]="نجى";e["ﶚ"]="نمي";e["ﶛ"]="نمى";e["ﶜ"]="يمم";e["ï¶"]="يمم";e["ﶞ"]="بخي";e["ﶟ"]="تجي";e["ﶠ"]="تجى";e["ﶡ"]="تخي";e["ﶢ"]="تخى";e["ﶣ"]="تمي";e["ﶤ"]="تمى";e["ﶥ"]="جمي";e["ﶦ"]="جحى";e["ﶧ"]="جمى";e["ﶨ"]="سخى";e["ﶩ"]="صحي";e["ﶪ"]="شحي";e["ﶫ"]="ضحي";e["ﶬ"]="لجي";e["ﶭ"]="لمي";e["ﶮ"]="يحي";e["ﶯ"]="يجي";e["ﶰ"]="يمي";e["ﶱ"]="ممي";e["ﶲ"]="قمي";e["ﶳ"]="نحي";e["ﶴ"]="قمح";e["ﶵ"]="لحم";e["ﶶ"]="عمي";e["ﶷ"]="كمي";e["ﶸ"]="نجح";e["ﶹ"]="مخي";e["ﶺ"]="لجم";e["ﶻ"]="كمم";e["ﶼ"]="لجم";e["ﶽ"]="نجح";e["ﶾ"]="جحي";e["ﶿ"]="حجي";e["ï·€"]="مجي";e["ï·"]="Ùمي";e["ï·‚"]="بحي";e["ï·ƒ"]="كمم";e["ï·„"]="عجم";e["ï·…"]="صمم";e["ï·†"]="سخي";e["ï·‡"]="نجي";e["﹉"]="‾";e["﹊"]="‾";e["﹋"]="‾";e["﹌"]="‾";e["ï¹"]="_";e["﹎"]="_";e["ï¹"]="_";e["ﺀ"]="Ø¡";e["ïº"]="Ø¢";e["ﺂ"]="Ø¢";e["ﺃ"]="Ø£";e["ﺄ"]="Ø£";e["ﺅ"]="ؤ";e["ﺆ"]="ؤ";e["ﺇ"]="Ø¥";e["ﺈ"]="Ø¥";e["ﺉ"]="ئ";e["ﺊ"]="ئ";e["ﺋ"]="ئ";e["ﺌ"]="ئ";e["ïº"]="ا";e["ﺎ"]="ا";e["ïº"]="ب";e["ïº"]="ب";e["ﺑ"]="ب";e["ﺒ"]="ب";e["ﺓ"]="Ø©";e["ﺔ"]="Ø©";e["ﺕ"]="ت";e["ﺖ"]="ت";e["ﺗ"]="ت";e["ﺘ"]="ت";e["ﺙ"]="Ø«";e["ﺚ"]="Ø«";e["ﺛ"]="Ø«";e["ﺜ"]="Ø«";e["ïº"]="ج";e["ﺞ"]="ج";e["ﺟ"]="ج";e["ﺠ"]="ج";e["ﺡ"]="Ø­";e["ﺢ"]="Ø­";e["ﺣ"]="Ø­";e["ﺤ"]="Ø­";e["ﺥ"]="Ø®";e["ﺦ"]="Ø®";e["ﺧ"]="Ø®";e["ﺨ"]="Ø®";e["ﺩ"]="د";e["ﺪ"]="د";e["ﺫ"]="Ø°";e["ﺬ"]="Ø°";e["ﺭ"]="ر";e["ﺮ"]="ر";e["ﺯ"]="ز";e["ﺰ"]="ز";e["ﺱ"]="س";e["ﺲ"]="س";e["ﺳ"]="س";e["ﺴ"]="س";e["ﺵ"]="Ø´";e["ﺶ"]="Ø´";e["ﺷ"]="Ø´";e["ﺸ"]="Ø´";e["ﺹ"]="ص";e["ﺺ"]="ص";e["ﺻ"]="ص";e["ﺼ"]="ص";e["ﺽ"]="ض";e["ﺾ"]="ض";e["ﺿ"]="ض";e["ﻀ"]="ض";e["ï»"]="Ø·";e["ﻂ"]="Ø·";e["ﻃ"]="Ø·";e["ﻄ"]="Ø·";e["ï»…"]="ظ";e["ﻆ"]="ظ";e["ﻇ"]="ظ";e["ﻈ"]="ظ";e["ﻉ"]="ع";e["ﻊ"]="ع";e["ﻋ"]="ع";e["ﻌ"]="ع";e["ï»"]="غ";e["ﻎ"]="غ";e["ï»"]="غ";e["ï»"]="غ";e["ﻑ"]="Ù";e["ï»’"]="Ù";e["ﻓ"]="Ù";e["ï»”"]="Ù";e["ﻕ"]="Ù‚";e["ï»–"]="Ù‚";e["ï»—"]="Ù‚";e["ﻘ"]="Ù‚";e["ï»™"]="Ùƒ";e["ﻚ"]="Ùƒ";e["ï»›"]="Ùƒ";e["ﻜ"]="Ùƒ";e["ï»"]="Ù„";e["ﻞ"]="Ù„";e["ﻟ"]="Ù„";e["ï» "]="Ù„";e["ﻡ"]="Ù…";e["ﻢ"]="Ù…";e["ﻣ"]="Ù…";e["ﻤ"]="Ù…";e["ﻥ"]="Ù†";e["ﻦ"]="Ù†";e["ﻧ"]="Ù†";e["ﻨ"]="Ù†";e["ﻩ"]="Ù‡";e["ﻪ"]="Ù‡";e["ﻫ"]="Ù‡";e["ﻬ"]="Ù‡";e["ï»­"]="Ùˆ";e["ï»®"]="Ùˆ";e["ﻯ"]="Ù‰";e["ï»°"]="Ù‰";e["ï»±"]="ÙŠ";e["ﻲ"]="ÙŠ";e["ﻳ"]="ÙŠ";e["ï»´"]="ÙŠ";e["ﻵ"]="لآ";e["ﻶ"]="لآ";e["ï»·"]="لأ";e["ﻸ"]="لأ";e["ﻹ"]="لإ";e["ﻺ"]="لإ";e["ï»»"]="لا";e["ﻼ"]="لا"});t.mapSpecialUnicodeValues=function(e){return e>=65520&&e<=65535?0:e>=62976&&e<=63743?i()[e]||e:173===e?45:e};t.reverseIfRtl=function(e){var t,r,a=e.length;if(a<=1||!(t=e.charCodeAt(0),r=n[13],t>=r.begin&&t<r.end||t>=(r=n[11]).begin&&t<r.end))return e;for(var i="",o=a-1;o>=0;o--)i+=e[o];return i};t.getUnicodeRangeFor=function(e){for(var t=0,r=n.length;t<r;t++){var a=n[t];if(e>=a.begin&&e<a.end)return t}return-1};t.getNormalizedUnicodes=o;t.getUnicodeForGlyph=function(e,t){var r=t[e];if(void 0!==r)return r;if(!e)return-1;if("u"===e[0]){var a,i=e.length;if(7===i&&"n"===e[1]&&"i"===e[2])a=e.substring(3);else{if(!(i>=5&&i<=7))return-1;a=e.substring(1)}if(a===a.toUpperCase()&&(r=parseInt(a,16))>=0)return r}return-1}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.FontRendererFactory=void 0;var a=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),i=r(2),n=r(157),o=r(160),s=r(159),c=r(140);function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}});t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var f=function(){function e(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]}function t(e,t){return e[t]<<8|e[t+1]}function r(r,a,n){var o,s,c,l=1===t(r,a+2)?e(r,a+8):e(r,a+16),u=t(r,a+l);if(4===u){t(r,a+l+2);var h=t(r,a+l+6)>>1;s=a+l+14;o=[];for(c=0;c<h;c++,s+=2)o[c]={end:t(r,s)};s+=2;for(c=0;c<h;c++,s+=2)o[c].start=t(r,s);for(c=0;c<h;c++,s+=2)o[c].idDelta=t(r,s);for(c=0;c<h;c++,s+=2){var f=t(r,s);if(0!==f){o[c].ids=[];for(var d=0,g=o[c].end-o[c].start+1;d<g;d++){o[c].ids[d]=t(r,s+f);f+=2}}}return o}if(12===u){e(r,a+l+4);var m=e(r,a+l+12);s=a+l+16;o=[];for(c=0;c<m;c++){o.push({start:e(r,s),end:e(r,s+4),idDelta:e(r,s+8)-e(r,s)});s+=12}return o}throw new i.FormatError("unsupported cmap: "+u)}function f(e,t,r,a){var i=new n.CFFParser(new c.Stream(e,t,r-t),{},a).parse();return{glyphs:i.charStrings.objects,subrs:i.topDict.privateDict&&i.topDict.privateDict.subrsIndex&&i.topDict.privateDict.subrsIndex.objects,gsubrs:i.globalSubrIndex&&i.globalSubrIndex.objects,isCFFCIDFont:i.isCIDFont,fdSelect:i.fdSelect,fdArray:i.fdArray}}function d(e,t){for(var r=t.codePointAt(0),a=0,i=0,n=e.length-1;i<n;){var o=i+n+1>>1;r<e[o].start?n=o-1:i=o}e[i].start<=r&&r<=e[i].end&&(a=e[i].idDelta+(e[i].ids?e[i].ids[r-e[i].start]:r)&65535);return{charCode:r,glyphId:a}}var g=[],m=function(){function e(t){h(this,e);this.constructor===e&&(0,i.unreachable)("Cannot initialize CompiledFont.");this.fontMatrix=t;this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null)}a(e,[{key:"getPathJs",value:function(e){var t=d(this.cmap,e),r=this.compiledGlyphs[t.glyphId];if(!r){r=this.compileGlyph(this.glyphs[t.glyphId],t.glyphId);this.compiledGlyphs[t.glyphId]=r}void 0===this.compiledCharCodeToGlyphId[t.charCode]&&(this.compiledCharCodeToGlyphId[t.charCode]=t.glyphId);return r}},{key:"compileGlyph",value:function(e,t){if(!e||0===e.length||14===e[0])return g;var r=this.fontMatrix;if(this.isCFFCIDFont){var a=this.fdSelect.getFDIndex(t);if(a>=0&&a<this.fdArray.length){r=this.fdArray[a].getByName("FontMatrix")||i.FONT_IDENTITY_MATRIX}else(0,i.warn)("Invalid fd index for glyph index.")}var n=[];n.push({cmd:"save"});n.push({cmd:"transform",args:r.slice()});n.push({cmd:"scale",args:["size","-size"]});this.compileGlyphImpl(e,n,t);n.push({cmd:"restore"});return n}},{key:"compileGlyphImpl",value:function(){(0,i.unreachable)("Children classes should implement this.")}},{key:"hasBuiltPath",value:function(e){var t=d(this.cmap,e);return void 0!==this.compiledGlyphs[t.glyphId]&&void 0!==this.compiledCharCodeToGlyphId[t.charCode]}}]);return e}(),p=function(e){u(t,m);function t(e,r,a){h(this,t);var i=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,a||[488e-6,0,0,488e-6,0,0]));i.glyphs=e;i.cmap=r;return i}a(t,[{key:"compileGlyphImpl",value:function(e,t){!function e(t,r,a){function i(e,t){r.push({cmd:"moveTo",args:[e,t]})}function n(e,t){r.push({cmd:"lineTo",args:[e,t]})}function o(e,t,a,i){r.push({cmd:"quadraticCurveTo",args:[e,t,a,i]})}var s,c=0,l=(t[c]<<24|t[c+1]<<16)>>16,u=0,h=0;c+=10;if(l<0)do{s=t[c]<<8|t[c+1];var f,d,g=t[c+2]<<8|t[c+3];c+=4;if(1&s){f=(t[c]<<24|t[c+1]<<16)>>16;d=(t[c+2]<<24|t[c+3]<<16)>>16;c+=4}else{f=t[c++];d=t[c++]}if(2&s){u=f;h=d}else{u=0;h=0}var m=1,p=1,v=0,b=0;if(8&s){m=p=(t[c]<<24|t[c+1]<<16)/1073741824;c+=2}else if(64&s){m=(t[c]<<24|t[c+1]<<16)/1073741824;p=(t[c+2]<<24|t[c+3]<<16)/1073741824;c+=4}else if(128&s){m=(t[c]<<24|t[c+1]<<16)/1073741824;v=(t[c+2]<<24|t[c+3]<<16)/1073741824;b=(t[c+4]<<24|t[c+5]<<16)/1073741824;p=(t[c+6]<<24|t[c+7]<<16)/1073741824;c+=8}var y=a.glyphs[g];if(y){r.push({cmd:"save"});r.push({cmd:"transform",args:[m,v,b,p,u,h]});e(y,r,a);r.push({cmd:"restore"})}}while(32&s);else{var w,k,S=[];for(w=0;w<l;w++){S.push(t[c]<<8|t[c+1]);c+=2}c+=2+(t[c]<<8|t[c+1]);for(var C=S[S.length-1]+1,x=[];x.length<C;){var _=1;8&(s=t[c++])&&(_+=t[c++]);for(;_-- >0;)x.push({flags:s})}for(w=0;w<C;w++){switch(18&x[w].flags){case 0:u+=(t[c]<<24|t[c+1]<<16)>>16;c+=2;break;case 2:u-=t[c++];break;case 18:u+=t[c++]}x[w].x=u}for(w=0;w<C;w++){switch(36&x[w].flags){case 0:h+=(t[c]<<24|t[c+1]<<16)>>16;c+=2;break;case 4:h-=t[c++];break;case 36:h+=t[c++]}x[w].y=h}var A=0;for(c=0;c<l;c++){var P=S[c],I=x.slice(A,P+1);if(1&I[0].flags)I.push(I[0]);else if(1&I[I.length-1].flags)I.unshift(I[I.length-1]);else{var O={flags:1,x:(I[0].x+I[I.length-1].x)/2,y:(I[0].y+I[I.length-1].y)/2};I.unshift(O);I.push(O)}i(I[0].x,I[0].y);for(w=1,k=I.length;w<k;w++)if(1&I[w].flags)n(I[w].x,I[w].y);else if(1&I[w+1].flags){o(I[w].x,I[w].y,I[w+1].x,I[w+1].y);w++}else o(I[w].x,I[w].y,(I[w].x+I[w+1].x)/2,(I[w].y+I[w+1].y)/2);A=P+1}}}(e,t,this)}}]);return t}(),v=function(e){u(t,m);function t(e,r,a,i){h(this,t);var n=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,a||[.001,0,0,.001,0,0]));n.glyphs=e.glyphs;n.gsubrs=e.gsubrs||[];n.subrs=e.subrs||[];n.cmap=r;n.glyphNameMap=i||(0,o.getGlyphsUnicode)();n.gsubrsBias=n.gsubrs.length<1240?107:n.gsubrs.length<33900?1131:32768;n.subrsBias=n.subrs.length<1240?107:n.subrs.length<33900?1131:32768;n.isCFFCIDFont=e.isCFFCIDFont;n.fdSelect=e.fdSelect;n.fdArray=e.fdArray;return n}a(t,[{key:"compileGlyphImpl",value:function(e,t,r){!function e(t,r,a,n){var o=[],c=0,l=0,u=0;function h(e,t){r.push({cmd:"moveTo",args:[e,t]})}function f(e,t){r.push({cmd:"lineTo",args:[e,t]})}function g(e,t,a,i,n,o){r.push({cmd:"bezierCurveTo",args:[e,t,a,i,n,o]})}!function t(m){for(var p=0;p<m.length;){var v,b,y,w,k,S,C,x,_=!1,A=m[p++];switch(A){case 1:case 3:u+=o.length>>1;_=!0;break;case 4:l+=o.pop();h(c,l);_=!0;break;case 5:for(;o.length>0;){c+=o.shift();l+=o.shift();f(c,l)}break;case 6:for(;o.length>0;){f(c+=o.shift(),l);if(0===o.length)break;l+=o.shift();f(c,l)}break;case 7:for(;o.length>0;){l+=o.shift();f(c,l);if(0===o.length)break;f(c+=o.shift(),l)}break;case 8:for(;o.length>0;){v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l)}break;case 10:C=o.pop();x=null;if(a.isCFFCIDFont){var P=a.fdSelect.getFDIndex(n);if(P>=0&&P<a.fdArray.length){var I=a.fdArray[P],O=void 0;I.privateDict&&I.privateDict.subrsIndex&&(O=I.privateDict.subrsIndex.objects);if(O){var T=O.length;x=O[C+=T<1240?107:T<33900?1131:32768]}}else(0,i.warn)("Invalid fd index for glyph index.")}else x=a.subrs[C+a.subrsBias];x&&t(x);break;case 11:return;case 12:switch(A=m[p++]){case 34:b=(v=c+o.shift())+o.shift();k=l+o.shift();c=b+o.shift();g(v,l,b,k,c,k);b=(v=c+o.shift())+o.shift();c=b+o.shift();g(v,k,b,l,c,l);break;case 35:v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l);v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l);o.pop();break;case 36:g(v=c+o.shift(),k=l+o.shift(),b=v+o.shift(),S=k+o.shift(),c=b+o.shift(),S);g(v=c+o.shift(),S,b=v+o.shift(),S+o.shift(),c=b+o.shift(),l);break;case 37:var E=c,F=l;v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l);v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b;l=w;Math.abs(c-E)>Math.abs(l-F)?c+=o.shift():l+=o.shift();g(v,y,b,w,c,l);break;default:throw new i.FormatError("unknown operator: 12 "+A)}break;case 14:if(o.length>=4){var R=o.pop(),B=o.pop();l=o.pop();c=o.pop();r.push({cmd:"save"});r.push({cmd:"translate",args:[c,l]});var D=d(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[R]]));e(a.glyphs[D.glyphId],r,a,D.glyphId);r.push({cmd:"restore"});D=d(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[B]]));e(a.glyphs[D.glyphId],r,a,D.glyphId)}return;case 18:u+=o.length>>1;_=!0;break;case 19:case 20:p+=(u+=o.length>>1)+7>>3;_=!0;break;case 21:l+=o.pop();h(c+=o.pop(),l);_=!0;break;case 22:h(c+=o.pop(),l);_=!0;break;case 23:u+=o.length>>1;_=!0;break;case 24:for(;o.length>2;){v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l)}c+=o.shift();l+=o.shift();f(c,l);break;case 25:for(;o.length>6;){c+=o.shift();l+=o.shift();f(c,l)}v=c+o.shift();y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+o.shift();g(v,y,b,w,c,l);break;case 26:o.length%2&&(c+=o.shift());for(;o.length>0;){v=c;y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b;l=w+o.shift();g(v,y,b,w,c,l)}break;case 27:o.length%2&&(l+=o.shift());for(;o.length>0;)g(v=c+o.shift(),y=l,b=v+o.shift(),w=y+o.shift(),c=b+o.shift(),l=w);break;case 28:o.push((m[p]<<24|m[p+1]<<16)>>16);p+=2;break;case 29:C=o.pop()+a.gsubrsBias;(x=a.gsubrs[C])&&t(x);break;case 30:for(;o.length>0;){v=c;y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+(1===o.length?o.shift():0);g(v,y,b,w,c,l);if(0===o.length)break;v=c+o.shift();y=l;b=v+o.shift();w=y+o.shift();l=w+o.shift();g(v,y,b,w,c=b+(1===o.length?o.shift():0),l)}break;case 31:for(;o.length>0;){v=c+o.shift();y=l;b=v+o.shift();w=y+o.shift();l=w+o.shift();g(v,y,b,w,c=b+(1===o.length?o.shift():0),l);if(0===o.length)break;v=c;y=l+o.shift();b=v+o.shift();w=y+o.shift();c=b+o.shift();l=w+(1===o.length?o.shift():0);g(v,y,b,w,c,l)}break;default:if(A<32)throw new i.FormatError("unknown operator: "+A);if(A<247)o.push(A-139);else if(A<251)o.push(256*(A-247)+m[p++]+108);else if(A<255)o.push(256*-(A-251)-m[p++]-108);else{o.push((m[p]<<24|m[p+1]<<16|m[p+2]<<8|m[p+3])/65536);p+=4}}_&&(o.length=0)}}(t)}(e,t,this,r)}}]);return t}();return{create:function(a,n){for(var o,s,c,l,u,h,d=new Uint8Array(a.data),g=t(d,4),m=0,b=12;m<g;m++,b+=16){var y=(0,i.bytesToString)(d.subarray(b,b+4)),w=e(d,b+8),k=e(d,b+12);switch(y){case"cmap":o=r(d,w);break;case"glyf":s=d.subarray(w,w+k);break;case"loca":c=d.subarray(w,w+k);break;case"head":h=t(d,w+18);u=t(d,w+50);break;case"CFF ":l=f(d,w,w+k,n)}}if(s){var S=h?[1/h,0,0,1/h,0,0]:a.fontMatrix;return new p(function(e,t,r){var a,i;if(r){a=4;i=function(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]}}else{a=2;i=function(e,t){return e[t]<<9|e[t+1]<<1}}for(var n=[],o=i(t,0),s=a;s<t.length;s+=a){var c=i(t,s);n.push(e.subarray(o,c));o=c}return n}(s,c,u),o,S)}return new v(l,o,a.fontMatrix,a.glyphNameMap)}}}();t.FontRendererFactory=f},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Type1Parser=void 0;var a=r(2),i=r(159),n=r(140),o=function(){var e=[4],t=[5],r=[6],i=[7],n=[8],o=[12,35],s=[14],c=[21],l=[22],u=[30],h=[31];function f(){this.width=0;this.lsb=0;this.flexing=!1;this.output=[];this.stack=[]}f.prototype={convert:function(f,d,g){for(var m,p,v,b=f.length,y=!1,w=0;w<b;w++){var k=f[w];if(k<32){12===k&&(k=(k<<8)+f[++w]);switch(k){case 1:case 3:this.stack=[];break;case 4:if(this.flexing){if(this.stack.length<1){y=!0;break}var S=this.stack.pop();this.stack.push(0,S);break}y=this.executeCommand(1,e);break;case 5:y=this.executeCommand(2,t);break;case 6:y=this.executeCommand(1,r);break;case 7:y=this.executeCommand(1,i);break;case 8:y=this.executeCommand(6,n);break;case 9:this.stack=[];break;case 10:if(this.stack.length<1){y=!0;break}if(!d[v=this.stack.pop()]){y=!0;break}y=this.convert(d[v],d,g);break;case 11:return y;case 13:if(this.stack.length<2){y=!0;break}m=this.stack.pop();p=this.stack.pop();this.lsb=p;this.width=m;this.stack.push(m,p);y=this.executeCommand(2,l);break;case 14:this.output.push(s[0]);break;case 21:if(this.flexing)break;y=this.executeCommand(2,c);break;case 22:if(this.flexing){this.stack.push(0);break}y=this.executeCommand(1,l);break;case 30:y=this.executeCommand(4,u);break;case 31:y=this.executeCommand(4,h);break;case 3072:case 3073:case 3074:this.stack=[];break;case 3078:if(g){this.seac=this.stack.splice(-4,4);y=this.executeCommand(0,s)}else y=this.executeCommand(4,s);break;case 3079:if(this.stack.length<4){y=!0;break}this.stack.pop();m=this.stack.pop();var C=this.stack.pop();p=this.stack.pop();this.lsb=p;this.width=m;this.stack.push(m,p,C);y=this.executeCommand(3,c);break;case 3084:if(this.stack.length<2){y=!0;break}var x=this.stack.pop(),_=this.stack.pop();this.stack.push(_/x);break;case 3088:if(this.stack.length<2){y=!0;break}v=this.stack.pop();var A=this.stack.pop();if(0===v&&3===A){var P=this.stack.splice(this.stack.length-17,17);this.stack.push(P[2]+P[0],P[3]+P[1],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14]);y=this.executeCommand(13,o,!0);this.flexing=!1;this.stack.push(P[15],P[16])}else 1===v&&0===A&&(this.flexing=!0);break;case 3089:break;case 3105:this.stack=[];break;default:(0,a.warn)('Unknown type 1 charstring command of "'+k+'"')}if(y)break}else{k<=246?k-=139:k=k<=250?256*(k-247)+f[++w]+108:k<=254?-256*(k-251)-f[++w]-108:(255&f[++w])<<24|(255&f[++w])<<16|(255&f[++w])<<8|(255&f[++w])<<0;this.stack.push(k)}}return y},executeCommand:function(e,t,r){var a=this.stack.length;if(e>a)return!0;for(var i=a-e,n=i;n<a;n++){var o=this.stack[n];if(Number.isInteger(o))this.output.push(28,o>>8&255,255&o);else{o=65536*o|0;this.output.push(255,o>>24&255,o>>16&255,o>>8&255,255&o)}}this.output.push.apply(this.output,t);r?this.stack.splice(i,e):this.stack.length=0;return!1}};return f}(),s=function(){var e=55665;function t(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function r(e,t,r){if(r>=e.length)return new Uint8Array(0);var a,i,n=0|t;for(a=0;a<r;a++)n=52845*(e[a]+n)+22719&65535;var o=e.length-r,s=new Uint8Array(o);for(a=r,i=0;i<o;a++,i++){var c=e[a];s[i]=c^n>>8;n=52845*(c+n)+22719&65535}return s}function s(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}function c(a,i,o){if(i){var s=a.getBytes(),c=!(t(s[0])&&t(s[1])&&t(s[2])&&t(s[3]));a=new n.Stream(c?r(s,e,4):function(e,r,a){var i,n,o=0|r,s=e.length,c=new Uint8Array(s>>>1);for(i=0,n=0;i<s;i++){var l=e[i];if(t(l)){i++;for(var u;i<s&&!t(u=e[i]);)i++;if(i<s){var h=parseInt(String.fromCharCode(l,u),16);c[n++]=h^o>>8;o=52845*(h+o)+22719&65535}}}return Array.prototype.slice.call(c,a,n)}(s,e,4))}this.seacAnalysisEnabled=!!o;this.stream=a;this.nextChar()}c.prototype={readNumberArray:function(){this.getToken();for(var e=[];;){var t=this.getToken();if(null===t||"]"===t||"}"===t)break;e.push(parseFloat(t||0))}return e},readNumber:function(){var e=this.getToken();return parseFloat(e||0)},readInt:function(){var e=this.getToken();return 0|parseInt(e||0,10)},readBoolean:function(){return"true"===this.getToken()?1:0},nextChar:function(){return this.currentChar=this.stream.getByte()},getToken:function(){for(var e=!1,t=this.currentChar;;){if(-1===t)return null;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,a.isSpace)(t))break;t=this.nextChar()}if(s(t)){this.nextChar();return String.fromCharCode(t)}var r="";do{r+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!(0,a.isSpace)(t)&&!s(t));return r},readCharStrings:function(e,t){return-1===t?e:r(e,4330,t)},extractFontProgram:function(){var e=this.stream,t=[],r=[],a=Object.create(null);a.lenIV=4;for(var i,n,s,c,l,u={subrs:[],charstrings:[],properties:{privateData:a}};null!==(i=this.getToken());)if("/"===i)switch(i=this.getToken()){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;null!==(i=this.getToken())&&"end"!==i;)if("/"===i){var h=this.getToken();n=this.readInt();this.getToken();s=n>0?e.getBytes(n):new Uint8Array(0);c=u.properties.privateData.lenIV;l=this.readCharStrings(s,c);this.nextChar();"noaccess"===(i=this.getToken())&&this.getToken();r.push({glyph:h,encoded:l})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){var f=this.readInt();n=this.readInt();this.getToken();s=n>0?e.getBytes(n):new Uint8Array(0);c=u.properties.privateData.lenIV;l=this.readCharStrings(s,c);this.nextChar();"noaccess"===(i=this.getToken())&&this.getToken();t[f]=l}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":var d=this.readNumberArray();d.length>0&&d.length,0;break;case"StemSnapH":case"StemSnapV":u.properties.privateData[i]=this.readNumberArray();break;case"StdHW":case"StdVW":u.properties.privateData[i]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":case"ExpansionFactor":u.properties.privateData[i]=this.readNumber();break;case"ForceBold":u.properties.privateData[i]=this.readBoolean()}for(var g=0;g<r.length;g++){h=r[g].glyph;l=r[g].encoded;var m=new o,p=m.convert(l,t,this.seacAnalysisEnabled),v=m.output;p&&(v=[14]);u.charstrings.push({glyphName:h,charstring:v,width:m.width,lsb:m.lsb,seac:m.seac})}return u},extractFontHeader:function(e){for(var t;null!==(t=this.getToken());)if("/"===t)switch(t=this.getToken()){case"FontMatrix":var r=this.readNumberArray();e.fontMatrix=r;break;case"Encoding":var a,n=this.getToken();if(/^\d+$/.test(n)){a=[];var o=0|parseInt(n,10);this.getToken();for(var s=0;s<o;s++){t=this.getToken();for(;"dup"!==t&&"def"!==t;)if(null===(t=this.getToken()))return;if("def"===t)break;var c=this.readInt();this.getToken();var l=this.getToken();a[c]=l;this.getToken()}}else a=(0,i.getEncoding)(n);e.builtInEncoding=a;break;case"FontBBox":var u=this.readNumberArray();e.ascent=Math.max(u[3],u[1]);e.descent=Math.min(u[1],u[3]);e.ascentScaled=!0}}};return c}();t.Type1Parser=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getTilingPatternIR=t.Pattern=void 0;var a=r(2),i=r(151),n=r(138),o={FUNCTION_BASED:1,AXIAL:2,RADIAL:3,FREE_FORM_MESH:4,LATTICE_FORM_MESH:5,COONS_PATCH_MESH:6,TENSOR_PATCH_MESH:7},s=function(){function e(){(0,a.unreachable)("should not call Pattern constructor")}e.prototype={getPattern:function(e){(0,a.unreachable)("Should not call Pattern.getStyle: "+e)}};e.parseShading=function(e,t,r,i,s,l){var u=(0,n.isStream)(e)?e.dict:e,h=u.get("ShadingType");try{switch(h){case o.AXIAL:case o.RADIAL:return new c.RadialAxial(u,t,r,i,l);case o.FREE_FORM_MESH:case o.LATTICE_FORM_MESH:case o.COONS_PATCH_MESH:case o.TENSOR_PATCH_MESH:return new c.Mesh(e,t,r,i,l);default:throw new a.FormatError("Unsupported ShadingType: "+h)}}catch(e){if(e instanceof a.MissingDataException)throw e;s.send("UnsupportedFeature",{featureId:a.UNSUPPORTED_FEATURES.shadingPattern});(0,a.warn)(e);return new c.Dummy}};return e}(),c={SMALL_NUMBER:1e-6};c.RadialAxial=function(){function e(e,t,r,n,s){this.matrix=t;this.coordsArr=e.getArray("Coords");this.shadingType=e.get("ShadingType");this.type="Pattern";var l=e.get("ColorSpace","CS");l=i.ColorSpace.parse(l,r,n,s);this.cs=l;var u=0,h=1;if(e.has("Domain")){var f=e.getArray("Domain");u=f[0];h=f[1]}var d=!1,g=!1;if(e.has("Extend")){var m=e.getArray("Extend");d=m[0];g=m[1]}if(!(this.shadingType!==o.RADIAL||d&&g)){var p=this.coordsArr[0],v=this.coordsArr[1],b=this.coordsArr[2],y=this.coordsArr[3],w=this.coordsArr[4],k=this.coordsArr[5],S=Math.sqrt((p-y)*(p-y)+(v-w)*(v-w));b<=k+S&&k<=b+S&&(0,a.warn)("Unsupported radial gradient.")}this.extendStart=d;this.extendEnd=g;var C=e.get("Function"),x=s.createFromArray(C),_=h-u,A=_/10,P=this.colorStops=[];if(u>=h||A<=0)(0,a.info)("Bad shading domain.");else{for(var I,O=new Float32Array(l.numComps),T=new Float32Array(1),E=u;E<=h;E+=A){T[0]=E;x(T,0,O,0);I=l.getRgb(O,0);var F=a.Util.makeCssRgb(I[0],I[1],I[2]);P.push([(E-u)/_,F])}var R="transparent";if(e.has("Background")){I=l.getRgb(e.get("Background"),0);R=a.Util.makeCssRgb(I[0],I[1],I[2])}if(!d){P.unshift([0,R]);P[1][0]+=c.SMALL_NUMBER}if(!g){P[P.length-1][0]-=c.SMALL_NUMBER;P.push([1,R])}this.colorStops=P}}e.prototype={getIR:function(){var e,t,r,i,n,s=this.coordsArr,c=this.shadingType;if(c===o.AXIAL){t=[s[0],s[1]];r=[s[2],s[3]];i=null;n=null;e="axial"}else if(c===o.RADIAL){t=[s[0],s[1]];r=[s[3],s[4]];i=s[2];n=s[5];e="radial"}else(0,a.unreachable)("getPattern type unknown: "+c);var l=this.matrix;if(l){t=a.Util.applyTransform(t,l);r=a.Util.applyTransform(r,l);if(c===o.RADIAL){var u=a.Util.singularValueDecompose2dScale(l);i*=u[0];n*=u[1]}}return["RadialAxial",e,this.colorStops,t,r,i,n]}};return e}();c.Mesh=function(){function e(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;var r=t.numComps;this.tmpCompsBuf=new Float32Array(r);var a=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(a):this.tmpCompsBuf}e.prototype={get hasData(){if(this.stream.end)return this.stream.pos<this.stream.end;if(this.bufferLength>0)return!0;var e=this.stream.getByte();if(e<0)return!1;this.buffer=e;this.bufferLength=8;return!0},readBits:function(e){var t=this.buffer,r=this.bufferLength;if(32===e){if(0===r)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;t=t<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();var a=this.stream.getByte();this.buffer=a&(1<<r)-1;return(t<<8-r|(255&a)>>r)>>>0}if(8===e&&0===r)return this.stream.getByte();for(;r<e;){t=t<<8|this.stream.getByte();r+=8}r-=e;this.bufferLength=r;this.buffer=t&(1<<r)-1;return t>>r},align:function(){this.buffer=0;this.bufferLength=0},readFlag:function(){return this.readBits(this.context.bitsPerFlag)},readCoordinate:function(){var e=this.context.bitsPerCoordinate,t=this.readBits(e),r=this.readBits(e),a=this.context.decode,i=e<32?1/((1<<e)-1):2.3283064365386963e-10;return[t*i*(a[1]-a[0])+a[0],r*i*(a[3]-a[2])+a[2]]},readComponents:function(){for(var e=this.context.numComps,t=this.context.bitsPerComponent,r=t<32?1/((1<<t)-1):2.3283064365386963e-10,a=this.context.decode,i=this.tmpCompsBuf,n=0,o=4;n<e;n++,o+=2){var s=this.readBits(t);i[n]=s*r*(a[o+1]-a[o])+a[o]}var c=this.tmpCsCompsBuf;this.context.colorFn&&this.context.colorFn(i,0,c,0);return this.context.colorSpace.getRgb(c,0)}};var t=3,r=20,s=20,c=function(){var e=[];return function(t){e[t]||(e[t]=function(e){for(var t=[],r=0;r<=e;r++){var a=r/e,i=1-a;t.push(new Float32Array([i*i*i,3*a*i*i,3*a*a*i,a*a*a]))}return t}(t));return e[t]}}();function l(e,i){var n=e.figures[i];(0,a.assert)("patch"===n.type,"Unexpected patch mesh figure");var o=e.coords,l=e.colors,u=n.coords,h=n.colors,f=Math.min(o[u[0]][0],o[u[3]][0],o[u[12]][0],o[u[15]][0]),d=Math.min(o[u[0]][1],o[u[3]][1],o[u[12]][1],o[u[15]][1]),g=Math.max(o[u[0]][0],o[u[3]][0],o[u[12]][0],o[u[15]][0]),m=Math.max(o[u[0]][1],o[u[3]][1],o[u[12]][1],o[u[15]][1]),p=Math.ceil((g-f)*s/(e.bounds[2]-e.bounds[0]));p=Math.max(t,Math.min(r,p));var v=Math.ceil((m-d)*s/(e.bounds[3]-e.bounds[1]));v=Math.max(t,Math.min(r,v));for(var b=p+1,y=new Int32Array((v+1)*b),w=new Int32Array((v+1)*b),k=0,S=new Uint8Array(3),C=new Uint8Array(3),x=l[h[0]],_=l[h[1]],A=l[h[2]],P=l[h[3]],I=c(v),O=c(p),T=0;T<=v;T++){S[0]=(x[0]*(v-T)+A[0]*T)/v|0;S[1]=(x[1]*(v-T)+A[1]*T)/v|0;S[2]=(x[2]*(v-T)+A[2]*T)/v|0;C[0]=(_[0]*(v-T)+P[0]*T)/v|0;C[1]=(_[1]*(v-T)+P[1]*T)/v|0;C[2]=(_[2]*(v-T)+P[2]*T)/v|0;for(var E=0;E<=p;E++,k++)if(0!==T&&T!==v||0!==E&&E!==p){for(var F=0,R=0,B=0,D=0;D<=3;D++)for(var M=0;M<=3;M++,B++){var L=I[T][D]*O[E][M];F+=o[u[B]][0]*L;R+=o[u[B]][1]*L}y[k]=o.length;o.push([F,R]);w[k]=l.length;var N=new Uint8Array(3);N[0]=(S[0]*(p-E)+C[0]*E)/p|0;N[1]=(S[1]*(p-E)+C[1]*E)/p|0;N[2]=(S[2]*(p-E)+C[2]*E)/p|0;l.push(N)}}y[0]=u[0];w[0]=h[0];y[p]=u[3];w[p]=h[1];y[b*v]=u[12];w[b*v]=h[2];y[b*v+p]=u[15];w[b*v+p]=h[3];e.figures[i]={type:"lattice",coords:y,colors:w,verticesPerRow:b}}function u(e){for(var t=e.coords[0][0],r=e.coords[0][1],a=t,i=r,n=1,o=e.coords.length;n<o;n++){var s=e.coords[n][0],c=e.coords[n][1];t=t>s?s:t;r=r>c?c:r;a=a<s?s:a;i=i<c?c:i}e.bounds=[t,r,a,i]}function h(t,r,s,c,h){if(!(0,n.isStream)(t))throw new a.FormatError("Mesh data is not a stream");var f=t.dict;this.matrix=r;this.shadingType=f.get("ShadingType");this.type="Pattern";this.bbox=f.getArray("BBox");var d=f.get("ColorSpace","CS");d=i.ColorSpace.parse(d,s,c,h);this.cs=d;this.background=f.has("Background")?d.getRgb(f.get("Background"),0):null;var g=f.get("Function"),m=g?h.createFromArray(g):null;this.coords=[];this.colors=[];this.figures=[];var p=new e(t,{bitsPerCoordinate:f.get("BitsPerCoordinate"),bitsPerComponent:f.get("BitsPerComponent"),bitsPerFlag:f.get("BitsPerFlag"),decode:f.getArray("Decode"),colorFn:m,colorSpace:d,numComps:m?1:d.numComps}),v=!1;switch(this.shadingType){case o.FREE_FORM_MESH:!function(e,t){for(var r=e.coords,i=e.colors,n=[],o=[],s=0;t.hasData;){var c=t.readFlag(),l=t.readCoordinate(),u=t.readComponents();if(0===s){if(!(0<=c&&c<=2))throw new a.FormatError("Unknown type4 flag");switch(c){case 0:s=3;break;case 1:o.push(o[o.length-2],o[o.length-1]);s=1;break;case 2:o.push(o[o.length-3],o[o.length-1]);s=1}n.push(c)}o.push(r.length);r.push(l);i.push(u);s--;t.align()}e.figures.push({type:"triangles",coords:new Int32Array(o),colors:new Int32Array(o)})}(this,p);break;case o.LATTICE_FORM_MESH:var b=0|f.get("VerticesPerRow");if(b<2)throw new a.FormatError("Invalid VerticesPerRow");!function(e,t,r){for(var a=e.coords,i=e.colors,n=[];t.hasData;){var o=t.readCoordinate(),s=t.readComponents();n.push(a.length);a.push(o);i.push(s)}e.figures.push({type:"lattice",coords:new Int32Array(n),colors:new Int32Array(n),verticesPerRow:r})}(this,p,b);break;case o.COONS_PATCH_MESH:!function(e,t){for(var r=e.coords,i=e.colors,n=new Int32Array(16),o=new Int32Array(4);t.hasData;){var s,c,l=t.readFlag();if(!(0<=l&&l<=3))throw new a.FormatError("Unknown type6 flag");var u=r.length;for(s=0,c=0!==l?8:12;s<c;s++)r.push(t.readCoordinate());var h,f,d,g,m=i.length;for(s=0,c=0!==l?2:4;s<c;s++)i.push(t.readComponents());switch(l){case 0:n[12]=u+3;n[13]=u+4;n[14]=u+5;n[15]=u+6;n[8]=u+2;n[11]=u+7;n[4]=u+1;n[7]=u+8;n[0]=u;n[1]=u+11;n[2]=u+10;n[3]=u+9;o[2]=m+1;o[3]=m+2;o[0]=m;o[1]=m+3;break;case 1:h=n[12];f=n[13];d=n[14];g=n[15];n[12]=g;n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=d;n[11]=u+3;n[4]=f;n[7]=u+4;n[0]=h;n[1]=u+7;n[2]=u+6;n[3]=u+5;h=o[2];f=o[3];o[2]=f;o[3]=m;o[0]=h;o[1]=m+1;break;case 2:h=n[15];f=n[11];n[12]=n[3];n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=n[7];n[11]=u+3;n[4]=f;n[7]=u+4;n[0]=h;n[1]=u+7;n[2]=u+6;n[3]=u+5;h=o[3];o[2]=o[1];o[3]=m;o[0]=h;o[1]=m+1;break;case 3:n[12]=n[0];n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=n[1];n[11]=u+3;n[4]=n[2];n[7]=u+4;n[0]=n[3];n[1]=u+7;n[2]=u+6;n[3]=u+5;o[2]=o[0];o[3]=m;o[0]=o[1];o[1]=m+1}n[5]=r.length;r.push([(-4*r[n[0]][0]-r[n[15]][0]+6*(r[n[4]][0]+r[n[1]][0])-2*(r[n[12]][0]+r[n[3]][0])+3*(r[n[13]][0]+r[n[7]][0]))/9,(-4*r[n[0]][1]-r[n[15]][1]+6*(r[n[4]][1]+r[n[1]][1])-2*(r[n[12]][1]+r[n[3]][1])+3*(r[n[13]][1]+r[n[7]][1]))/9]);n[6]=r.length;r.push([(-4*r[n[3]][0]-r[n[12]][0]+6*(r[n[2]][0]+r[n[7]][0])-2*(r[n[0]][0]+r[n[15]][0])+3*(r[n[4]][0]+r[n[14]][0]))/9,(-4*r[n[3]][1]-r[n[12]][1]+6*(r[n[2]][1]+r[n[7]][1])-2*(r[n[0]][1]+r[n[15]][1])+3*(r[n[4]][1]+r[n[14]][1]))/9]);n[9]=r.length;r.push([(-4*r[n[12]][0]-r[n[3]][0]+6*(r[n[8]][0]+r[n[13]][0])-2*(r[n[0]][0]+r[n[15]][0])+3*(r[n[11]][0]+r[n[1]][0]))/9,(-4*r[n[12]][1]-r[n[3]][1]+6*(r[n[8]][1]+r[n[13]][1])-2*(r[n[0]][1]+r[n[15]][1])+3*(r[n[11]][1]+r[n[1]][1]))/9]);n[10]=r.length;r.push([(-4*r[n[15]][0]-r[n[0]][0]+6*(r[n[11]][0]+r[n[14]][0])-2*(r[n[12]][0]+r[n[3]][0])+3*(r[n[2]][0]+r[n[8]][0]))/9,(-4*r[n[15]][1]-r[n[0]][1]+6*(r[n[11]][1]+r[n[14]][1])-2*(r[n[12]][1]+r[n[3]][1])+3*(r[n[2]][1]+r[n[8]][1]))/9]);e.figures.push({type:"patch",coords:new Int32Array(n),colors:new Int32Array(o)})}}(this,p);v=!0;break;case o.TENSOR_PATCH_MESH:!function(e,t){for(var r=e.coords,i=e.colors,n=new Int32Array(16),o=new Int32Array(4);t.hasData;){var s,c,l=t.readFlag();if(!(0<=l&&l<=3))throw new a.FormatError("Unknown type7 flag");var u=r.length;for(s=0,c=0!==l?12:16;s<c;s++)r.push(t.readCoordinate());var h,f,d,g,m=i.length;for(s=0,c=0!==l?2:4;s<c;s++)i.push(t.readComponents());switch(l){case 0:n[12]=u+3;n[13]=u+4;n[14]=u+5;n[15]=u+6;n[8]=u+2;n[9]=u+13;n[10]=u+14;n[11]=u+7;n[4]=u+1;n[5]=u+12;n[6]=u+15;n[7]=u+8;n[0]=u;n[1]=u+11;n[2]=u+10;n[3]=u+9;o[2]=m+1;o[3]=m+2;o[0]=m;o[1]=m+3;break;case 1:h=n[12];f=n[13];d=n[14];g=n[15];n[12]=g;n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=d;n[9]=u+9;n[10]=u+10;n[11]=u+3;n[4]=f;n[5]=u+8;n[6]=u+11;n[7]=u+4;n[0]=h;n[1]=u+7;n[2]=u+6;n[3]=u+5;h=o[2];f=o[3];o[2]=f;o[3]=m;o[0]=h;o[1]=m+1;break;case 2:h=n[15];f=n[11];n[12]=n[3];n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=n[7];n[9]=u+9;n[10]=u+10;n[11]=u+3;n[4]=f;n[5]=u+8;n[6]=u+11;n[7]=u+4;n[0]=h;n[1]=u+7;n[2]=u+6;n[3]=u+5;h=o[3];o[2]=o[1];o[3]=m;o[0]=h;o[1]=m+1;break;case 3:n[12]=n[0];n[13]=u+0;n[14]=u+1;n[15]=u+2;n[8]=n[1];n[9]=u+9;n[10]=u+10;n[11]=u+3;n[4]=n[2];n[5]=u+8;n[6]=u+11;n[7]=u+4;n[0]=n[3];n[1]=u+7;n[2]=u+6;n[3]=u+5;o[2]=o[0];o[3]=m;o[0]=o[1];o[1]=m+1}e.figures.push({type:"patch",coords:new Int32Array(n),colors:new Int32Array(o)})}}(this,p);v=!0;break;default:(0,a.unreachable)("Unsupported mesh type.")}if(v){u(this);for(var y=0,w=this.figures.length;y<w;y++)l(this,y)}u(this);!function(e){var t,r,a,i,n=e.coords,o=new Float32Array(2*n.length);for(t=0,a=0,r=n.length;t<r;t++){var s=n[t];o[a++]=s[0];o[a++]=s[1]}e.coords=o;var c=e.colors,l=new Uint8Array(3*c.length);for(t=0,a=0,r=c.length;t<r;t++){var u=c[t];l[a++]=u[0];l[a++]=u[1];l[a++]=u[2]}e.colors=l;var h=e.figures;for(t=0,r=h.length;t<r;t++){var f=h[t],d=f.coords,g=f.colors;for(a=0,i=d.length;a<i;a++){d[a]*=2;g[a]*=3}}}(this)}h.prototype={getIR:function(){return["Mesh",this.shadingType,this.coords,this.colors,this.figures,this.bounds,this.matrix,this.bbox,this.background]}};return h}();c.Dummy=function(){function e(){this.type="Pattern"}e.prototype={getIR:function(){return["Dummy"]}};return e}();t.Pattern=s;t.getTilingPatternIR=function(e,t,r){var i=t.getArray("Matrix"),n=a.Util.normalizeRect(t.getArray("BBox")),o=t.get("XStep"),s=t.get("YStep"),c=t.get("PaintType"),l=t.get("TilingType");if(n[2]-n[0]==0||n[3]-n[1]==0)throw new a.FormatError("Invalid getTilingPatternIR /BBox array: ["+n+"].");return["TilingPattern",r,e,i,n,o,s,c,l]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.bidi=void 0;var a=r(2),i=["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"],n=["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 o(e){return 0!=(1&e)}function s(e){return 0==(1&e)}function c(e,t,r){for(var a=t,i=e.length;a<i;++a)if(e[a]!==r)return a;return a}function l(e,t,r,a){for(var i=t;i<r;++i)e[i]=a}function u(e,t,r){for(var a=t,i=r-1;a<i;++a,--i){var n=e[a];e[a]=e[i];e[i]=n}}function h(e,t,r){return{str:e,dir:r?"ttb":t?"ltr":"rtl"}}var f=[],d=[];t.bidi=function(e,t,r){var g=!0,m=e.length;if(0===m||r)return h(e,g,r);f.length=m;d.length=m;var p,v,b=0;for(p=0;p<m;++p){f[p]=e.charAt(p);var y=e.charCodeAt(p),w="L";y<=255?w=i[y]:1424<=y&&y<=1524?w="R":1536<=y&&y<=1791?(w=n[255&y])||(0,a.warn)("Bidi: invalid Unicode character "+y.toString(16)):1792<=y&&y<=2220&&(w="AL");"R"!==w&&"AL"!==w&&"AN"!==w||b++;d[p]=w}if(0===b)return h(e,g=!0);if(-1===t)if(b/m<.3){g=!0;t=0}else{g=!1;t=1}var k=[];for(p=0;p<m;++p)k[p]=t;var S,C=o(t)?"R":"L",x=C,_=x,A=x;for(p=0;p<m;++p)"NSM"===d[p]?d[p]=A:A=d[p];A=x;for(p=0;p<m;++p)"EN"===(S=d[p])?d[p]="AL"===A?"AN":"EN":"R"!==S&&"L"!==S&&"AL"!==S||(A=S);for(p=0;p<m;++p)"AL"===(S=d[p])&&(d[p]="R");for(p=1;p<m-1;++p){"ES"===d[p]&&"EN"===d[p-1]&&"EN"===d[p+1]&&(d[p]="EN");"CS"!==d[p]||"EN"!==d[p-1]&&"AN"!==d[p-1]||d[p+1]!==d[p-1]||(d[p]=d[p-1])}for(p=0;p<m;++p)if("EN"===d[p]){var P;for(P=p-1;P>=0&&"ET"===d[P];--P)d[P]="EN";for(P=p+1;P<m&&"ET"===d[P];++P)d[P]="EN"}for(p=0;p<m;++p)"WS"!==(S=d[p])&&"ES"!==S&&"ET"!==S&&"CS"!==S||(d[p]="ON");A=x;for(p=0;p<m;++p)"EN"===(S=d[p])?d[p]="L"===A?"L":"EN":"R"!==S&&"L"!==S||(A=S);for(p=0;p<m;++p)if("ON"===d[p]){var I=c(d,p+1,"ON"),O=x;p>0&&(O=d[p-1]);var T=_;I+1<m&&(T=d[I+1]);"L"!==O&&(O="R");"L"!==T&&(T="R");O===T&&l(d,p,I,O);p=I-1}for(p=0;p<m;++p)"ON"===d[p]&&(d[p]=C);for(p=0;p<m;++p){S=d[p];s(k[p])?"R"===S?k[p]+=1:"AN"!==S&&"EN"!==S||(k[p]+=2):"L"!==S&&"AN"!==S&&"EN"!==S||(k[p]+=1)}var E,F=-1,R=99;for(p=0,v=k.length;p<v;++p){F<(E=k[p])&&(F=E);R>E&&o(E)&&(R=E)}for(E=F;E>=R;--E){var B=-1;for(p=0,v=k.length;p<v;++p)if(k[p]<E){if(B>=0){u(f,B,p);B=-1}}else B<0&&(B=p);B>=0&&u(f,B,k.length)}for(p=0,v=f.length;p<v;++p){var D=f[p];"<"!==D&&">"!==D||(f[p]="")}return h(f.join(""),g)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getMetrics=void 0;var a=r(2),i=(0,a.getLookupTableFactory)(function(e){e.Courier=600;e["Courier-Bold"]=600;e["Courier-BoldOblique"]=600;e["Courier-Oblique"]=600;e.Helvetica=(0,a.getLookupTableFactory)(function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556});e["Helvetica-Bold"]=(0,a.getLookupTableFactory)(function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556});e["Helvetica-BoldOblique"]=(0,a.getLookupTableFactory)(function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556});e["Helvetica-Oblique"]=(0,a.getLookupTableFactory)(function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556});e.Symbol=(0,a.getLookupTableFactory)(function(e){e.space=250;e.exclam=333;e.universal=713;e.numbersign=500;e.existential=549;e.percent=833;e.ampersand=778;e.suchthat=439;e.parenleft=333;e.parenright=333;e.asteriskmath=500;e.plus=549;e.comma=250;e.minus=549;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=549;e.equal=549;e.greater=549;e.question=444;e.congruent=549;e.Alpha=722;e.Beta=667;e.Chi=722;e.Delta=612;e.Epsilon=611;e.Phi=763;e.Gamma=603;e.Eta=722;e.Iota=333;e.theta1=631;e.Kappa=722;e.Lambda=686;e.Mu=889;e.Nu=722;e.Omicron=722;e.Pi=768;e.Theta=741;e.Rho=556;e.Sigma=592;e.Tau=611;e.Upsilon=690;e.sigma1=439;e.Omega=768;e.Xi=645;e.Psi=795;e.Zeta=611;e.bracketleft=333;e.therefore=863;e.bracketright=333;e.perpendicular=658;e.underscore=500;e.radicalex=500;e.alpha=631;e.beta=549;e.chi=549;e.delta=494;e.epsilon=439;e.phi=521;e.gamma=411;e.eta=603;e.iota=329;e.phi1=603;e.kappa=549;e.lambda=549;e.mu=576;e.nu=521;e.omicron=549;e.pi=549;e.theta=521;e.rho=549;e.sigma=603;e.tau=439;e.upsilon=576;e.omega1=713;e.omega=686;e.xi=493;e.psi=686;e.zeta=494;e.braceleft=480;e.bar=200;e.braceright=480;e.similar=549;e.Euro=750;e.Upsilon1=620;e.minute=247;e.lessequal=549;e.fraction=167;e.infinity=713;e.florin=500;e.club=753;e.diamond=753;e.heart=753;e.spade=753;e.arrowboth=1042;e.arrowleft=987;e.arrowup=603;e.arrowright=987;e.arrowdown=603;e.degree=400;e.plusminus=549;e.second=411;e.greaterequal=549;e.multiply=549;e.proportional=713;e.partialdiff=494;e.bullet=460;e.divide=549;e.notequal=549;e.equivalence=549;e.approxequal=549;e.ellipsis=1e3;e.arrowvertex=603;e.arrowhorizex=1e3;e.carriagereturn=658;e.aleph=823;e.Ifraktur=686;e.Rfraktur=795;e.weierstrass=987;e.circlemultiply=768;e.circleplus=768;e.emptyset=823;e.intersection=768;e.union=768;e.propersuperset=713;e.reflexsuperset=713;e.notsubset=713;e.propersubset=713;e.reflexsubset=713;e.element=713;e.notelement=713;e.angle=768;e.gradient=713;e.registerserif=790;e.copyrightserif=790;e.trademarkserif=890;e.product=823;e.radical=549;e.dotmath=250;e.logicalnot=713;e.logicaland=603;e.logicalor=603;e.arrowdblboth=1042;e.arrowdblleft=987;e.arrowdblup=603;e.arrowdblright=987;e.arrowdbldown=603;e.lozenge=494;e.angleleft=329;e.registersans=790;e.copyrightsans=790;e.trademarksans=786;e.summation=713;e.parenlefttp=384;e.parenleftex=384;e.parenleftbt=384;e.bracketlefttp=384;e.bracketleftex=384;e.bracketleftbt=384;e.bracelefttp=494;e.braceleftmid=494;e.braceleftbt=494;e.braceex=494;e.angleright=329;e.integral=274;e.integraltp=686;e.integralex=686;e.integralbt=686;e.parenrighttp=384;e.parenrightex=384;e.parenrightbt=384;e.bracketrighttp=384;e.bracketrightex=384;e.bracketrightbt=384;e.bracerighttp=494;e.bracerightmid=494;e.bracerightbt=494;e.apple=790});e["Times-Roman"]=(0,a.getLookupTableFactory)(function(e){e.space=250;e.exclam=333;e.quotedbl=408;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=564;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=564;e.equal=564;e.greater=564;e.question=444;e.at=921;e.A=722;e.B=667;e.C=667;e.D=722;e.E=611;e.F=556;e.G=722;e.H=722;e.I=333;e.J=389;e.K=722;e.L=611;e.M=889;e.N=722;e.O=722;e.P=556;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=722;e.W=944;e.X=722;e.Y=722;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=469;e.underscore=500;e.quoteleft=333;e.a=444;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=500;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=500;e.o=500;e.p=500;e.q=500;e.r=333;e.s=389;e.t=278;e.u=500;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=480;e.bar=200;e.braceright=480;e.asciitilde=541;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=180;e.quotedblleft=444;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=453;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=444;e.quotedblright=444;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=444;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=889;e.ordfeminine=276;e.Lslash=611;e.Oslash=722;e.OE=889;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=444;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=722;e.divide=564;e.Yacute=722;e.Acircumflex=722;e.aacute=444;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=444;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=444;e.Ncommaaccent=722;e.lacute=278;e.agrave=444;e.Tcommaaccent=611;e.Cacute=667;e.atilde=444;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=444;e.Amacron=722;e.rcaron=333;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=556;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=588;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=722;e.Abreve=722;e.multiply=564;e.uacute=500;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=444;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=722;e.Iacute=333;e.plusminus=564;e.brokenbar=200;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=333;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=326;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=444;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=344;e.Kcommaaccent=722;e.Lacute=611;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=722;e.zdotaccent=444;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=500;e.minus=564;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=564;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500});e["Times-Bold"]=(0,a.getLookupTableFactory)(function(e){e.space=250;e.exclam=333;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=1e3;e.ampersand=833;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=930;e.A=722;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=778;e.I=389;e.J=500;e.K=778;e.L=667;e.M=944;e.N=722;e.O=778;e.P=611;e.Q=778;e.R=722;e.S=556;e.T=667;e.U=722;e.V=722;e.W=1e3;e.X=722;e.Y=722;e.Z=667;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=581;e.underscore=500;e.quoteleft=333;e.a=500;e.b=556;e.c=444;e.d=556;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=333;e.k=556;e.l=278;e.m=833;e.n=556;e.o=500;e.p=556;e.q=556;e.r=444;e.s=389;e.t=333;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=394;e.bar=220;e.braceright=394;e.asciitilde=520;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=540;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=300;e.Lslash=667;e.Oslash=778;e.OE=1e3;e.ordmasculine=330;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=556;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=722;e.divide=570;e.Yacute=722;e.Acircumflex=722;e.aacute=500;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=667;e.Cacute=722;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=500;e.Amacron=722;e.rcaron=444;e.ccedilla=444;e.Zdotaccent=667;e.Thorn=611;e.Omacron=778;e.Racute=722;e.Sacute=556;e.dcaron=672;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=570;e.uacute=556;e.Tcaron=667;e.partialdiff=494;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=778;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=444;e.omacron=500;e.Zacute=667;e.Zcaron=667;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=416;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=778;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=300;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=556;e.threequarters=750;e.Scedilla=556;e.lcaron=394;e.Kcommaaccent=778;e.Lacute=667;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=667;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=778;e.degree=400;e.ograve=500;e.Ccaron=722;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=444;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=722;e.Lcommaaccent=667;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=444;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=556;e.minus=570;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=333;e.logicalnot=570;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500});e["Times-BoldItalic"]=(0,a.getLookupTableFactory)(function(e){e.space=250;e.exclam=389;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=832;e.A=667;e.B=667;e.C=667;e.D=722;e.E=667;e.F=667;e.G=722;e.H=778;e.I=389;e.J=500;e.K=667;e.L=611;e.M=889;e.N=722;e.O=722;e.P=611;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=667;e.W=889;e.X=667;e.Y=611;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=570;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=556;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=556;e.v=444;e.w=667;e.x=500;e.y=444;e.z=389;e.braceleft=348;e.bar=220;e.braceright=348;e.asciitilde=570;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=500;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=944;e.ordfeminine=266;e.Lslash=611;e.Oslash=722;e.OE=944;e.ordmasculine=300;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=611;e.divide=570;e.Yacute=611;e.Acircumflex=667;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=611;e.Cacute=667;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=556;e.acircumflex=500;e.Amacron=667;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=611;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=608;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=722;e.Agrave=667;e.Abreve=667;e.multiply=570;e.uacute=556;e.Tcaron=611;e.partialdiff=494;e.ydieresis=444;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=722;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=366;e.eogonek=444;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=576;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=382;e.Kcommaaccent=667;e.Lacute=611;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=722;e.zdotaccent=389;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=500;e.minus=606;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=606;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500});e["Times-Italic"]=(0,a.getLookupTableFactory)(function(e){e.space=250;e.exclam=333;e.quotedbl=420;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=675;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=675;e.equal=675;e.greater=675;e.question=500;e.at=920;e.A=611;e.B=611;e.C=667;e.D=722;e.E=611;e.F=611;e.G=722;e.H=722;e.I=333;e.J=444;e.K=667;e.L=556;e.M=833;e.N=667;e.O=722;e.P=611;e.Q=722;e.R=611;e.S=500;e.T=556;e.U=722;e.V=611;e.W=833;e.X=611;e.Y=556;e.Z=556;e.bracketleft=389;e.backslash=278;e.bracketright=389;e.asciicircum=422;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=278;e.g=500;e.h=500;e.i=278;e.j=278;e.k=444;e.l=278;e.m=722;e.n=500;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=500;e.v=444;e.w=667;e.x=444;e.y=444;e.z=389;e.braceleft=400;e.bar=275;e.braceright=400;e.asciitilde=541;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=214;e.quotedblleft=556;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=523;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=556;e.quotedblright=556;e.guillemotright=500;e.ellipsis=889;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=889;e.AE=889;e.ordfeminine=276;e.Lslash=556;e.Oslash=722;e.OE=944;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=667;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=500;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=556;e.divide=675;e.Yacute=556;e.Acircumflex=611;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=500;e.Ncommaaccent=667;e.lacute=278;e.agrave=500;e.Tcommaaccent=556;e.Cacute=667;e.atilde=500;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=611;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=500;e.Amacron=611;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=556;e.Thorn=611;e.Omacron=722;e.Racute=611;e.Sacute=500;e.dcaron=544;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=611;e.Abreve=611;e.multiply=675;e.uacute=500;e.Tcaron=556;e.partialdiff=476;e.ydieresis=444;e.Nacute=667;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=667;e.Iacute=333;e.plusminus=675;e.brokenbar=275;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=389;e.omacron=500;e.Zacute=556;e.Zcaron=556;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=300;e.eogonek=444;e.Uogonek=722;e.Aacute=611;e.Adieresis=611;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=500;e.lcaron=300;e.Kcommaaccent=667;e.Lacute=556;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=500;e.Scommaaccent=500;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=667;e.otilde=500;e.Rcommaaccent=611;e.Lcommaaccent=556;e.Atilde=611;e.Aogonek=611;e.Aring=611;e.Otilde=722;e.zdotaccent=389;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=444;e.minus=675;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=675;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500});e.ZapfDingbats=(0,a.getLookupTableFactory)(function(e){e.space=278;e.a1=974;e.a2=961;e.a202=974;e.a3=980;e.a4=719;e.a5=789;e.a119=790;e.a118=791;e.a117=690;e.a11=960;e.a12=939;e.a13=549;e.a14=855;e.a15=911;e.a16=933;e.a105=911;e.a17=945;e.a18=974;e.a19=755;e.a20=846;e.a21=762;e.a22=761;e.a23=571;e.a24=677;e.a25=763;e.a26=760;e.a27=759;e.a28=754;e.a6=494;e.a7=552;e.a8=537;e.a9=577;e.a10=692;e.a29=786;e.a30=788;e.a31=788;e.a32=790;e.a33=793;e.a34=794;e.a35=816;e.a36=823;e.a37=789;e.a38=841;e.a39=823;e.a40=833;e.a41=816;e.a42=831;e.a43=923;e.a44=744;e.a45=723;e.a46=749;e.a47=790;e.a48=792;e.a49=695;e.a50=776;e.a51=768;e.a52=792;e.a53=759;e.a54=707;e.a55=708;e.a56=682;e.a57=701;e.a58=826;e.a59=815;e.a60=789;e.a61=789;e.a62=707;e.a63=687;e.a64=696;e.a65=689;e.a66=786;e.a67=787;e.a68=713;e.a69=791;e.a70=785;e.a71=791;e.a72=873;e.a73=761;e.a74=762;e.a203=762;e.a75=759;e.a204=759;e.a76=892;e.a77=892;e.a78=788;e.a79=784;e.a81=438;e.a82=138;e.a83=277;e.a84=415;e.a97=392;e.a98=392;e.a99=668;e.a100=668;e.a89=390;e.a90=390;e.a93=317;e.a94=317;e.a91=276;e.a92=276;e.a205=509;e.a85=509;e.a206=410;e.a86=410;e.a87=234;e.a88=234;e.a95=334;e.a96=334;e.a101=732;e.a102=544;e.a103=544;e.a104=910;e.a106=667;e.a107=760;e.a108=760;e.a112=776;e.a111=595;e.a110=694;e.a109=626;e.a120=788;e.a121=788;e.a122=788;e.a123=788;e.a124=788;e.a125=788;e.a126=788;e.a127=788;e.a128=788;e.a129=788;e.a130=788;e.a131=788;e.a132=788;e.a133=788;e.a134=788;e.a135=788;e.a136=788;e.a137=788;e.a138=788;e.a139=788;e.a140=788;e.a141=788;e.a142=788;e.a143=788;e.a144=788;e.a145=788;e.a146=788;e.a147=788;e.a148=788;e.a149=788;e.a150=788;e.a151=788;e.a152=788;e.a153=788;e.a154=788;e.a155=788;e.a156=788;e.a157=788;e.a158=788;e.a159=788;e.a160=894;e.a161=838;e.a163=1016;e.a164=458;e.a196=748;e.a165=924;e.a192=748;e.a166=918;e.a167=927;e.a168=928;e.a169=928;e.a170=834;e.a171=873;e.a172=828;e.a173=924;e.a162=924;e.a174=917;e.a175=930;e.a176=931;e.a177=463;e.a178=883;e.a179=836;e.a193=836;e.a180=867;e.a199=867;e.a181=696;e.a200=696;e.a182=874;e.a201=874;e.a183=760;e.a184=946;e.a197=771;e.a185=865;e.a194=771;e.a198=888;e.a186=967;e.a195=888;e.a187=831;e.a188=873;e.a189=927;e.a190=970;e.a191=918})});t.getMetrics=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptCompiler=t.PostScriptEvaluator=t.PDFFunctionFactory=t.isPDFFunction=void 0;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1;a.configurable=!0;"value"in a&&(a.writable=!0);Object.defineProperty(e,a.key,a)}}return function(t,r,a){r&&e(t.prototype,r);a&&e(t,a);return t}}(),n=r(2),o=r(138),s=r(169);var c={get value(){return(0,n.shadow)(this,"value",(0,n.isEvalSupported)())}},l=function(){function e(t){var r=t.xref,a=t.isEvalSupported,i=void 0===a||a;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);this.xref=r;this.isEvalSupported=!1!==i}i(e,[{key:"create",value:function(e){return h.parse({xref:this.xref,isEvalSupported:this.isEvalSupported,fn:e})}},{key:"createFromArray",value:function(e){return h.parseArray({xref:this.xref,isEvalSupported:this.isEvalSupported,fnObj:e})}}]);return e}();function u(e){if(!Array.isArray(e))return null;for(var t=e.length,r=0;r<t;r++)if("number"!=typeof e[r]){for(var a=new Array(t),i=0;i<t;i++)a[i]=+e[i];return a}return e}var h={getSampleArray:function(e,t,r,a){var i,n,o=1;for(i=0,n=e.length;i<n;i++)o*=e[i];o*=t;var s=new Array(o),c=0,l=0,u=1/(Math.pow(2,r)-1),h=a.getBytes((o*r+7)/8),f=0;for(i=0;i<o;i++){for(;c<r;){l<<=8;l|=h[f++];c+=8}c-=r;s[i]=(l>>c)*u;l&=(1<<c)-1}return s},getIR:function(e){var t=e.xref,r=e.isEvalSupported,a=e.fn,i=a.dict;i||(i=a);var o=[this.constructSampled,null,this.constructInterpolated,this.constructStiched,this.constructPostScript][i.get("FunctionType")];if(!o)throw new n.FormatError("Unknown type of function");return o.call(this,{xref:t,isEvalSupported:r,fn:a,dict:i})},fromIR:function(e){var t=e.xref,r=e.isEvalSupported,a=e.IR;switch(a[0]){case 0:return this.constructSampledFromIR({xref:t,isEvalSupported:r,IR:a});case 2:return this.constructInterpolatedFromIR({xref:t,isEvalSupported:r,IR:a});case 3:return this.constructStichedFromIR({xref:t,isEvalSupported:r,IR:a});default:return this.constructPostScriptFromIR({xref:t,isEvalSupported:r,IR:a})}},parse:function(e){var t=e.xref,r=e.isEvalSupported,a=e.fn,i=this.getIR({xref:t,isEvalSupported:r,fn:a});return this.fromIR({xref:t,isEvalSupported:r,IR:i})},parseArray:function(e){var t=e.xref,r=e.isEvalSupported,a=e.fnObj;if(!Array.isArray(a))return this.parse({xref:t,isEvalSupported:r,fn:a});for(var i=[],n=0,o=a.length;n<o;n++)i.push(this.parse({xref:t,isEvalSupported:r,fn:t.fetchIfRef(a[n])}));return function(e,t,r,a){for(var n=0,o=i.length;n<o;n++)i[n](e,t,r,a+n)}},constructSampled:function(e){e.xref,e.isEvalSupported;var t=e.fn,r=e.dict;function a(e){for(var t=e.length,r=[],a=0,i=0;i<t;i+=2){r[a]=[e[i],e[i+1]];++a}return r}var i=u(r.getArray("Domain")),o=u(r.getArray("Range"));if(!i||!o)throw new n.FormatError("No domain or range");var s=i.length/2,c=o.length/2;i=a(i);o=a(o);var l=u(r.getArray("Size")),h=r.get("BitsPerSample"),f=r.get("Order")||1;1!==f&&(0,n.info)("No support for cubic spline interpolation: "+f);var d=u(r.getArray("Encode"));if(d)d=a(d);else{d=[];for(var g=0;g<s;++g)d.push([0,l[g]-1])}var m=u(r.getArray("Decode"));return[0,s,i,d,m=m?a(m):o,this.getSampleArray(l,c,h,t),l,c,Math.pow(2,h)-1,o]},constructSampledFromIR:function(e){e.xref,e.isEvalSupported;var t=e.IR;function r(e,t,r,a,i){return a+(i-a)/(r-t)*(e-t)}return function(e,a,i,n){var o,s,c=t[1],l=t[2],u=t[3],h=t[4],f=t[5],d=t[6],g=t[7],m=t[9],p=1<<c,v=new Float64Array(p),b=new Uint32Array(p);for(s=0;s<p;s++)v[s]=1;var y=g,w=1;for(o=0;o<c;++o){var k=l[o][0],S=l[o][1],C=r(Math.min(Math.max(e[a+o],k),S),k,S,u[o][0],u[o][1]),x=d[o],_=(C=Math.min(Math.max(C,0),x-1))<x-1?Math.floor(C):C-1,A=_+1-C,P=C-_,I=_*y,O=I+y;for(s=0;s<p;s++)if(s&w){v[s]*=P;b[s]+=O}else{v[s]*=A;b[s]+=I}y*=x;w<<=1}for(s=0;s<g;++s){var T=0;for(o=0;o<p;o++)T+=f[b[o]+s]*v[o];T=r(T,0,1,h[s][0],h[s][1]);i[n+s]=Math.min(Math.max(T,m[s][0]),m[s][1])}}},constructInterpolated:function(e){e.xref,e.isEvalSupported,e.fn;for(var t=e.dict,r=u(t.getArray("C0"))||[0],a=u(t.getArray("C1"))||[1],i=t.get("N"),n=r.length,o=[],s=0;s<n;++s)o.push(a[s]-r[s]);return[2,r,o,i]},constructInterpolatedFromIR:function(e){e.xref,e.isEvalSupported;var t=e.IR,r=t[1],a=t[2],i=t[3],n=a.length;return function(e,t,o,s){for(var c=1===i?e[t]:Math.pow(e[t],i),l=0;l<n;++l)o[s+l]=r[l]+c*a[l]}},constructStiched:function(e){var t=e.xref,r=e.isEvalSupported,a=(e.fn,e.dict),i=u(a.getArray("Domain"));if(!i)throw new n.FormatError("No domain");if(1!=i.length/2)throw new n.FormatError("Bad domain for stiched function");for(var o=a.get("Functions"),s=[],c=0,l=o.length;c<l;++c)s.push(this.parse({xref:t,isEvalSupported:r,fn:t.fetchIfRef(o[c])}));return[3,i,u(a.getArray("Bounds")),u(a.getArray("Encode")),s]},constructStichedFromIR:function(e){e.xref,e.isEvalSupported;var t=e.IR,r=t[1],a=t[2],i=t[3],n=t[4],o=new Float32Array(1);return function(e,t,s,c){for(var l=function(e,t,r){e>r?e=r:e<t&&(e=t);return e}(e[t],r[0],r[1]),u=0,h=a.length;u<h&&!(l<a[u]);++u);var f=r[0];u>0&&(f=a[u-1]);var d=r[1];u<a.length&&(d=a[u]);var g=i[2*u],m=i[2*u+1];o[0]=f===d?g:g+(l-f)*(m-g)/(d-f);n[u](o,0,s,c)}},constructPostScript:function(e){e.xref,e.isEvalSupported;var t=e.fn,r=e.dict,a=u(r.getArray("Domain")),i=u(r.getArray("Range"));if(!a)throw new n.FormatError("No domain.");if(!i)throw new n.FormatError("No range.");var o=new s.PostScriptLexer(t);return[4,a,i,new s.PostScriptParser(o).parse()]},constructPostScriptFromIR:function(e){e.xref;var t=e.isEvalSupported,r=e.IR,a=r[1],i=r[2],o=r[3];if(t&&c.value){var s=(new g).compile(o,a,i);if(s)return new Function("src","srcOffset","dest","destOffset",s)}(0,n.info)("Unable to compile PS function");var l=i.length>>1,u=a.length>>1,h=new d(o),f=Object.create(null),m=8192,p=new Float32Array(u);return function(e,t,r,a){var n,o,s="",c=p;for(n=0;n<u;n++){o=e[t+n];c[n]=o;s+=o+"_"}var d=f[s];if(void 0===d){var g=new Float32Array(l),v=h.execute(c),b=v.length-l;for(n=0;n<l;n++){o=v[b+n];var y=i[2*n];o<y?o=y:o>(y=i[2*n+1])&&(o=y);g[n]=o}if(m>0){m--;f[s]=g}r.set(g,a)}else r.set(d,a)}}};var f=function(){function e(e){this.stack=e?Array.prototype.slice.call(e,0):[]}e.prototype={push:function(e){if(this.stack.length>=100)throw new Error("PostScript function stack overflow.");this.stack.push(e)},pop:function(){if(this.stack.length<=0)throw new Error("PostScript function stack underflow.");return this.stack.pop()},copy:function(e){if(this.stack.length+e>=100)throw new Error("PostScript function stack overflow.");for(var t=this.stack,r=t.length-e,a=e-1;a>=0;a--,r++)t.push(t[r])},index:function(e){this.push(this.stack[this.stack.length-e-1])},roll:function(e,t){var r,a,i,n=this.stack,o=n.length-e,s=n.length-1,c=o+(t-Math.floor(t/e)*e);for(r=o,a=s;r<a;r++,a--){i=n[r];n[r]=n[a];n[a]=i}for(r=o,a=c-1;r<a;r++,a--){i=n[r];n[r]=n[a];n[a]=i}for(r=c,a=s;r<a;r++,a--){i=n[r];n[r]=n[a];n[a]=i}}};return e}(),d=function(){function e(e){this.operators=e}e.prototype={execute:function(e){for(var t,r,a,i=new f(e),o=0,s=this.operators,c=s.length;o<c;)if("number"!=typeof(t=s[o++]))switch(t){case"jz":a=i.pop();(r=i.pop())||(o=a);break;case"j":o=r=i.pop();break;case"abs":r=i.pop();i.push(Math.abs(r));break;case"add":a=i.pop();r=i.pop();i.push(r+a);break;case"and":a=i.pop();r=i.pop();(0,n.isBool)(r)&&(0,n.isBool)(a)?i.push(r&&a):i.push(r&a);break;case"atan":r=i.pop();i.push(Math.atan(r));break;case"bitshift":a=i.pop();(r=i.pop())>0?i.push(r<<a):i.push(r>>a);break;case"ceiling":r=i.pop();i.push(Math.ceil(r));break;case"copy":r=i.pop();i.copy(r);break;case"cos":r=i.pop();i.push(Math.cos(r));break;case"cvi":r=0|i.pop();i.push(r);break;case"cvr":break;case"div":a=i.pop();r=i.pop();i.push(r/a);break;case"dup":i.copy(1);break;case"eq":a=i.pop();r=i.pop();i.push(r===a);break;case"exch":i.roll(2,1);break;case"exp":a=i.pop();r=i.pop();i.push(Math.pow(r,a));break;case"false":i.push(!1);break;case"floor":r=i.pop();i.push(Math.floor(r));break;case"ge":a=i.pop();r=i.pop();i.push(r>=a);break;case"gt":a=i.pop();r=i.pop();i.push(r>a);break;case"idiv":a=i.pop();r=i.pop();i.push(r/a|0);break;case"index":r=i.pop();i.index(r);break;case"le":a=i.pop();r=i.pop();i.push(r<=a);break;case"ln":r=i.pop();i.push(Math.log(r));break;case"log":r=i.pop();i.push(Math.log(r)/Math.LN10);break;case"lt":a=i.pop();r=i.pop();i.push(r<a);break;case"mod":a=i.pop();r=i.pop();i.push(r%a);break;case"mul":a=i.pop();r=i.pop();i.push(r*a);break;case"ne":a=i.pop();r=i.pop();i.push(r!==a);break;case"neg":r=i.pop();i.push(-r);break;case"not":r=i.pop();(0,n.isBool)(r)?i.push(!r):i.push(~r);break;case"or":a=i.pop();r=i.pop();(0,n.isBool)(r)&&(0,n.isBool)(a)?i.push(r||a):i.push(r|a);break;case"pop":i.pop();break;case"roll":a=i.pop();r=i.pop();i.roll(r,a);break;case"round":r=i.pop();i.push(Math.round(r));break;case"sin":r=i.pop();i.push(Math.sin(r));break;case"sqrt":r=i.pop();i.push(Math.sqrt(r));break;case"sub":a=i.pop();r=i.pop();i.push(r-a);break;case"true":i.push(!0);break;case"truncate":r=(r=i.pop())<0?Math.ceil(r):Math.floor(r);i.push(r);break;case"xor":a=i.pop();r=i.pop();(0,n.isBool)(r)&&(0,n.isBool)(a)?i.push(r!==a):i.push(r^a);break;default:throw new n.FormatError("Unknown operator "+t)}else i.push(t);return i.stack}};return e}(),g=function(){function e(e){this.type=e}e.prototype.visit=function(e){(0,n.unreachable)("abstract method")};function t(t,r,a){e.call(this,"args");this.index=t;this.min=r;this.max=a}t.prototype=Object.create(e.prototype);t.prototype.visit=function(e){e.visitArgument(this)};function r(t){e.call(this,"literal");this.number=t;this.min=t;this.max=t}r.prototype=Object.create(e.prototype);r.prototype.visit=function(e){e.visitLiteral(this)};function a(t,r,a,i,n){e.call(this,"binary");this.op=t;this.arg1=r;this.arg2=a;this.min=i;this.max=n}a.prototype=Object.create(e.prototype);a.prototype.visit=function(e){e.visitBinaryOperation(this)};function i(t,r){e.call(this,"max");this.arg=t;this.min=t.min;this.max=r}i.prototype=Object.create(e.prototype);i.prototype.visit=function(e){e.visitMin(this)};function o(t,r,a){e.call(this,"var");this.index=t;this.min=r;this.max=a}o.prototype=Object.create(e.prototype);o.prototype.visit=function(e){e.visitVariable(this)};function s(t,r){e.call(this,"definition");this.variable=t;this.arg=r}s.prototype=Object.create(e.prototype);s.prototype.visit=function(e){e.visitVariableDefinition(this)};function c(){this.parts=[]}c.prototype={visitArgument:function(e){this.parts.push("Math.max(",e.min,", Math.min(",e.max,", src[srcOffset + ",e.index,"]))")},visitVariable:function(e){this.parts.push("v",e.index)},visitLiteral:function(e){this.parts.push(e.number)},visitBinaryOperation:function(e){this.parts.push("(");e.arg1.visit(this);this.parts.push(" ",e.op," ");e.arg2.visit(this);this.parts.push(")")},visitVariableDefinition:function(e){this.parts.push("var ");e.variable.visit(this);this.parts.push(" = ");e.arg.visit(this);this.parts.push(";")},visitMin:function(e){this.parts.push("Math.min(");e.arg.visit(this);this.parts.push(", ",e.max,")")},toString:function(){return this.parts.join("")}};function l(e,t){return"literal"===t.type&&0===t.number?e:"literal"===e.type&&0===e.number?t:"literal"===t.type&&"literal"===e.type?new r(e.number+t.number):new a("+",e,t,e.min+t.min,e.max+t.max)}function u(e,t){if("literal"===t.type){if(0===t.number)return new r(0);if(1===t.number)return e;if("literal"===e.type)return new r(e.number*t.number)}if("literal"===e.type){if(0===e.number)return new r(0);if(1===e.number)return t}return new a("*",e,t,Math.min(e.min*t.min,e.min*t.max,e.max*t.min,e.max*t.max),Math.max(e.min*t.min,e.min*t.max,e.max*t.min,e.max*t.max))}function h(e,t){if("literal"===t.type){if(0===t.number)return e;if("literal"===e.type)return new r(e.number-t.number)}return"binary"===t.type&&"-"===t.op&&"literal"===e.type&&1===e.number&&"literal"===t.arg1.type&&1===t.arg1.number?t.arg2:new a("-",e,t,e.min-t.max,e.max-t.min)}function f(e,t){return e.min>=t?new r(t):e.max<=t?e:new i(e,t)}function d(){}d.prototype={compile:function(e,a,i){var n,d,g,m,p,v,b,y,w,k,S=[],C=[],x=a.length>>1,_=i.length>>1,A=0;for(n=0;n<x;n++)S.push(new t(n,a[2*n],a[2*n+1]));for(n=0,d=e.length;n<d;n++)if("number"!=typeof(k=e[n]))switch(k){case"add":if(S.length<2)return null;v=S.pop();p=S.pop();S.push(l(p,v));break;case"cvr":if(S.length<1)return null;break;case"mul":if(S.length<2)return null;v=S.pop();p=S.pop();S.push(u(p,v));break;case"sub":if(S.length<2)return null;v=S.pop();p=S.pop();S.push(h(p,v));break;case"exch":if(S.length<2)return null;b=S.pop();y=S.pop();S.push(b,y);break;case"pop":if(S.length<1)return null;S.pop();break;case"index":if(S.length<1)return null;if("literal"!==(p=S.pop()).type)return null;if((g=p.number)<0||!Number.isInteger(g)||S.length<g)return null;if("literal"===(b=S[S.length-g-1]).type||"var"===b.type){S.push(b);break}w=new o(A++,b.min,b.max);S[S.length-g-1]=w;S.push(w);C.push(new s(w,b));break;case"dup":if(S.length<1)return null;if("number"==typeof e[n+1]&&"gt"===e[n+2]&&e[n+3]===n+7&&"jz"===e[n+4]&&"pop"===e[n+5]&&e[n+6]===e[n+1]){p=S.pop();S.push(f(p,e[n+1]));n+=6;break}if("literal"===(b=S[S.length-1]).type||"var"===b.type){S.push(b);break}w=new o(A++,b.min,b.max);S[S.length-1]=w;S.push(w);C.push(new s(w,b));break;case"roll":if(S.length<2)return null;v=S.pop();p=S.pop();if("literal"!==v.type||"literal"!==p.type)return null;m=v.number;if((g=p.number)<=0||!Number.isInteger(g)||!Number.isInteger(m)||S.length<g)return null;if(0===(m=(m%g+g)%g))break;Array.prototype.push.apply(S,S.splice(S.length-g,g-m));break;default:return null}else S.push(new r(k));if(S.length!==_)return null;var P=[];C.forEach(function(e){var t=new c;e.visit(t);P.push(t.toString())});S.forEach(function(e,t){var r=new c;e.visit(r);var a=i[2*t],n=i[2*t+1],o=[r.toString()];if(a>e.min){o.unshift("Math.max(",a,", ");o.push(")")}if(n<e.max){o.unshift("Math.min(",n,", ");o.push(")")}o.unshift("dest[destOffset + ",t,"] = ");o.push(";");P.push(o.join(""))});return P.join("\n")}};return d}();t.isPDFFunction=function(e){var t;if("object"!==(void 0===e?"undefined":a(e)))return!1;if((0,o.isDict)(e))t=e;else{if(!(0,o.isStream)(e))return!1;t=e.dict}return t.has("FunctionType")};t.PDFFunctionFactory=l;t.PostScriptEvaluator=d;t.PostScriptCompiler=g},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptParser=t.PostScriptLexer=void 0;var a=r(2),i=r(138),n=function(){function e(e){this.lexer=e;this.operators=[];this.token=null;this.prev=null}e.prototype={nextToken:function(){this.prev=this.token;this.token=this.lexer.getToken()},accept:function(e){if(this.token.type===e){this.nextToken();return!0}return!1},expect:function(e){if(this.accept(e))return!0;throw new a.FormatError("Unexpected symbol: found "+this.token.type+" expected "+e+".")},parse:function(){this.nextToken();this.expect(o.LBRACE);this.parseBlock();this.expect(o.RBRACE);return this.operators},parseBlock:function(){for(;;)if(this.accept(o.NUMBER))this.operators.push(this.prev.value);else if(this.accept(o.OPERATOR))this.operators.push(this.prev.value);else{if(!this.accept(o.LBRACE))return;this.parseCondition()}},parseCondition:function(){var e=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(o.RBRACE);if(this.accept(o.IF)){this.operators[e]=this.operators.length;this.operators[e+1]="jz"}else{if(!this.accept(o.LBRACE))throw new a.FormatError("PS Function: error parsing conditional.");var t=this.operators.length;this.operators.push(null,null);var r=this.operators.length;this.parseBlock();this.expect(o.RBRACE);this.expect(o.IFELSE);this.operators[t]=this.operators.length;this.operators[t+1]="j";this.operators[e]=r;this.operators[e+1]="jz"}}};return e}(),o={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5},s=function(){function e(e,t){this.type=e;this.value=t}var t=Object.create(null);e.getOperator=function(r){var a=t[r];return a||(t[r]=new e(o.OPERATOR,r))};e.LBRACE=new e(o.LBRACE,"{");e.RBRACE=new e(o.RBRACE,"}");e.IF=new e(o.IF,"IF");e.IFELSE=new e(o.IFELSE,"IFELSE");return e}(),c=function(){function e(e){this.stream=e;this.nextChar();this.strBuf=[]}e.prototype={nextChar:function(){return this.currentChar=this.stream.getByte()},getToken:function(){for(var e=!1,t=this.currentChar;;){if(t<0)return i.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,a.isSpace)(t))break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new s(o.NUMBER,this.getNumber());case 123:this.nextChar();return s.LBRACE;case 125:this.nextChar();return s.RBRACE}var r=this.strBuf;r.length=0;r[0]=String.fromCharCode(t);for(;(t=this.nextChar())>=0&&(t>=65&&t<=90||t>=97&&t<=122);)r.push(String.fromCharCode(t));var n=r.join("");switch(n.toLowerCase()){case"if":return s.IF;case"ifelse":return s.IFELSE;default:return s.getOperator(n)}},getNumber:function(){var e=this.currentChar,t=this.strBuf;t.length=0;t[0]=String.fromCharCode(e);for(;(e=this.nextChar())>=0&&(e>=48&&e<=57||45===e||46===e);)t.push(String.fromCharCode(e));var r=parseFloat(t.join(""));if(isNaN(r))throw new a.FormatError("Invalid floating point number: "+r);return r}};return e}();t.PostScriptLexer=c;t.PostScriptParser=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.MurmurHash3_64=void 0;var a=r(2),i=function(e){function t(e){this.h1=e?4294967295&e:3285377520;this.h2=e?4294967295&e:3285377520}t.prototype={update:function(e){var t=void 0,r=void 0;if((0,a.isString)(e)){t=new Uint8Array(2*e.length);r=0;for(var i=0,n=e.length;i<n;i++){var o=e.charCodeAt(i);if(o<=255)t[r++]=o;else{t[r++]=o>>>8;t[r++]=255&o}}}else{if(!(0,a.isArrayBuffer)(e))throw new Error("Wrong data format in MurmurHash3_64_update. Input must be a string or array.");r=(t=e).byteLength}for(var s=r>>2,c=r-4*s,l=new Uint32Array(t.buffer,0,s),u=0,h=0,f=this.h1,d=this.h2,g=3432918353,m=461845907,p=0;p<s;p++)1&p?f=5*(f=(f^=u=(u=(u=(u=l[p])*g&4294901760|11601*u&65535)<<15|u>>>17)*m&4294901760|13715*u&65535)<<13|f>>>19)+3864292196:d=5*(d=(d^=h=(h=(h=(h=l[p])*g&4294901760|11601*h&65535)<<15|h>>>17)*m&4294901760|13715*h&65535)<<13|d>>>19)+3864292196;u=0;switch(c){case 3:u^=t[4*s+2]<<16;case 2:u^=t[4*s+1]<<8;case 1:u=(u=(u=(u^=t[4*s])*g&4294901760|11601*u&65535)<<15|u>>>17)*m&4294901760|13715*u&65535;1&s?f^=u:d^=u}this.h1=f;this.h2=d;return this},hexdigest:function(){var e=this.h1,t=this.h2;e=3981806797*(e^=t>>>1)&4294901760|36045*e&65535;e=444984403*(e^=(t=4283543511*t&4294901760|(2950163797*(t<<16|e>>>16)&4294901760)>>>16)>>>1)&4294901760|60499*e&65535;for(var r=0,a=[e^=(t=3301882366*t&4294901760|(3120437893*(t<<16|e>>>16)&4294901760)>>>16)>>>1,t],i="";r<a.length;r++){for(var n=(a[r]>>>0).toString(16);n.length<8;)n="0"+n;i+=n}return i}};return t}();t.MurmurHash3_64=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFImage=void 0;var a=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,i=!1,n=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){r.push(o.value);if(t&&r.length===t)break}}catch(e){i=!0;n=e}finally{try{!a&&s.return&&s.return()}finally{if(i)throw n}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(2),n=r(138),o=r(151),s=r(140),c=r(146),l=r(149),u=function(){function e(e,t){return t&&t.canDecode(e)?t.decode(e).catch(function(t){(0,i.warn)("Native image decoding failed -- trying to recover: "+(t&&t.message));return e}):Promise.resolve(e)}function t(e,t,r,a){return(e=t+e*r)<0?0:e>a?a:e}function r(e,t,r,a,i,n){var o,s,c,l,u=i*n,h=t<=8?new Uint8Array(u):t<=16?new Uint16Array(u):new Uint32Array(u),f=r/i,d=a/n,g=0,m=new Uint16Array(i),p=r;for(o=0;o<i;o++)m[o]=Math.floor(o*f);for(o=0;o<n;o++){c=Math.floor(o*d)*p;for(s=0;s<i;s++){l=c+m[s];h[g++]=e[l]}}return h}function u(e){var t=e.xref,r=e.res,a=e.image,s=e.isInline,c=void 0!==s&&s,h=e.smask,f=void 0===h?null:h,d=e.mask,g=void 0===d?null:d,m=e.isMask,p=void 0!==m&&m,v=e.pdfFunctionFactory;this.image=a;var b=a.dict,y=b.get("Filter");if((0,n.isName)(y))switch(y.name){case"JPXDecode":var w=new l.JpxImage;w.parseImageProperties(a.stream);a.stream.reset();a.width=w.width;a.height=w.height;a.bitsPerComponent=w.bitsPerComponent;a.numComps=w.componentsCount;break;case"JBIG2Decode":a.bitsPerComponent=1;a.numComps=1}var k=b.get("Width","W"),S=b.get("Height","H");if(Number.isInteger(a.width)&&a.width>0&&Number.isInteger(a.height)&&a.height>0&&(a.width!==k||a.height!==S)){(0,i.warn)("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");k=a.width;S=a.height}if(k<1||S<1)throw new i.FormatError("Invalid image width: "+k+" or height: "+S);this.width=k;this.height=S;this.interpolate=b.get("Interpolate","I")||!1;this.imageMask=b.get("ImageMask","IM")||!1;this.matte=b.get("Matte")||!1;var C=a.bitsPerComponent;if(!C&&!(C=b.get("BitsPerComponent","BPC"))){if(!this.imageMask)throw new i.FormatError("Bits per component missing in image: "+this.imageMask);C=1}this.bpc=C;if(!this.imageMask){var x=b.get("ColorSpace","CS");if(!x){(0,i.info)("JPX images (which do not require color spaces)");switch(a.numComps){case 1:x=n.Name.get("DeviceGray");break;case 3:x=n.Name.get("DeviceRGB");break;case 4:x=n.Name.get("DeviceCMYK");break;default:throw new Error("JPX images with "+a.numComps+" color components not supported.")}}var _=c?r:null;this.colorSpace=o.ColorSpace.parse(x,t,_,v);this.numComps=this.colorSpace.numComps}this.decode=b.getArray("Decode","D");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode)||p&&!o.ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;var A=(1<<C)-1;this.decodeCoefficients=[];this.decodeAddends=[];for(var P=0,I=0;P<this.decode.length;P+=2,++I){var O=this.decode[P],T=this.decode[P+1];this.decodeCoefficients[I]=T-O;this.decodeAddends[I]=A*O}}if(f)this.smask=new u({xref:t,res:r,image:f,isInline:c,pdfFunctionFactory:v});else if(g)if((0,n.isStream)(g)){g.dict.get("ImageMask","IM")?this.mask=new u({xref:t,res:r,image:g,isInline:c,isMask:!0,pdfFunctionFactory:v}):(0,i.warn)("Ignoring /Mask in image without /ImageMask.")}else this.mask=g}u.buildImage=function(t){t.handler;var r,o,s=t.xref,c=t.res,l=t.image,h=t.isInline,f=void 0!==h&&h,d=t.nativeDecoder,g=void 0===d?null:d,m=t.pdfFunctionFactory,p=e(l,g),v=l.dict.get("SMask"),b=l.dict.get("Mask");if(v){r=e(v,g);o=Promise.resolve(null)}else{r=Promise.resolve(null);if(b)if((0,n.isStream)(b))o=e(b,g);else if(Array.isArray(b))o=Promise.resolve(b);else{(0,i.warn)("Unsupported mask format.");o=Promise.resolve(null)}else o=Promise.resolve(null)}return Promise.all([p,r,o]).then(function(e){var t=a(e,3),r=t[0],i=t[1],n=t[2];return new u({xref:s,res:c,image:r,isInline:f,smask:i,mask:n,pdfFunctionFactory:m})})};u.createMask=function(e){var t,r,a=e.imgArray,i=e.width,n=e.height,o=e.imageIsFromDecodeStream,s=e.inverseDecode,c=(i+7>>3)*n,l=a.byteLength;if(!o||s&&!(c===l))if(s){(t=new Uint8ClampedArray(c)).set(a);for(r=l;r<c;r++)t[r]=255}else(t=new Uint8ClampedArray(l)).set(a);else t=a;if(s)for(r=0;r<l;r++)t[r]^=255;return{data:t,width:i,height:n}};u.prototype={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:function(e){var r,a,i=this.bpc,n=this.numComps,o=this.decodeAddends,s=this.decodeCoefficients,c=(1<<i)-1;if(1!==i){var l=0;for(r=0,a=this.width*this.height;r<a;r++)for(var u=0;u<n;u++){e[l]=t(e[l],o[u],s[u],c);l++}}else for(r=0,a=e.length;r<a;r++)e[r]=+!e[r]},getComponents:function(e){var t=this.bpc;if(8===t)return e;var r,a,i=this.width,n=this.height,o=this.numComps,s=i*n*o,c=0,l=t<=8?new Uint8Array(s):t<=16?new Uint16Array(s):new Uint32Array(s),u=i*o,h=(1<<t)-1,f=0;if(1===t)for(var d,g,m,p=0;p<n;p++){g=f+(-8&u);m=f+u;for(;f<g;){a=e[c++];l[f]=a>>7&1;l[f+1]=a>>6&1;l[f+2]=a>>5&1;l[f+3]=a>>4&1;l[f+4]=a>>3&1;l[f+5]=a>>2&1;l[f+6]=a>>1&1;l[f+7]=1&a;f+=8}if(f<m){a=e[c++];d=128;for(;f<m;){l[f++]=+!!(a&d);d>>=1}}}else{var v=0;a=0;for(f=0,r=s;f<r;++f){if(f%u==0){a=0;v=0}for(;v<t;){a=a<<8|e[c++];v+=8}var b=v-t,y=a>>b;l[f]=y<0?0:y>h?h:y;a&=(1<<b)-1;v=b}}return l},fillOpacity:function(e,t,a,n,o){var s,c,l,h,f,d,g=this.smask,m=this.mask;if(g){c=g.width;l=g.height;s=new Uint8ClampedArray(c*l);g.fillGrayBuffer(s);c===t&&l===a||(s=r(s,g.bpc,c,l,t,a))}else if(m)if(m instanceof u){c=m.width;l=m.height;s=new Uint8ClampedArray(c*l);m.numComps=1;m.fillGrayBuffer(s);for(h=0,f=c*l;h<f;++h)s[h]=255-s[h];c===t&&l===a||(s=r(s,m.bpc,c,l,t,a))}else{if(!Array.isArray(m))throw new i.FormatError("Unknown mask format.");s=new Uint8ClampedArray(t*a);var p=this.numComps;for(h=0,f=t*a;h<f;++h){var v=0,b=h*p;for(d=0;d<p;++d){var y=o[b+d],w=2*d;if(y<m[w]||y>m[w+1]){v=255;break}}s[h]=v}}if(s)for(h=0,d=3,f=t*n;h<f;++h,d+=4)e[d]=s[h];else for(h=0,d=3,f=t*n;h<f;++h,d+=4)e[d]=255},undoPreblend:function(e,t,r){var a=this.smask&&this.smask.matte;if(a)for(var i=this.colorSpace.getRgb(a,0),n=i[0],o=i[1],s=i[2],c=t*r*4,l=0;l<c;l+=4){var u=e[l+3];if(0!==u){var h=255/u;e[l]=(e[l]-n)*h+n;e[l+1]=(e[l+1]-o)*h+o;e[l+2]=(e[l+2]-s)*h+s}else{e[l]=255;e[l+1]=255;e[l+2]=255}}},createImageData:function(){var e,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],r=this.drawWidth,a=this.drawHeight,n={width:r,height:a,kind:0,data:null},o=this.numComps,l=this.width,u=this.height,h=this.bpc,f=l*o*h+7>>3;if(!t){var d;"DeviceGray"===this.colorSpace.name&&1===h?d=i.ImageKind.GRAYSCALE_1BPP:"DeviceRGB"!==this.colorSpace.name||8!==h||this.needsDecode||(d=i.ImageKind.RGB_24BPP);if(d&&!this.smask&&!this.mask&&r===l&&a===u){n.kind=d;e=this.getImageBytes(u*f);if(this.image instanceof s.DecodeStream)n.data=e;else{var g=new Uint8ClampedArray(e.length);g.set(e);n.data=g}if(this.needsDecode){(0,i.assert)(d===i.ImageKind.GRAYSCALE_1BPP,"PDFImage.createImageData: The image must be grayscale.");for(var m=n.data,p=0,v=m.length;p<v;p++)m[p]^=255}return n}if(this.image instanceof c.JpegStream&&!this.smask&&!this.mask){var b=u*f;switch(this.colorSpace.name){case"DeviceGray":b*=3;case"DeviceRGB":case"DeviceCMYK":n.kind=i.ImageKind.RGB_24BPP;n.data=this.getImageBytes(b,r,a,!0);return n}}}var y,w,k=0|(e=this.getImageBytes(u*f)).length/f*a/u,S=this.getComponents(e);if(t||this.smask||this.mask){n.kind=i.ImageKind.RGBA_32BPP;n.data=new Uint8ClampedArray(r*a*4);y=1;w=!0;this.fillOpacity(n.data,r,a,k,S)}else{n.kind=i.ImageKind.RGB_24BPP;n.data=new Uint8ClampedArray(r*a*3);y=0;w=!1}this.needsDecode&&this.decodeBuffer(S);this.colorSpace.fillRgb(n.data,l,u,r,a,k,h,S,y);w&&this.undoPreblend(n.data,r,k);return n},fillGrayBuffer:function(e){var t=this.numComps;if(1!==t)throw new i.FormatError("Reading gray scale from a color image: "+t);var r,a,n=this.width,o=this.height,s=this.bpc,c=n*t*s+7>>3,l=this.getImageBytes(o*c),u=this.getComponents(l);if(1!==s){this.needsDecode&&this.decodeBuffer(u);a=n*o;var h=255/((1<<s)-1);for(r=0;r<a;++r)e[r]=h*u[r]}else{a=n*o;if(this.needsDecode)for(r=0;r<a;++r)e[r]=u[r]-1&255;else for(r=0;r<a;++r)e[r]=255&-u[r]}},getImageBytes:function(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];this.image.reset();this.image.drawWidth=t||this.width;this.image.drawHeight=r||this.height;this.image.forceRGB=!!a;return this.image.getBytes(e,!0)}};return u}();t.PDFImage=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.MessageHandler=void 0;var a,i,n,o=r(131),s=(a=o)&&a.__esModule?a:{default:a},c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l=(n=(i=s.default.mark(function e(t,r){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return s.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.abrupt("return",t.apply(a,r));case 3:case"end":return e.stop()}},e,this)}),function(){var e=i.apply(this,arguments);return new Promise(function(t,r){return function a(i,n){try{var o=e[i](n),s=o.value}catch(e){r(e);return}if(!o.done)return Promise.resolve(s).then(function(e){a("next",e)},function(e){a("throw",e)});t(s)}("next")})}),function(e,t){return n.apply(this,arguments)}),u=r(2);function h(e){if("object"!==(void 0===e?"undefined":c(e)))return e;switch(e.name){case"AbortException":return new u.AbortException(e.message);case"MissingPDFException":return new u.MissingPDFException(e.message);case"UnexpectedResponseException":return new u.UnexpectedResponseException(e.message,e.status);default:return new u.UnknownErrorException(e.message,e.details)}}function f(e,t,r){t?e.resolve():e.reject(r)}function d(e,t,r){var a=this;this.sourceName=e;this.targetName=t;this.comObj=r;this.callbackId=1;this.streamId=1;this.postMessageTransfers=!0;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);var i=this.callbacksCapabilities=Object.create(null),n=this.actionHandler=Object.create(null);this._onComObjOnMessage=function(e){var t=e.data;if(t.targetName===a.sourceName)if(t.stream)a._processStreamMessage(t);else if(t.isReply){var o=t.callbackId;if(!(t.callbackId in i))throw new Error("Cannot resolve callback "+o);var s=i[o];delete i[o];"error"in t?s.reject(h(t.error)):s.resolve(t.data)}else{if(!(t.action in n))throw new Error("Unknown action from worker: "+t.action);var c=n[t.action];if(t.callbackId){var l=a.sourceName,f=t.sourceName;Promise.resolve().then(function(){return c[0].call(c[1],t.data)}).then(function(e){r.postMessage({sourceName:l,targetName:f,isReply:!0,callbackId:t.callbackId,data:e})},function(e){r.postMessage({sourceName:l,targetName:f,isReply:!0,callbackId:t.callbackId,error:function(e){return!(e instanceof Error)||e instanceof u.AbortException||e instanceof u.MissingPDFException||e instanceof u.UnexpectedResponseException||e instanceof u.UnknownErrorException?e:new u.UnknownErrorException(e.message,e.toString())}(e)})})}else t.streamId?a._createStreamSink(t):c[0].call(c[1],t.data)}};r.addEventListener("message",this._onComObjOnMessage)}d.prototype={on:function(e,t,r){var a=this.actionHandler;if(a[e])throw new Error('There is already an actionName called "'+e+'"');a[e]=[t,r]},send:function(e,t,r){var a={sourceName:this.sourceName,targetName:this.targetName,action:e,data:t};this.postMessage(a,r)},sendWithPromise:function(e,t,r){var a=this.callbackId++,i={sourceName:this.sourceName,targetName:this.targetName,action:e,data:t,callbackId:a},n=(0,u.createPromiseCapability)();this.callbacksCapabilities[a]=n;try{this.postMessage(i,r)}catch(e){n.reject(e)}return n.promise},sendWithStream:function(e,t,r,a){var i=this,n=this.streamId++,o=this.sourceName,s=this.targetName;return new u.ReadableStream({start:function(r){var a=(0,u.createPromiseCapability)();i.streamControllers[n]={controller:r,startCall:a,isClosed:!1};i.postMessage({sourceName:o,targetName:s,action:e,streamId:n,data:t,desiredSize:r.desiredSize});return a.promise},pull:function(e){var t=(0,u.createPromiseCapability)();i.streamControllers[n].pullCall=t;i.postMessage({sourceName:o,targetName:s,stream:"pull",streamId:n,desiredSize:e.desiredSize});return t.promise},cancel:function(e){var t=(0,u.createPromiseCapability)();i.streamControllers[n].cancelCall=t;i.streamControllers[n].isClosed=!0;i.postMessage({sourceName:o,targetName:s,stream:"cancel",reason:e,streamId:n});return t.promise}},r)},_createStreamSink:function(e){var t=this,r=this,a=this.actionHandler[e.action],i=e.streamId,n=e.desiredSize,o=this.sourceName,s=e.sourceName,c=function(e){var r=e.stream,a=e.chunk,n=e.transfers,c=e.success,l=e.reason;t.postMessage({sourceName:o,targetName:s,stream:r,streamId:i,chunk:a,success:c,reason:l},n)},h={enqueue:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=arguments[2];if(!this.isCancelled){var a=this.desiredSize;this.desiredSize-=t;if(a>0&&this.desiredSize<=0){this.sinkCapability=(0,u.createPromiseCapability)();this.ready=this.sinkCapability.promise}c({stream:"enqueue",chunk:e,transfers:r})}},close:function(){if(!this.isCancelled){this.isCancelled=!0;c({stream:"close"});delete r.streamSinks[i]}},error:function(e){if(!this.isCancelled){this.isCancelled=!0;c({stream:"error",reason:e})}},sinkCapability:(0,u.createPromiseCapability)(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:n,ready:null};h.sinkCapability.resolve();h.ready=h.sinkCapability.promise;this.streamSinks[i]=h;l(a[0],[e.data,h],a[1]).then(function(){c({stream:"start_complete",success:!0})},function(e){c({stream:"start_complete",success:!1,reason:e})})},_processStreamMessage:function(e){var t=this,r=this.sourceName,a=e.sourceName,i=e.streamId,n=function(e){var n=e.stream,o=e.success,s=e.reason;t.comObj.postMessage({sourceName:r,targetName:a,stream:n,success:o,streamId:i,reason:s})},o=function(){Promise.all([t.streamControllers[e.streamId].startCall,t.streamControllers[e.streamId].pullCall,t.streamControllers[e.streamId].cancelCall].map(function(e){return e&&(t=e.promise,Promise.resolve(t).catch(function(){}));var t})).then(function(){delete t.streamControllers[e.streamId]})};switch(e.stream){case"start_complete":f(this.streamControllers[e.streamId].startCall,e.success,h(e.reason));break;case"pull_complete":f(this.streamControllers[e.streamId].pullCall,e.success,h(e.reason));break;case"pull":if(!this.streamSinks[e.streamId]){n({stream:"pull_complete",success:!0});break}this.streamSinks[e.streamId].desiredSize<=0&&e.desiredSize>0&&this.streamSinks[e.streamId].sinkCapability.resolve();this.streamSinks[e.streamId].desiredSize=e.desiredSize;l(this.streamSinks[e.streamId].onPull).then(function(){n({stream:"pull_complete",success:!0})},function(e){n({stream:"pull_complete",success:!1,reason:e})});break;case"enqueue":(0,u.assert)(this.streamControllers[e.streamId],"enqueue should have stream controller");this.streamControllers[e.streamId].isClosed||this.streamControllers[e.streamId].controller.enqueue(e.chunk);break;case"close":(0,u.assert)(this.streamControllers[e.streamId],"close should have stream controller");if(this.streamControllers[e.streamId].isClosed)break;this.streamControllers[e.streamId].isClosed=!0;this.streamControllers[e.streamId].controller.close();o();break;case"error":(0,u.assert)(this.streamControllers[e.streamId],"error should have stream controller");this.streamControllers[e.streamId].controller.error(h(e.reason));o();break;case"cancel_complete":f(this.streamControllers[e.streamId].cancelCall,e.success,h(e.reason));o();break;case"cancel":if(!this.streamSinks[e.streamId])break;l(this.streamSinks[e.streamId].onCancel,[h(e.reason)]).then(function(){n({stream:"cancel_complete",success:!0})},function(e){n({stream:"cancel_complete",success:!1,reason:e})});this.streamSinks[e.streamId].sinkCapability.reject(h(e.reason));this.streamSinks[e.streamId].isCancelled=!0;delete this.streamSinks[e.streamId];break;default:throw new Error("Unexpected stream case")}},postMessage:function(e,t){t&&this.postMessageTransfers?this.comObj.postMessage(e,t):this.comObj.postMessage(e)},destroy:function(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}};t.MessageHandler=d}])}); \ No newline at end of file
diff --git a/graphics/figput/javascript/pdfjs_license.txt b/graphics/figput/javascript/pdfjs_license.txt
new file mode 100644
index 0000000000..91859c6683
--- /dev/null
+++ b/graphics/figput/javascript/pdfjs_license.txt
@@ -0,0 +1,180 @@
+
+This license applies to pdf.js and pdf.worker.min.js only. The complete
+PDF.js library can be found at https://github.com/mozilla/pdf.js.
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/graphics/figput/javascript/release/figput.html b/graphics/figput/javascript/release/figput.html
new file mode 100644
index 0000000000..431a4c18e7
--- /dev/null
+++ b/graphics/figput/javascript/release/figput.html
@@ -0,0 +1,38 @@
+
+<!doctype html>
+
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>FigPut Viewer</title>
+
+ <!-- The pdf.js stuff, from Mozilla. -->
+ <script src="pdf.js"></script>
+ <script src="pdf.worker.min.js"></script>
+
+ <script src="figput.js"></script>
+
+ <style>
+ /* Put the canvas right up to the edge of the visible area of the window. */
+ body {
+ padding: 0;
+ margin: 0;
+ }
+ </style>
+</head>
+
+
+<!--
+Note that 'unknown1' will be changed to the project's name as this file
+is being served. If the pdf generated by LaTeX is called math.pdf, then
+'unknown1' will become 'math'.
+BEWARE: This works by replacing every occurence of 'unknown1' in this file,
+so don't use 'unknown1' for anything else.
+The same basic thing is going on with unknowny, but it is used for scroll
+position
+-->
+<body onload="doOpenDocument('unknown1',unknowny)" id="mainbody">
+ <canvas id="pdf_renderer"></canvas>
+</body>
+</html>
+
diff --git a/graphics/figput/javascript/release/figput.js b/graphics/figput/javascript/release/figput.js
new file mode 100644
index 0000000000..ea7355459b
--- /dev/null
+++ b/graphics/figput/javascript/release/figput.js
@@ -0,0 +1,457 @@
+// Copyright 2022 Randall Fairman
+"use strict";var theBrowser=function(){let blah=navigator.userAgent;if(blah.indexOf("Firefox")>-1)
+return"Firefox";if(blah.indexOf("Chrome")>-1)
+return"Chrome";console.log("MAKING DEFAULT 'CHROME' ASSUMPTION ABOUT THE BROWSWER!!!");return"Chrome";}();function sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms));}
+function getAugmentedFunction(fcnName){return window[fcnName];}
+class PageData{constructor(){this.pageHeight=0;this.pageWidth=0;this.leftMargin=0;this.rightMargin=0;this.textWidth=0;this.insertPoint=[];this.deleteHeight=[];this.aboveHeight=[];this.belowHeight=[];this.name=[];this.done=[];this.drawFcn=[];}}
+class PDFDocument{static async setPDF(thePDF){this.pdf=thePDF;this.numberOfPages=thePDF.numPages;for(let i=1;i<=this.numberOfPages;i++){await thePDF.getPage(i).then(function(page){PDFDocument.pageSpecs[i-1]=new PageData();PDFDocument.pageSpecs[i-1].pageWidth=page.view[2];PDFDocument.pageSpecs[i-1].pageHeight=page.view[3];PDFDocument.theCanvases[i-1]=null;PDFDocument.pageAge[i-1]=0;});}}
+static isLoaded(){if(this.pdf===null)
+return false;else
+return true;}
+static getZoom(){return this.zoom;}
+static setZoom(z){this.zoom=z;this.flushBuffer();}
+static getCanvas(n){if(this.theCanvases[n]===null)
+console.log("ERROR! Canvas for page missing: "+n);return this.theCanvases[n];}
+static async render(n){if(PDFDocument.theCanvases[n]!==null)
+return;let thePage=await PDFDocument.pdf.getPage(n+1);let newCanvas=document.createElement('canvas');PDFDocument.theCanvases[n]=newCanvas;PDFDocument.pageAge[n]=PDFDocument.renderCount;++PDFDocument.renderCount;let offctx=newCanvas.getContext('2d');let viewport=thePage.getViewport(PDFDocument.zoom);newCanvas.width=viewport.width;newCanvas.height=viewport.height;await thePage.render({canvasContext:offctx,viewport:viewport});}
+static trimBuffer(){let ctot=0;for(let i=0;i<PDFDocument.numberOfPages;i++){if(PDFDocument.theCanvases[i]!==null)
+++ctot;}
+while(ctot>PDFDocument.pageBufSize){PDFDocument.removeOldestPage();--ctot;}}
+static removeOldestPage(){let oldestIndex=-1;let oldestAge=this.pageAge[0];for(let i=0;i<this.numberOfPages;i++){if(this.theCanvases[i]===null)
+continue;if(this.pageAge[i]<oldestAge){oldestAge=this.pageAge[i];oldestIndex=i;}}
+this.theCanvases[oldestIndex]=null;}
+static flushBuffer(){for(let i=0;i<this.numberOfPages;i++)
+this.theCanvases[i]=null;}}
+PDFDocument.numberOfPages=0;PDFDocument.zoom=1;PDFDocument.pageSpecs=[];PDFDocument.pageBufSize=6;PDFDocument.theCanvases=[];PDFDocument.renderCount=0;PDFDocument.pageAge=[];class Events{static getID(){let answer=this.count;this.count++;return answer;}
+static async waitMyTurn(id){while(id!==Events.complete+1)
+await sleep(5);}
+static allDone(id){Events.complete=id;}}
+Events.count=0;Events.complete=-1;async function doOpenDocument(latexName,scrollPos){let theCanvas=document.getElementById("pdf_renderer");theCanvas.style.position="fixed";PDFDocument.setZoom(window.devicePixelRatio);adjustCanvas();theCanvas.addEventListener("mousedown",doMouseDown);theCanvas.addEventListener("mousemove",doMouseMove);theCanvas.addEventListener("mouseup",doMouseUp);await getDocumentData(latexName);FullPanel.init(PDFDocument.pageSpecs);adjustScrollBars();window.scrollTo(0,scrollPos);fullRender();}
+async function getDocumentData(latexName){let thePDF=await pdfjsLib.getDocument(latexName+'.pdf');await PDFDocument.setPDF(thePDF);let fname=latexName+".fig.aux";let fetchPromise=await fetch(fname);let allText=await fetchPromise.text();await getFigureInfo(allText);}
+async function syncLoad(scriptName){let theCode=document.createElement("script");theCode.type="application/javascript";theCode.src=scriptName;var p=new Promise((resolve,reject)=>{theCode.addEventListener("load",resolve,{once:true});theCode.addEventListener("error",reject,{once:true});});document.body.appendChild(theCode);await p;}
+async function getFigureInfo(textBody){let lines=textBody.split('\n');for(let i=0;i<lines.length;i++){if(lines[i].length<2)
+break;var parts=lines[i].split(' ');if(parts[0]==="load"){await syncLoad(parts[1]);continue;}
+var pnum=parseInt(parts[0]);var innerMargin=parseFloat(parts[1]);var outerMargin=parseFloat(parts[2]);var textWidth=parseFloat(parts[3]);var vpos=parseFloat(parts[4]);var hLatex=parseFloat(parts[5]);var hAbove=parseFloat(parts[6]);var hBelow=parseFloat(parts[7]);var name=parts[8];var done=(parts[9]==='true');var externLoad=(parts[10]==='true');pnum-=1;if(externLoad===true)
+await syncLoad(name+".fjs");let augFcn=getAugmentedFunction(name);if(typeof augFcn==="undefined")
+alert(name+" not found. Is the function name correct?");augFcn.figurePanelClass=null;PDFDocument.pageSpecs[pnum].drawFcn.push(augFcn);vpos=PDFDocument.pageSpecs[pnum].pageHeight-vpos;if(pnum%2===0){PDFDocument.pageSpecs[pnum].leftMargin=innerMargin;PDFDocument.pageSpecs[pnum].rightMargin=outerMargin;}
+else{PDFDocument.pageSpecs[pnum].leftMargin=outerMargin;PDFDocument.pageSpecs[pnum].rightMargin=innerMargin;}
+PDFDocument.pageSpecs[pnum].textWidth=textWidth;PDFDocument.pageSpecs[pnum].insertPoint.push(vpos);PDFDocument.pageSpecs[pnum].deleteHeight.push(hLatex);PDFDocument.pageSpecs[pnum].aboveHeight.push(hAbove);PDFDocument.pageSpecs[pnum].belowHeight.push(hBelow);PDFDocument.pageSpecs[pnum].name.push(name);PDFDocument.pageSpecs[pnum].done.push(done);}
+for(let i=0;i<PDFDocument.numberOfPages;i++){for(let fig=0;fig<PDFDocument.pageSpecs[i].name.length;fig++){let curName=PDFDocument.pageSpecs[i].name[fig];for(let subfig=fig+1;subfig<PDFDocument.pageSpecs[i].name.length;subfig++){if(curName===PDFDocument.pageSpecs[i].name[subfig]){alert("The figure name "+curName+" is used more than once.");throw new Error();}}
+for(let j=i+1;j<PDFDocument.numberOfPages;j++){for(let subfig=0;subfig<PDFDocument.pageSpecs[j].name.length;subfig++){if(curName===PDFDocument.pageSpecs[j].name[subfig]){alert("The figure name "+curName+" is used more than once.");throw new Error();}}}}}}
+function adjustScrollBars(){var body=document.getElementById("mainbody");let totHeight=FullPanel.totalHeight();let visHeight=document.documentElement.clientHeight;body.style.height=totHeight+"px";let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();if(visWidth>totWidth){body.style.width="0px";return;}
+body.style.width=totWidth+"px";}
+function ctxTopLevelAdjust(){var canvas=document.getElementById("pdf_renderer");let ctx=canvas.getContext('2d');ctx.resetTransform();let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();let z=PDFDocument.getZoom();if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;docCenter*=PDFDocument.getZoom();ctx.translate(canvasCenter-docCenter,0);}
+else{ctx.translate(-window.scrollX*PDFDocument.getZoom(),0);}
+return ctx;}
+async function fullRender(){var canvas=document.getElementById("pdf_renderer");var ctx=canvas.getContext('2d');ctx.resetTransform();let visWidth=document.documentElement.clientWidth;let z=PDFDocument.getZoom();ctx.clearRect(0,0,visWidth*z,document.documentElement.clientHeight*z);await FullPanel.renderAll(canvas.height);}
+function adjustCanvas(){var canvas=document.getElementById("pdf_renderer");canvas.style.width=document.documentElement.clientWidth+"px";canvas.style.height=document.documentElement.clientHeight+"px";canvas.width=document.documentElement.clientWidth*window.devicePixelRatio;canvas.height=document.documentElement.clientHeight*window.devicePixelRatio;}
+async function doScrollGuts(id){await Events.waitMyTurn(id);await fullRender();Events.allDone(id);}
+function doScroll(){if(PDFDocument.isLoaded()==false)
+return;let id=Events.getID();doScrollGuts(id);}
+async function doResizeGuts(id){await Events.waitMyTurn(id);PDFDocument.flushBuffer();console.log("ratio: "+window.devicePixelRatio);adjustCanvas();PDFDocument.setZoom(window.devicePixelRatio);adjustScrollBars();await fullRender();Events.allDone(id);}
+function doResize(){let id=Events.getID();doResizeGuts(id);}
+async function mouseDownGuts(id,x,y){await Events.waitMyTurn(id);let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();let canvas=document.getElementById("pdf_renderer");if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;canvasCenter=canvasCenter/PDFDocument.getZoom();x=x-(canvasCenter-docCenter);}
+else{x=x+window.scrollX;}
+y=y+window.scrollY;FullPanel.mouseDown(x,y);Events.allDone(id);}
+function doMouseDown(e){let id=Events.getID();mouseDownGuts(id,e.x,e.y);}
+async function mouseMoveGuts(id,x,y){await Events.waitMyTurn(id);let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();let canvas=document.getElementById("pdf_renderer");if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;canvasCenter=canvasCenter/PDFDocument.getZoom();x=x-(canvasCenter-docCenter);}
+else{x=x+window.scrollX;}
+y=y+window.scrollY;FullPanel.mouseMove(x,y);Events.allDone(id);}
+function doMouseMove(e){let id=Events.getID();mouseMoveGuts(id,e.x,e.y);}
+async function mouseUpGuts(id,x,y){await Events.waitMyTurn(id);let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();let canvas=document.getElementById("pdf_renderer");if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;canvasCenter=canvasCenter/PDFDocument.getZoom();x=x-(canvasCenter-docCenter);}
+else{x=x+window.scrollX;}
+y=y+window.scrollY;FullPanel.mouseUp(x,y);Events.allDone(id);}
+function doMouseUp(e){let id=Events.getID();mouseUpGuts(id,e.x,e.y);}
+function doTikzClick(){for(let pi=0;pi<PDFDocument.pageSpecs.length;pi++){let pd=PDFDocument.pageSpecs[pi];if(pd.name.length===0)
+continue;for(let fi=0;fi<pd.name.length;fi++){if(pd.done[fi]==true)
+continue;let theFcn=pd.drawFcn[fi];if(theFcn.figurePanelClass===null)
+continue;let ctx=new CTX(pd.name[fi]);theFcn(ctx);ctx.close();}}}
+function doBeforeUnload(e){let req=new XMLHttpRequest();req.open("WHERE","bogus",false);req.setRequestHeader("Content-Type","text/plain;charset=UTF-8");let msg=window.scrollY.toString();req.send(msg);}
+document.addEventListener('scroll',doScroll);window.addEventListener('resize',doResize);"use strict";class FullPanel{static init(specList){let cumV=0;for(let i=0;i<specList.length;i++){let pp=new PagePanel(i,specList[i],cumV);this.thePages[i]=pp;cumV+=pp.h;}}
+static async renderAll(height){height=height/PDFDocument.getZoom();let ps=[];for(let i=0;i<this.thePages.length;i++){let p=this.thePages[i].preRender(height);ps.push(p);}
+await Promise.all(ps);for(let i=0;i<this.thePages.length;i++)
+this.thePages[i].render(height);PDFDocument.trimBuffer();}
+static totalHeight(){let answer=0;for(let i=0;i<this.thePages.length;i++)
+answer+=this.thePages[i].h;return answer;}
+static getFullWidth(){if(this.totalWidth>0)
+return this.totalWidth;for(let i=0;i<this.thePages.length;i++){let pp=this.thePages[i];if(pp.w>this.totalWidth)
+this.totalWidth=pp.w;}
+return this.totalWidth;}
+static mouseDown(x,y){WidgetManager.focusOwner=null;let i=0;for(;i<this.thePages.length;i++){if(this.thePages[i].v>y){i-=1;break;}}
+if(i===this.thePages.length)
+i=this.thePages.length-1;if((i==this.thePages.length)||(i<0))
+return;this.thePages[i].mouseDown(x,y);}
+static mouseMove(x,y){if(WidgetManager.mouseOwner===null)
+return;let i=0;for(;i<this.thePages.length;i++){if(this.thePages[i].v>y){i-=1;break;}}
+if(i===this.thePages.length)
+i=this.thePages.length-1;if((i==this.thePages.length)||(i<0))
+return;this.thePages[i].mouseMove(x,y);}
+static mouseUp(x,y){if(WidgetManager.mouseOwner===null)
+return;let i=0;for(;i<this.thePages.length;i++){if(this.thePages[i].v>y){i-=1;break;}}
+if(i===this.thePages.length)
+i=this.thePages.length-1;if((i==this.thePages.length)||(i<0))
+return;this.thePages[i].mouseUp(x,y);WidgetManager.mouseOwner=null;}}
+FullPanel.thePages=[];FullPanel.totalWidth=-1;class PagePanel{constructor(pageNum,pageSpec,v){this.v=0;this.w=0;this.h=0;this.pageNum=0;this.parts=[];this.w=pageSpec.pageWidth;this.v=v;this.pageNum=pageNum;let s=pageSpec;if(s.insertPoint.length==0){let p=new PDFPanel(pageNum,this.v,0,0,this.v,this.w,s.pageHeight);this.h=s.pageHeight;this.parts=[p];}
+else{let srcV=0;let destV=0;let totalV=v;for(let j=0;j<s.insertPoint.length;j++){let p=new PDFPanel(pageNum,this.v,srcV,destV,totalV,this.w,s.insertPoint[j]-srcV);destV+=s.insertPoint[j]-srcV;totalV+=s.insertPoint[j]-srcV;let f=new FigurePanel(this.v,destV,totalV,this.w,s.deleteHeight[j]+s.aboveHeight[j]+s.belowHeight[j],s.aboveHeight[j],s.belowHeight[j],s.leftMargin,s.textWidth,s.drawFcn[j]);srcV=s.insertPoint[j]+s.deleteHeight[j];destV+=s.deleteHeight[j]+s.aboveHeight[j]+s.belowHeight[j];totalV+=s.deleteHeight[j]+s.aboveHeight[j]+s.belowHeight[j];this.parts.push(p);this.parts.push(f);}
+let p=new PDFPanel(pageNum,this.v,srcV,destV,totalV,this.w,s.pageHeight-srcV);this.parts.push(p);this.h=destV+s.pageHeight-srcV;}}
+async preRender(height){let vpos=window.scrollY;if(this.v+this.h<vpos)
+return;if(this.v>vpos+height)
+return;await PDFDocument.render(this.pageNum);}
+render(height){let vpos=window.scrollY;if(this.v+this.h<vpos)
+return;if(this.v>vpos+height)
+return;let ctx=ctxTopLevelAdjust();for(let i=0;i<this.parts.length;i++)
+this.parts[i].render();let z=PDFDocument.getZoom();ctx.strokeStyle="black";ctx.strokeRect(0,0,this.w*z,this.h*z);}
+mouseDown(x,y){y-=this.v;for(let i=0;i<this.parts.length;i++){let p=this.parts[i];if(p instanceof PDFPanel)
+continue;if((p.destV<=y)&&(y<=p.destV+p.h))
+return p.mouseDown(x,y);}}
+mouseMove(x,y){y-=this.v;for(let i=0;i<this.parts.length;i++){let p=this.parts[i];if(p instanceof PDFPanel)
+continue;if((p.destV<=y)&&(y<=p.destV+p.h))
+p.mouseMove(x,y);}}
+mouseUp(x,y){y-=this.v;for(let i=0;i<this.parts.length;i++){let p=this.parts[i];if((p.destV<=y)&&(y<=p.destV+p.h)){if(p instanceof PDFPanel)
+WidgetManager.mouseOwner.mouseUp(10000000000000,10000000000000);else
+p.mouseUp(x,y);}}}}
+class SubPanel{constructor(v,totalV,w,h){this.destV=0;this.h=0;this.w=0;this.totalV=0;this.destV=v;this.totalV=totalV;this.w=w;this.h=h;}
+render(){console.log("Error: called SubPanel.render()!");}
+mouseDown(x,y){console.log("Error: called SubPanel.mouseDown()!");}
+mouseMove(x,y){console.log("Error: called SubPanel.mouseMove()!");}
+mouseUp(x,y){console.log("Error: called SubPanel.mouseUp()!");}}
+class PDFPanel extends SubPanel{constructor(pageNum,offsetV,srcV,destV,totalV,w,h){super(destV,totalV,w,h);this.pageNum=0;this.srcV=0;this.offsetV=0;this.pageNum=pageNum;this.srcV=srcV;this.offsetV=offsetV;}
+render(){let theCanvas=PDFDocument.getCanvas(this.pageNum);if(theCanvas===null){return;}
+let z=PDFDocument.getZoom();let ctx=ctxTopLevelAdjust();ctx.translate(0,(this.offsetV-window.scrollY)*z);ctx.drawImage(theCanvas,0,this.srcV*z,theCanvas.width,this.h*z,0,this.destV*z,theCanvas.width,this.h*z);}}
+class FigurePanel extends SubPanel{constructor(pageV,destV,totalV,w,h,upperPadding,lowerPadding,margin,textWidth,drawFcn){super(destV,totalV,w,h);this.pageV=0;this.margin=0;this.textWidth=0;this.lowerPadding=0;this.upperPadding=0;this.pageV=pageV;this.upperPadding=upperPadding;this.lowerPadding=lowerPadding;this.margin=margin;this.textWidth=textWidth;this.drawFcn=drawFcn;}
+render(){let ctx=ctxTopLevelAdjust();let z=PDFDocument.getZoom();ctx.translate(0,(this.pageV-window.scrollY)*z);ctx.translate(0,this.destV*z);ctx.scale(z,z);ctx.clearRect(1,0,this.w-2,this.h);ctx=ctxTopLevelAdjust();ctx.translate(0,(this.pageV-window.scrollY)*z);ctx.translate(this.margin*z,(this.destV+this.h-this.lowerPadding)*z);ctx.scale(1,-1);ctx.scale(z,z);this.drawFcn.figurePanelClass=this;this.drawFcn(ctx);}
+mouseDown(x,y){y-=this.destV;x-=this.margin;y=(this.h-y)-this.lowerPadding;WidgetManager.mouseDown(this.drawFcn,x,y);}
+mouseMove(x,y){y-=this.destV;x-=this.margin;y=(this.h-this.lowerPadding)-y;WidgetManager.mouseMove(this.drawFcn,x,y);}
+mouseUp(x,y){y-=this.destV;x-=this.margin;y=(this.h-this.lowerPadding)-y;WidgetManager.mouseUp(this.drawFcn,x,y);}}"use strict";class WidgetManager{static register(w){this.theList.push(w);if(WidgetManager.theWidgets.has(w.betterOwner))
+WidgetManager.theWidgets.get(w.betterOwner).push(w);else
+WidgetManager.theWidgets.set(w.betterOwner,[w]);}
+static knownWidget(o,t,n){for(let i=0;i<this.theList.length;i++){let curW=this.theList[i];if(o!==curW.owner)
+continue;if(t!==curW.type)
+continue;if(n===curW.name)
+return curW;}
+return null;}
+static mouseDown(theFig,x,y){if(WidgetManager.theWidgets.has(theFig)===false)
+return;let wlist=WidgetManager.theWidgets.get(theFig);for(let i=0;i<wlist.length;i++){if(wlist[i].mouseDown(x,y)===true)
+return;}}
+static mouseMove(theFig,x,y){if(WidgetManager.mouseOwner===null)
+return;if(WidgetManager.theWidgets.has(theFig)===false)
+return;if(WidgetManager.mouseOwner.betterOwner!==theFig)
+return;WidgetManager.mouseOwner.mouseMove(x,y);}
+static mouseUp(theFig,x,y){if(WidgetManager.mouseOwner===null)
+return;if(WidgetManager.theWidgets.has(theFig)===false)
+return;if(WidgetManager.mouseOwner.betterOwner!==theFig)
+WidgetManager.mouseOwner.mouseUp(10000000000000,10000000000000);WidgetManager.mouseOwner.mouseUp(x,y);}}
+WidgetManager.theList=[];WidgetManager.theWidgets=new Map();WidgetManager.bogusCanvas=document.createElement('canvas');WidgetManager.bogusCtx=WidgetManager.bogusCanvas.getContext('2d');WidgetManager.mouseOwner=null;WidgetManager.focusOwner=null;function getCaller(){let stack=new Error().stack;if(theBrowser==="Firefox"){let caller=stack.split('\n')[2].trim();let callingFcn=caller.split('@')[0];return callingFcn;}
+else if(theBrowser==="Chrome"){let caller=stack.split('\n')[3].trim();let callingFcn=caller.split(' ')[1];if(callingFcn.indexOf('.')>-1)
+callingFcn=callingFcn.split('.')[1];return callingFcn;}
+else{console.log("IMPOSSIBLE ERROR DUE TO UNKNOWN BROWSER TYPE!!!");return"";}}
+class Widget{constructor(owner,type,x,y,scale,hide,name){this.owner="";this.type="";this.name="";this.widgetX=0;this.widgetY=0;this.scale=1.0;this.hide=true;this.owner=owner;this.type=type;this.widgetX=x;this.widgetY=y;this.scale=scale;this.hide=hide;this.name=name;this.betterOwner=getAugmentedFunction(owner);WidgetManager.register(this);}
+draw(ctx){console.log("Called Widget.draw()!!!");}
+mouseDown(x,y){console.log("Called Widget.mouseDown()!!! "+this.name);return false;}
+mouseMove(x,y){console.log("Called Widget.mouseMove()!!!");}
+mouseUp(x,y){console.log("Called Widget.mouseUp()!!!");}}
+function doAnimation(theWidget){let id=Events.getID();doAnimationGuts(id,theWidget);}
+async function doAnimationGuts(id,theWidget){await Events.waitMyTurn(id);await renderFrame(theWidget);theWidget.curStep+=theWidget.stepsPerFrame;theWidget.advanceFrame();Events.allDone(id);}
+async function renderFrame(theWidget){let myFunc=getAugmentedFunction(theWidget.owner);let fpc=myFunc.figurePanelClass;await fpc.render();}
+function getFigureRect(theWidget){let myFunc=getAugmentedFunction(theWidget.owner);let fpc=myFunc.figurePanelClass;let answer={w:fpc.textWidth,ha:fpc.h-fpc.lowerPadding,hb:fpc.lowerPadding};return answer;}
+class AnimationWidget extends Widget{constructor(){super(...arguments);this.curStep=0;this.stepsPerFrame=1;this.animID=0;}
+advanceFrame(){console.log("Calling abstract AnimationWidget.advanceFrame()!");}}
+class LoopAnimWidget extends AnimationWidget{constructor(){super(...arguments);this.steps=100;this.start=0;this.timeStep=20;this.visSteps=true;this.visFastSlow=true;this.visPauseRun=true;this.visCircle=true;this.triGrab=true;this.pCircle=null;this.pUpStep=null;this.pDownStep=null;this.pFaster=null;this.pSlower=null;this.pPauseRun=null;this.aRunning=true;this.sCircle=false;this.sPauseRun=false;this.sFaster=false;this.sSlower=false;this.sUpStep=false;this.sDownStep=false;}
+static register(ctx,x,y,scale,visWidget,steps,start,timeStep,visSteps,visFastSlow,visPauseRun,visCircle,triGrab,name){let type="LoopWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){w.draw(ctx);return w;}
+w=new LoopAnimWidget(caller,type,x,y,scale,!visWidget,name);w.steps=steps;w.start=start;w.timeStep=timeStep;w.visSteps=visSteps;w.visFastSlow=visFastSlow;w.visPauseRun=visPauseRun;w.visCircle=visCircle;w.triGrab=triGrab;w.curStep=w.start;WidgetManager.register(w);w.animID=setInterval(doAnimation,w.timeStep,w);w.draw(ctx);return w;}
+advanceFrame(){this.curStep+=this.stepsPerFrame;if(this.curStep>=this.steps)
+this.curStep-=this.steps;}
+draw(ctx){if(this.hide===true)
+return;if(ctx instanceof CTX)
+return;let saveT=ctx.getTransform();ctx.translate(this.widgetX,this.widgetY);ctx.scale(this.scale,this.scale);var p=new Path2D();var r=40;var cx=0;var cy=0;var circWidth=3;if(this.visCircle==true){p.ellipse(cx,cy,r,r,0,0,2*Math.PI);this.pCircle=new Path2D(p);ctx.lineWidth=circWidth;if(this.sCircle==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";ctx.stroke(p);ctx.lineWidth=1;var loc=-2*Math.PI*this.curStep/this.steps;var triHeight=10;var triAngle=Math.PI/20;p=new Path2D();var x=cx+(r-circWidth/2)*Math.cos(loc);var y=cy+(r-circWidth/2)*Math.sin(loc);p.moveTo(x,y);x=cx+(r-triHeight)*Math.cos(loc+triAngle);y=cy+(r-triHeight)*Math.sin(loc+triAngle);p.lineTo(x,y);x=cx+(r-triHeight)*Math.cos(loc-triAngle);y=cy+(r-triHeight)*Math.sin(loc-triAngle);p.lineTo(x,y);p.closePath();ctx.strokeStyle="red";ctx.stroke(p);ctx.strokeStyle="black";}
+let arrowOffset=18;let lowerGap=6;let arrowHeight=7;let arrowDepth=4;let arrowPairSpace=3;let arrowThick=1.25;if(this.visFastSlow===true){ctx.lineWidth=arrowThick;if(this.sFaster==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";p=new Path2D();p.moveTo(cx+arrowOffset,cy-r-circWidth/2-lowerGap);p.lineTo(cx+arrowOffset+arrowDepth,cy-r-circWidth/2-lowerGap-arrowHeight);p.lineTo(cx+arrowOffset,cy-r-circWidth/2-lowerGap-2*arrowHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx+arrowOffset+arrowPairSpace,cy-r-circWidth/2-lowerGap);p.lineTo(cx+arrowOffset+arrowDepth+arrowPairSpace,cy-r-circWidth/2-lowerGap-arrowHeight);p.lineTo(cx+arrowOffset+arrowPairSpace,cy-r-circWidth/2-lowerGap-2*arrowHeight);ctx.stroke(p);this.pFaster=new Path2D();this.pFaster.rect(cx+arrowOffset-arrowThick,cy-r-circWidth/2-lowerGap-2*arrowHeight,arrowPairSpace+arrowDepth+2*arrowThick,2*arrowHeight);if(this.sSlower==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";p=new Path2D();p.moveTo(cx-arrowOffset,cy-r-circWidth/2-lowerGap);p.lineTo(cx-arrowOffset-arrowDepth,cy-r-circWidth/2-lowerGap-arrowHeight);p.lineTo(cx-arrowOffset,cy-r-circWidth/2-lowerGap-2*arrowHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-arrowOffset-arrowPairSpace,cy-r-circWidth/2-lowerGap);p.lineTo(cx-arrowOffset-arrowDepth-arrowPairSpace,cy-r-circWidth/2-lowerGap-arrowHeight);p.lineTo(cx-arrowOffset-arrowPairSpace,cy-r-circWidth/2-lowerGap-2*arrowHeight);ctx.stroke(p);this.pSlower=new Path2D();this.pSlower.rect(cx-arrowOffset-arrowPairSpace-arrowDepth-arrowThick,cy-r-circWidth/2-lowerGap-2*arrowHeight,arrowPairSpace+arrowDepth+2*arrowThick,2*arrowHeight);}
+ctx.lineWidth=1;if(this.visPauseRun===true){let pauseSpace=3.25;let pauseThick=1.5;let pauseHeight=2*arrowHeight;let runThick=1.5;let runLeftRight=5;let runHeight=2*arrowHeight;if(this.sPauseRun==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";if(this.aRunning===true){ctx.lineWidth=pauseThick;p=new Path2D();p.moveTo(cx+pauseSpace,cy-r-circWidth/2-lowerGap);p.lineTo(cx+pauseSpace,cy-r-circWidth/2-lowerGap-pauseHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-pauseSpace,cy-r-circWidth/2-lowerGap);p.lineTo(cx-pauseSpace,cy-r-circWidth/2-lowerGap-pauseHeight);ctx.stroke(p);ctx.lineWidth=1;}
+else{ctx.lineWidth=runThick;p=new Path2D();p.moveTo(cx-runLeftRight,cy-r-circWidth/2-lowerGap);p.lineTo(cx-runLeftRight,cy-r-circWidth/2-lowerGap-runHeight);p.lineTo(cx+runLeftRight,cy-r-circWidth/2-lowerGap-runHeight/2);p.closePath();ctx.stroke(p);}
+this.pPauseRun=new Path2D();this.pPauseRun.rect(cx-runLeftRight-runThick,cy-r-circWidth/2-lowerGap-runHeight-runThick,2*runLeftRight+2*runThick,runHeight+2*runThick);}
+ctx.lineWidth=1;if(this.visSteps===true){let stepSpace=20;let stepThick=2.0;let upperGap=8;let stepHeight=15;let stepArrowHeight=8;let stepArrowWidth=5;ctx.lineWidth=stepThick;if(this.sDownStep==true){ctx.strokeStyle=LoopAnimWidget.sColor;ctx.fillStyle=LoopAnimWidget.sColor;}
+else{ctx.strokeStyle="black";ctx.fillStyle="black";}
+p=new Path2D();p.moveTo(cx-stepSpace,cy+r+circWidth/2+upperGap);p.lineTo(cx-stepSpace,cy+r+circWidth/2+upperGap+stepHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-stepSpace,cy+r+circWidth/2+upperGap-stepThick);p.lineTo(cx-stepSpace+stepArrowWidth,cy+r+circWidth/2+upperGap+stepArrowHeight-stepThick);p.lineTo(cx-stepSpace-stepArrowWidth,cy+r+circWidth/2+upperGap+stepArrowHeight-stepThick);p.closePath();ctx.fill(p);this.pDownStep=new Path2D();this.pDownStep.rect(cx-stepSpace-stepArrowWidth,cy+r+circWidth/2+upperGap-stepThick,2*stepArrowWidth,stepHeight+stepThick);if(this.sUpStep==true){ctx.strokeStyle=LoopAnimWidget.sColor;ctx.fillStyle=LoopAnimWidget.sColor;}
+else{ctx.strokeStyle="black";ctx.fillStyle="black";}
+p=new Path2D();p.moveTo(cx+stepSpace,cy+r+circWidth/2+upperGap);p.lineTo(cx+stepSpace,cy+r+circWidth/2+upperGap+stepHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx+stepSpace,cy+r+circWidth/2+upperGap+stepHeight+stepThick);p.lineTo(cx+stepSpace+stepArrowWidth,cy+r+circWidth/2+upperGap+stepHeight-stepArrowHeight+stepThick);p.lineTo(cx+stepSpace-stepArrowWidth,cy+r+circWidth/2+upperGap+stepHeight-stepArrowHeight+stepThick);p.closePath();ctx.fill(p);this.pUpStep=new Path2D();this.pUpStep.rect(cx+stepSpace-stepArrowWidth,cy+r+circWidth/2+upperGap,2*stepArrowWidth,stepHeight+stepThick);ctx.lineWidth=1;ctx.strokeStyle="black";ctx.fillStyle="black";stepThick=1.5;let stepSize=6;ctx.lineWidth=stepThick;p=new Path2D();p.moveTo(cx-stepSize,cy+r+circWidth/2+upperGap+2*stepSize);p.lineTo(cx,cy+r+circWidth/2+upperGap+2*stepSize);p.lineTo(cx,cy+r+circWidth/2+upperGap+stepSize);p.lineTo(cx+stepSize,cy+r+circWidth/2+upperGap+stepSize);p.lineTo(cx+stepSize,cy+r+circWidth/2+upperGap);ctx.stroke(p);}
+ctx.lineWidth=1;ctx.setTransform(saveT);}
+mouseDown(x,y){if(this.hide===true)
+return false;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.pPauseRun!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);if(isin===true){this.sPauseRun=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pFaster!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);if(isin===true){this.sFaster=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pSlower!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);if(isin===true){this.sSlower=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pUpStep!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);if(isin===true){this.sUpStep=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pDownStep!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);if(isin===true){this.sDownStep=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pCircle!==null){WidgetManager.bogusCtx.lineWidth=15;let isin=WidgetManager.bogusCtx.isPointInStroke(this.pCircle,x,y);if(isin===true){this.sCircle=true;let alpha=-Math.atan2(y,x);if(alpha<0)
+alpha+=2*Math.PI;this.curStep=Math.floor(this.steps*alpha/(2*Math.PI));WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+return false;}
+mouseMove(x,y){if(this.hide===true)
+return;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.sCircle===true){WidgetManager.bogusCtx.lineWidth=40;let isin=WidgetManager.bogusCtx.isPointInStroke(this.pCircle,x,y);if(isin==false)
+return;let alpha=-Math.atan2(y,x);if(alpha<0)
+alpha+=2*Math.PI;this.curStep=Math.floor(this.steps*alpha/(2*Math.PI));renderFrame(this);}}
+mouseUp(x,y){if(this.hide===true)
+return;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();this.sCircle=false;if(this.sPauseRun){let isin=WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);if(isin===true){if(this.aRunning===true)
+clearInterval(this.animID);else
+this.animID=setInterval(doAnimation,this.timeStep,this);if(this.aRunning===true)
+this.aRunning=false;else
+this.aRunning=true;}
+this.sPauseRun=false;}
+if(this.sFaster===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);if(isin===true){this.timeStep/=1.4;if(this.timeStep<1)
+this.timeStep=1;if(this.aRunning===true)
+clearInterval(this.animID);this.animID=setInterval(doAnimation,this.timeStep,this);this.aRunning=true;}
+this.sFaster=false;}
+if(this.sSlower===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);if(isin===true){this.timeStep*=1.4;if(this.timeStep>1000)
+this.timeStep=1000;if(this.aRunning===true)
+clearInterval(this.animID);this.animID=setInterval(doAnimation,this.timeStep,this);this.aRunning=true;}
+this.sSlower=false;}
+if(this.sUpStep===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);if(isin===true){this.stepsPerFrame*=1.25;if(this.stepsPerFrame>this.steps/3)
+this.stepsPerFrame=this.steps/3;}
+this.sUpStep=false;}
+if(this.sDownStep===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);if(isin===true){this.stepsPerFrame/=1.25;}
+this.sDownStep=false;}
+renderFrame(this);}}
+LoopAnimWidget.Radius=41.5;LoopAnimWidget.TopHeight=24.5;LoopAnimWidget.BottomHeight=21.0;LoopAnimWidget.sColor="blue";class OpenAnimWidget extends AnimationWidget{constructor(){super(...arguments);this.barLength=100;this.timeStep=25;this.decay=1.0001;this.visSteps=true;this.visFastSlow=true;this.visPauseRun=true;this.visBar=true;this.barGrab=true;this.pBar=null;this.pDot=null;this.pFaster=null;this.pSlower=null;this.pPauseRun=null;this.pUpStep=null;this.pDownStep=null;this.aRunning=true;this.sDot=false;this.sFaster=false;this.sSlower=false;this.sPauseRun=false;this.sUpStep=false;this.sDownStep=false;}
+static register(ctx,x,y,scale,width,visWidget,timeStep,decay,visSteps,visFastSlow,visPauseRun,visBar,barGrab,name){let type="OpenAnimWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){w.draw(ctx);return w;}
+w=new OpenAnimWidget(caller,type,x,y,scale,!visWidget,name);w.barLength=width/scale;w.timeStep=timeStep;w.visSteps=visSteps;w.visFastSlow=visFastSlow;w.visPauseRun=visPauseRun;w.visBar=visBar;w.barGrab=barGrab;w.decay=1+1/decay;WidgetManager.register(w);w.animID=setInterval(doAnimation,w.timeStep,w);w.draw(ctx);return w;}
+advanceFrame(){this.curStep+=this.stepsPerFrame;}
+draw(ctx){if(this.hide===true)
+return;if(ctx instanceof CTX)
+return;let saveT=ctx.getTransform();ctx.translate(this.widgetX,this.widgetY);ctx.scale(this.scale,this.scale);var p=new Path2D();if(this.visBar==true){let indDotRadius=5.0;let barThick=3.0;let indDotThick=2.0;p.moveTo(0,indDotRadius+OpenAnimWidget.ControlsHeight);p.lineTo(this.barLength,indDotRadius+OpenAnimWidget.ControlsHeight);if(this.barGrab===true)
+this.pBar=new Path2D(p);ctx.lineWidth=barThick;ctx.stroke(p);p=new Path2D();let dx=Math.pow(this.decay,this.curStep);dx=this.barLength*(1-1/dx);p.ellipse(dx,indDotRadius+OpenAnimWidget.ControlsHeight,indDotRadius,indDotRadius,0,0,2*Math.PI);if(this.barGrab===true)
+this.pDot=new Path2D(p);if(this.sDot==true)
+ctx.fillStyle=OpenAnimWidget.sColor;else
+ctx.fillStyle="red";ctx.fill(p);ctx.lineWidth=indDotThick;ctx.strokeStyle="black";ctx.stroke(p);}
+let pauseRunWidth=40;let stepsWidth=32;let intraGap=8;let cy=OpenAnimWidget.BarHeight-4;let cx=this.barLength/2;if(this.visSteps===true)
+cx+=intraGap+(pauseRunWidth/2);let arrowHeight=7;if(this.visFastSlow===true){let arrowOffset=12;let arrowDepth=4;let arrowPairSpace=3;let arrowThick=1.25;ctx.lineWidth=arrowThick;if(this.sFaster==true)
+ctx.strokeStyle=OpenAnimWidget.sColor;else
+ctx.strokeStyle="black";p=new Path2D();p.moveTo(cx+arrowOffset,cy);p.lineTo(cx+arrowOffset+arrowDepth,cy+arrowHeight);p.lineTo(cx+arrowOffset,cy+2*arrowHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx+arrowOffset+arrowPairSpace,cy);p.lineTo(cx+arrowOffset+arrowDepth+arrowPairSpace,cy+arrowHeight);p.lineTo(cx+arrowOffset+arrowPairSpace,cy+2*arrowHeight);ctx.stroke(p);this.pFaster=new Path2D();this.pFaster.rect(cx+arrowOffset-arrowThick,cy,arrowPairSpace+arrowDepth+2*arrowThick,2*arrowHeight);if(this.sSlower==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";p=new Path2D();p.moveTo(cx-arrowOffset,cy);p.lineTo(cx-arrowOffset-arrowDepth,cy+arrowHeight);p.lineTo(cx-arrowOffset,cy+2*arrowHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-arrowOffset-arrowPairSpace,cy);p.lineTo(cx-arrowOffset-arrowDepth-arrowPairSpace,cy+arrowHeight);p.lineTo(cx-arrowOffset-arrowPairSpace,cy+2*arrowHeight);ctx.stroke(p);this.pSlower=new Path2D();this.pSlower.rect(cx-arrowOffset-arrowPairSpace-arrowDepth-arrowThick,cy,arrowPairSpace+arrowDepth+2*arrowThick,2*arrowHeight);ctx.strokeStyle="black";}
+ctx.lineWidth=1;if(this.visPauseRun===true){let pauseSpace=3.25;let pauseThick=1.5;let pauseHeight=2*arrowHeight;let runThick=1.5;let runLeftRight=5;let runHeight=2*arrowHeight;if(this.sPauseRun==true)
+ctx.strokeStyle=LoopAnimWidget.sColor;else
+ctx.strokeStyle="black";if(this.aRunning===true){ctx.lineWidth=pauseThick;p=new Path2D();p.moveTo(cx+pauseSpace,cy);p.lineTo(cx+pauseSpace,cy+pauseHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-pauseSpace,cy);p.lineTo(cx-pauseSpace,cy+pauseHeight);ctx.stroke(p);ctx.lineWidth=1;}
+else{ctx.lineWidth=runThick;p=new Path2D();p.moveTo(cx-runLeftRight,cy);p.lineTo(cx-runLeftRight,cy+runHeight);p.lineTo(cx+runLeftRight,cy+runHeight/2);p.closePath();ctx.stroke(p);}
+this.pPauseRun=new Path2D();this.pPauseRun.rect(cx-runLeftRight-runThick,cy-runThick,2*runLeftRight+2*runThick,runHeight+2*runThick);}
+cy+=12.5;cx=this.barLength/2;if((this.visPauseRun===true)||(this.visFastSlow===true))
+cx-=intraGap+stepsWidth/2;ctx.lineWidth=1;if(this.visSteps===true){let stepSpace=12;let stepThick=2.0;let stepHeight=12.5;let stepArrowHeight=5.0;let stepArrowWidth=4.0;ctx.lineWidth=stepThick;if(this.sDownStep===true){ctx.strokeStyle=OpenAnimWidget.sColor;ctx.fillStyle=OpenAnimWidget.sColor;}
+else{ctx.strokeStyle="black";ctx.fillStyle="black";}
+p=new Path2D();p.moveTo(cx-stepSpace,cy);p.lineTo(cx-stepSpace,cy-stepHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx-stepSpace,cy+stepThick);p.lineTo(cx-stepSpace+stepArrowWidth,cy-stepArrowHeight+stepThick);p.lineTo(cx-stepSpace-stepArrowWidth,cy-stepArrowHeight+stepThick);p.closePath();ctx.fill(p);this.pDownStep=new Path2D();this.pDownStep.rect(cx-stepSpace-stepArrowWidth,cy-stepHeight,2*stepArrowWidth,stepHeight+stepThick);if(this.sUpStep===true){ctx.strokeStyle=OpenAnimWidget.sColor;ctx.fillStyle=OpenAnimWidget.sColor;}
+else{ctx.strokeStyle="black";ctx.fillStyle="black";}
+p=new Path2D();p.moveTo(cx+stepSpace,cy+stepThick);p.lineTo(cx+stepSpace,cy+stepThick-stepHeight);ctx.stroke(p);p=new Path2D();p.moveTo(cx+stepSpace,cy-stepHeight);p.lineTo(cx+stepSpace+stepArrowWidth,cy-stepHeight+stepArrowHeight);p.lineTo(cx+stepSpace-stepArrowWidth,cy-stepHeight+stepArrowHeight);p.closePath();ctx.fill(p);this.pUpStep=new Path2D();this.pUpStep.rect(cx+stepSpace-stepArrowWidth,cy-stepHeight,2*stepArrowWidth,stepHeight+stepThick);ctx.lineWidth=1;ctx.strokeStyle="black";ctx.fillStyle="black";stepThick=1.5;let stepSize=5;ctx.lineWidth=stepThick;p=new Path2D();p.moveTo(cx-stepSize,cy-2*stepSize);p.lineTo(cx,cy-2*stepSize);p.lineTo(cx,cy-stepSize);p.lineTo(cx+stepSize,cy-stepSize);p.lineTo(cx+stepSize,cy);ctx.stroke(p);ctx.strokeStyle="black";}
+ctx.lineWidth=1;ctx.setTransform(saveT);}
+mouseDown(x,y){if(this.hide===true)
+return false;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.pFaster!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);if(isin===true){this.sFaster=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pSlower!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);if(isin===true){this.sSlower=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pPauseRun!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);if(isin===true){this.sPauseRun=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pUpStep!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);if(isin===true){this.sUpStep=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pDownStep!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);if(isin===true){this.sDownStep=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+if(this.pDot!==null){WidgetManager.bogusCtx.lineWidth=2;let isin=WidgetManager.bogusCtx.isPointInStroke(this.pDot,x,y);if(isin===false)
+isin=WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);if(isin===true){this.sDot=true;let ratio=this.barLength/(this.barLength-x);let s=Math.log(ratio)/Math.log(this.decay);if(s<0)
+s=0;this.curStep=s;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+return false;}
+mouseMove(x,y){if(this.hide===true)
+return;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.sDot===true){WidgetManager.bogusCtx.lineWidth=20;let isin=WidgetManager.bogusCtx.isPointInStroke(this.pBar,x,y);if(isin==false)
+return;let ratio=this.barLength/(this.barLength-x);let s=Math.log(ratio)/Math.log(this.decay);if(s<0)
+s=0;this.curStep=s;renderFrame(this);}}
+mouseUp(x,y){if(this.hide===true)
+return;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();this.sDot=false;if(this.sFaster===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pFaster,x,y);if(isin===true){this.timeStep/=1.4;if(this.timeStep<1)
+this.timeStep=1;if(this.aRunning===true)
+clearInterval(this.animID);this.animID=setInterval(doAnimation,this.timeStep,this);this.aRunning=true;}
+this.sFaster=false;}
+if(this.sSlower===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pSlower,x,y);if(isin===true){this.timeStep*=1.4;if(this.timeStep>1000)
+this.timeStep=1000;if(this.aRunning===true)
+clearInterval(this.animID);this.animID=setInterval(doAnimation,this.timeStep,this);this.aRunning=true;}
+this.sSlower=false;}
+if(this.sPauseRun){let isin=WidgetManager.bogusCtx.isPointInPath(this.pPauseRun,x,y);if(isin===true){if(this.aRunning===true)
+clearInterval(this.animID);else
+this.animID=setInterval(doAnimation,this.timeStep,this);if(this.aRunning===true)
+this.aRunning=false;else
+this.aRunning=true;}
+this.sPauseRun=false;}
+if(this.sUpStep===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pUpStep,x,y);if(isin===true){this.stepsPerFrame*=1.25;}
+this.sUpStep=false;}
+if(this.sDownStep===true){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDownStep,x,y);if(isin===true)
+this.stepsPerFrame/=1.25;this.sDownStep=false;}
+renderFrame(this);}}
+OpenAnimWidget.BarHeight=6.0;OpenAnimWidget.ControlsHeight=20.0;OpenAnimWidget.TotalHeight=32.0;OpenAnimWidget.sColor="blue";class DraggableDotWidget extends Widget{constructor(){super(...arguments);this.pDot=null;this.selected=false;this.dotRadius=3.0;}
+static register(ctx,x,y,name){let type="DraggableDotWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){return w;}
+w=new DraggableDotWidget(caller,type,x,y,1.0,false,name);WidgetManager.register(w);return w;}
+draw(ctx){if(this.hide===true)
+return;let saveT=ctx.getTransform();ctx.translate(this.widgetX,this.widgetY);ctx.scale(this.scale,this.scale);let p=new FPath();let r=this.dotRadius;p.ellipse(0,0,r,r,0,0,2*Math.PI,true);this.pDot=p;if(this.selected===true)
+ctx.fillStyle=DraggableDotWidget.sColor;else
+ctx.fillStyle="red";ctx.fill(p);ctx.setTransform(saveT);}
+mouseDown(x,y){if(this.hide===true)
+return false;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.pDot!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);if(isin===true){this.selected=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+return false;}
+mouseMove(x,y){if(this.hide===true)
+return;let wh=getFigureRect(this);wh.w-=2*this.dotRadius;wh.ha-=2*this.dotRadius;wh.hb-=2*this.dotRadius;if(x<=this.dotRadius)
+return;if(x>=wh.w)
+return;if(y<=-wh.hb)
+return;if(y>=wh.ha)
+return;if(this.selected===true){this.widgetX=x;this.widgetY=y;renderFrame(this);}}
+mouseUp(x,y){if(this.hide===true)
+return;if(this.selected===true){this.selected=false;let wh=getFigureRect(this);wh.w-=2*this.dotRadius;wh.ha-=2*this.dotRadius;wh.hb-=2*this.dotRadius;if((x>this.dotRadius)&&(x<wh.w)&&(y>-wh.hb)&&(y<wh.ha)){this.widgetX=x;this.widgetY=y;}
+renderFrame(this);}}}
+DraggableDotWidget.sColor="blue";class DraggableDrawWidget extends Widget{constructor(){super(...arguments);this.pDot=null;this.selected=false;this.drawFcn=null;this.drawSelFcn=null;this.testPosFcn=null;}
+static register(ctx,x,y,drawFcn,drawSelFcn,testPosFcn,name){let type="DraggableDrawWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){return w;}
+w=new DraggableDrawWidget(caller,type,x,y,1.0,false,name);w.drawFcn=drawFcn;w.drawSelFcn=drawSelFcn;w.testPosFcn=testPosFcn;WidgetManager.register(w);return w;}
+draw(ctx){if(this.hide===true)
+return;let saveT=ctx.getTransform();ctx.translate(this.widgetX,this.widgetY);ctx.scale(this.scale,this.scale);if(this.selected===true)
+this.pDot=this.drawSelFcn(ctx);else
+this.pDot=this.drawFcn(ctx);ctx.setTransform(saveT);}
+mouseDown(x,y){if(this.hide===true)
+return false;x-=this.widgetX;y-=this.widgetY;x/=this.scale;y/=this.scale;WidgetManager.bogusCtx.resetTransform();if(this.pDot!==null){let isin=WidgetManager.bogusCtx.isPointInPath(this.pDot,x,y);if(isin===true){this.selected=true;WidgetManager.mouseOwner=this;renderFrame(this);return true;}}
+return false;}
+mouseMove(x,y){if(this.hide===true)
+return;let wh=getFigureRect(this);if(this.testPosFcn(x,y,wh.w,wh.ha,wh.hb)===false)
+return;if(this.selected===true){this.widgetX=x;this.widgetY=y;renderFrame(this);}}
+mouseUp(x,y){if(this.hide===true)
+return;if(this.selected===true){this.selected=false;let wh=getFigureRect(this);if(this.testPosFcn(x,y,wh.w,wh.ha,wh.hb)===true){this.widgetX=x;this.widgetY=y;}
+renderFrame(this);}}}
+DraggableDrawWidget.sColor="blue";class NumberInputWidget extends Widget{constructor(){super(...arguments);this.theWidget=null;}
+static register(ctx,x,y,v,name){let type="NumberInputWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){w.draw(ctx);return w;}
+w=new NumberInputWidget(caller,type,x,y,1.0,false,name);WidgetManager.register(w);w.theWidget=document.createElement("input");w.theWidget.setAttribute("type","number");w.theWidget.value=v.toString();w.theWidget.style.position="absolute";w.theWidget.style.display="block";w.theWidget.style.left=400+"px";w.theWidget.style.top=900+"px";w.theWidget.style.width=50+"px";w.theWidget.style.height=10+"px";w.theWidget.style.zIndex="99";document.body.appendChild(w.theWidget);w.theWidget.onchange=function(){let myFunc=getAugmentedFunction(w.owner);let fpc=myFunc.figurePanelClass;fpc.render();};w.draw(ctx);return w;}
+getValue(){return this.theWidget.value;}
+draw(ctx){let myFunc=getAugmentedFunction(this.owner);let fpc=myFunc.figurePanelClass;let totalV=fpc.totalV;let vpos=fpc.totalV+fpc.h-this.widgetY;let hpos=this.widgetX;let canvas=document.getElementById("pdf_renderer");let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;canvasCenter=canvasCenter/PDFDocument.getZoom();hpos=hpos+(canvasCenter-docCenter);}
+else{hpos=hpos-window.scrollX;}
+hpos+=fpc.margin;this.theWidget.style.top=vpos+"px";this.theWidget.style.left=hpos+"px";}}
+class ButtonWidget extends Widget{constructor(){super(...arguments);this.theWidget=null;this.clickState=false;this.resetState=false;}
+static register(ctx,x,y,text,name){let type="ButtonWidget";let caller=getCaller();let w=WidgetManager.knownWidget(caller,type,name);if(w!=null){w.draw(ctx);return w;}
+w=new ButtonWidget(caller,type,x,y,1.0,false,name);WidgetManager.register(w);w.theWidget=document.createElement("button");w.theWidget.setAttribute("type","button");w.theWidget.style.fontSize="10px";w.theWidget.textContent=text;w.theWidget.style.position="absolute";w.theWidget.style.display="block";w.theWidget.style.left=400+"px";w.theWidget.style.top=900+"px";w.theWidget.style.height=18+"px";w.theWidget.style.zIndex="99";document.body.appendChild(w.theWidget);w.theWidget.addEventListener('click',()=>{if(w.clickState===false)
+w.clickState=true;else{w.clickState=false;w.resetState=true;}
+let myFunc=getAugmentedFunction(w.owner);let fpc=myFunc.figurePanelClass;fpc.render();},false);w.draw(ctx);return w;}
+doClick(){if(this.clickState===false)
+this.clickState=true;else
+this.clickState=false;}
+draw(ctx){let myFunc=getAugmentedFunction(this.owner);let fpc=myFunc.figurePanelClass;let vpos=fpc.totalV+fpc.h-this.widgetY;let hpos=this.widgetX;let canvas=document.getElementById("pdf_renderer");let visWidth=document.documentElement.clientWidth;let totWidth=FullPanel.getFullWidth();if(visWidth>totWidth){let canvasCenter=canvas.width/2;let docCenter=FullPanel.getFullWidth()/2;canvasCenter=canvasCenter/PDFDocument.getZoom();hpos=hpos+(canvasCenter-docCenter);}
+else{hpos=hpos-window.scrollX;}
+hpos+=fpc.margin;let w=this.theWidget;w.style.top=(vpos-parseInt(w.style.height,10))+"px";w.style.left=hpos+"px";}}"use strict";class Point2D{constructor(x,y){this._x=x;this._y=y;}
+toString(){return"( "+this._x.toFixed(2)+","+this._y.toFixed(2)+")";}
+get x(){return this._x;}
+get y(){return this._y;}
+copy(){return new Point2D(this._x,this._y);}
+negate(){return new Point2D(-this._x,-this.y);}
+negateSelf(){this._x=-this.x;this._y=-this.y;}
+minus(p){return new Point2D(this._x-p.x,this._y-p.y);}
+minusSelf(p){this._x-=p._x;this._y-=p._y;}
+translate2(u,v){return new Point2D(u+this._x,v+this._y);}
+translate(p){return new Point2D(p.x+this._x,p.y+this._y);}
+translateSelf2(u,v){this._x+=u;this._y+=v;}
+translateSelf(p){this._x+=p.x;this._y+=p.y;}
+scale(s){return new Point2D(s*this._x,s*this._y);}
+scaleSelf(s){this._x*=s;this._y*=s;}
+rotate(theta){let c=Math.cos(theta);let s=Math.sin(theta);return new Point2D(c*this._x-s*this._y,s*this._x+c*this._y);}
+rotateSelf(theta){let c=Math.cos(theta);let s=Math.sin(theta);let u=c*this._x-s*this._y;let v=s*this._x+c*this._y;this._x=u;this._y=v;}
+rotateAbout(c,theta){let answer=new Point2D(this.x-c.x,this.y-c.y);answer=answer.rotate(theta);answer._x+=c.x;answer._y+=c.y;return answer;}
+dot(a){return a.x*this._x+a.y*this._y;}
+length(){return Math.sqrt(this._x**2+this._y**2);}
+static dot(a,b){return a.dot(b);}
+angleBetween(a){let cos=this.dot(a)/(this.length()*a.length());return Math.acos(cos);}
+cliffordBetween(a){return Math.atan2(this.x*a.y-a.x*this.y,this.x*a.x+this.y*a.y);}}
+class PathSegment{constructor(kind,d){this.type=PathSegment.UNKNOWN;this.type=kind;this.s=d;}
+static getClose(){let d={};return new PathSegment(PathSegment.CLOSE,d);}
+static getMoveTo(x,y){let d={x:x,y:y};return new PathSegment(PathSegment.MOVE_TO,d);}
+static getLineTo(x,y){let d={x:x,y:y};return new PathSegment(PathSegment.LINE_TO,d);}
+static getBezier(cx1,cy1,cx2,cy2,x,y){let d={cx1:cx1,cy1:cy1,cx2:cx2,cy2:cy2,x:x,y:y};return new PathSegment(PathSegment.BEZIER,d);}
+static getQuadratic(cx,cy,x,y){let d={cx:cx,cy:cy,x:x,y:y};return new PathSegment(PathSegment.QUADRATIC,d);}
+static getArc(x,y,r,a0,a1,ccw){let d={x:x,y:y,r:r,a0:a0,a1:a1,ccw:ccw};return new PathSegment(PathSegment.ARC,d);}
+static getArcTo(x1,y1,x2,y2,r){let d={x1:x1,y1:y1,x2:x2,y2:y2,r:r};return new PathSegment(PathSegment.ARC_TO,d);}
+static getEllipse(x,y,rx,ry,rot,a0,a1,ccw){let d={x:x,y:y,rx:rx,ry:ry,rot:rot,a0:a0,a1:a1,ccw:ccw};return new PathSegment(PathSegment.ELLIPSE,d);}
+static getRect(x,y,w,h){let d={x:x,y:y,w:w,h:h};return new PathSegment(PathSegment.RECT,d);}}
+PathSegment.MOVE_TO=1;PathSegment.LINE_TO=2;PathSegment.BEZIER=3;PathSegment.QUADRATIC=4;PathSegment.ARC=5;PathSegment.ARC_TO=6;PathSegment.ELLIPSE=7;PathSegment.RECT=8;PathSegment.CLOSE=9;PathSegment.UNKNOWN=-1;class FPath extends Path2D{constructor(){super();this.segs=[];}
+addPath(p){for(let i=0;i<p.segs.length;i++)
+this.segs.push(p.segs[i]);}
+closePath(){super.closePath();this.segs.push(PathSegment.getClose());}
+moveTo(x,y){super.moveTo(x,y);this.segs.push(PathSegment.getMoveTo(x,y));}
+frontLineTo(x,y){let s=this.segs[0];if(s.type!=PathSegment.MOVE_TO)
+console.log("ERROR: frontLineTo() doesn't start with moveTo(): "+s.type);let newfirst=PathSegment.getMoveTo(x,y);let m=s.s;let newsecond=PathSegment.getLineTo(m.x,m.y);this.segs[0]=newsecond;this.segs.unshift(newfirst);}
+lineTo(x,y){super.lineTo(x,y);this.segs.push(PathSegment.getLineTo(x,y));}
+bezierCurveTo(cx1,cy1,cx2,cy2,x,y){super.bezierCurveTo(cx1,cy1,cx2,cy2,x,y);this.segs.push(PathSegment.getBezier(cx1,cy1,cx2,cy2,x,y));}
+quadraticCurveTo(cx,cy,x,y){super.quadraticCurveTo(cx,cy,x,y);this.segs.push(PathSegment.getQuadratic(cx,cy,x,y));}
+translate(p){let answer=new FPath();for(let i=0;i<this.segs.length;i++){let s=this.segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;answer.moveTo(m.x+p.x,m.y+p.y);}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;answer.lineTo(m.x+p.x,m.y+p.y);}
+else if(s.type==PathSegment.BEZIER){let m=s.s;answer.bezierCurveTo(m.cx1+p.x,m.cy1+p.y,m.cx2+p.x,m.cy2+p.y,m.x+p.x,m.y+p.y);}
+else if(s.type==PathSegment.ELLIPSE){let m=s.s;answer.ellipse(m.x+p.x,m.y+p.y,m.rx,m.ry,m.rot,m.a0,m.a1,m.ccw);}
+else{console.log("whatever translattion you want, it's not done.");}}
+return answer;}
+rotate(a){let answer=new FPath();for(let i=0;i<this.segs.length;i++){let s=this.segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;let p=new Point2D(m.x,m.y).rotate(a);answer.moveTo(p.x,p.y);}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;let p=new Point2D(m.x,m.y).rotate(a);answer.lineTo(p.x,p.y);}
+else if(s.type==PathSegment.BEZIER){let m=s.s;let c1=new Point2D(m.cx1,m.cy1).rotate(a);let c2=new Point2D(m.cx2,m.cy2).rotate(a);let e=new Point2D(m.x,m.y).rotate(a);answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,e.x,e.y);}
+else{console.log("whatever rotation you want, it's not done.");}}
+return answer;}
+scale(r){let answer=new FPath();for(let i=0;i<this.segs.length;i++){let s=this.segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;let p=new Point2D(r*m.x,r*m.y);answer.moveTo(p.x,p.y);}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;console.log("scale not done for lines");}
+else if(s.type==PathSegment.BEZIER){let m=s.s;let c1=new Point2D(r*m.cx1,r*m.cy1);let c2=new Point2D(r*m.cx2,r*m.cy2);let p=new Point2D(r*m.x,r*m.y);answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);}
+else{console.log("whatever scale you want, it's not done.");}}
+return answer;}
+reflectX(){let answer=new FPath();for(let i=0;i<this.segs.length;i++){let s=this.segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;let p=new Point2D(m.x,-m.y);answer.moveTo(p.x,p.y);}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;let p=new Point2D(m.x,-m.y);answer.lineTo(p.x,p.y);}
+else if(s.type==PathSegment.BEZIER){let m=s.s;let c1=new Point2D(m.cx1,-m.cy1);let c2=new Point2D(m.cx2,-m.cy2);let p=new Point2D(m.x,-m.y);answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);}
+else if(s.type==PathSegment.ELLIPSE){let m=s.s;answer.ellipse(m.x,-m.y,m.rx,m.ry,m.rot,m.a0,m.a1,m.ccw);}
+else{console.log("whatever reflect you want, it's not done.");}}
+return answer;}
+reflectXY(){let answer=new FPath();for(let i=0;i<this.segs.length;i++){let s=this.segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;let p=new Point2D(-m.x,-m.y);answer.moveTo(p.x,p.y);}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;console.log("reflect not done for lines");}
+else if(s.type==PathSegment.BEZIER){let m=s.s;let c1=new Point2D(-m.cx1,-m.cy1);let c2=new Point2D(-m.cx2,-m.cy2);let p=new Point2D(-m.x,-m.y);answer.bezierCurveTo(c1.x,c1.y,c2.x,c2.y,p.x,p.y);}
+else{console.log("whatever reflect you want, it's not done.");}}
+return answer;}
+rotateAbout(a,p){let t1=this.translate(new Point2D(-p.x,-p.y));let t2=t1.rotate(a);return t2.translate(p);}
+static arcToBezierNEW(r,a0,a1){let totalAngle=a1-a0;if(totalAngle<0)
+totalAngle+=2*Math.PI;let numCurves=Math.ceil(4*totalAngle/Math.PI);let subtend=totalAngle/numCurves;let k=(4/3)*Math.tan(subtend/4);let s=Math.sin(subtend);let c=Math.cos(subtend);let p1=new Point2D(r,0);let p2=new Point2D(r,r*k);let p3=new Point2D(r*(c+k*s),r*(s-k*c));let p4=new Point2D(r*c,r*s);let answer=new FPath();answer.moveTo(p1.x,p1.y);for(let i=0;i<numCurves;i++){answer.bezierCurveTo(p2.x,p2.y,p3.x,p3.y,p4.x,p4.y);p2.rotateSelf(subtend);p3.rotateSelf(subtend);p4.rotateSelf(subtend);}
+answer=answer.rotate(a0);return answer;}
+arc(x,y,r,a0,a1,ccw){if(ccw===undefined)
+ccw=false;while(a0<0)
+a0+=2*Math.PI;while(a1<0)
+a1+=2*Math.PI;while(a0>=2*Math.PI)
+a0-=2*Math.PI;while(a1>=2*Math.PI)
+a1-=2*Math.PI;if(ccw===true){let temp=a1;a1=a0;a0=temp;}
+let arcs=FPath.arcToBezierNEW(r,a0,a1);arcs=arcs.translate(new Point2D(x,y));this.addPath(arcs);}
+ellipse(x,y,rx,ry,rot,a0,a1,ccw){if(ccw===undefined)
+ccw=false;super.ellipse(x,y,rx,ry,rot,a0,a1,ccw);this.segs.push(PathSegment.getEllipse(x,y,rx,ry,rot,a0,a1,ccw));}
+rect(x,y,w,h){super.rect(x,y,w,h);this.segs.push(PathSegment.getRect(x,y,w,h));}
+static circArcToBezier(r,a0,a1){let answer=FPath.arcToBezierNEW(r,a0,a1);return answer;}
+static parametricToBezier(f,t0,t1,n){let p=new FPath();let p1=f(t0);p.moveTo(p1.x,p1.y);for(let i=0;i<n;i++){let p4=f(t0+(i+1)*(t1-t0)/n);let B=f(t0+(i+0.5)*(t1-t0)/n);let d1=Math.sqrt((B.x-p1.x)**2+(B.y-p1.y)**2);let d2=Math.sqrt((B.x-p4.x)**2+(B.y-p4.y)**2);let t=d1/(d1+d2);let V=new Point2D(p4.x-p1.x,p4.y-p1.y);let e1=new Point2D(B.x-(1-t)*V.x/3,B.y-(1-t)*V.y/3);let e2=new Point2D(B.x+t*V.x/3,B.y+t*V.y/3);let r=1-1/(t**3+(1-t)**3);let u=(1-r)*(1-t)**3;let C=new Point2D(p1.x*u+p4.x*(1-u),p1.y*u+p4.y*(1-u));let A=new Point2D(B.x+(C.x-B.x)/r,B.y+(C.y-B.y)/r);let v1=new Point2D((e1.x-A.x*t)/(1-t),(e1.y-A.y*t)/(1-t));let v2=new Point2D((e2.x-A.x*(1-t))/t,(e2.y-A.y*(1-t))/t);let p2=new Point2D((v1.x-p1.x*(1-t))/t,(v1.y-p1.y*(1-t))/t);let p3=new Point2D((v2.x-p4.x*t)/(1-t),(v2.y-p4.y*t)/(1-t));p.bezierCurveTo(p2.x,p2.y,p3.x,p3.y,p4.x,p4.y);p1=p4.copy();}
+return p;}}
+function drawText(ctx,txt,x,y,dx=0,dy=0){let saveT=ctx.getTransform();if(ctx instanceof CTX){ctx.fillText(txt,x+dx,y+dy);ctx.setTransform(saveT);return;}
+let m=ctx.measureText(txt);ctx.translate(0,y);ctx.scale(1,-1);ctx.textBaseline='bottom';ctx.fillText(txt,x,0);ctx.setTransform(saveT);}
+function drawTextBrowserOnly(ctx,txt,x,y,dx=0,dy=0){if(ctx instanceof CTX)
+return;drawText(ctx,txt,x,y,dx,dy);}
+function drawTextTikZOnly(ctx,txt,x,y,dx=0,dy=0){if(ctx instanceof CTX)
+ctx.fillText(txt,x+dx,y+dy);}
+class CTX{constructor(name){this.tmatrix=[[1,0,0],[0,1,0],[0,0,1]];this.netScale=1.0;this.lineWidth=1.0;this.figureName="";this.tikzstr="";this.figureName=name;this.tikzstr="";this.tikzstr+="\\begin{tikzpicture}\n";let myFunc=getAugmentedFunction(name);let fpc=myFunc.figurePanelClass;this.tikzstr+="\\useasboundingbox (0bp,0bp) rectangle ("+fpc.textWidth.toFixed(2)+"bp,"+(fpc.h-fpc.lowerPadding-fpc.upperPadding).toFixed(2)+"bp);\n";}
+close(){this.tikzstr+="\\end{tikzpicture}\n";let req=new XMLHttpRequest();let fname=this.figureName+".tikz";req.open("POST",fname);req.setRequestHeader("Content-Type","text/plain;charset=UTF-8");req.send(this.tikzstr);}
+static clone3x3Matrix(m){let a=[];a[0]=[];a[0][0]=m[0][0];a[0][1]=m[0][1];a[0][2]=m[0][2];a[1]=[];a[1][0]=m[1][0];a[1][1]=m[1][1];a[1][2]=m[1][2];a[2]=[];a[2][0]=m[2][0];a[2][1]=m[2][1];a[2][2]=m[2][2];return a;}
+getTransform(){return CTX.clone3x3Matrix(this.tmatrix);}
+setTransform(t){this.tmatrix=CTX.clone3x3Matrix(t);}
+translate(tx,ty){this.tmatrix[0][2]+=tx;this.tmatrix[1][2]+=ty;}
+scale(sx,sy){this.tmatrix[0][0]*=sx;this.tmatrix[0][1]*=sy;this.tmatrix[1][0]*=sx;this.tmatrix[1][1]*=sy;this.netScale*=sx;}
+applyTMatrix(x,y){let ax=this.tmatrix[0][0]*x+this.tmatrix[0][1]*y+this.tmatrix[0][2];let ay=this.tmatrix[1][0]*x+this.tmatrix[1][1]*y+this.tmatrix[1][2];return{x:ax,y:ay};}
+handlePath(path){var segs=path.segs;for(let i=0;i<segs.length;i++){let s=segs[i];if(s.type==PathSegment.MOVE_TO){let m=s.s;let t=this.applyTMatrix(m.x,m.y);this.tikzstr+="("+t.x.toFixed(2)+"bp, "+t.y.toFixed(2)+"bp) ";}
+else if(s.type==PathSegment.LINE_TO){let m=s.s;let t=this.applyTMatrix(m.x,m.y);this.tikzstr+="-- ("+t.x.toFixed(2)+"bp, "+t.y.toFixed(2)+"bp) ";}
+else if(s.type==PathSegment.BEZIER){let m=s.s;let t1=this.applyTMatrix(m.cx1,m.cy1);let t2=this.applyTMatrix(m.cx2,m.cy2);let t3=this.applyTMatrix(m.x,m.y);this.tikzstr+=".. controls ("+t1.x.toFixed(2)+"bp, "+t1.y.toFixed(2)+"bp) and ("+
+t2.x.toFixed(2)+"bp, "+t2.y.toFixed(2)+"bp) .. ("+
+t3.x.toFixed(2)+"bp, "+t3.y.toFixed(2)+"bp)";}
+else if(s.type==PathSegment.QUADRATIC){console.log("quadratic does not work");}
+else if(s.type==PathSegment.ARC){console.log("arc");this.tikzstr+="no arc implemented";}
+else if(s.type==PathSegment.ARC_TO){console.log("arc to not done");this.tikzstr+="no arcTo implemented";}
+else if(s.type==PathSegment.ELLIPSE){let m=s.s;let c=this.applyTMatrix(m.x,m.y);this.tikzstr+="("+c.x.toFixed(2)+"bp,"+c.y.toFixed(2)+"bp) ellipse [x radius="+(m.rx*this.netScale).toFixed(2)+"bp,y radius ="+(m.ry*this.netScale).toFixed(2)+"bp]";}
+else if(s.type==PathSegment.RECT){console.log("rect not done");this.tikzstr+="no rect implemented";}
+else if(s.type==PathSegment.CLOSE){this.tikzstr+="-- cycle";}
+else{console.log("unknown FPath: "+s.type);}}
+this.tikzstr+=";\n";}
+stroke(path){let segs=path.segs;if(segs.length===0)
+return;this.tikzstr+="\\draw[line width="+this.lineWidth.toFixed(2)+"bp] ";this.handlePath(path);}
+fill(path){let segs=path.segs;if(segs.length===0)
+return;this.tikzstr+="\\fill ";this.handlePath(path);}
+fillText(s,x,y){let t=this.applyTMatrix(x,y);this.tikzstr+="\\node [anchor=base west] at ("+t.x.toFixed(2)+"pt, "+t.y.toFixed(2)+"pt) {"+s+"};\n";}}
+class Numerical{static newton(f,g,a,b,y,e){let x0=g;let y0=f(x0);let i=0;while(Math.abs(y-y0)>e){let fplus=f(x0+e);let fminus=f(x0-e);let fprime=(fplus-fminus)/(2*e);let dx=(y-y0)/fprime;let x1=x0+dx;if(x1>b)
+x1=(x1-x0)/2;if(x1<a)
+x1=(x0-x1)/2;x0=x1;y0=f(x0);++i;if(i>100)
+return x0;}
+return x0;}} \ No newline at end of file
diff --git a/graphics/figput/javascript/server.py b/graphics/figput/javascript/server.py
new file mode 100644
index 0000000000..4974d3f88c
--- /dev/null
+++ b/graphics/figput/javascript/server.py
@@ -0,0 +1,209 @@
+"""
+Use this to serve the document as it is being edited. It does several things
+that no normal server does. It modifies the one and only HTML file before it
+is passed to the client so that the correct document is opened. It will serve
+files from directories outside the server directory. This way, the user can
+keep his latex files in one place and this framework stuff in a different
+directory. Also, the client can send .tikz files to the server and they
+will be saved in the latex directory. Some of this (maybe all?) could be done
+by taking an off-the-shelf server and tweaking it, but I want to keep things
+simple, both for me and for the user. Another non-standard thing is that it
+handles "WHERE" requests from the browswer; these are used so that that
+documents can be loaded to open so that the are scrolled to a certain position.
+
+To invoke this, say
+
+python server.py directory/nameof.pdf port_num
+
+where directory/nameof.pdf is the pdf file we want to load. If the server
+stuff is in top_level/something/figput_guts/ and the latex stuff is in
+top_level/elsewhere/latex/ then, after cd-ing to
+top_level/something/figput_guts/ you need to say
+
+python server.py ../../elsewhere/latex/thefile.pdf 8080
+
+where the 8080 is optional, and will default to 8000. Allowing for an
+optional port number permits the user to work on several documents at once.
+
+BUG: It is tempting to write the entire thing in a language where
+I can compile it to something that uses no outside resources. Asking
+the user to install external stuff is not ideal, even if it's only
+Python. I suspect that this could be done most easily in Rust, although
+C/C++ would work, or most anything that compiles to an executable. It
+just needs to be easily compiled for mac/linux/windows without any
+contortions.
+
+"""
+
+import sys
+import os
+import shutil
+from http.server import BaseHTTPRequestHandler, HTTPServer
+
+
+# By default, documents open at the top of the first page, but this
+# can be used (see do_WHERE()) to change that.
+verticalScrollPos = 0
+
+
+# BaseHTTPRequestHandler routes requests based on the text that appears in the
+# request. So "POST" is routed to do_POST(), "GET" is routed to doGET(), and
+# it would be trivial to add my own request type: "WACKY" would automatically
+# be routed to do_WACKY(). That's exactly wheat is done below for the WHERE
+# request.
+
+class MyServer(BaseHTTPRequestHandler):
+
+ def send_head(self):
+ # Open and return the relevant file, or return None.
+
+ # For whatever reason, the path that comes in always starts with a '/',
+ # probably to emphasize that it's relative to the "root" of the server.
+ # I break that concept.
+ #
+ # It is tempting to have the client reqest "draw_whatever" instead
+ # of "draw_whatever.js" or "draw_whatever.fjs" I could then look for
+ # both types here, saving a bit of effort on the js end. However, no
+ # normal server does this, so I would still need to maintain a version
+ # of the js that does ask for both types for use in a typical production
+ # situation.
+ path = self.path[1:]
+ f = None
+ if (self.path == '/'):
+ # Request for the one and only html file, corresponding to localhost:8000
+ path = os.path.join(path,"figput.html")
+ else:
+ if (not os.path.exists(path)):
+ # Try the latex directory. Strip off leading '/' and pre=pend latex path.
+ path = self.path[1:]
+ path = os.path.join(args.latex_dir,path)
+
+ try:
+ f = open(path, 'rb')
+ except OSError:
+ self.send_error(404, "File not found")
+ return None
+
+ # The MIME type of the file *could* be ignored since "text/html" always
+ # seems to work, but it does generate distracting error messages in the
+ # broswer.
+ ctype = ""
+ base, ext = os.path.splitext(path)
+ if (ext == ".js"):
+ ctype = "text/javascript"
+ elif (ext == ".fjs"):
+ ctype = "text/javascript"
+ elif (ext == ".html"):
+ ctype = "text/html"
+ else:
+ ctype = "text/plain"
+
+ self.send_response(200)
+ self.send_header("Content-type", ctype)
+ self.end_headers()
+ return f
+
+ def do_HEAD(self):
+ # Probably never called in my situation, although everything this
+ # does must also be done for GET, so no harm in handling it.
+ f = self.send_head()
+ if f:
+ f.close()
+
+ def do_GET(self):
+ f = self.send_head()
+ if f:
+ try:
+ if (self.path == '/'):
+ # Special case of the root html file; replace 'unknown'.
+ buf = f.read()
+ buf = buf.replace(b'unknown1',bytes(args.project_name,'utf-8') )
+ buf = buf.replace(b'unknowny',bytes(str(verticalScrollPos),'utf-8') )
+ self.wfile.write(buf)
+ else:
+ shutil.copyfileobj(f, self.wfile)
+ finally:
+ f.close()
+
+ def do_POST(self):
+ # self.path will be '/whatever.tikz'. Strip off the leading '/' and
+ # pre-pend the latex directory. This is where the content is saved.
+ dpath = self.path[1:]
+ dpath = os.path.join(args.latex_dir,dpath)
+ text_output_file = open(dpath,"w")
+
+ # Get the length of the incoming payload and read it all.
+ postLength = int(self.headers.get('content-length'))
+ testmsg = self.rfile.read(postLength)
+
+ # This is semi-pointless, but testmsg is a series of bytes, and
+ # write() below is looking for a string.
+ newmsg = testmsg.decode("ASCII",'ignore')
+
+ ignore = text_output_file.write(newmsg)
+
+ text_output_file.flush()
+ text_output_file.close()
+ self.send_response(200, "File saved")
+ self.flush_headers()
+
+ def do_WHERE(self):
+ # This is a trick to allow the browser to maintain the postion within the
+ # document when it is reloaded. It passes the current scroll position, which
+ # is then fed back to it when the document is reloaded.
+ #
+ # self.path is ignored. The client will send 'bogus' or the like.
+ # We want the contents of the message. Start off very much as for POST.
+ print("Got " +self.path);
+ postLength = int(self.headers.get('content-length'))
+ testmsg = self.rfile.read(postLength)
+ newmsg = testmsg.decode("ASCII",'ignore')
+
+ # newmsg is the postion within the document, as a string.
+ global verticalScrollPos
+ verticalScrollPos = float(newmsg)
+
+
+def testWhetherPDF(fpath):
+
+ if (not os.path.exists(fpath)):
+ print("No such file!")
+ sys.exit(0)
+
+ ftype = os.path.splitext(os.path.basename(fpath))[-1]
+ if (ftype.lower() != ".pdf"):
+ print("Not a PDF file!")
+ sys.exit(0);
+
+
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument('file_path',help='specify path to pdf generated by LaTeX')
+parser.add_argument('port', action='store', default=8000, type=int,
+ nargs='?',
+ help='specify alternate port (default: 8000)')
+args = parser.parse_args()
+
+testWhetherPDF(args.file_path)
+
+# Parse out the directory leading to the PDF. It's used to search for js files.
+# BEWARE: This is used above, as a global variable.
+args.latex_dir = os.path.dirname(os.path.abspath(args.file_path))
+
+# Do the same thing to get the name of the pdf file, without the '.pdf'.
+# This is ultimately passed to the FigPut code so that it knows which file to
+# open as the .pdf and as the .aux.
+args.project_name = os.path.splitext(os.path.basename(args.file_path))[0]
+
+theServer = HTTPServer(("localhost", args.port), MyServer)
+print(f"Server started for http://localhost:{args.port}")
+
+try:
+ theServer.serve_forever()
+except KeyboardInterrupt:
+ pass
+
+theServer.server_close()
+print("Http server stopped.")
+
diff --git a/graphics/figput/javascript/tikz.js b/graphics/figput/javascript/tikz.js
new file mode 100644
index 0000000000..b5317702b0
--- /dev/null
+++ b/graphics/figput/javascript/tikz.js
@@ -0,0 +1,1040 @@
+"use strict";
+/*
+Code necessary to output tikz for figures. It spoofs the normal canvas
+drawing code so that the output comes here, and is then converted to
+tizk output.
+
+One problem with JS is that there is no path interator. You can't obtain
+the segments that make up an entire path. I don't see any way around this
+other than writing my own wrapper around Path2D. It might be possible to
+somehow hack the internals of Path2D, but that would be brittle, even if
+it works.
+
+BUG: The long-term solution is to eliminate use of the JS Path2D class,
+but it's not possible to entirely eliminate it since it's the only way to
+draw to the browser window. What I *could* do is sub-class
+CanvasRenderingContext2D so that this sub-class take my own path class
+objects and converts them to Path2D for drawing. Another hurdle is
+isPointInPath(), which is used in a few places. I could provide a separate
+implementation of that, but it's fiddly. isPointInStroke() is a bit harder.
+
+BUG: It's tempting to come up with a framework under which a "path"
+is closer to our intuition of something that can be drawn as a continuous
+thing, without lifting your pencil. Then, have a second-order thing that
+may hold several of these continuous paths. Intuitively one wants a "path"
+to have a clear start-point and end-point, but you also need to be able
+to handle things like winding number for multiple paths when filling.
+
+BUG: There are many cases where you might want the online version to be
+different from what is printed. I just gave the example of filling a path,
+and color is similar. There's lots of things that might make sense on a
+computer screen, but wouldn't work well on printed paper.
+
+*/
+// Turns out that Point used to be part of js, but was deprecated, and
+// seems not to exist any longer.
+class Point2D {
+ constructor(x, y) {
+ this._x = x;
+ this._y = y;
+ }
+ toString() {
+ // May be handy for debugging.
+ return "( " + this._x.toFixed(2) + "," + this._y.toFixed(2) + ")";
+ }
+ get x() {
+ return this._x;
+ }
+ get y() {
+ return this._y;
+ }
+ copy() {
+ return new Point2D(this._x, this._y);
+ }
+ negate() {
+ // return -this.
+ return new Point2D(-this._x, -this.y);
+ }
+ negateSelf() {
+ this._x = -this.x;
+ this._y = -this.y;
+ }
+ minus(p) {
+ // return this - p. Redunant since it's just a form of translation.
+ return new Point2D(this._x - p.x, this._y - p.y);
+ }
+ minusSelf(p) {
+ this._x -= p._x;
+ this._y -= p._y;
+ }
+ translate2(u, v) {
+ return new Point2D(u + this._x, v + this._y);
+ }
+ translate(p) {
+ return new Point2D(p.x + this._x, p.y + this._y);
+ }
+ translateSelf2(u, v) {
+ this._x += u;
+ this._y += v;
+ }
+ translateSelf(p) {
+ this._x += p.x;
+ this._y += p.y;
+ }
+ scale(s) {
+ return new Point2D(s * this._x, s * this._y);
+ }
+ scaleSelf(s) {
+ // As above, but it's done in-place rather than returning a copy.
+ this._x *= s;
+ this._y *= s;
+ }
+ rotate(theta) {
+ // Apply rotation matrix in the usual (RH) way. theta in radians.
+ let c = Math.cos(theta);
+ let s = Math.sin(theta);
+ return new Point2D(c * this._x - s * this._y, s * this._x + c * this._y);
+ }
+ rotateSelf(theta) {
+ let c = Math.cos(theta);
+ let s = Math.sin(theta);
+ let u = c * this._x - s * this._y;
+ let v = s * this._x + c * this._y;
+ this._x = u;
+ this._y = v;
+ }
+ rotateAbout(c, theta) {
+ // Rotate this about c by angle theta, returning the result.
+ let answer = new Point2D(this.x - c.x, this.y - c.y);
+ answer = answer.rotate(theta);
+ answer._x += c.x;
+ answer._y += c.y;
+ return answer;
+ }
+ dot(a) {
+ // Return this dot a.
+ return a.x * this._x + a.y * this._y;
+ }
+ length() {
+ return Math.sqrt(this._x ** 2 + this._y ** 2);
+ }
+ static dot(a, b) {
+ // This looks like Java-style overloading, but it's not. One dot()
+ // is static and the other is not.
+ return a.dot(b);
+ }
+ angleBetween(a) {
+ // Return angle between this and a, based on
+ // this dot a = |this| |a| cos angle
+ // This is the angle between the two, without any orientation.
+ let cos = this.dot(a) / (this.length() * a.length());
+ return Math.acos(cos);
+ }
+ cliffordBetween(a) {
+ // The "clifford angle," which is like angleBetween(), but it takes
+ // orientation into account. The angle is given relative to ("from") this.
+ return Math.atan2(this.x * a.y - a.x * this.y, this.x * a.x + this.y * a.y);
+ }
+}
+// Almost everything here is static because this is essentially a factory for the
+// various segment types.
+class PathSegment {
+ constructor(kind, d) {
+ // One of the values above.
+ this.type = PathSegment.UNKNOWN;
+ this.type = kind;
+ this.s = d;
+ }
+ static getClose() {
+ let d = {};
+ return new PathSegment(PathSegment.CLOSE, d);
+ }
+ static getMoveTo(x, y) {
+ let d = { x: x, y: y };
+ return new PathSegment(PathSegment.MOVE_TO, d);
+ }
+ static getLineTo(x, y) {
+ let d = { x: x, y: y };
+ return new PathSegment(PathSegment.LINE_TO, d);
+ }
+ static getBezier(cx1, cy1, cx2, cy2, x, y) {
+ let d = { cx1: cx1, cy1: cy1, cx2: cx2, cy2: cy2, x: x, y: y };
+ return new PathSegment(PathSegment.BEZIER, d);
+ }
+ static getQuadratic(cx, cy, x, y) {
+ let d = { cx: cx, cy: cy, x: x, y: y };
+ return new PathSegment(PathSegment.QUADRATIC, d);
+ }
+ static getArc(x, y, r, a0, a1, ccw) {
+ let d = { x: x, y: y, r: r, a0: a0, a1: a1, ccw: ccw };
+ return new PathSegment(PathSegment.ARC, d);
+ }
+ static getArcTo(x1, y1, x2, y2, r) {
+ let d = { x1: x1, y1: y1, x2: x2, y2: y2, r: r };
+ return new PathSegment(PathSegment.ARC_TO, d);
+ }
+ static getEllipse(x, y, rx, ry, rot, a0, a1, ccw) {
+ // BUG: If I convert everything to bezier, then many of these static
+ // methods can be eliminated.
+ // YES. THIS IS A BAD IDEA IN EVERY WAY. ONLY BEZIER CURVES SHOULD
+ // BE ALLOWED INTERNALLY.
+ // OTOH, there are certain shapes, like an ellipse or rectangle, that
+ // should be treated as a single unitary thing.
+ // What I should probably do is sub-class FPath for these. Interally, they
+ // can be represented as a messy bezier thing, but that would be hidden from the user.
+ // At the same time, one might want to add an ellipse or rect to an existing path to
+ // obtain various fill effects. So, the ellipse sub-class will need something like
+ // a toFPath() method so that it can be added to a normal FPath.
+ let d = { x: x, y: y, rx: rx, ry: ry, rot: rot, a0: a0,
+ a1: a1, ccw: ccw };
+ return new PathSegment(PathSegment.ELLIPSE, d);
+ }
+ static getRect(x, y, w, h) {
+ let d = { x: x, y: y, w: w, h: h };
+ return new PathSegment(PathSegment.RECT, d);
+ }
+}
+// The various kinds of segment.
+// I'm being sloppy about typing here since the use is uncomplicated and
+// private. Some kind of enumerated type would be better in the abstract.
+// BUG: I should get rid of anything after the QUADRATIC type. The
+// mathematically clean way to do this is to convert *everything* to beziers,
+// including ellipses. In fact (?) is a quadratic just a cubic where the
+// control points coincide? If so, I could get rid of QUADRATIC too.
+PathSegment.MOVE_TO = 1;
+PathSegment.LINE_TO = 2;
+PathSegment.BEZIER = 3;
+PathSegment.QUADRATIC = 4;
+PathSegment.ARC = 5;
+PathSegment.ARC_TO = 6;
+PathSegment.ELLIPSE = 7;
+PathSegment.RECT = 8;
+PathSegment.CLOSE = 9;
+PathSegment.UNKNOWN = -1;
+// BUG: Add some flags so that things could be drawn or not drawn based
+// on whether the output is going to tikz or to the screen.
+class FPath extends Path2D {
+ constructor() {
+ super();
+ // An array of PathSegments.
+ this.segs = [];
+ }
+ addPath(p) {
+ // Append the elements of p to this.
+ for (let i = 0; i < p.segs.length; i++)
+ this.segs.push(p.segs[i]);
+ }
+ closePath() {
+ super.closePath();
+ this.segs.push(PathSegment.getClose());
+ }
+ moveTo(x, y) {
+ super.moveTo(x, y);
+ this.segs.push(PathSegment.getMoveTo(x, y));
+ }
+ frontLineTo(x, y) {
+ // To tack a line segment to the *begining* of an existing path.
+ // This assumes that segs[0] is a moveTo() -- as I think (?) it must be
+ // in any reasonable case.
+ // So, you start with a path that looks like
+ // moveTo(a,b) ...whatever
+ // and it becomes
+ // moveTo(x,y) lineTo(a,b) ...whatever.
+ // You're basically drawing as usual, but "from the wrong end."
+ let s = this.segs[0];
+ if (s.type != PathSegment.MOVE_TO)
+ console.log("ERROR: frontLineTo() doesn't start with moveTo(): " + s.type);
+ let newfirst = PathSegment.getMoveTo(x, y);
+ // Convert the initial moveto to a lineto.
+ // In fact, this is sort of pointless, and is only done this way to respect
+ // the type-checker. It's (x,y) whether it's a lineto or a moveto.
+ let m = s.s;
+ let newsecond = PathSegment.getLineTo(m.x, m.y);
+ this.segs[0] = newsecond;
+ this.segs.unshift(newfirst);
+ }
+ lineTo(x, y) {
+ super.lineTo(x, y);
+ this.segs.push(PathSegment.getLineTo(x, y));
+ }
+ bezierCurveTo(cx1, cy1, cx2, cy2, x, y) {
+ super.bezierCurveTo(cx1, cy1, cx2, cy2, x, y);
+ this.segs.push(PathSegment.getBezier(cx1, cy1, cx2, cy2, x, y));
+ }
+ quadraticCurveTo(cx, cy, x, y) {
+ super.quadraticCurveTo(cx, cy, x, y);
+ this.segs.push(PathSegment.getQuadratic(cx, cy, x, y));
+ }
+ translate(p) {
+ // Translate this entire path by the given point.
+ // BUG: Not implemented for every possible type of segment.
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++) {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ answer.moveTo(m.x + p.x, m.y + p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ let m = s.s;
+ answer.lineTo(m.x + p.x, m.y + p.y);
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ let m = s.s;
+ answer.bezierCurveTo(m.cx1 + p.x, m.cy1 + p.y, m.cx2 + p.x, m.cy2 + p.y, m.x + p.x, m.y + p.y);
+ }
+ else if (s.type == PathSegment.ELLIPSE) {
+ let m = s.s;
+ answer.ellipse(m.x + p.x, m.y + p.y, m.rx, m.ry, m.rot, m.a0, m.a1, m.ccw);
+ }
+ else {
+ console.log("whatever translattion you want, it's not done.");
+ }
+ }
+ return answer;
+ }
+ rotate(a) {
+ // Rotate this entire path about the origin and return the result.
+ // BUG: I have only implemented this for bezier curves and lines.
+ // Expanding this probably doesn't make sense until I settle on a
+ // framework to more fully replace Path2D.
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++) {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ let p = new Point2D(m.x, m.y).rotate(a);
+ answer.moveTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ let m = s.s;
+ let p = new Point2D(m.x, m.y).rotate(a);
+ answer.lineTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ let m = s.s;
+ let c1 = new Point2D(m.cx1, m.cy1).rotate(a);
+ let c2 = new Point2D(m.cx2, m.cy2).rotate(a);
+ let e = new Point2D(m.x, m.y).rotate(a);
+ answer.bezierCurveTo(c1.x, c1.y, c2.x, c2.y, e.x, e.y);
+ }
+ else {
+ console.log("whatever rotation you want, it's not done.");
+ }
+ }
+ return answer;
+ }
+ scale(r) {
+ // Scale this entire path about the origin and return the result.
+ // BUG: I have only implemented this for bezier curves and lines.
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++) {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ let p = new Point2D(r * m.x, r * m.y);
+ answer.moveTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ let m = s.s;
+ // BUG:
+ console.log("scale not done for lines");
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ let m = s.s;
+ let c1 = new Point2D(r * m.cx1, r * m.cy1);
+ let c2 = new Point2D(r * m.cx2, r * m.cy2);
+ let p = new Point2D(r * m.x, r * m.y);
+ answer.bezierCurveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
+ }
+ else {
+ console.log("whatever scale you want, it's not done.");
+ }
+ }
+ return answer;
+ }
+ reflectX() {
+ // Reflect this entire path about the x-axis and return the result.
+ // BUG: not implemented for every case.
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++) {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ let p = new Point2D(m.x, -m.y);
+ answer.moveTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ let m = s.s;
+ let p = new Point2D(m.x, -m.y);
+ answer.lineTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ let m = s.s;
+ let c1 = new Point2D(m.cx1, -m.cy1);
+ let c2 = new Point2D(m.cx2, -m.cy2);
+ let p = new Point2D(m.x, -m.y);
+ answer.bezierCurveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
+ }
+ else if (s.type == PathSegment.ELLIPSE) {
+ let m = s.s;
+ answer.ellipse(m.x, -m.y, m.rx, m.ry, m.rot, m.a0, m.a1, m.ccw);
+ }
+ else {
+ console.log("whatever reflect you want, it's not done.");
+ }
+ }
+ return answer;
+ }
+ reflectXY() {
+ // Reflect this entire path about the x-axis AND y-axis.
+ // BUG: not implemented for every case.
+ // BUG: Also, what about reflectY()?
+ let answer = new FPath();
+ for (let i = 0; i < this.segs.length; i++) {
+ let s = this.segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ let p = new Point2D(-m.x, -m.y);
+ answer.moveTo(p.x, p.y);
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ let m = s.s;
+ // BUG:
+ console.log("reflect not done for lines");
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ let m = s.s;
+ let c1 = new Point2D(-m.cx1, -m.cy1);
+ let c2 = new Point2D(-m.cx2, -m.cy2);
+ let p = new Point2D(-m.x, -m.y);
+ answer.bezierCurveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
+ }
+ else {
+ console.log("whatever reflect you want, it's not done.");
+ }
+ }
+ return answer;
+ }
+ rotateAbout(a, p) {
+ // Rotate this entire path about p and return the result.
+ let t1 = this.translate(new Point2D(-p.x, -p.y));
+ let t2 = t1.rotate(a);
+ return t2.translate(p);
+ }
+ static arcToBezierNEW(r, a0, a1) {
+ // Generate a series of bezier curves to represent an arc. The result
+ // represents an arc of a circle of radius r, centered
+ // at (0,0), going from angle a0 to a1, in radians.
+ // Each step should subtend no more than pi/4 radians. Most of the
+ // time pi/2 would be accurate enough, but pi/4 is better, and not that
+ // much extra work.
+ let totalAngle = a1 - a0;
+ if (totalAngle < 0)
+ totalAngle += 2 * Math.PI;
+ let numCurves = Math.ceil(4 * totalAngle / Math.PI);
+ let subtend = totalAngle / numCurves;
+ // See the manual for where this comes from. It's the crucial constant
+ // for approximating arcs of circles by cubics.
+ let k = (4 / 3) * Math.tan(subtend / 4);
+ // Everything is built out of a single arc for a circle of radius r,
+ // going cw, starting at (1,0) and angle subtend.
+ let s = Math.sin(subtend);
+ let c = Math.cos(subtend);
+ let p1 = new Point2D(r, 0);
+ let p2 = new Point2D(r, r * k);
+ let p3 = new Point2D(r * (c + k * s), r * (s - k * c));
+ let p4 = new Point2D(r * c, r * s);
+ // The arc determined by the p_i above must be rotated to create
+ // a series of sub-arcs to get the total arc we want.
+ let answer = new FPath();
+ answer.moveTo(p1.x, p1.y);
+ for (let i = 0; i < numCurves; i++) {
+ answer.bezierCurveTo(p2.x, p2.y, p3.x, p3.y, p4.x, p4.y);
+ p2.rotateSelf(subtend);
+ p3.rotateSelf(subtend);
+ p4.rotateSelf(subtend);
+ }
+ // Rotate the entire thing so that it starts at a0.
+ answer = answer.rotate(a0);
+ return answer;
+ }
+ arc(x, y, r, a0, a1, ccw) {
+ // BUG: I am pretty sure this isn't right. There are things about
+ // being cw/cww and things like that. It needs to be tested.
+ // A circular arc, centered at (x,y) and radius r, from angle
+ // a0 to angle a1 (in radians), going cw or ccw. Like ellipse, this
+ // is basically independent of the surrounding segments. Actually,
+ // the documentation I've found is a little vague on this point,
+ // but it looks like that is how it works.
+ //
+ // Another issue is the fact that these angles, a0 and a1, may
+ // have "extra" multiples of 2pi in them and whether a1>a0.
+ // The first thing this does is reduce the angles to be in [0,2pi).
+ //
+ // The whole cw versus ccw issue amounts to whether you're getting
+ // the "large" arc or the "small" arc. If a1 > a0, then the ccw arc
+ // is the small arc and the cw arc is the large arc. If a1 < a0,
+ // then the ccw arc is the large arc and the cw arc is the small arc.
+ // To untangle this, assume that the arc will be treated ccw, and
+ // swap a1 and a0, if necessary, to make that the case.
+ //
+ // Finally, there's the issue of what cw and ccw mean when in
+ // left or right handed coordinate systems. Ugh.
+ //
+ // See
+ // https://pomax.github.io/bezierinfo/#circles_cubic
+ // for an explanation of the math, which is just HS algrbra.
+ //
+ //
+ // BUG: Seems like this is a special case of an arc of an ellipse.
+ if (ccw === undefined)
+ ccw = false;
+ // Reduce angles to be in [0,2pi).
+ while (a0 < 0)
+ a0 += 2 * Math.PI;
+ while (a1 < 0)
+ a1 += 2 * Math.PI;
+ while (a0 >= 2 * Math.PI)
+ a0 -= 2 * Math.PI;
+ while (a1 >= 2 * Math.PI)
+ a1 -= 2 * Math.PI;
+ // If the user asked for cw, then swap the angles so that we only
+ // need to consider the ccw case below.
+ if (ccw === true) {
+ let temp = a1;
+ a1 = a0;
+ a0 = temp;
+ }
+ // Get the various arcs for a circle centered at zero.
+ let arcs = FPath.arcToBezierNEW(r, a0, a1);
+ // Translate them all by (x,y).
+ arcs = arcs.translate(new Point2D(x, y));
+ this.addPath(arcs);
+ }
+ ellipse(x, y, rx, ry, rot, a0, a1, ccw) {
+ // BUG: Long-term, the right thing to do here is convert it (internally)
+ // to a series of bezier curves.
+ if (ccw === undefined)
+ ccw = false;
+ super.ellipse(x, y, rx, ry, rot, a0, a1, ccw);
+ this.segs.push(PathSegment.getEllipse(x, y, rx, ry, rot, a0, a1, ccw));
+ }
+ rect(x, y, w, h) {
+ // BUG: As above, make into a series of line segments. This one is easy.
+ super.rect(x, y, w, h);
+ this.segs.push(PathSegment.getRect(x, y, w, h));
+ }
+ static circArcToBezier(r, a0, a1) {
+ // Return a series of n bezier curves for a circle of radius r, extending
+ // from r(cos a0,sin a0) to r (cos a1,sin a1).
+ //
+ // BUG: This should really be part of ellipse().
+ let answer = FPath.arcToBezierNEW(r, a0, a1);
+ return answer;
+ }
+ static parametricToBezier(f, t0, t1, n) {
+ // Given a 2D parametric curve, f(t) = x(t),y(t)), this returns a bezier
+ // approximation from t=t0 to t=t1 by taking n time-steps. Obviously,
+ // f must be a function returning f.x and f.y.
+ //
+ // This works by sampling f (n+1) times, plus n times at the in
+ // between points, and fitting a Bezier to each trio of points. It
+ // follows the notes in the "main" manual. This is a hard problem -- or
+ // a messy one. There are various strategies. The one used here is to
+ // choose the tangent at the intermediate point (which I call B) to be
+ // parallel to the line between the two end-points of the Bezier segment.
+ // This is relatively straightforward, but one problem with this is that
+ // the slopes where these segments meet need not be the same -- the
+ // resulting curve is not G_1. I'm pretty sure that I worked out a method
+ // once that was based (somehow?) on the way MetaPost works, but it's
+ // complicated and messy and uses complex numbers.
+ let p = new FPath();
+ let p1 = f(t0);
+ p.moveTo(p1.x, p1.y);
+ for (let i = 0; i < n; i++) {
+ let p4 = f(t0 + (i + 1) * (t1 - t0) / n);
+ let B = f(t0 + (i + 0.5) * (t1 - t0) / n);
+ // Work out an appropriate value for t based on relative distances.
+ let d1 = Math.sqrt((B.x - p1.x) ** 2 + (B.y - p1.y) ** 2);
+ let d2 = Math.sqrt((B.x - p4.x) ** 2 + (B.y - p4.y) ** 2);
+ let t = d1 / (d1 + d2);
+ // The p4 to p1 vector:
+ let V = new Point2D(p4.x - p1.x, p4.y - p1.y);
+ // e1 = B - (1-t)(p4-p1)/3 and e2 = B + t(p4-p1)/3.
+ let e1 = new Point2D(B.x - (1 - t) * V.x / 3, B.y - (1 - t) * V.y / 3);
+ let e2 = new Point2D(B.x + t * V.x / 3, B.y + t * V.y / 3);
+ // Run de Casteljau's algorithm backwards. I call this alpha too,
+ // but r is a better name since it's a ratio.
+ let r = 1 - 1 / (t ** 3 + (1 - t) ** 3);
+ let u = (1 - r) * (1 - t) ** 3;
+ let C = new Point2D(p1.x * u + p4.x * (1 - u), p1.y * u + p4.y * (1 - u));
+ let A = new Point2D(B.x + (C.x - B.x) / r, B.y + (C.y - B.y) / r);
+ let v1 = new Point2D((e1.x - A.x * t) / (1 - t), (e1.y - A.y * t) / (1 - t));
+ let v2 = new Point2D((e2.x - A.x * (1 - t)) / t, (e2.y - A.y * (1 - t)) / t);
+ let p2 = new Point2D((v1.x - p1.x * (1 - t)) / t, (v1.y - p1.y * (1 - t)) / t);
+ let p3 = new Point2D((v2.x - p4.x * t) / (1 - t), (v2.y - p4.y * t) / (1 - t));
+ p.bezierCurveTo(p2.x, p2.y, p3.x, p3.y, p4.x, p4.y);
+ p1 = p4.copy();
+ }
+ return p;
+ }
+}
+// Text is a special case because it expects a LH coordinate system, but
+// everything else is set up for a RH coordinate system. The end-user
+// shouldn't make a direct call to ctx.fillText(). If he does, then the
+// the text will be upside-down. So, call this instead.
+//
+// Getting the placement of the js to match the placement of the tikz exactly
+// is difficult because they're using two different fonts. So the tikz
+// is drawn at (x+dx,y+dy). The dx and dy are optional and default to zero.
+//
+// BUG: I *could* create a class, something like FPath, to handle all drawing
+// of text, which may be more natural to the user. But I would probably have
+// to extend CanvasRenderingContext2D somehow and use that everywhere, not
+// just when creating TikZ. For now, this is a sufficient solution.
+// Another approach would be to overwrite the existing
+// CanvasRenderingContext2D.fillText method to call the function below.
+// In some ways, that's the "right" thing to do, but my gut is that
+// it could lead to various problems and make the code generally brittle.
+function drawText(ctx, txt, x, y, dx = 0, dy = 0) {
+ let saveT = ctx.getTransform();
+ if (ctx instanceof CTX) {
+ // Don't fool around. Just write it to the .tikz file.
+ // BUG: The ts compiler complains about this, but it works fine.
+ ctx.fillText(txt, x + dx, y + dy);
+ ctx.setTransform(saveT);
+ return;
+ }
+ // Get the measurements -- all we really care about is the baseline.
+ // Transform the ctx so that the horizontal line at y becomes the
+ // origin, flip the scale, and draw at (x,0).
+ //
+ // Recapitulating the info on MDN, we care about m.actualBoundingBoxAscent
+ // and m.actualBoundBoxDescent, which give distances from ctx.textBaseline
+ // to the relevant side of the bounding box of the text. The baseline
+ // defaults to the 'alphabetic' setting, which puts the baseline just
+ // under where you normally draw the letter -- B sits on the baseline,
+ // while p hangs below it.
+ let m = ctx.measureText(txt);
+ ctx.translate(0, y);
+ ctx.scale(1, -1);
+ ctx.textBaseline = 'bottom';
+ ctx.fillText(txt, x, 0);
+ ctx.setTransform(saveT);
+}
+// As above, but these to draw the text in only one scenario or
+// the other. This could be handled with boolean arguments to the
+// above, but this seems clearer for the user.
+function drawTextBrowserOnly(ctx, txt, x, y, dx = 0, dy = 0) {
+ if (ctx instanceof CTX)
+ // Skip it.
+ return;
+ drawText(ctx, txt, x, y, dx, dy);
+}
+function drawTextTikZOnly(ctx, txt, x, y, dx = 0, dy = 0) {
+ if (ctx instanceof CTX)
+ ctx.fillText(txt, x + dx, y + dy);
+}
+// This is to act much like the object returned from
+// canvas.getContext('2d').
+// Only a few elements of the standard context class are needed.
+// I purposely did *not* make this extend CanvasRenderingContext2D.
+// By not extending, you can't accidentally make use of some feature
+// of the normal ctx framework and have it silently fail.
+//
+// This is one major difference. Each time you want to render a figure,
+// you need a new one of these since the tikz text goes out to a file
+// with a different name. In principle, it would be possible to allow
+// reusing these, but there's no value in allowing for that.
+// I had hoped not to need to deal with transformation matricies, and
+// just (implicitly) use the identity matrix. However, certain things
+// are easier for the user if they are permitted. See
+// www.alanzucconi.com/2016/02/10/tranfsormation-matrix
+// for a brief summary of how these work.
+//
+// Think of the matrix as R in the upper left, for rotation etc, and
+// (tx,ty,1) in the right column for translation, with M as the overall
+// matrix. The bottom row is always (0 0 1). If the user gives (x y) as
+// some position relative to M, then the "real" position is M(x y 1).
+// By "real" I mean that position relative to the identity matrix.
+//
+// BUG: I think I am doing this the wrong way. As things stand, I store
+// the thing the user does (the path and any points or whatever that
+// specify) in terms given by the user. Then I convert those values to
+// their "unadjusted" values when written to tikz output. Instead, I should
+// convert things as they come in. For one thing, as things stand, if
+// the user adjusts the t-matrix as things are drawn, it would mess up
+// everything. This would also side-step certain questions like what
+// a shear transformation should mean for something like an ellipse. If
+// we correct things as just described, then an ellipse is an ellipse,
+// and it is not shear-transformed, although the points where ellipse
+// is located would be shear-transformed.
+//
+// BUG: Add a flag, like CTX.paper, and set is to true here.
+// That way, the rendering process can output something different on paper.
+// This flag will be undefined when run in a browser.
+class CTX {
+ constructor(name) {
+ // Transformation matrix.
+ // BUG: Try to get rid of this. I think that, now that all drawing is
+ // done with a RH system, this is unnecessary. Everything related to
+ // tmatrix is private and I think it's effectively unused.
+ this.tmatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
+ // BUG: This is *not* the right way to do things, but it's easier.
+ // The problem is in scaling lengths, which are not points. This is a
+ // particular problem with radii. The proper solution is to work this value
+ // out from the tmatrix, but that's messy.
+ // This is why things like ellipses should be treated as beziers.
+ this.netScale = 1.0;
+ // To allow the user to set the linewidth. Otherwise, tikz uses a
+ // default value of 0.4pt. Tikz has certained named line widths, like
+ // 'semithick' and 'ultra thin' but I don't care about those. It's better
+ // to stick with numerical values to be consistent with js.
+ // This name matches what's used in a "normal" ctx.
+ // The way to specify line width in tikz is as an option to \draw:
+ // \draw[line width = 1mm] ...whatever...
+ // for example.
+ this.lineWidth = 1.0;
+ // File name (without the '.tizk') for the figure.
+ this.figureName = "";
+ // This holds the output as it is generated.
+ this.tikzstr = "";
+ // Provide the name of the figure whose tikz is being generated.
+ // This goes to a file, which is fiddly with js. The contents of the
+ // file will be sent to the server, and it is assumed that the server
+ // knows what to do. A normal HTTP server will choke on it (really,
+ // it will just ignore it).
+ //
+ // As each call to stroke(), fill(), and so forth is made, the corresponding
+ // tikz is noted. When all these are calls are done, call close() to write it out.
+ this.figureName = name;
+ this.tikzstr = "";
+ // The tikz file needs a bit of a heading.
+ this.tikzstr += "\\begin{tikzpicture}\n";
+ // And everything is clipped to the permitted drawing area. To obtain
+ // that area, we need to look at the figure specification.
+ let myFunc = getAugmentedFunction(name);
+ let fpc = myFunc.figurePanelClass;
+ // Neither one really seems to give the right thing.
+ // Maybe use \clip as an option to
+ // \begin{tikzpicture}[\clip something?]
+ //this.tikzstr += "\\clip (0bp,0bp) rectangle (" +fpc.textWidth+
+ // "bp," + fpc.h+ "bp);\n";
+ this.tikzstr += "\\useasboundingbox (0bp,0bp) rectangle (" + fpc.textWidth.toFixed(2) +
+ "bp," + (fpc.h - fpc.lowerPadding - fpc.upperPadding).toFixed(2) + "bp);\n";
+ }
+ close() {
+ // Finalize the tikz specification, and write it out.
+ //
+ // Note that, under Firefox, this generates an error on the console:
+ //
+ // XML Parsing Error: no root element found
+ // Location: http://localhost:8000/geartest01.tikz
+ // Line Number 1, Column 1:
+ //
+ // or whatever the file name is that's saved. Apparently this is a
+ // "known issue" (aka, a bug) with Firefox. No such message appears
+ // with MS Edge. It works the same either way.
+ this.tikzstr += "\\end{tikzpicture}\n";
+ // BUG: No doubt there is a more modern fetch() way to do this.
+ let req = new XMLHttpRequest();
+ // This is *really* not the standard way to do things.
+ // Pass the file name to save under, then the text to save.
+ // I *should* be passing some cgi script that takes input, but
+ // I've tweaked the http server so that it's non-standard,
+ // and does what I want instead of what it is supposed to do.
+ let fname = this.figureName + ".tikz";
+ req.open("POST", fname);
+ // I have no idea whether this is really necessary.
+ req.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
+ req.send(this.tikzstr);
+ }
+ static clone3x3Matrix(m) {
+ // JS seems not to have a standard way of creating a copy of a matrix.
+ // This does it for a 3x3 matrix and returns the result.
+ let a = [];
+ a[0] = [];
+ a[0][0] = m[0][0];
+ a[0][1] = m[0][1];
+ a[0][2] = m[0][2];
+ a[1] = [];
+ a[1][0] = m[1][0];
+ a[1][1] = m[1][1];
+ a[1][2] = m[1][2];
+ a[2] = [];
+ a[2][0] = m[2][0];
+ a[2][1] = m[2][1];
+ a[2][2] = m[2][2];
+ return a;
+ }
+ getTransform() {
+ return CTX.clone3x3Matrix(this.tmatrix);
+ }
+ setTransform(t) {
+ this.tmatrix = CTX.clone3x3Matrix(t);
+ }
+ translate(tx, ty) {
+ // Adjust the transformation matrix. Going forward, this will have the
+ // effect of converting (x,y) to (tx + x,ty+y) whenever the user
+ // refers to (x,y).
+ this.tmatrix[0][2] += tx;
+ this.tmatrix[1][2] += ty;
+ }
+ scale(sx, sy) {
+ // Scale the transformation matrix.
+ // Let S = diag(sx,sy,1). The new t-matrix is the old t-matrix times S.
+ //
+ // BUG: I am not sure. Maybe it should be S times old t-matrix, and
+ // I have the order wrong. For the time being it doesn't matter since
+ // every case I care about has sx=sy and the matrices commute in that
+ // special case.
+ this.tmatrix[0][0] *= sx;
+ this.tmatrix[0][1] *= sy;
+ this.tmatrix[1][0] *= sx;
+ this.tmatrix[1][1] *= sy;
+ // Track this here too.
+ // BUG: This assumes that sx = xy.
+ this.netScale *= sx;
+ }
+ applyTMatrix(x, y) {
+ // Return tmatrix times (x,y). As a matrix operation, this is
+ // tmatrix x (x y 1), but we only return the first two entries.
+ let ax = this.tmatrix[0][0] * x + this.tmatrix[0][1] * y + this.tmatrix[0][2];
+ let ay = this.tmatrix[1][0] * x + this.tmatrix[1][1] * y + this.tmatrix[1][2];
+ return { x: ax, y: ay };
+ }
+ handlePath(path) {
+ // Called by either fill() or stroke().
+ var segs = path.segs;
+ for (let i = 0; i < segs.length; i++) {
+ // s is a PathSegment object.
+ let s = segs[i];
+ if (s.type == PathSegment.MOVE_TO) {
+ let m = s.s;
+ let t = this.applyTMatrix(m.x, m.y);
+ //this.tikzstr += "(" +s.x+ "pt, " + s.y+ "pt) ";
+ this.tikzstr += "(" + t.x.toFixed(2) + "bp, " + t.y.toFixed(2) + "bp) ";
+ }
+ else if (s.type == PathSegment.LINE_TO) {
+ // Lines are drawn with the tikz \draw command. It takes the form
+ // \draw [options] (x1,y1) -- (x2,y2);
+ // Note that I include "bp" for the dimensions. I think that tikz
+ // defaults to cm if no dimension is given, so I should specify
+ // something. Note also that I use bp, not pt.
+ //
+ // BUG: I am not sure whether the tikz point is 72ppi or 72.27 ppi
+ // to match latex.
+ //
+ // BUG: For the time being, I will ignore these options, but they
+ // can be things like fill or dashed, or to set the color or line
+ // width, and probably a mess of other stuff.
+ let m = s.s;
+ let t = this.applyTMatrix(m.x, m.y);
+ this.tikzstr += "-- (" + t.x.toFixed(2) + "bp, " + t.y.toFixed(2) + "bp) ";
+ }
+ else if (s.type == PathSegment.BEZIER) {
+ // The sources I found aren't very explicit about exactly how
+ // this is implemented. I assume it's done in the usual way.
+ // We have
+ // P(t) = B(3,0)*CP + B(3,1)*P1 + B(3,2)*P2 + B(3,3)*P3,
+ // where t\in [0,1] and B are the usual Bernstein polynomials (the
+ // functions of t):
+ // B(n,m) = C(n,m) t^m (1-t)^(n-m),
+ // and C is the choice function.
+ // See also the tikz/pgf manual (v3.1.9a), p. 156, for the output.
+ // However the manual is wrong, or not clear. Use 'and' between
+ // the control points.
+ //
+ // The gist is that CP is fixed point where the curve starts;
+ // it's implicit for both Java and tikz. P1 and P2 are the control
+ // points and P3 is where the curve terminates. Fortunately this
+ // matches up nicely with the tikz syntax.
+ let m = s.s;
+ let t1 = this.applyTMatrix(m.cx1, m.cy1);
+ let t2 = this.applyTMatrix(m.cx2, m.cy2);
+ let t3 = this.applyTMatrix(m.x, m.y);
+ this.tikzstr +=
+ ".. controls (" + t1.x.toFixed(2) + "bp, " + t1.y.toFixed(2) + "bp) and (" +
+ t2.x.toFixed(2) + "bp, " + t2.y.toFixed(2) + "bp) .. (" +
+ t3.x.toFixed(2) + "bp, " + t3.y.toFixed(2) + "bp)";
+ }
+ else if (s.type == PathSegment.QUADRATIC) {
+ // BUG: Put this back.
+ console.log("quadratic does not work");
+ // Tikz has this too (whew). Oddly, it's part of the pgf stuff.
+ // Everything else is drawn with \draw (or \fill), but this
+ // uses \pgfpathquadraticcurveto. I'm not sure if that matters,
+ // and I hope that you can mix these freely in the middle of
+ // a \draw command. The tikz/pgf manual isn't very clear on
+ // mixing these.
+ // BUG: I wonder if I should be using commands like \pgflineto,
+ // \pgfcurveto, and so forth, throughout what I've done.
+ // See the tikz/pgf manul (v3.1.9a), p. 1095.
+ //
+ // BUG: I'm going to code this hoping that it works, but I suspect
+ // that it will not, and will need to go back and change to
+ // something other than \draw or \fill to start with.
+ // Maybe I need to define an entire path and then \draw or \fill
+ // it? It looks like you define that path, then say
+ // \pgfusepath{fill} or whatever.
+ //
+ // BUG: Maybe I could convert this to a cubic here and avoid this
+ // entire messy issue?
+ //
+ // NOTE: pgf has some nice commands for drawing only *part* of
+ // a Bezier curve. See p. 1097 for \pgfpathcurvebetweentime.
+ // BUG: Maybe I'll be lucky and this is never called.
+ // I think (?) it must be that the only time this type of
+ // segment ever arises is if the user users a QuadCurve2D, which
+ // seems (?) unlikely.
+ /*
+ let t1 = this.applyTMatrix(s.cx,s.cy);
+ let t2 = this.applyTMatrix(s.x,s.y);
+
+ //this.tikzstr +=
+ // "\\pgfpathquadraticcurveto {\\pgfpoint{" +
+ // s.cx+ "pt}{" +x.cy+ "pt}}{\\pgfpoint{" +
+ // s.x+ "pt}{" +s.y+ "pt}}";
+ this.tikzstr +=
+ "\\pgfpathquadraticcurveto {\\pgfpoint{" +
+ t1.x+ "bp}{" +t1.y+ "bp}}{\\pgfpoint{" +
+ t2.x+ "bp}{" +t2.y+ "bp}}";
+ */
+ }
+ else if (s.type == PathSegment.ARC) {
+ console.log("arc");
+ // This is a circular arc of a circle
+ // centered at (x,y) over a given range of angles (cw or ccw).
+ //
+ // BUG: For the remaining cases, I may need to do something
+ // special. It's not clear exactly what the browser is doing
+ // with these. Are they converted, internally, to bezier
+ // curves or are they somehow rendered more directly.
+ this.tikzstr += "no arc implemented";
+ }
+ else if (s.type == PathSegment.ARC_TO) {
+ console.log("arc to not done");
+ // This is essentially a bezier curve.
+ // You have two control points and a radius. It is not
+ // clear exactly how it works.
+ this.tikzstr += "no arcTo implemented";
+ }
+ else if (s.type == PathSegment.ELLIPSE) {
+ // BUG: This will only draw a complete ellipse, not an arc of
+ // an ellipse.
+ // BUG: The foolishness with netScale is another reason not
+ // to allow an ellipse type. If an ellipse were really a series
+ // of bezier curves, then this would be a non-issue.
+ let m = s.s;
+ let c = this.applyTMatrix(m.x, m.y);
+ //console.log(s.x+ "," +s.y+ " becomes " +c.x+ " " +c.y);
+ //this.tikzstr += "(" +c.x+ "pt," +c.y+
+ // "pt) ellipse [x radius=" +s.rx*this.netScale+
+ // "pt,y radius =" + s.ry*this.netScale+ "pt]";
+ this.tikzstr += "(" + c.x.toFixed(2) + "bp," + c.y.toFixed(2) +
+ "bp) ellipse [x radius=" + (m.rx * this.netScale).toFixed(2) +
+ "bp,y radius =" + (m.ry * this.netScale).toFixed(2) + "bp]";
+ }
+ else if (s.type == PathSegment.RECT) {
+ console.log("rect not done");
+ this.tikzstr += "no rect implemented";
+ }
+ else if (s.type == PathSegment.CLOSE) {
+ this.tikzstr += "-- cycle";
+ }
+ else {
+ console.log("unknown FPath: " + s.type);
+ }
+ }
+ this.tikzstr += ";\n";
+ }
+ stroke(path) {
+ let segs = path.segs;
+ if (segs.length === 0)
+ return;
+ this.tikzstr += "\\draw[line width=" + this.lineWidth.toFixed(2) + "bp] ";
+ this.handlePath(path);
+ }
+ fill(path) {
+ let segs = path.segs;
+ if (segs.length === 0)
+ return;
+ this.tikzstr += "\\fill ";
+ this.handlePath(path);
+ }
+ fillText(s, x, y) {
+ // BUG: This is now done with top-level functions now and shouldn't
+ // be called (or callable) by outside code.
+ //
+ // BUG: I have my doubts about including this one. It needs to be done
+ // *somehow*, but I am concerned about a mismatch between the JS
+ // font and the fonts used by latex.
+ //
+ // BUG: I am ignoring the ctx.font setting. It does seem that if you
+ // set it to '10px san-serif' you get something reasonable for the
+ // browswer that doesn't look too different than latex.
+ //
+ // BUG: This is so fussy that I suspect that any drawing that is at
+ // all tricky will require that the user provide different placement for
+ // text on the browser and text on the page. Getting things to match
+ // up *exactly* may be impossible.
+ let t = this.applyTMatrix(x, y);
+ // I had this as 'anchor=south west', but 'base west' seems closer
+ // to what latex does.
+ // BUG: It's all a mystery.
+ this.tikzstr +=
+ "\\node [anchor=base west] at (" + t.x.toFixed(2) + "pt, " + t.y.toFixed(2) + "pt) {" + s + "};\n";
+ }
+}
+class Numerical {
+ static newton(f, g, a, b, y, e) {
+ // Given a function, f, and an initial guess, g, bracketed between a and b,
+ // for the argument to f, and a target value, y, this returns x such that
+ // f(x) = y to within error, e.
+ //
+ // A crude off-the-cuff implementation of Newton-Raphson.
+ // This will only work in the tamest situations.
+ //
+ // Recall that the idea is that
+ // f(x0 + dx) ~ f(x0) + f'(x0) dx
+ // We want y = f(x + dx) and that is approximately equivalent to
+ // y = f(x0) + f'(x0) dx or dx = ( y - f(x0) ) / f'(x0)
+ // so that x0 becomes x1 = x0 + dx = x0 + ( y - f(x0) ) / f'(x0)
+ //
+ // NOTE: I had hoped to avoid the need to bracket entirely, and for
+ // some functions (and sufficiently good initial guesses), you could,
+ // but it's too easy for the algorithm to get lost among local extrema
+ // if there is no bracket.
+ //
+ // In fact, here is a good example of why bracketing is needed.
+ // Let f = cos x + x sin x, which happens to be the x-coordinate for
+ // the parameterization of the unit involute. Suppose that you want
+ // to find x for which f(x) = 1.5, and you start off with a guess of
+ // x = 0.5. The slope of f at 0.5 is small so that Newton-Raphson
+ // sends x1 to a value that is beyond the inflection point near x = 3.
+ // At that point things go haywire.
+ let x0 = g;
+ let y0 = f(x0);
+ let i = 0;
+ while (Math.abs(y - y0) > e) {
+ let fplus = f(x0 + e);
+ let fminus = f(x0 - e);
+ let fprime = (fplus - fminus) / (2 * e);
+ let dx = (y - y0) / fprime;
+ let x1 = x0 + dx;
+ // Make sure we haven't passed a bracket. Just subdivide if we have.
+ if (x1 > b)
+ x1 = (x1 - x0) / 2;
+ if (x1 < a)
+ x1 = (x0 - x1) / 2;
+ x0 = x1;
+ y0 = f(x0);
+ // Don't allow an infinite loop
+ ++i;
+ if (i > 100)
+ return x0;
+ }
+ return x0;
+ }
+}
diff --git a/graphics/figput/javascript/widgets.js b/graphics/figput/javascript/widgets.js
new file mode 100644
index 0000000000..06dff9a8b4
--- /dev/null
+++ b/graphics/figput/javascript/widgets.js
@@ -0,0 +1,2256 @@
+"use strict";
+/*
+Widget management code.
+
+Typically, widget management is done with a tightly siloed hierarchy, with
+widgets in containers, which are in containers, etc. There is a hierarchy
+like that here (though rather flat since I don't need much), but there's also
+a global registry of widgets alongside the hierarchy. This makes widgets
+easier to work with for the author of the latex document.
+
+I've also avoided any kind of clever abstraction around the widget concept.
+This can mean that there's a certain amount of boilerplate (not DRY), but
+it also means that things aren't tangled up. Widgets can be individually
+modified without worries about side-effects.
+
+All widgets use a register() method rather than a constructor. This
+is because the user should be able to specify a widget repeatedly
+without actually creating a new one every time it's specified.
+
+So, the user should say something like
+let w = RandomWidgetType.register(arguments);
+to create a widget from the drawing code. If register() has never been
+called for the particular widget, then a new widget *is* created and
+a reference to it is placed in global storage. If this widget was created
+earlier, then the reference to it is taken from global storage and returned.
+So, register() is something like an object factory, but it won't make the
+same object more than once.
+
+Every widget is distinguished by its type and the (name of the) figure it
+belongs to. In addition, if a figure has several widgets of the same type,
+then the user must provide an optional name for that particular widget. For
+example, if there are three ButtonWidgets for a given figure, then they
+might be created by
+let b1 = ButtonWidget.register(whatever,"first");
+let b2 = ButtonWidget.register(whatever,"second");
+let b3 = ButtonWidget.register(whatever,"third");
+
+-------------------------
+
+One of the ticklish issues is how to associate widgets with their
+figures. In most languages, this problem is solved by explicitly using
+"this" somehow. In Java, you might say something like
+new Widget(this);
+to indicate that the owner of the widget is the class from which the widget
+was constructed. I would rather not do that because it's the kind of
+boilerplate arcana that the user shouldn't have to think about.
+
+JS provides a couple of ways to determine who made a call to a particular
+function. The easiest way is like this
+
+function example() {
+ let caller = example.caller.name;
+ console.log(caller);
+}
+
+This should print the name of the function that invoked example().
+
+Another way is very easy to do, but it's been deprecated. See
+https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
+Even though it is deprecated, every browser supports it, according to the
+above link. Also, my guess is that this is very commonly used since
+it's so handy. They won't be getting rid of it any time soon.
+
+If they do get rid of caller.name, then another way to obtain this
+information is by creating a bogus Error and examining the call stack:
+
+function example() {
+
+ let stack = new Error().stack;
+ let caller = stack.split('\n')[1].trim();
+
+ // caller is now inforamtion about the function calling this one,
+ // including the file name and a bunch of other stuff I don't care about.
+ // I just want to know the name of the function.
+ // It *appears* (but not extensively tested) that the function name
+ // occurs before the first '@'.;
+ let callingFcn = caller.split('@')[0];
+ console.log(callingFcn);
+}
+
+I wanted to use caller.name, even though it is deprecated, because it is
+so much easier. Unfortunately, it is not allowed in strict mode.
+Since everything that appears within a class is strict, that makes its use
+awkward. I tried to get around this by defining a top-level function (outside
+any class) that does nothing but return the value I want, but that doesn't
+work either. It seems like, as soon as you enter a class, the data you want
+is stripped off (or something). Also, now that I've moved to TypeScript any
+violation of "strict" is even harder. Since I'll have to define a seperate class
+anyway, go ahead and use the Error-based approach.
+
+To top it off, the method via generating an Error is sensitive to the
+broswer because different browsers format this information differently.
+
+-------------------
+
+BUG: Future Widgets...?
+
+Because LoopWidget takes such a crazy number of options, it would be nice
+to have several widgets that merely call LoopWidget. This wouldn't really
+be any different, but would simplify things for the user. Basically, these
+would have a reduced set of arguments to register() and just hand everything
+off to LoopWidget. They would be a mere glue skeleton. Same goes for
+OpenAnimWidget.
+
+Image Building Widget
+ For something like (say) a Mandelbrot set. This takes time to generate
+ and you might want to draw it in an open-ended way. It's not reasonable
+ to allow the user to move through time and see the state of the image
+ at different time steps. The widget should store an off-screen image
+ and making the animation "run faster" would mean calling it more frequently
+ so that it can do more calculation. So it would use some of the same
+ animation infrastructure, but in a different way. The most that makes
+ sense here is a pause/run (to reduce computational load) and something
+ to increase or decrease the load. This would often be something for which
+ it does not make sense to generate tikz. Any JS rendering of a mandelbrot
+ set (say) would be terrible for inclusion in a book. You'd generate a
+ printed figure like that in some other way, even if an on-line animation
+ would be instructive.
+
+Various restrictions on how a DraggableDot can be moved would be handy.
+Restricting to a particular line or arc wouldn't be hard, but restricting to
+fall on a given Path2D would be hard. The JS implementation of Path2D is
+poor, and I would need to reimplement the entire thing from the
+ground up. I might need to do some of that anyway for the best tikz output
+(I did some stuff along those lines already).
+
+Draggable Line
+ Similar to Draggable dot. In fact, it's not clear that this needs its own
+ widget. A line is determined by two points, so the user could use a
+ draggable dot and just draw the line himself. The only advantage I can
+ see to a draggable *line* is that the user could mouse-down on any
+ portion of the line. In fact, that could be done with DraggableDot since
+ the "dot" could be an entire line.
+
+Scroll bar for number selection.
+ Similar to a spinner, but the user drags a dot along a line.
+ Not clear whether a numerical value should appear.
+
+Checkboxes and Radio buttons
+ Gack
+
+Drop-down menu
+ Stuff like this gets more fiddly. If you have a drop-down menu and
+ it has a vertical scroll bar for multiple selections, then it's even worse.
+
+*/
+// There is only one of these, so everything is static. It manages all
+// the widgets in the program.
+class WidgetManager {
+ static register(w) {
+ this.theList.push(w);
+ if (WidgetManager.theWidgets.has(w.betterOwner))
+ WidgetManager.theWidgets.get(w.betterOwner).push(w);
+ else
+ WidgetManager.theWidgets.set(w.betterOwner, [w]);
+ }
+ static knownWidget(o, t, n) {
+ // If there is a widget with the given owner (o), type (t) and name(n)
+ // in theList, then return it; return null otherwise.
+ // BUG: Using a string as owner feels particularly bad.
+ for (let i = 0; i < this.theList.length; i++) {
+ let curW = this.theList[i];
+ if (o !== curW.owner)
+ continue;
+ if (t !== curW.type)
+ continue;
+ if (n === curW.name)
+ return curW;
+ }
+ return null;
+ }
+ static mouseDown(theFig, x, y) {
+ // theFig should match one of the Widget object's owner fields.
+ // (x,y) is given relative to he origin of the figure.
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+ // The only thing to do here is to pass the event to each widget and
+ // see if it wants it. I suppose that I *could* store the area for
+ // each widget, and do an initial test here, but this is easier.
+ let wlist = WidgetManager.theWidgets.get(theFig);
+ for (let i = 0; i < wlist.length; i++) {
+ if (wlist[i].mouseDown(x, y) === true)
+ // First come, first serve.
+ return;
+ }
+ }
+ static mouseMove(theFig, x, y) {
+ // As above.
+ if (WidgetManager.mouseOwner === null)
+ return;
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+ // We only accept mouse moves if the mouse is on the figure that
+ // "owns" the mouse event.
+ if (WidgetManager.mouseOwner.betterOwner !== theFig)
+ return;
+ WidgetManager.mouseOwner.mouseMove(x, y);
+ }
+ static mouseUp(theFig, x, y) {
+ // As above.
+ if (WidgetManager.mouseOwner === null)
+ return;
+ if (WidgetManager.theWidgets.has(theFig) === false)
+ return;
+ if (WidgetManager.mouseOwner.betterOwner !== theFig)
+ // Mouse was released over *a* figure, but not the figure with
+ // the owning widget. Tell the correct widget about the release, using
+ // bogus coordinates so that the mouse-up is sure to be off the widget.
+ WidgetManager.mouseOwner.mouseUp(10000000000000, 10000000000000);
+ //console.log("up up");
+ WidgetManager.mouseOwner.mouseUp(x, y);
+ }
+}
+// All the widgets known to the program.
+// Each of these is an instance of the Widget class.
+// BUG: I could get rid of this and just use theWidgets. It's redundant,
+// and theWidgets is actually easier.
+// BUG: Yes, get rid of this.
+WidgetManager.theList = [];
+// Also a complete list of all widgets, but indexed by the figure
+// to which the widget belongs. This makes it easier to pass events
+// to the proper recipent. So this is a hash map taking a figure name
+// (as a string) to an array of Widget objects.
+WidgetManager.theWidgets = new Map();
+// This is BOGUS. Certain path operations require a CanvasRenderingContext2D,
+// even when the question is one of pure abstract geometry, like
+// isPointInPath(), and the only way to get one of these is from a canvas.
+// Using the visible canvas and ctx for this is prone to all kinds of misuse
+// and mistakes, so create a bogus ctx here.
+// BUG: The long-term solution is not to rely on js for this at all. Write
+// my own code for Bezier curves and the like. I'm partway there already.
+WidgetManager.bogusCanvas = document.createElement('canvas');
+WidgetManager.bogusCtx = WidgetManager.bogusCanvas.getContext('2d');
+// Whether a widget "owns" a recent mouse-down event. This is needed
+// for things like dragging. If this is null, then the next mouse-down
+// is up for grabs. Otherwise, it points to the relevant Widget object.
+WidgetManager.mouseOwner = null;
+// This isn't being used yet, but it will be needed to handle keyboard
+// events. The idea is that a widget ""takes ownership" of a mouse-down
+// with mouseOwner, and that widget is the same one that has focus for
+// any future keyboard events too. The only real difference is that
+// focusOwner is "stickier." This goes to null whenever a user clicks
+// on something other than a widget.
+WidgetManager.focusOwner = null;
+function getCaller() {
+ // Irritating function to get around strict mode. See the comment at the
+ // top of the file. I want the caller of the thing that calls this.
+ //
+ // BUG: I was never entirely happy with this, and now that it depends
+ // on the particular browser, I am even less happy about it. It's a
+ // question of the lesser of two evils: this function or requiring
+ // the user to provide a boilerplate 'this' or the like.
+ let stack = new Error().stack;
+ // The exact format of the information in stack depends on the particular
+ // browser. Firefox produces something like this:
+ //
+ // getCaller@http://localhost:8000/widgets.js:375:15
+ // register@http://localhost:8000/widgets.js:1557:18
+ // geartest01@http://localhost:8000/geartest01.js:142:26
+ // render@http://localhost:8000/layout.js:628:11
+ // renderFrame@http://localhost:8000/widgets.js:538:13
+ // etc.
+ //
+ // While MS Edge/Chrome produces
+ //
+ // Error
+ // at getCaller (widgets.js:375:15)
+ // at Function.register (widgets.js:1557:18)
+ // at geartest01 (geartest01.js:142:26)
+ // at FigurePanel.render (layout.js:628:5)
+ // etc.
+ //
+ // Depending on the Browser, stack needs to be parsed differently.
+ // theBrowser was defined in main.js.
+ // The digit value (e.g., '2') indicates how many steps back in the the
+ // stack to go.
+ if (theBrowser === "Firefox") {
+ let caller = stack.split('\n')[2].trim();
+ // caller is now information about a function in the call stack,
+ // including the file name and a bunch of other stuff I don't care about.
+ // I just want to know the name of the function.
+ // The function name occurs before the first '@'.
+ let callingFcn = caller.split('@')[0];
+ return callingFcn;
+ }
+ else if (theBrowser === "Chrome") {
+ let caller = stack.split('\n')[3].trim();
+ // Here, space-deliminting works better.
+ let callingFcn = caller.split(' ')[1];
+ // But this may return something like 'FigurePanel.bezier'; what I want
+ // is just 'bezier'.
+ if (callingFcn.indexOf('.') > -1)
+ callingFcn = callingFcn.split('.')[1];
+ return callingFcn;
+ }
+ else {
+ console.log("IMPOSSIBLE ERROR DUE TO UNKNOWN BROWSER TYPE!!!");
+ return "";
+ }
+}
+// Base class for all widgets. No code outside this file should
+// ever access this class directly. It's not abstract because there
+// are certain actions common to every case in the constructor.
+class Widget {
+ constructor(owner, type, x, y, scale, hide, name) {
+ // Every widget is owned by a particular figure. The "owner" is
+ // the name of the figure function, just as in latex.
+ // BUG: Change this to the AugmentedDrawingFunction. Thus, get rid
+ // of this and use betterOwner.
+ this.owner = "";
+ // JS isn't very good about types, so it's clearer to tag sub-classes with
+ // the name of that sub-class rather than mess with typeof or whatever.
+ // This should be "LoopWidget" or whatever the name is of the sub-class.
+ this.type = "";
+ // Name to distinguish this widget from all others of the same
+ // type that belong to the same figure. So, the triple (owner,type,name)
+ // fully distinguishes this Widget from all others.
+ //
+ // In principle, this variable could have been avoided as a user-provided
+ // value and he wouldn't have to come up with an 'extra' name for the widget,
+ // but it wouldn't be easy. The WidgetManager (or something) would have to
+ // come up with a unique ID and *that* would require that the user invoke
+ // something like a "starting to create widgets" and "done creating widgets"
+ // commands. Overall, this seems less fussy for him.
+ this.name = "";
+ // The (x,y) is where the widget should be drawn relative to the
+ // rectangle of the figure. Often, widgetX will be negative to put the
+ // widget in the margin of the page.
+ // It's tempting to call these fields x and y, but it would
+ // be easy to accidentally reuse those names.
+ this.widgetX = 0;
+ this.widgetY = 0;
+ // To scale the drawing of a widget up or down.
+ this.scale = 1.0;
+ // Occassionally, it may make sense to hide a widget. This is different
+ // than being non-visible because the widget is off-screen. If the
+ // widget has hide == true, then it is *never* shown. For example, the
+ // way animations work, you have to have an animation widget to run the
+ // animation, even if you don't want to see the widget.
+ this.hide = true;
+ // Due to the fact that this tracks the owner of the widget, and how
+ // it is done, it is IMPORTANT that no sub-class has its own constructor.
+ this.owner = owner;
+ this.type = type;
+ this.widgetX = x;
+ this.widgetY = y;
+ this.scale = scale;
+ this.hide = hide;
+ this.name = name;
+ this.betterOwner = getAugmentedFunction(owner);
+ // When a widget is contructed it must be registered in a global list.
+ WidgetManager.register(this);
+ }
+ draw(ctx) {
+ // Every sub-class must implement this method.
+ console.log("Called Widget.draw()!!!");
+ }
+ // BUG: These methods that are "never" supposed to be called
+ // will be called for the widgets based on the DOM, like ButtonWidget.
+ // That's fine -- don't panic! I want to get rid of these DOM-based
+ // widgets anyway. DOM = cesspool.
+ mouseDown(x, y) {
+ // Every sub-class must implement this method.
+ // Return true iff the widget wants to "take ownership" of this event.
+ console.log("Called Widget.mouseDown()!!! " + this.name);
+ return false;
+ }
+ mouseMove(x, y) {
+ // As above, but returns nothing.
+ console.log("Called Widget.mouseMove()!!!");
+ }
+ mouseUp(x, y) {
+ // As above, but returns nothing.
+ console.log("Called Widget.mouseUp()!!!");
+ }
+}
+// Animations require some infrastructure.
+// BUG: Maybe this stuff should be in AnimationWidget.
+function doAnimation(theWidget) {
+ // This is called to render a frame of an animation. It is generated via
+ // the usual event-loop, so we schedule it just as we do for things like
+ // mouse-downs and scroll events.
+ // theWidget is the one that "runs" the animation, like a LoopWidget.
+ let id = Events.getID();
+ doAnimationGuts(id, theWidget);
+}
+async function doAnimationGuts(id, theWidget) {
+ // Scheduling is handled in a way similar to doScroll() in main.ts.
+ await Events.waitMyTurn(id);
+ await renderFrame(theWidget);
+ // Advance to the next frame.
+ theWidget.curStep += theWidget.stepsPerFrame;
+ theWidget.advanceFrame();
+ // Don't forget this or the program is bricked!
+ Events.allDone(id);
+}
+async function renderFrame(theWidget) {
+ // Calls the code to render the relevant figure. It renders the *entire*
+ // figure, widget and all.
+ //
+ // NOTE: This is used for animations, but it is also used to ensure
+ // that any change to a widget (and resulting changes to a figure)
+ // is shown.
+ //
+ // BUG: It's tempting to mention this in the user manual since users might
+ // find it useful. OTOH, that shouldn't be encouraged, and this is the kind
+ // of thing that might change in a later version.
+ // The "owner" is the function (from the latex document) that created
+ // theWidget.
+ let myFunc = getAugmentedFunction(theWidget.owner);
+ let fpc = myFunc.figurePanelClass;
+ // This is generally synchronous, but it doesn't hurt anything to tack an
+ // async on here. Maybe somebody will write one that *is* asynchronous.
+ await fpc.render();
+}
+function getFigureRect(theWidget) {
+ // Returns the width and height of the rectangle of the widget.
+ // The height is in two parts: the height above the x-axis, and the height
+ // below the x-axis.
+ // The units are pdf points, and the width is relative to the left
+ // margin. So the width matches the usual coordinate system for drawing
+ // the figure, and this width is equal to the text width, as reported
+ // by latex. So x in the range [0,width] should be limited to the area
+ // below the text.
+ let myFunc = getAugmentedFunction(theWidget.owner);
+ let fpc = myFunc.figurePanelClass;
+ let answer = { w: fpc.textWidth, ha: fpc.h - fpc.lowerPadding, hb: fpc.lowerPadding };
+ return answer;
+}
+// Base class for widgets that run animations. See LoopAnimWidget and
+// OpenAnimWidget. There is a fair amount of overlap between the two types
+// of animation class, and it is tempting to pull more stuff up to this level for
+// DRY reasons, but it seems cleaner and clearer to limit this to what's needed
+// to run the animations with doAnimation() and related functions.
+class AnimationWidget extends Widget {
+ constructor() {
+ super(...arguments);
+ // Animations run as a series of frames, and this is the frame being displayed.
+ // This value may be open-ended or it may "loop back" so that animation repeats.
+ this.curStep = 0;
+ // How much to advance the above with each frame -- an integer. Animations
+ // can be made to run faster by increasing this value, thereby skipping frames.
+ this.stepsPerFrame = 1;
+ // The process id for the call to setInterval().
+ this.animID = 0;
+ }
+ advanceFrame() {
+ // This is why the class is abstract. It moves curStep to the next frame,
+ // however that should be done for the particular animation.
+ console.log("Calling abstract AnimationWidget.advanceFrame()!");
+ }
+}
+// A LoopWidget is to be used when an animiation runs in a repeating loop.
+// You must have one of these for an animation to run, even if the widget
+// itself is invisible.
+class LoopAnimWidget extends AnimationWidget {
+ constructor() {
+ super(...arguments);
+ // These are as passed to register(). See that method for a description.
+ // They really shouldn't be touched outside this class. The boolean values
+ // are whether certain elements of the widget are visible (and hence
+ // available for interaction).
+ this.steps = 100;
+ this.start = 0;
+ this.timeStep = 20;
+ this.visSteps = true;
+ this.visFastSlow = true;
+ this.visPauseRun = true;
+ this.visCircle = true;
+ this.triGrab = true;
+ // This stuff is very much private.
+ // These are stored when the figure is drawn so that mouse events can find
+ // what was clicked more easily. It's simpler than recalculating with
+ // every event.
+ this.pCircle = null;
+ this.pUpStep = null;
+ this.pDownStep = null;
+ this.pFaster = null;
+ this.pSlower = null;
+ this.pPauseRun = null;
+ // The states of various parts of the widget; e.g., whether the pause
+ // or run icon is present, whether a part is "half-way clicked,"" etc.
+ // I'm using 'a' for 'active' and 's' for 'selected.'
+ //
+ // BUG: If I want to get *really* fancy, then I need another set of
+ // flags to indicate that the mouse *was* clicked on something, so it
+ // is "selected," but the user moved the mouse away from the item without
+ // a mouse-up, so that selected item should be drawn in normal color, not
+ // the highlighted color (sColor). If the mouse is moved back over the
+ // selected item, then the color can go back to being the selection color.
+ this.aRunning = true;
+ this.sCircle = false;
+ this.sPauseRun = false;
+ this.sFaster = false;
+ this.sSlower = false;
+ this.sUpStep = false;
+ this.sDownStep = false;
+ }
+ static register(ctx, x, y, scale, visWidget, steps, start, timeStep, visSteps, visFastSlow, visPauseRun, visCircle, triGrab, name) {
+ // BUG: Add an argument for the size of the steps so that
+ // curStep can be incremented by more than 1?
+ // This is used something like a constructor. It either creates a new
+ // LoopWidget and returns it, or returns one that was created earlier.
+ // Many of these arguments are the same as for Widget.constructor().
+ // In addition, we have
+ // * ctx is assumed to have a t-matrix prepared to properly draw
+ // the widget.
+ // * steps is the number of steps required to form a loop -- when it
+ // "rolls over" or the "steps per revolution."
+ // * start is the starting step, which will usually be zero.
+ // * timeStep, in milliseconds, is the time from frame to frame.
+ // It seems like anything less than about 10ms is pointless.
+ // My guess (?) is that the rate of event generation is throttled
+ // somehow. It could be that my various layers of management are
+ // slowing things down, but I don't think so. 10ms is an eternity
+ // on modern hardware. The eye can only follow about 20 frames per
+ // second, at most, or 50ms per frame, so this is no big deal.
+ // * visWidget is whether the widget is visible at all -- same as the
+ // vis argument to Widget.construtor().
+ // * visSteps is whether the time step controls (at the top) are visible.
+ // * visFastSlow is whether the faster/slower controls are visible (at
+ // the bottom)
+ // * visPauseRun is whether the pause/run controls are visible
+ // * visCircle is for the circle (with triangular indicator).
+ // * triGrab is whether the user is allowed to grab the indicator
+ // triangle and control the animation by dragging it. The indicator
+ // triangle is always there, but it might not be grabable.
+ // Note that if visCircle == false, then triGrab is implicitly false
+ // since the triangle isn't visible either.
+ // * name is as in Widget.constructor()
+ //
+ // There appears to be a tacit assumption that time is measured in
+ // integer steps, but fractional values are fine. So they aren't really
+ // time "steps," but more like time increments.
+ //
+ // BUG: Maybe I should have different classes for some of these choices.
+ // There are just too many. These could all use (internally) the
+ // same class, just not with such a crazy number of options.
+ // Instead of messing with LoopWidget.name or something, be explicit.
+ let type = "LoopWidget";
+ // Something like this line must appear with every regester() method
+ // for each widget.
+ let caller = getCaller();
+ // I am forcing the type here, but if the wrong type is returned,
+ // then there are bigger problems.
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ // Widget is known, but it needs to be drawn too.
+ w.draw(ctx);
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ // This class has NO construtor, by design, so this falls through to the
+ // super-class Widget constructor.
+ // Careful: Internally, I use an "is hidden" flag, but the user passes in
+ // an "is visible" flag.
+ // BUG: Change the names to be consistent.
+ w = new LoopAnimWidget(caller, type, x, y, scale, !visWidget, name);
+ // Now the additional stuff. This is what would be in a constructor
+ // if this class had one.
+ w.steps = steps;
+ w.start = start;
+ w.timeStep = timeStep;
+ w.visSteps = visSteps;
+ w.visFastSlow = visFastSlow;
+ w.visPauseRun = visPauseRun;
+ w.visCircle = visCircle;
+ w.triGrab = triGrab;
+ w.curStep = w.start;
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ // This is a special case because it's an animiation. The animation
+ // needs to be scheduled. It may make sense not to call setInterval()
+ // immediately; rather, it may be better to call setTimeout() so that
+ // setInterval() is called after a brief pause. It depends on how these
+ // two work. Try an immediate call; it *should* be fine.
+ w.animID = setInterval(doAnimation, w.timeStep, w);
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+ return w;
+ }
+ advanceFrame() {
+ // This kind of animation repeats.
+ this.curStep += this.stepsPerFrame;
+ if (this.curStep >= this.steps)
+ this.curStep -= this.steps;
+ }
+ draw(ctx) {
+ // This is drawn with (0,0) at the center of the circle. The ctx must be
+ // shifted and scaled based on where the user wants the widget relative
+ // to the larger drawing area.
+ if (this.hide === true)
+ return;
+ // Don't attempt to draw to a tikz file.
+ if (ctx instanceof CTX)
+ return;
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX, this.widgetY);
+ ctx.scale(this.scale, this.scale);
+ var p = new Path2D();
+ // These values determine where the entire drawing is. (cx,cy) is the
+ // center of the circular thing, with radius r.
+ // In unscaled terms, it's clear that cx should equal r to make the
+ // widget but up against x = 0. It's messier for the y-coordinate and you
+ // need to work backwards from what the values defined below. The total
+ // height is 2r (the circle), plus circWidth (circle line thickness),
+ // plus 2 * arrowHeight (the go fast/go slow things). Then we need to
+ // add the stuff on the top: upperGap, plus stepHeight, plus stepThick.
+ // This is silly and probably confusing to the user. Just place the
+ // widget relative to the center of the circle. In other words, set
+ // (cx,cy) = (0,0). The user just needs adjust accordingly, and
+ // exactly what he wants to do will be influenced by whether the upper
+ // and lower sub-controls are present.
+ var r = 40;
+ var cx = 0;
+ var cy = 0;
+ var circWidth = 3;
+ if (this.visCircle == true) {
+ // Draw the circle. (cx,cy) is center r and r are the two axes of the
+ // elipse. 0 is that the ellipse isn't rotated, and the last two are
+ // the start and end angle.
+ p.ellipse(cx, cy, r, r, 0, 0, 2 * Math.PI);
+ // Note this circle for reference by mouse events.
+ this.pCircle = new Path2D(p);
+ ctx.lineWidth = circWidth;
+ if (this.sCircle == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ ctx.stroke(p);
+ ctx.lineWidth = 1;
+ // A little triangle to point to the location within the animation loop.
+ // This value is in radians, in [0,2pi).
+ // Location of indicator triangle around the perimeter of the circle.
+ // Minus so that it travels clock-wise, which seems to be our natural expectation.
+ var loc = -2 * Math.PI * this.curStep / this.steps;
+ var triHeight = 10;
+ // This is half the full angle at the outer point.
+ var triAngle = Math.PI / 20;
+ p = new Path2D();
+ var x = cx + (r - circWidth / 2) * Math.cos(loc);
+ var y = cy + (r - circWidth / 2) * Math.sin(loc);
+ p.moveTo(x, y);
+ x = cx + (r - triHeight) * Math.cos(loc + triAngle);
+ y = cy + (r - triHeight) * Math.sin(loc + triAngle);
+ p.lineTo(x, y);
+ x = cx + (r - triHeight) * Math.cos(loc - triAngle);
+ y = cy + (r - triHeight) * Math.sin(loc - triAngle);
+ p.lineTo(x, y);
+ p.closePath();
+ ctx.strokeStyle = "red";
+ ctx.stroke(p);
+ ctx.strokeStyle = "black";
+ }
+ // Next, some controls at the bottom for going faster/slower and
+ // pausing/running.
+ // First, a pair of '>' for going faster.
+ let arrowOffset = 18;
+ let lowerGap = 6;
+ let arrowHeight = 7;
+ let arrowDepth = 4;
+ let arrowPairSpace = 3;
+ let arrowThick = 1.25;
+ if (this.visFastSlow === true) {
+ ctx.lineWidth = arrowThick;
+ if (this.sFaster == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx + arrowOffset + arrowDepth, cy - r - circWidth / 2 - lowerGap - arrowHeight);
+ p.lineTo(cx + arrowOffset, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight);
+ ctx.stroke(p);
+ // You can't just shift a path. Needs to be rebuilt.
+ // BUG: I need to add that ability to my FPath class.
+ // Maybe I have already?
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset + arrowPairSpace, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx + arrowOffset + arrowDepth + arrowPairSpace, cy - r - circWidth / 2 - lowerGap - arrowHeight);
+ p.lineTo(cx + arrowOffset + arrowPairSpace, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight);
+ ctx.stroke(p);
+ // A rectangle for the clickable area.
+ this.pFaster = new Path2D();
+ this.pFaster.rect(cx + arrowOffset - arrowThick, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight, arrowPairSpace + arrowDepth + 2 * arrowThick, 2 * arrowHeight);
+ // ctx.strokeStyle = 'green';
+ // ctx.stroke(this.pFaster);
+ // Same idea: '<' to go slower.
+ if (this.sSlower == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx - arrowOffset - arrowDepth, cy - r - circWidth / 2 - lowerGap - arrowHeight);
+ p.lineTo(cx - arrowOffset, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset - arrowPairSpace, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx - arrowOffset - arrowDepth - arrowPairSpace, cy - r - circWidth / 2 - lowerGap - arrowHeight);
+ p.lineTo(cx - arrowOffset - arrowPairSpace, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight);
+ ctx.stroke(p);
+ // And the clickable area.
+ this.pSlower = new Path2D();
+ this.pSlower.rect(cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick, cy - r - circWidth / 2 - lowerGap - 2 * arrowHeight, arrowPairSpace + arrowDepth + 2 * arrowThick, 2 * arrowHeight);
+ // ctx.strokeStyle = 'green';
+ // ctx.stroke(this.pSlower);
+ }
+ ctx.lineWidth = 1;
+ if (this.visPauseRun === true) {
+ // A || or triangle for pause or run.
+ let pauseSpace = 3.25;
+ let pauseThick = 1.5;
+ let pauseHeight = 2 * arrowHeight;
+ let runThick = 1.5;
+ let runLeftRight = 5;
+ let runHeight = 2 * arrowHeight;
+ if (this.sPauseRun == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ if (this.aRunning === true) {
+ // The animation is running, so show || to allow pausing.
+ ctx.lineWidth = pauseThick;
+ p = new Path2D();
+ p.moveTo(cx + pauseSpace, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx + pauseSpace, cy - r - circWidth / 2 - lowerGap - pauseHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx - pauseSpace, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx - pauseSpace, cy - r - circWidth / 2 - lowerGap - pauseHeight);
+ ctx.stroke(p);
+ ctx.lineWidth = 1;
+ }
+ else {
+ // Animation is paused, so show triangle to run it again.
+ ctx.lineWidth = runThick;
+ p = new Path2D();
+ p.moveTo(cx - runLeftRight, cy - r - circWidth / 2 - lowerGap);
+ p.lineTo(cx - runLeftRight, cy - r - circWidth / 2 - lowerGap - runHeight);
+ p.lineTo(cx + runLeftRight, cy - r - circWidth / 2 - lowerGap - runHeight / 2);
+ p.closePath();
+ ctx.stroke(p);
+ }
+ // Either way (paused or running), we need the clickable area.
+ // This area is too generous for the "run" triangle, because
+ // I use the same rectangle for "pause" and "run," but no big deal.
+ this.pPauseRun = new Path2D();
+ this.pPauseRun.rect(cx - runLeftRight - runThick, cy - r - circWidth / 2 - lowerGap - runHeight - runThick, 2 * runLeftRight + 2 * runThick, runHeight + 2 * runThick);
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pPauseRun);
+ // ctx.strokeStyle = "black";
+ }
+ ctx.lineWidth = 1;
+ // Now some symbols above the circle for adjusting the step size.
+ if (this.visSteps === true) {
+ // Up and down arrows.
+ let stepSpace = 20;
+ let stepThick = 2.0;
+ let upperGap = 8;
+ let stepHeight = 15;
+ let stepArrowHeight = 8;
+ let stepArrowWidth = 5;
+ ctx.lineWidth = stepThick;
+ if (this.sDownStep == true) {
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ ctx.fillStyle = LoopAnimWidget.sColor;
+ }
+ else {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+ // Vertical line
+ p = new Path2D();
+ p.moveTo(cx - stepSpace, cy + r + circWidth / 2 + upperGap);
+ p.lineTo(cx - stepSpace, cy + r + circWidth / 2 + upperGap + stepHeight);
+ ctx.stroke(p);
+ // Arrow head
+ p = new Path2D();
+ p.moveTo(cx - stepSpace, cy + r + circWidth / 2 + upperGap - stepThick);
+ p.lineTo(cx - stepSpace + stepArrowWidth, cy + r + circWidth / 2 + upperGap + stepArrowHeight - stepThick);
+ p.lineTo(cx - stepSpace - stepArrowWidth, cy + r + circWidth / 2 + upperGap + stepArrowHeight - stepThick);
+ p.closePath();
+ ctx.fill(p);
+ // Clickable area for down arrow.
+ this.pDownStep = new Path2D();
+ this.pDownStep.rect(cx - stepSpace - stepArrowWidth, cy + r + circWidth / 2 + upperGap - stepThick, 2 * stepArrowWidth, stepHeight + stepThick);
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pDownStep);
+ // ctx.strokeStyle = "black";
+ // ctx.lineWidth = stepThick;
+ // Again, to the right, arrow head up.
+ if (this.sUpStep == true) {
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ ctx.fillStyle = LoopAnimWidget.sColor;
+ }
+ else {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+ p = new Path2D();
+ p.moveTo(cx + stepSpace, cy + r + circWidth / 2 + upperGap);
+ p.lineTo(cx + stepSpace, cy + r + circWidth / 2 + upperGap + stepHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx + stepSpace, cy + r + circWidth / 2 + upperGap + stepHeight + stepThick);
+ p.lineTo(cx + stepSpace + stepArrowWidth, cy + r + circWidth / 2 + upperGap + stepHeight - stepArrowHeight + stepThick);
+ p.lineTo(cx + stepSpace - stepArrowWidth, cy + r + circWidth / 2 + upperGap + stepHeight - stepArrowHeight + stepThick);
+ p.closePath();
+ ctx.fill(p);
+ // Clickable area for up arrow.
+ this.pUpStep = new Path2D();
+ this.pUpStep.rect(cx + stepSpace - stepArrowWidth, cy + r + circWidth / 2 + upperGap, 2 * stepArrowWidth, stepHeight + stepThick);
+ // ctx.strokeStyle = "blue";
+ // ctx.lineWidth = 0.5;
+ // ctx.stroke(this.pUpStep);
+ // ctx.strokeStyle = "black";
+ ctx.lineWidth = 1;
+ // A little step icon.
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ stepThick = 1.5;
+ let stepSize = 6;
+ ctx.lineWidth = stepThick;
+ // Steps made as one path, starting at upper-left
+ p = new Path2D();
+ p.moveTo(cx - stepSize, cy + r + circWidth / 2 + upperGap + 2 * stepSize);
+ p.lineTo(cx, cy + r + circWidth / 2 + upperGap + 2 * stepSize);
+ p.lineTo(cx, cy + r + circWidth / 2 + upperGap + stepSize);
+ p.lineTo(cx + stepSize, cy + r + circWidth / 2 + upperGap + stepSize);
+ p.lineTo(cx + stepSize, cy + r + circWidth / 2 + upperGap);
+ ctx.stroke(p);
+ }
+ ctx.lineWidth = 1;
+ // Used this to verify the constants. The rectangle barely encloses
+ // the widget.
+ //ctx.strokeRect(
+ // -LoopWidget.Radius,-LoopWidget.Radius - LoopWidget.TopHeight,
+ // 2*LoopWidget.Radius,
+ // 2*LoopWidget.Radius + LoopWidget.TopHeight + LoopWidget.BottomHeight);
+ ctx.setTransform(saveT);
+ }
+ mouseDown(x, y) {
+ // (x,y) is given in coordinates relative to the owning figure.
+ // Return true iff these coordinates apply to this widget.
+ if (this.hide === true)
+ return false;
+ // Adjust coordinates relative to what the draw() methods uses.
+ // This way we can compare (x,y) to what is on the screen.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+ // There is isPointInPath() and isPointInStroke().
+ // It seems that isPointInPath() works on an abstract geometric basis;
+ // the lineWidth of the ctx doesn't matter. OTOH, isPointInStroke()
+ // is affected by the lineWidth -- as it must be to work in any
+ // reasonable way.
+ //
+ // Note also that isPointInPath() defaults to the non-zero winding rule.
+ // Pass "evenodd" as the final argument for that winding rule.
+ // Check the pause/run area first since it should be "on top of"
+ // the circle area.
+ if (this.pPauseRun !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun, x, y);
+ if (isin === true) {
+ this.sPauseRun = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // And the run faster area.
+ if (this.pFaster !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster, x, y);
+ if (isin === true) {
+ this.sFaster = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The run slower area.
+ if (this.pSlower !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower, x, y);
+ if (isin === true) {
+ this.sSlower = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The longer step area.
+ if (this.pUpStep !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep, x, y);
+ if (isin === true) {
+ this.sUpStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The shorter step area.
+ if (this.pDownStep !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep, x, y);
+ if (isin === true) {
+ this.sDownStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // Last thing to check since it should be "underneath" everything.
+ if (this.pCircle !== null) {
+ // If the user clicked near the circle, then set the indicator and
+ // current step to that position. Be generous with the clickable area.
+ WidgetManager.bogusCtx.lineWidth = 15;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pCircle, x, y);
+ if (isin === true) {
+ // Act on this click and take ownership for future draggging.
+ // Want an angle in [0,2pi].
+ this.sCircle = true;
+ // Again, minus since clockwise.
+ let alpha = -Math.atan2(y, x);
+ if (alpha < 0)
+ alpha += 2 * Math.PI;
+ this.curStep = Math.floor(this.steps * alpha / (2 * Math.PI));
+ WidgetManager.mouseOwner = this;
+ // The appearance of the widget has changed.
+ renderFrame(this);
+ return true;
+ }
+ }
+ return false;
+ }
+ mouseMove(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+ if (this.sCircle === true) {
+ // What I will do it check that the mouse is "close enough" to the
+ // circle, but it can be a *long* ways away.
+ WidgetManager.bogusCtx.lineWidth = 40;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pCircle, x, y);
+ if (isin == false)
+ return;
+ // Minus to make clockwise.
+ let alpha = -Math.atan2(y, x);
+ if (alpha < 0)
+ alpha += 2 * Math.PI;
+ this.curStep = Math.floor(this.steps * alpha / (2 * Math.PI));
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+ // BUG: I might (?) want colors to change based on what the mouse
+ // is over. See the BUG comment that goes with aRunning, sCircle, etc.,
+ // at the top of the class.
+ }
+ mouseUp(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+ // The mouse is up, so nothing can remain selected. In most cases,
+ // releasing the mouse over the selected item means that something
+ // must be done since the "button" was properly pressed.
+ this.sCircle = false;
+ if (this.sPauseRun) {
+ // Did they *release* the mouse over the pause/run area?
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun, x, y);
+ if (isin === true) {
+ // Start/stop the animation.
+ if (this.aRunning === true)
+ // Currently running. Pause it.
+ clearInterval(this.animID);
+ else
+ // Currently paused. Restart it.
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ // Change the pause/run icon too.
+ if (this.aRunning === true)
+ this.aRunning = false;
+ else
+ this.aRunning = true;
+ }
+ this.sPauseRun = false;
+ }
+ if (this.sFaster === true) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster, x, y);
+ if (isin === true) {
+ // Make the animation run a bit faster by reducing the frame-to-
+ // frame time step -- the animation speed. This could be done in
+ // a lot of different ways, by using a factor of 1.4 seems about
+ // right.
+ this.timeStep /= 1.4;
+ if (this.timeStep < 1)
+ this.timeStep = 1;
+ // Stop the animation and restart it at the new speed,
+ // but only if it is currently running. It restarts always, but
+ // don't try to halt it if it's not running.
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ this.aRunning = true;
+ }
+ this.sFaster = false;
+ }
+ if (this.sSlower === true) {
+ // Just as above, but make it go slower.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower, x, y);
+ if (isin === true) {
+ this.timeStep *= 1.4;
+ // More than a second per frame is silly.
+ if (this.timeStep > 1000)
+ this.timeStep = 1000;
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ this.aRunning = true;
+ }
+ this.sSlower = false;
+ }
+ if (this.sUpStep === true) {
+ // Make the number of time increments per frame larger.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep, x, y);
+ if (isin === true) {
+ // Use a smaller ratio here. Conceptually, it seems like
+ // this should be an integer, but it really doesn't have to be.
+ this.stepsPerFrame *= 1.25;
+ // Fewer than 3 frames per cycle seems silly. For most animations,
+ // you'd proably want at least 10 or 20, at a minimum.
+ if (this.stepsPerFrame > this.steps / 3)
+ this.stepsPerFrame = this.steps / 3;
+ }
+ this.sUpStep = false;
+ }
+ if (this.sDownStep === true) {
+ // As above.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep, x, y);
+ if (isin === true) {
+ this.stepsPerFrame /= 1.25;
+ // I am tempted to put a lower bound on this, but it's 'not
+ // absolutely necessary.
+ }
+ this.sDownStep = false;
+ }
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+}
+// These are useful to the user to help properly place things.
+// These values are given with scale equal to 1, and are worked
+// out from the actual drawing code.
+// The TopHeight is the amount above the circle that is used for the
+// time-step controls, and BottomHeight is the amount used for the
+// faster/slower, pause/run contols. If you don't want the circle at
+// all, then it's a little awkward to work out placement, but it works.
+// There is some imprecision here due to line thickneses, but very close.
+LoopAnimWidget.Radius = 41.5;
+LoopAnimWidget.TopHeight = 24.5;
+LoopAnimWidget.BottomHeight = 21.0;
+// When things are "selected," draw them in this color.
+LoopAnimWidget.sColor = "blue";
+// An OpenAnimWidget is for an open-ended animation that doesn't loop back
+// on itself and repeat. In many respects, it's similar to a LoopWidget.
+// It looks different because it's a long bar, sort of like a scroll bar.
+// It's so similar that there are minimal (for me) comments. See
+// LoopWidgets for certain details.
+class OpenAnimWidget extends AnimationWidget {
+ constructor() {
+ super(...arguments);
+ // These things are important to the animation drawing code, and are
+ // meant to be public(ish).
+ // These are as passed to register().
+ this.barLength = 100;
+ this.timeStep = 25;
+ this.decay = 1.0001;
+ this.visSteps = true;
+ this.visFastSlow = true;
+ this.visPauseRun = true;
+ this.visBar = true;
+ this.barGrab = true;
+ // As for LoopWidth, width modest changes:
+ // Clickable areas:
+ this.pBar = null;
+ this.pDot = null;
+ this.pFaster = null;
+ this.pSlower = null;
+ this.pPauseRun = null;
+ this.pUpStep = null;
+ this.pDownStep = null;
+ // States of parts:
+ //
+ // BUG: If I want to get *really* fancy, then I need another set of
+ // flags to indicate that the mouse *was* clicked on something, so it
+ // is "selected," but the user moved the mouse away from the item without
+ // a mouse-up, so that selected item should be drawn in normal color, not
+ // the highlighted color (sColor). If the mouse is moved back over the
+ // selected item, then the color can go back to being the selection color.
+ this.aRunning = true;
+ this.sDot = false;
+ this.sFaster = false;
+ this.sSlower = false;
+ this.sPauseRun = false;
+ this.sUpStep = false;
+ this.sDownStep = false;
+ }
+ static register(ctx, x, y, scale, width, visWidget, timeStep, decay, visSteps, visFastSlow, visPauseRun, visBar, barGrab, name) {
+ // This is used something like a constructor. It either creates a new
+ // LoopWidget and returns it, or returns one that was created earlier.
+ // Many of these arguments are the same as for Widget.constructor().
+ // In addition, we have
+ // * ctx is assumed to have a t-matrix prepared to properly draw
+ // the widget.
+ // * width is the length of the indicator bar. If you want both the
+ // controls (time steps and fast/slow), then this should be at least
+ // 200 so that the controls don't stick out. Of course, this is the
+ // unscaled size, and you can make the entire thing smaller with the
+ // scale argument.
+ // * timeStep, in milliseconds, is the time from frame to frame.
+ // * decay is complicated. The value of this.curStep must be mapped to
+ // the linear bar, which is not infinite.
+ // We need a map from [0,infty) to [0,width). Define
+ // f(s) = 1 - 1/a^s
+ // This maps [0,infty) to [0,1), provided that a > 1. Then
+ // g(s) = w f(s)
+ // is the function we want. But what about a? The closer a is to 1,
+ // the faster g(s) will approach w. Typically, you'll want a to be
+ // something like 1.001 or 1.0001, depending on the number of steps
+ // in your animation. The decay argment determines a:
+ // a = 1 + 1/decay, so you'll usually want decay to be somewhere in the
+ // range from 100 to (maybe) 100,000. It depends how big the steps
+ // are and how long you want the animiation to run. For comparison,
+ // decay = 1,000 puts f(2000) = 0.86 and f(5000) = 0.99, while
+ // decay = 10,000 puts f(2000) = 0.18, f(5000) = 0.39,
+ // f(20,000) = 0.86. You can also work backwards. If you want
+ // f(n) = x, where x is in [0,1), like x = 85%, then you want
+ // 1 / (1 + 1/a)^n = x, or
+ // a = 1 / [ x^(1/n) - 1 ]
+ // That's not so informative, but you can write it as
+ // a = 1 / [ exp(-ln(x)/n) - 1 ]
+ // If we take x \approx 0.86 so that ln(x) = -0.15 (exactly), then
+ // a = 1 / [ exp(-0.15/n) - 1 ]
+ // Plug in the value for n at which you want to have reached the
+ // 86% level, and you get a.
+ // For brevity, in the code, I use this.decay as the value, a,
+ // discussed above.
+ // BUG: I feel like I made an algebra mistake, but that's the idea.
+ // * visWidget is whether the widget is visible at all -- same as the
+ // vis argument to Widget.construtor().
+ // * visSteps is whether the time step controls (at the right) are visible.
+ // * visFastSlow is whether the faster/slower controls are visible (at
+ // the left)
+ // * visPauseRun is whether the pause/run controls are visible.
+ // * visBar is for the progress bar (with dot indicator).
+ // * barGrab is whether the user is allowed to grab the dot indicator
+ // triangle and control the animation by dragging it.
+ // * name is as in Widget.constructor()
+ //
+ // BUG: Maybe I should have different classes for some of these choices.
+ // There are just too many. These could all use (internally) the
+ // same class, just not with such a crazy number of options.
+ // As for LoopWidget.
+ let type = "OpenAnimWidget";
+ let caller = getCaller();
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ w.draw(ctx);
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ w = new OpenAnimWidget(caller, type, x, y, scale, !visWidget, name);
+ // Adjust the length for the scale so that if the user asks for
+ // a bar that is X px long, he gets it. So, the scale adjusts the size
+ // of the "bits", not the total size.
+ w.barLength = width / scale;
+ w.timeStep = timeStep;
+ w.visSteps = visSteps;
+ w.visFastSlow = visFastSlow;
+ w.visPauseRun = visPauseRun;
+ w.visBar = visBar;
+ w.barGrab = barGrab;
+ // For internal use, we convert the given decay to the value we use
+ // for exponentiation.
+ w.decay = 1 + 1 / decay;
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ // This is a special case because it's an animiation, as with LoopWidget.
+ w.animID = setInterval(doAnimation, w.timeStep, w);
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+ return w;
+ }
+ advanceFrame() {
+ // This animation is open-ended; curStep grows without limit (up to
+ // E500 or whatever it is).
+ this.curStep += this.stepsPerFrame;
+ }
+ draw(ctx) {
+ // This is drawn with (0,0) at the lower-right corner.
+ if (this.hide === true)
+ return;
+ // Don't draw the widget to a tikz file.
+ if (ctx instanceof CTX)
+ return;
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX, this.widgetY);
+ ctx.scale(this.scale, this.scale);
+ var p = new Path2D();
+ if (this.visBar == true) {
+ // These *could* be made accessible to the user, but we already
+ // have a heap of arguments to create this thing.
+ let indDotRadius = 5.0;
+ let barThick = 3.0;
+ let indDotThick = 2.0;
+ // Draw the indicator bar and dot.
+ // Bar first.
+ p.moveTo(0, indDotRadius + OpenAnimWidget.ControlsHeight);
+ p.lineTo(this.barLength, indDotRadius + OpenAnimWidget.ControlsHeight);
+ // Note this circle for reference by mouse events.
+ if (this.barGrab === true)
+ this.pBar = new Path2D(p);
+ ctx.lineWidth = barThick;
+ ctx.stroke(p);
+ // Now the dot.
+ p = new Path2D();
+ let dx = Math.pow(this.decay, this.curStep);
+ dx = this.barLength * (1 - 1 / dx);
+ p.ellipse(dx, indDotRadius + OpenAnimWidget.ControlsHeight, indDotRadius, indDotRadius, 0, 0, 2 * Math.PI);
+ if (this.barGrab === true)
+ this.pDot = new Path2D(p);
+ if (this.sDot == true)
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ else
+ ctx.fillStyle = "red";
+ ctx.fill(p);
+ ctx.lineWidth = indDotThick;
+ ctx.strokeStyle = "black";
+ ctx.stroke(p);
+ }
+ // There may be controls under the bar for faster/slower, pause/run
+ // and larger/smaller steps. Whatever of these is present, they should be
+ // centered, which is a pain. The total width of the pause/run controls
+ // is 40.5, obtained by checking the size of the box necessary to
+ // exactly enclose the controls. Height of that box is 14. I've set
+ // things up so that the height of the "step size" controls is also 14,
+ // and the width of that part is 32. These *could* be expressed in
+ // terms of the various constants defined below, but hard-coding is
+ // easier.
+ // These controls are drawn relative to their individual centers,
+ // so the shifting is done relative to those centers and their widths.
+ let pauseRunWidth = 40;
+ let stepsWidth = 32;
+ let intraGap = 8;
+ // Here (compared to LoopWidget), I use cx and cy to shift the parts
+ // of the control down and right. The right-shift is used for centering
+ // Changing the t-matrix of ctx would work too.
+ let cy = OpenAnimWidget.BarHeight - 4;
+ let cx = this.barLength / 2;
+ // We position the right bit, based on whether the left bit is present.
+ if (this.visSteps === true)
+ cx += intraGap + (pauseRunWidth / 2);
+ // Used for both fast/slow "chevrons" and for up/down arrows.
+ let arrowHeight = 7;
+ if (this.visFastSlow === true) {
+ // I made this a little tighter than for LoopWidget.
+ let arrowOffset = 12; //18;
+ let arrowDepth = 4;
+ let arrowPairSpace = 3;
+ let arrowThick = 1.25;
+ // First, a pair of '>' for going faster.
+ ctx.lineWidth = arrowThick;
+ if (this.sFaster == true)
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset, cy);
+ p.lineTo(cx + arrowOffset + arrowDepth, cy + arrowHeight);
+ p.lineTo(cx + arrowOffset, cy + 2 * arrowHeight);
+ ctx.stroke(p);
+ // You can't just shift a path. Needs to be rebuilt.
+ p = new Path2D();
+ p.moveTo(cx + arrowOffset + arrowPairSpace, cy);
+ p.lineTo(cx + arrowOffset + arrowDepth + arrowPairSpace, cy + arrowHeight);
+ p.lineTo(cx + arrowOffset + arrowPairSpace, cy + 2 * arrowHeight);
+ ctx.stroke(p);
+ // A rectangle for the clickable area.
+ this.pFaster = new Path2D();
+ this.pFaster.rect(cx + arrowOffset - arrowThick, cy, arrowPairSpace + arrowDepth + 2 * arrowThick, 2 * arrowHeight);
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "green";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pFaster);
+ ctx.strokeStyle = "black";
+ ctx.lineWidth = arrowThick;
+ */
+ // Same idea: '<' to go slower.
+ if (this.sSlower == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset, cy);
+ p.lineTo(cx - arrowOffset - arrowDepth, cy + arrowHeight);
+ p.lineTo(cx - arrowOffset, cy + 2 * arrowHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx - arrowOffset - arrowPairSpace, cy);
+ p.lineTo(cx - arrowOffset - arrowDepth - arrowPairSpace, cy + arrowHeight);
+ p.lineTo(cx - arrowOffset - arrowPairSpace, cy + 2 * arrowHeight);
+ ctx.stroke(p);
+ // And the clickable area.
+ this.pSlower = new Path2D();
+ this.pSlower.rect(cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick, cy, arrowPairSpace + arrowDepth + 2 * arrowThick, 2 * arrowHeight);
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "yellow";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pSlower);
+ ctx.strokeStyle = "black";
+ */
+ /*
+ // BUG: test box around entire thing.
+ p = new Path2D();
+ p.rect(cx - arrowOffset - arrowPairSpace - arrowDepth - arrowThick,cy,
+ 2*(arrowOffset + arrowPairSpace + arrowDepth + arrowThick),
+ 2*arrowHeight);
+
+ //let temp = 2*(arrowOffset + arrowPairSpace + arrowDepth + arrowThick);
+ //console.log("val: " +temp);
+
+ ctx.strokeStyle = "red";
+ ctx.stroke(p);
+ */
+ ctx.strokeStyle = "black";
+ }
+ ctx.lineWidth = 1;
+ if (this.visPauseRun === true) {
+ // A || or triangle for pause or run.
+ let pauseSpace = 3.25;
+ let pauseThick = 1.5;
+ let pauseHeight = 2 * arrowHeight;
+ let runThick = 1.5;
+ let runLeftRight = 5;
+ let runHeight = 2 * arrowHeight;
+ if (this.sPauseRun == true)
+ ctx.strokeStyle = LoopAnimWidget.sColor;
+ else
+ ctx.strokeStyle = "black";
+ if (this.aRunning === true) {
+ // The animation is running, so show || to allow pausing.
+ ctx.lineWidth = pauseThick;
+ p = new Path2D();
+ p.moveTo(cx + pauseSpace, cy);
+ p.lineTo(cx + pauseSpace, cy + pauseHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx - pauseSpace, cy);
+ p.lineTo(cx - pauseSpace, cy + pauseHeight);
+ ctx.stroke(p);
+ ctx.lineWidth = 1;
+ }
+ else {
+ // Animation is paused, so show triangle to run it again.
+ ctx.lineWidth = runThick;
+ p = new Path2D();
+ p.moveTo(cx - runLeftRight, cy);
+ p.lineTo(cx - runLeftRight, cy + runHeight);
+ p.lineTo(cx + runLeftRight, cy + runHeight / 2);
+ p.closePath();
+ ctx.stroke(p);
+ }
+ // Either way (paused or running), we need the clickable area.
+ // This area is too generous for the "run" triangle, because
+ // I use the same rectangle for "pause" and "run," but no big deal.
+ this.pPauseRun = new Path2D();
+ this.pPauseRun.rect(cx - runLeftRight - runThick, cy - runThick, 2 * runLeftRight + 2 * runThick, runHeight + 2 * runThick);
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pPauseRun);
+ ctx.strokeStyle = "black";
+ */
+ }
+ // And position the left controls, based on whether the ones on
+ // the right are present.
+ cy += 12.5;
+ cx = this.barLength / 2;
+ if ((this.visPauseRun === true) || (this.visFastSlow === true))
+ cx -= intraGap + stepsWidth / 2;
+ ctx.lineWidth = 1;
+ // Symbols for adjusting the step size.
+ if (this.visSteps === true) {
+ // Up and down arrows. This is a little smaller than for LoopWidget,
+ // so that the height matches the paure/run controls. I also
+ // tightened up the spacing a bit.
+ // Note that I am also using stepThick as a proxy for adjustment
+ // of the fact that the tip of the arrow head is a little tall.
+ let stepSpace = 12;
+ let stepThick = 2.0;
+ let stepHeight = 12.5;
+ let stepArrowHeight = 5.0;
+ let stepArrowWidth = 4.0;
+ ctx.lineWidth = stepThick;
+ if (this.sDownStep === true) {
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ }
+ else {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+ // Vertical line
+ p = new Path2D();
+ p.moveTo(cx - stepSpace, cy);
+ p.lineTo(cx - stepSpace, cy - stepHeight);
+ ctx.stroke(p);
+ // Arrow head
+ p = new Path2D();
+ p.moveTo(cx - stepSpace, cy + stepThick);
+ p.lineTo(cx - stepSpace + stepArrowWidth, cy - stepArrowHeight + stepThick);
+ p.lineTo(cx - stepSpace - stepArrowWidth, cy - stepArrowHeight + stepThick);
+ p.closePath();
+ ctx.fill(p);
+ // Clickable area for down arrow.
+ this.pDownStep = new Path2D();
+ this.pDownStep.rect(cx - stepSpace - stepArrowWidth, cy - stepHeight, 2 * stepArrowWidth, stepHeight + stepThick);
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pDownStep);
+ ctx.strokeStyle = "black";
+ ctx.lineWidth = stepThick;
+ */
+ // Again, to the right, arrow head up.
+ if (this.sUpStep === true) {
+ ctx.strokeStyle = OpenAnimWidget.sColor;
+ ctx.fillStyle = OpenAnimWidget.sColor;
+ }
+ else {
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ }
+ p = new Path2D();
+ p.moveTo(cx + stepSpace, cy + stepThick);
+ p.lineTo(cx + stepSpace, cy + stepThick - stepHeight);
+ ctx.stroke(p);
+ p = new Path2D();
+ p.moveTo(cx + stepSpace, cy - stepHeight);
+ p.lineTo(cx + stepSpace + stepArrowWidth, cy - stepHeight + stepArrowHeight);
+ p.lineTo(cx + stepSpace - stepArrowWidth, cy - stepHeight + stepArrowHeight);
+ p.closePath();
+ ctx.fill(p);
+ // Clickable area for up arrow.
+ this.pUpStep = new Path2D();
+ this.pUpStep.rect(cx + stepSpace - stepArrowWidth, cy - stepHeight, 2 * stepArrowWidth, stepHeight + stepThick);
+ /*
+ // BUG: testing
+ ctx.strokeStyle = "blue";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(this.pUpStep);
+ ctx.strokeStyle = "black";
+ */
+ ctx.lineWidth = 1;
+ // A little step icon.
+ ctx.strokeStyle = "black";
+ ctx.fillStyle = "black";
+ stepThick = 1.5;
+ let stepSize = 5;
+ ctx.lineWidth = stepThick;
+ // Steps made as one path, starting at upper-left
+ p = new Path2D();
+ p.moveTo(cx - stepSize, cy - 2 * stepSize);
+ p.lineTo(cx, cy - 2 * stepSize);
+ p.lineTo(cx, cy - stepSize);
+ p.lineTo(cx + stepSize, cy - stepSize);
+ p.lineTo(cx + stepSize, cy);
+ ctx.stroke(p);
+ /*
+ // BUG: Testing box around it all.
+ p = new Path2D();
+ p.rect(cx - stepSpace - stepArrowWidth,cy - stepHeight,
+ 2*(stepSpace + stepArrowWidth),
+ stepHeight + stepThick);
+
+ ctx.strokeStyle = "red";
+ ctx.lineWidth = 0.5;
+ ctx.stroke(p);
+
+ //let temp = 2*(stepSpace + stepArrowWidth);
+ //let temp = stepHeight + stepThick;
+ //console.log("val: " + temp);
+ */
+ ctx.strokeStyle = "black";
+ }
+ ctx.lineWidth = 1;
+ ctx.setTransform(saveT);
+ }
+ mouseDown(x, y) {
+ // (x,y) is given in coordinates relative to the owning figure.
+ // Return true iff these coordinates apply to this widget.
+ // BUG: This is almost identical to LoopWidget. DRY?
+ if (this.hide === true)
+ return false;
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+ // The run faster area.
+ if (this.pFaster !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster, x, y);
+ if (isin === true) {
+ this.sFaster = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The run slower area.
+ if (this.pSlower !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower, x, y);
+ if (isin === true) {
+ this.sSlower = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The pause/run area.
+ if (this.pPauseRun !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun, x, y);
+ if (isin === true) {
+ this.sPauseRun = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The longer step area.
+ if (this.pUpStep !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep, x, y);
+ if (isin === true) {
+ this.sUpStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // The shorter step area.
+ if (this.pDownStep !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep, x, y);
+ if (isin === true) {
+ this.sDownStep = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ // Last thing to check since it should be "underneath" everything,
+ // although I don't think there's the same kind of overlap that
+ // there was for LoopWidget.
+ if (this.pDot !== null) {
+ // See whether the user clicked on or near the dot. He must click
+ // on the dot, not at some random point along the bar.
+ WidgetManager.bogusCtx.lineWidth = 2;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pDot, x, y);
+ if (isin === false)
+ isin = WidgetManager.bogusCtx.isPointInPath(this.pDot, x, y);
+ if (isin === true) {
+ this.sDot = true;
+ // Move the dot (slightly) so that it is centered at (x,y).
+ // We don't actually "move the dot;" instead we adjust
+ // this.curStep to put the dot where we want it. That is, we
+ // invert g(s) = w (1-1/a^s). See the discussion, in register(),
+ // of this function. We have
+ // x = w (1 - 1/a^s)
+ // a^s = w / (w - x)
+ // s = log_a [ w / (w - x) ]
+ // And recall that log_a (z) = ln(z) / ln(a).
+ let ratio = this.barLength / (this.barLength - x);
+ let s = Math.log(ratio) / Math.log(this.decay);
+ if (s < 0)
+ s = 0;
+ this.curStep = s;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ return false;
+ }
+ mouseMove(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+ if (this.sDot === true) {
+ // What I will do it check that the mouse is "close enough" to the
+ // bar, but it can be a long ways away.
+ WidgetManager.bogusCtx.lineWidth = 20;
+ let isin = WidgetManager.bogusCtx.isPointInStroke(this.pBar, x, y);
+ if (isin == false)
+ return;
+ let ratio = this.barLength / (this.barLength - x);
+ let s = Math.log(ratio) / Math.log(this.decay);
+ if (s < 0)
+ s = 0;
+ this.curStep = s;
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+ // BUG: I might (?) want colors to change based on what the mouse
+ // is over. See the BUG comment that goes with aRunning, sCircle, etc.,
+ // at the top of the class.
+ }
+ mouseUp(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+ // The mouse is up, so nothing can remain selected. In most cases,
+ // releasing the mouse over the selected item means that something
+ // must be done since the "button" was properly pressed.
+ this.sDot = false;
+ if (this.sFaster === true) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pFaster, x, y);
+ if (isin === true) {
+ this.timeStep /= 1.4;
+ if (this.timeStep < 1)
+ this.timeStep = 1;
+ // Stop the animation and restart it at the new speed
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ this.aRunning = true;
+ }
+ this.sFaster = false;
+ }
+ if (this.sSlower === true) {
+ // Just as above, but make it go slower.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pSlower, x, y);
+ if (isin === true) {
+ this.timeStep *= 1.4;
+ // More than a second per frame is silly.
+ if (this.timeStep > 1000)
+ this.timeStep = 1000;
+ if (this.aRunning === true)
+ clearInterval(this.animID);
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ this.aRunning = true;
+ }
+ this.sSlower = false;
+ }
+ if (this.sPauseRun) {
+ // Did they *release* the mouse over the pause/run area?
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pPauseRun, x, y);
+ if (isin === true) {
+ // Start/stop the animation.
+ if (this.aRunning === true)
+ // Currently running. Pause it.
+ clearInterval(this.animID);
+ else
+ // Currently paused. Restart it.
+ this.animID = setInterval(doAnimation, this.timeStep, this);
+ // Change the pause/run icon too.
+ if (this.aRunning === true)
+ this.aRunning = false;
+ else
+ this.aRunning = true;
+ }
+ this.sPauseRun = false;
+ }
+ if (this.sUpStep === true) {
+ // Make the number of time increments per frame larger.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pUpStep, x, y);
+ if (isin === true) {
+ // Use a smaller ratio here. Conceptually, it seems like
+ // this should be an integer, but it really doesn't have to be.
+ // Unlike LoopWidget, there's no upper limit on the number
+ // of steps per frame.
+ this.stepsPerFrame *= 1.25;
+ }
+ this.sUpStep = false;
+ }
+ if (this.sDownStep === true) {
+ // As above.
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDownStep, x, y);
+ if (isin === true)
+ this.stepsPerFrame /= 1.25;
+ this.sDownStep = false;
+ }
+ // The appearance of the widget may have changed.
+ renderFrame(this);
+ }
+}
+// These are useful to the user to help properly place things.
+// The widget is placed based on the lower-left corner, and the
+// user can specify the width. The BarHeight is the height of the
+// bar portion -- it's essentially the radius of the indicator dot --
+// and ControlsHeight is for the controls.
+OpenAnimWidget.BarHeight = 6.0;
+OpenAnimWidget.ControlsHeight = 20.0;
+// This is useful to help the user place stuff above the control.
+OpenAnimWidget.TotalHeight = 32.0;
+// When things are "selected," draw them in this color.
+OpenAnimWidget.sColor = "blue";
+// This is to allow dragging points around. After the much more complicated
+// animation widgets, this is a lot easier. One difference is that dots
+// are not drawn automatically; the user must call the widget's draw()
+// method. This is because the order of drawing may matter -- what should
+// be on top?
+//
+// At one point, this was more flexible, but -- see DraggableDrawWidget below
+// -- it seems better to keep this widget simple (just dots).
+class DraggableDotWidget extends Widget {
+ constructor() {
+ super(...arguments);
+ // The clickable area for the dot, and whether it is selected.
+ // pDot : Path2D | null = null;
+ this.pDot = null;
+ this.selected = false;
+ // The default radius of a dot.
+ this.dotRadius = 3.0;
+ }
+ static register(ctx, x, y, name) {
+ // As with other widgets. Note that there is no scale since it doesn't
+ // make sense here.
+ let type = "DraggableDotWidget";
+ let caller = getCaller();
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ // The 'false' here means that we always assume the dot is visible. Leting
+ // this be invisible would be pointless, although it is hidable by
+ // directly changing the Widget.hide field.
+ w = new DraggableDotWidget(caller, type, x, y, 1.0, false, name);
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ // Note that we do *not* draw this widget here.
+ return w;
+ }
+ draw(ctx) {
+ // Because these widgets might be drawn for tikz output, this uses
+ // FPath instead of Path2D.
+ //
+ // BUG: As a rule, I don't think people will want most widgets (like
+ // LoopWidget) to be drawn to the paper version, but I suppose it should
+ // be possible. *I* would like it for documentation purposes.
+ if (this.hide === true)
+ return;
+ // Adjusting the coordinates this way feels a little weird, but it's
+ // how the other widgets work, and it's actually easier.
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX, this.widgetY);
+ ctx.scale(this.scale, this.scale);
+ // BUG: Somehow, sometimes using FPath puts hair on these dots??
+ // It looks like it happens where the segments meet. There's probably
+ // some algebra mistake. Either that or the JS implementation of
+ // bezier curves sucks. For now, I do not use bezier curves, and
+ // leave it as an ellipse internally.
+ let p = new FPath();
+ //let p = new Path2D();
+ let r = this.dotRadius;
+ p.ellipse(0, 0, r, r, 0, 0, 2 * Math.PI, true);
+ //this.pDot = new Path2D(p);
+ // this.pDot = new FPath(p);
+ this.pDot = p;
+ if (this.selected === true)
+ ctx.fillStyle = DraggableDotWidget.sColor;
+ else
+ ctx.fillStyle = "red";
+ ctx.fill(p);
+ ctx.setTransform(saveT);
+ }
+ mouseDown(x, y) {
+ if (this.hide === true)
+ return false;
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ // The widget also has a scale, which must be taken into account.
+ WidgetManager.bogusCtx.resetTransform();
+ if (this.pDot !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDot, x, y);
+ if (isin === true) {
+ this.selected = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ return false;
+ }
+ mouseMove(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ // Restrict to be within the figure area, at the least.
+ // By default (the code here, not this.drawSelFcn, whatever that might
+ // do), the dot doesn't get "lost," but it can be drawn partially outside
+ // the figure proper, leaving "crumbs" that aren't erased until you
+ // scroll the page.
+ let wh = getFigureRect(this);
+ // Rrestrict to the entire figure rectangle, tightened up a bit.
+ wh.w -= 2 * this.dotRadius;
+ wh.ha -= 2 * this.dotRadius;
+ wh.hb -= 2 * this.dotRadius;
+ // Note the minus with hb. The "height below" is a postive value, but
+ // we are comparing to a potentially negative y.
+ if (x <= this.dotRadius)
+ return;
+ if (x >= wh.w)
+ return;
+ if (y <= -wh.hb)
+ return;
+ if (y >= wh.ha)
+ return;
+ if (this.selected === true) {
+ this.widgetX = x;
+ this.widgetY = y;
+ renderFrame(this);
+ }
+ }
+ mouseUp(x, y) {
+ if (this.hide === true)
+ return;
+ // This is more round-about because of the possibility that the
+ // mouse-up occured outside the figure area. We need to reach
+ // the renderFrame() line whatever happens.
+ if (this.selected === true) {
+ this.selected = false;
+ let wh = getFigureRect(this);
+ wh.w -= 2 * this.dotRadius;
+ wh.ha -= 2 * this.dotRadius;
+ wh.hb -= 2 * this.dotRadius;
+ // Note the minus with hb. The "height below" is a postive value, but
+ // we are comparing to a potentially negative y.
+ if ((x > this.dotRadius) && (x < wh.w) &&
+ // (y > this.dotRadius) && (y < wh.h))
+ (y > -wh.hb) && (y < wh.ha)) {
+ this.widgetX = x;
+ this.widgetY = y;
+ }
+ renderFrame(this);
+ }
+ }
+}
+// When things are "selected," draw them in this color.
+DraggableDotWidget.sColor = "blue";
+class DraggableDrawWidget extends Widget {
+ constructor() {
+ super(...arguments);
+ // The clickable area for the "dot" (which could have any shape)
+ // and whether it is selected.
+ this.pDot = null;
+ this.selected = false;
+ // The user must provide these functions.
+ // Note the litle cheat to make the ts compiler shut its yapper.
+ this.drawFcn = null;
+ this.drawSelFcn = null;
+ this.testPosFcn = null;
+ }
+ static register(ctx, x, y, drawFcn, drawSelFcn, testPosFcn, name) {
+ // The drawFcn should be defined to draw whatevever it wants.
+ // It should take the ctx as the sole argument, and return a path
+ // such that a click in the path (using ctx.isPointInPath()).
+ //
+ // The drawSelFcn is similar, but is used for drawing when the
+ // item is selected -- so that the user can change the color or
+ // whatever.
+ //
+ // The testPosFcn receives (x,y) as an argument, along with the (w,h)
+ // of the figure area (in pdf points) and should return
+ // true (point is acceptable) or false (not acceptable).
+ let type = "DraggableDrawWidget";
+ let caller = getCaller();
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ // The 'false' here means that we always assume the dot is visible. Leting
+ // this be invisible would be pointless, although it is hidable by
+ // directly changing the Widget.hide field.
+ w = new DraggableDrawWidget(caller, type, x, y, 1.0, false, name);
+ w.drawFcn = drawFcn;
+ w.drawSelFcn = drawSelFcn;
+ w.testPosFcn = testPosFcn;
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ return w;
+ }
+ draw(ctx) {
+ // Because these widgets might be drawn for tikz output, this uses
+ // FPath instead of Path2D.
+ //
+ // BUG: As a rule, I don't think people will want most widgets (like
+ // LoopWidget) to be drawn to the paper version, but I suppose it should
+ // be possible. *I* would like it for documentation purposes.
+ if (this.hide === true)
+ return;
+ // Adjusting the coordinates this way feels a little weird, but it's
+ // how the other widgets work, and it's actually easier.
+ let saveT = ctx.getTransform();
+ ctx.translate(this.widgetX, this.widgetY);
+ ctx.scale(this.scale, this.scale);
+ if (this.selected === true)
+ this.pDot = this.drawSelFcn(ctx);
+ else
+ this.pDot = this.drawFcn(ctx);
+ ctx.setTransform(saveT);
+ }
+ mouseDown(x, y) {
+ //console.log("dot down");
+ if (this.hide === true)
+ return false;
+ // Adjust coordinates relative to what the draw() methods uses.
+ x -= this.widgetX;
+ y -= this.widgetY;
+ x /= this.scale;
+ y /= this.scale;
+ WidgetManager.bogusCtx.resetTransform();
+ if (this.pDot !== null) {
+ let isin = WidgetManager.bogusCtx.isPointInPath(this.pDot, x, y);
+ if (isin === true) {
+ this.selected = true;
+ WidgetManager.mouseOwner = this;
+ renderFrame(this);
+ return true;
+ }
+ }
+ return false;
+ }
+ mouseMove(x, y) {
+ // As above.
+ if (this.hide === true)
+ return;
+ // Restrict to be within the figure area, at the least.
+ // By default (the code here, not this.drawSelFcn, whatever that might
+ // do), the dot doesn't get "lost," but it can be drawn partially outside
+ // the figure proper, leaving "crumbs" that aren't erased until you
+ // scroll the page.
+ let wh = getFigureRect(this);
+ if (this.testPosFcn(x, y, wh.w, wh.ha, wh.hb) === false)
+ return;
+ if (this.selected === true) {
+ this.widgetX = x;
+ this.widgetY = y;
+ renderFrame(this);
+ }
+ }
+ mouseUp(x, y) {
+ if (this.hide === true)
+ return;
+ // This is more round-about because of the possibility that the
+ // mouse-up occured outside the figure area. We need to reach
+ // the renderFrame() line whatever happens.
+ if (this.selected === true) {
+ this.selected = false;
+ let wh = getFigureRect(this);
+ if (this.testPosFcn(x, y, wh.w, wh.ha, wh.hb) === true) {
+ this.widgetX = x;
+ this.widgetY = y;
+ }
+ renderFrame(this);
+ }
+ }
+}
+// When things are "selected," draw them in this color.
+DraggableDrawWidget.sColor = "blue";
+// A numerical value widget. This uses an HTML <input type = "number">
+// thing by putting it on top of the canvas. Using HTML this way is not the
+// direction I want to go, but I do want to see if it's feasible and what's
+// involved. Certain widgets that already exist in HTML are probably not
+// worth building from scratch as "pure canvas" widgets. Also, this
+// allows me to delay dealing with keyboard events.
+//
+// The idea is to put the HTML widget on top of the canvas, with absolute
+// placement.
+//
+// NOTE: Firefox generates a warning about "ansynchronous panning." Somehow
+// it sees that I'm doing something tricky and warns about it. As far as I
+// can tell, I'm not doing anything likely to be deprecated or problematic
+// in the future. Edge doesn't complain.
+class NumberInputWidget extends Widget {
+ constructor() {
+ super(...arguments);
+ // An HTML <input type = "number"> thing. This is the HTML DOM element,
+ // like from document.getElementById() or createElement("input").
+ this.theWidget = null;
+ }
+ static register(ctx, x, y, v, name) {
+ // Even fewer arguments than usual.
+ // v = initial value;
+ let type = "NumberInputWidget";
+ let caller = getCaller();
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ w.draw(ctx);
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ w = new NumberInputWidget(caller, type, x, y, 1.0, false, name);
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ // The usual syntax for this within HTML is
+ // <input type="number" id="something" name="whatever" min="10" max="100">
+ // There are some other possible settings too. See
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number
+ //
+ // BUG: There's some funny business here that I don't like at all.
+ // These DOM elements are placed relative to the body as a whole,
+ // not the canvas. So, I need to know where the figure containing
+ // this widget falls on the entire document. The body height is adjusted
+ // when I tweak the scroll bars (mainbody.style.height and width),
+ // and the widget needs to be placed relative to that.
+ //
+ // As a result, every time the user zooms (or resizes the window),
+ // every widget placed in the DOM this way needs to be repositioned.
+ // One reasonable way to deal with that is to recalculate the position
+ // every time draw() is called.
+ //
+ // So this isn't really a BUG; it works as intended. But using
+ // HTML this way is an entirely different (and unpleasant) approach.
+ w.theWidget = document.createElement("input");
+ w.theWidget.setAttribute("type", "number");
+ w.theWidget.value = v.toString();
+ w.theWidget.style.position = "absolute";
+ w.theWidget.style.display = "block";
+ w.theWidget.style.left = 400 + "px";
+ w.theWidget.style.top = 900 + "px";
+ w.theWidget.style.width = 50 + "px";
+ w.theWidget.style.height = 10 + "px";
+ w.theWidget.style.zIndex = "99";
+ document.body.appendChild(w.theWidget);
+ // The owner will want to redraw it's figure when this changes.
+ w.theWidget.onchange = function () {
+ // console.log("change");
+ let myFunc = getAugmentedFunction(w.owner);
+ let fpc = myFunc.figurePanelClass;
+ fpc.render();
+ };
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+ return w;
+ }
+ getValue() {
+ // Return the numerical value.
+ //
+ // BUG: This seems to return a string -- whatever is in the field.
+ // The caller will typically need to do parseInt() or parseFloat()
+ // on the result. If this widget were better, then it would know
+ // what it's supposed to return and limit the possible things it can hold.
+ // BUG: I should probably have getter functions for everything in
+ // all widgets instead of having the user access fields directly.
+ // So, define LoopWidget.getCurStep(), etc.
+ // It doesn't *really* matter, but it makes it clearer to the user
+ // what he's supposed to have access to.
+ return this.theWidget.value;
+ }
+ draw(ctx) {
+ // This widget is really an HTML DOM element, so this function doesn't
+ // actually draw the widget. It repositions the element in the DOM.
+ // See the discussion in register().
+ // BUG: make accessing this information a function, like I did
+ // for getFigureRect().
+ let myFunc = getAugmentedFunction(this.owner);
+ let fpc = myFunc.figurePanelClass;
+ let totalV = fpc.totalV;
+ // The vertical position is relatively easy, but the horizontal position
+ // requires a calculation similar to fullRender() since the page
+ // is centered. Also, the vertical position must be given in LH coordinates
+ // relative to the entire document.
+ // BUG: Make this calculation a function used in main.js too.
+ // Can I combine with what's done for mouse events there too?
+ // In fact, this is more like the mouse calculation than like fullRender().
+ let vpos = fpc.totalV + fpc.h - this.widgetY;
+ // let vpos = totalV + this.widgetY;
+ // BUG: I don't like reaching into the DOM this way to get the canvas,
+ // but what is the alternative?
+ let hpos = this.widgetX;
+ let canvas = document.getElementById("pdf_renderer");
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+ hpos = hpos + (canvasCenter - docCenter);
+ }
+ else {
+ // Shift according to the horizontal scroll bar.
+ hpos = hpos - window.scrollX;
+ }
+ hpos += fpc.margin;
+ //console.log("wid at " +hpos+ " " +vpos);
+ // Don't forget the stupid "px"!
+ this.theWidget.style.top = vpos + "px";
+ this.theWidget.style.left = hpos + "px";
+ }
+}
+// Another DOM-based widget. A simple button.
+class ButtonWidget extends Widget {
+ constructor() {
+ super(...arguments);
+ // An HTML <input type = "button"> thing.
+ this.theWidget = null;
+ // Sometimes you want to treat the button as a boolean
+ // Each time the button is clicked, this toggles.
+ this.clickState = false;
+ // And this is set to true whenever the button is clicked.
+ this.resetState = false;
+ }
+ static register(ctx, x, y, text, name) {
+ // Even fewer arguments than usual.
+ let type = "ButtonWidget";
+ let caller = getCaller();
+ let w = WidgetManager.knownWidget(caller, type, name);
+ if (w != null) {
+ w.draw(ctx);
+ return w;
+ }
+ // Got here, so this widget is not already known, and must be created.
+ w = new ButtonWidget(caller, type, x, y, 1.0, false, name);
+ // Note the existence of this widget for the future.
+ WidgetManager.register(w);
+ // The usual syntax for this within HTML is
+ // <button type="button" id="something" name="whatever">
+ //
+ // BUG: There's some funny business here that I don't like at all.
+ // These DOM elements are placed relative to the body as a whole,
+ // not the canvas. So, I need to know where the figure containing
+ // this widget falls on the entire document. The body height is adjusted
+ // when I tweak the scroll bars (mainbody.style.height and width),
+ // and the widget needs to be placed relative to that.
+ //
+ // As a result, every time the user zooms (or resizes the window),
+ // every widget placed in the DOM this way needs to be repositioned.
+ // One reasonable way to deal with that is to recalculate the position
+ // every time draw() is called.
+ //
+ // So this isn't really a BUG; it works as intended. But using
+ // HTML this way is an entirely different (and unpleasant) approach.
+ w.theWidget = document.createElement("button");
+ w.theWidget.setAttribute("type", "button");
+ w.theWidget.style.fontSize = "10px";
+ w.theWidget.textContent = text;
+ w.theWidget.style.position = "absolute";
+ w.theWidget.style.display = "block";
+ w.theWidget.style.left = 400 + "px";
+ w.theWidget.style.top = 900 + "px";
+ //w.theWidget.style.width = 100+"px"; // Width automatic, based on text.
+ w.theWidget.style.height = 18 + "px";
+ w.theWidget.style.zIndex = "99";
+ document.body.appendChild(w.theWidget);
+ // Need to hear about clicks....
+ // BUG: I would have thought that this would work, but I don't think that
+ // the doClick() method is seeing the correct class instance or something.
+ //w.theWidget.addEventListener('click',w.doClick,false);
+ // Instead, define the action here.
+ w.theWidget.addEventListener('click', () => {
+ if (w.clickState === false)
+ w.clickState = true;
+ else {
+ w.clickState = false;
+ w.resetState = true;
+ }
+ // If the figure is part of an animation, then it will be drawn taking
+ // into account this click in the next frame. If the figure is *not*
+ // an animation, then we need to refresh.
+ let myFunc = getAugmentedFunction(w.owner);
+ let fpc = myFunc.figurePanelClass;
+ fpc.render();
+ }, false);
+ // Before returning the widget, it must be drawn.
+ w.draw(ctx);
+ return w;
+ }
+ doClick() {
+ // BUG: This doesn't work. See above.
+ if (this.clickState === false)
+ this.clickState = true;
+ else
+ this.clickState = false;
+ //console.log("swapped click");
+ }
+ draw(ctx) {
+ // This widget is really an HTML DOM element, so this function doesn't
+ // actually draw the widget. It repositions the element in the DOM.
+ // See the discussion in register().
+ let myFunc = getAugmentedFunction(this.owner);
+ let fpc = myFunc.figurePanelClass;
+ // The horizontal position requires a calculation similar to fullRender()
+ // since the page is centered and the vertical position must be given
+ // in LH coordinates relative to the entire document.
+ // BUG: Make this calculation a function used in main.js too.
+ // Can I combine with what's done for mouse events there too?
+ // In fact, this is more like the mouse calculation than like fullRender().
+ let vpos = fpc.totalV + fpc.h - this.widgetY;
+ let hpos = this.widgetX;
+ // BUG: Again, with the DOM access.
+ let canvas = document.getElementById("pdf_renderer");
+ let visWidth = document.documentElement.clientWidth;
+ let totWidth = FullPanel.getFullWidth();
+ if (visWidth > totWidth) {
+ // No horizontal scroll bar. Center it.
+ let canvasCenter = canvas.width / 2;
+ let docCenter = FullPanel.getFullWidth() / 2;
+ canvasCenter = canvasCenter / PDFDocument.getZoom();
+ hpos = hpos + (canvasCenter - docCenter);
+ }
+ else {
+ // Shift according to the horizontal scroll bar.
+ hpos = hpos - window.scrollX;
+ }
+ hpos += fpc.margin;
+ // It seems that these must be placed using style.top, not style.bottom.
+ // The clientHeight seems to be the height of the text in the button,
+ // which style.height is the actually button. Don't forget the stupid "px"!
+ let w = this.theWidget;
+ w.style.top = (vpos - parseInt(w.style.height, 10)) + "px";
+ w.style.left = hpos + "px";
+ }
+}
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 4a02b15939..522c8dcc31 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -1,8 +1,5 @@
$mirrors = {
'Africa' => {
- 'Morocco' => {
- 'https://mirror.marwan.ma/ctan/' => 1,
- },
'South Africa' => {
'http://ftp.sun.ac.za/ftp/CTAN/' => 1,
'https://mirror.ufs.ac.za/ctan/' => 1,
@@ -30,13 +27,13 @@ $mirrors = {
'http://ctan.imsc.res.in/' => 1,
},
'Indonesia' => {
+ 'http://repo.ugm.ac.id/ctan/' => 1,
'https://mirror.unpad.ac.id/ctan/' => 1,
},
'Iran' => {
'http://ctan.yazd.ac.ir/' => 1,
'https://ctan.asis.sh/' => 1,
'https://ctan.um.ac.ir/' => 1,
- 'https://mirror.bardia.tech/ctan/' => 1,
},
'Japan' => {
'http://ring.airnet.ne.jp/archives/text/CTAN/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 476ec0e64b..83fbb8b604 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2022
-depend revision/63954
+depend revision/63957
name 00texlive.image
category TLCore
-revision 63949
+revision 63957
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -1770,6 +1770,7 @@ runfiles size=12912
tlpkg/tlpsrc/figbib.tlpsrc
tlpkg/tlpsrc/figchild.tlpsrc
tlpkg/tlpsrc/figflow.tlpsrc
+ tlpkg/tlpsrc/figput.tlpsrc
tlpkg/tlpsrc/figsize.tlpsrc
tlpkg/tlpsrc/filecontents.tlpsrc
tlpkg/tlpsrc/filecontentsdef.tlpsrc
@@ -4603,7 +4604,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 63951
+revision 63956
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -70997,7 +70998,7 @@ containerchecksum bc842942513a72c6a0f2346025739f09477ae1e920eaefc5e396e0b68ba534
name collection-pictures
category Collection
-revision 63947
+revision 63957
shortdesc Graphics, pictures, diagrams
relocated 1
longdesc Including TikZ, pict, etc., but MetaPost and PStricks are
@@ -71055,6 +71056,7 @@ depend euflag
depend fast-diagram
depend fig4latex
depend figchild
+depend figput
depend fitbox
depend flowchart
depend forest
@@ -71231,8 +71233,8 @@ depend worldflags
depend xistercian
depend xpicture
depend xypic
-containersize 1524
-containerchecksum 6236545f374404446cd1edf9632fd48e7d40e836947ce755dcc814bde5658ff6c78eaa70ffe5167dae853a49ae35cde5fc2196e62a0c87b1dc51fdb8313c57ee
+containersize 1528
+containerchecksum 1cbf15603fc597ba17d5e57545dc82db45aa0b0b1a29154cbc4079a00fb3b837fae81b2c4017aee5a267388e829b7999d8675e68a31d59be3f87fd17f53e488f
name collection-plaingeneric
category Collection
@@ -119458,6 +119460,51 @@ catalogue-ctan /macros/plain/contrib/figflow
catalogue-license other-free
catalogue-topics text-flow
+name figput
+category Package
+revision 63957
+shortdesc Create interactive figures in LaTeX
+relocated 1
+longdesc FigPut allows figures to be specified using JavaScript. The
+longdesc resulting document can be viewed as a static PDF, as usual, or
+longdesc the document can be viewed in a web-browser, in which case the
+longdesc figures are interactive. A variety of interactive widgets are
+longdesc included.
+containersize 8268
+containerchecksum 4ea2768b272f9be270f1ce3edf02cd73b8d8c792d8b92c20a8d38b05649e43e8441d6e439f0e1be8ca906c5b9a47db1d6a48ff7ee136f53dc4ae09cc6172d46a
+doccontainersize 861544
+doccontainerchecksum 54c8428c9b0bd267389a9bf25b005b31365fc9451d0e3ca4632e52a07af9c02a24aa1c7c9b5f19eac196f4dbfad9db91647cfef82c301496ec4be58d9e2360cd
+docfiles size=571
+ RELOC/doc/latex/figput/LICENSE.txt
+ RELOC/doc/latex/figput/README.md details="Readme"
+ RELOC/doc/latex/figput/example/example.pdf
+ RELOC/doc/latex/figput/example/example.tex
+ RELOC/doc/latex/figput/example/externalcode.js
+ RELOC/doc/latex/figput/figput-manual/figput-manual.pdf details="Package documentation"
+ RELOC/doc/latex/figput/figput-manual/figput-manual.tex
+ RELOC/doc/latex/figput/javascript/development/layout.ts
+ RELOC/doc/latex/figput/javascript/development/main.ts
+ RELOC/doc/latex/figput/javascript/development/tikz.ts
+ RELOC/doc/latex/figput/javascript/development/widgets.ts
+ RELOC/doc/latex/figput/javascript/figput.html
+ RELOC/doc/latex/figput/javascript/layout.js
+ RELOC/doc/latex/figput/javascript/main.js
+ RELOC/doc/latex/figput/javascript/pdf.js
+ RELOC/doc/latex/figput/javascript/pdf.worker.min.js
+ RELOC/doc/latex/figput/javascript/pdfjs_license.txt
+ RELOC/doc/latex/figput/javascript/release/figput.html
+ RELOC/doc/latex/figput/javascript/release/figput.js
+ RELOC/doc/latex/figput/javascript/server.py
+ RELOC/doc/latex/figput/javascript/tikz.js
+ RELOC/doc/latex/figput/javascript/widgets.js
+runfiles size=7
+ RELOC/tex/latex/figput/figput.sty
+catalogue-contact-repository https://github.com/rsfairman/figput
+catalogue-ctan /graphics/figput
+catalogue-license cc-by-sa-4
+catalogue-topics graphics callback cgi-latex expl3 pgf-tikz
+catalogue-version 0.90
+
name figsize
category Package
revision 18784
@@ -305907,7 +305954,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 63951
+revision 63956
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -305915,10 +305962,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 113492
-containerchecksum a74847d0826f141caf1b38cfd4e558b0f7e77b8b10e7b02723745155566d49254edd61b080c0c05f0803205ece9a98ae2b44f820142e73c1f93dcf2f10cff636
-doccontainersize 418844
-doccontainerchecksum 32801325a655de65b71cec3b0d3d10538e29f2433d84b9a5c47528feeccfef6dc5ed25adcb75f2d95aedde058f0f8ad0e9bf73f1b15fc1a630f2b6d976e5efa3
+containersize 113500
+containerchecksum 47c57058da0ecef2d1c62730b9b2bd73a1b9beb9006bb9cd4b4f3df6e84f5d41280ef2baac0b0b1d3b5797b9590454973aad7dc35631b153d8a9f59009d90b26
+doccontainersize 418976
+doccontainerchecksum 0131c1d7900d880c53c5bfd29a0bfacfae5e90f1eaa6f1f1784abbf3e7a3cb9eab0f4186238ec9601e4e1cb78dfd3c80d8040d9d8576ac919e705fdb0fc0e1b4
docfiles size=516
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 3efb810c90..f7ad9debc8 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-cb43c83774de1aba8b6715d291acda8c texlive.tlpdb
+23c16f4c0b6e9459ddf0faf679a8d4cc texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 324b1344c6..ad9735f667 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-b808c4ab495908bdcf20548200a551f92667779305f1816a15d060f5572ac6650bd056df8e600d43661e81f4de024a989f6d0844ff802ec65dc9e5a7c8a0c159 texlive.tlpdb
+9dd456adc92532dac6ff47e2f7064538c94d572c87564b88dde7e92f6997541f9e2367da8651f934723f2f646fc3979159155d3da3176d66cf5e37984745bfd8 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 6658c58da9..7b4721e4d6 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJi2ecUAAoJEEzhh34ZQ4xwRCwH/2W8o1WF+YQVcHVnZgEoiBJt
-b3173lmLtw1EYNnN++rRMcKNboTMO3guMEcqrHtBYK+/9d1ZOWsxKtaGEj0U824j
-utumx1QhFxL5xLXPF0hB3YtRJtbEX/H4ZPFDwuNRENL8NmN2TYhR2RFl8bpYyhjr
-sDtXz1jfZOCnB5FlVfLj1sQ5+2xq7MAigVD3X7U5+jyPL9+zp05+2/oIZeArX50h
-4cRCr3f0WAA+hHbZgvCYd43brdeTnOMEjQ1GzeJu1NziQHMjUuIlLGKwVf7ADdoV
-BfQFvUbq9G3o8qOE0EDPksW6fdUH2gDMHyX4zvhDebTYJIk5kHq6D7rfv/Jv5II=
-=ZMjP
+iQEcBAEBCgAGBQJi2zh6AAoJEEzhh34ZQ4xwg4QH/RNe6pLMjoBysn4oPMOiLahv
+aSdcOVb+g/eTC4PEg2dQFv2jxpZkag2J0JNksmbkIONWURw6vPqKPpIlkOLSY7vA
+joXQFm3r42WilBxAMcIp946Kbn+PCwU7FaOKELQ42FqCHZowPYnDzViotsY9EF/4
+etZUm76BUjLR2XNejtLYGeSh/z8WKWrqijrteBzm6htUBns0eTN+duuNXMVMB/ej
+RzYYXpxjjgUp6dRkTdud6iLyLdWgTgS8wX5wqwQHVzF2HdEyCOQGdW+oUJJlOHBS
+b/XsYIwiOG3WVeshVBuKuI07g3VcPhPLOFPwhcHXf+xnt0uxNJtA+CbvI0SsA14=
+=hlXN
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 0a6a73d2f2..67682e2f86 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini
index 1d14b20559..73f6a1bcfe 100644
--- a/systems/win32/miktex/tm/packages/next/pr.ini
+++ b/systems/win32/miktex/tm/packages/next/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1658434654
+date=1658521100
lastupd=miktex-arctrl-bin-2.9 miktex-arctrl-bin-x64-2.9 miktex-asymptote-bin-2.9 miktex-asymptote-bin-x64-2.9 miktex-autosp-bin-2.9 miktex-autosp-bin-x64-2.9 miktex-axohelp-bin-2.9 miktex-axohelp-bin-x64-2.9 miktex-bibarts-bin-2.9 miktex-bibarts-bin-x64-2.9 miktex-bibtex-bin-2.9 miktex-bibtex-bin-x64-2.9 miktex-bibtex8bit-bin-2.9 miktex-bibtex8bit-bin-x64-2.9 miktex-bzip2-bin-2.9 miktex-bzip2-bin-x64-2.9 miktex-cairo-bin-2.9 miktex-cairo-bin-x64-2.9 miktex-chktex-bin-2.9 miktex-chktex-bin-x64-2.9
-lstdigest=056f7b6e7801b1c987f2860875fbbb70
+lstdigest=c7338f83c508d3aab6304cd05986b5ff
numpkg=5804
relstate=next
-version=8237
+version=8238
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: BpmwXsQcjN4TysifTIYbufXcUF0tnjMTZR96PyyFDLNtSd4IAgS21FJJp4wYhIpsLin21GejOBg8O+KV3KSX575eJIh7hwu6D8iW3p1bQneoJy+geXqghNo0UuwJEM7YjdlAMR3BPl9b0LjrkpV6s73OeIK6qRM31idfrUYfjR4KvAgJ8i0pg5AceyPcAjU7nGtNqis7KzapmeBnETT73iP/avxe0BjyKmPNwGVluCwnJPh27amXkmxbXJRrwGorteVe2shi9QZq7U3Fx8wNeWBPDV7NR6hMgkZdQjQPevUsLiUyYPV6VGKMauxqS4PyKjf/x4Uq+/a+nISV+DqjWA==
+;;;; signature/miktex: Rh/mqV7QtgsmxuNwpsGGyMKisItkNIs1AFeA7A4zgMQXUHTQ82FAKHiv6SLqTlW2OXSsvVSN0zpCLLuVEm4PjcaNP3FdM+V53JfI2TiFf19CvqyuP0x8/OYEbdeae7M3aUocdvdrFAatZ4bM90OGtOKpmrgUZHcBMnKeAebE0aq+DObAZBd/w1ZpUdCJ+GStcH5ch6tDAVXx6yf5NSp/5QjeOkd1ramNmSt8fE/hnWwM/O2Q9EdyEehp0Zn9+irZemKytTP6Q2vf07ezDPchgCfCzOR4M/kcg4qclwunr0tR66q+XxrUcFdoKEdbdDmuYzaCyX1d459Lqkm82tw2Mg==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index 1dace281f0..5e3d097c29 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1658434299
+date=1658520692
lastupd=denisbdoc font-change-xetex font-change-xetex__doc font-change-xetex__source miktex-arctrl-bin-2.9 miktex-arctrl-bin-x64-2.9 miktex-asymptote-bin-2.9 miktex-asymptote-bin-x64-2.9 miktex-autosp-bin-2.9 miktex-autosp-bin-x64-2.9 miktex-axohelp-bin-2.9 miktex-axohelp-bin-x64-2.9 miktex-bibarts-bin-2.9 miktex-bibarts-bin-x64-2.9 miktex-bibtex-bin-2.9 miktex-bibtex-bin-x64-2.9 miktex-bibtex8bit-bin-2.9 miktex-bibtex8bit-bin-x64-2.9 miktex-bzip2-bin-2.9 miktex-bzip2-bin-x64-2.9
-lstdigest=d857f24e4bcee5602d6856c14d4530d3
+lstdigest=ae4f6cb880e808558fad20b15dc2eb45
numpkg=5804
relstate=stable
-version=8237
+version=8238
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: EwATmhudjNq3G7VpQfJH7CWXMjXyEKy7U993oyVW9ufgD6anNJ/XBJi3VWTNpl9fBY/wCmZn6dlThnRoj4HgxRUAM0lDBiPH+B5m3b/9cqV9wSFY2+0L8kHZoWUoh1T/5jNFL0+0ZPbKy8zp7z1XYkJ3/lSQc375kwFHRw/d3aIIVFKb2RWo0DGk9kfPTEaCNFL39mRzPCBHphFCfYa5RFRi1x5+HAu0KP6tPeqXZ7SWdMHrnfqzLJsCNMrDaY8InEUjqg0uvENY4vGkjDLU2HyWfPwEjvx3I4Owmb+E/6f+ne/o+IA274NUjFC+430ToYWuSv/N5jdnfi/Cmr+L7g==
+;;;; signature/miktex: bOi+fwIaMdl5LZrwaQt/2cySHHgmmvR5h6vN7gwRHKK7/b1ZMhN7amP+FcmCpQJdxHehTuSsygbJG7DWTBn/YvRh3NWMiocx/vJokdmO59l6kZ3awoa6ChUH2kS+KRhZyLALT4nNMVABRxzfIKspTtnt1B3py0ItznCK99n6dhV8EulkZTu9DeD/RcZBKcOwkri+I9ooYSQscOjz+bKK5vfuFgFLbKWqRrpNQFicv31DYoDWRgxfakJxiQgS1cfo18mmTSUadJABH339v4nE8NMGqECXnh1bdnAWis6rk/P+v3kcSrZQj3FTwJBsNVGIghdZnaFvHOC942p3SK7Pkw==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/timestamp b/timestamp
index 708b63ca8c..47c9edde54 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2022-07-22-02-02
+2022-07-23-02-02