diff options
616 files changed, 22420 insertions, 16923 deletions
diff --git a/FILES.byname b/FILES.byname index 1d48903b09..970439312e 100644 --- a/FILES.byname +++ b/FILES.byname @@ -2038,12 +2038,12 @@ 2022/12/25 | 1673 | biblio/citation-style-language/README.md 2022/12/25 | 11958 | biblio/citation-style-language/vancouver.csl 2022/12/25 | 604004 | biblio/citation-style-language.zip -2022/12/28 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2022/12/29 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx -2022/12/28 | 2756722 | biblio/ctan-bibdata/ctan.bib -2022/12/28 | 3638951 | biblio/ctan-bibdata/ctan.pdf +2022/12/29 | 2757695 | biblio/ctan-bibdata/ctan.bib +2022/12/29 | 3639243 | biblio/ctan-bibdata/ctan.pdf 2022/10/08 | 1415 | biblio/ctan-bibdata/README -2022/12/28 | 4033129 | biblio/ctan-bibdata.zip +2022/12/29 | 4033950 | biblio/ctan-bibdata.zip 2022/02/06 | 3110 | biblio/pbibtex/pbibtex-base/cpp.awk 2022/02/06 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh 2022/02/06 | 22422 | biblio/pbibtex/pbibtex-base/jabbrv.bst @@ -5417,7 +5417,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/12/28 | 68848 | FILES.last07days +2022/12/29 | 75051 | 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 @@ -186878,34 +186878,34 @@ 2015/04/06 | 84612 | info/greek/greekinfo3/gr-font-samples.pdf 2015/04/10 | 931 | info/greek/greekinfo3/README 2015/04/11 | 241287 | info/greek/greekinfo3.zip -2019/05/11 | 19311 | info/guide-latex-fr/Chapitres/annexes.tex -2019/05/11 | 536 | info/guide-latex-fr/Chapitres/code-base.tex -2019/05/11 | 7667 | info/guide-latex-fr/Chapitres/commandes.tex +2022/12/28 | 19358 | info/guide-latex-fr/Chapitres/annexes.tex +2022/12/28 | 536 | info/guide-latex-fr/Chapitres/code-base.tex +2022/12/28 | 8927 | info/guide-latex-fr/Chapitres/configuration.tex 2021/10/03 | 5948 | info/guide-latex-fr/Chapitres/intro.tex -2019/05/11 | 9729 | info/guide-latex-fr/Chapitres/p1-compilation.tex -2019/05/11 | 10980 | info/guide-latex-fr/Chapitres/p1-historique.tex -2019/05/11 | 6156 | info/guide-latex-fr/Chapitres/p1-installation.tex -2019/05/11 | 7915 | info/guide-latex-fr/Chapitres/p2-erreurs.tex -2019/05/11 | 28284 | info/guide-latex-fr/Chapitres/p2-images.tex +2022/12/28 | 9729 | info/guide-latex-fr/Chapitres/p1-compilation.tex +2022/12/28 | 10990 | info/guide-latex-fr/Chapitres/p1-historique.tex +2022/12/28 | 6150 | info/guide-latex-fr/Chapitres/p1-installation.tex +2022/12/28 | 7915 | info/guide-latex-fr/Chapitres/p2-erreurs.tex +2022/12/28 | 28288 | info/guide-latex-fr/Chapitres/p2-images.tex 2019/05/11 | 23057 | info/guide-latex-fr/Chapitres/p2-maths.tex -2019/05/11 | 11722 | info/guide-latex-fr/Chapitres/p2-regles.tex +2022/12/28 | 11722 | info/guide-latex-fr/Chapitres/p2-regles.tex 2019/05/11 | 19239 | info/guide-latex-fr/Chapitres/p2-tableaux.tex 2019/05/11 | 39857 | info/guide-latex-fr/Chapitres/p2-texte.tex 2021/10/03 | 107 | info/guide-latex-fr/Chapitres/p3-beamer.tex -2019/05/11 | 8311 | info/guide-latex-fr/Chapitres/p3-images.tex -2021/10/03 | 2747 | info/guide-latex-fr/Chapitres/p3-intro.tex -2019/05/11 | 3404 | info/guide-latex-fr/Chapitres/p3-maths.tex -2019/05/11 | 11110 | info/guide-latex-fr/Chapitres/p3-moteurs.tex -2019/05/11 | 21643 | info/guide-latex-fr/Chapitres/p3-PSTricks.tex -2019/05/11 | 10334 | info/guide-latex-fr/Chapitres/p3-structuration.tex -2019/05/11 | 24553 | info/guide-latex-fr/Chapitres/p3-tableaux.tex -2019/05/11 | 55954 | info/guide-latex-fr/Chapitres/p3-texte.tex -2019/05/11 | 59632 | info/guide-latex-fr/Chapitres/p3-TikZ.tex -2021/10/03 | 3106 | info/guide-latex-fr/Chapitres/packages.tex +2022/12/28 | 8359 | info/guide-latex-fr/Chapitres/p3-images.tex +2022/12/28 | 3417 | info/guide-latex-fr/Chapitres/p3-intro.tex +2022/12/28 | 3583 | info/guide-latex-fr/Chapitres/p3-maths.tex +2022/12/28 | 11405 | info/guide-latex-fr/Chapitres/p3-moteurs.tex +2022/12/28 | 21643 | info/guide-latex-fr/Chapitres/p3-PSTricks.tex +2022/12/28 | 12314 | info/guide-latex-fr/Chapitres/p3-structuration.tex +2022/12/28 | 24719 | info/guide-latex-fr/Chapitres/p3-tableaux.tex +2022/12/28 | 56103 | info/guide-latex-fr/Chapitres/p3-texte.tex +2022/12/28 | 59719 | info/guide-latex-fr/Chapitres/p3-TikZ.tex +2022/12/28 | 3520 | info/guide-latex-fr/Chapitres/packages.tex 2019/05/11 | 1762 | info/guide-latex-fr/Chapitres/page-fin.tex -2021/10/03 | 2422 | info/guide-latex-fr/Chapitres/page-garde.tex -2021/10/03 | 4568534 | info/guide-latex-fr/guide-latex-fr.pdf -2021/10/03 | 1752 | info/guide-latex-fr/guide-latex-fr.tex +2022/12/28 | 2429 | info/guide-latex-fr/Chapitres/page-garde.tex +2022/12/28 | 4618615 | info/guide-latex-fr/guide-latex-fr.pdf +2022/12/28 | 1761 | info/guide-latex-fr/guide-latex-fr.tex 2019/05/11 | 301774 | info/guide-latex-fr/Images/aide_LaTeX1_original.png 2019/05/11 | 339520 | info/guide-latex-fr/Images/Aide_LaTeX1.png 2019/05/11 | 1075991 | info/guide-latex-fr/Images/Aide_LaTeX1.xcf @@ -186926,7 +186926,7 @@ 2019/05/11 | 598003 | info/guide-latex-fr/Images/compilation_clavier.xcf 2019/05/11 | 123936 | info/guide-latex-fr/Images/compilation_clics.png 2019/05/11 | 485055 | info/guide-latex-fr/Images/compilation_clics.xcf -2019/05/11 | 4282 | info/guide-latex-fr/Images/compilation_diagramme.tex +2022/12/28 | 4282 | info/guide-latex-fr/Images/compilation_diagramme.tex 2019/05/11 | 37933 | info/guide-latex-fr/Images/compilation_menu1.png 2019/05/11 | 50312 | info/guide-latex-fr/Images/compilation_menu2.png 2019/05/11 | 68887 | info/guide-latex-fr/Images/compilation_original.png @@ -186953,8 +186953,8 @@ 2019/05/11 | 25305 | info/guide-latex-fr/Images/overleaf.png 2019/05/11 | 28491 | info/guide-latex-fr/Images/sharelatex.png 2019/05/11 | 13762 | info/guide-latex-fr/Images/texmaker.png -2021/10/03 | 5407 | info/guide-latex-fr/README.md -2021/10/03 | 8271293 | info/guide-latex-fr.zip +2022/12/28 | 5691 | info/guide-latex-fr/README.md +2022/12/29 | 8308808 | info/guide-latex-fr.zip 1994/04/12 | 27805 | info/htmlhelp/bibtex-help-html.zip 1994/04/12 | 152084 | info/htmlhelp/latex-help-html.zip 1994/04/12 | 22516 | info/htmlhelp/makeindex-help-html.zip @@ -211665,13 +211665,13 @@ 2014/11/27 | 571 | macros/latex/contrib/bondgraphs/README 2015/03/23 | 371663 | macros/latex/contrib/bondgraphs.zip 2011/03/09 | 51929 | macros/latex/contrib/bondgraph.zip -2022/08/08 | 90035 | macros/latex/contrib/bookcover/bookcover.dtx -2022/08/08 | 717536 | macros/latex/contrib/bookcover/bookcover-example1.pdf +2022/12/29 | 90097 | macros/latex/contrib/bookcover/bookcover.dtx +2022/12/29 | 717534 | macros/latex/contrib/bookcover/bookcover-example1.pdf 2020/12/10 | 2600 | macros/latex/contrib/bookcover/bookcover-example1.tex -2022/08/08 | 82335 | macros/latex/contrib/bookcover/bookcover-example2.pdf +2022/12/29 | 82337 | macros/latex/contrib/bookcover/bookcover-example2.pdf 2020/12/10 | 2099 | macros/latex/contrib/bookcover/bookcover-example2.tex 2022/08/08 | 1405 | macros/latex/contrib/bookcover/bookcover.ins -2022/08/08 | 1572789 | macros/latex/contrib/bookcover/bookcover.pdf +2022/12/29 | 1572853 | macros/latex/contrib/bookcover/bookcover.pdf 2020/12/31 | 12109 | macros/latex/contrib/bookcover/figures/bookcover-barcode.pdf 2020/11/27 | 544539 | macros/latex/contrib/bookcover/figures/bookcover-bg.jpg 2020/11/26 | 127926 | macros/latex/contrib/bookcover/figures/bookcover-cards.pdf @@ -211691,7 +211691,7 @@ 2020/12/12 | 1524 | macros/latex/contrib/bookcover/figures/bookcover-tikz.pdf 2020/12/06 | 67794 | macros/latex/contrib/bookcover/figures/bookcover-trimming.pdf 2022/08/08 | 706 | macros/latex/contrib/bookcover/README -2022/08/08 | 3621914 | macros/latex/contrib/bookcover.zip +2022/12/29 | 3621891 | macros/latex/contrib/bookcover.zip 2008/03/20 | 19390 | macros/latex/contrib/bookest/bookest.cls 2008/03/20 | 140842 | macros/latex/contrib/bookest/bookestdoc-en.pdf 2008/03/20 | 15543 | macros/latex/contrib/bookest/bookestdoc-en.tex @@ -238361,16 +238361,16 @@ 2022/12/28 | 322543 | macros/latex/contrib/zref-clever/zref-clever.pdf 2022/12/28 | 124660 | macros/latex/contrib/zref-clever/zref-clever.tex 2022/04/07 | 581 | macros/latex/contrib/zref/README.md -2022/07/08 | 1410 | macros/latex/contrib/zref-vario/CHANGELOG.md -2022/07/08 | 31 | macros/latex/contrib/zref-vario/DEPENDS.txt -2022/07/08 | 578 | macros/latex/contrib/zref-vario/README.md -2022/07/11 | 756457 | macros/latex/contrib/zref-vario.zip -2022/07/08 | 618882 | macros/latex/contrib/zref-vario/zref-vario-code.pdf -2022/07/08 | 1411 | macros/latex/contrib/zref-vario/zref-vario-code.tex -2022/07/08 | 32082 | macros/latex/contrib/zref-vario/zref-vario.dtx -2022/07/08 | 2589 | macros/latex/contrib/zref-vario/zref-vario.ins -2022/07/08 | 146033 | macros/latex/contrib/zref-vario/zref-vario.pdf -2022/07/08 | 13091 | macros/latex/contrib/zref-vario/zref-vario.tex +2022/12/29 | 1629 | macros/latex/contrib/zref-vario/CHANGELOG.md +2022/12/29 | 31 | macros/latex/contrib/zref-vario/DEPENDS.txt +2022/12/29 | 578 | macros/latex/contrib/zref-vario/README.md +2022/12/29 | 786160 | macros/latex/contrib/zref-vario.zip +2022/12/29 | 647461 | macros/latex/contrib/zref-vario/zref-vario-code.pdf +2022/12/29 | 1411 | macros/latex/contrib/zref-vario/zref-vario-code.tex +2022/12/29 | 37725 | macros/latex/contrib/zref-vario/zref-vario.dtx +2022/12/29 | 2589 | macros/latex/contrib/zref-vario/zref-vario.ins +2022/12/29 | 147516 | macros/latex/contrib/zref-vario/zref-vario.pdf +2022/12/29 | 13754 | macros/latex/contrib/zref-vario/zref-vario.tex 2022/04/07 | 706755 | macros/latex/contrib/zref.zip 2022/04/07 | 197178 | macros/latex/contrib/zref/zref.dtx 2022/04/07 | 699064 | macros/latex/contrib/zref/zref.pdf @@ -239387,6 +239387,19 @@ 2022/06/22 | 3344 | macros/luatex/generic/barracuda/test/test-upc/002-upca.pdf 2022/06/23 | 215 | macros/luatex/generic/barracuda/test/test-upc/002-upca.tex 2022/06/23 | 571488 | macros/luatex/generic/barracuda.zip +2022/12/28 | 3292 | macros/luatex/generic/blopentype/blopentype.md +2022/12/28 | 144031 | macros/luatex/generic/blopentype/blottest.pdf +2022/12/28 | 8281 | macros/luatex/generic/blopentype/blottest.tex +2022/12/28 | 62 | macros/luatex/generic/blopentype/DEPENDS.txt +2022/12/28 | 2139 | macros/luatex/generic/blopentype/luatex/blot-base.lts +2022/12/28 | 799 | macros/luatex/generic/blopentype/luatex/blot-files.ltm +2022/12/28 | 9579 | macros/luatex/generic/blopentype/luatex/blot-fonts.ltm +2022/12/28 | 34211 | macros/luatex/generic/blopentype/luatex/blot-fonts.lts +2022/12/28 | 644 | macros/luatex/generic/blopentype/luatex/blot-lua.ltm +2022/12/28 | 274 | macros/luatex/generic/blopentype/luatex/blot-sets.lua +2022/12/28 | 6811 | macros/luatex/generic/blopentype/luatex/blot.tex +2022/12/28 | 1884 | macros/luatex/generic/blopentype/README.md +2022/12/29 | 168030 | macros/luatex/generic/blopentype.zip 2021/01/03 | 129830 | macros/luatex/generic/chickenize/chickenize.dtx 2021/01/03 | 230758 | macros/luatex/generic/chickenize/chickenize.pdf 2021/01/03 | 1199 | macros/luatex/generic/chickenize/README.md @@ -240210,6 +240223,11 @@ 2022/12/28 | 7018 | macros/luatex/latex/luacomplex/luacomplex.tex 2022/12/28 | 1183 | macros/luatex/latex/luacomplex/README.txt 2022/12/28 | 118234 | macros/luatex/latex/luacomplex.zip +2022/12/29 | 147517 | macros/luatex/latex/luagcd/luagcd.pdf +2022/12/29 | 8838 | macros/luatex/latex/luagcd/luagcd.sty +2022/12/29 | 7542 | macros/luatex/latex/luagcd/luagcd.tex +2022/12/29 | 1240 | macros/luatex/latex/luagcd/README.txt +2022/12/29 | 136537 | macros/luatex/latex/luagcd.zip 2020/08/28 | 39798 | macros/luatex/latex/luahyphenrules/luahyphenrules.pdf 2020/08/28 | 5188 | macros/luatex/latex/luahyphenrules/luahyphenrules.sty 2020/08/28 | 3351 | macros/luatex/latex/luahyphenrules/luahyphenrules.tex @@ -240556,13 +240574,13 @@ 2012/02/06 | 135018 | macros/luatex/latex/pgfmolbio/SampleScf.scf 2012/03/09 | 867 | macros/luatex/latex/pgfmolbio/SampleUniprot.txt 2013/07/31 | 923987 | macros/luatex/latex/pgfmolbio.zip -2022/11/29 | 118608 | macros/luatex/latex/piton/piton.dtx -2022/11/29 | 263703 | macros/luatex/latex/piton/piton-french.pdf -2022/11/29 | 41465 | macros/luatex/latex/piton/piton-french.tex -2022/08/26 | 1430 | macros/luatex/latex/piton/piton.ins -2022/11/29 | 529503 | macros/luatex/latex/piton/piton.pdf +2022/12/29 | 119792 | macros/luatex/latex/piton/piton.dtx +2022/12/29 | 263833 | macros/luatex/latex/piton/piton-french.pdf +2022/12/29 | 41726 | macros/luatex/latex/piton/piton-french.tex +2022/12/29 | 1430 | macros/luatex/latex/piton/piton.ins +2022/12/29 | 532133 | macros/luatex/latex/piton/piton.pdf 2022/11/09 | 890 | macros/luatex/latex/piton/README.md -2022/11/29 | 613175 | macros/luatex/latex/piton.zip +2022/12/29 | 612897 | macros/luatex/latex/piton.zip 2017/08/26 | 36035 | macros/luatex/latex/placeat/placeat.dtx 2017/08/26 | 4438 | macros/luatex/latex/placeat/placeat.lua 2017/08/26 | 97006 | macros/luatex/latex/placeat/placeat.pdf @@ -280522,386 +280540,516 @@ 1994/01/18 | 7272 | support/tex-it/texitrc.unx 1994/01/18 | 25068 | support/tex-it/texit.tex 2006/03/12 | 50172 | support/tex-it.zip -2022/07/03 | 1547 | support/texlab/benches/bench_main.rs -2022/07/03 | 43438 | support/texlab/Cargo.lock -2022/07/03 | 2200 | support/texlab/Cargo.toml -2022/07/03 | 20224 | support/texlab/CHANGELOG.md -2022/07/03 | 183 | support/texlab/CONTRIBUTING.md -2022/07/03 | 6970534 | support/texlab/data/components.json.gz -2022/07/03 | 57018 | support/texlab/data/lang_data.json -2022/07/03 | 678 | support/texlab/docs/custom_commands.md -2022/07/03 | 2021 | support/texlab/docs/custom_messages.md -2022/07/03 | 380190 | support/texlab/docs/demo.gif -2022/07/03 | 2250 | support/texlab/docs/lsp_kinds.md -2022/07/03 | 4829 | support/texlab/docs/options.md -2022/07/03 | 5555 | support/texlab/docs/previewing.md -2022/07/03 | 1050 | support/texlab/docs/tectonic.md -2022/07/03 | 35149 | support/texlab/LICENSE -2022/07/03 | 3786 | support/texlab/README.md -2022/07/03 | 6 | support/texlab/rust-toolchain -2022/07/03 | 5284 | support/texlab/src/capabilities.rs -2022/07/03 | 22218 | support/texlab/src/citation/driver.rs -2022/07/03 | 3231 | support/texlab/src/citation/entry.rs -2022/07/03 | 1631 | support/texlab/src/citation/field/author.rs -2022/07/03 | 2477 | support/texlab/src/citation/field/date.rs -2022/07/03 | 1385 | support/texlab/src/citation/field/number.rs -2022/07/03 | 60 | support/texlab/src/citation/field.rs -2022/07/03 | 6933 | support/texlab/src/citation/field/text.rs -2022/07/03 | 1760 | support/texlab/src/citation/output.rs -2022/07/03 | 905 | support/texlab/src/citation.rs -2022/07/03 | 1064 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap -2022/07/03 | 800 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap -2022/07/03 | 1330 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap -2022/07/03 | 1062 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap -2022/07/03 | 1314 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap -2022/07/03 | 988 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap -2022/07/03 | 585 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap -2022/07/03 | 1411 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap -2022/07/03 | 1223 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap -2022/07/03 | 720 | support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap -2022/07/03 | 1176 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap -2022/07/03 | 1051 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap -2022/07/03 | 1428 | support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap -2022/07/03 | 967 | support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap -2022/07/03 | 11851 | support/texlab/src/citation/tests.rs -2022/07/03 | 1593 | support/texlab/src/client.rs -2022/07/03 | 4554 | support/texlab/src/component_db.rs -2022/07/03 | 1165 | support/texlab/src/debouncer.rs -2022/07/03 | 4192 | support/texlab/src/diagnostics/bibtex.rs -2022/07/03 | 2285 | support/texlab/src/diagnostics/build.rs -2022/07/03 | 2964 | support/texlab/src/diagnostics/chktex.rs -2022/07/03 | 4101 | support/texlab/src/diagnostics/latex.rs -2022/07/03 | 5475 | support/texlab/src/diagnostics.rs -2022/07/03 | 2416 | support/texlab/src/dispatch.rs -2022/07/03 | 2035 | support/texlab/src/distro/kpsewhich.rs -2022/07/03 | 2624 | support/texlab/src/distro/miktex.rs -2022/07/03 | 2124 | support/texlab/src/distro.rs -2022/07/03 | 1055 | support/texlab/src/distro/texlive.rs -2022/07/03 | 3572 | support/texlab/src/document.rs -2022/07/03 | 869 | support/texlab/src/environment.rs -2022/07/03 | 8265 | support/texlab/src/features/build.rs -2022/07/03 | 1127 | support/texlab/src/features/completion/acronym_ref.rs -2022/07/03 | 2102 | support/texlab/src/features/completion/argument.rs -2022/07/03 | 489 | support/texlab/src/features/completion/begin_command.rs -2022/07/03 | 3274 | support/texlab/src/features/completion/citation.rs -2022/07/03 | 1476 | support/texlab/src/features/completion/color_model.rs -2022/07/03 | 674 | support/texlab/src/features/completion/color.rs -2022/07/03 | 949 | support/texlab/src/features/completion/component_command.rs -2022/07/03 | 829 | support/texlab/src/features/completion/component_environment.rs -2022/07/03 | 892 | support/texlab/src/features/completion/entry_type.rs -2022/07/03 | 1056 | support/texlab/src/features/completion/field.rs -2022/07/03 | 1642 | support/texlab/src/features/completion/glossary_ref.rs -2022/07/03 | 1828 | support/texlab/src/features/completion/import.rs -2022/07/03 | 4725 | support/texlab/src/features/completion/include.rs -2022/07/03 | 4172 | support/texlab/src/features/completion/label.rs -2022/07/03 | 23770 | support/texlab/src/features/completion.rs -2022/07/03 | 857 | support/texlab/src/features/completion/theorem.rs -2022/07/03 | 1033 | support/texlab/src/features/completion/tikz_library.rs -2022/07/03 | 3479 | support/texlab/src/features/completion/types.rs -2022/07/03 | 970 | support/texlab/src/features/completion/user_command.rs -2022/07/03 | 919 | support/texlab/src/features/completion/user_environment.rs -2022/07/03 | 1767 | support/texlab/src/features/completion/util.rs -2022/07/03 | 10234 | support/texlab/src/features/cursor.rs -2022/07/03 | 1498 | support/texlab/src/features/definition/command.rs -2022/07/03 | 1128 | support/texlab/src/features/definition/document.rs -2022/07/03 | 1422 | support/texlab/src/features/definition/entry.rs -2022/07/03 | 1364 | support/texlab/src/features/definition/label.rs -2022/07/03 | 2150 | support/texlab/src/features/definition.rs -2022/07/03 | 1196 | support/texlab/src/features/definition/string.rs -2022/07/03 | 2840 | support/texlab/src/features/execute_command.rs -2022/07/03 | 2056 | support/texlab/src/features/folding.rs -2022/07/03 | 7574 | support/texlab/src/features/formatting/bibtex_internal.rs -2022/07/03 | 2523 | support/texlab/src/features/formatting/latexindent.rs -2022/07/03 | 784 | support/texlab/src/features/formatting.rs -2022/07/03 | 5122 | support/texlab/src/features/forward_search.rs -2022/07/03 | 2951 | support/texlab/src/features/highlight/label.rs -2022/07/03 | 378 | support/texlab/src/features/highlight.rs -2022/07/03 | 946 | support/texlab/src/features/hover/citation.rs -2022/07/03 | 842 | support/texlab/src/features/hover/component.rs -2022/07/03 | 578 | support/texlab/src/features/hover/entry_type.rs -2022/07/03 | 630 | support/texlab/src/features/hover/field.rs -2022/07/03 | 551 | support/texlab/src/features/hover/label.rs -2022/07/03 | 1468 | support/texlab/src/features/hover.rs -2022/07/03 | 1240 | support/texlab/src/features/hover/string_ref.rs -2022/07/03 | 828 | support/texlab/src/features/link/include.rs -2022/07/03 | 804 | support/texlab/src/features/link.rs -2022/07/03 | 3997 | support/texlab/src/features/lsp_kinds.rs -2022/07/03 | 2033 | support/texlab/src/features/reference/entry.rs -2022/07/03 | 1045 | support/texlab/src/features/reference/label.rs -2022/07/03 | 1096 | support/texlab/src/features/reference.rs -2022/07/03 | 1499 | support/texlab/src/features/reference/string.rs -2022/07/03 | 1511 | support/texlab/src/features/rename/command.rs -2022/07/03 | 2435 | support/texlab/src/features/rename/entry.rs -2022/07/03 | 3118 | support/texlab/src/features/rename/label.rs -2022/07/03 | 1890 | support/texlab/src/features/rename.rs -2022/07/03 | 1235 | support/texlab/src/features.rs -2022/07/03 | 3397 | support/texlab/src/features/symbol/bibtex.rs -2022/07/03 | 13898 | support/texlab/src/features/symbol/latex.rs -2022/07/03 | 6355 | support/texlab/src/features/symbol/project_order.rs -2022/07/03 | 3788 | support/texlab/src/features/symbol.rs -2022/07/03 | 3700 | support/texlab/src/features/symbol/types.rs -2022/07/03 | 8885 | support/texlab/src/label.rs -2022/07/03 | 2046 | support/texlab/src/lang_data.rs -2022/07/03 | 923 | support/texlab/src/language.rs -2022/07/03 | 698 | support/texlab/src/lib.rs -2022/07/03 | 1268 | support/texlab/src/line_index_ext.rs -2022/07/03 | 6484 | support/texlab/src/line_index.rs -2022/07/03 | 2003 | support/texlab/src/main.rs -2022/07/03 | 3330 | support/texlab/src/options.rs -2022/07/03 | 488 | support/texlab/src/range.rs -2022/07/03 | 261 | support/texlab/src/req_queue.rs -2022/07/03 | 34085 | support/texlab/src/server.rs -2022/07/03 | 6825 | support/texlab/src/syntax/bibtex/ast.rs -2022/07/03 | 3720 | support/texlab/src/syntax/bibtex/lexer.rs -2022/07/03 | 7423 | support/texlab/src/syntax/bibtex/parser.rs -2022/07/03 | 1300 | support/texlab/src/syntax/bibtex.rs -2022/07/03 | 14551 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_001.snap -2022/07/03 | 8201 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_002.snap -2022/07/03 | 6630 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_003.snap -2022/07/03 | 836 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__comment.snap -2022/07/03 | 1300 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__entry_colon.snap -2022/07/03 | 370 | support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__preamble.snap -2022/07/03 | 4229 | support/texlab/src/syntax/bibtex/tests.rs -2022/07/03 | 47382 | support/texlab/src/syntax/build_log.rs -2022/07/03 | 666 | support/texlab/src/syntax/latex/analysis/command.rs -2022/07/03 | 2185 | support/texlab/src/syntax/latex/analysis/distro_file.rs -2022/07/03 | 373 | support/texlab/src/syntax/latex/analysis/environment.rs -2022/07/03 | 2415 | support/texlab/src/syntax/latex/analysis/explicit_link.rs -2022/07/03 | 466 | support/texlab/src/syntax/latex/analysis/graphics_path.rs -2022/07/03 | 2047 | support/texlab/src/syntax/latex/analysis/implicit_link.rs -2022/07/03 | 1984 | support/texlab/src/syntax/latex/analysis/label_name.rs -2022/07/03 | 648 | support/texlab/src/syntax/latex/analysis/label_number.rs -2022/07/03 | 1425 | support/texlab/src/syntax/latex/analysis.rs -2022/07/03 | 586 | support/texlab/src/syntax/latex/analysis/theorem.rs -2022/07/03 | 1919 | support/texlab/src/syntax/latex/analysis/types.rs -2022/07/03 | 16996 | support/texlab/src/syntax/latex/cst.rs -2022/07/03 | 4513 | support/texlab/src/syntax/latex/kind.rs -2022/07/03 | 18522 | support/texlab/src/syntax/latex/lexer.rs -2022/07/03 | 51260 | support/texlab/src/syntax/latex/parser.rs -2022/07/03 | 771 | support/texlab/src/syntax/latex.rs -2022/07/03 | 611 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__asymptote.snap -2022/07/03 | 426 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__block_comment.snap -2022/07/03 | 570 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_parameter.snap -2022/07/03 | 277 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_star.snap -2022/07/03 | 445 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__comment.snap -2022/07/03 | 901 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__delimiters.snap -2022/07/03 | 76 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__empty.snap -2022/07/03 | 234 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__escape_sequence.snap -2022/07/03 | 614 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__formula.snap -2022/07/03 | 118 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__invalid_parameter.snap -2022/07/03 | 242 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__line_break.snap -2022/07/03 | 1475 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acronym_declaration.snap -2022/07/03 | 1374 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_options.snap -2022/07/03 | 742 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_simple.snap -2022/07/03 | 786 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_options.snap -2022/07/03 | 331 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_simple.snap -2022/07/03 | 655 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__asymptote.snap -2022/07/03 | 843 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_options.snap -2022/07/03 | 355 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_simple.snap -2022/07/03 | 339 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__bibtex_include_simple.snap -2022/07/03 | 711 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__block_comments.snap -2022/07/03 | 281 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_missing_end.snap -2022/07/03 | 283 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_simple.snap -2022/07/03 | 621 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_error.snap -2022/07/03 | 772 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_figure.snap -2022/07/03 | 489 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal_error.snap -2022/07/03 | 491 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal.snap -2022/07/03 | 623 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption.snap -2022/07/03 | 243 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_empty.snap -2022/07/03 | 287 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_missing_brace.snap -2022/07/03 | 401 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_multiple_keys.snap -2022/07/03 | 558 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote_postnote.snap -2022/07/03 | 426 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote.snap -2022/07/03 | 347 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_redundant_comma.snap -2022/07/03 | 294 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_simple.snap -2022/07/03 | 294 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_star.snap -2022/07/03 | 281 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_empty.snap -2022/07/03 | 1050 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_options.snap -2022/07/03 | 339 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_simple.snap -2022/07/03 | 710 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_definition_simple.snap -2022/07/03 | 312 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_reference_simple.snap -2022/07/03 | 855 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error1.snap -2022/07/03 | 609 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error2.snap -2022/07/03 | 497 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error3.snap -2022/07/03 | 302 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error4.snap -2022/07/03 | 967 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_simple.snap -2022/07/03 | 464 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_argc.snap -2022/07/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl_error.snap -2022/07/03 | 356 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl.snap -2022/07/03 | 747 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_optional.snap -2022/07/03 | 631 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_simple.snap -2022/07/03 | 1223 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_with_begin.snap -2022/07/03 | 100 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__empty.snap -2022/07/03 | 906 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition_optional_arg.snap -2022/07/03 | 1134 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition.snap -2022/07/03 | 1286 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested_missing_braces.snap -2022/07/03 | 1136 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested.snap -2022/07/03 | 727 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_simple.snap -2022/07/03 | 313 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_label_reference_simple.snap -2022/07/03 | 808 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_begin.snap -2022/07/03 | 839 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_end.snap -2022/07/03 | 360 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation.snap -2022/07/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__escaped_brackets.snap -2022/07/03 | 425 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_args.snap -2022/07/03 | 170 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_empty.snap -2022/07/03 | 166 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_escape.snap -2022/07/03 | 944 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_definition_simple.snap -2022/07/03 | 875 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_options.snap -2022/07/03 | 314 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_simple.snap -2022/07/03 | 939 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_command.snap -2022/07/03 | 759 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_complicated_options.snap -2022/07/03 | 696 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_options.snap -2022/07/03 | 357 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_simple.snap -2022/07/03 | 412 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_path.snap -2022/07/03 | 205 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__hello_world.snap -2022/07/03 | 314 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_incomplete.snap -2022/07/03 | 428 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_simple.snap -2022/07/03 | 668 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_options.snap -2022/07/03 | 329 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_simple.snap -2022/07/03 | 630 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline_double_dollar.snap -2022/07/03 | 624 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline.snap -2022/07/03 | 458 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_line_break.snap -2022/07/03 | 310 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_simple.snap -2022/07/03 | 558 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_number.snap -2022/07/03 | 846 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_incomplete.snap -2022/07/03 | 411 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_multiple.snap -2022/07/03 | 468 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_error.snap -2022/07/03 | 358 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_incomplete.snap -2022/07/03 | 470 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_simple.snap -2022/07/03 | 301 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_simple.snap -2022/07/03 | 401 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_equality_sign.snap -2022/07/03 | 321 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_simple.snap -2022/07/03 | 453 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_path_with_brackets.snap -2022/07/03 | 325 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_simple.snap -2022/07/03 | 364 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_no_impl.snap -2022/07/03 | 472 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_simple.snap -2022/07/03 | 279 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_empty.snap -2022/07/03 | 450 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_multiple.snap -2022/07/03 | 1048 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_options.snap -2022/07/03 | 337 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_simple.snap -2022/07/03 | 135 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter_error.snap -2022/07/03 | 137 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter.snap -2022/07/03 | 343 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__pgf_library_import_simple.snap -2022/07/03 | 1282 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_enum_item.snap -2022/07/03 | 521 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_invalid_nesting.snap -2022/07/03 | 1791 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_nested.snap -2022/07/03 | 677 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_siblings.snap -2022/07/03 | 676 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_options.snap -2022/07/03 | 337 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_simple.snap -2022/07/03 | 734 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_full.snap -2022/07/03 | 490 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_counter.snap -2022/07/03 | 598 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description_and_counter.snap -2022/07/03 | 462 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description.snap -2022/07/03 | 354 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_only_name.snap -2022/07/03 | 345 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__tikz_library_import_simple.snap -2022/07/03 | 206 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_braces.snap -2022/07/03 | 206 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets.snap -2022/07/03 | 285 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets_with_group.snap -2022/07/03 | 353 | support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__verbatim_include_simple.snap -2022/07/03 | 50 | support/texlab/src/syntax.rs -2022/07/03 | 261 | support/texlab/src/syntax/snapshots/texlab__syntax__build_log__tests__parse_007.snap -2022/07/03 | 7625 | support/texlab/src/workspace.rs -2022/07/03 | 4999 | support/texlab/tests/integration/lsp/client.rs -2022/07/03 | 3756 | support/texlab/tests/integration/lsp/fixture.rs -2022/07/03 | 59 | support/texlab/tests/integration/lsp.rs -2022/07/03 | 14757 | support/texlab/tests/integration/lsp/text_document/completion.rs -2022/07/03 | 3010 | support/texlab/tests/integration/lsp/text_document/definition.rs -2022/07/03 | 1050 | support/texlab/tests/integration/lsp/text_document/did_change_configuration.rs -2022/07/03 | 1680 | support/texlab/tests/integration/lsp/text_document/document_highlight.rs -2022/07/03 | 1601 | support/texlab/tests/integration/lsp/text_document/document_link.rs -2022/07/03 | 8903 | support/texlab/tests/integration/lsp/text_document/document_symbol.rs -2022/07/03 | 2282 | support/texlab/tests/integration/lsp/text_document/folding_range.rs -2022/07/03 | 3472 | support/texlab/tests/integration/lsp/text_document/formatting.rs -2022/07/03 | 5899 | support/texlab/tests/integration/lsp/text_document/hover.rs -2022/07/03 | 8932 | support/texlab/tests/integration/lsp/text_document/publish_diagnostics.rs -2022/07/03 | 4962 | support/texlab/tests/integration/lsp/text_document/references.rs -2022/07/03 | 2096 | support/texlab/tests/integration/lsp/text_document/rename.rs -2022/07/03 | 256 | support/texlab/tests/integration/lsp/text_document.rs -2022/07/03 | 460 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_empty.snap -2022/07/03 | 479 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_open_brace.snap -2022/07/03 | 479 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_simple.snap -2022/07/03 | 1344 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_empty.snap -2022/07/03 | 1354 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_open_brace.snap -2022/07/03 | 445 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_word.snap -2022/07/03 | 1378 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__begin_environment_without_snippet_support.snap -2022/07/03 | 511 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_acronym.snap -2022/07/03 | 494 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace_multiple.snap -2022/07/03 | 467 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace.snap -2022/07/03 | 1017 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation.snap -2022/07/03 | 1160 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_open_brace.snap -2022/07/03 | 1156 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_open_brace.snap -2022/07/03 | 1157 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_simple.snap -2022/07/03 | 1161 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_simple.snap -2022/07/03 | 1176 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_open_brace.snap -2022/07/03 | 1177 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_simple.snap -2022/07/03 | 1186 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_word.snap -2022/07/03 | 1399 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_bibtex.snap -2022/07/03 | 1381 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple_package.snap -2022/07/03 | 1315 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple.snap -2022/07/03 | 458 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_class.snap -2022/07/03 | 475 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_command_definition.snap -2022/07/03 | 1317 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple_end.snap -2022/07/03 | 419 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple.snap -2022/07/03 | 390 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_preamble.snap -2022/07/03 | 380 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_string.snap -2022/07/03 | 1349 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_at_empty.snap -2022/07/03 | 417 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_article.snap -2022/07/03 | 381 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_preamble.snap -2022/07/03 | 373 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_string.snap -2022/07/03 | 440 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_complete_entry.snap -2022/07/03 | 1398 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_closed.snap -2022/07/03 | 1397 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_open.snap -2022/07/03 | 1423 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_field_name.snap -2022/07/03 | 1464 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_closed.snap -2022/07/03 | 1463 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_open.snap -2022/07/03 | 464 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_open_brace.snap -2022/07/03 | 465 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_simple.snap -2022/07/03 | 1450 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_closed_brace.snap -2022/07/03 | 1455 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_open_brace.snap -2022/07/03 | 1437 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_closed_brace.snap -2022/07/03 | 1436 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_open_brace.snap -2022/07/03 | 2876 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__label.snap -2022/07/03 | 449 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_begin.snap -2022/07/03 | 458 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_end.snap -2022/07/03 | 1255 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_closed_brace.snap -2022/07/03 | 1254 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_open_brace.snap -2022/07/03 | 475 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_command.snap -2022/07/03 | 714 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_environment.snap -2022/07/03 | 302 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__did_change_configuration__invalid_configuration.snap -2022/07/03 | 1624 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_flat.snap -2022/07/03 | 2679 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_nested.snap -2022/07/03 | 1037 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_flat.snap -2022/07/03 | 1419 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_nested.snap -2022/07/03 | 1043 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_flat.snap -2022/07/03 | 1429 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_nested.snap -2022/07/03 | 1016 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_flat.snap -2022/07/03 | 1510 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_nested.snap -2022/07/03 | 1344 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_flat.snap -2022/07/03 | 1868 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_nested.snap -2022/07/03 | 204 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_command.snap -2022/07/03 | 193 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_insert_braces.snap -2022/07/03 | 219 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_join_strings.snap -2022/07/03 | 1003 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_multiple_entries.snap -2022/07/03 | 170 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_parens.snap -2022/07/03 | 203 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_preamble.snap -2022/07/03 | 181 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_string.snap -2022/07/03 | 194 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_trailing_comma.snap -2022/07/03 | 567 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap -2022/07/03 | 483 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_allowed.snap -2022/07/03 | 446 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_ignored.snap -2022/07/03 | 770 | support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_none.snap -2022/07/03 | 12 | support/texlab/tests/integration/lsp/workspace.rs -2022/07/03 | 713 | support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_bibtex.snap -2022/07/03 | 425 | support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_figure.snap -2022/07/03 | 1012 | support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_item.snap -2022/07/03 | 735 | support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_math.snap -2022/07/03 | 1322 | support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_section.snap -2022/07/03 | 3889 | support/texlab/tests/integration/lsp/workspace/symbol.rs -2022/07/03 | 9 | support/texlab/tests/integration/main.rs -2022/07/03 | 643 | support/texlab/texlab.1 -2022/07/03 | 82677 | support/texlab/texlab.pdf -2022/07/03 | 2586 | support/texlab/texlab.tex -2022/07/03 | 7702774 | support/texlab.zip +2022/12/29 | 869 | support/texlab/benches/bench_main.rs +2022/12/29 | 50578 | support/texlab/Cargo.lock +2022/12/29 | 2234 | support/texlab/Cargo.toml +2022/12/29 | 23916 | support/texlab/CHANGELOG.md +2022/12/29 | 183 | support/texlab/CONTRIBUTING.md +2022/12/29 | 6970534 | support/texlab/data/components.json.gz +2022/12/29 | 57018 | support/texlab/data/lang_data.json +2022/12/29 | 380190 | support/texlab/images/demo.gif +2022/12/29 | 35149 | support/texlab/LICENSE +2022/12/29 | 3824 | support/texlab/README.md +2022/12/29 | 22224 | support/texlab/src/citation/driver.rs +2022/12/29 | 3231 | support/texlab/src/citation/entry.rs +2022/12/29 | 1631 | support/texlab/src/citation/field/author.rs +2022/12/29 | 2490 | support/texlab/src/citation/field/date.rs +2022/12/29 | 1385 | support/texlab/src/citation/field/number.rs +2022/12/29 | 60 | support/texlab/src/citation/field.rs +2022/12/29 | 6933 | support/texlab/src/citation/field/text.rs +2022/12/29 | 1760 | support/texlab/src/citation/output.rs +2022/12/29 | 905 | support/texlab/src/citation.rs +2022/12/29 | 1064 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap +2022/12/29 | 800 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap +2022/12/29 | 1330 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap +2022/12/29 | 1062 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap +2022/12/29 | 1314 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap +2022/12/29 | 988 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap +2022/12/29 | 585 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap +2022/12/29 | 1411 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap +2022/12/29 | 1223 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap +2022/12/29 | 720 | support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap +2022/12/29 | 1176 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap +2022/12/29 | 1051 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap +2022/12/29 | 1428 | support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap +2022/12/29 | 967 | support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap +2022/12/29 | 11874 | support/texlab/src/citation/tests.rs +2022/12/29 | 3146 | support/texlab/src/client.rs +2022/12/29 | 3197 | support/texlab/src/db/analysis/label.rs +2022/12/29 | 5573 | support/texlab/src/db/analysis.rs +2022/12/29 | 3223 | support/texlab/src/db/diagnostics/bib.rs +2022/12/29 | 2931 | support/texlab/src/db/diagnostics/log.rs +2022/12/29 | 6113 | support/texlab/src/db/diagnostics.rs +2022/12/29 | 3694 | support/texlab/src/db/diagnostics/tex.rs +2022/12/29 | 6958 | support/texlab/src/db/discovery.rs +2022/12/29 | 4915 | support/texlab/src/db/document.rs +2022/12/29 | 1519 | support/texlab/src/db/parse.rs +2022/12/29 | 230 | support/texlab/src/db.rs +2022/12/29 | 6970 | support/texlab/src/db/workspace.rs +2022/12/29 | 1816 | support/texlab/src/distro/file_name_db.rs +2022/12/29 | 712 | support/texlab/src/distro/kpsewhich.rs +2022/12/29 | 2474 | support/texlab/src/distro/miktex.rs +2022/12/29 | 1955 | support/texlab/src/distro.rs +2022/12/29 | 820 | support/texlab/src/distro/texlive.rs +2022/12/29 | 1668 | support/texlab/src/features/build/progress.rs +2022/12/29 | 5358 | support/texlab/src/features/build.rs +2022/12/29 | 844 | support/texlab/src/features/completion/acronym_ref.rs +2022/12/29 | 1752 | support/texlab/src/features/completion/argument.rs +2022/12/29 | 283 | support/texlab/src/features/completion/begin_snippet.rs +2022/12/29 | 25487 | support/texlab/src/features/completion/builder.rs +2022/12/29 | 1710 | support/texlab/src/features/completion/citation.rs +2022/12/29 | 1236 | support/texlab/src/features/completion/color_model.rs +2022/12/29 | 499 | support/texlab/src/features/completion/color.rs +2022/12/29 | 692 | support/texlab/src/features/completion/component_command.rs +2022/12/29 | 533 | support/texlab/src/features/completion/component_environment.rs +2022/12/29 | 711 | support/texlab/src/features/completion/entry_type.rs +2022/12/29 | 849 | support/texlab/src/features/completion/field.rs +2022/12/29 | 1221 | support/texlab/src/features/completion/glossary_ref.rs +2022/12/29 | 1567 | support/texlab/src/features/completion/import.rs +2022/12/29 | 4277 | support/texlab/src/features/completion/include.rs +2022/12/29 | 3055 | support/texlab/src/features/completion/label.rs +2022/12/29 | 1702 | support/texlab/src/features/completion.rs +2022/12/29 | 576 | support/texlab/src/features/completion/theorem.rs +2022/12/29 | 730 | support/texlab/src/features/completion/tikz_library.rs +2022/12/29 | 877 | support/texlab/src/features/completion/user_command.rs +2022/12/29 | 661 | support/texlab/src/features/completion/user_environment.rs +2022/12/29 | 1326 | support/texlab/src/features/definition/command.rs +2022/12/29 | 992 | support/texlab/src/features/definition/document.rs +2022/12/29 | 1215 | support/texlab/src/features/definition/entry.rs +2022/12/29 | 1258 | support/texlab/src/features/definition/label.rs +2022/12/29 | 1917 | support/texlab/src/features/definition.rs +2022/12/29 | 995 | support/texlab/src/features/definition/string.rs +2022/12/29 | 2065 | support/texlab/src/features/folding.rs +2022/12/29 | 7419 | support/texlab/src/features/formatting/bibtex_internal.rs +2022/12/29 | 2115 | support/texlab/src/features/formatting/latexindent.rs +2022/12/29 | 1017 | support/texlab/src/features/formatting.rs +2022/12/29 | 5312 | support/texlab/src/features/forward_search.rs +2022/12/29 | 1082 | support/texlab/src/features/highlight/label.rs +2022/12/29 | 308 | support/texlab/src/features/highlight.rs +2022/12/29 | 785 | support/texlab/src/features/hover/citation.rs +2022/12/29 | 852 | support/texlab/src/features/hover/component.rs +2022/12/29 | 556 | support/texlab/src/features/hover/entry_type.rs +2022/12/29 | 613 | support/texlab/src/features/hover/field.rs +2022/12/29 | 672 | support/texlab/src/features/hover/label.rs +2022/12/29 | 1197 | support/texlab/src/features/hover.rs +2022/12/29 | 1158 | support/texlab/src/features/hover/string_ref.rs +2022/12/29 | 742 | support/texlab/src/features/inlay_hint/label.rs +2022/12/29 | 1186 | support/texlab/src/features/inlay_hint.rs +2022/12/29 | 639 | support/texlab/src/features/link/include.rs +2022/12/29 | 1038 | support/texlab/src/features/link.rs +2022/12/29 | 1806 | support/texlab/src/features/reference/entry.rs +2022/12/29 | 1027 | support/texlab/src/features/reference/label.rs +2022/12/29 | 1153 | support/texlab/src/features/reference.rs +2022/12/29 | 1367 | support/texlab/src/features/reference/string.rs +2022/12/29 | 1296 | support/texlab/src/features/rename/command.rs +2022/12/29 | 2205 | support/texlab/src/features/rename/entry.rs +2022/12/29 | 2904 | support/texlab/src/features/rename/label.rs +2022/12/29 | 1844 | support/texlab/src/features/rename.rs +2022/12/29 | 262 | support/texlab/src/features.rs +2022/12/29 | 2641 | support/texlab/src/features/symbol/bibtex.rs +2022/12/29 | 14005 | support/texlab/src/features/symbol/latex.rs +2022/12/29 | 5482 | support/texlab/src/features/symbol/project_order.rs +2022/12/29 | 3223 | support/texlab/src/features/symbol.rs +2022/12/29 | 3786 | support/texlab/src/features/symbol/types.rs +2022/12/29 | 2942 | support/texlab/src/features/workspace_command.rs +2022/12/29 | 2875 | support/texlab/src/lib.rs +2022/12/29 | 1865 | support/texlab/src/main.rs +2022/12/29 | 3547 | support/texlab/src/options.rs +2022/12/29 | 11459 | support/texlab/src/parser/bibtex.rs +2022/12/29 | 5543 | support/texlab/src/parser/build_log.rs +2022/12/29 | 17987 | support/texlab/src/parser/latex/lexer.rs +2022/12/29 | 37434 | support/texlab/src/parser/latex.rs +2022/12/29 | 125 | support/texlab/src/parser.rs +2022/12/29 | 220 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap +2022/12/29 | 693 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap +2022/12/29 | 359 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap +2022/12/29 | 3653 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap +2022/12/29 | 7517 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap +2022/12/29 | 7308 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap +2022/12/29 | 10366 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap +2022/12/29 | 5850 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap +2022/12/29 | 6630 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap +2022/12/29 | 7143 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap +2022/12/29 | 6822 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap +2022/12/29 | 7514 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap +2022/12/29 | 8854 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap +2022/12/29 | 9465 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap +2022/12/29 | 5046 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap +2022/12/29 | 11001 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap +2022/12/29 | 6458 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap +2022/12/29 | 702 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap +2022/12/29 | 434 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap +2022/12/29 | 595 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap +2022/12/29 | 961 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap +2022/12/29 | 872 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap +2022/12/29 | 1658 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap +2022/12/29 | 399 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap +2022/12/29 | 668 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap +2022/12/29 | 646 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap +2022/12/29 | 641 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap +2022/12/29 | 776 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap +2022/12/29 | 519 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap +2022/12/29 | 514 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap +2022/12/29 | 282 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap +2022/12/29 | 332 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap +2022/12/29 | 440 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap +2022/12/29 | 595 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap +2022/12/29 | 459 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap +2022/12/29 | 391 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap +2022/12/29 | 331 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap +2022/12/29 | 329 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap +2022/12/29 | 729 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap +2022/12/29 | 350 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap +2022/12/29 | 872 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap +2022/12/29 | 635 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap +2022/12/29 | 528 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap +2022/12/29 | 343 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap +2022/12/29 | 979 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap +2022/12/29 | 509 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap +2022/12/29 | 411 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap +2022/12/29 | 406 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap +2022/12/29 | 765 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap +2022/12/29 | 674 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap +2022/12/29 | 1192 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap +2022/12/29 | 400 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap +2022/12/29 | 502 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap +2022/12/29 | 635 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap +2022/12/29 | 912 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap +2022/12/29 | 1122 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap +2022/12/29 | 1299 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap +2022/12/29 | 1143 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap +2022/12/29 | 746 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap +2022/12/29 | 823 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap +2022/12/29 | 377 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap +2022/12/29 | 454 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap +2022/12/29 | 210 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap +2022/12/29 | 209 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap +2022/12/29 | 1462 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap +2022/12/29 | 1356 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap +2022/12/29 | 755 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap +2022/12/29 | 757 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap +2022/12/29 | 811 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap +2022/12/29 | 368 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap +2022/12/29 | 969 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap +2022/12/29 | 914 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap +2022/12/29 | 368 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap +2022/12/29 | 580 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap +2022/12/29 | 500 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap +2022/12/29 | 403 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap +2022/12/29 | 322 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap +2022/12/29 | 318 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap +2022/12/29 | 858 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap +2022/12/29 | 394 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap +2022/12/29 | 250 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap +2022/12/29 | 252 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap +2022/12/29 | 340 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap +2022/12/29 | 228 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap +2022/12/29 | 856 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap +2022/12/29 | 381 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap +2022/12/29 | 369 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap +2022/12/29 | 315 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap +2022/12/29 | 1058 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap +2022/12/29 | 367 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap +2022/12/29 | 919 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap +2022/12/29 | 765 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap +2022/12/29 | 712 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap +2022/12/29 | 382 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap +2022/12/29 | 351 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap +2022/12/29 | 455 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap +2022/12/29 | 693 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap +2022/12/29 | 363 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap +2022/12/29 | 421 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap +2022/12/29 | 355 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap +2022/12/29 | 469 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap +2022/12/29 | 318 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap +2022/12/29 | 477 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap +2022/12/29 | 1061 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap +2022/12/29 | 370 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap +2022/12/29 | 380 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap +2022/12/29 | 692 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap +2022/12/29 | 362 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap +2022/12/29 | 382 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap +2022/12/29 | 380 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap +2022/12/29 | 651 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap +2022/12/29 | 633 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap +2022/12/29 | 4006 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap +2022/12/29 | 307 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap +2022/12/29 | 473 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap +2022/12/29 | 351 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap +2022/12/29 | 578 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap +2022/12/29 | 355 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap +2022/12/29 | 853 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap +2022/12/29 | 450 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap +2022/12/29 | 505 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap +2022/12/29 | 404 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap +2022/12/29 | 507 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap +2022/12/29 | 343 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap +2022/12/29 | 173 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap +2022/12/29 | 168 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap +2022/12/29 | 1270 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap +2022/12/29 | 551 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap +2022/12/29 | 1744 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap +2022/12/29 | 692 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap +2022/12/29 | 768 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap +2022/12/29 | 547 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap +2022/12/29 | 666 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap +2022/12/29 | 523 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap +2022/12/29 | 408 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap +2022/12/29 | 82 | support/texlab/src/parser/test_data/bibtex/comment.txt +2022/12/29 | 50 | support/texlab/src/parser/test_data/bibtex/issue_809.txt +2022/12/29 | 25 | support/texlab/src/parser/test_data/bibtex/preamble.txt +2022/12/29 | 314 | support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt +2022/12/29 | 679 | support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt +2022/12/29 | 706 | support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt +2022/12/29 | 1008 | support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt +2022/12/29 | 556 | support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt +2022/12/29 | 860 | support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt +2022/12/29 | 674 | support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt +2022/12/29 | 615 | support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt +2022/12/29 | 674 | support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt +2022/12/29 | 898 | support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt +2022/12/29 | 993 | support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt +2022/12/29 | 517 | support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt +2022/12/29 | 1112 | support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt +2022/12/29 | 557 | support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt +2022/12/29 | 3194 | support/texlab/src/parser/test_data/build_log/001.txt +2022/12/29 | 2455 | support/texlab/src/parser/test_data/build_log/002.txt +2022/12/29 | 2515 | support/texlab/src/parser/test_data/build_log/003.txt +2022/12/29 | 3057 | support/texlab/src/parser/test_data/build_log/004.txt +2022/12/29 | 13353 | support/texlab/src/parser/test_data/build_log/005.txt +2022/12/29 | 4130 | support/texlab/src/parser/test_data/build_log/006.txt +2022/12/29 | 7762 | support/texlab/src/parser/test_data/build_log/007.txt +2022/12/29 | 48 | support/texlab/src/parser/test_data/latex/block_comments.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/caption/caption_default.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/caption/caption_figure.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt +2022/12/29 | 7 | support/texlab/src/parser/test_data/latex/citation/citation_empty.txt +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt +2022/12/29 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_simple.txt +2022/12/29 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_star.txt +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt +2022/12/29 | 30 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt +2022/12/29 | 25 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt +2022/12/29 | 29 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt +2022/12/29 | 23 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt +2022/12/29 | 80 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt +2022/12/29 | 31 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt +2022/12/29 | 50 | support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt +2022/12/29 | 47 | support/texlab/src/parser/test_data/latex/environment/environment_definition.txt +2022/12/29 | 52 | support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt +2022/12/29 | 43 | support/texlab/src/parser/test_data/latex/environment/environment_nested.txt +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/environment/environment_simple.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/equation_missing_begin.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/equation.txt +2022/12/29 | 14 | support/texlab/src/parser/test_data/latex/generic_command_args.txt +2022/12/29 | 4 | support/texlab/src/parser/test_data/latex/generic_command_empty.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/generic_command_escape.txt +2022/12/29 | 64 | support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt +2022/12/29 | 76 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt +2022/12/29 | 35 | support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt +2022/12/29 | 32 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt +2022/12/29 | 25 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt +2022/12/29 | 32 | support/texlab/src/parser/test_data/latex/graphics_path_command.txt +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/graphics_path_options.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/graphics_path.txt +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt +2022/12/29 | 6 | support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt +2022/12/29 | 4 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/hello_world.txt +2022/12/29 | 42 | support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/include/class_include_empty.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/include/class_include_options.txt +2022/12/29 | 23 | support/texlab/src/parser/test_data/latex/include/class_include_simple.txt +2022/12/29 | 52 | support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt +2022/12/29 | 29 | support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/include/import_incomplete.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/import_simple.txt +2022/12/29 | 30 | support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/include/package_include_empty.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt +2022/12/29 | 41 | support/texlab/src/parser/test_data/latex/include/package_include_options.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/package_include_simple.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt +2022/12/29 | 34 | support/texlab/src/parser/test_data/latex/include/svg_include_options.txt +2022/12/29 | 24 | support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/inline_double_dollar.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/inline.txt +2022/12/29 | 271 | support/texlab/src/parser/test_data/latex/issue_745.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/issue_789.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/label/label_number.txt +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt +2022/12/29 | 47 | support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt +2022/12/29 | 14 | support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt +2022/12/29 | 1 | support/texlab/src/parser/test_data/latex/parameter_error.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/parameter.txt +2022/12/29 | 60 | support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt +2022/12/29 | 90 | support/texlab/src/parser/test_data/latex/structure/structure_nested.txt +2022/12/29 | 35 | support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt +2022/12/29 | 31 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt +2022/12/29 | 2416 | support/texlab/src/server/dispatch.rs +2022/12/29 | 627 | support/texlab/src/server/query.rs +2022/12/29 | 35880 | support/texlab/src/server.rs +2022/12/29 | 7955 | support/texlab/src/syntax/bibtex.rs +2022/12/29 | 16999 | support/texlab/src/syntax/latex/cst.rs +2022/12/29 | 4513 | support/texlab/src/syntax/latex/kind.rs +2022/12/29 | 689 | support/texlab/src/syntax/latex.rs +2022/12/29 | 485 | support/texlab/src/syntax.rs +2022/12/29 | 4856 | support/texlab/src/tests/client.rs +2022/12/29 | 3718 | support/texlab/src/tests/fixture.rs +2022/12/29 | 246 | support/texlab/src/tests/issues.rs +2022/12/29 | 71 | support/texlab/src/tests.rs +2022/12/29 | 1103 | support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap +2022/12/29 | 14009 | support/texlab/src/tests/text_document/completion.rs +2022/12/29 | 2893 | support/texlab/src/tests/text_document/definition.rs +2022/12/29 | 1003 | support/texlab/src/tests/text_document/did_change_configuration.rs +2022/12/29 | 1634 | support/texlab/src/tests/text_document/document_highlight.rs +2022/12/29 | 1542 | support/texlab/src/tests/text_document/document_link.rs +2022/12/29 | 8648 | support/texlab/src/tests/text_document/document_symbol.rs +2022/12/29 | 2223 | support/texlab/src/tests/text_document/folding_range.rs +2022/12/29 | 3246 | support/texlab/src/tests/text_document/formatting.rs +2022/12/29 | 5680 | support/texlab/src/tests/text_document/hover.rs +2022/12/29 | 2050 | support/texlab/src/tests/text_document/inlay_hint.rs +2022/12/29 | 4727 | support/texlab/src/tests/text_document/references.rs +2022/12/29 | 2008 | support/texlab/src/tests/text_document/rename.rs +2022/12/29 | 216 | support/texlab/src/tests/text_document.rs +2022/12/29 | 373 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_package_ref.snap +2022/12/29 | 407 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_empty.snap +2022/12/29 | 425 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_open_brace.snap +2022/12/29 | 426 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_simple.snap +2022/12/29 | 1202 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_empty.snap +2022/12/29 | 1212 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_open_brace.snap +2022/12/29 | 391 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_word.snap +2022/12/29 | 1236 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__begin_environment_without_snippet_support.snap +2022/12/29 | 479 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_acronym.snap +2022/12/29 | 462 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace_multiple.snap +2022/12/29 | 435 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace.snap +2022/12/29 | 985 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation.snap +2022/12/29 | 1018 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_open_brace.snap +2022/12/29 | 1014 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_open_brace.snap +2022/12/29 | 1015 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_simple.snap +2022/12/29 | 1019 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_simple.snap +2022/12/29 | 1034 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_open_brace.snap +2022/12/29 | 1035 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_simple.snap +2022/12/29 | 1044 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_word.snap +2022/12/29 | 1257 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_bibtex.snap +2022/12/29 | 1239 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple_package.snap +2022/12/29 | 1173 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple.snap +2022/12/29 | 404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_class.snap +2022/12/29 | 421 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_command_definition.snap +2022/12/29 | 1175 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple_end.snap +2022/12/29 | 365 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple.snap +2022/12/29 | 336 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_preamble.snap +2022/12/29 | 326 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_string.snap +2022/12/29 | 1207 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_at_empty.snap +2022/12/29 | 363 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_article.snap +2022/12/29 | 327 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_preamble.snap +2022/12/29 | 319 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_string.snap +2022/12/29 | 386 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_complete_entry.snap +2022/12/29 | 1256 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_closed.snap +2022/12/29 | 1255 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_open.snap +2022/12/29 | 1281 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_field_name.snap +2022/12/29 | 1322 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_closed.snap +2022/12/29 | 1321 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_open.snap +2022/12/29 | 410 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_open_brace.snap +2022/12/29 | 411 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_simple.snap +2022/12/29 | 1418 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_closed_brace.snap +2022/12/29 | 1423 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_open_brace.snap +2022/12/29 | 1405 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_closed_brace.snap +2022/12/29 | 1404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_open_brace.snap +2022/12/29 | 2734 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__label.snap +2022/12/29 | 1377 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap +2022/12/29 | 395 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_begin.snap +2022/12/29 | 404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_end.snap +2022/12/29 | 1113 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_closed_brace.snap +2022/12/29 | 1112 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_open_brace.snap +2022/12/29 | 421 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_command.snap +2022/12/29 | 638 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_environment.snap +2022/12/29 | 271 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__did_change_configuration__invalid_configuration.snap +2022/12/29 | 1593 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_flat.snap +2022/12/29 | 2648 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_nested.snap +2022/12/29 | 1005 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_flat.snap +2022/12/29 | 1387 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_nested.snap +2022/12/29 | 1011 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_flat.snap +2022/12/29 | 1397 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_nested.snap +2022/12/29 | 984 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_flat.snap +2022/12/29 | 1478 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_nested.snap +2022/12/29 | 1312 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_flat.snap +2022/12/29 | 1836 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_nested.snap +2022/12/29 | 173 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_command.snap +2022/12/29 | 162 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_insert_braces.snap +2022/12/29 | 187 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_join_strings.snap +2022/12/29 | 972 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_multiple_entries.snap +2022/12/29 | 138 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_parens.snap +2022/12/29 | 171 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_preamble.snap +2022/12/29 | 149 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_string.snap +2022/12/29 | 163 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_trailing_comma.snap +2022/12/29 | 536 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_wrap_long_lines.snap +2022/12/29 | 1709 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__inlay_hint__label_definition.snap +2022/12/29 | 12 | support/texlab/src/tests/workspace.rs +2022/12/29 | 681 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_bibtex.snap +2022/12/29 | 393 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_figure.snap +2022/12/29 | 980 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_item.snap +2022/12/29 | 703 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_math.snap +2022/12/29 | 1290 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_section.snap +2022/12/29 | 3742 | support/texlab/src/tests/workspace/symbol.rs +2022/12/29 | 6018 | support/texlab/src/util/capabilities.rs +2022/12/29 | 3444 | support/texlab/src/util/chktex.rs +2022/12/29 | 3590 | support/texlab/src/util/components.rs +2022/12/29 | 9483 | support/texlab/src/util/cursor.rs +2022/12/29 | 8394 | support/texlab/src/util/label.rs +2022/12/29 | 2049 | support/texlab/src/util/lang_data.rs +2022/12/29 | 1280 | support/texlab/src/util/line_index_ext.rs +2022/12/29 | 6484 | support/texlab/src/util/line_index.rs +2022/12/29 | 4008 | support/texlab/src/util/lsp_enums.rs +2022/12/29 | 302 | support/texlab/src/util.rs +2022/12/29 | 642 | support/texlab/texlab.1 +2022/12/29 | 26341 | support/texlab/texlab.pdf +2022/12/29 | 2586 | support/texlab/texlab.tex +2022/12/29 | 7699029 | support/texlab.zip 2011/11/27 | 456 | support/texlipse/plugin/1.5.0/README.TXT 2011/11/27 | 1726937 | support/texlipse/plugin/1.5.0/texlipse_1.5.0 src.zip 1999/01/30 | 6077 | support/texlist/README @@ -281027,9 +281175,9 @@ 2006/03/12 | 12757 | support/texref.zip 1995/01/06 | 1005 | support/TeXshell/TeXshell.2.8.README 1995/01/06 | 147665 | support/TeXshell/TeXshell.2.8.tar.gz -2022/12/27 | 753 | support/texshop/README.txt -2022/12/27 | 2552 | support/texshop/texshop509.html -2022/12/27 | 67436714 | support/texshop/texshop509.zip +2022/12/29 | 753 | support/texshop/README.txt +2022/12/29 | 2721 | support/texshop/texshop510.html +2022/12/29 | 67440487 | support/texshop/texshop510.zip 1994/11/10 | 411107 | support/texspell/texspell.zip 1994/11/10 | 42315 | support/texspell/texspsrc.zip 1994/11/10 | 411107 | support/texspell.zip @@ -286515,7 +286663,7 @@ 2022/12/28 | 6808 | systems/texlive/tlnet/archive/collection-latexextra.r65375.tar.xz 2022/06/10 | 700 | systems/texlive/tlnet/archive/collection-latex.r63515.tar.xz 2022/06/12 | 736 | systems/texlive/tlnet/archive/collection-latexrecommended.r63547.tar.xz -2022/12/28 | 948 | systems/texlive/tlnet/archive/collection-luatex.r65376.tar.xz +2022/12/29 | 952 | systems/texlive/tlnet/archive/collection-luatex.r65388.tar.xz 2022/12/20 | 1644 | systems/texlive/tlnet/archive/collection-mathscience.r65312.tar.xz 2022/11/01 | 556 | systems/texlive/tlnet/archive/collection-metapost.r64878.tar.xz 2022/11/08 | 484 | systems/texlive/tlnet/archive/collection-music.r64966.tar.xz @@ -289918,9 +290066,9 @@ 2019/02/28 | 3136 | systems/texlive/tlnet/archive/hyplain.r15878.tar.xz 2022/10/02 | 213588 | systems/texlive/tlnet/archive/ibarra.doc.r64567.tar.xz 2022/10/02 | 1106004 | systems/texlive/tlnet/archive/ibarra.r64567.tar.xz -2022/12/20 | 82268 | systems/texlive/tlnet/archive/ibrackets.doc.r65312.tar.xz -2022/12/20 | 1120 | systems/texlive/tlnet/archive/ibrackets.r65312.tar.xz -2022/12/20 | 3808 | systems/texlive/tlnet/archive/ibrackets.source.r65312.tar.xz +2022/12/29 | 80632 | systems/texlive/tlnet/archive/ibrackets.doc.r65383.tar.xz +2022/12/29 | 1120 | systems/texlive/tlnet/archive/ibrackets.r65383.tar.xz +2022/12/29 | 3836 | systems/texlive/tlnet/archive/ibrackets.source.r65383.tar.xz 2019/02/28 | 53824 | systems/texlive/tlnet/archive/ibycus-babel.doc.r15878.tar.xz 2019/02/28 | 2164 | systems/texlive/tlnet/archive/ibycus-babel.r15878.tar.xz 2019/02/28 | 7824 | systems/texlive/tlnet/archive/ibycus-babel.source.r15878.tar.xz @@ -290195,8 +290343,8 @@ 2022/08/08 | 237760 | systems/texlive/tlnet/archive/japanese-otf.r64072.tar.xz 2022/08/08 | 67336 | systems/texlive/tlnet/archive/japanese-otf.source.r64072.tar.xz 2019/11/12 | 9792 | systems/texlive/tlnet/archive/jbact.r52717.tar.xz -2022/12/28 | 5791284 | systems/texlive/tlnet/archive/jeuxcartes.doc.r65373.tar.xz -2022/12/28 | 4563944 | systems/texlive/tlnet/archive/jeuxcartes.r65373.tar.xz +2022/12/29 | 5792460 | systems/texlive/tlnet/archive/jeuxcartes.doc.r65384.tar.xz +2022/12/29 | 4563876 | systems/texlive/tlnet/archive/jeuxcartes.r65384.tar.xz 2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.aarch64-linux.r46228.tar.xz 2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.amd64-freebsd.r44835.tar.xz 2019/02/28 | 340 | systems/texlive/tlnet/archive/jfmutil.amd64-netbsd.r44835.tar.xz @@ -291368,6 +291516,8 @@ 2021/02/22 | 328240 | systems/texlive/tlnet/archive/luacolor.doc.r57829.tar.xz 2021/02/22 | 4152 | systems/texlive/tlnet/archive/luacolor.r57829.tar.xz 2021/02/22 | 9244 | systems/texlive/tlnet/archive/luacolor.source.r57829.tar.xz +2022/12/29 | 114736 | systems/texlive/tlnet/archive/luacomplex.doc.r65388.tar.xz +2022/12/29 | 1620 | systems/texlive/tlnet/archive/luacomplex.r65388.tar.xz 2021/12/03 | 340 | systems/texlive/tlnet/archive/luafindfont.aarch64-linux.r61207.tar.xz 2021/12/03 | 344 | systems/texlive/tlnet/archive/luafindfont.amd64-freebsd.r61207.tar.xz 2021/12/03 | 340 | systems/texlive/tlnet/archive/luafindfont.amd64-netbsd.r61207.tar.xz @@ -293789,9 +293939,9 @@ 2019/02/28 | 1860 | systems/texlive/tlnet/archive/postcards.r21641.tar.xz 2019/02/28 | 93292 | systems/texlive/tlnet/archive/poster-mac.doc.r18305.tar.xz 2019/02/28 | 3152 | systems/texlive/tlnet/archive/poster-mac.r18305.tar.xz -2022/11/14 | 972316 | systems/texlive/tlnet/archive/postnotes.doc.r65007.tar.xz -2022/11/14 | 7156 | systems/texlive/tlnet/archive/postnotes.r65007.tar.xz -2022/11/14 | 21168 | systems/texlive/tlnet/archive/postnotes.source.r65007.tar.xz +2022/12/29 | 973012 | systems/texlive/tlnet/archive/postnotes.doc.r65385.tar.xz +2022/12/29 | 7192 | systems/texlive/tlnet/archive/postnotes.r65385.tar.xz +2022/12/29 | 21580 | systems/texlive/tlnet/archive/postnotes.source.r65385.tar.xz 2021/05/20 | 948160 | systems/texlive/tlnet/archive/powerdot.doc.r59272.tar.xz 2019/11/26 | 280080 | systems/texlive/tlnet/archive/powerdot-fuberlin.doc.r52922.tar.xz 2019/11/26 | 2704 | systems/texlive/tlnet/archive/powerdot-fuberlin.r52922.tar.xz @@ -293856,8 +294006,8 @@ 2022/11/29 | 1248276 | systems/texlive/tlnet/archive/profcollege.r65122.tar.xz 2022/04/27 | 134096 | systems/texlive/tlnet/archive/proflabo.doc.r63147.tar.xz 2022/04/27 | 2748 | systems/texlive/tlnet/archive/proflabo.r63147.tar.xz -2022/12/20 | 1478748 | systems/texlive/tlnet/archive/proflycee.doc.r65313.tar.xz -2022/12/20 | 25924 | systems/texlive/tlnet/archive/proflycee.r65313.tar.xz +2022/12/29 | 1509640 | systems/texlive/tlnet/archive/proflycee.doc.r65386.tar.xz +2022/12/29 | 25988 | systems/texlive/tlnet/archive/proflycee.r65386.tar.xz 2019/02/28 | 49880 | systems/texlive/tlnet/archive/program.doc.r44214.tar.xz 2019/02/28 | 11780 | systems/texlive/tlnet/archive/program.r44214.tar.xz 2019/02/28 | 86236 | systems/texlive/tlnet/archive/progressbar.doc.r33822.tar.xz @@ -296004,7 +296154,7 @@ 2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz -2022/12/28 | 423964 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65371.tar.xz +2022/12/29 | 424184 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65379.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 @@ -296028,7 +296178,7 @@ 2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz -2022/12/28 | 113700 | systems/texlive/tlnet/archive/texlive-scripts.r65371.tar.xz +2022/12/29 | 113692 | systems/texlive/tlnet/archive/texlive-scripts.r65379.tar.xz 2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz 2022/11/29 | 36264 | systems/texlive/tlnet/archive/texlive-scripts.win32.r65128.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz @@ -297875,9 +298025,9 @@ 2022/07/09 | 1070120 | systems/texlive/tlnet/archive/zref-check.doc.r63845.tar.xz 2022/07/09 | 5652 | systems/texlive/tlnet/archive/zref-check.r63845.tar.xz 2022/07/09 | 19412 | systems/texlive/tlnet/archive/zref-check.source.r63845.tar.xz -2022/05/29 | 1524120 | systems/texlive/tlnet/archive/zref-clever.doc.r63428.tar.xz -2022/05/29 | 23168 | systems/texlive/tlnet/archive/zref-clever.r63428.tar.xz -2022/05/29 | 50684 | systems/texlive/tlnet/archive/zref-clever.source.r63428.tar.xz +2022/12/29 | 1554160 | systems/texlive/tlnet/archive/zref-clever.doc.r65387.tar.xz +2022/12/29 | 23640 | systems/texlive/tlnet/archive/zref-clever.r65387.tar.xz +2022/12/29 | 54652 | systems/texlive/tlnet/archive/zref-clever.source.r65387.tar.xz 2022/04/08 | 668676 | systems/texlive/tlnet/archive/zref.doc.r62977.tar.xz 2022/04/08 | 14476 | systems/texlive/tlnet/archive/zref.r62977.tar.xz 2022/04/08 | 37216 | systems/texlive/tlnet/archive/zref.source.r62977.tar.xz @@ -297899,16 +298049,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/12/28 | 5834570 | systems/texlive/tlnet/install-tl-unx.tar.gz -2022/12/28 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 -2022/12/28 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2022/12/29 | 5834844 | systems/texlive/tlnet/install-tl-unx.tar.gz +2022/12/29 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2022/12/29 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat -2022/12/28 | 20433864 | systems/texlive/tlnet/install-tl-windows.exe -2022/12/28 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2022/12/28 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2022/12/28 | 25518531 | systems/texlive/tlnet/install-tl.zip -2022/12/28 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2022/12/28 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2022/12/29 | 20435977 | systems/texlive/tlnet/install-tl-windows.exe +2022/12/29 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2022/12/29 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2022/12/29 | 25518533 | systems/texlive/tlnet/install-tl.zip +2022/12/29 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2022/12/29 | 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 @@ -297918,7 +298068,7 @@ 2022/02/28 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg 2022/10/09 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess 2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt -2022/12/26 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2022/12/28 | 7325 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2022/10/13 | 225403 | 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 @@ -297961,12 +298111,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/12/28 | 17930067 | systems/texlive/tlnet/tlpkg/texlive.tlpdb -2022/12/28 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2022/12/29 | 17931621 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2022/12/29 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm -2022/12/28 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 -2022/12/28 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2022/12/28 | 2439484 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2022/12/29 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2022/12/29 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2022/12/29 | 2443380 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2022/09/14 | 58922 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm 2022/10/04 | 42404 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm 2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm @@ -308151,7 +308301,7 @@ 2014/07/05 | 611 | systems/win32/yandy/README 2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz 2014/07/05 | 1012416 | systems/win32/yandy.zip -2022/12/29 | 186 | timestamp +2022/12/30 | 186 | timestamp 2002/08/26 | 61898 | usergrps/dante/antrag.pdf 2002/08/26 | 118217 | usergrps/dante/antrag.ps 2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib diff --git a/FILES.byname.gz b/FILES.byname.gz Binary files differindex 4ca61e76c1..c7c02d9ea0 100644 --- a/FILES.byname.gz +++ b/FILES.byname.gz diff --git a/FILES.last07days b/FILES.last07days index d641bdcfbd..d615d48b76 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,17 +1,598 @@ +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt +2022/12/29 | 9 | support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt +2022/12/29 | 995 | support/texlab/src/features/definition/string.rs +2022/12/29 | 993 | support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt +2022/12/29 | 992 | support/texlab/src/features/definition/document.rs +2022/12/29 | 988 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_rivest_1978.snap +2022/12/29 | 985 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation.snap +2022/12/29 | 984 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_flat.snap +2022/12/29 | 980 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_item.snap +2022/12/29 | 979 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap +2022/12/29 | 973012 | systems/texlive/tlnet/archive/postnotes.doc.r65385.tar.xz +2022/12/29 | 972 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_multiple_entries.snap +2022/12/29 | 969 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap +2022/12/29 | 967 | support/texlab/src/citation/snapshots/texlab__citation__tests__patent_almendro_1998.snap +2022/12/29 | 961 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap +2022/12/29 | 952 | systems/texlive/tlnet/archive/collection-luatex.r65388.tar.xz +2022/12/29 | 9483 | support/texlab/src/util/cursor.rs +2022/12/29 | 9465 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap +2022/12/29 | 919 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap +2022/12/29 | 914 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap +2022/12/29 | 912 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap +2022/12/29 | 90 | support/texlab/src/parser/test_data/latex/structure/structure_nested.txt +2022/12/29 | 905 | support/texlab/src/citation.rs +2022/12/29 | 90097 | macros/latex/contrib/bookcover/bookcover.dtx +2022/12/29 | 898 | support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt +2022/12/29 | 8854 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap +2022/12/29 | 8838 | macros/luatex/latex/luagcd/luagcd.sty +2022/12/29 | 877 | support/texlab/src/features/completion/user_command.rs +2022/12/29 | 872 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap +2022/12/29 | 872 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap +2022/12/29 | 869 | support/texlab/benches/bench_main.rs +2022/12/29 | 8648 | support/texlab/src/tests/text_document/document_symbol.rs +2022/12/29 | 860 | support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt +2022/12/29 | 858 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap +2022/12/29 | 856 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap +2022/12/29 | 853 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap +2022/12/29 | 852 | support/texlab/src/features/hover/component.rs +2022/12/29 | 849 | support/texlab/src/features/completion/field.rs +2022/12/29 | 844 | support/texlab/src/features/completion/acronym_ref.rs +2022/12/29 | 8394 | support/texlab/src/util/label.rs +2022/12/29 | 8308808 | info/guide-latex-fr.zip +2022/12/29 | 82 | support/texlab/src/parser/test_data/bibtex/comment.txt +2022/12/29 | 823 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap +2022/12/29 | 82337 | macros/latex/contrib/bookcover/bookcover-example2.pdf +2022/12/29 | 820 | support/texlab/src/distro/texlive.rs +2022/12/29 | 811 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap +2022/12/29 | 80 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt +2022/12/29 | 80632 | systems/texlive/tlnet/archive/ibrackets.doc.r65383.tar.xz +2022/12/29 | 800 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_betram_1996.snap +2022/12/29 | 7 | support/texlab/src/parser/test_data/latex/citation/citation_empty.txt +2022/12/29 | 7955 | support/texlab/src/syntax/bibtex.rs +2022/12/29 | 786160 | macros/latex/contrib/zref-vario.zip +2022/12/29 | 785 | support/texlab/src/features/hover/citation.rs +2022/12/29 | 776 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap +2022/12/29 | 7762 | support/texlab/src/parser/test_data/build_log/007.txt +2022/12/29 | 76 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt +2022/12/29 | 7699029 | support/texlab.zip +2022/12/29 | 768 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap +2022/12/29 | 765 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap +2022/12/29 | 765 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap +2022/12/29 | 757 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap +2022/12/29 | 755 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap +2022/12/29 | 7542 | macros/luatex/latex/luagcd/luagcd.tex +2022/12/29 | 753 | support/texshop/README.txt +2022/12/29 | 7517 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap +2022/12/29 | 7514 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap +2022/12/29 | 746 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap +2022/12/29 | 742 | support/texlab/src/features/inlay_hint/label.rs +2022/12/29 | 7419 | support/texlab/src/features/formatting/bibtex_internal.rs +2022/12/29 | 730 | support/texlab/src/features/completion/tikz_library.rs +2022/12/29 | 7308 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap +2022/12/29 | 729 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap +2022/12/29 | 720 | support/texlab/src/citation/snapshots/texlab__citation__tests__collection_matuz_1990.snap +2022/12/29 | 71 | support/texlab/src/tests.rs +2022/12/29 | 7192 | systems/texlive/tlnet/archive/postnotes.r65385.tar.xz +2022/12/29 | 717534 | macros/latex/contrib/bookcover/bookcover-example1.pdf +2022/12/29 | 7143 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap +2022/12/29 | 712 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap +2022/12/29 | 712 | support/texlab/src/distro/kpsewhich.rs +2022/12/29 | 711 | support/texlab/src/features/completion/entry_type.rs +2022/12/29 | 706 | support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt +2022/12/29 | 703 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_math.snap +2022/12/29 | 702 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap +2022/12/29 | 6 | support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt +2022/12/29 | 6970 | support/texlab/src/db/workspace.rs +2022/12/29 | 6970534 | support/texlab/data/components.json.gz +2022/12/29 | 6958 | support/texlab/src/db/discovery.rs +2022/12/29 | 693 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap +2022/12/29 | 693 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap +2022/12/29 | 6933 | support/texlab/src/citation/field/text.rs +2022/12/29 | 692 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap +2022/12/29 | 692 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap +2022/12/29 | 692 | support/texlab/src/features/completion/component_command.rs +2022/12/29 | 689 | support/texlab/src/syntax/latex.rs +2022/12/29 | 6822 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap +2022/12/29 | 681 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_bibtex.snap +2022/12/29 | 679 | support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt +2022/12/29 | 674 | support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt +2022/12/29 | 674 | support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt +2022/12/29 | 674 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap +2022/12/29 | 67440487 | support/texshop/texshop510.zip +2022/12/29 | 672 | support/texlab/src/features/hover/label.rs +2022/12/29 | 668 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap +2022/12/29 | 666 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap +2022/12/29 | 6630 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap +2022/12/29 | 661 | support/texlab/src/features/completion/user_environment.rs +2022/12/29 | 651 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap +2022/12/29 | 64 | support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt +2022/12/29 | 6484 | support/texlab/src/util/line_index.rs +2022/12/29 | 647461 | macros/latex/contrib/zref-vario/zref-vario-code.pdf +2022/12/29 | 646 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap +2022/12/29 | 6458 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap +2022/12/29 | 642 | support/texlab/texlab.1 +2022/12/29 | 641 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap +2022/12/29 | 639 | support/texlab/src/features/link/include.rs +2022/12/29 | 638 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_environment.snap +2022/12/29 | 635 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap +2022/12/29 | 635 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap +2022/12/29 | 633 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap +2022/12/29 | 627 | support/texlab/src/server/query.rs +2022/12/29 | 615 | support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt +2022/12/29 | 613 | support/texlab/src/features/hover/field.rs +2022/12/29 | 612897 | macros/luatex/latex/piton.zip +2022/12/29 | 6113 | support/texlab/src/db/diagnostics.rs +2022/12/29 | 60 | support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt +2022/12/29 | 60 | support/texlab/src/citation/field.rs +2022/12/29 | 6018 | support/texlab/src/util/capabilities.rs +2022/12/29 | 595 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap +2022/12/29 | 595 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap +2022/12/29 | 585 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_aho_2006.snap +2022/12/29 | 5850 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap +2022/12/29 | 5834844 | systems/texlive/tlnet/install-tl-unx.tar.gz +2022/12/29 | 580 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap +2022/12/29 | 5792460 | systems/texlive/tlnet/archive/jeuxcartes.doc.r65384.tar.xz +2022/12/29 | 578 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap +2022/12/29 | 578 | macros/latex/contrib/zref-vario/README.md +2022/12/29 | 576 | support/texlab/src/features/completion/theorem.rs +2022/12/29 | 57018 | support/texlab/data/lang_data.json +2022/12/29 | 5680 | support/texlab/src/tests/text_document/hover.rs +2022/12/29 | 557 | support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt +2022/12/29 | 5573 | support/texlab/src/db/analysis.rs +2022/12/29 | 556 | support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt +2022/12/29 | 556 | support/texlab/src/features/hover/entry_type.rs +2022/12/29 | 5543 | support/texlab/src/parser/build_log.rs +2022/12/29 | 551 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap +2022/12/29 | 5482 | support/texlab/src/features/symbol/project_order.rs +2022/12/29 | 547 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap +2022/12/29 | 54652 | systems/texlive/tlnet/archive/zref-clever.source.r65387.tar.xz +2022/12/29 | 536 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_wrap_long_lines.snap +2022/12/29 | 5358 | support/texlab/src/features/build.rs +2022/12/29 | 533 | support/texlab/src/features/completion/component_environment.rs +2022/12/29 | 532133 | macros/luatex/latex/piton/piton.pdf +2022/12/29 | 5312 | support/texlab/src/features/forward_search.rs +2022/12/29 | 52 | support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt +2022/12/29 | 52 | support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt +2022/12/29 | 528 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap +2022/12/29 | 523 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap +2022/12/29 | 519 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap +2022/12/29 | 517 | support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt +2022/12/29 | 514 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap +2022/12/29 | 50 | support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt +2022/12/29 | 50 | support/texlab/src/parser/test_data/bibtex/issue_809.txt +2022/12/29 | 509 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap +2022/12/29 | 507 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap +2022/12/29 | 505 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap +2022/12/29 | 50578 | support/texlab/Cargo.lock +2022/12/29 | 5046 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap +2022/12/29 | 502 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap +2022/12/29 | 500 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap +2022/12/29 | 4 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt +2022/12/29 | 4 | support/texlab/src/parser/test_data/latex/generic_command_empty.txt +2022/12/29 | 499 | support/texlab/src/features/completion/color.rs +2022/12/29 | 4915 | support/texlab/src/db/document.rs +2022/12/29 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2022/12/29 | 48 | support/texlab/src/parser/test_data/latex/block_comments.txt +2022/12/29 | 485 | support/texlab/src/syntax.rs +2022/12/29 | 4856 | support/texlab/src/tests/client.rs +2022/12/29 | 47 | support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt +2022/12/29 | 47 | support/texlab/src/parser/test_data/latex/environment/environment_definition.txt +2022/12/29 | 479 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_acronym.snap +2022/12/29 | 477 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap +2022/12/29 | 473 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap +2022/12/29 | 4727 | support/texlab/src/tests/text_document/references.rs +2022/12/29 | 469 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap +2022/12/29 | 462 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace_multiple.snap +2022/12/29 | 459 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap +2022/12/29 | 4563876 | systems/texlive/tlnet/archive/jeuxcartes.r65384.tar.xz +2022/12/29 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2022/12/29 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2022/12/29 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2022/12/29 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2022/12/29 | 455 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap +2022/12/29 | 454 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap +2022/12/29 | 4513 | support/texlab/src/syntax/latex/kind.rs +2022/12/29 | 450 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/include/class_include_options.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt +2022/12/29 | 44 | support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt +2022/12/29 | 440 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap +2022/12/29 | 43 | support/texlab/src/parser/test_data/latex/environment/environment_nested.txt +2022/12/29 | 435 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace.snap +2022/12/29 | 434 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap +2022/12/29 | 42 | support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt +2022/12/29 | 4277 | support/texlab/src/features/completion/include.rs +2022/12/29 | 426 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_simple.snap +2022/12/29 | 425 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_open_brace.snap +2022/12/29 | 424184 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65379.tar.xz +2022/12/29 | 421 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_command.snap +2022/12/29 | 421 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_command_definition.snap +2022/12/29 | 421 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap +2022/12/29 | 41 | support/texlab/src/parser/test_data/latex/include/package_include_options.txt +2022/12/29 | 41726 | macros/luatex/latex/piton/piton-french.tex +2022/12/29 | 4130 | support/texlab/src/parser/test_data/build_log/006.txt +2022/12/29 | 411 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_simple.snap +2022/12/29 | 411 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap +2022/12/29 | 410 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_open_brace.snap +2022/12/29 | 408 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap +2022/12/29 | 407 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_empty.snap +2022/12/29 | 406 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap +2022/12/29 | 404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_end.snap +2022/12/29 | 404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_class.snap +2022/12/29 | 404 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap +2022/12/29 | 403 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap +2022/12/29 | 4033950 | biblio/ctan-bibdata.zip +2022/12/29 | 400 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap +2022/12/29 | 4008 | support/texlab/src/util/lsp_enums.rs +2022/12/29 | 4006 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt +2022/12/29 | 39 | support/texlab/src/parser/test_data/latex/caption/caption_figure.txt +2022/12/29 | 399 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap +2022/12/29 | 395 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_begin.snap +2022/12/29 | 394 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap +2022/12/29 | 393 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_figure.snap +2022/12/29 | 391 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_word.snap +2022/12/29 | 391 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap +2022/12/29 | 386 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_complete_entry.snap +2022/12/29 | 3836 | systems/texlive/tlnet/archive/ibrackets.source.r65383.tar.xz +2022/12/29 | 382 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap +2022/12/29 | 382 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap +2022/12/29 | 3824 | support/texlab/README.md +2022/12/29 | 381 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap +2022/12/29 | 380 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap +2022/12/29 | 380 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap +2022/12/29 | 380190 | support/texlab/images/demo.gif +2022/12/29 | 3786 | support/texlab/src/features/symbol/types.rs +2022/12/29 | 377 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap +2022/12/29 | 37725 | macros/latex/contrib/zref-vario/zref-vario.dtx +2022/12/29 | 37434 | support/texlab/src/parser/latex.rs +2022/12/29 | 3742 | support/texlab/src/tests/workspace/symbol.rs +2022/12/29 | 373 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_package_ref.snap +2022/12/29 | 3718 | support/texlab/src/tests/fixture.rs +2022/12/29 | 370 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap +2022/12/29 | 369 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap +2022/12/29 | 3694 | support/texlab/src/db/diagnostics/tex.rs +2022/12/29 | 368 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap +2022/12/29 | 368 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap +2022/12/29 | 367 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap +2022/12/29 | 365 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple.snap +2022/12/29 | 3653 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap +2022/12/29 | 363 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_article.snap +2022/12/29 | 363 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap +2022/12/29 | 3639243 | biblio/ctan-bibdata/ctan.pdf +2022/12/29 | 362 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap +2022/12/29 | 3621891 | macros/latex/contrib/bookcover.zip +2022/12/29 | 35 | support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt +2022/12/29 | 35 | support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt +2022/12/29 | 359 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap +2022/12/29 | 3590 | support/texlab/src/util/components.rs +2022/12/29 | 35880 | support/texlab/src/server.rs +2022/12/29 | 355 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap +2022/12/29 | 355 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap +2022/12/29 | 3547 | support/texlab/src/options.rs +2022/12/29 | 351 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap +2022/12/29 | 351 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap +2022/12/29 | 35149 | support/texlab/LICENSE +2022/12/29 | 350 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap +2022/12/29 | 34 | support/texlab/src/parser/test_data/latex/include/svg_include_options.txt +2022/12/29 | 3444 | support/texlab/src/util/chktex.rs +2022/12/29 | 343 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap +2022/12/29 | 343 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap +2022/12/29 | 340 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/graphics_path_options.txt +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/environment/environment_simple.txt +2022/12/29 | 33 | support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt +2022/12/29 | 336 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_preamble.snap +2022/12/29 | 332 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap +2022/12/29 | 331 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap +2022/12/29 | 32 | support/texlab/src/parser/test_data/latex/graphics_path_command.txt +2022/12/29 | 32 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt +2022/12/29 | 329 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap +2022/12/29 | 327 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_preamble.snap +2022/12/29 | 326 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_string.snap +2022/12/29 | 3246 | support/texlab/src/tests/text_document/formatting.rs +2022/12/29 | 3231 | support/texlab/src/citation/entry.rs +2022/12/29 | 322 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap +2022/12/29 | 3223 | support/texlab/src/features/symbol.rs +2022/12/29 | 3223 | support/texlab/src/db/diagnostics/bib.rs +2022/12/29 | 31 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt +2022/12/29 | 31 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt +2022/12/29 | 31 | macros/latex/contrib/zref-vario/DEPENDS.txt +2022/12/29 | 319 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_string.snap +2022/12/29 | 3197 | support/texlab/src/db/analysis/label.rs +2022/12/29 | 3194 | support/texlab/src/parser/test_data/build_log/001.txt +2022/12/29 | 318 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap +2022/12/29 | 318 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap +2022/12/29 | 315 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap +2022/12/29 | 314 | support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt +2022/12/29 | 3146 | support/texlab/src/client.rs +2022/12/29 | 30 | support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt +2022/12/29 | 30 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt +2022/12/29 | 308 | support/texlab/src/features/highlight.rs +2022/12/29 | 307 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap +2022/12/29 | 3057 | support/texlab/src/parser/test_data/build_log/004.txt +2022/12/29 | 3055 | support/texlab/src/features/completion/label.rs +2022/12/29 | 302 | support/texlab/src/util.rs +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/parameter.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt +2022/12/29 | 2 | support/texlab/src/parser/test_data/latex/generic_command_escape.txt +2022/12/29 | 29 | support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt +2022/12/29 | 29 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt +2022/12/29 | 2942 | support/texlab/src/features/workspace_command.rs +2022/12/29 | 2931 | support/texlab/src/db/diagnostics/log.rs +2022/12/29 | 2904 | support/texlab/src/features/rename/label.rs +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/graphics_path.txt +2022/12/29 | 28 | support/texlab/src/parser/test_data/latex/equation_missing_begin.txt +2022/12/29 | 2893 | support/texlab/src/tests/text_document/definition.rs +2022/12/29 | 2875 | support/texlab/src/lib.rs +2022/12/29 | 283 | support/texlab/src/features/completion/begin_snippet.rs +2022/12/29 | 282 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt +2022/12/29 | 27 | support/texlab/src/parser/test_data/latex/caption/caption_default.txt +2022/12/29 | 2757695 | biblio/ctan-bibdata/ctan.bib +2022/12/29 | 2734 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__label.snap +2022/12/29 | 2721 | support/texshop/texshop510.html +2022/12/29 | 271 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__did_change_configuration__invalid_configuration.snap +2022/12/29 | 271 | support/texlab/src/parser/test_data/latex/issue_745.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt +2022/12/29 | 26 | support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt +2022/12/29 | 2648 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_nested.snap +2022/12/29 | 2641 | support/texlab/src/features/symbol/bibtex.rs +2022/12/29 | 263833 | macros/luatex/latex/piton/piton-french.pdf +2022/12/29 | 26341 | support/texlab/texlab.pdf +2022/12/29 | 262 | support/texlab/src/features.rs +2022/12/29 | 25 | support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt +2022/12/29 | 25 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt +2022/12/29 | 25 | support/texlab/src/parser/test_data/bibtex/preamble.txt +2022/12/29 | 25988 | systems/texlive/tlnet/archive/proflycee.r65386.tar.xz +2022/12/29 | 2589 | macros/latex/contrib/zref-vario/zref-vario.ins +2022/12/29 | 2586 | support/texlab/texlab.tex +2022/12/29 | 25518533 | systems/texlive/tlnet/install-tl.zip +2022/12/29 | 25487 | support/texlab/src/features/completion/builder.rs +2022/12/29 | 252 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap +2022/12/29 | 2515 | support/texlab/src/parser/test_data/build_log/003.txt +2022/12/29 | 250 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap +2022/12/29 | 24 | support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt +2022/12/29 | 2490 | support/texlab/src/citation/field/date.rs +2022/12/29 | 2474 | support/texlab/src/distro/miktex.rs +2022/12/29 | 246 | support/texlab/src/tests/issues.rs +2022/12/29 | 2455 | support/texlab/src/parser/test_data/build_log/002.txt +2022/12/29 | 2443380 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2022/12/29 | 2416 | support/texlab/src/server/dispatch.rs +2022/12/29 | 23 | support/texlab/src/parser/test_data/latex/include/class_include_simple.txt +2022/12/29 | 23 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt +2022/12/29 | 23916 | support/texlab/CHANGELOG.md +2022/12/29 | 23640 | systems/texlive/tlnet/archive/zref-clever.r65387.tar.xz +2022/12/29 | 230 | support/texlab/src/db.rs +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt +2022/12/29 | 22 | support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt +2022/12/29 | 228 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap +2022/12/29 | 2234 | support/texlab/Cargo.toml +2022/12/29 | 2223 | support/texlab/src/tests/text_document/folding_range.rs +2022/12/29 | 22224 | support/texlab/src/citation/driver.rs +2022/12/29 | 220 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap +2022/12/29 | 2205 | support/texlab/src/features/rename/entry.rs +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/label/label_number.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/inline_double_dollar.txt +2022/12/29 | 21 | support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt +2022/12/29 | 216 | support/texlab/src/tests/text_document.rs +2022/12/29 | 21580 | systems/texlive/tlnet/archive/postnotes.source.r65385.tar.xz +2022/12/29 | 2115 | support/texlab/src/features/formatting/latexindent.rs +2022/12/29 | 210 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/package_include_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt +2022/12/29 | 20 | support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt +2022/12/29 | 209 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap +2022/12/29 | 2065 | support/texlab/src/features/folding.rs +2022/12/29 | 2050 | support/texlab/src/tests/text_document/inlay_hint.rs +2022/12/29 | 2049 | support/texlab/src/util/lang_data.rs +2022/12/29 | 20435977 | systems/texlive/tlnet/install-tl-windows.exe +2022/12/29 | 2008 | support/texlab/src/tests/text_document/rename.rs +2022/12/29 | 1 | support/texlab/src/parser/test_data/latex/parameter_error.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/issue_789.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/inline.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt +2022/12/29 | 19 | support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt +2022/12/29 | 1955 | support/texlab/src/distro.rs +2022/12/29 | 1917 | support/texlab/src/features/definition.rs +2022/12/29 | 187 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_join_strings.snap +2022/12/29 | 1865 | support/texlab/src/main.rs +2022/12/29 | 1844 | support/texlab/src/features/rename.rs +2022/12/29 | 183 | support/texlab/CONTRIBUTING.md +2022/12/29 | 1836 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_nested.snap +2022/12/29 | 1816 | support/texlab/src/distro/file_name_db.rs +2022/12/29 | 1806 | support/texlab/src/features/reference/entry.rs +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/include/import_simple.txt +2022/12/29 | 17 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt +2022/12/29 | 17987 | support/texlab/src/parser/latex/lexer.rs +2022/12/29 | 17931621 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2022/12/29 | 1760 | support/texlab/src/citation/output.rs +2022/12/29 | 1752 | support/texlab/src/features/completion/argument.rs +2022/12/29 | 1744 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap +2022/12/29 | 173 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_command.snap +2022/12/29 | 173 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap +2022/12/29 | 171 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_preamble.snap +2022/12/29 | 1710 | support/texlab/src/features/completion/citation.rs +2022/12/29 | 1709 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__inlay_hint__label_definition.snap +2022/12/29 | 1702 | support/texlab/src/features/completion.rs +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/include/class_include_empty.txt +2022/12/29 | 16 | support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt +2022/12/29 | 16999 | support/texlab/src/syntax/latex/cst.rs +2022/12/29 | 168 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap +2022/12/29 | 168030 | macros/luatex/generic/blopentype.zip +2022/12/29 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2022/12/29 | 1668 | support/texlab/src/features/build/progress.rs +2022/12/29 | 1658 | support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap +2022/12/29 | 163 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_trailing_comma.snap +2022/12/29 | 1634 | support/texlab/src/tests/text_document/document_highlight.rs +2022/12/29 | 1631 | support/texlab/src/citation/field/author.rs +2022/12/29 | 162 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_insert_braces.snap +2022/12/29 | 1629 | macros/latex/contrib/zref-vario/CHANGELOG.md +2022/12/29 | 1620 | systems/texlive/tlnet/archive/luacomplex.r65388.tar.xz +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt +2022/12/29 | 15 | support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt +2022/12/29 | 1593 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_flat.snap +2022/12/29 | 1572853 | macros/latex/contrib/bookcover/bookcover.pdf +2022/12/29 | 1567 | support/texlab/src/features/completion/import.rs +2022/12/29 | 1554160 | systems/texlive/tlnet/archive/zref-clever.doc.r65387.tar.xz +2022/12/29 | 1542 | support/texlab/src/tests/text_document/document_link.rs +2022/12/29 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2022/12/29 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2022/12/29 | 1519 | support/texlab/src/db/parse.rs +2022/12/29 | 1509640 | systems/texlive/tlnet/archive/proflycee.doc.r65386.tar.xz +2022/12/29 | 14 | support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt +2022/12/29 | 14 | support/texlab/src/parser/test_data/latex/generic_command_args.txt +2022/12/29 | 149 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_string.snap +2022/12/29 | 1478 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_nested.snap +2022/12/29 | 147517 | macros/luatex/latex/luagcd/luagcd.pdf +2022/12/29 | 147516 | macros/latex/contrib/zref-vario/zref-vario.pdf +2022/12/29 | 1462 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap +2022/12/29 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2022/12/29 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2022/12/29 | 1430 | macros/luatex/latex/piton/piton.ins +2022/12/29 | 1428 | support/texlab/src/citation/snapshots/texlab__citation__tests__mvbook_nietzsche_1988.snap +2022/12/29 | 1423 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_open_brace.snap +2022/12/29 | 1418 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_closed_brace.snap +2022/12/29 | 1411 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_averroes_1998.snap +2022/12/29 | 1411 | macros/latex/contrib/zref-vario/zref-vario-code.tex +2022/12/29 | 1405 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_closed_brace.snap +2022/12/29 | 1404 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_open_brace.snap +2022/12/29 | 14009 | support/texlab/src/tests/text_document/completion.rs +2022/12/29 | 14005 | support/texlab/src/features/symbol/latex.rs +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/include/package_include_empty.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/equation.txt +2022/12/29 | 13 | support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt +2022/12/29 | 1397 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_nested.snap +2022/12/29 | 138 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_parens.snap +2022/12/29 | 1387 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_nested.snap +2022/12/29 | 1385 | support/texlab/src/citation/field/number.rs +2022/12/29 | 1377 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap +2022/12/29 | 13754 | macros/latex/contrib/zref-vario/zref-vario.tex +2022/12/29 | 1367 | support/texlab/src/features/reference/string.rs +2022/12/29 | 136537 | macros/luatex/latex/luagcd.zip +2022/12/29 | 1356 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap +2022/12/29 | 13353 | support/texlab/src/parser/test_data/build_log/005.txt +2022/12/29 | 1330 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_blom_2021.snap +2022/12/29 | 1326 | support/texlab/src/features/definition/command.rs +2022/12/29 | 1322 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_closed.snap +2022/12/29 | 1321 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_open.snap +2022/12/29 | 1314 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_kastenholz_2006.snap +2022/12/29 | 1312 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_flat.snap +2022/12/29 | 12 | support/texlab/src/tests/workspace.rs +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/hello_world.txt +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt +2022/12/29 | 12 | support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt +2022/12/29 | 1299 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap +2022/12/29 | 1296 | support/texlab/src/features/rename/command.rs +2022/12/29 | 1290 | support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_section.snap +2022/12/29 | 1281 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_field_name.snap +2022/12/29 | 1280 | support/texlab/src/util/line_index_ext.rs +2022/12/29 | 1270 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap +2022/12/29 | 125 | support/texlab/src/parser.rs +2022/12/29 | 1258 | support/texlab/src/features/definition/label.rs +2022/12/29 | 1257 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_bibtex.snap +2022/12/29 | 1256 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_closed.snap +2022/12/29 | 1255 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_open.snap +2022/12/29 | 1240 | macros/luatex/latex/luagcd/README.txt +2022/12/29 | 1239 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple_package.snap +2022/12/29 | 1236 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__begin_environment_without_snippet_support.snap +2022/12/29 | 1236 | support/texlab/src/features/completion/color_model.rs +2022/12/29 | 1223 | support/texlab/src/citation/snapshots/texlab__citation__tests__book_knuth_1984.snap +2022/12/29 | 1221 | support/texlab/src/features/completion/glossary_ref.rs +2022/12/29 | 1215 | support/texlab/src/features/definition/entry.rs +2022/12/29 | 1212 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_open_brace.snap +2022/12/29 | 1207 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_at_empty.snap +2022/12/29 | 1202 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_empty.snap +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt +2022/12/29 | 11 | support/texlab/src/parser/test_data/latex/include/import_incomplete.txt +2022/12/29 | 1197 | support/texlab/src/features/hover.rs +2022/12/29 | 119792 | macros/luatex/latex/piton/piton.dtx +2022/12/29 | 1192 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap +2022/12/29 | 11874 | support/texlab/src/citation/tests.rs +2022/12/29 | 1186 | support/texlab/src/features/inlay_hint.rs +2022/12/29 | 1176 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_combi_2004.snap +2022/12/29 | 1175 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple_end.snap +2022/12/29 | 1173 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple.snap +2022/12/29 | 1158 | support/texlab/src/features/hover/string_ref.rs +2022/12/29 | 1153 | support/texlab/src/features/reference.rs +2022/12/29 | 114736 | systems/texlive/tlnet/archive/luacomplex.doc.r65388.tar.xz +2022/12/29 | 11459 | support/texlab/src/parser/bibtex.rs +2022/12/29 | 1143 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap +2022/12/29 | 113692 | systems/texlive/tlnet/archive/texlive-scripts.r65379.tar.xz +2022/12/29 | 1122 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap +2022/12/29 | 1120 | systems/texlive/tlnet/archive/ibrackets.r65383.tar.xz +2022/12/29 | 1113 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_closed_brace.snap +2022/12/29 | 1112 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_open_brace.snap +2022/12/29 | 1112 | support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt +2022/12/29 | 1103 | support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap +2022/12/29 | 11001 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap +2022/12/29 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_star.txt +2022/12/29 | 10 | support/texlab/src/parser/test_data/latex/citation/citation_simple.txt +2022/12/29 | 1082 | support/texlab/src/features/highlight/label.rs +2022/12/29 | 1064 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_aksin_2006.snap +2022/12/29 | 1062 | support/texlab/src/citation/snapshots/texlab__citation__tests__article_jain_1999.snap +2022/12/29 | 1061 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap +2022/12/29 | 1058 | support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap +2022/12/29 | 1051 | support/texlab/src/citation/snapshots/texlab__citation__tests__inproceedings_erwin_2007.snap +2022/12/29 | 1044 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_word.snap +2022/12/29 | 1038 | support/texlab/src/features/link.rs +2022/12/29 | 10366 | support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap +2022/12/29 | 1035 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_simple.snap +2022/12/29 | 1034 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_open_brace.snap +2022/12/29 | 1027 | support/texlab/src/features/reference/label.rs +2022/12/29 | 1019 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_simple.snap +2022/12/29 | 1018 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_open_brace.snap +2022/12/29 | 1017 | support/texlab/src/features/formatting.rs +2022/12/29 | 1015 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_simple.snap +2022/12/29 | 1014 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_open_brace.snap +2022/12/29 | 1011 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_flat.snap +2022/12/29 | 1008 | support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt +2022/12/29 | 1005 | support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_flat.snap +2022/12/29 | 1003 | support/texlab/src/tests/text_document/did_change_configuration.rs 2022/12/28 | 997074 | macros/latex/contrib/postnotes.zip 2022/12/28 | 976492 | systems/texlive/tlnet/archive/tex4ht.r65377.tar.xz 2022/12/28 | 97487 | macros/latex/contrib/postnotes/postnotes.dtx -2022/12/28 | 948 | systems/texlive/tlnet/archive/collection-luatex.r65376.tar.xz +2022/12/28 | 9729 | info/guide-latex-fr/Chapitres/p1-compilation.tex +2022/12/28 | 9579 | macros/luatex/generic/blopentype/luatex/blot-fonts.ltm 2022/12/28 | 945 | systems/win32/miktex/tm/packages/pr.ini 2022/12/28 | 940 | systems/texlive/tlnet/archive/resmes.r65375.tar.xz 2022/12/28 | 93698 | macros/latex/contrib/ibrackets/ibrackets.pdf 2022/12/28 | 9074 | systems/win32/miktex/tm/packages/jeuxcartes__source.tar.lzma +2022/12/28 | 8927 | info/guide-latex-fr/Chapitres/configuration.tex 2022/12/28 | 889564 | systems/win32/miktex/tm/packages/babel__doc.tar.lzma 2022/12/28 | 88405 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma 2022/12/28 | 8825 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma 2022/12/28 | 881 | macros/latex/contrib/postnotes/README.md 2022/12/28 | 8652 | macros/latex/contrib/tagpdf/ex-AF-file.pdf 2022/12/28 | 84858 | macros/latex/contrib/ibrackets.zip +2022/12/28 | 8359 | info/guide-latex-fr/Chapitres/p3-images.tex +2022/12/28 | 8281 | macros/luatex/generic/blopentype/blottest.tex 2022/12/28 | 8281 | macros/latex/contrib/tagpdf/global-ex.png 2022/12/28 | 827057 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma 2022/12/28 | 824 | macros/latex/contrib/zref-clever/README.md @@ -20,8 +601,10 @@ 2022/12/28 | 81371 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma 2022/12/28 | 805059 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf 2022/12/28 | 801 | macros/latex/contrib/tagpdf/ex-tagpdf-template.tex +2022/12/28 | 799 | macros/luatex/generic/blopentype/luatex/blot-files.ltm 2022/12/28 | 79719 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma 2022/12/28 | 79408 | systems/texlive/tlnet/archive/maze.doc.r65374.tar.xz +2022/12/28 | 7915 | info/guide-latex-fr/Chapitres/p2-erreurs.tex 2022/12/28 | 78972 | systems/win32/miktex/tm/packages/maze__doc.tar.lzma 2022/12/28 | 7854 | macros/latex/contrib/tagpdf/ex-formula-problem-luatex.pdf 2022/12/28 | 777 | macros/latex/contrib/tagpdf/ex-spaceglyph-listings.tex @@ -36,6 +619,7 @@ 2022/12/28 | 74336 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma 2022/12/28 | 73971 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma 2022/12/28 | 73363 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma +2022/12/28 | 7325 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2022/12/28 | 72732 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma 2022/12/28 | 724164 | systems/win32/miktex/tm/packages/babel__source.tar.lzma 2022/12/28 | 71184 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma @@ -48,30 +632,36 @@ 2022/12/28 | 68811 | systems/win32/miktex/tm/packages/yquant__source.tar.lzma 2022/12/28 | 6842 | macros/latex/contrib/tagpdf/ex-softhyphen.pdf 2022/12/28 | 68244 | systems/win32/miktex/tm/packages/resmes__doc.tar.lzma +2022/12/28 | 6811 | macros/luatex/generic/blopentype/luatex/blot.tex 2022/12/28 | 6808 | systems/texlive/tlnet/archive/collection-latexextra.r65375.tar.xz 2022/12/28 | 67908 | systems/texlive/tlnet/archive/resmes.doc.r65375.tar.xz 2022/12/28 | 6626 | macros/latex/contrib/tagpdf/ex-attribute-luatex.pdf 2022/12/28 | 65890 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma +2022/12/28 | 644 | macros/luatex/generic/blopentype/luatex/blot-lua.ltm 2022/12/28 | 64362 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma 2022/12/28 | 637359 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma +2022/12/28 | 62 | macros/luatex/generic/blopentype/DEPENDS.txt 2022/12/28 | 62796 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma 2022/12/28 | 61880 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma +2022/12/28 | 6150 | info/guide-latex-fr/Chapitres/p1-installation.tex 2022/12/28 | 6060882 | macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.pdf 2022/12/28 | 600135 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma +2022/12/28 | 59719 | info/guide-latex-fr/Chapitres/p3-TikZ.tex 2022/12/28 | 5890 | macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty 2022/12/28 | 58473 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma -2022/12/28 | 5834570 | systems/texlive/tlnet/install-tl-unx.tar.gz 2022/12/28 | 5797 | macros/latex/contrib/tagpdf/ex-patch-sectioning-memoir.tex 2022/12/28 | 57913 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma -2022/12/28 | 5791284 | systems/texlive/tlnet/archive/jeuxcartes.doc.r65373.tar.xz 2022/12/28 | 5789662 | systems/win32/miktex/tm/packages/jeuxcartes__doc.tar.lzma 2022/12/28 | 57404 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma 2022/12/28 | 572 | systems/texlive/tlnet/archive/collection-games.r65374.tar.xz 2022/12/28 | 57178 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma 2022/12/28 | 571640 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma +2022/12/28 | 5691 | info/guide-latex-fr/README.md 2022/12/28 | 56895 | systems/win32/miktex/tm/packages/yquant.tar.lzma 2022/12/28 | 56531 | macros/latex/contrib/tagpdf/tagpdf-struct.dtx +2022/12/28 | 56103 | info/guide-latex-fr/Chapitres/p3-texte.tex 2022/12/28 | 55793 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma +2022/12/28 | 536 | info/guide-latex-fr/Chapitres/code-base.tex 2022/12/28 | 529953 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma 2022/12/28 | 52728 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma 2022/12/28 | 52669 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma @@ -79,31 +669,25 @@ 2022/12/28 | 5109 | macros/latex/contrib/tagpdf/tagpdf-space.dtx 2022/12/28 | 49894 | systems/win32/miktex/tm/packages/markdown.tar.lzma 2022/12/28 | 49013 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma -2022/12/28 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2022/12/28 | 48148 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma 2022/12/28 | 4743 | macros/latex/contrib/zref-clever/CHANGELOG.md 2022/12/28 | 472902 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma 2022/12/28 | 4618 | macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf +2022/12/28 | 4618615 | info/guide-latex-fr/guide-latex-fr.pdf 2022/12/28 | 45781 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma 2022/12/28 | 4570089 | systems/win32/miktex/tm/packages/jeuxcartes.tar.lzma -2022/12/28 | 4563944 | systems/texlive/tlnet/archive/jeuxcartes.r65373.tar.xz -2022/12/28 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2022/12/28 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc -2022/12/28 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2022/12/28 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2022/12/28 | 44428 | macros/latex/contrib/tagpdf/tagpdf-roles.dtx 2022/12/28 | 440870 | systems/win32/miktex/tm/packages/fei__doc.tar.lzma 2022/12/28 | 44067 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma 2022/12/28 | 43883 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma 2022/12/28 | 43709 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma 2022/12/28 | 4284 | macros/latex/contrib/tagpdf/ex-patch-sectioning-koma.tex +2022/12/28 | 4282 | info/guide-latex-fr/Images/compilation_diagramme.tex 2022/12/28 | 42420 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma -2022/12/28 | 423964 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65371.tar.xz 2022/12/28 | 41720 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma 2022/12/28 | 4153 | macros/latex/contrib/tagpdf/ex-alt-actualtext.tex 2022/12/28 | 40916 | macros/latex/contrib/tagpdf/tagpdf-backend.dtx 2022/12/28 | 405129 | systems/win32/miktex/tm/packages/pythonimmediate__doc.tar.lzma -2022/12/28 | 4033129 | biblio/ctan-bibdata.zip 2022/12/28 | 3987 | systems/win32/miktex/tm/packages/saveenv__source.tar.lzma 2022/12/28 | 398781 | systems/win32/miktex/tm/packages/saveenv__doc.tar.lzma 2022/12/28 | 39682 | macros/latex/contrib/postnotes/postnotes.tex @@ -114,16 +698,20 @@ 2022/12/28 | 37409 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma 2022/12/28 | 37093 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma 2022/12/28 | 36450 | systems/win32/miktex/tm/packages/fei__source.tar.lzma -2022/12/28 | 3638951 | biblio/ctan-bibdata/ctan.pdf 2022/12/28 | 3590 | systems/win32/miktex/tm/packages/luamaths__source.tar.lzma +2022/12/28 | 3583 | info/guide-latex-fr/Chapitres/p3-maths.tex 2022/12/28 | 353339 | macros/latex/contrib/zref-clever/zref-clever.dtx 2022/12/28 | 35314 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma 2022/12/28 | 352675 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma +2022/12/28 | 3520 | info/guide-latex-fr/Chapitres/packages.tex 2022/12/28 | 35207 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma 2022/12/28 | 34964 | macros/latex/contrib/tagpdf/tagpdf-data.dtx 2022/12/28 | 34216 | macros/latex/contrib/jeuxcartes/doc/JeuxCartes-doc.tex +2022/12/28 | 34211 | macros/luatex/generic/blopentype/luatex/blot-fonts.lts +2022/12/28 | 3417 | info/guide-latex-fr/Chapitres/p3-intro.tex 2022/12/28 | 33893 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma 2022/12/28 | 3366 | systems/win32/miktex/tm/packages/mismath.tar.lzma +2022/12/28 | 3292 | macros/luatex/generic/blopentype/blopentype.md 2022/12/28 | 327765 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma 2022/12/28 | 326631 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma 2022/12/28 | 32287 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma @@ -145,19 +733,20 @@ 2022/12/28 | 28798 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma 2022/12/28 | 287050 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma 2022/12/28 | 2831901 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma +2022/12/28 | 28288 | info/guide-latex-fr/Chapitres/p2-images.tex 2022/12/28 | 27717 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma -2022/12/28 | 2756722 | biblio/ctan-bibdata/ctan.bib +2022/12/28 | 274 | macros/luatex/generic/blopentype/luatex/blot-sets.lua 2022/12/28 | 27279 | macros/latex/contrib/tagpdf/tagpdf-user.dtx 2022/12/28 | 271446 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma 2022/12/28 | 26787 | macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx 2022/12/28 | 2637 | macros/latex/contrib/tagpdf/ex-patch-list.tex 2022/12/28 | 2574 | macros/latex/contrib/postnotes/postnotes.ins -2022/12/28 | 25518531 | systems/texlive/tlnet/install-tl.zip 2022/12/28 | 2528 | macros/latex/contrib/tagpdf/ex-patch-list-obsolete.tex 2022/12/28 | 25232 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma 2022/12/28 | 247389 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma +2022/12/28 | 24719 | info/guide-latex-fr/Chapitres/p3-tableaux.tex 2022/12/28 | 245752 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma -2022/12/28 | 2439484 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2022/12/28 | 2429 | info/guide-latex-fr/Chapitres/page-garde.tex 2022/12/28 | 2425 | systems/win32/miktex/tm/packages/saveenv.tar.lzma 2022/12/28 | 24060 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma 2022/12/28 | 24026 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma @@ -172,12 +761,13 @@ 2022/12/28 | 225824 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex 2022/12/28 | 2224 | macros/latex/contrib/postnotes/CHANGELOG.md 2022/12/28 | 2181694 | macros/latex/contrib/tagpdf.zip +2022/12/28 | 21643 | info/guide-latex-fr/Chapitres/p3-PSTricks.tex 2022/12/28 | 2150 | macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.tex 2022/12/28 | 214155 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma +2022/12/28 | 2139 | macros/luatex/generic/blopentype/luatex/blot-base.lts 2022/12/28 | 21067 | macros/latex/contrib/tagpdf/ex-patch-sectioning-memoir.pdf 2022/12/28 | 208969 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma 2022/12/28 | 20673 | macros/latex/contrib/tagpdf/tagpdf.dtx -2022/12/28 | 20433864 | systems/texlive/tlnet/install-tl-windows.exe 2022/12/28 | 203554 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma 2022/12/28 | 20342 | systems/win32/miktex/tm/packages/pythonimmediate.tar.lzma 2022/12/28 | 2022 | macros/latex/contrib/tagpdf/link-figure-input.tex @@ -185,6 +775,8 @@ 2022/12/28 | 1995705 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma 2022/12/28 | 196640 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma 2022/12/28 | 19363 | macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf +2022/12/28 | 19358 | info/guide-latex-fr/Chapitres/annexes.tex +2022/12/28 | 1884 | macros/luatex/generic/blopentype/README.md 2022/12/28 | 1866947 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma 2022/12/28 | 1866616 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma 2022/12/28 | 18497 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma @@ -193,9 +785,9 @@ 2022/12/28 | 181624 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma 2022/12/28 | 18000 | systems/win32/miktex/tm/packages/luakeys__source.tar.lzma 2022/12/28 | 1797885 | systems/win32/miktex/tm/packages/tagpdf__doc.tar.lzma -2022/12/28 | 17930067 | systems/texlive/tlnet/tlpkg/texlive.tlpdb 2022/12/28 | 17742 | macros/latex/contrib/tagpdf/ex-alt-actualtext-luatex.pdf 2022/12/28 | 177361 | macros/latex/contrib/postnotes/postnotes.pdf +2022/12/28 | 1761 | info/guide-latex-fr/guide-latex-fr.tex 2022/12/28 | 175612 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma 2022/12/28 | 1746 | systems/win32/miktex/tm/packages/luaset.tar.lzma 2022/12/28 | 173438 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma @@ -204,7 +796,6 @@ 2022/12/28 | 1720378 | macros/latex/contrib/proflycee.zip 2022/12/28 | 17144 | systems/win32/miktex/tm/packages/mismath__source.tar.lzma 2022/12/28 | 16888 | macros/latex/contrib/tagpdf/ex-patch-list-luatex.pdf -2022/12/28 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/12/28 | 1663459 | install/macros/latex/contrib/zref-clever.tds.zip 2022/12/28 | 1635661 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma 2022/12/28 | 1635095 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma @@ -212,22 +803,19 @@ 2022/12/28 | 1568 | systems/win32/miktex/tm/packages/maze__source.tar.lzma 2022/12/28 | 155941 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma 2022/12/28 | 1544 | systems/texlive/tlnet/archive/luaset.r65376.tar.xz -2022/12/28 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 2022/12/28 | 1539 | macros/latex/contrib/zref-clever/zref-clever-code.tex 2022/12/28 | 1537 | macros/latex/contrib/tagpdf/ex-structure-obsolete.tex 2022/12/28 | 1532339 | macros/latex/contrib/tagpdf/tagpdf-code.pdf -2022/12/28 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 2022/12/28 | 1525 | systems/win32/miktex/tm/packages/maze.tar.lzma 2022/12/28 | 15241 | macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx 2022/12/28 | 1514983 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma 2022/12/28 | 14 | macros/latex/contrib/postnotes/DEPENDS.txt 2022/12/28 | 146045 | systems/win32/miktex/tm/packages/luamaths__doc.tar.lzma -2022/12/28 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 2022/12/28 | 14587 | macros/latex/contrib/tagpdf/tagpdf-tree.dtx 2022/12/28 | 1457468 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma -2022/12/28 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 2022/12/28 | 14482 | macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx 2022/12/28 | 14450 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma +2022/12/28 | 144031 | macros/luatex/generic/blopentype/blottest.pdf 2022/12/28 | 1434 | macros/latex/contrib/postnotes/postnotes-code.tex 2022/12/28 | 141163 | macros/latex/contrib/tagpdf/pac3.PNG 2022/12/28 | 140597 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma @@ -248,20 +836,23 @@ 2022/12/28 | 1242121 | systems/win32/miktex/tm/packages/pst-flags.tar.lzma 2022/12/28 | 1237 | macros/latex/contrib/tagpdf/ex-AF-file.tex 2022/12/28 | 1234322 | systems/win32/miktex/tm/packages/pst-flags__doc.tar.lzma +2022/12/28 | 12314 | info/guide-latex-fr/Chapitres/p3-structuration.tex 2022/12/28 | 121189 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma 2022/12/28 | 1209160 | systems/texlive/tlnet/archive/tikz-mirror-lens.doc.r65372.tar.xz 2022/12/28 | 1202253 | systems/win32/miktex/tm/packages/tikz-mirror-lens__doc.tar.lzma 2022/12/28 | 1183 | macros/luatex/latex/luacomplex/README.txt 2022/12/28 | 118234 | macros/luatex/latex/luacomplex.zip 2022/12/28 | 1177 | macros/latex/contrib/tagpdf/README.md +2022/12/28 | 11722 | info/guide-latex-fr/Chapitres/p2-regles.tex 2022/12/28 | 1165840 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma 2022/12/28 | 115809 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma 2022/12/28 | 1150 | systems/win32/miktex/tm/packages/next/pr.ini 2022/12/28 | 115012 | systems/texlive/tlnet/archive/luaset.doc.r65376.tar.xz +2022/12/28 | 11405 | info/guide-latex-fr/Chapitres/p3-moteurs.tex 2022/12/28 | 1138 | systems/win32/miktex/tm/packages/resmes.tar.lzma -2022/12/28 | 113700 | systems/texlive/tlnet/archive/texlive-scripts.r65371.tar.xz 2022/12/28 | 113377 | systems/win32/miktex/tm/packages/luaset__doc.tar.lzma 2022/12/28 | 113068 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma +2022/12/28 | 10990 | info/guide-latex-fr/Chapitres/p1-historique.tex 2022/12/28 | 109770 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma 2022/12/28 | 1094532 | systems/win32/miktex/tm/packages/markdown__doc.tar.lzma 2022/12/28 | 109302 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma @@ -282,12 +873,10 @@ 2022/12/27 | 8145 | macros/luatex/latex/luaset/luaset.tex 2022/12/27 | 79915 | macros/latex/contrib/maze.zip 2022/12/27 | 79265 | macros/latex/contrib/maze/maze.pdf -2022/12/27 | 753 | support/texshop/README.txt 2022/12/27 | 728 | systems/texlive/tlnet/archive/pst-flags.r65367.tar.xz 2022/12/27 | 723552 | systems/texlive/tlnet/archive/babel.source.r65366.tar.xz 2022/12/27 | 69170 | macros/latex/contrib/resmes/resmes.pdf 2022/12/27 | 68736 | macros/latex/contrib/resmes.zip -2022/12/27 | 67436714 | support/texshop/texshop509.zip 2022/12/27 | 65 | systems/mac/mactex/mactex-MacTeXtras-20221227.zip.md5 2022/12/27 | 527499884 | systems/mac/mactex/mactex-MacTeXtras-20221227.zip 2022/12/27 | 49 | systems/mac/mactex/MacTeXtras.zip.md5 @@ -297,7 +886,6 @@ 2022/12/27 | 2988 | macros/latex/contrib/maze/maze.sty 2022/12/27 | 2776 | systems/texlive/tlnet/archive/frenchmath.r65363.tar.xz 2022/12/27 | 276 | systems/texlive/tlnet/archive/texlive-en.r65369.tar.xz -2022/12/27 | 2552 | support/texshop/texshop509.html 2022/12/27 | 2471996 | systems/texlive/tlnet/archive/pst-flags.doc.r65367.tar.xz 2022/12/27 | 24155 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens-PT.tex 2022/12/27 | 23621 | graphics/pgf/contrib/tikz-mirror-lens/doc/tikz-mirror-lens.tex @@ -335,7 +923,6 @@ 2022/12/26 | 7869 | macros/latex/required/babel/base/babel.ins 2022/12/26 | 754485 | macros/latex/required/babel/base/babel.dtx 2022/12/26 | 7541 | macros/latex/contrib/jeuxcartes/tex/CaJ-TaroTv1-10T.png -2022/12/26 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2022/12/26 | 7266008 | support/pkgcheck/bin/pkgcheck 2022/12/26 | 6826 | macros/latex/contrib/jeuxcartes/tex/CaJ-TaroTv1-10P.png 2022/12/26 | 6707 | macros/latex/contrib/jeuxcartes/tex/CaJ-TaroTv1-8T.png @@ -859,10 +1446,8 @@ 2022/12/23 | 795 | macros/luatex/generic/luakeys/luakeys-debug.sty 2022/12/23 | 773 | macros/latex/contrib/pythonimmediate/README 2022/12/23 | 7658 | systems/win32/miktex/tm/packages/graphicscache__source.tar.lzma -2022/12/23 | 75 | macros/generic/markdown/examples/scientists.csv 2022/12/23 | 735 | macros/latex/contrib/saveenv/README 2022/12/23 | 7340 | macros/latex/contrib/pythonimmediate/pythonimmediate.sty -2022/12/23 | 730937 | macros/generic/markdown/markdown.dtx 2022/12/23 | 7152 | systems/texlive/tlnet/archive/unimath-plain-xetex.r65334.tar.xz 2022/12/23 | 701 | macros/luatex/generic/luakeys/luakeys.tex 2022/12/23 | 6939 | systems/win32/miktex/tm/packages/unimath-plain-xetex.tar.lzma @@ -880,7 +1465,6 @@ 2022/12/23 | 4738 | macros/latex/contrib/saveenv/saveenv.sty 2022/12/23 | 4530 | macros/generic/markdown/markdown.css 2022/12/23 | 43924 | macros/xetex/plain/unimath-plain-xetex/tex/unimath-plain-alphabet.tex -2022/12/23 | 4377 | macros/generic/markdown/docstrip.cfg 2022/12/23 | 429551 | macros/latex/contrib/pythonimmediate.zip 2022/12/23 | 420991 | macros/luatex/generic/luakeys.zip 2022/12/23 | 402484 | macros/latex/contrib/pythonimmediate/pythonimmediate.pdf @@ -889,51 +1473,21 @@ 2022/12/23 | 395762 | macros/latex/contrib/saveenv/saveenv.pdf 2022/12/23 | 3792 | systems/win32/miktex/tm/packages/graphicscache.tar.lzma 2022/12/23 | 37840 | macros/luatex/generic/luakeys/luakeys.lua -2022/12/23 | 3608 | macros/generic/markdown/examples/example.md 2022/12/23 | 35 | macros/latex/contrib/pythonimmediate/DEPENDS.txt 2022/12/23 | 31 | macros/generic/markdown/VERSION -2022/12/23 | 28939 | macros/generic/markdown/CHANGES.md 2022/12/23 | 28415 | systems/win32/miktex/tm/packages/lyluatex__source.tar.lzma 2022/12/23 | 2317 | systems/win32/miktex/tm/packages/tsvtemplate__source.tar.lzma 2022/12/23 | 22371 | macros/generic/markdown/libraries/markdown-tinyyaml.lua 2022/12/23 | 215831 | systems/win32/miktex/tm/packages/pdfmsym__doc.tar.lzma 2022/12/23 | 21103 | macros/xetex/plain/unimath-plain-xetex/tex/unimath-plain-xetex.tex -2022/12/23 | 17894 | macros/generic/markdown/README.md 2022/12/23 | 177171 | systems/win32/miktex/tm/packages/graphicscache__doc.tar.lzma -2022/12/23 | 1765 | macros/generic/markdown/examples/latex.tex 2022/12/23 | 17505 | macros/latex/contrib/pythonimmediate/pythonimmediate.tex -2022/12/23 | 1743 | macros/generic/markdown/examples/context-mkiv.tex 2022/12/23 | 1649 | macros/latex/contrib/pythonimmediate/pythonimmediate_script_pytotex.py 2022/12/23 | 1569 | systems/win32/miktex/tm/packages/tsvtemplate.tar.lzma -2022/12/23 | 1552 | macros/generic/markdown/examples/context-mkii.tex 2022/12/23 | 14857 | systems/win32/miktex/tm/packages/lyluatex.tar.lzma 2022/12/23 | 14576 | systems/texlive/tlnet/archive/lyluatex.r65332.tar.xz -2022/12/23 | 140951 | macros/generic/markdown/markdown.png 2022/12/23 | 1343442 | install/macros/generic/markdown.tds.zip -2022/12/23 | 1333 | macros/generic/markdown/markdown.ins 2022/12/23 | 1312 | systems/texlive/tlnet/archive/tsvtemplate.r65333.tar.xz 2022/12/23 | 1273531 | macros/generic/markdown.zip 2022/12/23 | 12037 | macros/xetex/plain/unimath-plain-xetex/doc/unimath-plain-xetex-doc.tex 2022/12/23 | 1179 | macros/luatex/generic/luakeys/luakeys-debug.tex -2022/12/22 | 97472 | systems/texlive/tlnet/archive/texinfo.r65323.tar.xz -2022/12/22 | 69512 | fonts/cm/tfm.zip -2022/12/22 | 65314 | macros/xetex/plain/unimath-plain-xetex.zip -2022/12/22 | 5660 | systems/texlive/tlnet/archive/pdfmsym.r65324.tar.xz -2022/12/22 | 344 | systems/texlive/tlnet/archive/xput.x86_64-linuxmusl.r65325.tar.xz -2022/12/22 | 344 | systems/texlive/tlnet/archive/xput.x86_64-darwinlegacy.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.x86_64-solaris.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.x86_64-linux.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.x86_64-cygwin.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.universal-darwin.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.i386-linux.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.i386-freebsd.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.amd64-netbsd.r65325.tar.xz -2022/12/22 | 340 | systems/texlive/tlnet/archive/xput.amd64-freebsd.r65325.tar.xz -2022/12/22 | 336 | systems/texlive/tlnet/archive/xput.i386-solaris.r65325.tar.xz -2022/12/22 | 336 | systems/texlive/tlnet/archive/xput.i386-netbsd.r65325.tar.xz -2022/12/22 | 336 | systems/texlive/tlnet/archive/xput.i386-cygwin.r65325.tar.xz -2022/12/22 | 336 | systems/texlive/tlnet/archive/xput.armhf-linux.r65325.tar.xz -2022/12/22 | 336 | systems/texlive/tlnet/archive/xput.aarch64-linux.r65325.tar.xz -2022/12/22 | 23244 | systems/texlive/tlnet/archive/xput.r65325.tar.xz -2022/12/22 | 222104 | systems/texlive/tlnet/archive/pdfmsym.doc.r65324.tar.xz -2022/12/22 | 12697552 | systems/texlive/tlnet/archive/xput.doc.r65325.tar.xz diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib index dc09f71bdd..2f9f22556c 100644 --- a/biblio/ctan-bibdata/ctan.bib +++ b/biblio/ctan-bibdata/ctan.bib @@ -1,7 +1,7 @@ %% bib file of all CTAN packages %% (C) Herbert Voß %% -%% created at 29-12-2022, 02:01:48 +%% created at 30-12-2022, 02:01:31 %% %% This file is provided under the terms of the LPPL v1.3 or @@ -8866,6 +8866,17 @@ url = {https://ctan.org/pkg/blockdraw_mp}, } +@manual{ctan-blopentype, + title = {The \texttt{BLOpenType} package}, + subtitle = {A basic LuaTeX OpenType handler}, + author = {Luis Rivera}, + date = {2022-12-29}, + version = {0.0}, + license = {lppl1.3c,mit}, + mirror = {https://mirror.ctan.org/macros/luatex/generic/blopentype}, + url = {https://ctan.org/pkg/blopentype}, +} + @manual{ctan-bloques, title = {The \texttt{bloques} package}, subtitle = {Generate control diagrams}, @@ -9193,8 +9204,8 @@ title = {The \texttt{bookcover} package}, subtitle = {A class for book covers and dust jackets}, author = {Tibor Tómács}, - date = {2022-08-08}, - version = {3.4}, + date = {2022-12-29}, + version = {3.5}, license = {lppl1.2}, mirror = {https://mirror.ctan.org/macros/latex/contrib/bookcover}, url = {https://ctan.org/pkg/bookcover}, @@ -30028,8 +30039,8 @@ title = {The \texttt{guide-latex-fr} package}, subtitle = {A french guide on \LaTeX{} – for beginners or advanced users}, author = {Adrien Bouzigues}, - date = {2021-10-03}, - version = {3.7}, + date = {2022-12-29}, + version = {3.8}, license = {cc-by-nc-nd-4}, mirror = {https://mirror.ctan.org/info/guide-latex-fr}, url = {https://ctan.org/pkg/guide-latex-fr}, @@ -40785,7 +40796,7 @@ title = {The \texttt{luacomplex} package}, subtitle = {Operations on complex numbers inside \LaTeX{} documents using Lua}, author = {{Chetan Shirore and Dr. Ajit Kumar}}, - date = {2022-12-28}, + date = {2022-12-29}, version = {1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/luatex/latex/luacomplex}, @@ -40810,6 +40821,17 @@ url = {https://ctan.org/pkg/luafindfont}, } +@manual{ctan-luagcd, + title = {The \texttt{luagcd} package}, + subtitle = {Computation of gcd of integers inside \LaTeX{} using Lua}, + author = {{Chetan Shirore and Dr. Ajit Kumar}}, + date = {2022-12-29}, + version = {1.0}, + license = {lppl1.3c}, + mirror = {https://mirror.ctan.org/macros/luatex/latex/luagcd}, + url = {https://ctan.org/pkg/luagcd}, +} + @manual{ctan-luahyphenrules, title = {The \texttt{luahyphenrules} package}, subtitle = {Loading patterns in Lua\LaTeX{} with language.dat}, @@ -40991,7 +41013,7 @@ title = {The \texttt{luamaths} package}, subtitle = {Provide standard mathematical operations inside \LaTeX{} documents using Lua}, author = {{Chetan Shirore and Dr. Ajit Kumar}}, - date = {2022-12-27}, + date = {2022-12-29}, version = {1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/luatex/latex/luamaths}, @@ -41137,7 +41159,7 @@ title = {The \texttt{luaset} package}, subtitle = {Set Operations inside \LaTeX{} documents using Lua}, author = {{Chetan Shirore and Dr. Ajit Kumar}}, - date = {2022-12-28}, + date = {2022-12-29}, version = {1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/luatex/latex/luaset}, @@ -43107,7 +43129,7 @@ title = {The \texttt{maze} package}, subtitle = {Generate random mazes}, author = {Sicheng Du}, - date = {2022-12-28}, + date = {2022-12-29}, version = {1.1}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/maze}, @@ -52338,8 +52360,8 @@ title = {The \texttt{piton} package}, subtitle = {Typeset Python listings with LPEG}, author = {François Pantigny}, - date = {2022-11-29}, - version = {0.99}, + date = {2022-12-29}, + version = {1.0}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/macros/luatex/latex/piton}, url = {https://ctan.org/pkg/piton}, @@ -56521,7 +56543,7 @@ title = {The \texttt{pythonimmediate} package}, subtitle = {Library to run Python code}, author = {{user202729}}, - date = {2022-12-24}, + date = {2022-12-29}, version = {0.0.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/pythonimmediate}, @@ -57895,7 +57917,7 @@ title = {The \texttt{resmes} package}, subtitle = {Measure restriction symbol in \LaTeX{}}, author = {Paolo De Donato}, - date = {2022-12-28}, + date = {2022-12-29}, version = {1.0}, license = {mit}, mirror = {https://mirror.ctan.org/macros/latex/contrib/resmes}, @@ -66792,8 +66814,8 @@ title = {The \texttt{TeXLab} package}, subtitle = {\LaTeX{} Language Server}, author = {Eric Förster}, - date = {2022-07-03}, - version = {4.2.0}, + date = {2022-12-29}, + version = {5.0.0}, license = {gpl3}, mirror = {https://mirror.ctan.org/support/texlab}, url = {https://ctan.org/pkg/texlab}, @@ -67288,8 +67310,8 @@ title = {The \texttt{texshop} package}, subtitle = {TeX front end for use on MacOS X}, author = {Dick Koch}, - date = {2022-12-27}, - version = {5.09}, + date = {2022-12-29}, + version = {5.10}, license = {gpl}, mirror = {https://mirror.ctan.org/support/texshop}, url = {https://ctan.org/pkg/texshop}, @@ -68491,7 +68513,7 @@ title = {The \texttt{tikz-mirror-lens} package}, subtitle = {Spherical mirrors and lenses in TikZ}, author = {Fernando H. G. Zucatelli}, - date = {2022-12-27}, + date = {2022-12-29}, version = {1.0.1}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/graphics/pgf/contrib/tikz-mirror-lens}, @@ -77273,8 +77295,8 @@ title = {The \texttt{zref-vario} package}, subtitle = {Extended \LaTeX{} page cross-references with varioref and zref-clever}, author = {Gustavo Barros}, - date = {2022-07-08}, - version = {0.1.5}, + date = {2022-12-29}, + version = {0.1.6}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/zref-vario}, url = {https://ctan.org/pkg/zref-vario}, diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf Binary files differindex 68c3f70af3..aa927edb88 100644 --- a/biblio/ctan-bibdata/ctan.pdf +++ b/biblio/ctan-bibdata/ctan.pdf diff --git a/info/guide-latex-fr/Chapitres/annexes.tex b/info/guide-latex-fr/Chapitres/annexes.tex index 0d5d9232eb..f914d4d769 100644 --- a/info/guide-latex-fr/Chapitres/annexes.tex +++ b/info/guide-latex-fr/Chapitres/annexes.tex @@ -4,6 +4,8 @@ \renewcommand{\thetable}{A.\arabic{table}} \setcounter{table}{0} +\pagestyle{plain} % Retour à un style normal + % Page 1 -- Rappel de mise en forme @@ -336,7 +338,7 @@ Autres solutions de positionnement : cf. la bibliothèque \verb?positioning?. \verb?folding? & Créer des patrons ou des objets à plier \\ \verb?force? & Dessiner avec des ``efforts'' (\verb?node? tirés ou comprimés) \\ \verb?fpu? (\textit{floating point unit}) & Permettre le calcul scientifique avec des nombres réels \\ -\verb?graphdrawing? (Lua\LaTeX{}) & Automatiser le dessin de graphes \\ +\verb?graphdrawing? (\LuaLaTeX{}) & Automatiser le dessin de graphes \\ \verb?graphs? et \verb?graphs.standard? & Dessiner des graphes avec la commande \verb?graph? \\ \verb?intersections? & Calculer la (les) intersection(s) de 2 chemins \\ \verb?layered? & Tracer des graphes avec des couches horizontales \\ diff --git a/info/guide-latex-fr/Chapitres/code-base.tex b/info/guide-latex-fr/Chapitres/code-base.tex index aac7623de4..6782f178bf 100644 --- a/info/guide-latex-fr/Chapitres/code-base.tex +++ b/info/guide-latex-fr/Chapitres/code-base.tex @@ -3,7 +3,7 @@ Par la suite, pour alléger les exemples, le préambule ne sera plus renseigné \begin{code}{Le code minimal} \documentclass[a4paper, 12pt]{report} -% PDFLaTeX +% pdfLaTeX \usepackage{lmodern} \usepackage[french]{babel} \usepackage[utf8]{inputenc} diff --git a/info/guide-latex-fr/Chapitres/commandes.tex b/info/guide-latex-fr/Chapitres/configuration.tex index ec62918fe5..9e92cf826c 100644 --- a/info/guide-latex-fr/Chapitres/commandes.tex +++ b/info/guide-latex-fr/Chapitres/configuration.tex @@ -1,4 +1,42 @@ -% Commandes créées +% Réglages package "epigraph" +\setlength{\epigraphwidth}{0.8\textwidth} % Valeur par défaut : 0.4\textwidth +\renewcommand{\textflush}{flushepinormal} + + +%%% RACCOURCIS %%% +\newcommand{\version}{3.8} + +% Générique +\newcommand{\Windows}{\texttt{Windows}} +\newcommand{\Linux}{\texttt{Linux}} +\newcommand{\Apple}{\texttt{Apple}} +\newcommand{\LinkedIn}{\texttt{LinkedIn}} +\newcommand{\Paint}{\texttt{Paint}} +\newcommand{\GIMP}{\texttt{GIMP}} +\newcommand{\Inkscape}{\texttt{Inkscape}} + +% LaTeX (hologo) +\newcommand{\BibTeX}{\hologo{BibTeX}} +\newcommand{\LuaLaTeX}{\hologo{LuaLaTeX}} +\newcommand{\METAFONT}{\hologo{METAFONT}} +\newcommand{\MiKTeX}{\hologo{MiKTeX}} +\newcommand{\pdfLaTeX}{\hologo{pdfLaTeX}} +\newcommand{\pdfTeX}{\hologo{pdfTeX}} +\newcommand{\XeLaTeX}{\hologo{XeLaTeX}} + +% LaTeX (custom) +\newcommand{\KaTeX}{Ka\TeX{}} +\newcommand{\Texmaker}{\texttt{Texmaker}} +\newcommand{\TikZ}{Ti\textit{k}Z} +\newcommand{\Beamer}{\texttt{Beamer}} + +% Icônes +\newcommand{\folder}{\textcolor[RGB]{255,231,157}{\faFolder}} + +%%% FIN RACCOURCIS %%% + + +%%% COULEURS %%% % Page de garde et mind map \definecolor{BlueFR}{RGB}{0,35,149} @@ -15,22 +53,10 @@ % Signature \definecolor{lightningcyan}{RGB}{59,195,235} +%%% FIN COULEURS %%% -% Raccourcis -\newcommand{\Windows}{\texttt{Windows}} -\newcommand{\Linux}{\texttt{Linux}} -\newcommand{\Apple}{\texttt{Apple}} -\newcommand{\LinkedIn}{\texttt{LinkedIn}} -\newcommand{\MiKTeX}{\texttt{MiKTeX}} -\newcommand{\Texmaker}{\texttt{Texmaker}} -\newcommand{\TikZ}{Ti\textit{k}Z} -\newcommand{\Beamer}{\texttt{Beamer}} -\newcommand{\Paint}{\texttt{Paint}} -\newcommand{\GIMP}{\texttt{GIMP}} -\newcommand{\Inkscape}{\texttt{Inkscape}} - -\newcommand{\folder}{\textcolor[RGB]{255,231,157}{\faFolder}} +%%% TABLEAUX %%% % Tableau bilan \newenvironment{tableaubilan}[4]{ @@ -44,6 +70,10 @@ \endlastfoot }{\end{longtable}} +%%% FIN TABLEAUX %%% + + +%%% BOÎTES %%% % "Boîtes" -- Package tcolorbox % Boîtes types @@ -109,20 +139,39 @@ codemainoptions/.style = { } } +%%% FIN BOÎTES %%% + + +%%% MISE EN FORME CODE LATEX %%% + \lstdefinestyle{mainlststyle}{ -language = {[LaTeX]TeX}, -style = tcblatex, -texcsstyle = *\color{cyan!65!black}, -commentstyle = \color{gray}, -tabsize = 4, -keepspaces = true, -breaklines = true, -breakatwhitespace = false, -inputencoding = utf8, -numbers = none, -showspaces = false, -showtabs = false, -showstringspaces = false + language = {[LaTeX]TeX}, + % Styles + style = tcblatex, + texcsstyle = *\color{cyan!65!black}, + commentstyle = \color{gray}, + inputencoding = utf8, + % Options + tabsize = 4, % Taille indentation + columns = flexible, % Eviter espaces superflus lors copier-coller + keepspaces = true, + breaklines = true, % Retour à la ligne si code trop long + breakatwhitespace = false, + showspaces = false, + showtabs = false, + showstringspaces = false, + upquote = true, % Apostrophes droites + xleftmargin = 20pt, % Espace avec la marge + numbers = left, + numbersep = 5pt, % Espace entre les numéros de ligne et le code + numberstyle = \ttfamily\footnotesize\color{OrangeRed}\noncopynumber +} + +% Hack pour ne pas sélectionner les numéros de ligne (code) +\newcommand{\noncopynumber}[1]{ + \BeginAccSupp{method = escape, ActualText = {}} + #1 + \EndAccSupp{} } % N.B. : #2 = titre de la boite @@ -136,4 +185,6 @@ showstringspaces = false % Boîte spéciale code TikZ % 1ère idée : nouvelle boîte brute avec listing and comment (comment = {\resizebox{\linewidth}{!}{\tcbuselistingtext}} -- \tcbuse... = contenu de la boîte soit code TikZ) % 2nde idée : se contenter d'un "listing and text" avec structure boîte "codedisplay" -\newtcblisting{codetikz}[2][]{codemainoptions = {#2}, listing options = {style = mainlststyle}, listing and text, bicolor, colbacklower = white, #1}
\ No newline at end of file +\newtcblisting{codetikz}[2][]{codemainoptions = {#2}, listing options = {style = mainlststyle}, listing and text, bicolor, colbacklower = white, #1} + +%%% FIN MISE EN FORME CODE LATEX %%%
\ No newline at end of file diff --git a/info/guide-latex-fr/Chapitres/p1-compilation.tex b/info/guide-latex-fr/Chapitres/p1-compilation.tex index 4ea43fef9a..63da525cc9 100644 --- a/info/guide-latex-fr/Chapitres/p1-compilation.tex +++ b/info/guide-latex-fr/Chapitres/p1-compilation.tex @@ -20,11 +20,11 @@ Pour entrer un peu plus dans les détails, tu dois donc : \begin{enumerate} \item profiter du résultat fourni (format PDF) ou l'évaluer pour ensuite apporter des modifications au document, et ainsi de suite. \\ \end{enumerate} -Quant au moteur \LaTeX{} utilisé, il en existe plusieurs. Pour débuter, je recommande d'utiliser plutôt pdf\TeX{} (intitulé apparemment PDF\LaTeX{} sous \Texmaker{}), qui permet de passer d'un coup du document \LaTeX{} au fichier PDF final. +Quant au moteur \LaTeX{} utilisé, il en existe plusieurs. Pour débuter, je recommande d'utiliser plutôt \pdfTeX{} (intitulé apparemment \pdfLaTeX{} sous \Texmaker{}), qui permet de passer d'un coup du document \LaTeX{} au fichier PDF final. Quant aux autres moteurs, je les aborde bien plus loin dans ce guide, en page \pageref{compilation-details}. Je recommande plutôt de t'y rendre une fois que tu as un peu d'expérience sous \LaTeX{}, pour ne pas perdre du temps et acquérir des bases solides. \\ -Nous savons désormais que nous devons compiler avec le moteur pdf\TeX{}\dots{} mais nous ne savons toujours pas comment faire ! Pas de panique : les logiciels que je t'ai fait installer prennent tout en charge. +Nous savons désormais que nous devons compiler avec le moteur \pdfTeX{}\dots{} mais nous ne savons toujours pas comment faire ! Pas de panique : les logiciels que je t'ai fait installer prennent tout en charge. \section{Démarrer avec \Texmaker{}} @@ -106,7 +106,7 @@ Sache cependant que c'est possible mais ne présente aucun intérêt comme \Texm Revenons sur les 2 derniers points plus dans le détail, pour que tu comprennes bien les actions à effectuer. \\ Pour une compilation via \Texmaker{} avec des clics souris, il faut procéder en 3 temps (cf. \figurename{} \ref{compilation_clics} si besoin) : \begin{enumerate} -\item Choisir le moteur de compilation, PDF\LaTeX{} dans notre cas, en haut dans la barre d'outils. +\item Choisir le moteur de compilation, \pdfLaTeX{} dans notre cas, en haut dans la barre d'outils. \item Lancer la compilation en cliquant sur la flèche à gauche du choix du moteur de compilation. Attendre que la compilation soit terminée. @@ -121,7 +121,7 @@ Pour une compilation via \Texmaker{} avec des clics souris, il faut procéder en \end{figure} Pour une compilation via \Texmaker{} avec des raccourcis clavier, il faut procéder en 2 temps (cf. \figurename{} \ref{compilation_clavier} si besoin) : \begin{enumerate} -\item Lancer la compilation avec le moteur PDF\LaTeX{} avec la touche \keys{F6}. +\item Lancer la compilation avec le moteur \pdfLaTeX{} avec la touche \keys{F6}. \item Afficher le résultat avec la touche \keys{F7}. \end{enumerate} diff --git a/info/guide-latex-fr/Chapitres/p1-historique.tex b/info/guide-latex-fr/Chapitres/p1-historique.tex index 9121cb9bad..15123a02bc 100644 --- a/info/guide-latex-fr/Chapitres/p1-historique.tex +++ b/info/guide-latex-fr/Chapitres/p1-historique.tex @@ -14,7 +14,7 @@ Le premier volume paru en 1965, a été publié à l'ancienne avec des caractèr Donald \textsc{Knuth} trouve alors la qualité d'impression de ces machines, médiocre (notamment pour l'écriture des formules mathématiques) et décide de créer deux logiciels pour pouvoir produire ses publications avec une qualité typographique professionnelle. \\ -Le premier, \TeX{}, sert à la composition de documents ; le second, METAFONT, à produire des polices vectorielles. Donald \textsc{Knuth} va mettre plusieurs années avant de sortir en 1983 la version définitive de \TeX{} qui utilise la police Computer Modern qu'il a créé à l'aide de METAFONT. +Le premier, \TeX{}, sert à la composition de documents ; le second, \METAFONT{}, à produire des polices vectorielles. Donald \textsc{Knuth} va mettre plusieurs années avant de sortir en 1983 la version définitive de \TeX{} qui utilise la police Computer Modern qu'il a créé à l'aide de \METAFONT{}. En effet, Donald \textsc{Knuth} s'était fixé comme but d'arriver à un produit qui devrait être parfait et qui devrait le rester au cours du temps. C'est cette version qui est toujours utilisée et qui fonctionne depuis 30 ans. @@ -30,9 +30,9 @@ C'est un succès et pratiquement plus personne n'utilise \TeX{}. L'apparition de La version actuelle de \LaTeX{} est \LaTeX{}$2\varepsilon$, qui date de 1994. Elle est maintenue par le \LaTeX{}3 Project team qui nous prépare la version 3 de \LaTeX{} depuis 20 ans ! \\ -\`A la fin des années 90, Hà n Thê Thà nh crée le moteur pdf\TeX{} qui permet de sortir les documents au format PDF, plus convivial que le format d'origine de \TeX{} le DVI. +\`A la fin des années 90, \hologo{HanTheThanh} crée le moteur \pdfTeX{} qui permet de sortir les documents au format PDF, plus convivial que le format d'origine de \TeX{} le DVI. -La dernière version la 1.40.11 date de 2011. pdf\TeX{} n'est plus développé, seules des corrections de bug y sont apportées. +La dernière version la 1.40.11 date de 2011. \pdfTeX{} n'est plus développé, seules des corrections de bug y sont apportées. \textbf{C'est ce moteur que nous allons utiliser par la suite,} qui permet de passer directement du fichier \LaTeX{} au fichier PDF final désiré. diff --git a/info/guide-latex-fr/Chapitres/p1-installation.tex b/info/guide-latex-fr/Chapitres/p1-installation.tex index 8113893fdb..2b07a6f64b 100644 --- a/info/guide-latex-fr/Chapitres/p1-installation.tex +++ b/info/guide-latex-fr/Chapitres/p1-installation.tex @@ -39,7 +39,7 @@ Pour débuter, elles conviennent parfaitement et le choix \og \texttt{only for m \end{enumerate} \begin{attention}{\textit{Nota Bene}} -Je tiens à préciser que je n'ai aucun revenu financier grâce à \texttt{MiKTeX}. Je conseille cette distribution car c'est celle que j'utilise et qui fonctionne parfaitement pour ma part. +Je tiens à préciser que je n'ai aucun revenu financier grâce à \MiKTeX{}. Je conseille cette distribution car c'est celle que j'utilise et qui fonctionne parfaitement pour ma part. Elle a aussi l'avantage de proposer un gestionnaire de packages, via \texttt{MiKTeX Console} ou l'interface de \MiKTeX{}. Nous aurons l'occasion d'y revenir plus tard dans ce guide, une fois que la notion de packages aura été introduite. \\ diff --git a/info/guide-latex-fr/Chapitres/p2-erreurs.tex b/info/guide-latex-fr/Chapitres/p2-erreurs.tex index 7b963ea382..8e283fa532 100644 --- a/info/guide-latex-fr/Chapitres/p2-erreurs.tex +++ b/info/guide-latex-fr/Chapitres/p2-erreurs.tex @@ -31,7 +31,7 @@ Voyons maintenant la liste des erreurs couramment rencontrées quand tu débutes \item appel d'une commande inexistante ou appel d'une nouvelle commande bien définie mais faute de frappe lors de son écriture. \end{itemize} \par $\Rightarrow$ Vérifier le code et le corriger. \\ \\ -\verb?Package inputenc Error:? \par \verb?Unicode char?, suivi éventuellement d'un caractère et de son code UTF-8 & Utilisation d'un caractère du clavier interdit avec ce moteur de compilation. \par L'exemple le plus courant : symbole \degres{} (commande \verb?\degres{}? sous PDF\LaTeX{} ; appel ``normal'' au clavier sous Xe\LaTeX{}).\footnote{Les moteurs de compilation sont abordés dans la partie suivante si tu es intéressé.} \par ~ \par Erreur fréquente si texte copier-collé d'un autre document (Word, PDF, page Internet) \par $\Rightarrow$ Dans un 1\up{er} temps, reprendre tous les accents et les apostrophes.\footnote{Dans ce cas, la fonction \verb?Remplacer? de \Texmaker{} peut se révéler très utile.} \\ \\ +\verb?Package inputenc Error:? \par \verb?Unicode char?, suivi éventuellement d'un caractère et de son code UTF-8 & Utilisation d'un caractère du clavier interdit avec ce moteur de compilation. \par L'exemple le plus courant : symbole \degres{} (commande \verb?\degres{}? sous \pdfLaTeX{} ; appel ``normal'' au clavier sous \XeLaTeX{}).\footnote{Les moteurs de compilation sont abordés dans la partie suivante si tu es intéressé.} \par ~ \par Erreur fréquente si texte copier-collé d'un autre document (Word, PDF, page Internet) \par $\Rightarrow$ Dans un 1\up{er} temps, reprendre tous les accents et les apostrophes.\footnote{Dans ce cas, la fonction \verb?Remplacer? de \Texmaker{} peut se révéler très utile.} \\ \\ \verb?Option clash for package? \par \verb?<nom_package>? & Conflit entre certains packages. \par $\Rightarrow$ Charger les packages dans un ordre bien précis. (exemple : package \verb?xcolor? avanr \verb?wallpaper?). \\ \\ diff --git a/info/guide-latex-fr/Chapitres/p2-images.tex b/info/guide-latex-fr/Chapitres/p2-images.tex index 123ef36b85..7c1343872a 100644 --- a/info/guide-latex-fr/Chapitres/p2-images.tex +++ b/info/guide-latex-fr/Chapitres/p2-images.tex @@ -39,7 +39,7 @@ Dans un fichier PDF, tu trouves en réalité des images vectorielles partout. En Et heureusement ! Quel enfer serait sinon la lecture si tout le texte était flou voire illisible faute d'avoir suffisamment de pixels. \end{definition} -Le format \verb?.eps? fait un peu vieux jeu et reste surtout utilisé dans le domaine scientifique. Cependant, même s'il difficile à modifier avec des outils standards (comme \Paint{}), il est plus facile à implanter sous \LaTeX{} que le format \verb?.svg?, pour un résultat identique. +Le format \verb?.eps? fait un peu vieux jeu et reste surtout utilisé dans le domaine scientifique. Cependant, même s'il est difficile à modifier avec des outils standards (comme \Paint{}), il est plus facile à implanter sous \LaTeX{} que le format \verb?.svg?, pour un résultat identique. \begin{attention}{Conversion au format \texttt{.eps}} Une image au format \verb?.eps? n'est pas automatiquement vectorielle. Supposons que tu ouvres sous \GIMP{} une image matricielle et que tu l'enregistres au format \verb?.eps?. Le rendu final reste une image matricielle. diff --git a/info/guide-latex-fr/Chapitres/p2-regles.tex b/info/guide-latex-fr/Chapitres/p2-regles.tex index 18493be0a1..4d4309af1b 100644 --- a/info/guide-latex-fr/Chapitres/p2-regles.tex +++ b/info/guide-latex-fr/Chapitres/p2-regles.tex @@ -53,7 +53,7 @@ Ces 3 règles prendront leur sens sous peu, quand nous allons mettre en forme no \label{documentclass}Pour commencer, démarrons un fichier \LaTeX{} : ouvrons \Texmaker{}, créons un nouveau fichier et enregistrons-le au format \verb?.tex?\footnote{Pour information/rappel, un fichier \LaTeX{} possède toujours l'extension \verb?.tex?}. \\ \begin{attention}{Codes \LaTeX{} fournis} -\textbf{Tout au long de ce guide, des exemples de code \LaTeX{} sont fournis dans des encadrés verts clairs. Ils ont été testés par mes soins avec le moteur PDF\LaTeX{} : tout devrait donc fonctionner aussi de ton côté.} +\textbf{Tout au long de ce guide, des exemples de code \LaTeX{} sont fournis dans des encadrés verts clairs. Ils ont été testés par mes soins avec le moteur \pdfLaTeX{} : tout devrait donc fonctionner aussi de ton côté.} Toutefois, la copie du code depuis ce guide au format PDF semble encore présenter quelques lacunes : saut de ligne lors d'une coupure (ligne de code trop longue), apostrophe différente de celle présente sous \Texmaker{}\dots{}. Des erreurs lors de la génération du document PDF peuvent alors survenir. \\ diff --git a/info/guide-latex-fr/Chapitres/p3-PSTricks.tex b/info/guide-latex-fr/Chapitres/p3-PSTricks.tex index 1d4f14251f..b8d02be40b 100644 --- a/info/guide-latex-fr/Chapitres/p3-PSTricks.tex +++ b/info/guide-latex-fr/Chapitres/p3-PSTricks.tex @@ -4,7 +4,7 @@ \label{chap-pstricks}\lettrine{I}{l} n'y a rien de pire que d'apprendre une notion, de l'appréhender, d'expérimenter\dots{} pour se rendre compte qu'une autre est meilleure et qu'il faille tout recommencer depuis le début. -C'est ce qui m'est arrivé avec PSTricks. J'ai appris à dessiner avec ce package, qui requiert de compiler avec le moteur \LaTeX{} ou Xe\LaTeX{}. Puis, j'ai découvert \TikZ{}, qui fonctionne avec n'importe quel moteur de compilation. \\ +C'est ce qui m'est arrivé avec PSTricks. J'ai appris à dessiner avec ce package, qui requiert de compiler avec le moteur \LaTeX{} ou \XeLaTeX{}. Puis, j'ai découvert \TikZ{}, qui fonctionne avec n'importe quel moteur de compilation. \\ Je ne vais pas supprimer mon travail initial. Tu peux le consulter. La dernière mise à jour de ce chapitre date du 26 février 2019. Dans tous les cas, \textbf{je te recommande de passer directement au chapitre suivant} sur \TikZ{}. @@ -126,7 +126,7 @@ Honnêtement, si tu es arrivé jusqu'à cette partie du guide, tu devrais pouvoi \end{code} \begin{conseil}{Conseil personnel} -La génération sous Xe\LaTeX{} peut se révéler assez longue, surtout si tu cumules de nombreux circuits. +La génération sous \XeLaTeX{} peut se révéler assez longue, surtout si tu cumules de nombreux circuits. Après des essais, le temps d'attente est négligeable avec une compilation sous \LaTeX{}, suivie des conversions d'usage \verb?Dvi -> PS? puis \verb?PS -> PDF?. diff --git a/info/guide-latex-fr/Chapitres/p3-TikZ.tex b/info/guide-latex-fr/Chapitres/p3-TikZ.tex index ade50fdcd0..2ab87bbb62 100644 --- a/info/guide-latex-fr/Chapitres/p3-TikZ.tex +++ b/info/guide-latex-fr/Chapitres/p3-TikZ.tex @@ -1,5 +1,7 @@ \chapter{Dessiner avec \TikZ{}} +\epigraph{La simplicité est la sophistication suprême.}{Léonard \textsc{de Vinci}} + \label{chap-tikz}\lettrine{P}{our} faire des dessins, graphes, schémas, etc. avec \LaTeX{} sans avoir aucune contrainte quant au moteur de compilation, c'est d'utiliser \TikZ{}. Si, comme moi, tu étais un habitué de PSTricks, il peut sembler déroutant de passer à \TikZ{} mais, avec la pratique, il devient facile de réaliser simplement quelques figures. Mais ce n'est pas tout : \TikZ{} est un bon compromis à PSTricks. @@ -1026,7 +1028,7 @@ Et c'est tout ! Maintenant, tu es libre de faire ce que tu veux, d'automatiser t \begin{coderesult}{\textit{Template} pour faire un diagramme} \documentclass[a4paper, 12pt]{report} -% PDFLaTeX +% pdfLaTeX \usepackage{lmodern} \usepackage[french]{babel} \usepackage[utf8]{inputenc} diff --git a/info/guide-latex-fr/Chapitres/p3-images.tex b/info/guide-latex-fr/Chapitres/p3-images.tex index c19ef67a2e..e18b06e410 100644 --- a/info/guide-latex-fr/Chapitres/p3-images.tex +++ b/info/guide-latex-fr/Chapitres/p3-images.tex @@ -1,5 +1,7 @@ \chapter{Images : de nouvelles subtilités} +\epigraph{<Mettre une citation ici>}{<Auteur>} + \label{chap-img-details}\lettrine{C}{omme} pour les mathématiques, l'insertion d'images sous \LaTeX{} est réalisée sans surprise et sans avoir à connaître des techniques très poussées. Cependant, au fur et à mesure de la rédaction de tes documents, tu constateras que tu souhaiteras améliorer certains détails. Voici donc quelques astuces supplémentaires toujours utiles ! @@ -184,6 +186,6 @@ Pour ce faire, aucun package supplémentaire n'est requis et il faut juste suivr Et voilà , c'est tout ce qu'il y a à faire. Après, c'est vraiment se prendre le chou pour pas grand chose. Autant rester sous \Inkscape{}, enregistrer l'image au format \verb?.eps? et l'intégrer comme n'importe quelle image. -Les pixels ne se verront toujours pas au zoom et la compilation se fait sans souci sous PDF\LaTeX{} (création d'un fichier intermédiaire supplémentaire mais génération bien plus rapide). \\ +Les pixels ne se verront toujours pas au zoom et la compilation se fait sans souci sous \pdfLaTeX{} (création d'un fichier intermédiaire supplémentaire mais génération bien plus rapide). \\ Bref, c'était surtout une volonté personnelle d'explorer de nouveaux domaines sous \LaTeX{} mais il faut aussi savoir utiliser des solutions simples parfois.
\ No newline at end of file diff --git a/info/guide-latex-fr/Chapitres/p3-intro.tex b/info/guide-latex-fr/Chapitres/p3-intro.tex index 028815c3c0..eb150c7fe7 100644 --- a/info/guide-latex-fr/Chapitres/p3-intro.tex +++ b/info/guide-latex-fr/Chapitres/p3-intro.tex @@ -3,13 +3,15 @@ \phantomsection % Lien hyperref cohérent \addcontentsline{toc}{part}{Préambule -- Le retour} % Ajout table des matières -\lettrine{C}{onnaître} quelques notions sous \LaTeX{} peut suffire pour écrire des petits rapports, des fiches personnelles. Mais \LaTeX{} permet de réaliser tellement de contenus différents (lettre, rapport, mémoire, livre, article, guide, présentation\dots{}) qu'il serait dommage de ne pas en profiter. +\lettrine{C}{onnaître} quelques notions sous \LaTeX{} peut suffire pour écrire des petits rapports, des fiches personnelles. Mais \LaTeX{} permet de réaliser tellement de contenus différents (lettre, rapport, mémoire, livre, article, guide, présentation\dots{}) qu'il serait dommage de ne pas en profiter. \\ Cette nouvelle partie de mon guide se concentre désormais sur des solutions plus sophistiquées, ou parfois juste plus anecdotiques. Tu peux très bien ne jamais les utiliser et continuer à rédiger tes documents avec les éléments présentés jusqu'à présent. Mais, si comme moi tu es de nature curieuse, ce qui va suivre peut se révéler utile voire intéressant et t'aider à créer des documents de plus en plus personnalisés et adaptés à ton besoin. \\ -Dans cette partie, je continuerai de m'efforcer à expliquer les notions en jeu ou les astuces utilisées. Toutefois, si un point ne te semble pas clair, je te recommande vivement à aller fouiner un peu sur Internet pour comprendre ce que je fais\footnote{La solution peut aussi se trouver parmi les (nombreux) documents d'aide que j'ai récoltés, mis à disposition sur mon site : \url{https://glf.cl215.fr/}.}. +Dans cette partie, je continuerai de m'efforcer à expliquer les notions en jeu ou les astuces utilisées. + +Toutefois, si un point ne te semble pas clair, je te recommande vivement à aller fouiner un peu sur Internet pour comprendre ce que je fais\footnote{La solution peut aussi se trouver parmi les (nombreux) documents d'aide que j'ai récoltés, mis à disposition sur mon site : \url{https://glf.cl215.fr/}.}. Et comme je reste extrêmement attentionné, voici une petite liste d'endroits très pratiques pour aller chercher de l'information sur \LaTeX{} : @@ -18,7 +20,9 @@ Et comme je reste extrêmement attentionné, voici une petite liste d'endroits t \item \url{http://www.xm1math.net/texmaker/doc_fr.html} : l'aide officielle de \Texmaker{}, qui fournit aussi des indications sur \LaTeX{} ; -\item \url{http://www.grappa.univ-lille3.fr/FAQ-LaTeX/} : une FAQ simple mais bien fournie ; +% \item \url{http://www.grappa.univ-lille3.fr/FAQ-LaTeX/} : une FAQ simple mais bien fournie ; % Obsolète, lien non fonctionnel + +\item \url{https://faq.gutenberg.eu.org/} : une FAQ à jour et qui en rassemble ; \item \url{http://fr.wikibooks.org/wiki/LaTeX} : un Wiki sur \LaTeX{} en français. Sa version anglaise -- \url{http://en.wikibooks.org/wiki/LaTeX} -- contient des fois des informations plus précises et complètes ; @@ -29,6 +33,10 @@ Et comme je reste extrêmement attentionné, voici une petite liste d'endroits t \input{./Chapitres/code-base} +Un échange passionnant\footnote{Disponible sur : \url{https://tex.stackexchange.com/questions/44694/fontenc-vs-inputenc/44699\#44699}.}, qui permet de comprendre la différence entre les packages \verb?inputenc? et \verb?fontenc?, m'a légèrement fait réviser le préambule de mon propre code \LaTeX{} pour ce guide. + +Mais ce point très technique et spécifique ne change pas ma recommandation : le préambule ci-dessus fonctionnera parfaitement pour tous les exemples simples fournis (juste du code \LaTeX{}, sans préambule spécifié). \\ + Désormais j'ai fini de blablater. Ok pour toi ? Es-tu prêt ? Alors plongeons un peu plus profondément dans l'univers (fabuleux) de \LaTeX{} ! \\ \begin{flushright} diff --git a/info/guide-latex-fr/Chapitres/p3-maths.tex b/info/guide-latex-fr/Chapitres/p3-maths.tex index a1b4e307ce..16b166f307 100644 --- a/info/guide-latex-fr/Chapitres/p3-maths.tex +++ b/info/guide-latex-fr/Chapitres/p3-maths.tex @@ -1,5 +1,7 @@ \chapter{Mathématiques : remarques \& astuces} +\epigraph{Les mathématiques peuvent être définies comme une science dans laquelle on ne sait jamais de quoi on parle, ni si ce qu'on dit est vrai.}{Bertrand \textsc{Russell}} + \label{chap-maths-details}\lettrine{J}{e} rédige très peu de formules mathématiques dans mon quotidien. Ne sois donc pas surpris : si ce chapitre paraît étonnamment court, il contient des informations précieuses ! \section{Remarques générales} diff --git a/info/guide-latex-fr/Chapitres/p3-moteurs.tex b/info/guide-latex-fr/Chapitres/p3-moteurs.tex index 1039f14ebe..e114152b66 100644 --- a/info/guide-latex-fr/Chapitres/p3-moteurs.tex +++ b/info/guide-latex-fr/Chapitres/p3-moteurs.tex @@ -1,12 +1,14 @@ \chapter{Les moteurs de compilation sous \LaTeX{}} -\label{compilation-details}\lettrine{G}{râce} à \LaTeX{}, l'utilisateur peut rédiger ses documents tout en séparant le fond et la forme. Cette séparation requiert l'emploi d'un \og moteur de compilation \fg{} pour transformer le code en un fichier PDF. +\epigraph{L'aérodynamique, c'est pour les personnes qui ne savent pas construire de moteurs.}{Enzo \textsc{Ferrari}} + +\label{compilation-details}\lettrine{G}{râce} à \LaTeX{}, l'utilisateur peut rédiger ses documents tout en séparant le fond et la forme. Cette séparation requiert l'emploi d'un ``moteur de compilation'' pour transformer le code \LaTeX{} en un fichier PDF. \section{Présentation des différents moteurs} -Jusqu'à présent, j'ai toujours recommandé de compiler avec le moteur PDF\LaTeX{}. Toutefois, si tu es un peu curieux, tu as pu te rendre compte qu'il existe plein d'autres possibilités pour la compilation rapide avec \Texmaker{}. Certaines d'entre elles contiennent justement de nouveaux moteurs de compilation \LaTeX{}. \\ +Jusqu'à présent, j'ai toujours recommandé de compiler avec le moteur \pdfLaTeX{}. Toutefois, si tu es un peu curieux, tu as pu te rendre compte qu'il existe plein d'autres possibilités pour la compilation rapide avec \Texmaker{}. Certaines d'entre elles contiennent justement de nouveaux moteurs de compilation \LaTeX{}. \\ -Pour rappel, la rédaction d'un document sous \LaTeX{} passe par 3 grandes étapes : +Pour rappel, la rédaction d'un document sous \LaTeX{} passe par 3 grandes étapes, que nous pouvons résumer ainsi : la rédaction du contenu (en \LaTeX{}), la compilation (via un moteur \LaTeX{}) et l'obtention du document final, au format PDF de préférence. \begin{figure}[H] \centering @@ -14,7 +16,7 @@ Pour rappel, la rédaction d'un document sous \LaTeX{} passe par 3 grandes étap \caption{Les 3 étapes pour rédiger un document sous \LaTeX{}} \end{figure} -Le moteur de compilation \LaTeX{} utilisé (PDF\LaTeX{} jusqu'à présent) fonctionne un peu comme une boîte noire. Personnellement, je ne sais pas comment elles fonctionne. Je sais qu'un fichier \verb?.tex? est inséré en entrée, le moteur de compilation tourne et fournit en sortie le fichier \verb?.pdf? espéré. +Le moteur de compilation \LaTeX{} utilisé (\pdfLaTeX{} jusqu'à présent) fonctionne un peu comme une boîte noire. Personnellement, je ne sais pas comment elle fonctionne. Je sais qu'un fichier \verb?.tex? est inséré en entrée, le moteur de compilation tourne et fournit en sortie le fichier \verb?.pdf? espéré. \begin{figure}[H] \centering @@ -29,30 +31,30 @@ Le moteur de compilation \LaTeX{} utilisé (PDF\LaTeX{} jusqu'à présent) fonct Si nous devons lister les différents moteurs de compilation, nous pouvons en relever 3 principaux : \begin{itemize}[label = \ding{213}] -\item le moteur PDF\LaTeX{}, utilisé jusqu'à présent ; +\item le moteur \pdfLaTeX{}, utilisé jusqu'à présent ; \item le moteur \LaTeX{}\footnote{Moteur éponyme au langage utilisé, attention aux possibles confusions à venir.}, qui fournit un fichier \verb?.dvi? qu'il faut convertir par le choix \verb?Dvi -> PS? puis \verb?PS -> PDF? ; -\item le moteur \verb?XeLaTeX? ; +\item le moteur \XeLaTeX{} ; \end{itemize} \noindent{}accompagnés d'autres moteurs annexes avec leur utilité et leur fonction : \begin{itemize}[label = \ding{213}] -\item le moteur Bib\TeX{}, pour générer des bibliographies ; +\item le moteur \BibTeX{}, pour générer des bibliographies ; \item le moteur MakeIndex, pour générer des index. \end{itemize} -Il en existe d'autres comme Lua\LaTeX{}, voire des solutions plus exotiques avec Ka\TeX{} pour inclure des formules \LaTeX{} dans du HTML par exemple. +Il en existe d'autres comme \LuaLaTeX{}, voire des solutions plus exotiques avec \KaTeX{} pour inclure des formules \LaTeX{} dans du HTML par exemple. \begin{attention}{Une question ?} -\og Je ne comprends pas à quoi peuvent bien servir ces nouveaux modes de compilation. Après tout, PDF\LaTeX{} fonctionne très bien jusqu'à présent\dots{} \fg{} \\ +\og Je ne comprends pas à quoi peuvent bien servir ces nouveaux modes de compilation. Après tout, \pdfLaTeX{} fonctionne très bien jusqu'à présent\dots{} \fg{} \\ -En effet, tu as tout à fait raison. Et la conclusion de ce chapitre ira dans ce sens. Mais il existe aussi des classes (\verb?powerdot? par exemple) ou des packages (\verb?pstricks?) qui ne fonctionnent pas sous PDF\LaTeX{}. Il faut donc parfois recourir à un autre moteur de compilation. +En effet, tu as tout à fait raison. Et la conclusion de ce chapitre ira dans ce sens. Mais il existe aussi des classes (\verb?powerdot? par exemple) ou des packages (\verb?pstricks?) qui ne fonctionnent pas sous \pdfLaTeX{}. Il faut donc parfois recourir à un autre moteur de compilation. \begin{figure}[H] \centering \begin{tikzpicture}[every node/.style = {align = center}] -\node (rect) at (0,0) [draw, thick, text width = 2.5cm, minimum width = 3cm, minimum height = 1.5cm, orange] {\LaTeX{} \linebreak ou \linebreak Xe\LaTeX{}}; +\node (rect) at (0,0) [draw, thick, text width = 2.5cm, minimum width = 3cm, minimum height = 1.5cm, orange] {\LaTeX{} \linebreak ou \linebreak \XeLaTeX{}}; \draw[<-, > = Stealth] (rect.west) --++ (-1,0) node[left, text width = 1.5cm, red] {Fichier \verb?.tex?}; \draw[->, > = Stealth] (rect.east) --++ (1,0) node[right, text width = 1.5cm, Green] {Fichier \verb?.pdf?}; \draw[<-, > = Stealth] (rect.north) --++ (0,1) node[above, cyan] {Contraintes}; @@ -61,7 +63,7 @@ En effet, tu as tout à fait raison. Et la conclusion de ce chapitre ira dans ce \end{figure} \end{attention} -Bien, voyons un peu ces contraintes (classes, packages) qui nous obligent à utiliser un autre moteur de compilation que PDF\LaTeX{}. +Bien, voyons un peu ces contraintes (classes, packages) qui nous obligent à utiliser un autre moteur de compilation que \pdfLaTeX{}. \section{Utilisation des différents moteurs de compilation} @@ -70,19 +72,19 @@ Selon ce que tu désires comme document final, il te faut utiliser des classes e \`A l'heure actuelle, pour rédiger un document sous \LaTeX{}, j'ai recensé les cas d'utilisation suivants, avec le(s) moteur(s) associé(s) : \begin{tableaubilan}{0.45\linewidth}{0.45\linewidth}{Cas d'utilisation}{Moteur à utiliser} -Générer un PDF ``simple'' \par (rapport normal, avec des commandes ``basiques'' et des images) & PDF\LaTeX{} ou Xe\LaTeX{} $\Rightarrow$ images au format \verb?.png? ou \verb?.jpg? \par \LaTeX{} $\Rightarrow$ images au format \verb?.eps? (convertir les images si besoin) \\ \\ +Générer un PDF ``simple'' \par (rapport normal, avec des commandes ``basiques'' et des images) & \pdfLaTeX{} ou \XeLaTeX{} $\Rightarrow$ images au format \verb?.png? ou \verb?.jpg? \par \LaTeX{} $\Rightarrow$ images au format \verb?.eps? (convertir les images si besoin) \\ \\ -Changer la police d'écriture & Si package de police, PDF\LaTeX{} ou \LaTeX{} \par Sinon, Xe\LaTeX{} \& package \verb?fontspec? \par (cf. détails p. \pageref{chgt-police}) \\ \\ +Changer la police d'écriture & Si package de police, \pdfLaTeX{} ou \LaTeX{} \par Sinon, \XeLaTeX{} \& package \verb?fontspec? \par (cf. détails p. \pageref{chgt-police}) \\ \\ -Inclure et/ou fusionner des fichiers PDF dans le document (cf. p. \pageref{fusion-pdf}) & Package \verb?pdfpages? \par PDF\LaTeX{} ou Xe\LaTeX{} \\ \\ +Inclure et/ou fusionner des fichiers PDF dans le document (cf. p. \pageref{fusion-pdf}) & Package \verb?pdfpages? \par \pdfLaTeX{} ou \XeLaTeX{} \\ \\ -Générer une bibliographie (cf. p. \pageref{generer-bibliographie}) & PDF\LaTeX{} ou \LaTeX{} \par Bib\TeX{} pour la biliographie \\ \\ +Générer une bibliographie (cf. p. \pageref{generer-bibliographie}) & \pdfLaTeX{} ou \LaTeX{} \par \BibTeX{} pour la biliographie \\ \\ -Générer un index (cf. p. \pageref{generer-index}) & PDF\LaTeX{} ou XeLaTeX ou \LaTeX{} \par MakeIndex pour l'index \\ \\ +Générer un index (cf. p. \pageref{generer-index}) & \pdfLaTeX{} ou XeLaTeX ou \LaTeX{} \par MakeIndex pour l'index \\ \\ -Générer un PDF avec des dessins (schémas, circuits électriques, diagrammes, etc.) & Package \verb?pstricks? : \LaTeX{} (le plus rapide) ou Xe\LaTeX{} \par Package \verb?tikz? (cf. p. \pageref{chap-tikz}) : PDF\LaTeX{} (le plus rapide et simple) ou \LaTeX{} ou Xe\LaTeX{} \\ \\ +Générer un PDF avec des dessins (schémas, circuits électriques, diagrammes, etc.) & Package \verb?pstricks? : \LaTeX{} (le plus rapide) ou \XeLaTeX{} \par Package \verb?tikz? (cf. p. \pageref{chap-tikz}) : \pdfLaTeX{} (le plus rapide et simple) ou \LaTeX{} ou \XeLaTeX{} \\ \\ -Réaliser des présentations (\textit{slides}) & Classe \verb?beamer? (cf. p. \pageref{chap-beamer}) : PDF\LaTeX{} ou \LaTeX{} ou Xe\LaTeX{} \par Classe \verb?powerdot? : \LaTeX{} ou Xe\LaTeX{} +Réaliser des présentations (\textit{slides}) & Classe \verb?beamer? (cf. p. \pageref{chap-beamer}) : \pdfLaTeX{} ou \LaTeX{} ou \XeLaTeX{} \par Classe \verb?powerdot? : \LaTeX{} ou \XeLaTeX{} \end{tableaubilan} \begin{attention}{Une question ?} @@ -100,7 +102,7 @@ Pour tous les détails supplémentaires, je te renvoie à la page \pageref{chgt- \end{attention} \begin{conseil}{Insertion d'images au format \texttt{.eps}} -Le format \verb?.eps? n'est pas l'apanage du moteur \LaTeX{}. Tu peux très bien en insérer avec PDF\LaTeX{} (conversion automatique en PDF avant insertion) ou Xe\LaTeX{}. +Le format \verb?.eps? n'est pas l'apanage du moteur \LaTeX{}. Tu peux très bien en insérer avec \pdfLaTeX{} (conversion automatique en PDF avant insertion) ou \XeLaTeX{}. Il s'agit d'un format un peu obsolète, utile pour insérer facilement des images vectorielles (format \verb?.svg?), par exemple. \end{conseil} @@ -110,15 +112,15 @@ Il s'agit d'un format un peu obsolète, utile pour insérer facilement des image Toujours en vie ? Je veux bien croire cette partie un peu technique et indigeste. Elle demande un peu de pratique et il faut faire des essais, rencontrer des erreurs pour comprendre le fonctionnement et l'utilisation des moteurs de compilation. \begin{regles}{En résumé} -Actuellement, tout est possible et envisageable avec le moteur PDF\LaTeX{}. Techniquement, les moteurs les plus modernes sont Xe\LaTeX{} et Lua\LaTeX{}. Ils constituent un bon substitut à PDF\LaTeX{} le cas échéant. Mais le temps de compilation reste important, encore plus sur les gros documents (développement et améliorations en cours). \\ +Actuellement, tout est possible et envisageable avec le moteur \pdfLaTeX{}. Techniquement, les moteurs les plus modernes sont \XeLaTeX{} et \LuaLaTeX{}. Ils constituent un bon substitut à \pdfLaTeX{} le cas échéant. Mais le temps de compilation reste important, encore plus sur les gros documents (développement et améliorations en cours). \\ -\textbf{C'est bien pourquoi, depuis le début de ce guide, je recommande d'utiliser le moteur PDF\LaTeX{}.} C'est le moteur le plus simple et pratique à utiliser. Il convertit directement ton fichier \verb?.tex? en un PDF. +\textbf{C'est bien pourquoi, depuis le début de ce guide, je recommande d'utiliser le moteur \pdfLaTeX{}.} C'est le moteur le plus simple et pratique à utiliser. Il convertit directement ton fichier \verb?.tex? en un PDF. Tu peux normalement tout faire avec : rapports, présentations, schémas, bibliographie, index, glossaire, nomenclature, insérer des images et des PDF, etc. \\ -Enfin, sous \Texmaker{}, le raccourci de \og compilation rapide \fg{} est plus développé pour le moteur PDF\LaTeX{} : automatisation de la bibliographie avec l'ajout de Bib\TeX{}. +Enfin, sous \Texmaker{}, le raccourci de \og compilation rapide \fg{} est plus développé pour le moteur \pdfLaTeX{} : automatisation de la bibliographie avec l'ajout de \BibTeX{}. -Ce n'est par exemple pas le cas pour Xe\LaTeX{}. Il faut donc lancer les différents moteurs à la main à chaque fois, ce qui se révéler fastidieux et pénible sur le long terme ! +Ce n'est par exemple pas le cas pour \XeLaTeX{}. Il faut donc lancer les différents moteurs à la main à chaque fois, ce qui se révéler fastidieux et pénible sur le long terme ! \end{regles} \begin{attention}{Ce qu'il faut bannir !} @@ -175,7 +177,7 @@ Et pour finir, tu trouveras ci-après (page \pageref{compilation-diagramme}) un \begin{itemize}[label = \ding{118}, leftmargin = *] \item Si génération d'un glossaire (package \verb?glossaries?), le fonctionnement serait similaire à celui d'un index. -\item Si génération d'une bibliographie et d'un index, \Texmaker{} se charge de lancer tous les moteurs (PDF\LaTeX{}, Bib\TeX{} et MakeIndex) dans le bon ordre (compilation rapide). +\item Si génération d'une bibliographie et d'un index, \Texmaker{} se charge de lancer tous les moteurs (\pdfLaTeX{}, \BibTeX{} et MakeIndex) dans le bon ordre (compilation rapide). \end{itemize} \vspace*{\fill} diff --git a/info/guide-latex-fr/Chapitres/p3-structuration.tex b/info/guide-latex-fr/Chapitres/p3-structuration.tex index b8d1cff103..ec46a1b4f4 100644 --- a/info/guide-latex-fr/Chapitres/p3-structuration.tex +++ b/info/guide-latex-fr/Chapitres/p3-structuration.tex @@ -1,10 +1,20 @@ -\chapter{Structurer ses documents} +\chapter{Structurer ses projets} + +\epigraph{Or les gens ne s'aperçoivent pas qu'ils ne connaissent pas l'essence de chaque chose. Ainsi, croyant la connaître, ils ne s'accordent pas sur ce qui constitue le point de départ de l'examen, et, lorsqu'ils avancent, il est normal qu'ils en paient le prix : car ils ne sont d'accord ni avec eux-mêmes, ni les uns avec les autres.}{\textsc{Platon}, \textit{Phèdre}, 237c} \label{structure-docs}\lettrine{L}{a} rédaction de rapports ou de guides peut très vite contenir un nombre important de lignes (préambule et les commandes définies, chapitres, contenu). Dès lors, la relecture devient indigeste et difficile. Il est grand de reprendre le contrôle sur l'organisation de ses documents \LaTeX{} ! \section{Un peu de rangement} -Pour commencer, nous supposons que ton projet \LaTeX{} tient dans un dossier racine, identifié de manière relative par la formulation \textcolor{orange}{\verb?./?}. +Pour commencer, nous supposons que ton projet \LaTeX{} tient dans un dossier racine, identifié de manière relative par la formulation \textcolor{orange}{\verb?./?}. Nous proposons de ranger ce dossier racine de la manière suivante : \begin{itemize}[label = \ding{118}] +\item un sous-dossier \verb?Chapitres?, qui va contenir tout le contenu du projet, ainsi que les packages appelées et la configuration (des packages ou personnelle) utilisée ; + +\item un sous-dossier \verb?Images?, pour archiver toutes les images qui vont être utilisées dans le projet ; + +\item le fichier principal \verb?main.tex?, qui va jouer l'équivalent de chef d'orchestre du projet. \\ +\end{itemize} + +Nous pouvons alors représenter cette structuration du projet par l'arborescence suivante : \begin{figure}[H] \centering @@ -15,7 +25,7 @@ Pour commencer, nous supposons que ton projet \LaTeX{} tient dans un dossier rac child { node {main-biblio.bib}} child { node {chap1.tex}} child { node {\dots{}}} - child { node {commandes.tex}} + child { node {configuration.tex}} child { node {packages.tex}} } child[missing] {} % Saut de ligne à cause des "sous-enfants" précédents @@ -34,6 +44,8 @@ Pour commencer, nous supposons que ton projet \LaTeX{} tient dans un dossier rac \caption{Arborescence du projet} \end{figure} +Bien entendu, il s'agit d'une première proposition minimaliste, que tu peux étoffer par la suite selon ton besoin (sous-dossiers supplémentaires, fichiers \verb?.tex? plus nombreux\dots{}). + \begin{attention}{Chemin absolu et chemin relatif} Par la suite, nous allons devoir indiquer à \LaTeX{} où sont rangés les différents fichiers \verb?.tex? ou images à appeler dans le document. @@ -44,7 +56,7 @@ Cette méthode présente un inconvénient majeur : tu dois modifier dans ton cod Et s'il faut revenir en arrière dans l'arborescence, ``remonter en arrière d'un dossier'' en quelque sorte, la notation \textcolor{orange}{\verb?../?} existe aussi. \end{attention} -Voyons maintenant les différentes options possibles pour appeler tous ces fichiers dans notre document source \verb?main.tex?. +Voyons maintenant les différentes options possibles pour appeler tous ces fichiers dans notre fichier principal \verb?main.tex?. \section{Commandes disponibles} @@ -55,7 +67,7 @@ Par exemple, je pense notamment à des schémas, graphes ou encore des formules \item \verb?\?\verb?include{./<chemin>/<nom-fichier>}? : importation plus sophistiquée du fichier \verb?<nom-fichier>.tex?, avec un \verb?\clearpage? avant et après. Cette commande prend alors tout son sens pour importer des parties logiques de ton rapport -- \verb?chapter? principalement, pour ne pas être impacté par le \verb?\clearpage?. -\textbf{C'est pourquoi cette commande a toute son utilité au sein du fichier source \verb?main.tex?.} Des propriétés notables sont à retenir : \begin{itemize}[label = \ding{118}] +\textbf{C'est pourquoi cette commande a toute son utilité au sein du fichier principal \verb?main.tex?.} Des propriétés notables sont à retenir : \begin{itemize}[label = \ding{118}] \item un fichier \verb?<nom-fichier>.aux? est généré. Il contient toutes les références et la pagination associée, ce qui octroie un léger gain de temps à partir de la 2\up{ème} compilation. Si tu génères ton rapport entier puis que tu veux travailler que sur un seul fichier, tu conserves ainsi la pagination finale ; @@ -68,6 +80,12 @@ Si tu génères ton rapport entier puis que tu veux travailler que sur un seul f \item \verb?\?\verb?includeonly{./<chemin>/<nom-fichier1>,...}? : génération du rapport en appelant seulement les fichiers indiqués et appelés par \verb?\?\verb?include?. \textbf{Son appel se fait uniquement dans le \emph{préambule} !} Il ne faut pas non plus mettre des espaces dans la commande. La virgule joue le rôle de séparateur des différents fichiers. Dans ce cas, si tu souhaites travailler sur une partie bien spécifique de ton rapport, tu gagnes un coup de \textit{boost} considérable lors de la compilation ! En effet, \LaTeX{} va compiler uniquement le(s) fichier(s) indiqué(s), et non le rapport dans sa totalité. C'est peut-être anodin sur de petits documents mais c'est extrêmement puissant si le rapport dépasse 30 pages. + +\item \verb?\graphicspath{{./Images/}}? : commande spécifique au package \verb?graphicx?, elle permet d'indiquer le chemin pour intégrer les images. + +Ainsi, les images sont appelées simplement (cf. \ref{chap-img} \nameref{chap-img}, p. \pageref{chap-img}), sans avoir besoin d'écrire à chaque fois le chemin complet. + +Plusieurs chemins peuvent être renseignés avec cette commande, même si je n'en vois pas trop l'utilité : nous cherchons ici à structurer, pas à éparpiller le contenu. \end{enumerate} \begin{regles}{Bilan concis} @@ -76,20 +94,23 @@ Dans ce cas, si tu souhaites travailler sur une partie bien spécifique de ton r \section{La pratique} -La théorie, c'est toujours très sympathique mais, dans ce guide, il y a des éléments concrets. Voyons donc tout de suite l'allure que prend notre fichier source \verb?main.tex?\footnote{Pour rappel, il s'agit du fichier à partir duquel est lancé la compilation.} : +La théorie, c'est toujours très sympathique mais, dans ce guide, il y a des éléments concrets. Voyons donc tout de suite l'allure que prend notre fichier principal \verb?main.tex?\footnote{Pour rappel, il s'agit du fichier à partir duquel est lancé la compilation.} : \begin{code}{Le fichier \verb?main.tex?} \documentclass[a4paper, 12pt]{report} % ICI, enlever les % devant les commandes -% (pour éviter les conflits avec l'arborescence Texmaker) +% (mis en pour éviter les conflits avec l'arborescence Texmaker de mon projet) % Chargement des packages et de la configuration utilisés %\input{./Chapitres/packages} -%\input{./Chapitres/commandes} +%\input{./Chapitres/configuration} %\includeonly{./Chapitres/chap1,./Chapitres/chap3} +%\usepackage{graphicx} % Pour les images +%\graphicspath{{./Images/}} % Sous-répertoire pour les images + \begin{document} @@ -108,14 +129,14 @@ La théorie, c'est toujours très sympathique mais, dans ce guide, il y a des é \end{document} \end{code} -Comme tu peux le constater, tu dois écrire le chemin relatif -- \verb?./Chapitres/? -- à chaque fois. Mais, quand tu y réfléchis, tu ne changes pas tes dossiers tous les 4 matins. Et quand tu le fais, la fonction \og Remplacer \fg{} est la bienvenue ! +Comme tu peux le constater, tu dois écrire le chemin relatif -- \verb?./Chapitres/? -- à chaque fois. Mais, quand tu y réfléchis, tu ne changes pas tes dossiers tous les 4 matins. Et quand tu le fais, la fonction \og Remplacer \fg{} est la bienvenue ! \\ De plus, c'est raisonnable quand tu penses au temps de compilation gagné par la suite. Ce n'est pas la même chose d'attendre 1 seconde (compilation d'un fichier) ou 4 secondes (compilation d'un gros rapport), surtout si tu dois souvent compiler pour vérifier le code et le rendu. \begin{conseil}{La petite astuce \Texmaker{}} Tu dois trouver pénible d'écrire une partie de ton rapport puis de devoir basculer sur le fichier \verb?main.tex? pour compiler. Et je te comprends ! \\ -Fort heureusement, \Texmaker{} propose une solution toute simple : le \og document maître \fg{}. Cette solution permet de définir le fichier source \verb?main.tex? comme référence : toutes les compilations se font alors depuis ce fichier, \textbf{même si tu travailles sur un autre !} +Fort heureusement, \Texmaker{} propose une solution toute simple : le \og document maître \fg{}. Cette solution permet de définir le fichier principal \verb?main.tex? comme référence : toutes les compilations se font alors depuis ce fichier, \textbf{même si tu travailles sur un autre !} Pour activer cette option, ouvrir \verb?main.tex?, aller sur la barre de menus, choisir \verb?Options? puis \verb?Définir le document courant...?. Et c'est tout. Tu peux même constater que ce choix a bien été pris en compte. Il te suffit de regarder en bas à droite de la fenêtre \Texmaker{}. \\ @@ -125,7 +146,9 @@ Et si jamais tu veux réaliser des tests ou générer un fichier annexe alors qu \begin{attention}{Les noms de fichiers} Pour la clarté de ce guide, j'ai choisi d'appeler les fichiers \verb?chap1?, \verb?chap2?, etc. \textbf{Toutefois, je ne recommande pas d'utiliser une telle nomenclature !} \\ -En effet, tu dois penser à tout changer le jour où tu veux ajouter un nouveau chapitre 1 ou 2 (noms de fichiers et commande \verb?\?\verb?include?). Selon moi, il est donc préférable d'appeler explicitement ses fichiers (\verb?chap-texte?, \verb?page-garde?, \verb?annexes?, etc.). +En effet, tu dois penser à tout changer le jour où tu veux ajouter un nouveau chapitre 1 ou 2 (noms de fichiers et commande \verb?\?\verb?include?). Selon moi, il est donc préférable d'appeler explicitement ses fichiers (\verb?chap-texte?, \verb?page-garde?, \verb?annexes?, etc.). \\ + +De plus, \textbf{les espaces sont prohibés} dans les noms de fichiers (\verb?.tex? ou images) ! Autrement, les erreurs seront importantes. \end{attention} \section{D'autres solutions} @@ -134,6 +157,6 @@ Les éléments proposés jusqu'à présent constituent une introduction de ma pa Tu es aussi libre de créer des fichiers \verb?.tex? qui te sont propres, comme une page de garde personnalisée, une introduction, le sommaire, des annexes, ou encore une 4\up{ème} de couverture. \\ -Il existe aussi un package qui permet de distinguer dans la commande le chemin relatif et le nom du fichier à importer : \verb?import?. Mais le problème reste le même selon moi, comme il faut indiquer le chemin à chaque fois (à moins de définir une commande générique, point qui reste à valider). +Il existe aussi un package qui permet de distinguer dans la commande le chemin relatif et le nom du fichier à importer : \verb?import?. Mais le problème reste le même selon moi, comme il faut indiquer le chemin à chaque fois (à moins de définir une commande générique, point qui reste à valider). \\ -La page \url{http://blog.dorian-depriester.fr/latex/template-these/template-complet-pour-manuscrit-de-these} peux aussi t'apporter une aide considérable et te donner de nouvelles pistes à explorer ! Des points intéressants sont abordés, comme générer un mini-sommaire en début de chaque chapitre, plusieurs bibliographies, utiliser un \textit{backref} (bibliographie), et bien d'autres encore.
\ No newline at end of file +La page \url{http://blog.dorian-depriester.fr/latex/template-these/template-complet-pour-manuscrit-de-these} peut aussi t'apporter une aide considérable et te donner de nouvelles pistes à explorer ! Des points intéressants sont abordés, comme générer un mini-sommaire en début de chaque chapitre, plusieurs bibliographies, utiliser un \textit{backref} (bibliographie), et bien d'autres encore.
\ No newline at end of file diff --git a/info/guide-latex-fr/Chapitres/p3-tableaux.tex b/info/guide-latex-fr/Chapitres/p3-tableaux.tex index a15db7ad23..a0c2463c56 100644 --- a/info/guide-latex-fr/Chapitres/p3-tableaux.tex +++ b/info/guide-latex-fr/Chapitres/p3-tableaux.tex @@ -1,5 +1,7 @@ \chapter{Tableaux \& boîtes} +\epigraph{La vie, c'est comme une boîte de chocolat : on ne sait jamais sur quoi on va tomber.}{\textit{Forrest Gump}, Robert \textsc{Zemeckis} (1994)} + \label{chap-table-details}\lettrine{I}{l} est possible d'obtenir des tableaux plus élaborés avec quelques commandes supplémentaires, sans parler des décorations avec des boîtes. \section{Autres formats de cellules} @@ -157,13 +159,13 @@ Fabrication en grande série & ++ & - & -- \\ \hline \end{tabular} \end{document} -\end{codedisplay} +\end{coderesult} Il se peut que la visualisation des bordures noires du tableau ne s'affiche pas bien avec la cellule colorée. Il s'agit juste d'un problème d'affichage avec ton écran d'ordinateur, tellement la ligne est fine. Sinon, tu peux aussi augmenter l'épaisseur des traits de ton tableau, grâce à la commande \verb?\setlength\arrayrulewidth{<épaisseur>}?. -\section{\texttt{longtable} \& \texttt{booktabs}} +\section{Les packages \texttt{longtable} \& \texttt{booktabs}} J'ai découvert ces deux packages -- \verb?longtable? et \verb?booktabs? -- en 2017, et depuis je ne m'en passe plus ! \\ diff --git a/info/guide-latex-fr/Chapitres/p3-texte.tex b/info/guide-latex-fr/Chapitres/p3-texte.tex index 766248357a..13cb81a398 100644 --- a/info/guide-latex-fr/Chapitres/p3-texte.tex +++ b/info/guide-latex-fr/Chapitres/p3-texte.tex @@ -1,5 +1,7 @@ \chapter{Améliorer son texte et sa mise en forme} +\epigraph{La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.}{Antoine \textsc{de Saint-Exupéry}} + \label{chap-texte-details}\lettrine{S}{i} tu sais désormais écrire des paragraphes, faire une page de garde simple, afficher un sommaire ou utiliser des listes sous \LaTeX{}, il existe encore plein d'autres fonctionnalités sympathiques pour compléter ces éléments. Et je les recense justement dans ce chapitre ! \section{Changer la police d'écriture} @@ -67,7 +69,7 @@ Les packages \verb?times? et \verb?palatino? sont \textbf{obsolètes} et sont do L'utilisation d'un autre package de police que \verb?lmodern? est donc encore un sujet délicat, sur lequel il faut être méfiant et faire des essais au préalable. Tu peux parfois rencontrer des bizarreries, des erreurs insoupçonnées. -Mais si tu veux faire des essais, je recommande particulièrement le site suivant : \url{http://www.tug.dk/FontCatalogue/}. En quelque sorte, il s'agit d'une bibliothèque qui recense les polices accessibles sous \LaTeX{}. Attention à bien lire l'aide et les indications affichées : certaines polices ne fonctionnent qu'avec le moteur de compilation Xe\LaTeX{} ! \\ +Mais si tu veux faire des essais, je recommande particulièrement le site suivant : \url{http://www.tug.dk/FontCatalogue/}. En quelque sorte, il s'agit d'une bibliothèque qui recense les polices accessibles sous \LaTeX{}. Attention à bien lire l'aide et les indications affichées : certaines polices ne fonctionnent qu'avec le moteur de compilation \XeLaTeX{} ! \\ Enfin, il est possible d'appeler tous ces packages localement\footnote{L'appel peut se faire aussi globalement si la commande est appelée en tout début de document.} grâce à la commande suivante : @@ -95,7 +97,7 @@ Il n'y a apparemment qu'un seul moyen de pouvoir utiliser une police d'écriture Toutefois, quand il faut taper un rapport officiel et qu'une police spécifique de Word est imposée -- Calibri ou Cambria par exemple, Times reste disponible avec le package \verb?mathptmx? --, il n'y a pas d'autres solutions. \\ -\textcolor{red!70!black}{\textbf{Cette solution fonctionne uniquement grâce à une compilation sous Xe\LaTeX{}}} (ou Lua\LaTeX{}). Le résultat est à la hauteur de nos attentes : accents affichés et utilisation de toutes les autres commandes exactement de la même façon que sous PDF\LaTeX{} (mathématiques, images, tableaux\dots{}). +\textcolor{red!70!black}{\textbf{Cette solution fonctionne uniquement grâce à une compilation sous \XeLaTeX{}}} (ou \LuaLaTeX{}). Le résultat est à la hauteur de nos attentes : accents affichés et utilisation de toutes les autres commandes exactement de la même façon que sous \pdfLaTeX{} (mathématiques, images, tableaux\dots{}). Elle permet d'utiliser toutes les polices disponibles sur ton ordinateur, y compris des polices téléchargées et ajoutées manuellement par la suite. @@ -168,10 +170,10 @@ Nous avons donc vu : \item comment utiliser un package de police sous \LaTeX{} ; -\item comment utiliser une police externe à \LaTeX{}, en compilant sous Xe\LaTeX{} et grâce au package \verb?fontspec?. \\ +\item comment utiliser une police externe à \LaTeX{}, en compilant sous \XeLaTeX{} et grâce au package \verb?fontspec?. \\ \end{itemize} -Changer la police peut se révéler amusant pour certaines réalisations personnelles mais il faut passer sous Xe\LaTeX{} dans le pire des cas, ce qui peut augmenter le temps de compilation -- qui reste raisonnable malgré tout, je te rassure, tout au plus de l'ordre de quelques dizaines secondes. +Changer la police peut se révéler amusant pour certaines réalisations personnelles mais il faut passer sous \XeLaTeX{} dans le pire des cas, ce qui peut augmenter le temps de compilation -- qui reste raisonnable malgré tout, je te rassure, tout au plus de l'ordre de quelques dizaines secondes. Le format par défaut proposé depuis le début de ce guide convient tout à fait et permet de te démarquer des autres réalisations. Après tout, ne s'agit-il pas d'une marque de fabrique signée \LaTeX{} ? @@ -196,7 +198,7 @@ Et si tu ne sais pas quelle valeur choisir pour \verb?<taille2>?, je ne réfléc Pour inclure des fichiers PDF, il faut utiliser le package \verb?pdfpages? et utiliser la commande : \begin{code}{Inclure un fichier PDF} -% Compilation sous PDFLaTeX / XeLaTeX / LuaLaTeX +% Compilation sous pdfLaTeX / XeLaTeX / LuaLaTeX \includepdf[pages = debut-fin]{<nom-PDF>} \end{code} @@ -209,7 +211,7 @@ Tu peux aussi te servir de cette commande pour insérer une page d'un rapport PD \begin{attention}{\textit{Nota Bene}} Le paramètre \verb?<nom-PDF>? ne doit contenir ni espace ni accent. C'est le même principe que pour les images. \\ -Pour rappel, la \textbf{compilation} doit se faire \textbf{uniquement} avec PDF\LaTeX{} ou Xe\LaTeX{} (ou Lua\LaTeX{}). +Pour rappel, la \textbf{compilation} doit se faire \textbf{uniquement} avec \pdfLaTeX{} ou \XeLaTeX{} (ou \LuaLaTeX{}). \end{attention} Il existe d'autres options, comme faire une rotation à la page (\verb?landscape?, \verb?angle = <rotation>?), ajuster automatiquement le format (\verb?fitpaper?), etc. Pour les connaître ou si tu en as besoin, je te laisse consulter la documentation du package : \url{https://www.ctan.org/pkg/pdfpages}. \\ @@ -556,15 +558,15 @@ Par exemple, le \verb?and? dans le fichier \verb?.bib? pour séparer les auteurs \end{itemize} Puis vient la compilation. Il faut alors procéder de la manière suivante : \begin{enumerate} -\item Lancer la compilation sous PDF\LaTeX{}, pour la première compilation du document. +\item Lancer la compilation sous \pdfLaTeX{}, pour la première compilation du document. -\item Lancer Bib\TeX{}, pour la génération de la bibliographie dans des fichiers annexes (cf. les options \Texmaker{} pour connaître le raccourci clavier associé). +\item Lancer \BibTeX{}, pour la génération de la bibliographie dans des fichiers annexes (cf. les options \Texmaker{} pour connaître le raccourci clavier associé). -\item Relancer PDF\LaTeX{} deux fois, pour l'intégration de la bibliographie et la bonne implémentation des références et du sommaire. +\item Relancer \pdfLaTeX{} deux fois, pour l'intégration de la bibliographie et la bonne implémentation des références et du sommaire. \end{enumerate} \begin{conseil}{Le conseil personnel} -Changer la \og compilation rapide \fg{} de \Texmaker{} avec un choix qui intègre le moteur Bib\TeX{} simplifie aussi grandement la vie. +Changer la \og compilation rapide \fg{} de \Texmaker{} avec un choix qui intègre le moteur \BibTeX{} simplifie aussi grandement la vie. \end{conseil} Maintenant, si tu as lancé la compilation, tu dois te dire que c'est nul car rien n'apparaît\dots{} et c'est normal ! \LaTeX{} ne va pas générer une bibliographie si tu n'y fais pas référence. @@ -622,7 +624,7 @@ En parallèle, \LaTeX{} gère automatiquement la mise en forme de la bibliograph Toutefois, si jamais tu n'as que 2-3 références à faire, il existe une manière plus simple de générer une bibliographie. Tu peux la créer toi-même grâce à l'environnement \verb?thebibliography?. -Il suffit alors de compiler seulement 2 fois avec PDF\LaTeX{} pour bien intégrer les références et c'est tout ! Nul besoin désormais de passer par Bib\TeX{}. \\ +Il suffit alors de compiler seulement 2 fois avec \pdfLaTeX{} pour bien intégrer les références et c'est tout ! Nul besoin désormais de passer par \BibTeX{}. \\ Je te laisse reprendre le code ci-après et digérer les commentaires qui suivent : @@ -682,12 +684,12 @@ Base de données \verb?.bib? & Dans le fichier \verb?.tex? \\ \textcolor{Green}{Gestion automatique de la mise en forme} (remplissage de champs dans une ``base de données'') & \textcolor{Red}{Mise en forme par l'utilisateur} \\ \textcolor{Green}{Classement par ordre alphabétique des auteurs} (par nom) & \textcolor{Red}{Entrées bibliographiques affichées dans l'ordre de leur création} \\ \textcolor{Green}{Cohérence de la bibliographie} (affichage des références citées) & \textcolor{Red}{Affichage de toute la bibliographie créée} \\ -Compilation sous \verb?PDFLaTeX? + inclure \verb?Bibtex? & Tous les modes de compilation tolérés, pas besoin de \verb?Bibtex? +Compilation sous \pdfLaTeX{} + inclure \BibTeX{} & Tous les modes de compilation tolérés, pas besoin de \BibTeX{} \end{longtable} Pour conclure, il n'y a pas de bonnes ou de mauvaises méthodes. Tout dépend uniquement de l'utilisation que tu dois en faire. -\textcolor{cyan!70!black}{\emph{Personnellement},} pour une courte bibliographie, je la ferai désormais à la main, quitte à la générer avec \verb?Bibtex? initialement pour voir la mise en forme, comme c'est conçu pour. +\textcolor{cyan!70!black}{\emph{Personnellement},} pour une courte bibliographie, je la ferai désormais à la main, quitte à la générer avec \BibTeX{} initialement pour voir la mise en forme, comme c'est conçu pour. Sinon, à partir de 4-5 ouvrages à citer, je ne réfléchis plus et j'implémente tout dans un fichier \verb?.bib?. \\ diff --git a/info/guide-latex-fr/Chapitres/packages.tex b/info/guide-latex-fr/Chapitres/packages.tex index 3104331278..ca84828c27 100644 --- a/info/guide-latex-fr/Chapitres/packages.tex +++ b/info/guide-latex-fr/Chapitres/packages.tex @@ -1,9 +1,25 @@ -% PDFLaTeX -\usepackage{lmodern, textcomp} +%%% OLD (pdfLaTeX) %%% +%\usepackage{lmodern} +%\usepackage[french]{babel} +%\usepackage[utf8]{inputenc} +%\usepackage[T1]{fontenc} + +%%% NEW %%% \usepackage[french]{babel} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} -\usepackage{lettrine, lipsum} % Pour mettre des lettrines - Pour les tests +\usepackage{iftex} +\ifPDFTeX + \usepackage[utf8]{inputenc} + \usepackage[T1]{fontenc} + \usepackage{lmodern} +\else + \ifXeTeX + \usepackage{fontspec} + \else + \usepackage{luatextra} + \fi + \defaultfontfeatures{Ligatures=TeX} +\fi +\usepackage{lettrine, lipsum, hologo, epigraph} % Pour mettre des lettrines - Pour les tests - Pour les logos LaTeX - Pour les épigraphes \usepackage{fancyhdr, fourier-orns} % En-têtes et pieds de pages \fancyhf{} % Tout effacer @@ -30,9 +46,10 @@ \usepackage[breakable, listings, raster, skins]{tcolorbox} % Boîtes personnalisables \lstset{literate = {à }{{\`a}}1 {â}{{\^a}}1 {é}{{\'e}}1 {è}{{\`e}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {ù}{{\`u}}1 {û}{{\^u}}1 {ç}{{\c{}c}}1 {°}{{\degres{}}}1} % Pour résoudre le problème des accents dans le code (listings sous tcolorbox) \usepackage{upquote} % Pour des apostrophes droites (verbatim / listings) +\usepackage{accsupp} % Pour garantir la numérotation des lignes de code -\usepackage{graphicx, float, subcaption} % Pour mettre les images -\graphicspath{{./Images/}} % Sous-répertoire pour mettre les images +\usepackage{graphicx, float, subcaption} % Pour les images +\graphicspath{{./Images/}} % Sous-répertoire pour les images \usepackage{pgfornament, pgfplots} % TikZ et tracé de fonctions \usetikzlibrary{arrows.meta, babel, decorations.text, mindmap, positioning, shadows, shapes.geometric, shapes.misc, shapes.multipart, shapes.symbols, spy, trees} diff --git a/info/guide-latex-fr/Chapitres/page-garde.tex b/info/guide-latex-fr/Chapitres/page-garde.tex index 84ad420215..f6baa67125 100644 --- a/info/guide-latex-fr/Chapitres/page-garde.tex +++ b/info/guide-latex-fr/Chapitres/page-garde.tex @@ -31,7 +31,7 @@ % Date & version \node[anchor = north, yshift = -1.5*\ysep, font = \Large] (creation) at (authorcl.south) {13 juillet 2016}; -\node[anchor = north, text width = 0.5\linewidth, align = center, font = \Large\bfseries] at (creation.south) {Version 3.7 à jour au \\ \today}; +\node[anchor = north, text width = 0.5\linewidth, align = center, font = \Large\bfseries] at (creation.south) {Version \version{} à jour au \\ \today}; % Graphes diff --git a/info/guide-latex-fr/Images/compilation_diagramme.tex b/info/guide-latex-fr/Images/compilation_diagramme.tex index dde2eae753..3a53d05a54 100644 --- a/info/guide-latex-fr/Images/compilation_diagramme.tex +++ b/info/guide-latex-fr/Images/compilation_diagramme.tex @@ -47,7 +47,7 @@ \node[comment, text = commentcol, minimum width = \blockwh, above] (renvoi) at (fichierstex.north) {cf. \autoref{structure-docs} \og \nameref{structure-docs} \fg{}}; \draw[arrow] (source) -- (nfictA) node[comment, align = left, right, yshift = -\blocksep] {appel} |- (biblioA); -\draw[arrow, brown] (source) |- node[comment, font = \rmfamily, align = left, anchor = south west] {PDF\LaTeX{} \\ Xe\LaTeX{} \\ Lua\LaTeX{}} node[comment, text width = \blockwh, font = \rmfamily, align = left, anchor = north west] {(\texttt{.jpg}, \texttt{.pdf}, \texttt{.png} \\ \texttt{.eps} toléré)} ([yshift = \blockht/4]pdfA.west); +\draw[arrow, brown] (source) |- node[comment, font = \rmfamily, align = left, anchor = south west] {\pdfLaTeX{} \\ \XeLaTeX{} \\ \LuaLaTeX{}} node[comment, text width = \blockwh, font = \rmfamily, align = left, anchor = north west] {(\texttt{.jpg}, \texttt{.pdf}, \texttt{.png} \\ \texttt{.eps} toléré)} ([yshift = \blockht/4]pdfA.west); \draw[arrow, gray] (source) |- node[comment, align = left, font = \rmfamily, right, yshift = \blocksep] {\LaTeX{} \\ (\texttt{.eps})} (dvi); \draw[arrow, gray] (dvi) -| node[comment, below] {\texttt{dvi2ps}} (ps); \draw[arrow, gray] (ps) |- node[comment, align = right, left] {\texttt{ps2pdf}} ([yshift = -\blockht/4]pdfA.west); diff --git a/info/guide-latex-fr/README.md b/info/guide-latex-fr/README.md index aeb27e1c7d..f77c77f606 100644 --- a/info/guide-latex-fr/README.md +++ b/info/guide-latex-fr/README.md @@ -31,9 +31,16 @@ Adrien BOUZIGUES ### Historique des mises à jour : +* **Version 3.8 (finie le 28/12/2022) :** + * corrections diverses + * amélioration préambule (packages.tex) + * utilisation package "hologo" et mise à jour contenu + * ajout du numéro de ligne de code dans les exemples fournis + * mise à jour liens vers FAQ "grappa" vers GUTenberg + * **Version 3.7 (finie le 03/10/2021) :** * suppression du lien du GDrive et du GForm (obsolète) - * mise à jour des liens avec le site (gfl.cl215.fr) + * mise à jour des liens avec le site (glf.cl215.fr) * import sur le site des fichiers statiques (PDF d'aide) initialement hébergés sur le GDrive diff --git a/info/guide-latex-fr/guide-latex-fr.pdf b/info/guide-latex-fr/guide-latex-fr.pdf Binary files differindex 22af3362d5..e6fd8bbf11 100644 --- a/info/guide-latex-fr/guide-latex-fr.pdf +++ b/info/guide-latex-fr/guide-latex-fr.pdf diff --git a/info/guide-latex-fr/guide-latex-fr.tex b/info/guide-latex-fr/guide-latex-fr.tex index 4a22acb4bd..52514ca9dc 100644 --- a/info/guide-latex-fr/guide-latex-fr.tex +++ b/info/guide-latex-fr/guide-latex-fr.tex @@ -3,10 +3,10 @@ % Les packages et la configuration utilisés \input{./Chapitres/packages} -\input{./Chapitres/commandes} +\input{./Chapitres/configuration} % Utile à ce stade : gain de place et modifications occasionnelles -%\includeonly{./Chapitres/intro} +%\includeonly{./Chapitres/page-garde} \begin{document} diff --git a/macros/latex/contrib/bookcover/bookcover-example1.pdf b/macros/latex/contrib/bookcover/bookcover-example1.pdf Binary files differindex f8839cf0f1..39d5f4d433 100644 --- a/macros/latex/contrib/bookcover/bookcover-example1.pdf +++ b/macros/latex/contrib/bookcover/bookcover-example1.pdf diff --git a/macros/latex/contrib/bookcover/bookcover-example2.pdf b/macros/latex/contrib/bookcover/bookcover-example2.pdf Binary files differindex 8b0d47f804..68861f16ef 100644 --- a/macros/latex/contrib/bookcover/bookcover-example2.pdf +++ b/macros/latex/contrib/bookcover/bookcover-example2.pdf diff --git a/macros/latex/contrib/bookcover/bookcover.dtx b/macros/latex/contrib/bookcover/bookcover.dtx index 06a364f007..c71b62e227 100644 --- a/macros/latex/contrib/bookcover/bookcover.dtx +++ b/macros/latex/contrib/bookcover/bookcover.dtx @@ -17,12 +17,12 @@ % \iffalse %<*driver> \ProvidesFile{bookcover.dtx} -\newcommand{\eifiledate}{2022/08/08} -\newcommand{\eifilever}{v3.4} +\newcommand{\eifiledate}{2022/12/29} +\newcommand{\eifilever}{v3.5} %</driver> %<class> %<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01] -%<class>\ProvidesClass{bookcover}[2022/08/08 v3.4 class for book covers and dust jackets] +%<class>\ProvidesClass{bookcover}[2022/12/29 v3.5 class for book covers and dust jackets] % %<*driver> \documentclass{ltxdoc} @@ -292,7 +292,7 @@ % % The following figures also show the normal and abbreviated names of the blue parts. % -% \subsection{Book cover widthout flaps, background parts} +% \subsection{Book cover without flaps, background parts} % % \setcounter{partfig}{1} % \loop @@ -300,14 +300,14 @@ % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig} % \ifnum\value{partfig}<7\repeat % -% \subsection{Book cover widthout flaps, foreground parts} +% \subsection{Book cover without flaps, foreground parts} % % \loop % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig} % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig} % \ifnum\value{partfig}<13\repeat % -% \subsection{Book cover widthout flaps, other parts} +% \subsection{Book cover without flaps, other parts} % % \loop % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig} @@ -315,21 +315,21 @@ % \ifnum\value{partfig}<17\repeat % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\stepcounter{partfig} % -% \subsection{Book cover width flaps, background parts} +% \subsection{Book cover with flaps, background parts} % % \loop % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig} % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig} % \ifnum\value{partfig}<46\repeat % -% \subsection{Book cover width flaps, foreground parts} +% \subsection{Book cover with flaps, foreground parts} % % \loop % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig} % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig} % \ifnum\value{partfig}<74\repeat % -% \subsection{Book cover width flaps, other parts} +% \subsection{Book cover with flaps, other parts} % % \loop % \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig} @@ -998,7 +998,7 @@ \newif\if@oldsetbookcover% for old method \long\def\setbookcover#1{% - \@for\bookcover@firstparam:={bgcolor,bgpic,bgtikz,fgsecond}\do{% for old method + \@for\bookcover@firstparam:={bgcolor,bgpic,bgtikz,fgsecond,fgfirst}\do{% for old method \ifdefstring{\bookcover@firstparam}{#1}{\global\@oldsetbookcovertrue}{}}% for old method \if@oldsetbookcover% for old method \gdef\bookcover@firstparam{#1}% for old method @@ -1785,6 +1785,8 @@ lF-rW=whole without front flap.,lW-rF=whole without back flap.,% lF-rF=whole.}% \do{\expandafter\bookcover@shortpartname@\bookcover@partname@} +\letnamebookcoverpart{remark}{above front}% for old method + %% OLD METHOD \def\bookcover@reset{ diff --git a/macros/latex/contrib/bookcover/bookcover.pdf b/macros/latex/contrib/bookcover/bookcover.pdf Binary files differindex f0cd230c66..a87ac663d1 100644 --- a/macros/latex/contrib/bookcover/bookcover.pdf +++ b/macros/latex/contrib/bookcover/bookcover.pdf diff --git a/macros/latex/contrib/zref-vario/CHANGELOG.md b/macros/latex/contrib/zref-vario/CHANGELOG.md index 18e60b2c09..416ca0a6ec 100644 --- a/macros/latex/contrib/zref-vario/CHANGELOG.md +++ b/macros/latex/contrib/zref-vario/CHANGELOG.md @@ -1,6 +1,13 @@ # Changelog -## [Unreleased](https://github.com/gusbrs/zref-vario/compare/v0.1.5...HEAD) +## [Unreleased](https://github.com/gusbrs/zref-vario/compare/v0.1.6...HEAD) + +## [v0.1.6](https://github.com/gusbrs/zref-vario/compare/v0.1.5...v0.1.6) (2022-12-29) + +### Added +- Hyperlinking for the nearby page references and for the page part of paired + references. +- Localization for Italian. ## [v0.1.5](https://github.com/gusbrs/zref-vario/compare/v0.1.4...v0.1.5) (2022-07-08) diff --git a/macros/latex/contrib/zref-vario/zref-vario-code.pdf b/macros/latex/contrib/zref-vario/zref-vario-code.pdf Binary files differindex 7c9387cdcf..1f8fa29283 100644 --- a/macros/latex/contrib/zref-vario/zref-vario-code.pdf +++ b/macros/latex/contrib/zref-vario/zref-vario-code.pdf diff --git a/macros/latex/contrib/zref-vario/zref-vario.dtx b/macros/latex/contrib/zref-vario/zref-vario.dtx index 81d9dec5d1..0137baa195 100644 --- a/macros/latex/contrib/zref-vario/zref-vario.dtx +++ b/macros/latex/contrib/zref-vario/zref-vario.dtx @@ -64,8 +64,8 @@ % \NewDocumentCommand\githubPR{m}{^^A % PR~\href{https://github.com/gusbrs/zref-vario/pull/#1}{\##1}} % -% ^^A Currently just for keeping semantic markup on this. % \NewDocumentCommand\contributor{m}{#1} +% \NewDocumentCommand\username{m}{`\texttt{#1}'} % % \NewDocumentCommand\opt{m}{\texttt{#1}} % @@ -128,7 +128,7 @@ % % Identify the package. % \begin{macrocode} -\ProvidesExplPackage {zref-vario} {2022-07-08} {0.1.5} +\ProvidesExplPackage {zref-vario} {2022-12-29} {0.1.6} {Extended LaTeX page cross-references with varioref and zref-clever} % \end{macrocode} % @@ -139,12 +139,19 @@ % the user (and the manual recommends it). But we do it, if it hasn't been % done. % +% Note that \pkg{zref-clever} \texttt{v0.2.0-alpha}, from 2022-01-28, requires +% a kernel 2021-11-15 or newer. +% % \begin{macrocode} \RequirePackage { zref-clever } [ 2022-01-28 ] % v0.2.0-alpha \AddToHook { begindocument/before } { \RequirePackage { varioref } } % \end{macrocode} % +% Also note that, contrary to \pkg{zref-clever}, \pkg{zref-vario} is +% incompatible with \pkg{cleveref}, because the latter patches \pkg{varioref} +% in ways that break \pkg{zref-vario}. +% % % \section{Options} % @@ -565,7 +572,11 @@ \group_begin: \keys_set:nn { zref-vario/ref } {#3} \bool_if:nT {#2} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } + \tl_set:Nn \l_@@_linklabel_tl {#1} \@@_varioref_setup: \reftextfaraway {#1} \group_end: @@ -662,6 +673,78 @@ % % % +% Provide proper hyperlinking for the ``nearby'' page references. +% \pkg{hyperref} makes \cs{vref} a \emph{single} link, including both the +% standard and the page reference (see Ulrike Fischer's answer and discussion +% in the comments at \url{https://tex.stackexchange.com/a/655106}). However, +% it does not provide the same treatment to \cs{vpageref}, where there's no +% linking at all for nearby pages, to \cs{vrefrange}, \cs{vpagerefrange}, or +% \cs{vnameref}. In my view, this makes \pkg{hyperref} inconsistent. +% \pkg{cleveref} indeed discusses the issue in the ``Known Bugs and +% Work-Arounds'' section, mentioning two problems. The first, that the page +% reference does not honor the \texttt{nameinlink} option, which it is +% actually the same behavior we get from \cs{vnameref}. The second, that +% nearby page references are not included in the links or hyperlinked when by +% themselves. This latter problem may be considered undesirable, and even a +% ``bug'', but at least \pkg{cleveref}'s behavior in this regard is +% consistent. +% +% This is actually tricky and I think the best alternative here is to not even +% try to make a single link of both references, as \pkg{hyperref} does for +% \cs{vref}. But rather to offer ways to hyperlink the ``nearby'' page +% references separately, which is something that can work for paired +% references and for standalone page references just as well. +% \cs{zvhyperlink} is provided for such purpose, and is meant to be used +% either in the reference format settings of \cs{zvLanguageSetup}, or in the +% \opt{vcurrent} and \opt{vother} options of the reference commands. It only +% makes a hyperlink if used in one such place (technically, if +% \cs{l_@@_linklabel_tl} is not empty), if \cs{l_@@_hyperlink_bool} is true +% (to control for starred variants) and if \pkg{hyperref} and +% \pkg{zref-hyperref} are loaded, otherwise it passes on its argument +% untouched. +% +% +% \begin{macrocode} +\bool_new:N \g_@@_zref_hyperref_loaded_bool +\bool_new:N \l_@@_hyperlink_bool +\AddToHook { package/zref-hyperref/after } + { + \AddToHook { package/hyperref/after } + { + \bool_gset_true:N \g_@@_zref_hyperref_loaded_bool + \bool_set_true:N \l_@@_hyperlink_bool + } + } +\tl_new:N \l_@@_linklabel_tl +% \end{macrocode} +% +% \begin{macro}[int]{\zvhyperlink} +% \begin{syntax} +% \cs{zvhyperlink}\marg{text} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zvhyperlink { m } + { \@@_hyperlink:n {#1} } +\cs_new_protected:Npn \@@_hyperlink:n #1 + { + \bool_lazy_all:nTF + { + { \g_@@_zref_hyperref_loaded_bool } + { \l_@@_hyperlink_bool } + { ! \tl_if_empty_p:V \l_@@_linklabel_tl } + } + { + \hyperlink + { \zref@extractdefault { \l_@@_linklabel_tl } { anchor } { } } + {#1} + } + {#1} + } +% \end{macrocode} +% \end{macro} +% +% +% % \section{User interface} % % \begin{macro} @@ -770,7 +853,11 @@ \group_begin: \keys_set:nn { zref-vario/ref-oneoptarg } {#3} \bool_if:nT {#2} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } + \tl_set:Nn \l_@@_linklabel_tl {#1} \@@_varioref_setup: \@@_vref:Vn \l_@@_vref_reftextcurrent_tl {#1} \group_end: @@ -801,7 +888,11 @@ \group_begin: \keys_set:nn { zref-vario/ref-twooptargs } {#3} \bool_if:nT {#2} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } + \tl_set:Nn \l_@@_linklabel_tl {#1} \@@_varioref_setup: \@@_vpageref:VVn \l_@@_reftextcurrent_tl \l_@@_reftextother_tl {#1} @@ -843,8 +934,13 @@ \group_begin: \keys_set:nn { zref-vario/ref-oneoptarg } {#4} \bool_if:nT {#3} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } \@@_varioref_setup: + \vpagerefcompare {#1} {#2} + { \tl_set:Nn \l_@@_linklabel_tl {#1} } { } \@@_vrefrange:Vnn \l_@@_reftextcurrent_tl {#1} {#2} \group_end: } @@ -871,8 +967,13 @@ \group_begin: \keys_set:nn { zref-vario/ref-oneoptarg } {#4} \bool_if:nT {#3} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } \@@_varioref_setup: + \vpagerefcompare {#1} {#2} + { \tl_set:Nn \l_@@_linklabel_tl {#1} } { } \@@_vpagerefrange:Vnn \l_@@_reftextcurrent_tl {#1} {#2} \bool_lazy_and:nnT { \g_@@_zrefcheck_available_bool } @@ -914,7 +1015,11 @@ \group_begin: \keys_set:nn { zref-vario/ref } {#3} \bool_if:nT {#2} - { \keys_set:nn { zref-vario/ref } { nohyperref } } + { + \keys_set:nn { zref-vario/ref } { nohyperref } + \bool_set_false:N \l_@@_hyperlink_bool + } + \tl_set:Nn \l_@@_linklabel_tl {#1} \@@_varioref_setup: \fullref {#1} \group_end: @@ -987,15 +1092,29 @@ % % \section{Languages} % +% Localization for the languages provided by the author, except where +% otherwise stated. However, I could only do so thanks to \pkg{varioref}, in +% particular for languages I don't really know. So, credits go to the +% contributors of \pkg{varioref}. Of course, if any native speaker would like +% to review these, or contribute new ones, it is much welcome. Note, however, +% that since \pkg{zref-vario} depends on \pkg{zref-clever} and piggybacks on +% its language infrastructure, it only makes sense to provide localization +% here for languages already supported by \pkg{zref-clever}. +% % % \begin{macrocode} \zvLanguageSetup { english } { - reftextfaceafter = {on~the~\reftextvario{facing}{next}~page} , - reftextfacebefore = {on~the~\reftextvario{facing}{preceding}~page} , - reftextafter = {on~the~\reftextvario{following}{next}~page} , - reftextbefore = {on~the~\reftextvario{preceding}{previous}~page} , - reftextcurrent = {on~\reftextvario{this}{the~current}~page} , + reftextfaceafter = + {on~the~\zvhyperlink{\reftextvario{facing}{next}~page}} , + reftextfacebefore = + {on~the~\zvhyperlink{\reftextvario{facing}{preceding}~page}} , + reftextafter = + {on~the~\zvhyperlink{\reftextvario{following}{next}~page}} , + reftextbefore = + {on~the~\zvhyperlink{\reftextvario{preceding}{previous}~page}} , + reftextcurrent = + {on~\reftextvario{}{the~}\zvhyperlink{\reftextvario{this}{current}~page}} , reftextfaraway = {on~\zcpageref{#1}} , reftextpagerange = {on~\zcpageref[range]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1006,11 +1125,11 @@ % \begin{macrocode} \zvLanguageSetup { german } { - reftextfaceafter = {auf~der~nächsten~Seite} , - reftextfacebefore = {auf~der~vorherigen~Seite} , - reftextafter = {auf~der~nächsten~Seite} , - reftextbefore = {auf~der~vorherigen~Seite} , - reftextcurrent = {auf~dieser~Seite} , + reftextfaceafter = {auf~der~\zvhyperlink{nächsten~Seite}} , + reftextfacebefore = {auf~der~\zvhyperlink{vorherigen~Seite}} , + reftextafter = {auf~der~\zvhyperlink{nächsten~Seite}} , + reftextbefore = {auf~der~\zvhyperlink{vorherigen~Seite}} , + reftextcurrent = {auf~\zvhyperlink{dieser~Seite}} , reftextfaraway = {auf~\zcpageref[d=D,g=f]{#1}} , reftextpagerange = {auf~den~\zcpageref[range,d=D,g=f]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1021,11 +1140,13 @@ % \begin{macrocode} \zvLanguageSetup { french } { - reftextfaceafter = {page~\reftextvario{ci-contre}{suivante}} , - reftextfacebefore = {page~\reftextvario{ci-contre}{précédente}} , - reftextafter = {page~suivante} , - reftextbefore = {page~précédente} , - reftextcurrent = {de~la~présente~page} , + reftextfaceafter = + {\zvhyperlink{page~\reftextvario{ci-contre}{suivante}}} , + reftextfacebefore = + {\zvhyperlink{page~\reftextvario{ci-contre}{précédente}}} , + reftextafter = {\zvhyperlink{page~suivante}} , + reftextbefore = {\zvhyperlink{page~précédente}} , + reftextcurrent = {de~la~\zvhyperlink{présente~page}} , reftextfaraway = {\zcpageref[g=f]{#1}} , reftextpagerange = {\zcpageref[range,g=f]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1036,11 +1157,15 @@ % \begin{macrocode} \zvLanguageSetup { portuguese } { - reftextfaceafter = {na~\reftextvario{página~oposta}{próxima~página}} , - reftextfacebefore = {na~página~\reftextvario{oposta}{anterior}} , - reftextafter = {na~\reftextvario{página~seguinte}{próxima~página}} , - reftextbefore = {na~página~\reftextvario{anterior}{precedente}} , - reftextcurrent = {nesta~página} , + reftextfaceafter = + {na~\zvhyperlink{\reftextvario{página~oposta}{próxima~página}}} , + reftextfacebefore = + {na~\zvhyperlink{página~\reftextvario{oposta}{anterior}}} , + reftextafter = + {na~\zvhyperlink{\reftextvario{página~seguinte}{próxima~página}}} , + reftextbefore = + {na~\zvhyperlink{página~\reftextvario{anterior}{precedente}}} , + reftextcurrent = {\zvhyperlink{nesta~página}} , reftextfaraway = {na~\zcpageref[g=f]{#1}} , reftextpagerange = {nas~\zcpageref[range,g=f]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1051,11 +1176,11 @@ % \begin{macrocode} \zvLanguageSetup { spanish } { - reftextfaceafter = {en~la~página~siguiente} , - reftextfacebefore = {en~la~página~anterior} , - reftextafter = {en~la~página~siguiente} , - reftextbefore = {en~la~página~anterior} , - reftextcurrent = {en~esta~página} , + reftextfaceafter = {en~la~\zvhyperlink{página~siguiente}} , + reftextfacebefore = {en~la~\zvhyperlink{página~anterior}} , + reftextafter = {en~la~\zvhyperlink{página~siguiente}} , + reftextbefore = {en~la~\zvhyperlink{página~anterior}} , + reftextcurrent = {en~\zvhyperlink{esta~página}} , reftextfaraway = {en~la~\zcpageref[g=f]{#1}} , reftextpagerange = {en~las~\zcpageref[range,g=f]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1066,11 +1191,15 @@ % \begin{macrocode} \zvLanguageSetup { dutch } { - reftextfaceafter = {op~de~\reftextvario{rechter~pagina}{pagina~hiernaast}} , - reftextfacebefore = {op~de~\reftextvario{linker~pagina}{pagina~hiernaast}} , - reftextafter = {op~de~\reftextvario{volgende~pagina}{pagina~hierna}} , - reftextbefore = {op~de~\reftextvario{vorige~pagina}{pagina~hiervoor}} , - reftextcurrent = {op~deze~pagina} , + reftextfaceafter = + {op~de~\zvhyperlink{\reftextvario{rechter~pagina}{pagina~hiernaast}}} , + reftextfacebefore = + {op~de~\zvhyperlink{\reftextvario{linker~pagina}{pagina~hiernaast}}} , + reftextafter = + {op~de~\zvhyperlink{\reftextvario{volgende~pagina}{pagina~hierna}}} , + reftextbefore = + {op~de~\zvhyperlink{\reftextvario{vorige~pagina}{pagina~hiervoor}}} , + reftextcurrent = {op~\zvhyperlink{deze~pagina}} , reftextfaraway = {op~\zcpageref[g=f]{#1}} , reftextpagerange = {op~\zcpageref[range,g=f]{#1,#2}} , reftextlabelrange = {\zcref[range]{#1,#2}} , @@ -1079,6 +1208,24 @@ % % % \begin{macrocode} +\zvLanguageSetup { italian } + { + reftextfaceafter = + {\reftextvario{}{nella~}\zvhyperlink{\reftextvario{a~fronte}{pagina~successiva}}} , + reftextfacebefore = + {\reftextvario{}{nella~}\zvhyperlink{\reftextvario{a~fronte}{pagina~precedente}}} , + reftextafter = + {nella~\zvhyperlink{pagina~\reftextvario{seguente}{successiva}}} , + reftextbefore = {nella~\zvhyperlink{pagina~precedente}} , + reftextcurrent = {in~\zvhyperlink{questa~pagina}} , + reftextfaraway = {a~\zcpageref[g=f]{#1}} , + reftextpagerange = {nelle~\zcpageref[range,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} %</package> % \end{macrocode} % diff --git a/macros/latex/contrib/zref-vario/zref-vario.pdf b/macros/latex/contrib/zref-vario/zref-vario.pdf Binary files differindex e53bd0d300..a48dc67df0 100644 --- a/macros/latex/contrib/zref-vario/zref-vario.pdf +++ b/macros/latex/contrib/zref-vario/zref-vario.pdf diff --git a/macros/latex/contrib/zref-vario/zref-vario.tex b/macros/latex/contrib/zref-vario/zref-vario.tex index 572ff4fe6f..c2cc84878a 100644 --- a/macros/latex/contrib/zref-vario/zref-vario.tex +++ b/macros/latex/contrib/zref-vario/zref-vario.tex @@ -61,13 +61,9 @@ \NewDocumentCommand\opt{m}{\texttt{#1}} -% Temporary workaround for 'l3doc' bug. -% https://github.com/latex3/latex3/issues/1111 -% FIXME Remove when fixed upstream. -\NewDocElement[ - macrolike = false , - printtype = \textit{opt.} , -]{Option}{optiondesc} +\NewDocumentCommand\username{m}{`\texttt{#1}'} + +\setlength{\marginparsep}{2\labelsep} \lstdefinestyle{code}{ language=[LaTeX]TeX, @@ -283,6 +279,24 @@ options. Language independent default values are provided for the But, if you need to adjust them, the default values can be overridden by setting the corresponding options in \cs{zvLanguageSetup}. +\begin{function}{\zvhyperlink} + \begin{syntax} + \cs{zvhyperlink}\marg{text} + \end{syntax} +\end{function} + +Inside the options of \cs{zvLanguageSetup}, and also inside the \opt{vcurrent} +and \opt{vother} options of \pkg{zref-vario}'s reference commands, +\cs{zvhyperlink} can be used to produce a hyperlink to the label of the +reference. For example, one could set \texttt{reftextafter=\{on the + \cs{zvhyperlink}\{next page\}\}} to get ``next page'' hyperlinked. +\cs{zvhyperlink} can be used regardless of \opt{hyperref} being enabled for +\pkg{zref-clever}, it will just pass on the \meta{text} argument if it is not. +On range reference commands, \cs{zvhyperlink} only produces a link when both +labels fall on the same page, in which case it hyperlinks to the first label. + +\bigskip{} + As far as \pkg{zref-vario} is concerned, \pkg{varioref}'s options are (mostly) not taken into account: the language options are disregarded (settings made with \cs{zvLanguageSetup} are used instead), the \opt{nospace} option is diff --git a/macros/luatex/generic/blopentype/DEPENDS.txt b/macros/luatex/generic/blopentype/DEPENDS.txt new file mode 100644 index 0000000000..46b92da95b --- /dev/null +++ b/macros/luatex/generic/blopentype/DEPENDS.txt @@ -0,0 +1,4 @@ +# Basic LuaTeX OpenType handler dependencies +texapi +yax +gates diff --git a/macros/luatex/generic/blopentype/README.md b/macros/luatex/generic/blopentype/README.md new file mode 100644 index 0000000000..fe78625760 --- /dev/null +++ b/macros/luatex/generic/blopentype/README.md @@ -0,0 +1,37 @@ +# blopentype +Basic LuaTeX OpenType Handler + +# Description + +In his terse documentation for `PiTeX`, Paul Isambert lists, among the "mandatory PiTeX" files, the following: + +| file name | Description | +|-|-| +| fonts.ptx | Interface for fonts; relies on the next file. | +| fonts.ptxlua | The Lua fontloader; should become independant some day. | +| foundry-settings.lua | Default settings for the fontloader. | + +Well: the day has come, and the fontloader has now become `blopentype`: a *Basic LuaTeX OpenType Handler*. + +The basic code is copied almost verbatim from Isambert's `PiTeX`, save the adoption of the filename extensions `ltm` for *LuaTeX macros*, `lts` for *LuaTeX scripts*, and `blot-sets.lua` for the basic basic settings. +The required dependencies are Isambert packages [texapi](https://ctan.org/pkg/texapi), [YaX](https://ctan.org/pkg/yax) and [Gates](https://ctan.org/pkg/gates), as stated in `DEPENDS.txt`. + +You may find an example of usage in the `blottest.[tex|pdf]` files, and some basic documentation in `blopentype.md`. + +# Bugs and caveats + +The macros are still barely documented, and massively keep the names of their parent (`PiTeX`) package; that may be fixed some day. + +The font database is loaded at `$HOME/texmf/luatex/foundry/readable.txt`; it is not updated automatically after installing new fonts: you have to edit it manually, or else delete/rename(backup) it and rerun LuaTeX to rebuild it. + +The character table for each typeface is stored in the `luatex/foundry` directory as a flat `lua` file; it would be nice to have it compiled as a `luac` file to save some space. + +Good luck, and happy LuaTeXing + +# Authors + +Version 0.0 (C) 2022 Paul Isambert (massively) and Luis Rivera (minor surgeon; or rather: kludger). + +LaTeX Project Public License, LPPL Version 1.3c 2008-05-04 or MIT License + +December 28, 2022
\ No newline at end of file diff --git a/macros/luatex/generic/blopentype/blopentype.md b/macros/luatex/generic/blopentype/blopentype.md new file mode 100644 index 0000000000..a30c1e2499 --- /dev/null +++ b/macros/luatex/generic/blopentype/blopentype.md @@ -0,0 +1,142 @@ +# Basic LuaTeX OpenType Handler Minimal User Guide + +As for version 0.0 December 2022 + +Fonts (fonts.ltm and fonts.lts) +================================== + +The fontloader uses gates, but only superficially. They won't be +documented here. + +To load a given font, you define it in YaX syntax with the `\setfont` command. + +```\setfont <command>:<attributes>``` + +Sets <command> to call the font described in <attributes>; all defaults +to the values of the `metafont` parameter. If `<command>` is `\mainfont`, +as the name of the main font for the document, the font is called at once; +any other `\command` requires explicit calls. + +You may thing of `\setfont <command>` as similar to DEKTeX's `\font\cmr10 at 12pt` +or whatever font definition, but now the call is to an array of font attributes. + +`name` +The family name of the font; e.g. Palatino Linotype for the main text of +this document. + +`size (dimension)` +The size of the font. + +`small (dimension)` +The size of the font when \small is called. Can be a relative value by +prefixing it with "-" or "+", in which case it is set relative to ?size. + +`verysmall (dimension)` +The size (possibly relative) for \verysmall. + +`big (dimension)` +The size (possibly relative) for \big. + +`verybig (dimension)` +The size (possibly relative) for \verybig. + +`bold (font modifier)` +The modifier used for the bold version of the font, without the leading slash; +!metafont sets it to "Bold". + +`italic (font modifier)` +Same as !bold for the italic version; set to "Italic" by !metafont. + +`math (true or false)` +If true, math fonts will be created. + +`features` +Well, err, font features... + +`slant (angle)` +The slant applied to the font to create a fake italic. + +`slantsc (angle)` +The slant applied to the font to create fake italic smallcaps; if not +given, defaults to ?slant. + +There's actually much more going under the hood, but "font.ptxlua" (the +font loader itself) is a work in progress, and undocumented. + +# Font change commands + +The same macros as in plain TeX can be used, except they're cumulative, +i.e. "\it\bf" switches to a bold italic. +`<text>` in the specification should be group delimited with braces. + +`\it` +Switches to italics. + +`\rm` +Switches to roman. + +`\bf` +Switches to bold. + +`\rg` +Switches to regular weight. + +`\sc` +Switches to small capitals. + +`\lc` +Switches to lower case (i.e. not small caps). + +`\ital <text>` +Typesets <text> in italics. + +`\bold <text>` +Typesets <text> in bold. + +`\scap <text>` +Typesets <text> in small caps. + +`\rom <text>` +Typesets <text> in roman. + +`\emph <text>` +Typesets <text> in italics or roman, depending on whether the current +font is roman or italics, respectively. + +`\underline <text>` +Underlines <text>. Wow. + +`\small` +Switches to small font. + +`\verysmall` +Switches to very small font. + +`\big` +Switches to big font. + +`\verybig` +Got it? + +`\normalsize` +Switches to default size. + +`\smaller` +Switches to the font smaller than the current one (e.g. \normalsize if +you're currently using \big). + +`\bigger` +Same as \smaller, the other way around. + +`\color <color><text>` +Typesets <text> with <color>, which should be a triplet "R G B" with +each value between 0 and 1. + +# See also + +Documentation for [YaX](https://ctan.org/pkg/yax) for the YaX syntax to set up the fonts. + +Good luck and happy LuaTeXing, + +Luis Rivera + diff --git a/macros/luatex/generic/blopentype/blottest.pdf b/macros/luatex/generic/blopentype/blottest.pdf Binary files differnew file mode 100644 index 0000000000..e7ce0ec10f --- /dev/null +++ b/macros/luatex/generic/blopentype/blottest.pdf diff --git a/macros/luatex/generic/blopentype/blottest.tex b/macros/luatex/generic/blopentype/blottest.tex new file mode 100644 index 0000000000..83d93d5547 --- /dev/null +++ b/macros/luatex/generic/blopentype/blottest.tex @@ -0,0 +1,82 @@ +\input blot +\pdfpageheight 12 true in +\vsize10in + +\hsize6.5in +\footline{} + +\setfont\mainfont : + name = "Palatino Linotype" + size = 12pt + big = +2pt + +\baselineskip=1.5\baselineskip + +\patterns{1Ï„} + +\bf Two statements by Lincoln + +\rg + +Address delivered at the dedication of the cemetery at Gettysburg. + +November 19, 1863. + +Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal. + +Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. + +But, in a larger sense, we can not dedicate—we can not consecrate—we can not hallow—this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us—that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion—that we here highly resolve that these dead shall not have died in vain—that this nation, under God, shall have a new birth of freedom—and that government of the people, by the people, for the people, shall not perish from the earth. + +—Abraham Lincoln + +\vskip\baselineskip + +Executive Mansion, + +Washington, Nov. 21, 1864. + +Dear Madam, + +I have been shown in the files of the War Department a statement of the Adjutant General of Massachusetts that you are the mother of five sons who have died gloriously on the field of battle. + +I feel how weak and fruitless must be any words of mine which should attempt to beguile you from the grief of a loss so overwhelming. But I cannot refrain from tendering to you the consolation that may be found in the thanks of the Republic they died to save. + +I pray that our Heavenly Father may assuage the anguish of your bereavement, and leave you only the cherished memory of the loved and lost, and the solemn pride that must be yours to have laid so costly a sacrifice upon the altar of Freedom. + +Yours, very sincerely and respectfully, + +A. Lincoln. + +Mrs. [Lydia Parker] Bixby. + +[Boston, MA] + +\vskip\baselineskip + +% \vfill\break + +\bf Some sound advice from Marcus Aurelius's \emph{Ï„á½° Ï€Ïός σεαυτόν}. + +\rg +ὠτί ποτε τοῦτό εἰμι, σαÏκία á¼ÏƒÏ„ὶ καὶ πνευμάτιον καὶ τὸ ἡγεμονικόν. τῶν μὲν σαÏκίων καταφÏόνησον˙ λÏθÏος καὶ ὀστάÏια καὶ κÏοκÏφαντος, á¼Îº νεÏÏων, φλεβίων, á¼€ÏτηÏιῶν πλεγμάτιον. θÎασαι δὲ καὶ τὸ πνεῦμα á½Ï€Î¿á¿–όν τί á¼ÏƒÏ„ιν˙ ἄνεμος, οá½Î´á½² ἀεὶ τὸ αá½Ï„ÏŒ, ἀλλὰ πάσης á½¥Ïας á¼Î¾ÎµÎ¼Î¿Ïμενον καὶ πάλιν ῥοφοÏμενον. Ï„Ïίτον οὖν á¼ÏƒÏ„ι τὸ ἡγεμονικόν. \emph{ἄφες Ï„á½° βιβλία}Ë™ μηκÎτι σπῶ˙ οὠδÎδοται. ἀλλ ὡς ἤδη ἀποθνῄσκων ὧδε á¼Ï€Î¹Î½Î¿Î®Î¸Î·Ï„ι˙ γÎÏων εἶ˙ μηκÎτι τοῦτο á¼Î¬Ïƒá¿ƒÏ‚ δουλεῦσαι, μηκÎτι καθ á½Ïμὴν ἀκοινώνητον νευÏοσπαστηθῆναι, μηκÎτι τὸ εἱμαÏμÎνον á¼¢ παÏὸν δυσχεÏᾶναι á¼¢ μÎλλον ὑπιδÎσθαι. + +Τὰ τῶν θεῶν Ï€Ïονοίας μεστά. Ï„á½° τῆς Ï„Ïχης οá½Îº ἄνευ φÏσεως á¼¢ συγκλώσεως καὶ á¼Ï€Î¹Ï€Î»Î¿Îºá¿†Ï‚ τῶν Ï€Ïονοίᾳ διοικουμÎνων. πάντα á¼ÎºÎµá¿–θεν ῥεῖ˙ Ï€Ïόσεστι δὲ τὸ ἀναγκαῖον καὶ τὸ Ï„á¿· ὅλῳ κόσμῳ συμφÎÏον, οǷ μÎÏος εἶ. παντὶ δὲ φÏσεως μÎÏει ἀγαθόν, ὃ φÎÏει ἡ τοῦ ὅλου φÏσις καὶ ὃ á¼ÎºÎµÎ¯Î½Î·Ï‚ á¼ÏƒÏ„ὶ σωστικόν. σῴζουσι δὲ κόσμον, á½¥ÏƒÏ€ÎµÏ Î±á¼± τῶν στοιχείων, οὕτως καὶ αἱ τῶν συγκÏιμάτων μεταβολαί. \emph{ταῦτά σοι á¼€Ïκείτω˙ ἀεὶ δόγματα ἔστω. τὴν δὲ τῶν βιβλίων δίψαν ῥῖψον, ἵνα μὴ γογγÏζων ἀποθάνῃς, ἀλλὰ ἵλεως ἀληθῶς καὶ ἀπὸ καÏδίας εá½Ï‡Î¬Ïιστος τοῖς θεοῖς}. + +\vskip\baselineskip + +\it In case that was all Greek to you, then rather read: + +\rm + +Кио айн ми финфине еÑтаÑ, ми конÑиÑÑ‚Ð°Ñ Ð´Ðµ карно, ла Ñпиро кай ла анимо. \emph{Форĵету виайн либройн}. Ðе еÑту диÑтрата - тио не еÑÑ‚Ð°Ñ Ð¿ÐµÑ€Ð¼ÐµÑата; Ñед квазаŠви Ñм мортаÑ, абомену ла карнон. Ĝи еÑÑ‚Ð°Ñ Ð½ÐµÐ½Ð¸Ð¾ кром Ñанго, оÑтетой кай рето де нервой, артериой кай вейной. ПрипенÑу анкаŠла Ñпирон. Киа материо еÑÑ‚Ð°Ñ Äи? Ðеро, киу не ĉиам еÑÑ‚Ð°Ñ Ð»Ð° Ñама, Ñед дум уну моменто еÑÑ‚Ð°Ñ Ð²Ð¾Ð¼Ð°Ñ‚Ð° кай инÑпирата. До ла триан атентигу, ла анимон. Компрену, ке ви еÑÑ‚Ð°Ñ Ð¾Ð»Ð´ÑƒÐ»Ð¾. Екде нун ви нек аллаÑу, ке виа анимо фариÄÐ°Ñ Ñлавон, нек аллаÑу, ке ви каптиÄÐ°Ñ Ð´Ðµ контраÅÑоциай атакой, нек Ñуферу де виа цирцумÑтанцаро нек тиму ла еÑтонтецон. + +Кио Ð´ÐµÐ²ÐµÐ½Ð°Ñ Ð´Ðµ ла диой, Ð¿Ð»ÐµÐ½Ð°Ñ Ñ Ð¿Ñ€Ð¾Ð²Ð¸Ð´ÐµÐ½Ñ†Ð¾. Кио Ð´ÐµÐ²ÐµÐ½Ð°Ñ Ð´Ðµ Åанцо еÑÑ‚Ð°Ñ Ð¿Ð°Ñ€Ñ‚Ð¾ де натуро кай интертекÑÐ°Ñ‚Ð°Ñ ÐºÑƒÐ½ тиой, киой Ð´ÐµÐ²ÐµÐ½Ð°Ñ Ð´Ðµ провиденцо. Де провиденцо Ñ„Ð»ÑƒÐ°Ñ Ä‰Ð¸Ð¾Ð¹. Ĉиой екзиÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾ утило кай про тио, ке Äи еÑÑ‚Ð°Ñ Ð¿Ð»ÐµÐ¹ бона пор ла универÑо, де киу ви еÑÑ‚Ð°Ñ Ð¿Ð°Ñ€Ñ‚Ð¾. Кио еÑÑ‚Ð°Ñ Ð±Ð¾Ð½Ð° пор ла тута универÑо, кай кио ÑÑƒÐ±Ñ‚ÐµÐ½Ð°Ñ Ð»Ð° натурон де ла универÑо, анкаŠеÑÑ‚Ð°Ñ Ð±Ð¾Ð½Ð° пор парто де ла универÑо. \emph{ЕÑту контента кун тиуй макÑимой. Сед ĉеÑу Ñоифи пор либрой пор ке ви алвену мортон не мурмуранте Ñед вере, транквиле кай данкеме ал ла диой ел виа анимо}. + +\bye + +Kio ajn mi finfine estas, mi konsistas de karno, la spiro kaj la animo. \emph{Forĵetu viajn librojn}. Ne estu distrata - tio ne estas permesata; sed kvazaÅ vi jam mortas, abomenu la karnon. Äœi estas nenio krom sango, ostetoj kaj reto de nervoj, arterioj kaj vejnoj. Pripensu ankaÅ la spiron. Kia materio estas Äi? Aero, kiu ne ĉiam estas la sama, sed dum unu momento estas vomata kaj inspirata. Do la trian atentigu, la animon. Komprenu, ke vi estas oldulo. Ekde nun vi nek allasu, ke via animo fariÄas slavon, nek allasu, ke vi kaptiÄas de kontraÅsociaj atakoj, nek suferu de via circumstancaro nek timu la estontecon. + +Kio devenas de la dioj, plenas je providenco. Kio devenas de Åanco estas parto de naturo kaj interteksatas kun tioj, kioj devenas de providenco. De providenco fluas ĉioj. Ĉioj ekzistas pro utilo kaj pro tio, ke Äi estas plej bona por la universo, de kiu vi estas parto. Kio estas bona por la tuta universo, kaj kio subtenas la naturon de la universo, ankaÅ estas bona por parto de la universo. \emph{Estu kontenta kun tiuj maksimoj. Sed ĉesu soifi por libroj por ke vi alvenu morton ne murmurante sed vere, trankvile kaj dankeme al la dioj el via animo}. + +\bye
\ No newline at end of file diff --git a/macros/luatex/generic/blopentype/luatex/blot-base.lts b/macros/luatex/generic/blopentype/luatex/blot-base.lts new file mode 100644 index 0000000000..ef933ee088 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-base.lts @@ -0,0 +1,88 @@ +require"gates.lua" + +pitex = gates.new("pitex") +pitex.misc = gates.new("pitex.misc") + +function pitex.log (message, ...) + texio.write_nl(string.format("\n" .. message .. "\n", ...)) +end +function pitex.error (...) + tex.error ("! PiTeX error: " .. string.format(...) .. ".") +end + +pitex.callback = gates.new("pitex.callback") + +-- Creates a gate with a callback's name and put it in that callback, if not +-- already there. Adds the subgate(s). +function pitex.callback.register (c, f) + if pitex.callback.type(c) == 2 then + pitex.callback.add(f, c) + else + pitex.callback.list{c} + pitex.callback.add(f, c) + callback.register(c, pitex.callback.execute[c]) + end +end + +-- Latin1 to UTF-8. +local char = unicode.utf8.char +local function convert_char (ch) +-- return char(string.byte(ch)) +end +function pitex.callback.convert (buf) + return string.gsub(buf,".",convert_char) +end + +pitex.callback.register("process_input_buffer", "convert") + +function remove_conversion () + pitex.callback.close("convert", "process_input_buffer") +end +function restore_conversion () + pitex.callback.open("convert", "process_input_buffer") +end + +--[[ + +require("nodeinspector") +new_inspection = nodeinspector.new_inspection + +local french_highmarks = { + string.byte("?"), + string.byte("!"), + string.byte(":"), + string.byte(";"), + } +local french_marks = { + string.byte("?"), + string.byte("!"), + string.byte(":"), + string.byte(";"), + string.byte(","), + string.byte("."), + string.byte("("), + string.byte("["), + string.byte("{"), + } + +local function french_punctuation (head, ...) + for _, glue in ipairs(arg) do + if glue.id == 10 then + head = node.remove(head, glue) + node.free(glue) + end + end + local kern = node.new(11, 1) + kern.kern = tex.sp(".15em") + node.insert_after(head, arg[1], kern) +end + +pitex.callback.french_punctuation = new_inspection( + french_punctuation, + {{id = 37, _char = french_marks}, {true, id = 37, char = french_highmarks}}, + {{id = 10, subtype = 0}, {id = 11, subtype = 0}}) + +pitex.callback.register("kerning", "french_punctuation") +pitex.callback.original_kerning = node.kerning +pitex.callback.register("kerning", "original_kerning") +--]]
\ No newline at end of file diff --git a/macros/luatex/generic/blopentype/luatex/blot-files.ltm b/macros/luatex/generic/blopentype/luatex/blot-files.ltm new file mode 100644 index 0000000000..212b05fc07 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-files.ltm @@ -0,0 +1,39 @@ +\newread\ptx@temp_read +\def\iffile{% + \ifnext[ + {\ptx@iffile} + {\ptx@iffile[]}% + } +\def\ptx@iffile[#1]#2{% + \directlua{ + local f = kpse.find_file("\luaescapestring{#2}"\reverse\iffemptystring{#1}{, "#1"}) + local x = f and "firstoftwo" or "secondoftwo" + tex.print(\the\texcatcodes, "\noexpand\\" .. x) + }% + } +\long\def\ifffile{% + \ifnext[ + {\ptx@ifffile} + {\ptx@ifffile[]}% + } +\long\def\ptx@ifffile[#1]#2#3{% + \iffile[#1]{#2}{#3}{}% + } + +\long\def\inputfileor{% + \ifnext[ + {\ptx@inputfileor} + {\ptx@inputfileor[]}% + } +\long\def\ptx@inputfileor[#1]#2{% + \iffile[#1]{#2}{\input{#2}\relax}% + } + +\newwrite\ptx@auxfile +\def\ptx@write_toaux{% + \ifnext* + {\gobbleoneand{\write\ptx@auxfile}} + {\immediate\write\ptx@auxfile}% + } + +\let\writeout\ptx@write_toaux diff --git a/macros/luatex/generic/blopentype/luatex/blot-fonts.ltm b/macros/luatex/generic/blopentype/luatex/blot-fonts.ltm new file mode 100644 index 0000000000..8ef6e4f328 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-fonts.ltm @@ -0,0 +1,308 @@ +\inputltsfile blot-fonts.lts +\pdfadjustspacing=2 + +\def\currentfont{} +\def\currentsize{normal} +\def\currentstyle{rm} +\def\currentweight{rg} +\def\currentcase{lc} +\def\makecurrentfont{% + \csname\currentfont @\currentsize @\currentstyle @\currentweight @\currentcase\endcsname + } +\def\normalsize{% + \def\currentsize{normal}% + \makecurrentfont + } +\def\small{% + \def\currentsize{small}% + \makecurrentfont + } +\def\verysmall{% + \def\currentsize{verysmall}% + \makecurrentfont + } +\def\smaller{% + \passexpanded\ifstring\currentsize{normal}% + {\def\currentsize{small}} + {\def\currentsize{verysmall}} + \makecurrentfont + } +\def\big{% + \def\currentsize{big}% + \makecurrentfont + } +\def\verybig{% + \def\currentsize{verybig}% + \makecurrentfont + } +\def\bigger{% + \passexpanded\ifstring\currentsize{normal}% + {\def\currentsize{big}} + {\def\currentsize{verybig}} + \makecurrentfont + } +\def\it{% + \def\currentstyle{it}% + \makecurrentfont + } +\def\rm{% + \def\currentstyle{rm}% + \makecurrentfont + } +\def\rmstring{rm} +\def\emph{% + \ifx\currentstyle\rmstring + \expandafter\ital + \else + \expandafter\rom + \fi + } +\def\bf{% + \def\currentweight{bf}% + \makecurrentfont + } +%\def\normalweight{% +\def\rg{% + \def\currentweight{rg}% + \makecurrentfont + } +\def\sc{% + \def\currentcase{sc}% + \makecurrentfont + } +%\def\normalcase{% +\def\lc{% + \def\currentcase{lc}% + \makecurrentfont + } +\freedef\ital{{\it#1}} +\freedef\bold{{\bf#1}} +\freedef\scap{{\sc#1}} +\freedef\rom{{\rm#1}} + + +\restrictparameter font : + command % The command to be used to switch to that font. + name % Actually the part common to all files' names for that font. + size % Well, the size. + small % Smaller size. + verysmall % Smaller yet. + big % Bigger. + verybig % Insanely big. + bold % Modifier for bold font. + italic % Modifier for italic font. + math % If set to "true", then used for math font. + % small, verysmall and italic should be specified + % (which shows I don't use it very often). + features % Font features (e.g. +onum, etc.). + slant % A number representing an angle, loading an italic + % font if no real italic is a available. + slantsc % The same, for small caps. + +% The font parameter should disappear some day, it's clumsy. +\def\setfont#1:{% + \setparameter font : command = #1% + } + +\setparameter metafont : % No relation :) + size = 10pt + bold = Bold + italic = Italic + features = "+onum; +liga; +trep; +tlig; expansion=30 20 5;" + +\setparameter font : + meta = metafont + +\newdimen\ptx@fontsize +\luacode +ptx_fonts = {} +function ptx_getfont(Font, ...) + if ptx_fonts[Font] then + local tempfont = ptx_fonts[Font] + for _, style in ipairs(arg) do + if ptx_getstyle[style] then + tempfont = tempfont:gsub("(%w+)@(%w+)@(%w+)@(%w+)@(%w+)",ptx_getstyle[style]) + else + tempfont = nil + texio.write_nl("! PiTeX error: Unknown font style `style'.") + return Font + end + end + return font.id(tempfont) + else + texio.write_nl("! PiTeX error: " .. Font .. " is not a PiTeX font. It can't be changed.") + end +end +ptx_getstyle = { + normal = "%1@normal@%3@%4@%5", + small = "%1@small@%3@%4@%5", + verysmall = "%1@verysmall@%3@%4@%5", + big = "%1@big@%3@%4@%5", + verybig = "%1@verybig@%3@%4@%5", + rm = "%1@%2@rm@%4@%5", + it = "%1@%2@it@%4@%5", + rg = "%1@%2@%3@rg@%5", + bf = "%1@%2@%3@bf@%5", + lc = "%1@%2@%3@%4@lc", + sc = "%1@%2@%3@%4@sc" + } +\luacode/ + +\newstring{+} \newstring{-} +\def\ptx@dofont#1#2#3#4#5{% + \edef\ptx@temp{\passvaluenobraces\commandtoname font : command }% + \ifexpression{ -\ifstring{#4}{normal} & { \ifprefix-{#5} | \ifprefix+{#5} } } + {\def\ptx@dofont_size{\dimexpr\usevalue font : size + #5\relax}} + {\def\ptx@dofont_size{#5}}% + \ptx@dofont_load{\ptx@temp @#4@#1@#2@lc}{#3}{}{\ptx@dofont_size}% + \ifstring{#1}{rm} + {\ptx@dofont_load{\ptx@temp @#4@#1@#2@sc}{#3}{+smcp;}{\ptx@dofont_size}% + \ifattribute font : slant % Loading a slanted version of the font if no italic was given + {\ptx@dofont_load{\ptx@temp @#4@it@#2@lc}{#3}{slant=\usevalue font: slant ;}{\ptx@dofont_size} + \ifattribute font : slantsc {} + {\ptx@dofont_load{\ptx@temp @#4@it@#2@sc}{#3}{+smcp;slant=\usevalue font: slant ;}{\ptx@dofont_size}}}{}% + \ifattribute font : slantsc + {\ptx@dofont_load{\ptx@temp @#4@it@#2@sc}{#3}{+smcp;slant=\usevalue font: slantsc ;}{\ptx@dofont_size}}{}}% + {\ifattribute font : slantsc {}{\ptx@dofont_load{\ptx@temp @#4@it@#2@sc}{#3}{+smcp;}{\ptx@dofont_size}}} + } + +\def\ptx@dofont_load#1#2#3#4{% + \passcs\font{#1}="\usevalue font : name #2:#3\usevalue font : features " at #4\relax + \ptx@lua{ptx_fonts[font.id("#1")] = "#1"}% + } + + + +\def\dofont#1#2#3{% + \passvalue{\ptx@dofont{#1}{#2}{#3}{normal}} font : size + \passvalue{\ptx@dofont{#1}{#2}{#3}{small}} font : small + \passvalue{\ptx@dofont{#1}{#2}{#3}{verysmall}} font : verysmall + \passvalue{\ptx@dofont{#1}{#2}{#3}{big}} font : big + \passvalue{\ptx@dofont{#1}{#2}{#3}{verybig}} font : verybig +% + \ifvalue font : math = true + {\ifstring{#1#2}{rmrg} + {\passcs{\textfont0=}{\passvalue\commandtoname font : command @normal@#1@#2@lc}% + \passcs{\scriptfont0=}{\passvalue\commandtoname font : command @small@#1@#2@lc}% + \passcs{\scriptscriptfont0=}{\passvalue\commandtoname font : command @verysmall@#1@#2@lc} + \passcs{\textfont2=}{\passvalue\commandtoname font : command @normal@#1@#2@lc}% + \passcs{\scriptfont2=}{\passvalue\commandtoname font : command @small@#1@#2@lc}% + \passcs{\scriptscriptfont2=}{\passvalue\commandtoname font : command @verysmall@#1@#2@lc}} + {\iffstring{#1#2}{itrg} + {\passcs{\textfont1=}{\passvalue\commandtoname font : command @normal@#1@#2@lc}% + \passcs{\scriptfont1=}{\passvalue\commandtoname font : command @verysmall@#1@#2@lc}% + \passcs{\scriptscriptfont1=}{\passvalue\commandtoname font : command @verysmall@#1@#2@lc}}}% + }{}% + } + +\gates new \FontLoader {FontLoader} +\FontLoader list {fontloader} + [fl_command] + {% + \passvaluenobraces\edef font : command {% + \def\noexpand\currentfont{\passvalue\commandtoname font : command }% + \noexpand\makecurrentfont}} + (fl_load) + . ( fl_roman ) + . . [ fl_doromanregular ] + {\dofont{rm}{rg}{}} + . . [ fl_doromanbold ] ? {conditional = -\ifvalue font : bold = none } + {\dofont{rm}{bf}{/\usevalue font : bold }} + . ( fl_italic ) ? {conditional = -\ifvalue font : italic = none } + . . [ fl_doitalicregular ] + {\dofont{it}{rg}{/\usevalue font : italic }} + . . [ fl_doitalicbold ] ? {conditional = -\ifvalue font : bold = none } + {\dofont{it}{bf}{/\usevalue font : italic /\usevalue font : bold }} + [fl_use] ? {conditional = \ifvalue font : command = {\mainfont} } + {\mainfont} + (fl_post) + . [fl_delete] + {\deleteparameter font:} + . [fl_meta] + {\setattribute font : meta = metafont } + +\defactiveparameter font {% + \FontLoader execute {fontloader}% + } + + + + + + + +\long\def\color#1#2{% + \pdfcolorstack0 push {#1 rg #1 RG}% + #2% + \pdfcolorstack0 pop% + } + +\newattribute\ptx@underline_attribute +\luacode +local do_underline = function (head,order,ratio,sign) + local item, leader = head, false + while item do + leader = false + if node.has_attribute(item,\attributenumber\ptx@underline_attribute) + and not (item.id == 10 and (item.subtype == 8 or item.subtype == 9)) then + local item_line = node.new(2) + item_line.depth = tex.sp("1.4pt") + item_line.height = tex.sp("-1pt") + if node.has_field(item,"spec") then + item_line.width = item.spec.width + if order == 0 then + if sign == 1 then + item_line.width = item_line.width + ratio * item.spec.stretch + else + item_line.width = item_line.width - ratio * item.spec.shrink + end + else + if item.spec.stretch_order > 0 or item.spec.shrink_order > 0 then + lualog(item.spec.stretch_order) + item_line.width = 1 + item.subtype = 100 + item.leader = item_line + leader = true + end + end + elseif node.has_field(item,"width") then + item_line.width = item.width + elseif node.has_field(item,"kern") then + item_line.width = item.kern + end + if leader then + item = item.next + else + local item_kern = node.new(11) + item_kern.kern = -item_line.width + node.insert_after(head,item,item_line) + node.insert_after(head,item,item_kern) + item = item_line.next + end + else + item = item.next + end + end +end +pitex.misc.underline = function (head) + for line in node.traverse_id(0,head) do + do_underline(line.list,line.glue_order,line.glue_set,line.glue_sign) + end + return head +end +pitex.callback.register("post_linebreak_filter", "pitex.misc:underline") +pitex.callback.close("pitex.misc:underline", "post_linebreak_filter") +\luacode/ + +\freedef\underline{% + \ptx@lua{% + pitex.callback.ajar("pitex:underline", "post_linebreak_filter") + } +% local plf = callback.list_functions("post_linebreak_filter") +% if not plf or not plf["underline"] then +% callback.add_function(underline, "underline", "post_linebreak_filter") +% end}% + \quitvmode % Otherwise it might also underline the indentation box. + \ptx@underline_attribute=0\relax + #1\unsetattribute\ptx@underline_attribute + } diff --git a/macros/luatex/generic/blopentype/luatex/blot-fonts.lts b/macros/luatex/generic/blopentype/luatex/blot-fonts.lts new file mode 100644 index 0000000000..638f83e984 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-fonts.lts @@ -0,0 +1,1213 @@ +-- *** UTILITY FUNCTIONS *** +local function get_locals (tab) + local tb = {} + for lib, keys in pairs(tab) do + keys = string.explode(keys) + for _, k in ipairs(keys) do + tb[k] = _G[lib][k] + end + end + return tb +end + +-- str +-- string manipulation +local str = get_locals {string = "explode gsub match format lower upper"} + +-- Removes space at the beginning and end and conflates multiple spaces. +function str.trim (s) + s = str.match(s, "^%s*(.-)%s*$") + s = str.gsub(s, "%s+", " ") + return s +end + +-- Extracts a pattern from a string, i.e. removes it and returns it. +-- If "full", then the entire pattern is removed, not only the captures. +function str.extract (s, pat, full) + local cap = str.match(s, pat) + if cap then + if full then + s = str.gsub(s, pat, "") + else + s = str.gsub(s, cap, "") + end + end + return cap, s +end +-- /str + + +-- lp +-- advanced string manipulation +lpeg.locale(lpeg) +local lp = get_locals {lpeg = "match P C S Ct V alnum"} +lp.space = lpeg.space^0 +-- /lp + + +-- tab +-- table manipulation +local tab = get_locals {table = "insert remove sort"} + +-- Adds val to tab, creating it if necessary. +function tab.update (tb, val) + tb = tb or {} + tab.insert(tb, val) + return tb +end + +-- Adds subtable (empty, or val) to tb at entry key, unless it already exists. +function tab.subtable (tb, key, val) + tb[key] = tb[key] or val or {} +end + +-- Writes a table to an extenal file. +local function write_key (key, ind) + return ind .. '["' .. key .. '"] = ' +end + +function tab.write (tb, f, ind) + for a, b in pairs (tb) do + if type(a) == "string" then + a = '"' .. a .. '"' + end + a = "[" .. a .. "]" + if type(b) == "table" then + f:write(ind, a, " = {") + tab.write(b, f, ind .. " ") + f:write(ind, "},") + else + if type(b) == "boolean" then + b = b and "true" or "false" + elseif type(b) == "string" then + b = '"' .. b .. '"' + end + f:write(ind, a, " = ", b, ",") + end + end +end + +-- Returns a full copy of a table. Not copying of metatables necessary for the +-- moment. +function tab.copy (tb) + local t = {} + for k, v in pairs (tb) do + if type(v) == "table" then + v = tab.copy(v) + end + t[k] = v + end + return t +end + +-- Sorts two tables containing modifiers (Italic, etc.). +function tab.sortmods (a, b) + local A, B = "", "" + for _, x in ipairs (a) do + A = A .. " " .. x + end + for _, x in ipairs (b) do + B = B .. " " .. x + end + return A < B +end + +-- Turns an array into a hash. +function tab.tohash(tb) + local t = {} + for _, k in ipairs(tb) do + t[k] = true + end + return t +end +-- /tab + +-- lfs +-- files etc. +local lfs = get_locals {lfs = "dir isdir isfile mkdir", kpse = "expand_var show_path find_file"} + +-- Returns anything after the last dot, i.e. an extension. +function lfs.extension (s) + return str.lower(str.match(s, "%.([^%.]*)$")) +end + +local extensions = { + otf = "opentype", + ttf = "truetype", + ttc = "truetype", +} +function lfs.type (s) + return extensions[lfs.extension(s)] +end + +local kpse_extensions = { + otf = "opentype fonts", + ttf = "truetype fonts", + ttc = "truetype fonts", +} +function lfs.kpse (s) + return kpse_extensions[lfs.extension(s)] +end + +-- Returns anything after the last slash, i.e. a pathless file. +function lfs.nopath (f) + return str.match(f, "[^/]*$") +end + +-- Creates a directory; the arguments are the successive subdirectories. +function lfs.ensure_dir (...) + local arg, path = {...} + for _, d in ipairs(arg) do + if path then + path = path .. "/" .. d + else + path = d + end + path = str.gsub(path, "//", "/") + if not lfs.isdir(path) then + lfs.mkdir(path) + end + end + return path +end + +-- Turns "foo/blahblah/../" into "foo/" (such going into and leaving +-- directories happens with kpse). Also puts everything to lowercase. +function lfs.smooth_file (f) + f = str.gsub(f, "/.-/%.%./", "/") + f = str.gsub(f, "^%a", str.lower) + return f +end +-- /lfs + + +-- wri +-- messages +local wri, write_nl = {}, texio.write_nl + +function wri.report (s, ...) +-- write_nl(str.format(s, unpack(arg))) +end + +function wri.error (s, ...) +-- tex.error(str.format(s, unpack(arg))) +end +-- /wri + + +-- various +-- the last one is, of course, not the least +local io = get_locals {io = "open lines"} +local os = get_locals {os = "date"} +local num = get_locals {math = "abs tan rad floor pi", tex = "sp"} +local fl = get_locals {fontloader = "open close to_table info", font = "read_tfm"} +-- /various + + +-- *** END OF UTILITY FUNCTIONS *** + + + +--- *** CREATING THE LIBRARY *** --- +local settings +if lfs.find_file"blot-sets.lua" then + settings = require"blot-sets.lua" +else + settings = {normal = {}, features = {}} +end +local font_families = {} +local normal_names = {} +for _, name in ipairs(settings.normal) do + normal_names[name] = true +end +local local_path = lfs.expand_var("$TEXMFHOME") +local foundry_path = lfs.ensure_dir (local_path, "tex", "luatex", "foundry") +-- local local_path = lfs.expand_var("$TEXMFHOME") +-- local foundry_path = lfs.ensure_dir (local_path, "fonts", "truetype", "public", "gfs") +local library_file = foundry_path .. "/" .. "readable.txt" +-- local library_file = "c:/texlive/texmf-local/tex/plain/pitex/readable.txt" +-- local library_file = "readable.txt" + +-- Analyze a font file and return a name and a table +-- with modifiers. +local function extract_font (file, names) + local fi, subname + -- Trying to open a font in ttc, using the names returned by fontloader.info + if names then + local name = names.fullname + if name then + fi = fl.open (file, name) + end + if not fi then + name = names.fontname + if name then + fi = fl.open + end + if not fi then + fl.error("Can't open %s", file) + return + end + end + subname = name + else + fi = fl.open(file) + end + -- Getting the most precise information. Not necessarily the best + -- solution, but since the user can modify the library, it's not so bad. + local fam, name = fi.names[1].names.preffamilyname or fi.names[1].names.family or fi.familyname, fi.fontname + local spec = fi.names[1].names.prefmodifiers or fi.names[1].names.subfamily or "" + local subfam, _spec + local t = { [0] = file } + -- Removing mods like Regular, Book, etc. + for name in pairs(normal_names) do + spec = str.gsub(spec, name, "") + end + if subname then + tab.insert(t, "[font = " .. subname .. "]") + end + if spec ~= "" then + spec = str.explode(spec) + for _, s in ipairs(spec) do + tab.insert(t, s) + end + end + fl.close(fi) + return fam, t +end + +-- Searches directories for font files, and pass them to +-- extract_font. The fonts are collected in a table. +-- The fonts_done table is updated when the library is read, +-- so when a font is missing and one needs to recheck files, +-- only those that arent in the libraries are considered. +local fonts_done = {} +local function check_fonts (rep, tb) + for f in lfs.dir (rep) do + if f ~= "." and f ~= ".." then + f = str.gsub(rep, "/$", "") .. "/" .. f + if lfs.isdir(f) then + check_fonts(f, tb) + elseif lfs.isfile(f) and not fonts_done[lfs.nopath(f)] then + local e = lfs.extension(f) + if e == "ttf" or e == "otf" then + local fam, file = extract_font(f) + if fam then + tab.subtable(tb, fam) + tab.insert(tb[fam], file) + end + elseif e == "ttc" then + local info = fl.info(f) + for _, i in ipairs(info) do + local fam, file = extract_font(f, i) + if fam then + tab.subtable(tb, fam) + tab.insert(tb[fam], file) + end + end + end + end + end + end +end + +-- Writes the library to an external file. +-- Type is "a" if what's going on is recheck_fonts. +local function write_lib (fams, file, type) + local read_table = {} + for fam, tb in pairs(fams) do + tab.insert(read_table, fam) + for _, ttb in ipairs(tb) do + tab.sort(ttb) + end + tab.sort(tb, tab.sortmods) + end + tab.sort(read_table) + local readable = io.open(file, type) + for n, fam in ipairs(read_table) do + local log + if type == "a" then + log = true + if n == 1 then + wri.report("\nAdding new font(s):") + readable:write("\n\n% Added automatically " .. os.date() .. "\n\n") + end + wri.report(fam) + end + readable:write(fam .. " :") + for n, f in ipairs(fams[fam]) do + log = log and " " + readable:write("\n ") + for _, t in ipairs(f) do + log = log and log .. " " .. t + readable:write(" " .. t) + end + log = log and log .. " " .. '"' .. f[0] .. '"' + readable:write(" " .. '"' .. lfs.nopath(f[0]) .. '",') + if log then wri.report(log) end + if n == #fams[fam] then + readable:write("\n\n") + end + end + end + readable:close() +end + + +-- If there is no library, we create it. +local font_paths = lfs.show_path("opentype fonts") +font_paths = str.gsub(font_paths, "\\", "/") +font_paths = str.gsub(font_paths, "/+", "/") +font_paths = str.gsub(font_paths, "!!", "") +font_paths = str.explode(font_paths, ";+") + +if not lfs.find_file(library_file) then + wri.report("I must create the library; please wait, that can take some time.") + for _, rep in ipairs(font_paths) do + check_fonts(rep, font_families) + end + write_lib(font_families, library_file, "w") +end + +-- Reads the library file, turning it into a table. +local explode_semicolon = lp.P{ + lp.Ct(lp.V"data"^1), + data = lp.C(((1 - lp.S";[") + (lp.S"[" * (1 - lp.S"]")^0 * lp.S"]" ))^1) / str.trim * (lp.S";" + -1), + } +local explode_comma = lp.P{ + lp.Ct(lp.V"data"^1), + data = lp.C(((1 - lp.S",[") + (lp.S"[" * (1 - lp.S"]")^0 * lp.S"]" ))^1) / str.trim * (lp.S"," + -1), + } + +local function load_library (lib) + local LIB = "" + local lib_file = lfs.find_file(lib) + if not lib_file then + wri.error("I can't find library %s.", lib) + return + end + + for l in io.lines(lib_file) do + if not str.match(l, "^%s*%%") then + if str.match(l, "^%s*$") then + LIB = LIB .. ";" + else + LIB = LIB .. " " .. l + end + end + end + LIB = str.gsub(LIB, ";%s*;", ";;") + LIB = str.gsub(LIB, ";+", ";") + LIB = str.gsub(LIB, "^;", "") + LIB = str.gsub(LIB, "%s+", " ") + + LIB = lp.match(explode_semicolon, LIB) + + local newlib = {} + for _, t in ipairs(LIB) do + local fam, files = str.match(t, "(.-):(.*)") + local current_mods + if files then + files = lp.match(explode_comma, files) + fam = str.explode(fam, ",") + local root + for n, f in ipairs (fam) do + f = str.trim(f) + if n == 1 then + root = f + if type(newlib[f]) == "string" then + wri.error("Name `%s' is already used as an alias for `%s'; it is now overwritten to denote a family", f, newlib[f]) + newlib[f] = {} + else + newlib[f] = newlib[f] or {} + end + else + if newlib[f] then + wri.error("The name `%s' is already used. I ignore it as an alias for `%s'", f, root) + else + newlib[f] = root + end + end + end + for _, f in ipairs(files) do + local reset + reset, f = str.extract(f, "^%.%.", true) + if reset then current_mods = nil end + local mods, file, feats = str.match(f, '([^"]*)"(.*)"') + if mods then + fonts_done[lfs.nopath(file)] = true + feats, mods = str.extract(mods, "%[([^%]]-)]", true) + mods = str.explode(mods) + if current_mods then + for _, t in ipairs(current_mods) do + tab.insert(mods, t) + end + if current_mods.feats then + feats = feats or "" + feats = current_mods.feats .. "," .. feats + end + end + local sizes, real_mods = {}, {} + for n, s in ipairs(mods) do + if tonumber(s) then + tab.insert(sizes, tonumber(s)) + else + tab.insert(real_mods, s) + end + end + sizes = #sizes > 0 and sizes or {0} + tab.sort(real_mods) + local T = newlib[root] + for _, t in ipairs(real_mods) do + t = str.trim(t) + if t ~= "" then + T[t] = T[t] or {} + T = T[t] + end + end + T.__files = T.__files or {} + for _, s in ipairs(sizes) do + T.__files[s] = {str.trim(file), feats} + end + else + feats, mods = str.extract(f, "%[([^%]]-)]", true) + if current_mods then + for _, mod in ipairs(str.explode(mods)) do + tab.insert(current_mods, mod) + end + if feats then + current_mods.feats = current_mods.feats and current_mods.feats .. "," .. feats or feats + end + else + current_mods = str.explode(mods) + current_mods.feats = feats + end + end + end + end + end + return newlib +end + +local library = {} +library.default = load_library(library_file) + +-- Same as above, but used when rechecking (if a font isn't found in libraries). +local function recheck_fonts () + local tb = {} + for _, rep in ipairs(font_paths) do + check_fonts(rep, tb) + end + write_lib(tb, library_file, "a") + library.default = load_library(library_file) +end + + +-- This is public. +function new_library (lib) + local l = load_library(lib) + if l then + tab.insert(library, l) + end +end + +--- *** END OF LIBRARY MANAGEMENT *** --- + + + +--- *** FONT CREATION *** --- + + +-- Creates a new substitution for trep. +local function add_sub (f, num, sub) + num, sub = f.map.map[num], f.map.map[sub] + if f.glyphs[num] and f.glyphs[sub] then + local x = f.glyphs[num] + tab.subtable(x, "lookups") + x.lookups.tex_trep = { { type = "substitution", specification = {variant = f.glyphs[sub].name} } } + end +end + +-- Creates a new ligature for tlig. +local function add_lig (f, lig, ...) + lig = f.map.map[lig] + if lig then + arg = {...} + local components + for _, c in ipairs(arg) do + c = f.map.map[c] + c = c and f.glyphs[c] + if c then + c = c.name + components = components and components .. " " .. c or c + else + components = nil + break + end + end + if components then + local x = f.glyphs[lig] + tab.subtable(x, "lookups") + tab.subtable(x.lookups, "tex_tlig") + tab.insert(x.lookups.tex_tlig, { type = "ligature", + specification = {char = x.name, components = components} }) + end + end +end + +-- Loops over all the constitutents of ligatures, creating intermediary +-- ligatures if necessary. E.g. "f f i" is broken into: +-- f + f = ff.lig +-- ff.lig + i = ffi.lig +-- Then when loading the font if the intermediary ligatures do not exist +-- (e.g. "1/" in "1 / 4") a phantom character is added to the font; which might +-- be dangerous (e.g. "1/" will create a node without character if no "4" follows). +-- The ".lig" suffix is arbitrary but all glyphs marked as ligatures are also registered +-- with such a name, so if there's an "f f" ligature in a font, no matter its name, "ff.lig" +-- will point to it. +local function ligature (comp, tb, phantoms) + local i = str.gsub(comp[1], "%.lig$", "") .. comp[2] .. ".lig" + phantoms[i] = true + tab.insert(tb.all_ligs, i) + tab.subtable(tb, comp[1]) + tb[comp[1]][comp[2]] = { char = i, type = 0 } -- The type could be something else. + tab.remove(comp, 1) + tab.remove(comp, 1) + if #comp > 0 then + tab.insert(comp, 1, i) + ligature(comp, tb, phantoms) + end +end + +local function get_lookups (t, lookup_table) + if t then + for _, tb in pairs(t) do + local _tb = { tags = {} } + if tb.features then + for _, feats in pairs(tb.features) do + local _tag = {} + if feats.scripts then + for _, scr in pairs(feats.scripts) do + _tag[scr.script] = {} + for _, lang in pairs(scr.langs) do + tab.insert (_tag[scr.script], str.trim(lang)) + end + end + end + for _, sub in pairs(tb.subtables) do + tab.insert(_tb, sub.name) + end + _tb.tags[feats.tag] = _tag + end + end + if tb.name then + local tp = tb.type or "no_type" + tab.subtable(lookup_table, tp) + lookup_table[tp][tb.name] = _tb + end + end + end +end + +function create_font (filename, extension, path, subfont, write) + + local data = fl.open(filename, subfont) + fontfile = fl.to_table(data) + fl.close(data) + + local lookups = {} + + local name_touni = { } + local max_char = 0 + for chr, gly in pairs(fontfile.map.map) do + max_char = chr > max_char and chr or max_char + -- Some glyphs have the same name in some fonts, + -- e.g. the several hyphens. + local name = fontfile.glyphs[gly].name + while name_touni[name] do + name = name .. "_" + end + name_touni[name] = chr + end + + if fontfile.gsub then + tab.insert(fontfile.gsub, + { type = "gsub_single", + name = "tex_trep", + subtables = { {name = "tex_trep"} }, + features = { { tag = "trep"} } }) + tab.insert(fontfile.gsub, + { type = "gsub_ligature", + name = "tex_tlig", + subtables = { {name = "tex_tlig"} }, + features = { { tag = "tlig"} } }) + for _, tb in ipairs(fontfile.gsub) do + for __, ttb in ipairs(tb.subtables) do + if tb.type == "gsub_contextchain" then + lookups[tb.name] = lookups[tb.name] or { type = tb.type } + tab.insert(lookups[tb.name], ttb.name) + end + lookups[ttb.name] = { type = tb.type } + lookups["-" .. ttb.name] = { type = tb.type } + end + end + end + + if fontfile.gpos then + for _, tb in ipairs(fontfile.gpos) do + for __, ttb in ipairs(tb.subtables) do + lookups[ttb.name] = { type = tb.type } + lookups["-" .. ttb.name] = { type = tb.type } + end + end + end + + if fontfile.kerns then + for _, class in ipairs(fontfile.kerns) do + local max = 0 + for a in pairs (class.seconds) do + max = max < a and a or max + end + if type(class.lookup) == "string" then + lookups[class.lookup] = { type = "gpos_pair", firsts = class.firsts, seconds = class.seconds, offsets = class.offsets, max = max} + else + for _, lk in ipairs(class.lookup) do + lookups[lk] = { type = "gpos_pair", firsts = class.firsts, seconds = class.seconds, offsets = class.offsets, max = max} + end + end + end + end + + add_sub(fontfile, 96, 8216) -- ` to quoteleft + add_sub(fontfile, 39, 8217) -- ' to apostrophe (quoteright) + + add_lig(fontfile, 8220, 8216, 8216) -- quoteleft + quoteleft to quotedblleft + add_lig(fontfile, 8221, 8217, 8217) -- quoteright + quoteright to quotedblright + add_lig(fontfile, 8211, 45, 45) -- -- to endash + add_lig(fontfile, 8212, 8211, 45) -- --- (i.e. endash + -) to emdash + add_lig(fontfile, 161, 63, 96) -- ?` to inverted question mark + add_lig(fontfile, 161, 63, 8216) -- The same, with `turned to quoteleft. + add_lig(fontfile, 191, 33, 96) -- !` to inverted exclamation mark + add_lig(fontfile, 191, 33, 8216) -- Idem. + + local characters, phantom_ligatures = {}, {} + for chr, gly in pairs(fontfile.map.map) do + local glyph, char = fontfile.glyphs[gly], {} + + char.index = gly + char.name = glyph.name + char.width = glyph.width + if glyph.boundingbox then + char.depth = -glyph.boundingbox[2] + char.height = glyph.boundingbox[4] + end + if glyph.italic_correction then + char.italic = glyph.italic_correction + elseif glyph.width and glyph.boundingbox then + char.italic = glyph.boundingbox[3] - glyph.width + end + tab.subtable(characters, chr) + characters[chr] = char + + if glyph.lookups then + for lk, tb in pairs(glyph.lookups) do + local _lk = "-" .. lk + if lookups[lk] and lookups[_lk] then + for _, l in ipairs(tb) do + if l.type == "substitution" then + + tab.subtable(lookups[lk], "pairs") + lookups[lk].pairs[glyph.name] = l.specification.variant + + tab.subtable(lookups[_lk], "pairs") + lookups[_lk].pairs[l.specification.variant] = glyph.name + + elseif l.type == "ligature" then + + local comp, lig = str.explode(l.specification.components), l.specification.char + local lig = "" + for _, c in ipairs(comp) do + lig = lig .. c + end + + tab.subtable(lookups, lk) + tab.subtable(lookups[lk], "ligs", {all_ligs = {}}) + ligature(comp, lookups[lk].ligs, phantom_ligatures) + name_touni[lig .. ".lig"] = chr + + end + end + end + end + end + + if glyph.kerns then + for _, kern in pairs(glyph.kerns) do + local lks = type(kern.lookup) == "table" and kern.lookup or {kern.lookup} + for _, lk in ipairs(lks) do + tab.subtable(lookups[lk], "kerns") + tab.subtable(lookups[lk].kerns, glyph.name) + lookups[lk].kerns[glyph.name][kern.char] = kern.off + end + end + end + + end + + for lig in pairs(phantom_ligatures) do + if not name_touni[lig] then + max_char = max_char + 1 + name_touni[lig] = max_char + characters[max_char] = {name = lig} + end + end + + local lookup_table = {} + get_lookups(fontfile.gsub, lookup_table) + get_lookups(fontfile.gpos, lookup_table) + get_lookups(fontfile.lookups, lookup_table, true) + + if fontfile.lookups then + for name, lk in pairs(fontfile.lookups) do + local tb, format = {}, lk.format + for _, rule in ipairs(lk.rules) do + local ttb = { lookups = rule.lookups } + for pos, seq in pairs(rule[format]) do + ttb[pos] = {} + for _, glyfs in ipairs(seq) do + glyfs = str.explode(glyfs) + glyfs = tab.tohash(glyfs) + tab.insert(ttb[pos], glyfs) + end + end + tab.insert(tb, ttb) + end + lookups[name] = tb + end + end + + local loaded_font = { + + direction = 0, + filename = filename, + format = extension, + fullname = fontfile.names[1].names.fullname, + name = fontfile.fontname, + psname = fontfile.fontname, + type = "real", + units_per_em = fontfile.units_per_em, + + auto_expand = true, + + cidinfo = fontfile.cidinfo, + + -- Used only to adjust absoluteslant. + italicangle = -fontfile.italicangle, + name_to_unicode = name_touni, + max_char = max_char, + lookups = lookups, + lookup_table = lookup_table, + characters = characters + } + + if write then + local f = io.open(path, "w") + f:write("return {") + tab.write(loaded_font, f, "\n") + f:write("}") + f:close() + end + + return loaded_font + +end + +-- GETTING A FONT + +-- Finds a font file, and returns the original +-- file and the Lua version. +local name_luafile, get_features +local function is_font (name, mods, size) + + local lib, library_filename + for l, t in ipairs(library) do + if t[name] then + library_filename = t[name] + lib = t + break + end + end + if not library_filename then + library_filename = library.default[name] + lib = library.default + end + + if library_filename then + if type(library_filename) == "string" then + library_filename = lib[library_filename] + end + tab.sort(mods) + local T = library_filename + for _, t in ipairs(mods) do + local found + for tag in pairs(T) do + if str.match(tag, "^" .. t) then + T = T[tag] + found = true + break + end + end + if not found then + T = nil + break + end + end + + if T and T.__files then + local file, feats + local diff = 10000 + for s, f in pairs(T.__files) do + if num.abs(s - size) < diff then + diff = num.abs(s - size) + file, feats = f[1], f[2] + end + end + file, _file = lfs.find_file(file, lfs.kpse(file)), file + if file then + file = str.gsub(file, "\\", "/") + else + return 1, _file + end + local features = {} + if feats then + get_features(feats, features) + end + local lua = name_luafile(file, features.font) + lua = lfs.isfile(lua) and lua + return file, lua, feats + end + end +end + +-- Returns the full path to the Lua version of the font. +-- "sub" is a font in ttc. +function name_luafile (file, sub) + local lua + sub = sub and "_" .. sub or "" + sub = str.gsub(sub, " ", "_") + if str.match(file, "/") then + lua = str.match(file, ".*/(.-)%....$") + else + lua = str.match(file, "(.-)%....$") + end + lua = lua .. sub + return foundry_path .. "/" .. lua .. ".lua" +end + +local function apply_size (font, size, letterspacing, parameters) + if (size < 0) then size = (- 655.36) * size end + local to_size = size / font.units_per_em + font.size = size + font.designsize = size + font.to_size = to_size + local italic = font.italicangle or 0 + local space, stretch, shrink, extra + if parameters == "mono" then -- Creates a monospaced font with space equal to the + -- width of an "m" and no stretch or shrink. + space = font.characters[109].width * to_size + stretch, shrink, extra = 0, 0, 0 + else + parameters = parameters and str.explode(parameters) or {} + space = (parameters[1] or 0.25) * size + stretch = (parameters[2] or 0.166666) * size + shrink = (parameters[3] or 0.111111) * size + extra = (parameters[4] or 0.111111) * size + end + font.parameters = { + slant = size * num.floor(num.tan(italic * num.pi/180)), -- \fontdimen 1 + space = space, -- \fontdimen 2 + space_stretch = stretch, -- \fontdimen 3 + space_shrink = shrink, -- \fontdimen 4 + x_height = size * 0.4, -- \fontdimen 5 + quad = size, -- \fontdimen 6 + extra_space = extra -- \fontdimen 7 + } + + letterspacing = letterspacing or 1 + for c, t in pairs(font.characters) do + if t.width then + t.width, t.height, t.depth = t.width * to_size * letterspacing, t.height * to_size, t.depth * to_size + t.expansion_factor = 1000 + if t.italic then + t.italic = t.italic * to_size + end + end + end + + return font +end + + +local get_mods = lp.Ct((lp.space * lp.S"/" * lp.C(lp.alnum^1))^0) +local get_feats = lp.Ct((lp.C((1 - lp.S",;")^1) * (lp.S",;" + -1))^1) +function get_features (features, tb) + features = lp.match(get_feats, features) or {} + for _, f in ipairs(features) do + if str.match(f, "=") then + local key, val = str.match(f, "%s*(.-)%s*=%s*(.*)") + val = str.trim(val) + if val == "false" then + tb[key] = nil + else + tb[key] = val + end + else + f = str.trim(f) + neg, f = str.extract(f, "^%-") + if neg then + tb[f] = nil + else + _, f = str.extract(f, "^%+") + tb[f] = true + end + end + end +end + +local lookup_functions = {} + +function lookup_functions.gsub_single (tb, f) + local name_touni = f.name_to_unicode + for a, b in pairs(tb.pairs) do + local _a, _b = name_touni[a], name_touni[b] + f.max_char = f.max_char + 1 + f.characters[f.max_char] = f.characters[_a] + f.characters[_a] = f.characters[_b] + name_touni[a], name_touni[b] = f.max_char, _a + end + return f +end + +function lookup_functions.gsub_ligature (tb, f) + local name_touni = f.name_to_unicode + tb.ligs.all_ligs = nil + for a, tb in pairs(tb.ligs) do + a = name_touni[a] + tab.subtable(f.characters[a], "ligatures") + for b, ttb in pairs(tb) do + b, c = name_touni[b], name_touni[ttb.char] + f.characters[a].ligatures[b] = {char = c, type = ttb.type} + end + end + return f +end + +local function kern_pairs (tb, firsts, seconds, offset) + for _, c1 in ipairs(str.explode(firsts)) do + for __, c2 in ipairs(str.explode(seconds)) do + tab.subtable(tb, c1) + tb[c1][c2] = offset + end + end +end + +local function kern_classes (firsts, seconds, offsets, max) + local kerns = {} + for f, F in pairs (firsts) do + for s, S in pairs (seconds) do + local off = offsets[(f-1) * max + s] + if off then + kern_pairs (kerns, F, S, off) + end + end + end + return kerns +end + +local function apply_kerns (f, kerns, to_size) + local name_touni = f.name_to_unicode + to_size = to_size or 1 + for c1, ttb in pairs(kerns) do + for c2, off in pairs(ttb) do + tab.subtable(f.characters[name_touni[c1]], "kerns") + f.characters[name_touni[c1]].kerns[name_touni[c2]] = off * to_size + end + end +end + +function lookup_functions.gpos_pair (tb, f) + -- These are the big kern classes. + if tb.offsets then + local name_touni = f.name_to_unicode + for n, off in pairs(tb.offsets) do + tb.offsets[n] = off * f.to_size + end + local kerns = kern_classes(tb.firsts, tb.seconds, tb.offsets, tb.max) + apply_kerns(f, kerns) + end + -- These are the ones retrieved from individual glyphs. + if tb.kerns then + apply_kerns(f, tb.kerns, f.to_size) + end + return f +end + +function lookup_functions.gsub_contextchain (tb, f) + local name_touni = f.name_to_unicode + local T = f.contextchain or {} + for _, llk in ipairs(tb) do + if fontfile.lookups then + local sub, Sub = fontfile.lookups[llk].rules[1].lookups + local chain = fontfile.lookups[llk].rules[1].coverage + local cur, current = str.explode(chain.current[1]), {} + local aft, after = chain.after and str.explode(chain.after[1]) or {}, {} + for _, c in ipairs(cur) do + c = name_touni[c] + if sub then + Sub = {} + for n, x in ipairs(sub) do + Sub[n] = name_touni[fontfile.glyphs[f.characters[c].index].lookups[x .. "_s"][1].specification.variant] + end + end + local t = { lookup = Sub} + tab.subtable(T, C) + for __, a in ipairs(aft) do + tab.subtable(t, "after") + t.after[name_touni[a]] = true + end + tab.insert(T[c], t) + end + end + end + f.contextchain = T + return f +end + +local function _isactive (tb, ft, sc, lg) + for t in pairs(tb.tags) do + if ft[t] then + if t[sc] then + for _, lang in pairs(tb[sc]) do + if lang == lg then + return true + end + end + else + return true + end + end + end +end + + +local lookup_types = { + "gsub_single", + "gsub_ligature", + "gpos_pair" + } + +local function activate_lookups (font, features, script, lang) + for _, type in ipairs(lookup_types) do + if font.lookup_table and font.lookup_table[type] then + for l, tb in pairs(font.lookup_table[type]) do + if _isactive(tb, features, script, lang) then + for _, lk in ipairs(tb) do + local lt = font.lookups[lk] + if lt then + font = lookup_functions[type](lt, font) + end + end + end + end + end + end + return font +end + +local function load_font (name, size, id, done) + local loaded_font = lfs.find_file(name, "tfm") + if loaded_font then + loaded_font = fl.read_tfm(loaded_font, size) + else + local original = str.trim(str.match(name, "[^:]*")) + local family, mods, feats + family, name = str.extract(name, "([^/:]*)") + family = str.trim(family) + mods, name = str.extract(name, "[^:]*") + mods = lp.match(get_mods, mods) or {} + feats = str.extract(name, ":(.*)") or "" + local features = tab.copy(settings.features) + get_features(feats, features) + + local at_size + if features.size then + at_size = features.size + else + at_size = size + at_size = at_size > 0 and at_size or at_size * - 655.36 + at_size = at_size / 65536 + end + local source, lua, add_feats = is_font(family, mods, at_size) + if add_feats then get_features(add_feats, features) end + + if type(source) == "string" then + local cache = features.cache or "yes" + if lua then + if cache == "no" or cache == "rewrite" then + loaded_font = create_font(source, lfs.type(source), lua, features.font, cache == "rewrite") + else + loaded_font = dofile(lua) + end + else + lua = name_luafile(source, features.font) + loaded_font = create_font(source, lfs.type(source), lua, features.font, cache ~= "no") + end + else + if not done then + if type(source) == "number" then + wri.error("The library says `%s' matches `%s', but I can't find that file anywhere. Clean up your library!", original, lua) + else + recheck_fonts() + return load_font(original, size, id, true) + end + else + wri.error("I can't find `%s'. I return a default font to avoid further errors.", original) + end + end + + if loaded_font then + + local expansion = features.expansion and str.explode(features.expansion) or {} + loaded_font.stretch = expansion[1] or 0 + loaded_font.shrink = expansion[2] or 0 + loaded_font.step = expansion[3] or 0 + + local extend = features.extend or 1 + loaded_font.extend = extend * 1000 + local slant + if features.absoluteslant then + local italic = loaded_font.italicangle or 0 + slant = features.absoluteslant - italic + else + slant = features.slant or 0 + end + loaded_font.slant = num.tan(num.rad(slant)) * 1000 + + loaded_font = apply_size(loaded_font, size, features.letterspacing, features.space) + loaded_font = activate_lookups(loaded_font, features, features.script, features.lang) + + loaded_font.name = loaded_font.name .. id + loaded_font.fullname = loaded_font.fullname .. id + local embedding = features.embedding or "subset" + if embedding ~= "no" and embedding ~= "subset" and embedding ~= "full" then + wri.error("Invalid value `%s' for the `embedding' feature. Value should be `no', `subset' or `full'.", embedding) + embedding = "subset" + end + loaded_font.embedding = embedding + else + loaded_font = fl.read_tfm(lfs.find_file("cmr10", "tfm"), size) + end + end + return loaded_font +end + +callback.register("define_font", load_font) diff --git a/macros/luatex/generic/blopentype/luatex/blot-lua.ltm b/macros/luatex/generic/blopentype/luatex/blot-lua.ltm new file mode 100644 index 0000000000..2eec2efd00 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-lua.ltm @@ -0,0 +1,26 @@ +\def\inputltsfile#1 {\directlua{dofile(kpse.find_file("#1"))}} + +\inputltsfile blot-base.lts + +\def\ptx@lua{\directlua name {Internal PiTeX chunk}} + +\newcatcodetable\luacatcodes{\#\%\^^M\~=12} +\newtoks\ptx@luacode_list +\newif\ifptx@luacode_store +% Mimicks a block (\newblock isn't defined yet +% and anyway it wouldn't be very useful). +\def\luacode{% + \begingroup + \catcodetable\luacatcodes + \ifnext[ + {\ptx@luacode_store} + {\ptx@luacode_store[]}} +\bgroup +\setcatcodes{\^^M=12}% +\long\gdef\ptx@luacode_store[#1]^^M#2\luacode/{% So line count is right. + \endgroup% + \ifemptystring{#1}% + {\ptx@lua{#2}}% + {\def#1{#2}}% + }% +\egroup diff --git a/macros/luatex/generic/blopentype/luatex/blot-sets.lua b/macros/luatex/generic/blopentype/luatex/blot-sets.lua new file mode 100644 index 0000000000..5c24caa937 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot-sets.lua @@ -0,0 +1,19 @@ +return { + + features = { + kern = true, + liga = true, + trep = true, + tlig = true, + script = "latn", + lang = "dflt", + --stretch = 30, + --shrink = 20, + --step = 10, + }, + + normal = { + "Normal", "Regular", "Book", + }, + +} diff --git a/macros/luatex/generic/blopentype/luatex/blot.tex b/macros/luatex/generic/blopentype/luatex/blot.tex new file mode 100644 index 0000000000..09405f4d45 --- /dev/null +++ b/macros/luatex/generic/blopentype/luatex/blot.tex @@ -0,0 +1,246 @@ +% blopentype: a basic luatex open type loader +% some (most) pitex macros still in place. +% +% User interface +\message{This is blopentype, v0.0 December 2022} + +\input luatex85.sty +\input yax % which itself \input's texapi +\input gates + +\setcatcodes{\@\_=11} +\suppressoutererror=1 + +% MESSAGES +\def\ptx@error{\senderror{PiTeX}} +\def\ptx@log#1{% + \immediate\write17{^^J#1^^J}% + } +\def\ptx@warn#1{% + \ptx@log{PiTeX warning: #1}% + } + +% ATTRIBUTES +\newcount\ptx@attribute_count +\ptx@attribute_count=100 % The first 100 attributes are scratch. +\def\newattribute#1{% + \advance\ptx@attribute_count1 + \attributedef#1=\ptx@attribute_count + \xdefcs{ptx@attribute:\commandtoname#1}{\the\ptx@attribute_count}% + } +\def\unsetattribute#1{#1=-"7FFFFFFF\relax} +\def\attributenumber#1{\usecs{ptx@attribute:\commandtoname#1}} + +% FREEDEF +\def\freedef#1{% + \def#1{% + \ifnextnospace" + {\ptx@freedef_quote#1} + {\ifnextnospace/ + {\ptx@freedef_slash#1} + {\usecs{ptx@freedef_user:\commandtoname#1}}}% + }% + \defcs{ptx@freedef_user:\commandtoname#1}##1% + } +\def\ptx@freedef_quote#1"#2"{% + \usecs{ptx@freedef_user:\commandtoname#1}{#2}% + } +\def\ptx@freedef_slash#1/#2/{% + \usecs{ptx@freedef_user:\commandtoname#1}{#2}% + } + + +\newbox\ptx@box_temp + +\newif\ifmaintext +\maintexttrue + +% CATCODE TABLES +\newcount\ptx@catcodetable_count +\ptx@catcodetable_count=100 % First 100 are scratch. +\def\newcatcodetable#1#2{% + \global\advance\ptx@catcodetable_count1 + \chardef#1=\ptx@catcodetable_count + \begingroup + \setcatcodes{#2}% + \savecatcodetable#1% + \endgroup + } + +\newcatcodetable\texcatcodes{\@\_=12} + +\def\inputltmfile#1 {\input #1.ltm } + +\inputltmfile blot-lua +\inputltmfile blot-files +\inputltmfile blot-fonts +\restorecatcodes +\endinput + +\inputltmfile sections +\inputltmfile blocks +\inputltmfile references +\inputltmfile verbatim +\inputltmfile inserts +\inputltmfile output +\input navigator.tex + +% AUXILIARY FILE +\iffile{\jobname.aux}{% + \ptx@lua{% + remove_conversion() + tex.print("\luaescapestring{\noexpand\input\noexpand\jobname.aux}") + }% + \directlua{restore_conversion()}} +\immediate\openout\ptx@auxfile=\jobname.aux + +% PDF SETTINGS +\restrictparameter document : author title pdftitle date pdfdate subject keywords mode layout version\par +\restrictattribute document : mode outlines bookmarks thumbs thumbnails attachments files oc\par +\restrictattribute document : layout onepage onecolumn twopage twocolumn twopage* twocolumn*\par + +\suppressoutererror=1 +\let\ptx@bye\bye +\def\bye{% + \passvalueand{\setattribute navigator : title = } document : pdftitle { }{} + % The "date" attribute in the "document" parameter isn't supposed to hold a + % PDF-date, as navigator expects. + \deleteattribute document : date + \passvalueand{\setattribute navigator : date = } document : pdfdate { }{} + \finishpdffile\ptx@bye + } + +\setattribute navigator : meta = document + +% Turns a dimen into PostScript points, without the unit (as wanted by PDF). +\def\pdfpoint#1{% + \directlua{% + local d = "\the\dimexpr#1" + d = string.gsub(d, "pt", "") + tex.print(tostring(d * (72/72.27))) + }} + + + + +% TEX SETTINGS +\long\def\ptx@tex_set#1#2#3{% + \ifcs{#2} + {\usecs{#2}=#3\relax} + {\ptx@error{No TeX parameter `#2'}} + } + +\defactiveparameter tex {% + \parameterloop #1 : \ptx@tex_set + } + +\frenchspacing +\maxdepth=\maxdimen + +\def\antigobblespace{% + \ifcatnext a{ }{\iffnext({ }}% + } + +\def\strut#1#2{% + \vrule height#1 depth#2 width0pt + } + +\newdimen\extraboxspace +\newdimen\ptx@extraboxspace_top +\newdimen\ptx@extraboxspace_right +\newdimen\ptx@extraboxspace_bottom +\newdimen\ptx@extraboxspace_left + +\newfornoempty\ptx@colorbox_loop{1}#2,{% + \ifcase#1 + \ptx@extraboxspace_top =#2 + \ptx@extraboxspace_right =#2 + \ptx@extraboxspace_bottom =#2 + \ptx@extraboxspace_left =#2 + \or + \ptx@extraboxspace_right =#2 + \ptx@extraboxspace_left =#2 + \or + \ptx@extraboxspace_bottom =#2 + \or + \ptx@extraboxspace_left =#2 + \fi + \passarguments{\numexpr(#1+1)}% + } +\def\colorbox{% + \ifnextnospace[\ptx@colorbox_setborders + {\ptx@extraboxspace_top =\extraboxspace + \ptx@extraboxspace_right =\extraboxspace + \ptx@extraboxspace_bottom =\extraboxspace + \ptx@extraboxspace_left =\extraboxspace + \ptx@colorbox_do}% + } +\def\ptx@colorbox_setborders[#1]{% + \ptx@colorbox_loop{0}{#1,}% + \ptx@colorbox_do + } +{\setcatcodes{pt=12} +\gdef\noPT#1pt{#1 }} +\def\ptx@colorbox_do#1#2{% + \bgroup + \setbox\ptx@box_temp=\hbox{#2}% + \hbox{% + \pdfliteral{ + q #1 rg #1 RG + -\expandafter\noPT\the\ptx@extraboxspace_left + \expandafter\noPT\the\dimexpr(\ht\ptx@box_temp+\ptx@extraboxspace_top)\relax + \expandafter\noPT\the\dimexpr(\wd\ptx@box_temp+\ptx@extraboxspace_left+\ptx@extraboxspace_right)\relax + -\expandafter\noPT\the\dimexpr(\ht\ptx@box_temp+\ptx@extraboxspace_top+\dp\ptx@box_temp+\ptx@extraboxspace_bottom)\relax + re f Q}% + #2}% + \egroup + } + +\def\og{\char"00AB~} \def\fg{~\char"00BB\antigobblespace} + +\def\trace{\tracingcommands3 \tracingmacros2 } +\def\untrace{\tracingcommands0 \tracingmacros0 } + +\restorecatcodes + +\endinput + +% This is piTeX, a set of macros I (Paul Isambert) use to +% typeset documentations for my packages (that's why it is +% archived on CTAN). +% +% Perhaps in the future, when this achieves some kind of +% format-like completude, it'll be publicly announced. In the +% meanwhile, a documentation exists (pitex-doc.pdf, also readable +% in a text editor as pitex-doc.txt). +% +% +% You can of course use those macros, but you are on your +% own, and the files will probably be modified without announcement. +% The file is supposed to be \input on plain TeX with LuaTeX, at least v.0.6. +% +% +% The files needed are: +% +% texapi.tex (an independent package for programming) +% yax.tex (an independent package for key=value interface) +% gates.tex and gates.lua (an independant package for overall architecture) +% navigator.tex (an independant package for PDF features) +% lua.ptx and base.ptxlua (Lua side) +% files.ptx (file management) +% fonts.ptx, fonts.ptxlua and foundry-settings.lua +% (fonts, should be independant some day; actually +% fonts.ptxlua can be used independantly, but there is +% no doc) +% sections.ptx (sectionning commands) +% blocks.ptx (text blocks) +% references.ptx (labels and references) +% verbatim.ptx (typesetting verbatim) +% inserts.ptx (footnotes and figures, a mess) +% output.ptx (output routine) +% +% The file i-pitex.lua is needed only to typeset the documentation with the +% Interpreter package. +% +% +% Date: November 2011. diff --git a/macros/luatex/latex/luagcd/README.txt b/macros/luatex/latex/luagcd/README.txt new file mode 100644 index 0000000000..edd1bc9b5b --- /dev/null +++ b/macros/luatex/latex/luagcd/README.txt @@ -0,0 +1,20 @@ +# Introduction +Using Lua, the luagcd package is developed to find the greatest common divisor (gcd) of integers in LaTeX. +The package provides commands to obtain step-by-step computation of gcd of two integers by using the Euclidean algorithm. +In addition, the package has the command to express gcd of two integers as a linear combination. +The Bezout’s Identity can be verified for any two integers using commands in the package. +No particular environment is required for the use of commands in the package. +It is written in Lua, and the TeX file has to be compiled with the LuaLaTeX engine. + + +# License +The luagcd package is released under the LaTeX Project Public License v1.3c or later. +The complete license text is available at http://www.latex-project.org/lppl.txt. +It is developed in Lua. +Lua is available as a certified open-source software. +Its license is simple and liberal, which is compatible with GPL. + +#Installation and Inclusion +The installation of luagcd package is similar to plain latex package, where the .sty file is in LATEXdirectory of texmf tree. +The package can be included with \usepackage{luagcd} command in the preamble of the LaTeX document. +The TeX file is to be compiled using the LuaLaTeX engine.
\ No newline at end of file diff --git a/macros/luatex/latex/luagcd/luagcd.pdf b/macros/luatex/latex/luagcd/luagcd.pdf Binary files differnew file mode 100644 index 0000000000..e8ef34b6c2 --- /dev/null +++ b/macros/luatex/latex/luagcd/luagcd.pdf diff --git a/macros/luatex/latex/luagcd/luagcd.sty b/macros/luatex/latex/luagcd/luagcd.sty new file mode 100644 index 0000000000..12a5106ac3 --- /dev/null +++ b/macros/luatex/latex/luagcd/luagcd.sty @@ -0,0 +1,356 @@ +% luagcd package +% version 1.0 +% Licensed under LaTeX Project Public License v1.3c or later. The complete license text is available at http://www.latex-project.org/lppl.txt. +% Authors: Chetan Shirore and Ajit Kumar + +\ProvidesPackage{luagcd}[1.0] +\RequirePackage{luacode} +\begin{luacode*} +function findgcd2(a,b) + a = math.abs(a) + b = math.abs(b) + if b ~= 0 then + return findgcd2(b, a % b) + else + return a + end +end + +function findgcd(...) + local tbl = table.pack(...) + if #(tbl) > 2 then + local rem = table.remove(tbl,1) + return findgcd (rem, findgcd( table.unpack(tbl) ) ) + else + u,v = table.unpack(tbl) + return math.floor(findgcd2(u,v)) + end +end + +function inputcheck ( ... ) + local tbl = table.pack(...) + for _, v in ipairs(tbl) do + if type(v) ~= 'number' then + error('Only numbers are expected.') + return + elseif v~= math.floor(v) then + error('Error: Only integers are expected.') + return + end + end +end + +function luagcd(...) + inputcheck(...) + return findgcd(...) + +end + +function stepbystepgcd(a,b,sep) + if type(a) ~= 'number' or type(b) ~= 'number' then + error('Only numbers are expected.') + return + elseif a~= math.floor(a) or b~= math.floor(b) then + error('Error: Only integers are expected.') + return + end + local val1,val2 = a,b + a,b = math.max(math.abs(a),math.abs(b)), + math.min(math.abs(a),math.abs(b)) + p,q = math.max(math.abs(a),math.abs(b)), + math.min(math.abs(a),math.abs(b)) + if b==0 then +return + ("The gcd of " .. val1 .." and " .. val2 .. " is " .. a .. '.' ) +end + local tbl ={} + local k = 0 + local sep = sep or 'Step ' + local stepcnt = 0 + while b~=0 do + x=a + y=b + t = b + b = a % b + a = t + k=k+1 + stepcnt = stepcnt + 1 + if b ~=0 then + d = x // y + tbl[k] = sep .. stepcnt .. + ": Apply the division algorithm to " .. x .." and " .. y .."." + k=k+1 + tbl[k] = "$".. x.." = ".. t .."(" + .. d ..") + ".. b .."$" + else + tbl[k] = sep .. stepcnt .. + ": Apply the division algorithm to " .. x .." and " .. y .."." + k=k+1 + tbl[k] ="$".. x.." = "..t.."(" + .. (x // y)..") + ".. b .."$" + end + end + local str = table.concat(tbl,"\\\\") + if stepcnt==1 then + return str .. " \\\\" .. "The gcd of ".. val1 .." and " .. val2.. + " is " ..t.. "." + + else + return str .. " \\\\" .. "The gcd of ".. val1 .." and " .. val2 .. + " is the last non-zero remainder and it is " ..t.. "." + end +end + +function lincombgcd (a,b) + local val1,val2 = a,b + if type(a) ~= 'number' or type(b) ~= 'number' then + error('Only numbers are expected.') + return + elseif a~= math.floor(a) or b~= math.floor(b) then + error('Error: Only integers are expected.') + return + end + + local x,y=math.max(math.abs(a),math.abs(b)), + math.min(math.abs(a),math.abs(b)) + + local a,b=math.max(math.abs(a),math.abs(b)), + math.min(math.abs(a),math.abs(b)) + + if x == 0 and y == 0 then + return +("The gcd of $0$ and $0$ is clearly a linear combination of $0$ and $0$.") + elseif y == 0 then + return ("The gcd of " .. val1 .." and " .. val2 .. + " is $" .. x .. "$" .. " and $" .. x .." = 1 " + .."(".. x .. ")".." + 0(0)$.") + end + + if x % y == 0 then + return ("The gcd of " .. val1 .." and " .. val2 .. + " is $" .. y .. "$" .. " and one number is a multiple of other.") + end + + local e_1 = 1 + local e_2 = 0 + local e_3 = 0 + local f_1 = 0 + local f_2 = 1 + local f_3 = 0 + + while (a > 0 and b > 0) do + if (a > b) then + q = a // b + r = a % b + + if r > 0 then + e_3 = e_1 - (q * e_2) + e_1 = e_2 + e_2 = e_3 + f_3 = f_1 - (q * f_2) + f_1 = f_2 + f_2 = f_3 + gcd = r + end + a = a % b + else do + q = b // a + r = b % a + if r > 0 then + e_3 = e_1 - (q * e_2) + e_1 = e_2 + e_2 = e_3 + f_3 = f_1 - (q * f_2) + f_1 = f_2 + f_2 = f_3 + gcd = r + end + b = b % a + end + end +end + +if math.abs(val1) >= math.abs(val2) then + coeff1,coeff2 = val1, val2 + if val1 < 0 and val2 < 0 then + e_3,f_3 = -e_3,-f_3 + elseif val1 > 0 and val2 < 0 then + f_3 = -f_3 + elseif val1 < 0 and val2 > 0 then + e_3 = -e_3 + end +else + coeff1,coeff2 = val2,val1 + if val1 < 0 and val2 < 0 then + e_3,f_3 = -e_3,-f_3 + elseif val1 > 0 and val2 < 0 then + e_3 = -e_3 + elseif val1 < 0 and val2 > 0 then + f_3 = -f_3 + end +end + +if coeff2 <0 then + op = "" +else + op = " + " +end + +return ("The gcd of " .. val1 .." and " .. val2 .. " is " .. gcd .. +" and the equation $" .. coeff1 .."x" .. op .. coeff2 .."y = " +..gcd .. "$ has a solution $(x,y) = (" .. e_3 .. "," .. f_3 ..")$.") +end + +function lincombgcdstepbystep (a,b) +local val1,val2 = a,b +if type(a) ~= 'number' or type(b) ~= 'number' then + error('Only numbers are expected.') + return + elseif a~= math.floor(a) or b~= math.floor(b) then + error('Error: Only integers are expected.') + return + end + +local x,y=math.max(math.abs(a),math.abs(b)), +math.min(math.abs(a),math.abs(b)) + +local a,b=math.max(math.abs(a),math.abs(b)), +math.min(math.abs(a),math.abs(b)) + +if x == 0 and y == 0 then + return +("The gcd of $0$ and $0$ is clearly a linear combination of $0$ and $0$.") +elseif y == 0 then + return ("The gcd of " .. val1 .." and " .. val2 .. + " is $" .. x .. "$" .. " and $" .. x .." = 1 " + .."(".. x .. ")".." + 0(0)$.") +end + +if x % y == 0 then + return ("The gcd of " .. val1 .." and " .. val2 .. + " is $" .. y .. "$" .. " and one number is a multiple of other.") +end + +local e_1 = 1 +local e_2 = 0 +local e_3 = 0 +local f_1 = 0 +local f_2 = 1 +local f_3 = 0 +local sep = "Step " +local stcnt = 2 +local cnt = 4 + +local tbl ={} +tbl[1] = "Step 1:" .. x .. " is written as a linear combination of " +.. x .. " and " .. y .. "." +tbl[2] = "$".. x .. " = (" .. "1" .. ")" .. "(" .. x .. ") + " +.. "(" .. "0" .. ")" .. "(" .. y .. ")$" + +tbl[3] = "Step 2:" .. y .. " is written as a linear combination of " +.. x .. " and " .. y .. "." +tbl[4] = "$".. y .. " = (" .. "0" .. ")".. "(" .. x .. ") + " +.. "(" .. "1" .. ")" .. "(" .. y .. ")$" + + + +while (a > 0 and b > 0) do + if (a > b) then + q = a // b + r = a % b + + if r > 0 then + e_3 = e_1 - (q * e_2) + e_1 = e_2 + e_2 = e_3 + f_3 = f_1 - (q * f_2) + f_1 = f_2 + f_2 = f_3 + + cnt = cnt + 1 + stcnt = stcnt + 1 + + tbl[cnt] = sep..stcnt ..": ".."The equation in Step " + ..(stcnt-1).. " is multiplied by " .. q .. + " and subtracted from the equation in Step " + ..(stcnt-2) .. "." + cnt = cnt +1 + + tbl[cnt] = "$".. r .. " = (" .. e_3 .. ")" .. "(" .. x .. ") + " + .. "(" .. f_3 .. ")" .. "(" .. y .. ")$" + gcd = r + end + a = a % b + else do + q = b // a + r = b % a + if r > 0 then + e_3 = e_1 - (q * e_2) + e_1 = e_2 + e_2 = e_3 + f_3 = f_1 - (q * f_2) + f_1 = f_2 + f_2 = f_3 + cnt = cnt +1 + stcnt = stcnt + 1 + tbl[cnt] = sep..( stcnt) ..": ".."The equation in Step " + ..(stcnt-1).. " is multiplied by " .. q .. + " and subtracted from the equation in Step " + ..(stcnt-2) .. "." + cnt = cnt +1 + tbl[cnt] = "$" .. r .. " = (" .. e_3 .. ")" .. "(" .. x .. ") + " + .. "(" .. f_3 .. ")" .. "(" .. y .. ")$" + gcd = r + end + b = b % a + end +end +end + +if math.abs(val1) >= math.abs(val2) then +coeff1,coeff2 = val1, val2 + if val1 < 0 and val2 < 0 then + e_3,f_3 = -e_3,-f_3 + elseif val1 > 0 and val2 < 0 then + f_3 = -f_3 + elseif val1 < 0 and val2 > 0 then + e_3 = -e_3 + end +else +coeff1,coeff2 = val2,val1 + if val1 < 0 and val2 < 0 then + e_3,f_3 = -e_3,-f_3 + elseif val1 > 0 and val2 < 0 then + e_3 = -e_3 + elseif val1 < 0 and val2 > 0 then + f_3 = -f_3 + end +end + +if coeff2 <0 then + op = "" +else + op = " + " +end + +tbl[cnt+1] = "The gcd of " .. val1 .." and " .. val2 .. " is " .. gcd .. +" and the equation $" .. coeff1 .."x" .. op .. coeff2 .."y = " +..gcd .. "$ has a solution $(x,y) = (" .. e_3 .. "," .. f_3 ..")$." +return table.concat(tbl,"\\\\") + +end + +\end{luacode*} + +\newcommand\luagcd[1]{\directlua{tex.sprint(luagcd(#1))}} + +\newcommand\luagcdwithsteps[2] +{\directlua{tex.sprint(stepbystepgcd(#1,#2))}} + +\newcommand\luagcdlincomb[2] +{\directlua{tex.sprint(lincombgcd(#1,#2))}} + +\newcommand\luagcdlincombwithsteps[2] +{\directlua{tex.sprint(lincombgcdstepbystep(#1,#2))}} + +\endinput diff --git a/macros/luatex/latex/luagcd/luagcd.tex b/macros/luatex/latex/luagcd/luagcd.tex new file mode 100644 index 0000000000..980c024589 --- /dev/null +++ b/macros/luatex/latex/luagcd/luagcd.tex @@ -0,0 +1,155 @@ +\documentclass{article} +\usepackage{listings,color,booktabs,longtable,array,hyperref,multicol,framed} +\usepackage[ left=1in, right=1in]{geometry} +\hypersetup{colorlinks,urlcolor=blue} +\lstset{frame=none, + language=[LaTeX]{TeX}, + aboveskip=3mm, + belowskip=3mm, + showstringspaces=false, + columns=flexible, + basicstyle={\ttfamily}, + numbers=none, + numberstyle=\tiny\color{gray}, + stringstyle=\color{mauve}, + breaklines=true, + breakatwhitespace=true, + tabsize=1 +} +\usepackage[backend=bibtex]{biblatex} +\begin{document} +\title{The luagcd Package in LaTeX} +\author{Chetan Shirore and Dr. Ajit Kumar} +\maketitle +\section{Introduction}\label{section:introduction} +Using Lua, the \verb|luagcd| package is developed to find the \textbf{greatest common divisor (gcd)} of integers in LaTeX. It provides an easy way to find gcd of two or more integers inside LaTeX documents. The package provides commands to obtain step-by-step computation of gcd of two integers by using Euclidean algorithm. In addition, the package has the command to express gcd of two integers as a linear combination. The Bezout’s Identity can be verified for any two integers using commands in the package. No particular environment is required for the use of commands in the package. It is written in Lua, and the TeX file has to be compiled with the LuaLaTeX engine. + +In order to find the gcd of two integers, \(a\) and \(b\), the package uses a repeated division algorithm. This technique is basically based on the fact \(\gcd(a,b)=\gcd(a,b-\lambda a)\), where \(\lambda\) is an integer. This technique to find the gcd of integers is called as Euclidean algorithm. For finding gcd of more than two numbers, the associativity of the gcd operation is used. +\[\gcd(\gcd(a,b),c)=\gcd(a,b,c)\] +This associativity of the gcd operation allows the recursion of functions to find the gcd of more than two integers. The recursion technique (where the function calls itself) in Lua is effectively used in the package for finding the gcd of integers. The package also makes use of the following result. + \[\gcd\{a,b\}=\gcd\{|a|,b\}=\gcd\{a,|b|\}=\gcd\{|a|,|b|\} \] + + Algorithms in the package convert non-zero integers to positive integers, and then the Euclidean algorithm is used to find their gcd. If the gcd of \(a\) and \(b\) is \(d\) and it is expressed as a linear combination \(ax+by=d\), then we have + \[ax+by=d \iff (-a)(-x)+by = d \iff ax+(-b)(-y) = d \iff (-a)(-x)+(-b)(-y) = d \] + +So in order to find a solution of \((-a)(-x)+by = d\), \( ax+(-b)(-y) = d\) or \((-a)(-x)+(-b)(-y) = d\) it suffices to find a solution of \(ax+by=d \). This fact is used in an algorithm of the package to express the gcd of two integers as their linear combination. + +\section{Installation and License} + +The installation of \verb|luagcd| package is similar to plain latex package, where the \texttt{.sty} file is in LaTeX directory of texmf tree. The package can be included with \verb|\usepackage{luagcd}| command in the preamble of the LaTeX document. The TeX file is to be compiled using the LuaLaTeX engine. + +The \verb|luagcd| package is released under the LaTeX Project Public License v1.3c or later. The complete license text is available at \url{http://www.latex-project.org/lppl.txt}. It is developed in Lua. Lua is available as a certified open-source software. Its license is simple and liberal, which is compatible with GPL. + +\section{Commands in the luagcd package} +Table \ref{tbl:luagcd} lists operations in the \verb|luagcd| package. +\begin{longtable}{m{4cm}m{5cm}m{4cm}} +\toprule +\multicolumn{1}{l}{\textcolor{blue}{Command}} & \multicolumn{1}{l}{\textcolor{blue}{Syntax}} & \multicolumn{1}{l}{\textcolor{blue}{Description}} \\ +\toprule +\begin{lstlisting} +\luagcd +\end{lstlisting} & +\begin{lstlisting} +\luagcd{x_1, x_2, ..., x_n} +\end{lstlisting} & Gives gcd of integers \(x_1,x_2,x_3,\ldots,x_n\).\\ +\midrule +\begin{lstlisting} +\luagcdwithsteps +\end{lstlisting} & +\begin{lstlisting} +\luagcdwithsteps{a}{b} +\end{lstlisting} & Gives the gcd of two integers, \(a\) and \(b\), in a step-by-step manner by repeated application of the Euclidean algorithm. \\ +\midrule +\begin{lstlisting} +\luagcdlincomb +\end{lstlisting} & +\begin{lstlisting} +\luagcdlincomb{a}{b} +\end{lstlisting} & Gives the gcd of two integers \(a\) and \(b\) and expresses it as a linear combination of two integers \(a\) and \(b\). \\ +\midrule +\begin{lstlisting} +\luagcdlincombwithsteps +\end{lstlisting} & +\begin{lstlisting} +\luagcdlincombwithsteps{a}{b} +\end{lstlisting} & Expresses the gcd of two integers \(a\) and \(b\) as their linear combination in a step-by-step manner. \\ \\ +\bottomrule + +\caption{Operations in the luagcd package} +\label{tbl:luagcd} +\end{longtable} + + + +\section{Examples and usage} +The command \verb|\luagcd{20,30,60,70}| outputs to \fbox{10}. \\ +The command \verb|\luagcdwithsteps{-20}{-6008}| outputs the following.\\ +\begin{framed} +\noindent Step 1: Apply the division algorithm to 6008 and 20.\\ +$6008 = 20(300) + 8$\\ +Step 2: Apply the division algorithm to 20 and 8.\\ +$20 = 8(2) + 4$\\ +Step 3: Apply the division algorithm to 8 and 4.\\ +$8 = 4(2) + 0$ \\ +The gcd of -20 and -6008 is the last non-zero remainder and it is 4. +\end{framed} + +The command \verb|\luagcdwithsteps{-20}{-6008}| outputs the following LaTeX code. +\begin{lstlisting} +Step 1: Apply the division algorithm to 6008 and 20.\\ +$6008 = 20(300) + 8$\\ +Step 2: Apply the division algorithm to 20 and 8.\\ +$20 = 8(2) + 4$\\ +Step 3: Apply the division algorithm to 8 and 4.\\ +$8 = 4(2) + 0$ \\ +The gcd of -20 and -6008 is the last non-zero remainder and it is 4. +\end{lstlisting} + +The command \verb|\luagcdlincomb{10011}{210}| outputs the following. + +\begin{framed} \noindent The gcd of 10011 and 210 is 3 and the equation $-10011x + 210y = 3$ +and has a solution $(x,y) = (3,-143)$.\end{framed} + +The command \verb|\luagcdlincombwithsteps{-10011}{210}| outputs the following. + +\begin{framed} +\noindent Step 1:10011 is written as a linear combination of 10011 and 210.\\ +$10011 = (1)(10011) + (0)(210)$\\ +Step 2:210 is written as a linear combination of 10011 and 210.\\ +$210 = (0)(10011) + (1)(210)$\\ +Step 3: The equation in Step 2 is multiplied by 47 and +subtracted from the equation in Step 1.\\ +$141 = (1)(10011) + (-47)(210)$\\ +Step 4: The equation in Step 3 is multiplied by 1 and + subtracted from the equation in Step 2.\\ +$69 = (-1)(10011) + (48)(210)$\\ +Step 5: The equation in Step 4 is multiplied by 2 and +subtracted from the equation in Step 3.\\ +$3 = (3)(10011) + (-143)(210)$\\ +The gcd of -10011 and 210 is 3 and the equation $-10011x + 210y = 3$ +and has a solution $(x,y) = (-3,-143)$. +\end{framed} + +The command \verb|\luagcdlincombwithsteps{-10011}{210}| outputs the following LaTeX code. +\begin{lstlisting} +Step 1:10011 is written as a linear combination of 10011 and 210.\\ +$10011 = (1)(10011) + (0)(210)$\\ +Step 2:210 is written as a linear combination of 10011 and 210.\\ +$210 = (0)(10011) + (1)(210)$\\ +Step 3: The equation in Step 2 is multiplied by 47 and +subtracted from the equation in Step 1.\\ +$141 = (1)(10011) + (-47)(210)$\\ +Step 4: The equation in Step 3 is multiplied by 1 and + subtracted from the equation in Step 2.\\ +$69 = (-1)(10011) + (48)(210)$\\ +Step 5: The equation in Step 4 is multiplied by 2 and +subtracted from the equation in Step 3.\\ +$3 = (3)(10011) + (-143)(210)$\\ +The gcd of -10011 and 210 is 3 and the equation $-10011x + 210y = 3$ +and has a solution $(x,y) = (-3,-143)$. +\end{lstlisting} + + + +\printbibliography +\end{document} diff --git a/macros/luatex/latex/piton/piton-french.pdf b/macros/luatex/latex/piton/piton-french.pdf Binary files differindex 24bac33254..f8cd1d3104 100644 --- a/macros/luatex/latex/piton/piton-french.pdf +++ b/macros/luatex/latex/piton/piton-french.pdf diff --git a/macros/luatex/latex/piton/piton-french.tex b/macros/luatex/latex/piton/piton-french.tex index 6041a29e08..17b5abb2ba 100644 --- a/macros/luatex/latex/piton/piton-french.tex +++ b/macros/luatex/latex/piton/piton-french.tex @@ -243,6 +243,7 @@ Exemples : \subsection{La commande \textbackslash PitonOptions} + La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.} @@ -717,8 +718,12 @@ Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La valeur initiale de~$n$ est~4 mais on peut la changer avec la clé |tab-size| de |\PitonOptions|. -\emph{Remarque} : Contrairement à ce qui se passe avec l'extension \pkg{listings}, la clé |gobble| (et ses -variantes |auto-gobble| et |env-gobble|) agit \emph{avant} la transformation des tabulations en espaces. +\smallskip +\colorbox{yellow!50}{\bfseries Nouveau 1.0}\enskip Il existe aussi une clé |tabs-auto-gobble| qui détermine +le nombre minimal de caractères U+0009 débutant chaque ligne (non vide) de l'environnement |{Piton}| et applique +|gobble| avec cette valeur (avant le remplacement des caractères U+0009 par des espaces, bien entendu). Cette clé +est donc similaire à la clé |auto-gobble| mais agit sur des caractères U+0009 au lieu de caractères U+0020 +(espaces). \section{Exemples} diff --git a/macros/luatex/latex/piton/piton.dtx b/macros/luatex/latex/piton/piton.dtx index 0a655ed278..e67e091c8f 100644 --- a/macros/luatex/latex/piton/piton.dtx +++ b/macros/luatex/latex/piton/piton.dtx @@ -15,8 +15,8 @@ % % \fi % \iffalse -\def\myfileversion{0.99} -\def\myfiledate{2022/11/29} +\def\myfileversion{1.0} +\def\myfiledate{2022/12/29} % % %<*batchfile> @@ -100,7 +100,7 @@ version 2005/12/01 or later. % fast since all the parsing is done by the library LPEG, written in C. % % \bigskip -% Here is an exemple of code typeset by \pkg{piton}, with the environment |{Piton}|. +% Here is an example of code typeset by \pkg{piton}, with the environment |{Piton}|. % % \bigskip % @@ -237,7 +237,7 @@ version 2005/12/01 or later. % command. % % \medskip -% Exemples : +% Examples: % % \begin{tabular}{>{\color{gray}}l@{\hspace*{1cm}}l} % \verb!\piton|MyString = '\n'|! & @@ -766,9 +766,12 @@ version 2005/12/01 or later. % change it with the key |tab-size| of |\PitonOptions|. % % \smallskip -% \emph{Remark}: Unlike with the package \pkg{listings}, the key |gobble| and -% its variants (|auto-gobble| and |env-gobble|) are applied \emph{before} the -% transformation of the characters of tabulation in spaces. +% \colorbox{yellow!50}{\textbf{New 1.0}}\enskip There exists also a key +% |tabs-auto-gobble| which computes the minimal value $n$ of the number +% of consecutive characters U+0009 beginning each (non empty) line of the +% environment |{Piton}| and applies |gobble| with that value of~$n$ (before +% replacement of the tabulations by spaces, of course). Hence, that key is +% similar to the key |auto-gobble| but acts on U+0009 instead of U+0020 (spaces). % % \section{Examples} % @@ -1574,7 +1577,7 @@ version 2005/12/01 or later. % % \medskip % The following booleans correspond to the keys |break-lines| and -% |indent-broken-lines| of |\PitonOptions|. +% |indent-broken-lines|. % \begin{macrocode} \bool_new:N \l_@@_break_lines_bool \bool_new:N \l_@@_indent_broken_lines_bool @@ -1836,6 +1839,8 @@ version 2005/12/01 or later. auto-gobble .value_forbidden:n = true , env-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -2 } , env-gobble .value_forbidden:n = true , + tabs-auto-gobble .code:n = \int_set:Nn \l_@@_gobble_int { -3 } , + tabs-auto-gobble .value_forbidden:n = true , line-numbers .bool_set:N = \l_@@_line_numbers_bool , line-numbers .default:n = true , all-line-numbers .code:n = @@ -1895,15 +1900,17 @@ version 2005/12/01 or later. continuation-symbol,~ continuation-symbol-on-indentation,~ end-of-broken-line,~ - env-gobble,~gobble,~ - left-margin,~ + env-gobble,~ + gobble,~ indent-broken-lines,~ + left-margin,~ line-numbers,~ resume,~ show-spaces,~ slim,~ - splittable~ - and~tab-size.\\ + splittable,~ + tabs-auto-gobble,~ + and~tab-size. } % \end{macrocode} % @@ -2667,7 +2674,7 @@ local Delim = K ( S "[()]" ) % % \bigskip % Some strings of length 2 are explicit because we want the corresponding -% ligatures in the font \emph{Fira Code} to be active. +% ligatures available in some fonts as \emph{Fira Code} to be active. % \begin{macrocode} local Operator = K ( P "!=" + P "<>" + P "==" + P "<<" + P ">>" + P "<=" + P ">=" + P ":=" @@ -2777,9 +2784,11 @@ local ImportAs = 'Name.Namespace' ) * ( - ( Space * K ( P "as" , 'Keyword' ) * Space * K ( identifier , 'Name.Namespace' ) ) + ( Space * K ( P "as" , 'Keyword' ) * Space + * K ( identifier , 'Name.Namespace' ) ) + - ( SkipSpace * K ( P "," ) * SkipSpace * K ( identifier , 'Name.Namespace' ) ) ^ 0 + ( SkipSpace * K ( P "," ) * SkipSpace + * K ( identifier , 'Name.Namespace' ) ) ^ 0 ) % \end{macrocode} % Be careful: there is no commutativity of |+| in the previous expression. @@ -3345,7 +3354,7 @@ end % % \bigskip % The following function |add| will be used in the following \textsc{lpeg} -% |AutoGobbleLPEG| and |EnvGobbleLPEG|. +% |AutoGobbleLPEG|, |TabsAutoGobbleLPEG| and |EnvGobbleLPEG|. % \begin{macrocode} local function add(acc,new_value) return acc + new_value @@ -3381,6 +3390,27 @@ local AutoGobbleLPEG = % \end{macrocode} % % \bigskip +% The following \textsc{lpeg} is similar but works with the indentations. +% \begin{macrocode} +local TabsAutoGobbleLPEG = + ( space ^ 0 * P "\r" ) ^ -1 + * Cf ( + ( + ( P "\t" ) ^ 0 * P "\r" + + + Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add ) + * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 * P "\r" + ) ^ 0 + * + ( Cf ( Cc(0) * ( P "\t" * Cc(1) ) ^ 0 , add ) + * ( 1 - P "\t" ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 , + math.min + ) +% \end{macrocode} +% +% +% +% \bigskip % The following \textsc{lpeg} returns as capture the number of spaces at the % last line, that is to say before the |\end{Piton}| (and usually it's also the % number of spaces before the corresponding |\begin{Piton}| because that's the @@ -3399,6 +3429,9 @@ function piton.GobbleParse(n,code) then n = AutoGobbleLPEG : match(code) else if n==-2 then n = EnvGobbleLPEG : match(code) + else if n==-3 + then n = TabsAutoGobbleLPEG : match(code) + end end end piton.Parse(gobble(n,code)) @@ -3473,25 +3506,15 @@ end % \vspace{1cm} % \section{History} % -% -% \subsection*{Changes between versions 0.6 and 0.7} -% -% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|. +% \subsection*{Changes between versions 0.99 and 1.0} % -% The file |piton.lua| has been embedded in the file |piton.sty|. That means -% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|. -% -% \subsection*{Changes between versions 0.7 and 0.8} -% -% New keys |footnote| and |footnotehyper| at load-time. -% -% New key |left-margin|. -% -% \subsection*{Changes between versions 0.8 and 0.9} +% New key |tabs-auto-gobble|. % -% New key |tab-size|. +% +% \subsection*{Changes between versions 0.95 and 0.99} % -% Integer value for the key |splittable|. +% New key |break-lines| to allow breaks of the lines of code (and other keys to +% customize the appearance). % % \subsection*{Changes between versions 0.9 and 0.95} % @@ -3505,10 +3528,28 @@ end % % New keys |first-line| and |last-line| for the command |\InputPitonFile|. % -% \subsection*{Changes between versions 0.95 and 0.99} +% \subsection*{Changes between versions 0.8 and 0.9} +% +% New key |tab-size|. +% +% Integer value for the key |splittable|. +% +% \subsection*{Changes between versions 0.7 and 0.8} +% +% New keys |footnote| and |footnotehyper| at load-time. +% +% New key |left-margin|. +% +% \subsection*{Changes between versions 0.6 and 0.7} +% +% New keys |resume|, |splittable| and |background-color| in |\PitonOptions|. +% +% The file |piton.lua| has been embedded in the file |piton.sty|. That means +% that the extension \pkg{piton} is now entirely contained in the file |piton.sty|. +% +% +% % -% New key |break-lines| to allow breaks of the lines of code (and other keys to -% customize the appearance). % % \end{document} % diff --git a/macros/luatex/latex/piton/piton.pdf b/macros/luatex/latex/piton/piton.pdf index 72c6f24f03..6263fc4169 100644 --- a/macros/luatex/latex/piton/piton.pdf +++ b/macros/luatex/latex/piton/piton.pdf @@ -319,22 +319,21 @@ endobj << /S /GoTo /D [ 182 0 R /FitBH 771.02165 ] >> endobj 187 0 obj -<< /Filter /FlateDecode /Length 3444 >> -stream -xڽˎ$·í¾_QÇY+ëý -p¦IšL‹(çšnÆæ„*ºqN”µp”VÏ•Ñ Æ'Ú¥ñâSyBTEý%½Åÿ€»™ƒ<UÀGõ‘|Nz#ß O’0§„#òW©¤ëˆÏ¿xKòt*b ÍwÞ]ƒ7šËWÀ
úgªÞ ‡“TÄä$Î/J4"ËŒï]˜-€¢K«è¤fai*Œöèvíq‰@(6»æ¸¦RXÎÒŒtž)´vzŸtzì5½(sª^4šúÛ/[ºøýœ°›eÁ)o:Gê5ó°#=3Ê6Rl½åÞbeP` vXlŒQ‚|'$|2‘4bÇYôLØsiTŽwòRœƒ-y+·ðV£,b$£§ƒÿi½ -TÚù0BL• ¡ñ$Jéõ&±¢]¼›×n–kßY7=mÌ|¡@\0.Z"[MD’.ä‹t èi²ütÈb¡äa@u'W…
Ĉ<cv†IîÇEjÒ/w7¯xüŽˆ‘àÞÙà4ñöNBpe^Ž+³Ù@M–“ -'™‘b¢Ë&éWÏÝá*5L@y=òÊS‚Ì™†ŸÅd»ÞÄ„ÛT1Zï\h3æ²âÓzïø<Ι„œ{€d]¡ËÃ(¢ -/¦:× -*W-t«éWeÁd¢¯Þ$õp¢Àšsþõ›»àëö#›*¼¯š\ž›„Ð
¥ƒ-ºF£6÷ÈÙO¬¸\òÀåþ\a¥x•®×jW•ÉØ×{ÍbHXX{põpaõ`ãvºk6V=SbJ;Í9)Ôeé§ -/§S+ØqÌùæ -.¤)$Yyª’ÍU¦ãÕ¶1Iû{|h”õoäszØe7áß“õ}¦òq¾'{„Úó±G)ºÅ÷h©Ö4wøt0Yf?zí{ ærÒý1¾gÀõ -%wc
wŒkÑÑòôÓo?ÿ秽ÿàž~à†S?â»ßB?ýï1jlqÒýÀ#ÞR>ý)ýëIÇ4 -·ÿ¼ÓÕ%fµ7¥Z)Mæî”yÄ+ -3ïæþ‘D®zn{ÓuG—Žßg®tZ¦¤qצQêV:î)Þ2Ï%S» £x,õŸ•#WeŸÝU£ýO<^ÃýÄ_Ý©i,,°e`>ðÓ²§jÚðYfÏ¢øQ…Þ¦_âû)Æ‹ÊÔXR^Yñ²œc) -véäFÁØhx^4c&XôU>{µ_ñœ½bƬºifúH\4‰2Õœ°©Írý›¶ÕQËÕöiQâ4îcsÎ`ÀaúhÝl!½Sæp‡O€(¬ý1,gºi>Ävsa T ¡µ§+Ú 9ŽçöšÆÅDk40Ì„‡(S›NuÓS¬xã7Ú.ÁÔqŠÃUãÈ[Ï‚bÅfÊ¢´^Z,ÅÊ]mìÕ´¥ãË2‹þDäxÀ=5}ÔŸó\jþ$†„C@ƒâ‡²#»´fk܉Ԕ¨wF?—öÝUÊKÛ?Пgu9±bK½ZøÃë|ô³œ'sbGoŒEàæ Û5½ÑŽ‰¦Õ¢?N±mØMwè/À·MÏaî¯×¼o™B?š³;åÄ`<Ü|Ô¼œ°¶‡£öö$^tàÂ\ie¦yå.·2ËòñçÖ𜧤qÎ8¹b)(.žäX -ÖbÌó~wx:°™£`:ˆðÕ£œÁ@hÆ©ŽLG†ó&9]Ë_[É4ž¡î©¥m3N{íÿØòÕ_pÙ;ÀoÍPÐY -å×gÚ¼iw×0äÿ4,l9 +<< /Filter /FlateDecode /Length 3445 >> +stream +xڽɎd·í>_ñŽ=F#Q;Ðn`jÊÀ9Åž›íƒá >$#@òù!%j}KU¹«Ý@¡ß"‘wêQrùe‘ËŸßÉ+ÿO_Þ}¼€^” ¬1Ë—¿¿SøF.jm„‹Wß…å˯Ë÷ÏRº ¥¾à^>h øÄ)Õg)áôïË÷ú”FýøåÂa6qhp˜i +EêDØë +ÕΣl-ÊØyØRc£Ý¤ÆaOlâðZ(·Â±«Å;”F'¼6[PhýV½@$=“*\X0uÊŒ†%„¡¼öÝë28/“ôËœŠ ÿÇ2Ñê<Œ +h¦ÍšÌ‹M¨—F .ÖGá•®ºqΔõp´ÑÏÉù¥'Æçñês}ÂT%ýe½¥ÿˆ»›C<ÕÈGý‰}M~£2ߛ̒°§Œ#ñO6©Ïäë„/¼Çòô:a`ÍC7Œ^Ý wš‡Ë×ȃúg›Þ!$G²4Äì$Î/Zu"+Œ]Ù%¢¢ƒ3èÀˆ¸i:ÎöèwíqÒm>N(vÍq›Jå4:I;Óyî,¤Ò:èEz2èEt×ô¢ÎizÑiêo¿,ùâ[òsÊ-ND¯ƒi0"à +,aµë¤Ø{˽ÅBÔh nZlŠMŠ}ÿ "|e"yÄŽ³™°ç,ò¨çàÒ\‚,{+¿áfY¤HÆO'ÿÓ{VG…1‘S‡;<„[<“^/—¬Þdت½É1¸À5¼2~C÷xL§iyÁHq€€—0AÑâ43&“—åœÍ¬ß`ÛÇ‹7[*¤“©‰‘)÷š¯H®ÉZ F•ö!γFehd<™RkG½É¬èW‡oÔÅ•µÛ͵﬛Ÿvf¾¡@R ©z"{M$Ÿ‹óä¯\³&ÃçC+£1_ª;¹ª\˜N@à|ŒÙ[2Ì‹4¬_þn* +ËÕ;.ôù®˜k6>–|èg'õ•’uð-¯n*¹ÊX°ì%º`0ÙÃÂsZå™.`D°‚2J£†e9ÎU^•„©”©Å‰¥ˆ}Çp)¿›Q`Y-}\Ñå²ÖŒ+Äçþp•FFáÈ·L¼ +œ Kaðç(Ùn7)áöUŒˆ‰sì3æºâÓ”zïø<)`Î=Ar¾ÒpSE—HS›k……Õ\sêBàe ¢ÎLoæ +ÌÚg …y(%É"ãËAd,îqnqŽ¥¾`'´)ºÂê%Àä¨àÜf +MËü?Q¶ýª§Ô‚°ÑÍx´™©"žsš.>»–‰Vrªq{u.`>¶%dœ‚ÔX¹ezõÈ¿&™¾v“ÕÈvkÏå7n>î‚oÛ2mªLðR¼êr wîB?•~¶èRÜŽ¹GÉ~RÅå³®÷ç+Ç«|½vM™¬»q½×,†…Eµ‡ÔÖ6m£ûn£a‹¡gNLy§¹$3ƒ†,ýÔà•tjvs¾9 +.¬)²}2,’-U¦—Íö1É„{|j”oäsFØu7áßSô}Måã|Oñµçc0St‹ï1SÕÜéÓÁÊ2ÇÑÛ¾k.þñ=®øž5õ}åñ:érš;ãp÷$×XÓþÆi[n>o6dòˆÕ-¢3ì=bÚLÞàï¯zÌÀø‹ÉÛwÒã×”º8h»øªÜxF¡„V£»Ìz´ˆ^ø®IẽãÂ"¬†%›Ìpÿíþ¿b5Æ”÷ÃïLÕ}Kú¼Äû:óÛþ³¬v‡r…Rº€¶côB5ÐòôÓo?ÿ秽ÿàŸ~Vr–»ßâ8ýï1jm2ãÄ£Þ +‘]8íšfó‡žÃφ\¢ð²n +ÂK€zŽ¥*Øe<DPS£áy£3Ãâ¯òÅ«õøªç3eÕ]3Ó'æ¢Í”éî„Mk–ßôŽ¶¶O«çqŸºs;~@öø˜`‡é¶‡;| +Eá”÷ø°ˆ±˜`y;œH1µ›+‹¥?Uiõ‚ÈK:·×5há1Z“Q&<E™Ötjºžb-;¿Ñw æŽS®;GÞ{+5S&µðÒc©vPïZc¯á-íØ_ùYõ'!·=µe7~23â3¨»ÜX5sc×z¶YJU+(Iç¬y®›ì»+„Kß?Ñ_f
‡8©ZËk.×åØg=KæÕŽÎPGªÂ@…s¦díšÎ/T×f1ž‡B‡Ø7ëæ;òèû†ç¸î7rl—"»s;õ´`:Ð|Ô¸œ±ö£2öþ^rÞÊ^icæyõ®´1C}GøK[xÉQò¸Ag<l±•–NoO,EK±öy¿3<Ö,0BxIêQƒÍd<ãÔF–NéÊpÙ%¦Ûò7ÐL`¦–·Ì$ï³ÿc)W¡eï@BŸµ†D‚.H§V>³R»,¤òÛì!WÚ§ã„Æ$+Ahy'#)Ò?7©—ãÙE—¡º´&á¡÷¬$9.ë å-‰¹n®
OK»¦ÈÓMÖX5J8öØý ÓÐG9«Ÿ·b°cnN§~lÎI×A]“ºC eB> íj`@t«Ìy:ù°ç »³ñ§!fÓÛä§ÖN(rú#C©wFŸWaüúÑL+P›#Óîávõ‹¹Àÿãqi endstream endobj 182 0 obj @@ -431,24 +430,21 @@ endobj 236 0 obj << /Filter /FlateDecode /Length 4433 >> stream -xڵɮ¹íî¯ècrx-Ô<<Àív˜[&¾
æ” ¾Ä2—ü~¨]¢TK·Ÿ
´ûu•Š")Š»Š_¾]øåËž¿¯_?ürúâ™7ÒÀåë¿>¼Á/â"80iíÅÁ¸—¯ß/¿¿r‚s㹸ü–o/J)¼ªáíEºðG¸-Óð#~;ÎUŠã¨úë–ÆŽ÷Õ½¿"¯ .\ÓG|Âo|NÞßþøú+`aE€Ô‚ 0” -ðÉM¼žÈ%®®‰Î€»JÏD^…':"ʶgË_`3$÷æÂï -‘ëÍŸ{rK
‹ -€RúÄžL¡§.ÉD¯eÎ8Ï”ªµ5Ûå´õÒÕ‘³ïa·¬_â¦=Ô -g:èzüÿ˶IhR4\Œ–LHƦÀÇ$}&ÓixáiàÙÛ‹–Aó((éÏ ^äÍçÉU}+5a²?þÎ%ÿ]èw°Ñ·~ëæ6ŠinéÜHÃSãz!ttÅÄá2y/íG?›U¸Óó#ŸFï¥[ÉiåÐ)ŽVNéf7‚ÌæU’MCÆyuþ6QŠò¨¢"ÿoy
nån@LØ'>6È¿¦ü˜ì7åÑw²k\$‚Pبý™µ„+¸¬)”~µ²/—ÿìWJY¦ôôìȵµŒh—öïøäÈ߆Åã¼qÀ -r>Á0W²[~O…$^¢k+}°‡+X&ü$½ÖŸßÙeHêdí“e ê`¯‚5 ^ -ŸóšÂéص¤$ÓÎЧ–?u›Æ?Ó¶Ë
\ŒÈ;`cls
ÊßçVªÃe¯C -ÿiè5i]^£f}*E5¯á}‰7åðë0ær¶5=³äo±p «Ïþ”ÌOJOEŒ\ÉÌ”|‹oýŽ/½F)™EéïéÊ8ÆüM›â†¸DÝAŽ,ªMr K^Å´‹’£ -¿äzë%×>ÄþëJD‰ßÊe¬3õ‘žs·Äú‡3ôÊ¡'Œ·4ª[ô7ÔìÉ|¼–Ì”uuIŸÑ½r˜ -õ@¡hÆ¢0U^ `§ºÂÑžXÇQqû »
¥‘1ÍJb‚²(t/l-=o:¶Œ›*^EFkÃK¶<$Ç£îkÍj%ÕR/×Yy9ø—ÿüu7á·¨¤\ þ ®íL÷i€œ4ÜDÈ[æÑ— -"¨¾ì ˆ$£C9†Ô~ò¢ù£A¤Žýd¦Ñ ¥@2jˆLtÇœÞ&]è
!Ä£ –Nœß:¥…˜íóDFOy¢ŽÛ‡<¤GHùoŸ³S£Ï;k“Š[˲
³˜àç9/†}L8{O‡D‘r¹Ñ6}TxG¨`·×M
)ÂÒPÆ©Sbèä#y½"š×¾lžý¬zg¨CÄ+'²¡ÝÉ -bÁ¾¥®Þª†¥EïdZ»v⽶@HÞÉ^ÚXÝM¥YwÉ 4÷ÅÑztÜÕYqGSq”vrõ㕇\ÅB%™iR=×u Ë´7¤ »â³G¸¤Ý%$Õ¤íû2E ‘v8à˜ÆuÕñÌ>D©üŠñWÍS—þŒ–&òÛ>]~KÃ1v£•"ýÎIì*FáT›v?Z´~&h¥MD9IH¼rÆŠ8ƒº&<’Aµ$é\¥Á+á\šö+Þ+û}Ìw)™ÒŠRû¾=²¦e"Ä^Û·<lA<ÛŸf?ãh
jÌ
͔n*Ի
»rBŒš:6ɾIql†”ÍSíÕqm -j”-:vÏulìJƒ6ÒÓ ÇFÉýć“1H =oã«.hd2"_µ%`®IåVÉè—Íà&<Ú·SäÏ)fíÏPª¡
Õ„åg¨JÕÐþgeŒÑBª‰@ÿ‰é… -UÉiÆê'z†Wä@ÛŸ"Ùò)ýEÜkטé-#F¯úy¯cý½½…§ks6æµï©èˆ÷»ÿ -æÄpD¤½‡ÌÞö˪öñ¸ÓìçSV -ý0Ü-9E5øbžý 0åüÄ3é°Ï_?ü—´"m¸üãû‡ßÿÀëÿÄϯá -Þ]þG~=+F„çþ}ùû‡¿¥÷zZqÑA’C&¬áâ<ÓÆ ”†oò:‚_îZ],>ÃñŠîÀ(º"<cÐ -TQ™·ÚjÝ¡zøkm®²+¡¡fáº×ˆ¦Sr½FT÷ÙŽü«OMN'õÒ•ãÃïKÚ¥q¼¢Äï¾²mÍÅÐam¹¥ªï¤«ÕÓëâÉ[ÑŠae÷>³¥›ði—P즽¸ïñÂðnùIŠ`ãM¨E›°9ýôñø®ðb5%^·+úä[ë g†‰aºTÎv÷ŸGÿÇ*r€û`ÿy˸i£´û:‘çžUkbwº!ªúÍâÖ_ÿ®Yן`×}r×[nÅKE·sõtÿ·yG¶{ÙÌ;HÀûçÛ6ÙÀuû´ýÙSò
ghÜ +xڵɎ\¹ícrhj
¸\.sËÄ·ÁœÄ—8@æ’ßµK”ÞRå¶vw½’(’¢¸ëñË·¿|ùÀóïë׿܅¾xæ4pùú¯¿àq˜´öb`܈Ë×ï—ß_9Á¹ñ\Ü
þ–o/J)|ªáíEºðGøZ¦À©ð·ã\Õ¡8GÕO·4vü^Ýû'òšàÂ5ýˆOøçÉûÛ_E,¬Z0† ! ›°K¸hÒšÒiæfHÎÜÄ;à‰\âêšè¸«4'ò*ÌèXˆx(Ûæ–¿ÀfHîÍ…Ï‚UǼÁç.R•¨øóÛ%ýñÛ—@§¹ærº§gÀÒ ÌXSè4#^e'Œýó[žô[“¦-þyÁ4è‹•ž W ~²*…öËÝìä +æc“ñ,\¨cÛ'Ô.yãýrã¹b$Å,lI¡7A‹‚mæ\ÕGˆ÷¦ùkáð¾~EA3'P½@¢Ùµ#c2Êfk“?Ë[9 +ŸóšÂéص¤$ÓÎÐYáHŒ?õ›Æ?Ó¶Ë\ŒÈ;`cls +ÊßçvªÃe¯C +ÿiè5i]F£æ{*E5£á}‰4åðé0uærž5ÍYrˆ·(XØ÷)9Ÿ”˜Š¹’“)+øÙ&ú_zR2 ŠÒßÓ”qŒ ø›6Å
q‰ºƒì +XTš/ä@—¶Š %GêCé,l@§Ðdc^¨¼öœ#(üæÅ“¸´Õ +Så
+vª+퉵p·Ÿ°ÛPÓ¬4 ¦&‹ÒHß…£¥ç£UÇ–qS«hÁhmxɾ–‰@²Ë1ê¾Ö|V"Q-õBp•—‰ùÏ_wSíàðˆJÊ•àâ¾ÑÎtßšÈéÂM„¼e}ùîÌÛ²éîT6}Ø,Þ#.ïMß–¼gÌM·’Á*Þ1íEŸMJ +cb9,ßôX±H“åµeMXô_šT²¦QîÍf¤Ï]
â6æA« ÖŒRÒsÌm +*²ŠŽ,l/ŲTAnÍ;ÀëhdK§¨>X'€wÓåÖ0-ݲ-ÜêE®EQÅ„2“ +P8%²Œbþ`/:Ò»‰»ÞúH›Ú1gç-§\%uwÝë©””€ÐÊ9@=p„ÆÍõ"Uó{¾çÇo«ëùê`ƧÓÁôœª‰úä ?Oq…¾¨¢T<á(厥&_o‡ÖL¥rþœ¯,Vèx`A:f +GZS¸ÛƦ«¥™ÚxÞ*2µzØÙU“¹;J‹—¼Bmµ×Üy¡1Šq?,Ù4®~6¦Ä
ÒÎÓUÎU=àÃ%ŽïaLuhAs:u +ïìö¾©!EXZéÏ8uJ|$¯×BDóڗͳŸU¿êñɉlhw' +õnC箜„#†&ƒŽM²oR›!eóT{u\ +Ås¡´¢0Ë
Ñè›ùlÁ¯cÇ1Èã’7ŒC¡W%ÊGe=äVºLH&«è¾ô)v*Æ”Üby\‰ùŒÆ,½ 5¦úœ[ˆÿ’¹øTUº²C;Ü8Ît}qÉ[¯¼¢®IïðµˆKÅŒ¬õ"€Žy×91¥¼[&a§†‡ØÓý€…»ôáÅç=ÁàIGW¨|Aƒ{Œ†èšKs††Éã}Ž&Àó᜜V”%wì^I?¸w-p:ó–õv¾/#å}-oåODà!j1Æ>PVéUêxo¾\),žgQ¢£º-euÝ])}ÜSØÞ½Ý }泿â‚ðšYi·Þ
±dzêÝ@P«ÙQ‘#^LÕî4æ‘“¨8º²rBú4º×B§e‹ŽÝ{§Ò ôtÁ±Qr?ñádÌAÏÛø’™ŒÈWí_ ˜kR¹U2ºÁåð¸‰öíùsŠYû3”jhC5a;ǪR5´ÿY™c´j"Ðbº@¡BUrZ±:Á‰žá¥9жŧHc¶|ŠD÷šÇ5fz¿ˆÑ«~ÞëXoïßéÚœyí{*:âýnÇ¿°‚91\io ³·ý2ǃª}¼î4ûãù–@~w•’ô…)M/—Vâù%Må·Ýʧý•¢þ®¯ñ”ÊÕkËK°J2`2‰X“Œ…º{¹ÄÝ'Å„†Z/o9.§õw£¡q°?ÛÓNFQ"jy@3Ôd™o„—xçÛºªnŽ:Ú]Ø BE«®R2(]®Ì’docW`,ðË°êåµ~B% \'VjÚñ's!àó³Dô•€‰¶¥¾Q¼]9¬ÔC4^'ºç„敾†©»ö¸_gÖM/Eçg%`¬e]-Ôú6.e> zYÞ»”yMb±<‘kCbÿDª*ôÃp·äÕà‹uök€À”óW̤Ã>ýð_rÑVˆ`´áòï~ÿŸÿ~
oTðîò¿8ò{ìY1"Ìû÷åïþ–ÞèiÅEI™°†‹óLƒR~“×ür×êbq×*º£è.ˆ0Ç ¨.¢2oµÕ(ºCõò×Öµ¢+¡¡fẈ¦[r.½@T÷ÙŽü©OMN7õÒ“ãËïKÚ¥q¼¢ÄᆲmÍÅÐam¹¥ªï¤«ÕÝÓëâÉûЊaåî›Ì*>íª‚Ýô‚¢·á=^øÞm"?Il¼ µ¨s6§_ƒÁÓ’Nïú/VSâu»¢OÞ‘±µŸ qe˜¦Kål÷üyô¬"¸ÎŸ·Œ›V0J§¯yÞêYµ&v§¢ªß,n½ðõo™uý
vÝ'wý±åV¼¤Qt»WOÏ[wt`»—Íܺ‹¼ŸßŽÉ®Û·íÏÞ’—h8CãðØÖ¾~qêëÿ6Ÿ;œ endstream endobj 235 0 obj @@ -683,30 +679,26 @@ endobj << /Font << /F74 202 0 R /F75 203 0 R /F79 227 0 R /F15 199 0 R /F64 198 0 R /F22 228 0 R /F30 206 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R /F59 211 0 R /F72 214 0 R >> /ProcSet [ /PDF /Text ] >> endobj 281 0 obj -<< /Filter /FlateDecode /Length 4405 >> -stream -xÚÅÉŽc¹í^_áܦŒ¢…Ú€Bq»j€Ü2è[SÉi$ÿµK”Þb»ºÓ€Ûe=‰)üëÂ/¿¼ðü}ýöò§¡/žy#
\¾ýö"𿈋õLÙ‹5‚q#.ß~¿üí•sã8Wø‘o?+¥°EYεà\úhñ&¶[‰¿Ãç†}®¥·¼Æ?Ç.r„¿ÄWœ¢¶H•;*™>pá`Kø†Ü-4˜ÜU~”®0_ßþþí/ˆ´…ÒÒ -f½§hK“¦*…o
i½êšg´òšœJZ’KV¶,®Ð,Æø@’òDc«¨W:j‘~=¾Sa¼¹5tÓSœ;3Xÿÿe“˜™ƒ@0 ¾’ɦU[q\ÂÖ<‘4´Eòæö°¡üÇàW$u ;„-ᛲ>™ûwkNL–aù4¦ÀŠs˜ö|^æ´7‰F¡S˜+¿6JÇçaÝÐÆ86ÀÐig•«ìÉ€Öoæe¢xøþååýÛË*¡ò–ÖȵÜ2'Äå¿¿„8%Ú^0 -ɨº§™ÆŠàÀ\àç?Ýæ¡#W°£L\3O¾©I—ý2‘Ÿ†ù«Pä´²Öy‡LÇÕ'¨lœbžOT–†¶R*ęĿâJe»K -Ž;â\]ð|f2/§¨ðŒÇ%* -Oþ¹‰™Í¢Ø3’Õ†–:iÌü!un-*,ýŠÏnMÄz8EHJKaS¶—7Í:«õ|A¤Âº‚8…qAåµ¾Y÷S…UèÚ0ŒNéyÄ]Gå˼å(xý -lt¹Å1«Óù»`+¾Ç=ìŸþø%™%×C€iãÇ!ø²¿–Mþ4–Iï)nS¨Ðö;m<Ï;¶ÅÑgÄMµ}NÙ%aÛÕ;ÆfßÎ2FŽLüNQÊ›¨Â¿ýŽd\?ê„a14WÁ†CbxC{GËhïÐ])࿧(Ô4Àœ”+[,á€ÝæžX`Ê) -eT@Mÿ«òÛ%Vœ¼å¥²L€› 7e±éjÉœò«uÝeAÀ14þßs -ÂíQ$Fzs<gÅhžÛ$‹‹³‰´î€Bù³ô°t*»aÍbbÒŸÊ*†>øÙ¹¬Cq™zç½>˜Éz’Ž5^Ïä<-g¼>CÓxÜ_1Ñ,z¤p§+¡„f†ÃÄYCÌ°~_b©0°ÚL£;,2·(¼nªÏ¸4DJcPçÀGï -ï×,RØœŒÖžxo!çñ!j)Á’Õ‡S-Fê“1KU³Œm"N·$ð¡_vmJ_ê3?Å|èÉ;é'7Ä -×fçQë´õæÜ`˜@w‚œÆöç“Ö:¸-ñ9•¢.ÜA:JQ[ÍÀ#r†úÈ% -\ÒU‡4ʾÓuÖ.€Ô9bêý).€4"Ú&Šñ=.€4h¬9‹Mȶó‰3¢ûtG¼¨Q Šþ h-òDólx·ñYƒ5<{–ý(OJæ[T.FÉ©5†<Óy¹–žjYºàü¸èšýŒêˆ‡&óæá5R(QÌ‚Ïçè¢ãìpöou_a©%O-¹º"B³YéÖò[3&¥O9"L£kCúôt·0"cáÐ8¹@Vdޤ毶ÊÔšS-CðVÒÓ4{ù
È<oÕ}åÈa¨"‰àò”Tzs@¼²ÈÝCç1”$á¨gU8qXw‚ÐÀQhÙ´òèV¨ #^‘i®]ùB¥D- -)v8oN ¥q³\,R‰p` ]®ÀɳR=¡Ä¾Å9J†bÚäZË|²Þîx Ð s×DQå:³Kvt%wÓàr(e+•±‚\f\»·vE :5ØDf‹‰ðZ«ØÞõl_‹*ÿ©²#9ѪœJáP®R‚áXlÍwè»ZTÝ -ghKNàÚÎu«Ë³ÁJâ,dqP–¥”eè«<²´òm¡¼õÒ -î4qŒÌjKÀÈLhf©[nÜ™GCܬ¨¥O5ÈY讀ÌEZm‘eŸSÑË‹þÆ°ˆâ -‘Õéf*OYIéÎ2Ñ ºõ\qyÜËQZ0íä§ïà€èÿÀöëÃî%>sD–¼îWã–Nâ3‡Œ¿`~n£ßå·tA —H¡^!¿ärõWMî•úçd\ù$l]5w´]·Ù^Ép^¦9½Àãì!óE¤wP‡A]ËÓfECO›‚ítö®¥`Ê»õ˜L(nÂÂb±5sâÌkw%e¸¼ÔNBƈ.îúφûvY¦Ä#æèéAçƒÆ[„¯ÑÙ“Âõ¦´âž¨lI ymRbd—׊=kbrR¼*Òõ *J®°ÑÑÕ>Íù zÓlï4"dêý#×?í®ÎÕTeU -”ÜxX{ITô9͈B—Ù| Iá9º7Ïð¥rh8ýgS¬aŽÏ`û놕¢E,—‘»2ÈÈf¸™”ôz»G×n‰5ÿ<Ý Ö‹wÉPŒ˜:r•k7õÈ ïhy8ˆÞKMã!“¹ln|b=å€ÜyË,ǧq—ìPDŸŸË°ìGІhJÌ`(ÇksÙ¨ÞŠ’BëÅ%ã>’¸éWïbdüõÖD£^hI⻟Sè+ŽÒ¨Š[&eÁn˜].c°¡Ÿ{ßwà•f]dví@8ò¶}Œ‘rÒÐñLs› ‹LËå_[UU7r¤*g”¶ -5ÄÅL~¢Mù‹Ò:àbÂÅ|
õYA´¼çLgH«Ü˜s°Rý[.nã™<Ô"Œ‘x#¸Õ–þƒÔ:V&t¢ß»ÎªÆ(çˆRÝø%AÂSݧqR\Í–mïJò˜P@`û‚uɛĸZ›¯ŸþýeדХÄZÐKÜ5å¸~ßLR7&\QjÝ1߆¸Ï¯ñSH ®ïÁO9Í„˜„>$×eâ=50ãdðeÿø>\t²"ÖQióÕÑ{‰„O²'bW+±dϢϗ¿Åœ“ þÞ7¹€é*ö«Z2¥@‚ÌÛë<à
W{¢tÅK¦ä„ÉÀ@ùw®˜ÁGdäýo„Ù÷ÎciŸÖW< ëw¼¿Ê7-^ï®p ‡ J+L¶[¦_· -¨Bݪ¦BÙ)²ðäi ±Øg\ä{²Kvƒž¾tëàù8µ\}_8vÀÅ -EÛ -\e·.01 ³·«Ð™°to†ìšUݵSWÛ«ÏR–>ž”Þ²ÝËجØFñA»MË(ÙûÈìü!Áj&¹ÜÆqwe¨w½JiÙÞ“‹Œ‰àË@è'vFŒ=´¤ÆCššO¯-1Š‚ƹÝí–¨‡·áÀ<Zù*í]ñn;P‰Ž ¥)ÄYq÷GA¥Ž ÍÕiâzæˆqˆngèÍs:v· žq„WïUÛñYZàîÆ„˜”ª]a‚ër®•:‹Ã„ÀAL+LxqŠ¢Q»–u°½ÃZ+¦K¥sÌP¥¿ƒ§¬D—Uë¼ããPW€dÚ·WNˆ”MSjßy£ý›æ¢J2}¶¸ó©uòe?íËT°Ñ—‰¿Ò¥”ù!ÄÖ²SÃWêŠ0¯¼ÖEÞZ–2“ƨîiY°(Ü™¨Óó»áËH£§J[è<r3Hàn鱉 -È^‡‹=Ð.àßÚ̯Ù{¹ã>:¥K|Ýò -Þ±Uç)EghY»§q¤3”(%~ø§â| +<< /Filter /FlateDecode /Length 4262 >> +stream +xÚÅËŽ$·í¾_ѹy¬¢õ¸wf$§{r +âHþÿêA=XªªîžY{ÙîRI”Hñ-ªåå_yù铬Ÿ×oŸþô¦ì%Šè´ƒË·_>)|!/êâ£0þâÒ©Ë·_/{’Ò)Íþéç/Æl1^J«¤„Pþ¬zÖÛ½Æçô÷‚}®Ô[_s/¹‹žá“úŠS´mjG£Ë¼Ìp°%}Bí–\íªß¨+LÕ×ç¿û3"ía…´öJø9ÚÚ•©¡ôi¡¬×\댾B^“Óh/@sÀiÉÆÓâˆf‰0.&’Ћn¢"\ù¨yDyz|§Òx÷ÒÑ-oqîB@)lb!üÿ§]bV2Q(0”H6kúŠóŠ¶•…¤©-“·¶§
Mä×8?2©Ù!m‰¬ØÐútí?¬¹0Y…Ë‚•çpýý¼4&Í›iï +-Ñ)Í•á_;¥óû´nècŸ`ز³&4ö‘L@Û§ˆºP<}þôéõÛ§ÿ6B+ä-k‘k¥áò_?¥8¥PÖ_ +À?|‘èáçªü’‹•ÑÂNä„Ñ®íi¥±a8ˆ%øõëÏûÜ¢¬àô +v–‰kåÉW’šòöËe~šæoBœÐÚsÈÖÖrWß@eçñ3l¨¬ +ù¡QÙ‘ÂE@ êÊâ…þ¶d^NÑà9Ak8<ýc3_E+±g&3ª
«mјõ#um%Vžò»—.b#j!¶q´½²kÖXÏ—D*+‰S—T^ï[u?WXD°NXdtN¨#öè:+?$¬eOM{¨°1ø‹Z€êLï‚mä!°øãçb~Œ^a]œ‡üáóñZvùÓy¡cä¸uNáB;îd¶ñ²îØGß"†Î +§ãmʮۡÞqUàl™#g&~å(ÕM4éß…f2®_
B‰°„5–Ïk`G‡!1¢ã½³eôwè.DÖùïj!ˆœ6+oóáä„Þî¦x”È`8”Yu`è9’#/o¹Fm<º$a½k‹]ÿÐjL\ë.èfªð=·¨âìˆ!3Ò»;¥I7N +%¦_sqù<Øžxß}¸CvÜO’*9•ª<✕èaјY*še8“1z)ÒžúUg†úr7ù]œ‚:rwD +=Í;¿ÇzÙ±}[ +øˆYª²øT¼-÷”tØvù0Öô[Ïžâϱ8ë›Ö¶e®š·7ý®$™×‰ß1¯Oç09óàú6íº{þ@ua8j÷å¥pEB+Í¡€;Ì7Áµùí¨uvzwnw•‚
Áy({nÚ:Üî]ßï¦L41ð +eÝ<Nµõ×Ö!Glzˆù×NeÛÄ1¾Çþk‡Á»[±ñh#å†3²ãtG€h‘U%úß?ÍlÓfÉ&¤uèô:knxŽ,ûY:”Í·:h\Œ’ÓZå·ÇâC)4i©Ü“³/¨ŽdjrÏžJ½„Qdb=.Wg§#~oÇZÏ-yi©Eš¯J·„¿tcB}è$°ŒnÅ +å ø!þaýCÅM±éÇ@A§¹gí›ùkº´–óÃR²¼•ò¶ÌNOÙ€¼Ðû^ô0ˆì¦b‘®NI Ê»¼˜âÑ"BÄø[q’¤U}Äiy BƒÀ¡UÓFä±½Ag¼2Ó\‡*…F‰VûAv¸nÅϸY!×¢d80Ñ®ÚÔY¹‚žjMr_rŽ§Ê œ*¹¶jžª·^‚¨ÑÝê…¦–³¸C²c ®eØÞ©JªNiŒ•ä²âZ´½·+ +Õ©Ã&6[Î|·’¤ÄöadûVãÓøÏÐŽÔ¬E/f¢ú ZŒÓáךïª{Ar†öä®ýø¶¹<;ühP½i6‰:©¾2ÆôUY}zo½4¯G·Ù”°â1ï³™!-ý:–M=·â4/ûw.ˆÐ[õ抚gH±Ô$TbzœâiQÈæ¨Ì4n«]I핧Žx¯/ª©N8š‚:æVÅXºó"³]°o]E$|*fUÏï"öÕ×¢d’£ßkëênºõnBÑl6ê»cAW3U†0°¤Nû&T<œã¬°Òñ?aîÃP)'bŒâM˜–WÂö¡”²)ˆ=¥e*¾
Kù@wÈ:Ãìù6(tÎ*>ðNgBa†>æfúʲι§^}—ÉþÖËBË[ÎÐ¥udÍÒ’•Î¦ éXÃBD/ØðÕ«°C|u,ùN5»ÁãP½¢w7@4Œ¦eäTÎ¥%¸?ÓÄ9Vp«-=ub (6hV©[nÜ•GMM>3õ¥Ö¸êàƒâSWÙÈš=º³*ºyÙá˜WA.€•j£ãûôE*§À8’Mø^ØXpÍJ„‘+os +G“%Í:NOV[µøÁ-~wÎœ(ªãÆÊÃãyãÓ,k¿3åXm³ -1æÄfŸšâ=Œ1¦6ä\£m‹É)Þ«‚•Ê›Íô•–:©àò–«àÒ:Ò§´<¢‚µÃ!¶º3ÝÕÍåM–RG„d×^š5.{:Æ*aƒ^ãôü +tä×7§Wž´žÎR2Ö#o—ãrvQÒ +¥6˜VÒëJñˆž¸y2ø||„ŸÊÓŸŒÄ:+m¹:~§Hø†ƒöBìf%–ìIú|éñkcD”óád¼÷G[À
UÇ•- +™R¡ÁæuÈŽ«¿¡|%jaô“‰vòï²Ü3g#ïÿñ—cï<—×ÄÍú•çêUyù÷¥ÿËnûTÉX·ƒßê#ùy½*º—1îM3”ëe)l@òZ\~ºN:£|Û3€ôë?É;kŽàñŒûŸÚ;>_×0=‹i[ÚÝ+¯Ío∅ZéÛ¬«Ákôfe£¹Ö…}ǼwfYD0}OýX~TŸ[ZxÝcÙÑ:Ùj²çà¿U„é‘.óŠð´ýé(ª£J»ôHÛm5ö‘Ž†è„3aÂàDG[‰]·HòÌØ_Zäô°LÏõ4xÉ/%?ÈÇðOƒjŒ×r,Ø(9f*¯ó‰F +<å5kòåv—©Ìºë!ä·7»C¥;]gèËhÈÙ‚æ õo¬É±¨§Q…~“µ%•ÚP]|!jÙkQ‡w¾+CE endstream endobj 280 0 obj @@ -716,43 +708,53 @@ endobj [ 277 0 R 278 0 R ] endobj 277 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 133.218 325.333 147.943 336.282 ]/A << /S /GoTo /D (subsection.0.5.3) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 133.218 316.127 147.943 327.076 ]/A << /S /GoTo /D (subsection.0.5.3) >> >> endobj 278 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 163.664 325.333 175.619 336.282 ]/A << /S /GoTo /D (subsection.0.5.3) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 163.664 316.127 175.619 327.076 ]/A << /S /GoTo /D (subsection.0.5.3) >> >> endobj 282 0 obj << /D [ 280 0 R /XYZ 78.37 808.885 null ] >> endobj 70 0 obj -<< /D [ 280 0 R /XYZ 79.37 538.802 null ] >> +<< /D [ 280 0 R /XYZ 79.37 532.122 null ] >> endobj 74 0 obj -<< /D [ 280 0 R /XYZ 79.37 312.737 null ] >> +<< /D [ 280 0 R /XYZ 79.37 303.168 null ] >> endobj 78 0 obj -<< /D [ 280 0 R /XYZ 79.37 200.259 null ] >> +<< /D [ 280 0 R /XYZ 79.37 152.543 null ] >> endobj 82 0 obj -<< /D [ 280 0 R /XYZ 79.37 172.158 null ] >> +<< /D [ 280 0 R /XYZ 79.37 124.442 null ] >> endobj 279 0 obj -<< /Font << /F15 199 0 R /F74 202 0 R /F75 203 0 R /F77 204 0 R /F53 210 0 R /F30 206 0 R /F32 192 0 R /F64 198 0 R /F65 200 0 R /F27 205 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Font << /F15 199 0 R /F74 202 0 R /F75 203 0 R /F77 204 0 R /F53 210 0 R /F30 206 0 R /F32 192 0 R /F64 198 0 R /F65 200 0 R /F27 205 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> endobj 286 0 obj -<< /Filter /FlateDecode /Length 3015 >> -stream -xÚí\ÉŽ¹½÷WäˆC— F*µZÀøäAߟŒ9Øÿ˜.¹™Y™]LY[@©r!ƒÁØI¾j9üs÷'Y¾…å+úŸ¯ÑÒe rø×°¸ýËÓíýé§7ƒÁ9í‡÷ßžT|¥Bã€N éÔðþûð·g)ÁHiµ”¤t®]¿Ò·¤IÏø]yîè}¨úBß7zN÷š¾LíÜkjoô-S›Øßç÷ôL›©ÓA¦AƒZ¢4&¼¾|²`ŸS/MO5fn¨‡¹¥^‘Ò-qhÆÚ”«ØæušÙ’jꕨGª¯™÷[š?çâœñåïï?/QÉÕJ¡$ÌåZhL&ÙÉ;Ó¯hê ”Ñ#Í·"‰Åü²„™ßGí‘$‘9Èš`iÉZÖÞ—ÅhÁ¼PÞ”ÁÌb EjÂø,4„”B!!Hß -ÿ‰à¶Lf¬À¦L\°BK<&žF4zìn“¤Ž(Þæ~Ef¹ïªÈŠs$næÔû Óy#´ µ0¹›Þj¡Ã1i1©â¸ÖÎçȶÃòˆF/Ó‡Ãˇ߻Ûô̆eÛè@¹ÏvÛÑ°·Qâ“ìá©„¼è˜·4¯Èëëœ^%Éœaô"xk˜‚íà2e“¢Xà0öõýéßõ0ÚQÜ~ýý‰Ÿº³ÚÊcÜðŸ¿=ýu55Åäƒz@P*5O>^ -MåŠc”´°dŒèúÐ ü ÜüòÉÚ!PNgædƒÖÙšì,PÎɳFDÉ À6̹ò}lÅ,åË_¾ÍÌ•¤â›¾ëþ¹àf¤`¬ð.4¢Y„ð̉æCý9[5çÔ9Í0”++¦XèL²\ÎI oªV‹œÖ'çÉ`}ÛcÊA÷å%{‰5BRM!ùvÈ\ŠÍUqþɄΚóhMKÚæ„-“´‚Á5îØšF›~È’H™\[Ö\†}û®9*ñmÏà,«¡é»elÖ³uãÃv¦@€¾ÄÌ8¥¹)®|>efUgÜû|Ôì´Fúf¬õ¤{Ès°©™ïa}%-iSm´jH•¨mZo×O8¥ÉâÍAA‘¹†¦uªÞ)\ç²V’Î÷QíjU퀊J¬FíËrúåø穤©–2ð¶Uæ.¹‚9^uH) -ãÖ–³§¢SÕ¹g*¬h/·‰N¥ÂŠÒáŒàˆ.ºähã¾3§„^u¾4%Tc=žjæ³. seR™nW*ýšÆ¸Û·±åƒü²WÜÁÃ^~ ÈË1Úð½|¥§UtCc£Ø)kŠºµë²^I+ŠvÚû\熖ØÖ6¦iºp£@ßšýFÂ0’û®Õö™ôWt»"ýÕ²ÝOWÈÕQèÓ
mÎØ,9µrþ¨Í–t{…ÍR†tàÊ•2‚·M4BÓƒŠ7Ò‡3ÞP´ÎsÈdµrŽK-VS\â,vL²šâ·ºÂbµòä;ðÅjÐäQpÐb5xò‘¶µ{ µjMÕEhâüì¼èH:Õ¤7kÅ€™¸Ûä¥@lã5Œé|s\òÐî¡<®½£ -׊‹å9تNŒá”_ËçéÄ,çu—çAü+EEžå-àý`9qùI ŒHð鈕tÁGËÚ½ó<F¨A˜À‰cZ Í-¹ÒOwÜF¿åD|bÊ2Í'Ê\P¡.oGpÄ-}ÒyÞ‹V™–ƒ<¯õ%MžÍ˜ÏHŠ^Uì«ø¤–ú!e§Ó2…q - eÁMÃs9<,wñXUåÎÔ‘O{ÑÚóYg±l||NàŽ<Àž•Úž}u9ø¼&¡Ì¤ŸËw”ížÄÀ[Zz›z”xÞÓÙ©~Û÷%‰WÛðÊ[nj*š×Nc]ÒN+•u~µ7‚KÍŠÝQôåp9‰½˜m9åãèZ§s5²šâg!um«ufÌ^?/¾4I§¹¬[9øÉÊózºèAgá–Z‘>rг…øý“^ŸP"—à2Ô¼f¤Ä®
Qf²ÖWY'ÓžÁ¸{›PF0N"ø‰0ã¶BéM³È‚*o×ñOì
Ji
fÐtøãÁJºÙƒ¾U3sHêsÌ<»ó¨A¢E¨Æ[ -›¦ìòûùÛ(ç*éD.pÆaÈȲ‚kex -Àºë|‰Ä‘/ ô‡—Y±æ¼Ì‘.eMb]†Z€óu‡à2ySì ê'‰Ù3m©œ²}ÏGŠ,iŸ(ê©Íwý Z ¶á2ìÛdÍÑŒ€Qäñ®î»e"dJ5Ûú¬º—}Puáe¸ö(œP4Ÿz¬ŽrŠk×ÜwA¥fŸ_ÒÞBs9Z°Ñ:¦j}-šK²Õƒ‚dœ¢O€¹–k·õ姱٨[1|ü¤ú\Ú•\û@7¿P¼?o®‰›KÚXj¹ìˆ©ÍQâöu?ªÕÂÔ‚ „Y÷ÝYß_¶>?!XAlõ²ä^áûÄÏz¬Çãç -÷ýàQ¹ªÇ8B/Lhil³k*ºB;«.`/J»¶¡½•‚!‰÷1t«$¾*º}ÑQäöàô}µåÖŽÔ´®ÐQ‡2•kÔ¯¦t -êTn2,¥ºå>Ÿ
æšÜRÑþf©D›%¥Ãñ• ðÒMVhEðß)¾Vcuˆ¯5÷g°F¹iÜÁ•ˆ¹ìÕkT¢ÛrˆSP#E^n árµ‘êݺqÐF®Ž+Ú»@#"Ӳޖ̦¡½{µŒ‡“ªÏd’j¤Û™¤–í~&¹B®VQa`IYG1Ï5Yr^>½Äf -£ìQ¹"gšÖ}€FˆÂ£;ã=ü³Ùˆ>Åkm6xÊVS`’à/±Yì²YÌþ Íj¶qýA¨‘$?¨IžEñÑ®ÖGFñ<mÀ>€4Šh_ýP×ñ×~z¶8‚4Š¨^»–ÍW‘F{ˆœˆb
[€2•J b0Tyz¦“šHGº»éÐj 5ëÔÜí€9N)öÛBpàÁ[ŽpŒ<É‘¾›&¿Ó-è©4£rÔv› Ŷ¬”ŸÑ¦‘@'˜Dš«™ÿ‘—ÛtдÀoRÁñI°Dg0’JÃ@£ž +<< /Filter /FlateDecode /Length 3362 >> +stream +xÚí\Ɏ丽×Wè†&\F]
Ø'êfø4ðø`ÌÁþÿƒƒû*¥T)†¨®’’ƒ/Š/E—.tùñBãïÛûËŸÞ˜\,±Š+±¼ÿþÂðº°E[zÑŠªØòþÇò·/”rN©V¯¿ +PÀóèi’÷h~<(}FG§^s÷Ìè—:,‰³%áŒ#{U¹(ƒ+o®+œ +g*ÍÌ|ˆ&Jâ"q-Ò¢Ò⊦OÓûÖâÇ›(z +ŽeöˆLhà06ŸDBNûyZÿb§P‡ðµiˆ¥0ºA;^Ó‚(gnÕ´E ŠQç- ! ð~@ÍÃd¼)b¤„·41\Æã1ÝM +¤ˆæƒ©¡ˆK¬LcµÊV³iü‰Ëi„ù±§Æ(í*J’Cû˜ë[¤Å-WÙ•ýý™Ã7Ïn:ÏòD3Pz¸Û›7ÜõÃÜ×
½Ä0šæUfîâ|m‹‰FÍäa©môîÉÊbNâ¢QVi%Næ8Û×ôÆõÍ›äêï8‚œÚAs&ów¥‹w¶‰w”HW¢àÿX¬-ñOë§ø¯¥¹ü:”áz«R`ÆúEÙ«è-¡ÏÌø›ÎBDð!®Bòèu+¤ÊL}¸º§tBN7¦ÄbR'G;²ÌÜÅGÉå¡“z€HõÜJ¡/b +
KæWV¯õ° +]
#Ð$Å$¢ŽÎt3sGñHM‰ ¥ÔÌÅe3½h`'-åqç\Úip/‘·†ÿÖŒf
á‹’–Áë:«¤³E…Í÷ì ˆ1M(·‹†¹˜‰à#Á=•+Y"ÝžˆûÜMFbtuZ¹.ÎY€kT§Y¿œ&}êĺÔêEßË‚Š)©&¶Àœ#K¸ +_· WD*¹Ï&¹Vv5ÁXjÏÂËØ/Ù,öš,ùFŠZEú‰Æd·ª7fÞ^¬˜‹ +¢„Þg._EÇ•²ž¤3ˆG=
?.\9ùt+÷¤mÛzŠ}ÖÛfèܲɋñ›ð”B^*ݼ¼®÷Zžœí¤Å•i‚7ðlD—´ÇÅT¢˜uaìûûË¿ûa”½—]~ûãÅ݀й0B-ÿùÇòûË_+i%$úݳÆ*‘XM«³¡Õ"5#Z—M!o5C9pw#]üúÉV‰hçUØ*TÖâ׊[F-árPN¥˜o|+§Rüó×`Ñ*fè;÷ÐF›,]£ì`š&ˆGMÀý[úß^³ùGµ¦¸ªzD¯”3º™þ¬EhŽÞÉÆUté`>9ÃÑ<c’…£Q +b¸˜ô+»îÛ.¸$Ìuuý…sFS+[À2Gk =ÓΡ)cú)$ œ—½–vß½F)ÀmN2BíÐw
lR¡²}ãÝ8€à6—àLh4Ažù×C0kû꟢$š¦jžsw0†šNõ3 —"P#ZÐ9´Æ¸Þ7^/žNÐãFÓ 1véÇ™Et÷Cá¶k©‰PfA”ò%¬vsí|å!Fc°ý‚·…tµÍõ{ý°]uàm +¸T01íƒìµmŽ¥=PûMØs Pâ¨Z?\±ØXMûÆ%ž“äÚÉ®<ú(p?=ýQM˜º&ý1Flµ +òPDê:ŸšþZÙíC¡c鯕´7‹ž@¯É”š*qÈæmßK³@;ÔóY S=®:‰?Ê嬨oEä§z+Ob\o:ùuú¬b>Eáfˆ1doE\jp«Ü‹X)lòæ¡m¬NÙ—ÄF#:<ÞœëÂ-‘²G¤8ED›ì+)B`#¦†e>’íÚqnWd»Î¬ÛÙî“*uЋ–öRÑ™2;‘šrëHÕŠ(nvšÔ0bd|´8CŒ/ÔØc5fPrtˆ+q +†\¶ÚeTð‡åì +œ3è/üœ–sšò}8nÐ/†Æê‰ü €„í#zuü³'g†jÄ$ß‹¢Ûªš‡ÐÌ“xÐ[8¨gR5…õ·žTí‘Öt5ãD13IÙáì+¦îL/‹+î¤dzä1‰(›mÇ”§¥¸î”Ô«é_5}'Ñ2·nÂŽ™m +-ÍK´´ÌƒéXu‘],ÊR|“ï§%¢º&²5ä00»Éa`kr˜¿ò¤,væoåàÖQ—‚ì†-Dø²0qó +_rBüÚ¦v ·×P?=³+¥›-[;1ÀÊJWD¨¹fœÝñ4°Ê<íâ-ΚY>õvîÒŽ×BWÚH›Ø«Ñ†\ï`¡¹ô¬‹ëf7¬Náshh 0spq +
¤ÛNËO¢¡}”55±àÄŽŒ©§èg +àÃd1·y^Ê>²•„ë¡ï²ZEIÙK8Ÿ,&5‘Z÷ãc‹)Ž•õ c‹-¦pe†ØbîI˜{ +¿E+b+Ê}%Äœ{’PÐÊ>röÏ0%ƒ˜iwÞÙ?fÁå ¥ÝÆe¯ÑžÃÜ£ú¾kˆ
6´ÞÇMgì4|H÷¬®=±áÊ-©ë‰#›äݽö§ÐL£×·²×(Z +÷m¸™éZ_ËÑrÜr¹SAN-‚sXè$v·òe7A=šáãÇÑDz/:‚çÅMôin.Š›ìp§’GZžH’QÓö¾Õzv‘d±pºï»ÆžJ¾ß¶Þ?¹@$Ÿ…Ž2NôìÆ:!zŽÚŸG|J•P7Æ!æ“ÆTgGkçé@4n†YBã2¨AöZN°WlfÞçÈOVŠzurÏe?9§RðxÙbkŒ¹vhÝñŸvåO¡½¤«ˆNÇ2ãDŠóbnÕAëk2K+û#´¤mZI»£+n.¥=ÍT8-Á?)¼vc^{í0ŠRÚÉx@)J³íu*§(·vˆCœ"f-ö´\ajÄb·k| +S#•ÆìMRŠU?‡Ã%Âf½zúÊa©$’n¤Û‰¤·ív"¹Â®’a] KâI…!Oì…,:/3aViÜþ˽vÕœ(1´>‡_¤51Zñ¬¢ endstream endobj 285 0 obj @@ -762,27 +764,26 @@ endobj << /D [ 285 0 R /XYZ 78.37 808.885 null ] >> endobj 86 0 obj -<< /D [ 285 0 R /XYZ 79.37 538.946 null ] >> +<< /D [ 285 0 R /XYZ 79.37 469.297 null ] >> endobj 284 0 obj -<< /Font << /F82 249 0 R /F73 215 0 R /F75 203 0 R /F74 202 0 R /F15 199 0 R /F64 198 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Font << /F15 199 0 R /F65 200 0 R /F74 202 0 R /F82 249 0 R /F73 215 0 R /F75 203 0 R /F64 198 0 R >> /ProcSet [ /PDF /Text ] >> endobj 294 0 obj -<< /Filter /FlateDecode /Length 3417 >> -stream -xÚÕ\K#¹
¾÷¯¨?ÐZ‰Ô4O¯lN›Ìm±§$›C2‡ä’¿êU¥¢Tår»ÜØàq»,Qùñ!‰²fúÇ$éÿ?¾ÈøW|ož]¾½üpõ0y¬E?}ûíEQ#9©Iijbíä¬ÒªéÛ÷é—/RZx{5`è/¤D=2RjIï@/+%½¥—¦¿ÍßÛËò,önÛ:½ôÙnûöë·Ÿ•ÂäŒJÂÌ!õBjm©—}ÏŸõ{å“øoi¸ ÐMƒP+Й‚¦Þp¥Wäés¡jTùÎ%ZR8Cò‰ä?§ÕÇ?ñ‘ÀåõÞHú’GŠÏ⻡6ê+µ»ä¶ó¨#Õ†ü0ħ?~{ù7^wh¦¿~‰‘t¬Œ#]íôŸ¿O¿½ü¼P#Bš^ôE|P?ü¹À†f6`u¯NB›çyͼcὌ@DôˆÉWHÒ£bëÌ}j¹*OK_#Àu}£#à’u?*Znf -h…5†Sˆ¨L(}_z -Œÿ&þž8Õrjœ0ÎñqȦWQð‘fý³¥aAxÙшÖâÂxvXßõˆvøµÌꊬ÷Âùc ÊPÑ;P±…U‹ùºöU¦°Ä-V0Úú*C–¢GÜEÌP| -Gë“nVğR°`:Ú[! hÒØH¼7¢À¾8€2I|1ºÌPŒ$dö`ñ¶ÚJkK -êZ/¡äPÈXwN"z/¸–5lÔñ‰Eˤò³<…¦7¨çD”5íQâŒî‹(kJ‡½*i’Æ<MVˆÂãA¯šçyÒ¡¤üëñûâ:Brn-J¼\÷e„Ûr[2ú<Œ‚J™á§D³õXèò>•ÇðZeßs¬WŽÇìÆ¿uï¼T{ŽÇÉ=· ŠtFÜòq
¹„ƒ¼÷´[ÈißïÜV ï!ÃyFKËŠ -Fót*Ï3ú߈պô‹Ç/ií*—ØQËmµlôï—Õ)ê¥O¤cšZV9ûrÆ»vÂû"Ü܈Œ&ZÊLô Œ¶”3oŸß·ÅªyF•ûæL¦Ž¼€Iƒ!½V,Yrs¥·ó³Ðª5ÙšB=qt¬&[Ëý‰hYð嘆I¾Ï*ÎIöžGL5« -í’(Ô%`©$—M^ÏÎô]ÙÈ-«Î壺é:óX+$îÌi·Q˜Õ)gFMo( -éý1ÅÌ)°M;¨³ºŽ Ï”~÷+)¯RÈ9½WqV-ê™mìz–òö‡„jÒéUýöjœÊ½Æ°¬”ŒùäKoËyEÆü]1‹´×GÉí ñ̽x@²? ->z5ãháÅ2¡-Ô}éèw
š'\Œ@$€ýàÅF宋¬ï.F0 -O»ÁÆùÐÅÎë틼ÇJ鎡èöéR>ˆËë©%ZŒönF¸;ýfçrÿfDÇÑ7#Xß7#XëÃøA§á#®è—Œó©§_|¬ÇO¿:îO¬³a´oÜŒ`?ãfÄ1k kݤT´üD ‚)ëtõy¶Ýë¥Å§hUáЛ՞A)AÊFBXLîÇCã´HûÁžfÈQøç¸È5íîE¸<ý^çvÿ^DÇÑ÷"Xß÷"X룮¼V«³pñØÒ}Ž«äc=î*ÜŸ~/‚ñ‘{œÆþ½ˆnV'Þ‹`´÷ïEÄ{ʽF÷)÷"nªmU—ÆZ?'”Ê3Ê¡Ûõ{“yŸL»ÖŸL€`lÔs‚ £ýÀ•Fé°CµŠÒöóª¥þö“*ë‡Ê¹¿§\¾ä˜œÆ¼#³±º,.rÝ+í²œVs]ÜÙzˆûJ®s¥3çr£~5ç²¼ñ)…%óe´÷ŠFKþÊg -7¥š«|ÃÙ–’æNÕ÷„6Ò塃Ëv?t<C®¥ --Í(š×[o)ªÛõÒ1¸ Õm½t<ÝßV0Á\Îrb“2´Xêø`“"ج±é”j¿<ZH;×V¦§sm%›òŠ¶P©¬¸~Îwk»Š -,%S¹)Ì iKäódb=̬º¦JU)ÉTÍb¢¸TæÊ£Xö—ÿZOe)Æ[ÖŠ‰EûŠ$å©âÿeE’²–-ý
–*¥4¹ +<< /Filter /FlateDecode /Length 3406 >> +stream +xÚ½Ënä¸ñî¯è0—,¾ôÌ:Àæ”dn‹=%Ù’9$—ü~ªø©¢¤V»Ù Ç–š,ÖûA-…½üó"ñÿ?¾Hú~vï®ß_~zp ":§Ãåûï/ +É‹ºÄ àâÒ©Ë÷—_¿Hi@Jíß^-X|ò¦þfâò.J _ß~ûþËH)/$Ä‹·R( –“á9œá¾ågómˆOêk~×<Šž
Ž´6ïñ?ëÞ^µóiÊ;\ +oÑéÄò_—ÕãŸøJV ãáh%s‚Ë?ICIlUd˪[þ/æ—‘Þþüýå?|y0È1}ùÛzQÄÊzµ0Æ]þûËï/nÐÁ~A/êÃ_ŠoE*#úVp¦÷¤,VáBA»Ñ¦›ýÔˆÙ‚üýƒâ*å!"¬Ê¯ˆS›køaî¶'Ya³@ÐN8œÉ R&%ýÖf +Mÿ.ügÂlû«Së…õž¯ƒ&Å°"ÆÌúk57ÈKquh,àÂ0£9€ÛZ¤ +Úü}Ùús…¶züH)à‚ÚäTAŽrXΤÊë¿Ô”ºÒIuþ&¦Ö'Ðo¯J¥_Q. +:#ØÞ®§È´ã[þš·6p„—Œà<'¥©ŒUY:åƒ<žØ +Öðt*ÓIþ—tµ–~tü’jWÙbGm±5²“hÕ©6mÁ¡X§mm¥\|9ÃÝ+¡Ve¡ÁÁðÀ@:)@ÁFç쉞øÖŸš ªÈo´w§ÞumhgGO¹¡1ÒC4Ó/Aœo±©0:+ŽIvžg,5‹J»–'Ô +°uÐ/i=;Ò÷«ëÕ +{ +$nüÄÁ:Öù¿z#ƒ²TíݧßȸCpÓ*¥9¦÷ +Ω&žÅÆÞg ï†à¤ÅÂÈßyµT˜›û‹ËÕ…V)YûÉ÷.ªÂMºm²`ï6\ íç›?zãlã— :–mi£°hyóïB€SÂõà]å®»lîîB0O»ÁÖùÐ]Žëí»|Æ
`Ðua¬9¥E·7 +&kØ܈`Î:T¬jšCUSû)þ”-õ¸;å¸ßÓ*_Lbٌ٩,³{\OJû+Óº³'[¯p_¯unqf8îôæ$–ÒÏX2Þ5è£VÑ’¶2ʧàRºŸ™¬w<licæ2¾#\°u®Oˆœ‡Áâ,-
ÏŒKwuX—ðrNQK[ó34µt5Ÿc©á<§»ºôJŸ·˜Ò¼üM-ÌÏÔÔÒÐ|Šµsù šZÛœÐTê·0!œÓTbêVãšú@üÔè’_þÎkmÚXÔ®pâV›¦T7øæÛ—Ú4šýe¢µF³ ÃÌ1y8q¥Îß´»^iKÛh†V&`¨„¾šÎî ôíI°ôªLlORK¡v')4KM¹#§´òej—ìÒ8™Þ.“Œä'tdi¥²ÜFšOþ!ý.'L—8d»çvóQîá‚ xëlž³Ñ|žyÓ·–ç±}§ÊЦ“™žÑÒyômÔT§¡vÞ§†™"„®a$·çø®‡3SS¯—ZO
Oèɳè¶Éé ž¡¨[ÔÀÊÔ›CÒ±ïíH¹sÊ+KáÐõ9êwÄ4BÆ'PgP¯•Z?Tî5Š‹Òôýï™êvYD×µ šM#¼i&ª[«`n+¢ž¾üÛš”Öi×jÁ„¢kíFÅoUÁ’BRª‚ý
ßÿ?¿PüÇòìiä,×Ljž“—_þŠEq.†ÕÅ¢;õvÕ´„ñþ*"_A¶eþÓ;†s$Âêÿà¨Nû¡ÔrÛÙæF›‰¶æf§ÂÄå¯QèÍn…ªPÛøã;eè Ü©¹AC endstream endobj 293 0 obj @@ -792,154 +793,155 @@ endobj [ 288 0 R 289 0 R 290 0 R 291 0 R ] endobj 288 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 111.34 512.361 126.064 523.539 ]/A << /S /GoTo /D (subsection.0.4.3) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 111.34 435.649 126.064 446.827 ]/A << /S /GoTo /D (subsection.0.4.3) >> >> endobj 289 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 138.437 512.361 145.411 523.539 ]/A << /S /GoTo /D (subsection.0.4.3) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 138.437 435.649 145.411 446.827 ]/A << /S /GoTo /D (subsection.0.4.3) >> >> endobj 290 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 309.801 225.804 323.748 ]/A << /S /GoTo /D (Hfootnote.9) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 233.088 225.804 247.036 ]/A << /S /GoTo /D (Hfootnote.9) >> >> endobj 291 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 285.89 266.385 299.838 ]/A << /S /GoTo /D (Hfootnote.10) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 209.178 266.385 223.126 ]/A << /S /GoTo /D (Hfootnote.10) >> >> endobj 295 0 obj << /D [ 293 0 R /XYZ 78.37 808.885 null ] >> endobj 90 0 obj -<< /D [ 293 0 R /XYZ 79.37 567.228 null ] >> +<< /D [ 293 0 R /XYZ 79.37 490.516 null ] >> endobj 296 0 obj -<< /D [ 293 0 R /XYZ 93.716 93.501 null ] >> +<< /D [ 293 0 R /XYZ 93.716 101.456 null ] >> endobj 297 0 obj -<< /D [ 293 0 R /XYZ 93.716 83.873 null ] >> +<< /D [ 293 0 R /XYZ 93.716 91.829 null ] >> endobj 292 0 obj << /Font << /F82 249 0 R /F75 203 0 R /F74 202 0 R /F79 227 0 R /F64 198 0 R /F15 199 0 R /F65 200 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj -<< /Filter /FlateDecode /Length 3247 >> -stream -xÚí\͎䶾ÏSè†KVñX°½ã6`ŸâìÍð)‰spö\òú)þIT‰R«»¥Ä@»[Y¬*~¬*Šß¬føç éÿ?¾Èø+~7÷.ß^>]=^kÑß~QÔHjPÊ apV iÕðíûðëg)”¾}Þóµ~{5`è©ÑtŸÒm{©wµ¬¿Ô×Ü.YB¼Ö$Åú”~ŽdûöÛ·ŸHUgHÓTúc˜]þ<j -¨…SÈ5ÕWÒ”dÉCG2UþÄqÓ˜åw´¢¾ªü¾äg±
\«æÕî¤y±ÛB¶Ö¥gµel‘ìòùcè®Ø3¹¾j¼€Á)”„ªz(v¤A¿¦î‹©Á ”Æ}SeÅ»:šgÆ 3qz²ó
u -tŸZEÊÏ_~lúnÑ·fÚŒÈ+Ö.!"$!ò}ê)0þ7ðï¤YÿQ«©qÂ8ÇÇA͵ŠŽ2ëÏV†áåBF\.ôs(ÀúE;F‚Û(rNxPûP”±¢·°âü=E×~Š
kH\ƒáˆ‚¹l}•uO»ˆ‚‹O! -Eöð±úYo~êêæÚ›ºê粩êΦõBRýÅZ¯—Kh’¢‹Ù© È@à\LtS« M‹@CžÓÙõ8l†~>Už´úEpèM;- -G©…UGXãiSm²× -@8ÿAÁ”u@0åÚBQKç8]öêK&c|˳²³,áqÞ+½¹qÕ•5”͇Xƽ(‚ˆ ÓVJÓ\DzÆö¹T½sÙù…W_™Z»2ëÑÁf!{-Т$€,xWÚ`#]ÎHÜ·Ûiã¿EU€^x*ÜØ1Õìƒ,-^åO¬uB+³×¯„Õ‹ÖN¡I|åì=«‡j&D÷f -cݹ˜
´ƒn§o‘“ -f©œ`üS˜Å˜u½ß‰YTA¸e\/%NH1J-hN ödSÔ†`Öô¤Üª -Vl–Æl¾:.-ª%ŸÊâHKöj‹ùéGwJ´D¡¥éeó|NR²ú<At«2Š€äªÊ~ýîÿ>?EØQ©ðßÔò;•”fUì÷¯á¯T¤å£CÕÝÎÌŽ} –©è¤={óéJöRè$ k:Ñòuñu€¤½¡`ËAM9m³áí¾y÷ás>“CƒÝ3¹¢ËªÁÚÁCºX¶o¸a€ LóêwåTñ@+¦¢ºÏslŒa,صJïŽ^1¤9xWÇ]·—|—-‹òãan<±ËWù\,wˆ¢uÚªÑú2µñŸÓTn.VP:àjß8½[sA,‘ÜÐpª9^ض¥9;×LCÚ -Å#J&9•ô!ëæìt2Ï1älµxcÁxd›Ÿd·½Ê{ÈjEZ¡c;¼ŽÁ‹¡QÓQOõFÁ|-÷#)Á=NÓÅòk\O~Òu„gȨ͖Â%{!&ƒèÓ:‹i›TrÓÑÙ®|Á¥®1€B1ãâÁä‘ò©/h’'SËÑCéj{%%UW•NÑ!ñN5qzr00ãܻń -T¡EÊÕ@Úe˜ÚEU(|”uóV´iÛŽ+0§Ý=ö¥èÄñèÒX›šB³ÚSÓ0Bó‘׃SØê„XÃG«Ï˜/µÉ/ÓÕR_ĵ†h˜IkŒ°¬¤”J´”˜^B62•¼Ó}[ØVStÞŽÌZ®Äz=õIË5Ê0•VÑ0®ö0ÈŠeÞ$ 7–E-Ž›Pxgèq¾ÊxN' ïïv(.¥QûKñêe…Ô¤iAÃTco»›(¥©ú ý~‡L´ƒù7Qvò¼Ö9l/3¶œÖJ òŒ1Rrzd”…ñ^XåÐiÚ‚¢ û8tZn¢å#ôEI›/«¸&÷Ò{[¥ .j„^9™^L NLÑuZ£–^Ðÿ §LÓ?ãcâïeœ¢·ÂÀÿ§óà‡Îcaœ¢œ?{ãôŽÔ‡…ÕnkÔSÞîST—Ž¦ÊÉ Z/ŒÔ'ð^A >I{¹‹õ:ïú -)riè6™@—L¬#$—L\<9?)™Ìe?A|e’vTC¥»=. ZÚ^‡ -¨l¬*×þâ+—±øÊzA|eC<B|åZn_yã#‰¯Löâ+·þHâ+ŸòmâëbªïIl¤3ˆ¯ßn§Ž3üZˆ¯ÜS_wB¶_OÁl!¾îôk!¾²Ö‡_ïX=…øúfñõTÌâë>ßVâë˜Ä×g0[‰¯û0[‰¯Ì>O|e"$¾vj;ˆ¯|’ö_ŸÉâ•øÚ©-î ¾v²y‡øúéJú+EaÊ(·$4ÄÌ¥Ãxˆ‡å -áÄUf +G.™íÑP´œi9®òà*£¡Ûàe½íÈ×pã!ZxCUx|y¤Ä<Ù"ÑÓ$ÍÔÄ0°ž³AZE´#>³G& Ìù„UV!ØxN°™SWF¦VCI‹Jà<®–=ƒ3öOŸà2ž`^8ù¤9mk7RïÓ‹oî´/+»i¤ŠÊZÞfÖ’ÍÆØóRžKÁþ«p4^x¼õl” -åé7¢Û©7#©Xmx?ók«|ÚWØS©¯l)³n-ŒÔb{’¹º0VÚâµÕ²¶«Àt=`¦¾‰ft@>ÃÔ(=1ŲÄSéy¢ˆV.X=o)‡•Ä9
:Â4‰Œüš¨ØœÚ*8ñ¡¡Ö#ㆩŦ×ÚsØîôæåðÞ8leÉÔ¼³$O†þ.Nu††Š; -ìõÍ%·$'øB…¯¦fG%7|iHcje¬¾ìˆõºÄ´½ó)-Ó v‘ãA;áŒáÖX`¤E(‡îî$Šl%*®{¸eêËlÆ73¥Ý¾ôWëi©¦wi]ØÎg3—+$ÝH: -|€4ÕÈÁrK̇îúq[g…•±]–bßge]P@óµ÷®-³&%.]˜iñs± +<< /Filter /FlateDecode /Length 2902 >> +stream +xÚí\Ë®ä¶Ý߯èß`p·oî +ß–çvö-·•ïøæ¹MêïËsÜSzêå¸(ƒÈwSº×Ÿ¿ý@u7œ .çº+´×׬«zϲ¢Žñ~|õŒ¿ãXÑŽ¤—Í}êu²Oç¾±]êëŠ:ë]ÛÆgNæëh_œŸ8n__˜Ðj®ï–>=ôeJÏ„×Mæ{‘ç^?i¾”(³¥ÅëäQÌ®‹ïDÔÙ6ÑÒï£ÏäŠǤ4u0½ÈéúK‡v/¬ Èà2\·LZ[e%ƒ#`âµ~kù¾!ñy4ÆØ4gÎ`„4ä?.‹Ë?6M$ð§šè8…oN.O‚i(ã•ßª@_Ùâ*ž¡f›õÕ¦¤ñÛÔ"¶véYm[${|Y¾¹{¾šÎ°Á0Å]U;!ßo;EµÉŒ^ÞpŠõš)Ž9%®‘d8nÛëäª#È3¥ßy§)ÍœPTÓ³N³brM[_ïä8§˜ +Ôo-JmxÆJ¦•8æ™Ã· MóWY(qîÓ +çùãuôE|n¯Ó=–mS´(}¶Û6¼¹Ý2Ú³éæ³]±QãmÒõm.¯ dý¬L»u(ÙæT$µ¾jOÖí,‘=ßqÈøöò/:¤PH¾úò—__âm,3Ê\„fZÛË¿ÿvùååO“4ÒøàA¼Q/~,I«% ÉKˆ›%ù¸JŒÀ@Žù`;Yb®/„èžÌãÈ[DŠ8÷©UÔªüüñ묯aÒúöcÃB›&³b¡–ù«h¢âú4ë?škj3ÎÑq”¦Zʼn2ëϹ¬RÏW2r^í[‡` _õ˜2ðm! Ž¡(cEïazŠ4nþ)6l!q†
KÙú…aNéžv
‹!@!š ¼¡Z†}\RjlÙÉÌ{KûnaD;&ĪõQ|²ÓèQø0A±àM£ð"-°‡ŽÕÏz‡ðSV÷Jû¸)«žÈF%Ôõ¦õŒc+FZoWK4”\«”< +üAÃc½é½û÷§C¬z¹d™<˜?°â¥U·ÝVZ[8hÕú9 Äà&Š`!‰´u¯'£à»q5”A
ís2ÈRöòý¹²”t8–F°¨aû4q'>&˜’±Sª}™CYÔÒyN—½º’Èhow6v”%<.{¥76nP=YCÙrˆuÜÛ‹â!°Xø-åFIšëWÒØ)Kµ»”_tõ•©5+±~ˆ6Ò +Àf°eËæ›ãbé –|(‹+,iT¯¶Xžzt]¢¹bš›^6Ïç#%«/D¯*S†¡tˆUÙO?ãþ_ñù!Â¥ÂRË_Q: ÍŠØ?£HË쨎ºÛ™{À´D,”(6,}oóùö:tâ6ë„åëâ« +]Œg'k‡:Ö·]ù,Xå³`ù*]Kêº7¸æ»0üSy\”o‡¸ñ¨._å±Ü!„V·U£õujã¿$Wî-/OÞˆÚ7Ží¶¦ Ö€$97à©æ(,°uÌ9xr¸ešÂ^(/ˆäTÓ‡¬[dÌÔyŠ!g«ÅËÙ¨ì›zÏjó“<íWe¼\«SæíÔ{‹^Z«iÿ¿âÉ@J°E„Ót… R~u™Bž!£¶òŽò,ìqÒ™l×B~iàï1‚Ê:båôÈâ[>õ
MšÉÔ²ÍPºÚ_IIÕÙT•NqBâjâôd00ãÜ»•C +Yø)ï¼BÂ9ú”†%”ì4)Òªi +TaŽ Å7U˜/ÃÔ.Sþêºy-ÚÌÛ¶˜ÓîûRtHâ[<ºÎ¬MMålµ§¦)`„æ5j.9½Bë¤T
s}Z +¼Ö&-^¦«µºˆk
1c$í³B56úw =Æ+vq”«Za`ž=¦WOÅ áå‘ñŽ2Psî»2«×
.“ò–9–iªœÁ.ꃘ¦ +ùÄr;„iŠºÛ
÷`šM~/LS¥‘¼Ê4UJ¤c¹ß>Ó”hú{bšB2sî$Ó4¾vòâÿLÓeô‹¯½Ã4•>rý†0MOä>‰½cPzoÔ;sÞáSÔXŸ:ßhÊzf¸~ßUìpò]‰”S|WÒ÷¾+‘ð4¾+ç.¾+Õõ6ß•ö8Áw• +KQÑíãe©‘“|ÊQ<‘}ݵ£Ýpº+ÕrŸîºÒèÝ•ô½Aw%ÃCÆ—f>búçîCèt¬Çé+íÒ]‰ìtWÒú#è®Ç¬ +ùõ.ÌòëS1[ȯÇ涒_ŸÙJ~}³•üz³•üºÂìãäW"òNòk§8A~¥N:N~}$‹Wòk§¶8A~ídóùõó;ôG1Œ‰/–)§Ahl‡ÜôwWÊš +¯Ÿà‹ÄٸΉ«ä@WŽ]꟔j,-gæ4W©p•ÖÐþ<Ôu»m£l¸v^•(T¾<R"ŸìñhŠiHœÊOÿ¸ÖSBÈœFQÿ4Ö’(ØÈ$rI)œéQeŽ§›%{EÉFÖš±RZQ))•kN QPŸãÒN1¯”2;q›ï£&ê‘J¯½é¤}—ñ°±™V¨PÖÒ^ra]áÙìŒmT^ÊK)ªÿ"\™|æHZFpoÂ%“â<Õ;2ì;Di܈[Óyeyƒ+€•ú0²÷®
øòÂw¶Ê7l@üAóÿÝûí[ÆÙ5‘ºûŽsf(ù/‚î,è endstream endobj 308 0 obj -<< /Type /Page /Contents 309 0 R /Resources 307 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R /Annots 318 0 R >> +<< /Type /Page /Contents 309 0 R /Resources 307 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R /Annots 317 0 R >> endobj -318 0 obj -[ 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R ] +317 0 obj +[ 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R ] endobj 299 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 666.115 226.041 680.063 ]/A << /S /GoTo /D (Hfootnote.11) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 589.403 226.041 603.35 ]/A << /S /GoTo /D (Hfootnote.11) >> >> endobj 300 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 642.111 262.242 656.152 ]/A << /S /GoTo /D (Hfootnote.12) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 565.399 262.242 579.44 ]/A << /S /GoTo /D (Hfootnote.12) >> >> endobj 301 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 303.836 229.772 317.784 ]/A << /S /GoTo /D (Hfootnote.13) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.345 227.124 229.772 241.072 ]/A << /S /GoTo /D (Hfootnote.13) >> >> endobj 302 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 279.926 266.385 293.874 ]/A << /S /GoTo /D (Hfootnote.14) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 255.958 203.214 266.385 217.161 ]/A << /S /GoTo /D (Hfootnote.14) >> >> endobj 303 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 322.429 199.047 337.153 210.006 ]/A << /S /GoTo /D (subsection.0.3.2) >> >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 322.429 122.335 337.153 133.293 ]/A << /S /GoTo /D (subsection.0.3.2) >> >> endobj 304 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 352.875 199.047 359.848 210.006 ]/A << /S /GoTo /D (subsection.0.3.2) >> >> -endobj -305 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 235.007 172.158 245.433 184.439 ]/A << /S /GoTo /D (Hfootnote.15) >> >> -endobj -306 0 obj -<< /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [ 111.059 73.308 240.514 84.928 ] - /Subtype/Link/A<</Type/Action/S/URI/URI(https://dejavu-fonts.github.io)>> - >> +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 352.875 122.335 359.848 133.293 ]/A << /S /GoTo /D (subsection.0.3.2) >> >> endobj 310 0 obj << /D [ 308 0 R /XYZ 78.37 808.885 null ] >> endobj 312 0 obj -<< /D [ 308 0 R /XYZ 93.716 611.825 null ] >> +<< /D [ 308 0 R /XYZ 93.716 535.112 null ] >> endobj 313 0 obj -<< /D [ 308 0 R /XYZ 93.716 602.018 null ] >> +<< /D [ 308 0 R /XYZ 93.716 525.306 null ] >> endobj 94 0 obj -<< /D [ 308 0 R /XYZ 79.37 229.856 null ] >> +<< /D [ 308 0 R /XYZ 79.37 153.144 null ] >> endobj 314 0 obj -<< /D [ 308 0 R /XYZ 93.716 105.863 null ] >> +<< /D [ 308 0 R /XYZ 93.716 102.097 null ] >> endobj 315 0 obj -<< /D [ 308 0 R /XYZ 93.716 96.236 null ] >> -endobj -316 0 obj -<< /D [ 308 0 R /XYZ 93.716 86.608 null ] >> +<< /D [ 308 0 R /XYZ 93.716 92.47 null ] >> endobj 307 0 obj -<< /Font << /F82 249 0 R /F75 203 0 R /F74 202 0 R /F83 311 0 R /F53 210 0 R /F15 199 0 R /F65 200 0 R /F16 201 0 R /F64 198 0 R /F79 227 0 R /F71 212 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> +<< /Font << /F82 249 0 R /F75 203 0 R /F74 202 0 R /F83 311 0 R /F53 210 0 R /F15 199 0 R /F65 200 0 R /F16 201 0 R /F64 198 0 R /F71 212 0 R >> /ProcSet [ /PDF /Text ] >> endobj -321 0 obj -<< /Filter /FlateDecode /Length 2292 >> +320 0 obj +<< /Filter /FlateDecode /Length 2616 >> stream -xÚµZIo+¹¾ûWèøó‘U\€'Ë -œø6Éa0ÈÌa02È!??U\šK³[’ílõÂ*ÖòÕB²¥0‡_’þÿùIòÿ6ÏÎoOß®N‚¬>¼ýò¤h<¨ƒÂ£:8«„´êðöûáÇ£”`OÿxûË2HI) ÀÁé ”´e”~‘Ò^è÷L(%ÝËÓ³CoQ—+¸Ì¹¡Ê,sZzns ŽÄIg<O¸éô>Ž¥_¼J©H£Y‚[s‚*˜ý9‰—'¯ôKïaC8§÷Ú§_æ6Ñó5Ëäè\KÅ3Åã’+ ‹àF²:+’¹ßR ðæ>®É,N5ê^7LÃ`pYI¨æ×·µIÄc,cŒÉ£g ã®Ø2ïݸuN 3{³ ͳ\’¯Ë,Ñç—)¾…L×NÏ‘„äKÏ\èPµ¡¡5BÃÐßótçª$+fç{CƒB[}[Ždtí2ê|zçp#\ª\Ì':Ï'ã'µº=¦Ñ¶.Z #Óe$*ÿ切 ŒÑ{€Ÿñ<ÍüÎmŠ¹Ê Ân~O¶ŒÞê4¸Í]aõ®.ì¶kŸor6å…sFB)ü[b¯Íõeô»£¡•*×Vã•p5£åA¥N»{ð#Ûºì( ºƒÑNøZo9Ht†$#¢6ê„£ ëÉ%¦¯I#ã’½%63!JfäÃþŠ•³(,’ÛGY)‚žÊƒÌoO†l -ÙòðÇ?¿<ýç—}û®¹e%g`¥—NæÔ6»ˆïÕZÞŠ©¹I@dà
Š3ŠÙç׆imjcµI#50Î9›`ß…Ê‘5VúHí>T³?•¡…Bý[‰Fzº”¼Lù몪Œ&Œ8´SŒeûì
ŸA›ƒg¹‚*¦‰ø줎ùñKr*Ó×Lê}Ìß…¤Pçë5 KÕ¸óeSÏ8I®ÐžàŸãŠWsÆ°ÆSÙÀ2UÔh<3Z¢2¿Ž¾±
{µÁÞöcÖݱˆÓàîs,2ðšƒs_ª=m$™"BO¡¸›7•ä…âlÞˆ7úU -7â›<)¬Ù0á#:(´H\14).»×,9mK)bàôT2%·2oŠ2þI‘6@™¨i’”8ÇlÊ¥äù&
ЬßÏy梊íü4&Ûlcô‚pïÇEO_dºÅ'k -@ ‡c¬S€ -„^}žH}}€/J?½j_ˆ`…”¾çøþ(`„ͤpîË»" ðZÄHÄhÚ‰QOMMG™d$‹)ãGÀ”Å´-k
a
“R£‹¢š§}QyÆv•û¢zj0mXaÛ>PO©÷öhߟ7{ú’7cÎöwåÍžÁ4?bÂû;3Cm…@–Â<ãé¼ð‰9w`קqA¸k4BÓÒg"~½9sNÒãÌ/7³{^‚NfÙ;gmw5d^ño.`ÐZܽîÙr—|.+†J-~l6.éíÂu$1õ“s)ccÉ4ýØÄr>SÈÐZH™OGÏðýy"Y÷oW -G¥D0F¹u Sª6°èóÆ®?=³¡¹½”òF¥Íñvoä•í"¼–§FŸ-èlÝ0*›ãqPŸö’VGR»¤èÅ-Îkš¼=¶›u'pÇÔRð=¦Í»¬ñ¼äóžÄz’;ö÷É -çÃÈUç²$uÜD»”»ÄµÎ sÑ‘.Ÿ€ð›¢1[¼9Ö¹´å–Þºe^Ó4!Õ~eîجœsófsóºrg¡nJ7ÞÀd·2OÏ!m òßôb¸|ZYfÏOßxuHӯܸjÙc}jÜ°8Ûu~®$Uéõ²é¯Mwg庻£§jlj¦@"Õãy|ëÌ:WÙȨ\Z—fNç>$ -`âA2a`Ëw®CÏ_›Ýs²P9R*o¡Su«šÂµž7T®C¹ƒÇ>Ž -ɾú¤žÑ¦SýLo6‚e^å¨Án£G£íÅð¾=®˜Øê¨iôaA'àÙ|°˜Âp$-‹i[F-ÇLjF¿ˆ®‹íhõrªÇ¹JÍÚ¢¾§úÝÇiZÛÒ«U{„Û0XB¹ß³˜E68Rwîꙃ®ð/æåO6b;s©µ%¾—‹çžÀÛrØòäåB4´ŸyÔYÚSi̺ì~wڜע™x^ÃÂüvènÿÚlZÏŽB>–¶w$= -êžW&p¨åÀÓ”+#×oŠé'kA
íχ@bÛƒ®Èá=›OeKbçpkëp´öâé*¨¸öhf(&q]ä“å)fÏ[J*ÂHÎqÇAÖ Ðî†%-iø·Åy‘íú°|WÞøÂ^ûkEíœÐö='%㱤B%Ðo~J€B¨¼ÔM¨I(®ðtÿa•-Ç×—,›ž½|…Ô'¯\ÚmÞlô¥ó2ÒIGeV}DºMìL¤¾!M0¨ÇM¥÷Öny9[>÷àý:|”‘Ÿ•6·4ûåŒaCXJÆ~Èr+4?n1ê|¸¦uCpÞPØkìA˶î0ºìy•V_ßžþqjõ +xÚµËn$·ñ®¯èã.qIŸÀz€fûdG7ÇÉ}H6@’ÏOÉj>šÝi•ÃL¿Èz¿È¢\þXäòùN–ëùéîÃUÙ%Šè´3ËÓïw +?ÈE-> +ð‹wJH§–§/ËÏ¥ôê +zÔS9Óãpr¶Ø¾–Ô‰ÿŸweVüB{¡BxÄp|ÈæªYW%¨ +cý1άTRbRÄ
«#‡|%¤|šO÷D ÙÌ"ŠiÆË)7 ¬\¥e%Ï«ØXí/Ñ(a¿
j–‹W
¿×Ù@v¤ÕÑŠ|9Ó¤¢°QµVÆuDN~8SËciÆšfoå\záÀaW«’”ê–’ ¿…ó=û|OµÓÌ–°Ö’îœOcWsm´Â…UŽúSŸx@¯iáì{‡Ž +â·/wôWÖ…EiÂ\¾þmùýîÇ\»,Ÿ‹VâJÅê
[&‹Ó¸¢#³®†fð÷ÄÚÞÈ72)ýÚ +'ÐYð:Ë£46üHrîˤ˜EÆ„‹¦µ„ú›ùÑØù +†¼@ +}ä™ïž"é¡•^ŸÊܺë›Já²w)ǯu߸ÝëäͼEP„ªýtcUbµlGË»_¿þöï_ÿùþÞ¿ûÃ÷y>Èé| ¥:ôóÿûþ¥ºgŸ©÷÷ZëwÊ—žuLDtÉ$:ˆßSÒ ²°Þ¿ûî!àJ&5Nœv»ƒ0ã`QÓÍÕï¶[%¦l
†WÓŽW;ÄZt&¥F%6OǤz/ r•Ç¤-ÀÅm»äS +ŠÊ,ivÆñÃÕÂâqžDxmNÇ©ðø B{ú xc;HŠMµÜý@´La*Š¡vJbL™‚ãWŽW—\jòÙ8r©ärhqNïUw¬+š¤Kg.‡·z`;'?£91²[7²óƯPÇÿ-G@N endstream endobj -320 0 obj -<< /Type /Page /Contents 321 0 R /Resources 319 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> +319 0 obj +<< /Type /Page /Contents 320 0 R /Resources 318 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R /Annots 326 0 R >> endobj -322 0 obj -<< /D [ 320 0 R /XYZ 78.37 808.885 null ] >> +326 0 obj +[ 305 0 R 306 0 R ] +endobj +305 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 235.007 746.067 245.433 758.348 ]/A << /S /GoTo /D (Hfootnote.15) >> >> +endobj +306 0 obj +<< /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [ 111.059 74.103 240.514 85.723 ] + /Subtype/Link/A<</Type/Action/S/URI/URI(https://dejavu-fonts.github.io)>> + >> +endobj +321 0 obj +<< /D [ 319 0 R /XYZ 78.37 808.885 null ] >> endobj 98 0 obj -<< /D [ 320 0 R /XYZ 79.37 336.228 null ] >> +<< /D [ 319 0 R /XYZ 79.37 266.49 null ] >> endobj -319 0 obj -<< /Font << /F74 202 0 R /F96 323 0 R /F95 324 0 R /F97 325 0 R /F15 199 0 R /F27 205 0 R /F30 206 0 R /F64 198 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> +325 0 obj +<< /D [ 319 0 R /XYZ 93.716 87.403 null ] >> endobj -328 0 obj -<< /Filter /FlateDecode /Length 484 >> +318 0 obj +<< /Font << /F15 199 0 R /F79 227 0 R /F16 201 0 R /F74 202 0 R /F65 200 0 R /F96 322 0 R /F95 323 0 R /F97 324 0 R /F27 205 0 R /F30 206 0 R /F64 198 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +329 0 obj +<< /Filter /FlateDecode /Length 620 >> stream -xÚ•S»n#1ìýú+¤¤n“ø€«·ÒÞUùÿöHQÚ‡í
B+‰KÉÑ|vÿÈ÷÷ ô¤ûÆ6ͧ—'W}¥@ÉÍO(NàÐ!‚çz tó—û¸ +xÚ½UËn1¼û+ôaDI$%À0Ðmâ=ûVôÚžúÿ×zìÃöºMô`¯V¢†ÃÑPëÜoçõÿÛÁÛÈž«¹érx>Kr +Nîòë€äº\ GtžÑ]þ¸GïŸ~^¾ÏAè=„œ¤èyŽJÞÇà}zÑñÙvyO:'úä¢k:GØÖiÒu¹pjhI‘¨fSCLYŸŠ†_·HèAH‘Ú«" ŒN0BH#¨Õ¢i)·,mê…Ù:‘þ^:5‹‹^YèûÞÒÖÆ<‡&L21l,
‹vÈy}fú»Ûž8-qõhî°þV{Äøn2ÝËiÝî5r±“á×[ãVsvêFÔÜ`±›÷ÉŠ@”OIwãæHÆ)|„Ä=Ðnl¦‰gÏî4'òeÓH;^ÓRìàh¼®‘GþP€(½¯E[¦ÿm;&¸i5žÍ³¯ +P)®·Ôߪì 8í›ho‰£AÛl“{É©Ë]šžÔJ®ë&½Ø¯âŽ›ÿùŒtïªïùAd¾m9·{ºe8=¥LÇQâ)ˆŽÅ/=z MKL®6¯ö>2È’væUî½õ϶Z‰Ý5Ü«QåJxSeW-qã7Õ6+Ú‡¡Æ›qºwW´¼Ùã›AùJiúô\fÃOOÒeµ8²-ænšV]Q;n¬Z‡ÛLí·©amÊ,g¼þiVŒ;v$µ.Οø½òM cPö·vŸ—¸Ib¿*\í¨Ç–É0‡k>ïÿú>¶1 ÜV7
5G— endstream endobj -327 0 obj -<< /Type /Page /Contents 328 0 R /Resources 326 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> +328 0 obj +<< /Type /Page /Contents 329 0 R /Resources 327 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj -329 0 obj -<< /D [ 327 0 R /XYZ 78.37 808.885 null ] >> +330 0 obj +<< /D [ 328 0 R /XYZ 78.37 808.885 null ] >> endobj -326 0 obj +327 0 obj << /Font << /F74 202 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> endobj -332 0 obj +333 0 obj << /Filter /FlateDecode /Length 1952 >> stream xÚÕZÉŽÜ6½ÏWè†!«¸Fîéé @@ -952,19 +954,19 @@ E»ªË>{˜ÎP×ò´H©süD¾@gý™SiÇ|¥ÐLêÞ—·ˆ’Ç› ^gpl†šhí›°í‚cÃÒUœqÈFÒæ§Æ%Mm£Þxš endstream endobj -331 0 obj -<< /Type /Page /Contents 332 0 R /Resources 330 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> +332 0 obj +<< /Type /Page /Contents 333 0 R /Resources 331 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj -333 0 obj -<< /D [ 331 0 R /XYZ 78.37 808.885 null ] >> +334 0 obj +<< /D [ 332 0 R /XYZ 78.37 808.885 null ] >> endobj 262 0 obj -<< /D [ 331 0 R /XYZ 79.37 634.719 null ] >> +<< /D [ 332 0 R /XYZ 79.37 634.719 null ] >> endobj -330 0 obj +331 0 obj << /Font << /F22 228 0 R /F15 199 0 R /F74 202 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> endobj -340 0 obj +341 0 obj << /Filter /FlateDecode /Length 3591 >> stream xÚåÉŽ+·ñþ¾B?`š,îÀ` @@ -980,49 +982,49 @@ C¼ï™áB·Î½Aöä·šÁä+íÃd7¹kÿ™‚ë …AÅžxaÃFp.u7‚ª~:\ˆ'4?¤;ªÚ%åiDîĘG÷@#ÕÌòÜ *(¡MØ endstream endobj -339 0 obj -<< /Type /Page /Contents 340 0 R /Resources 338 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R /Annots 347 0 R >> +340 0 obj +<< /Type /Page /Contents 341 0 R /Resources 339 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R /Annots 348 0 R >> endobj -347 0 obj -[ 334 0 R 335 0 R 336 0 R 337 0 R ] +348 0 obj +[ 335 0 R 336 0 R 337 0 R 338 0 R ] endobj -334 0 obj +335 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 410.21 667.813 420.636 680.333 ]/A << /S /GoTo /D (Hfootnote.16) >> >> endobj -335 0 obj +336 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 219.594 578.502 226.29 589.69 ]/A << /S /GoTo /D (Hfootnote.17) >> >> endobj -336 0 obj +337 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 224.825 566.557 231.109 579.283 ]/A << /S /GoTo /D (Hfootnote.18) >> >> endobj -337 0 obj +338 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 308.511 555.488 314.795 565.78 ]/A << /S /GoTo /D (Hfootnote.19) >> >> endobj -341 0 obj -<< /D [ 339 0 R /XYZ 78.37 808.885 null ] >> +342 0 obj +<< /D [ 340 0 R /XYZ 78.37 808.885 null ] >> endobj 102 0 obj -<< /D [ 339 0 R /XYZ 79.37 771.024 null ] >> +<< /D [ 340 0 R /XYZ 79.37 771.024 null ] >> endobj 106 0 obj -<< /D [ 339 0 R /XYZ 79.37 748.402 null ] >> -endobj -342 0 obj -<< /D [ 339 0 R /XYZ 93.716 274.562 null ] >> +<< /D [ 340 0 R /XYZ 79.37 748.402 null ] >> endobj 343 0 obj -<< /D [ 339 0 R /XYZ 93.716 236.362 null ] >> +<< /D [ 340 0 R /XYZ 93.716 274.562 null ] >> endobj -345 0 obj -<< /D [ 339 0 R /XYZ 93.716 198.504 null ] >> +344 0 obj +<< /D [ 340 0 R /XYZ 93.716 236.362 null ] >> endobj 346 0 obj -<< /D [ 339 0 R /XYZ 93.716 99.26 null ] >> +<< /D [ 340 0 R /XYZ 93.716 198.504 null ] >> endobj -338 0 obj -<< /Font << /F64 198 0 R /F15 199 0 R /F65 200 0 R /F79 227 0 R /F81 248 0 R /F74 202 0 R /F16 201 0 R /F75 203 0 R /F83 311 0 R /F53 210 0 R /F73 215 0 R /F59 211 0 R /F98 344 0 R /F71 212 0 R >> /ProcSet [ /PDF /Text ] >> +347 0 obj +<< /D [ 340 0 R /XYZ 93.716 99.26 null ] >> endobj -350 0 obj +339 0 obj +<< /Font << /F64 198 0 R /F15 199 0 R /F65 200 0 R /F79 227 0 R /F81 248 0 R /F74 202 0 R /F16 201 0 R /F75 203 0 R /F83 311 0 R /F53 210 0 R /F73 215 0 R /F59 211 0 R /F98 345 0 R /F71 212 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +351 0 obj << /Filter /FlateDecode /Length 2599 >> stream xÚÍ[;#¹ÎçW(ôË#‹o`1Àh%àÌÀdöE†ÏѾÿ¸Šo²»¥ffwƒÙ•º›ÕU_½‹?ý÷ÄO¿½ðáÿóû˯7«NžyFÞÿxxƒŸÄÉz&íÉÁ¸§÷?OÿüÊ9(ÎÍ5þiü¬ @@ -1038,130 +1040,130 @@ V¢Ýø”gÊÝI9†ÅYé&¡5ö—Ô“ªKþ+8™"ëÂõÊ3vùô#,Äfˆ\ŽŒõ5Íf‘“Ži^LG]ç¯_]ŪÕL¡¦ëej÷ ÓŸðt„«e`²¼|ÛqsR`’gë™×õoÓUì@Á¦¹™I\Ê´‰O(m¨£•u¢¥z»®Ï'ºk×z>#µk=a.õ´ÄøÞ~æ·äŤç²L¡ÎZý2P½UÚ¦È?«!ƒà{h54Ysòq×ö´Ë|½—Ö]*ùþe…ƃyöùµŽ:[BwÌbZ+Ú1L©V&+©xÒY%—á½=çh»e¿ìµgÕD PM¾0
o×æÐÊà‡ËóÚ¯ò(–cÕÄ:eƧNgsõÿHÁÕø–ãÉ·ú-Ë•ZùG\—š!ïÑ9䵕pòðî@a×ùZ«¼ßÓMòf× Î5\ô[G³Óõ†tÜ÷ÎIÃÙûŠO˜í÷µ‰©Ný¿Ãߦ»`27¿ï–GÇ{°ûߺâÛ ÿ$Ó|Ë»]зÝÅz§_ŸwÂÆßOÊsÓÿ\ÂNgÿŽmo`F›“âáדÛ;×÷—ÿlôÜ endstream endobj -349 0 obj -<< /Type /Page /Contents 350 0 R /Resources 348 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> +350 0 obj +<< /Type /Page /Contents 351 0 R /Resources 349 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj -351 0 obj -<< /D [ 349 0 R /XYZ 78.37 808.885 null ] >> +352 0 obj +<< /D [ 350 0 R /XYZ 78.37 808.885 null ] >> endobj 110 0 obj -<< /D [ 349 0 R /XYZ 79.37 687.997 null ] >> +<< /D [ 350 0 R /XYZ 79.37 687.997 null ] >> endobj 114 0 obj -<< /D [ 349 0 R /XYZ 79.37 669.872 null ] >> -endobj -353 0 obj -<< /D [ 349 0 R /XYZ 77.176 650.605 null ] >> +<< /D [ 350 0 R /XYZ 79.37 669.872 null ] >> endobj 354 0 obj -<< /D [ 349 0 R /XYZ 77.176 639.646 null ] >> +<< /D [ 350 0 R /XYZ 77.176 650.605 null ] >> endobj 355 0 obj -<< /D [ 349 0 R /XYZ 77.176 628.687 null ] >> +<< /D [ 350 0 R /XYZ 77.176 639.646 null ] >> endobj 356 0 obj -<< /D [ 349 0 R /XYZ 77.176 617.728 null ] >> +<< /D [ 350 0 R /XYZ 77.176 628.687 null ] >> endobj 357 0 obj -<< /D [ 349 0 R /XYZ 77.176 606.769 null ] >> +<< /D [ 350 0 R /XYZ 77.176 617.728 null ] >> endobj 358 0 obj -<< /D [ 349 0 R /XYZ 77.176 595.81 null ] >> +<< /D [ 350 0 R /XYZ 77.176 606.769 null ] >> endobj 359 0 obj -<< /D [ 349 0 R /XYZ 77.176 584.851 null ] >> +<< /D [ 350 0 R /XYZ 77.176 595.81 null ] >> endobj 360 0 obj -<< /D [ 349 0 R /XYZ 77.176 557.231 null ] >> +<< /D [ 350 0 R /XYZ 77.176 584.851 null ] >> endobj 361 0 obj -<< /D [ 349 0 R /XYZ 77.176 546.272 null ] >> +<< /D [ 350 0 R /XYZ 77.176 557.231 null ] >> endobj 362 0 obj -<< /D [ 349 0 R /XYZ 78.499 535.313 null ] >> +<< /D [ 350 0 R /XYZ 77.176 546.272 null ] >> endobj 363 0 obj -<< /D [ 349 0 R /XYZ 78.499 507.692 null ] >> +<< /D [ 350 0 R /XYZ 78.499 535.313 null ] >> endobj 364 0 obj -<< /D [ 349 0 R /XYZ 78.499 468.117 null ] >> +<< /D [ 350 0 R /XYZ 78.499 507.692 null ] >> endobj 365 0 obj -<< /D [ 349 0 R /XYZ 78.499 424.418 null ] >> +<< /D [ 350 0 R /XYZ 78.499 468.117 null ] >> endobj 366 0 obj -<< /D [ 349 0 R /XYZ 78.499 392.675 null ] >> +<< /D [ 350 0 R /XYZ 78.499 424.418 null ] >> endobj 367 0 obj -<< /D [ 349 0 R /XYZ 78.499 355.046 null ] >> +<< /D [ 350 0 R /XYZ 78.499 392.675 null ] >> endobj 368 0 obj -<< /D [ 349 0 R /XYZ 78.499 344.087 null ] >> +<< /D [ 350 0 R /XYZ 78.499 355.046 null ] >> endobj 369 0 obj -<< /D [ 349 0 R /XYZ 78.499 333.129 null ] >> +<< /D [ 350 0 R /XYZ 78.499 344.087 null ] >> endobj 370 0 obj -<< /D [ 349 0 R /XYZ 78.499 322.17 null ] >> +<< /D [ 350 0 R /XYZ 78.499 333.129 null ] >> endobj 371 0 obj -<< /D [ 349 0 R /XYZ 78.499 311.211 null ] >> +<< /D [ 350 0 R /XYZ 78.499 322.17 null ] >> endobj 372 0 obj -<< /D [ 349 0 R /XYZ 78.499 300.252 null ] >> +<< /D [ 350 0 R /XYZ 78.499 311.211 null ] >> endobj 373 0 obj -<< /D [ 349 0 R /XYZ 78.499 289.293 null ] >> +<< /D [ 350 0 R /XYZ 78.499 300.252 null ] >> endobj 374 0 obj -<< /D [ 349 0 R /XYZ 78.499 278.334 null ] >> +<< /D [ 350 0 R /XYZ 78.499 289.293 null ] >> endobj 375 0 obj -<< /D [ 349 0 R /XYZ 78.499 267.375 null ] >> +<< /D [ 350 0 R /XYZ 78.499 278.334 null ] >> endobj 376 0 obj -<< /D [ 349 0 R /XYZ 78.499 256.416 null ] >> +<< /D [ 350 0 R /XYZ 78.499 267.375 null ] >> endobj 377 0 obj -<< /D [ 349 0 R /XYZ 78.499 245.457 null ] >> +<< /D [ 350 0 R /XYZ 78.499 256.416 null ] >> endobj 378 0 obj -<< /D [ 349 0 R /XYZ 78.499 234.498 null ] >> +<< /D [ 350 0 R /XYZ 78.499 245.457 null ] >> endobj 379 0 obj -<< /D [ 349 0 R /XYZ 78.499 220.596 null ] >> +<< /D [ 350 0 R /XYZ 78.499 234.498 null ] >> endobj 380 0 obj -<< /D [ 349 0 R /XYZ 78.499 209.638 null ] >> +<< /D [ 350 0 R /XYZ 78.499 220.596 null ] >> endobj 381 0 obj -<< /D [ 349 0 R /XYZ 78.499 198.679 null ] >> +<< /D [ 350 0 R /XYZ 78.499 209.638 null ] >> endobj 382 0 obj -<< /D [ 349 0 R /XYZ 78.499 187.72 null ] >> +<< /D [ 350 0 R /XYZ 78.499 198.679 null ] >> endobj 383 0 obj -<< /D [ 349 0 R /XYZ 78.499 176.761 null ] >> +<< /D [ 350 0 R /XYZ 78.499 187.72 null ] >> endobj 384 0 obj -<< /D [ 349 0 R /XYZ 78.499 165.802 null ] >> +<< /D [ 350 0 R /XYZ 78.499 176.761 null ] >> endobj 385 0 obj -<< /D [ 349 0 R /XYZ 78.499 154.843 null ] >> +<< /D [ 350 0 R /XYZ 78.499 165.802 null ] >> endobj 386 0 obj -<< /D [ 349 0 R /XYZ 78.499 143.884 null ] >> +<< /D [ 350 0 R /XYZ 78.499 154.843 null ] >> endobj 387 0 obj -<< /D [ 349 0 R /XYZ 78.499 104.308 null ] >> +<< /D [ 350 0 R /XYZ 78.499 143.884 null ] >> endobj 388 0 obj -<< /D [ 349 0 R /XYZ 78.499 78.635 null ] >> +<< /D [ 350 0 R /XYZ 78.499 104.308 null ] >> endobj -348 0 obj -<< /Font << /F74 202 0 R /F99 352 0 R /F64 198 0 R /F22 228 0 R /F59 211 0 R /F82 249 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> +389 0 obj +<< /D [ 350 0 R /XYZ 78.499 78.635 null ] >> endobj -391 0 obj +349 0 obj +<< /Font << /F74 202 0 R /F99 353 0 R /F64 198 0 R /F22 228 0 R /F59 211 0 R /F82 249 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +392 0 obj << /Filter /FlateDecode /Length 1912 >> stream xÚí[Ënë8Ý÷+òW•H=¢@Ó$˜uwƒÙάæÿ·#É¢õˆ“˜nÚ›î"ãXGä!E9®Üý³“»ŸO’Þ…IGñïϧýÇÓóÉ„Á+„ÝÇßO*^$wjç¸sV iÕîãßÝŸ/RÚ·øÒ¯}ü1Ã=Ÿ<ì¼Ö¢oLJ8ü @@ -1174,179 +1176,179 @@ O{¼ §þ'íÝ£ÝYz;+,Ì‹DùÿÖ|¿ðžÍ\&7.ZŠP‹AúGº¡¾?žþIßÚ endstream endobj -390 0 obj -<< /Type /Page /Contents 391 0 R /Resources 389 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> -endobj -392 0 obj -<< /D [ 390 0 R /XYZ 78.37 808.885 null ] >> +391 0 obj +<< /Type /Page /Contents 392 0 R /Resources 390 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj 393 0 obj -<< /D [ 390 0 R /XYZ 78.499 768.829 null ] >> +<< /D [ 391 0 R /XYZ 78.37 808.885 null ] >> endobj 394 0 obj -<< /D [ 390 0 R /XYZ 78.499 757.87 null ] >> +<< /D [ 391 0 R /XYZ 78.499 768.829 null ] >> endobj 395 0 obj -<< /D [ 390 0 R /XYZ 78.499 746.912 null ] >> +<< /D [ 391 0 R /XYZ 78.499 757.87 null ] >> endobj 396 0 obj -<< /D [ 390 0 R /XYZ 78.499 735.953 null ] >> +<< /D [ 391 0 R /XYZ 78.499 746.912 null ] >> endobj 397 0 obj -<< /D [ 390 0 R /XYZ 78.499 724.994 null ] >> +<< /D [ 391 0 R /XYZ 78.499 735.953 null ] >> endobj 398 0 obj -<< /D [ 390 0 R /XYZ 78.499 714.035 null ] >> +<< /D [ 391 0 R /XYZ 78.499 724.994 null ] >> endobj 399 0 obj -<< /D [ 390 0 R /XYZ 78.499 703.076 null ] >> +<< /D [ 391 0 R /XYZ 78.499 714.035 null ] >> endobj 400 0 obj -<< /D [ 390 0 R /XYZ 78.499 692.117 null ] >> +<< /D [ 391 0 R /XYZ 78.499 703.076 null ] >> endobj 401 0 obj -<< /D [ 390 0 R /XYZ 78.499 681.158 null ] >> +<< /D [ 391 0 R /XYZ 78.499 692.117 null ] >> endobj 402 0 obj -<< /D [ 390 0 R /XYZ 78.499 670.199 null ] >> +<< /D [ 391 0 R /XYZ 78.499 681.158 null ] >> endobj 403 0 obj -<< /D [ 390 0 R /XYZ 78.499 642.304 null ] >> +<< /D [ 391 0 R /XYZ 78.499 670.199 null ] >> endobj 404 0 obj -<< /D [ 390 0 R /XYZ 78.499 631.345 null ] >> +<< /D [ 391 0 R /XYZ 78.499 642.304 null ] >> endobj 405 0 obj -<< /D [ 390 0 R /XYZ 78.499 620.386 null ] >> +<< /D [ 391 0 R /XYZ 78.499 631.345 null ] >> endobj 406 0 obj -<< /D [ 390 0 R /XYZ 78.499 609.427 null ] >> +<< /D [ 391 0 R /XYZ 78.499 620.386 null ] >> endobj 407 0 obj -<< /D [ 390 0 R /XYZ 78.499 598.468 null ] >> +<< /D [ 391 0 R /XYZ 78.499 609.427 null ] >> endobj 408 0 obj -<< /D [ 390 0 R /XYZ 78.499 587.509 null ] >> +<< /D [ 391 0 R /XYZ 78.499 598.468 null ] >> endobj 409 0 obj -<< /D [ 390 0 R /XYZ 78.499 571.569 null ] >> +<< /D [ 391 0 R /XYZ 78.499 587.509 null ] >> endobj 410 0 obj -<< /D [ 390 0 R /XYZ 78.499 560.61 null ] >> +<< /D [ 391 0 R /XYZ 78.499 571.569 null ] >> endobj 411 0 obj -<< /D [ 390 0 R /XYZ 78.499 549.651 null ] >> +<< /D [ 391 0 R /XYZ 78.499 560.61 null ] >> endobj 412 0 obj -<< /D [ 390 0 R /XYZ 78.499 538.692 null ] >> +<< /D [ 391 0 R /XYZ 78.499 549.651 null ] >> endobj 413 0 obj -<< /D [ 390 0 R /XYZ 78.499 527.733 null ] >> +<< /D [ 391 0 R /XYZ 78.499 538.692 null ] >> endobj 414 0 obj -<< /D [ 390 0 R /XYZ 78.499 516.775 null ] >> +<< /D [ 391 0 R /XYZ 78.499 527.733 null ] >> endobj 415 0 obj -<< /D [ 390 0 R /XYZ 78.499 500.834 null ] >> +<< /D [ 391 0 R /XYZ 78.499 516.775 null ] >> endobj 416 0 obj -<< /D [ 390 0 R /XYZ 78.499 489.875 null ] >> +<< /D [ 391 0 R /XYZ 78.499 500.834 null ] >> endobj 417 0 obj -<< /D [ 390 0 R /XYZ 78.499 478.917 null ] >> +<< /D [ 391 0 R /XYZ 78.499 489.875 null ] >> endobj 418 0 obj -<< /D [ 390 0 R /XYZ 78.499 467.958 null ] >> +<< /D [ 391 0 R /XYZ 78.499 478.917 null ] >> endobj 419 0 obj -<< /D [ 390 0 R /XYZ 78.499 456.999 null ] >> +<< /D [ 391 0 R /XYZ 78.499 467.958 null ] >> endobj 420 0 obj -<< /D [ 390 0 R /XYZ 78.499 446.04 null ] >> +<< /D [ 391 0 R /XYZ 78.499 456.999 null ] >> endobj 421 0 obj -<< /D [ 390 0 R /XYZ 78.499 435.081 null ] >> +<< /D [ 391 0 R /XYZ 78.499 446.04 null ] >> endobj 422 0 obj -<< /D [ 390 0 R /XYZ 78.499 424.122 null ] >> +<< /D [ 391 0 R /XYZ 78.499 435.081 null ] >> endobj 423 0 obj -<< /D [ 390 0 R /XYZ 78.499 413.163 null ] >> +<< /D [ 391 0 R /XYZ 78.499 424.122 null ] >> endobj 424 0 obj -<< /D [ 390 0 R /XYZ 78.499 402.204 null ] >> +<< /D [ 391 0 R /XYZ 78.499 413.163 null ] >> endobj 425 0 obj -<< /D [ 390 0 R /XYZ 78.499 386.264 null ] >> +<< /D [ 391 0 R /XYZ 78.499 402.204 null ] >> endobj 426 0 obj -<< /D [ 390 0 R /XYZ 78.499 375.305 null ] >> +<< /D [ 391 0 R /XYZ 78.499 386.264 null ] >> endobj 427 0 obj -<< /D [ 390 0 R /XYZ 78.499 364.346 null ] >> +<< /D [ 391 0 R /XYZ 78.499 375.305 null ] >> endobj 428 0 obj -<< /D [ 390 0 R /XYZ 78.499 353.387 null ] >> +<< /D [ 391 0 R /XYZ 78.499 364.346 null ] >> endobj 429 0 obj -<< /D [ 390 0 R /XYZ 78.499 342.428 null ] >> +<< /D [ 391 0 R /XYZ 78.499 353.387 null ] >> endobj 430 0 obj -<< /D [ 390 0 R /XYZ 78.499 331.469 null ] >> +<< /D [ 391 0 R /XYZ 78.499 342.428 null ] >> endobj 431 0 obj -<< /D [ 390 0 R /XYZ 78.499 320.511 null ] >> +<< /D [ 391 0 R /XYZ 78.499 331.469 null ] >> endobj 432 0 obj -<< /D [ 390 0 R /XYZ 78.499 309.552 null ] >> +<< /D [ 391 0 R /XYZ 78.499 320.511 null ] >> endobj 433 0 obj -<< /D [ 390 0 R /XYZ 78.499 298.593 null ] >> +<< /D [ 391 0 R /XYZ 78.499 309.552 null ] >> endobj 434 0 obj -<< /D [ 390 0 R /XYZ 78.499 276.675 null ] >> +<< /D [ 391 0 R /XYZ 78.499 298.593 null ] >> endobj 435 0 obj -<< /D [ 390 0 R /XYZ 78.499 265.716 null ] >> +<< /D [ 391 0 R /XYZ 78.499 276.675 null ] >> endobj 436 0 obj -<< /D [ 390 0 R /XYZ 78.499 225.865 null ] >> +<< /D [ 391 0 R /XYZ 78.499 265.716 null ] >> endobj 437 0 obj -<< /D [ 390 0 R /XYZ 78.499 214.907 null ] >> +<< /D [ 391 0 R /XYZ 78.499 225.865 null ] >> endobj 438 0 obj -<< /D [ 390 0 R /XYZ 78.499 203.948 null ] >> +<< /D [ 391 0 R /XYZ 78.499 214.907 null ] >> endobj 439 0 obj -<< /D [ 390 0 R /XYZ 78.499 192.989 null ] >> +<< /D [ 391 0 R /XYZ 78.499 203.948 null ] >> endobj 440 0 obj -<< /D [ 390 0 R /XYZ 78.499 182.03 null ] >> +<< /D [ 391 0 R /XYZ 78.499 192.989 null ] >> endobj 441 0 obj -<< /D [ 390 0 R /XYZ 78.499 171.071 null ] >> +<< /D [ 391 0 R /XYZ 78.499 182.03 null ] >> endobj 442 0 obj -<< /D [ 390 0 R /XYZ 78.499 160.112 null ] >> +<< /D [ 391 0 R /XYZ 78.499 171.071 null ] >> endobj 443 0 obj -<< /D [ 390 0 R /XYZ 78.499 149.153 null ] >> +<< /D [ 391 0 R /XYZ 78.499 160.112 null ] >> endobj 444 0 obj -<< /D [ 390 0 R /XYZ 78.499 135.205 null ] >> +<< /D [ 391 0 R /XYZ 78.499 149.153 null ] >> endobj 445 0 obj -<< /D [ 390 0 R /XYZ 78.499 124.247 null ] >> +<< /D [ 391 0 R /XYZ 78.499 135.205 null ] >> endobj 446 0 obj -<< /D [ 390 0 R /XYZ 78.499 84.396 null ] >> +<< /D [ 391 0 R /XYZ 78.499 124.247 null ] >> endobj -389 0 obj +447 0 obj +<< /D [ 391 0 R /XYZ 78.499 84.396 null ] >> +endobj +390 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> endobj -449 0 obj -<< /Filter /FlateDecode /Length 2970 >> +450 0 obj +<< /Filter /FlateDecode /Length 2934 >> stream xÚÍ[ÉŽ#¹½÷WèhŠMw@(`T*
0纾zNöÿÍÁ%•ÉlÕØhTÊ$ƒä‹í1Ȧ—?/ôòûš¿‰ô¹ÿÿþãöõãçCÚ‹ Ö0—¯ý`®½°‹ÑÄò‹VŒPÅ._ÿ¾üãJ©ø¤TÂû?¿þ(â~>\±Jqƒû3P„iè%€z“ ý_Â}¸“ÇâGJ•“¯€Rî>ÊÆß\SÊ>ÒûôüïFÒ-¶?¹g–{ý;ŒðÙÏ HÔqªœ$%ŒÆIÝÖpj%8œgÀ-a‚73øíظ$Ò¨^B@Õ£ Iõà‘*þÍoI¯`xÿH:z4‹ÎŸkä<ú`3¯Ûck’¸i÷:+Å6åí†ÆO˜9MÖx_]û8¤´ŠÈf¹Ì?ƒˆzh÷ˆÏödù6ÛBȞƘi ŒÍÆ„cu¯Þ}`¿€ñ+° Š€R¯É5_k%…á›F´¾5®á¡¬$œê±ý: ËQF.lcüبv=¡—fðóÁäź^ î¥-áú¢”%‚‹V&Ú›·SνFôg¶Þ$M‹™4ÆÑÌöò^¬Ïµ “ÜdUéþÖ¶ÙÑ"§Î‚Õ€¨8?¶…ÃDc°ëë\Z—¿`@?ëàI„àœH^ú(éûyn˜¿ßßÜd¨Çß9$ Š³Ýjø/zø
ïÎpdøp‹²¼úœÍ9ÒèÜ:›¾×VÁ¨¡*BÁ‘0È$&Žš½ž
ÅØ™£‡§~Faœ[LÏ$"ÈmÀDöd(÷:¶÷+’*·Ï„©Žì
ȇŒ*ð÷·ð°4È’?ÄΦZ5‡ívÍ°ñ=¬#¿‰p¶w“0E¹c«S{ÍA¬:;Z$=SÐØœR]Q1h¬›{ISv)wÔاJZˆ÷¬`ÊUò %Ðpwñy(s[×L×ßGî‰kÊúÓSÆ”¹ŽóA<ý=XAz^F9à"RVÍ™¿Ö8%nMüÕYñ8æ¶=‹z7×>-³MQÀÍá1û¢MÁY•Ö3g˜H'¸éáíÄ{X0$IÀÈ‹TS8éUnýgÉœZ!ß`Oö¼£¬°'¨^fwnïµÅPC 8\k3q~Ý8ÿN¸¯6Yâõ½#“%vZÚÌãÍ4Îímo\aDÚ/m1Ûü”&¦ódé,öM±à,OrÀcº0]f®µâUÛ£ ŽAZ:ž¸ÉÌv e_›ŽÞƛʗvz‡”ïB`f™b…߶–£HoÂ&Pt‰,ã| \ k3ŒOÄ,f‰¬e¿³YsÌj…¬Ç,>Ùëë[=Â"Í4ôDúu4ô”0Z«÷BÞB…”¡2'JÎñ @@ -1357,90 +1359,90 @@ xÚÍ[ÉŽ#¹½÷WèhŠMw@(`T*
0纾zNöÿÍÁ%•ÉlÕØhTÊ$ƒä‹í1Ȧ—?/ôòûš¿‰ô¹ÿÿþãöõãçCÚ‹ Ɖ±fHl¿-%¶VÈkvÒߢþ¸u±Z— ÈnÉš…DÜ
ïúJ$êI$ŒýDB¦€PÃûy¼ svæÔÜIžF5Ñœ¦„•¡2JzR¢cø…åø7=¼ßžMƈÕ/´8ßDÂVÚbû/3ÈãØiÊŒÌØiCŽVáOfùwçÁí͈´r°±RÒI/7Œ8«/v€ÊcíÝç¹Ò„jÞû<_ªžuBf>Ï´£Ï7·'^ë÷Ã}lÍÍéÿNtŠ0 ÛõÛ56³Íl©öæ³üñí2%žUG&iB½—RÇ%v{€aÙh|1#$ŠY~œ“¯&—Ý—)Évï
8ëG<B•µ3om†¹¾š*»]®3ì~~ënÆ´Tnf–ܬöŒÈ¤Î¥Ö£Ú
míV7³8âTŒ9H6Î
õ´¬÷Î
ÍP· Or¡Eç€Ôœ†bG
+,gº9ìÛ=#nÆ=»6úTÒzîÆÑÁ{LO&,v 4T¡Ù.) â¸m?RÅzj“÷·çyÕ1LÆU?ZrÊÖØÀº/ÐScS‘JQ*<u¬äÍE˜kœ6÷ì*Á|B;ÌzrTï8šk9”œó®«VÄòpº=žN)â´W ŠPÕ#±s'óiÐŒH‡{'±ðCeñÁ´²×¶ú ÉÄÃÆVÛke4pK‹zdÔ†í¬²3tmÅQÙ½³œ¤ñ‰Íí¾ 3ÿ7×»søõâ-L1¢ô3xÑpî-Œè¥7— þž{´¯Å©î±"N-Ìì)ÖÜi:wÒÙØÔË6Uö¬Ëœ(öî1áXú`)ßï„GGøzŠÍ®p€–D0ÝÐ˾êä¬3ô”¿ª5œÑ¼>›èO'$ÜÖ{ÔÄ~®lþ‹ºIH;z(Anï|žP³:Á“JO«'¼RŽîÜU2‹ïÜÕíAv„N®Ðèõ×Á3$—w‰æ¢_ùÁC$îvÆÚÑ–®·¾£¬YfßÞÝ:9îKáäÆoÒµ’ý”¶Xó–Ùà+ý‰ÌQzC}áf -jT/s+¡åä éÚ‘˜enÖrî„œ¹o-Ç¢"_‰<×\o9‰NÒª¡¤>IóŽ[/”cë’ÆÊ‘[î[J¼éRHj¼@˜»d†[µn‹ƒûÁIëp)¸bV™öÅÀI‰ä)+àŠXÇ):éhò4Kg{nŸÛõÎãÃñ&›Š•…kUߟ˜»Šh+ûÑ2…¯óaÞ/.dJ.Ý(l˜ßºkKJŒ -™k—·;![ÿî\1³·Äg·jÏþû·„wH#†%,Z!¯ÃbËò1N½å/bµ.™ÿ4âe§'è* ¹ö»˜á*àÿË™ŠÛ´+c{0êmÄöð>Ëöî-Ò -¤=gÈÊØQw£S¥úÑO¸=uñHÈŸ%So…¬Ýy›ºû"Šù¬bDq¸3·€„ZÝC³v°•Ñ#sîðô›ÐWûCÕºærŽ-(±íþ´cˆŸ_?þøD Í +jT/s+¡åä éÚ‘˜enÖrî„œ¹o-Ç¢"_‰<×\o9‰NÒª¡¤þ¢r`IcåÈ-÷-%Þ;NåÂsÅÁýàdœÎÁö@Ì*Ó¾8)‘<ßW:…{l¥£ýÉó³sI˜4}ï<><o²©XÉQ¸Võý‰¹åÏ{U?ú ב”3 +×.GwB¶þÙ¹ba¯ég·VÏþû²„wH#%,Z!¯Ãb˲0N½e-bµŽ˜ÿ*âe§èª¹ö»„áªÝÿË™…Û+c{0êm¿öp<{öç +Y»S6u÷EóYÀˆâp'm+µº‡fíº]+£GæÜáä7¡3^ö‡–uÍ[å4VPbÛý_ÇÀ>¿~üĸ€Q endstream endobj -448 0 obj -<< /Type /Page /Contents 449 0 R /Resources 447 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> -endobj -450 0 obj -<< /D [ 448 0 R /XYZ 78.37 808.885 null ] >> +449 0 obj +<< /Type /Page /Contents 450 0 R /Resources 448 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj 451 0 obj -<< /D [ 448 0 R /XYZ 78.499 768.829 null ] >> +<< /D [ 449 0 R /XYZ 78.37 808.885 null ] >> endobj 452 0 obj -<< /D [ 448 0 R /XYZ 78.499 757.87 null ] >> +<< /D [ 449 0 R /XYZ 78.499 768.829 null ] >> endobj 453 0 obj -<< /D [ 448 0 R /XYZ 78.499 746.912 null ] >> +<< /D [ 449 0 R /XYZ 78.499 757.87 null ] >> endobj 454 0 obj -<< /D [ 448 0 R /XYZ 78.499 735.953 null ] >> +<< /D [ 449 0 R /XYZ 78.499 746.912 null ] >> endobj 455 0 obj -<< /D [ 448 0 R /XYZ 78.499 724.994 null ] >> +<< /D [ 449 0 R /XYZ 78.499 735.953 null ] >> endobj 456 0 obj -<< /D [ 448 0 R /XYZ 78.499 714.035 null ] >> +<< /D [ 449 0 R /XYZ 78.499 724.994 null ] >> endobj 457 0 obj -<< /D [ 448 0 R /XYZ 78.499 703.076 null ] >> +<< /D [ 449 0 R /XYZ 78.499 714.035 null ] >> endobj 458 0 obj -<< /D [ 448 0 R /XYZ 78.499 692.117 null ] >> -endobj -118 0 obj -<< /D [ 448 0 R /XYZ 79.37 644.667 null ] >> +<< /D [ 449 0 R /XYZ 78.499 703.076 null ] >> endobj 459 0 obj -<< /D [ 448 0 R /XYZ 78.499 597.009 null ] >> +<< /D [ 449 0 R /XYZ 78.499 692.117 null ] >> +endobj +118 0 obj +<< /D [ 449 0 R /XYZ 79.37 644.667 null ] >> endobj 460 0 obj -<< /D [ 448 0 R /XYZ 79.822 568.117 null ] >> +<< /D [ 449 0 R /XYZ 78.499 597.009 null ] >> endobj 461 0 obj -<< /D [ 448 0 R /XYZ 79.822 527.27 null ] >> +<< /D [ 449 0 R /XYZ 79.822 568.117 null ] >> endobj 462 0 obj -<< /D [ 448 0 R /XYZ 79.822 480.446 null ] >> +<< /D [ 449 0 R /XYZ 79.822 527.27 null ] >> endobj 463 0 obj -<< /D [ 448 0 R /XYZ 79.822 421.666 null ] >> +<< /D [ 449 0 R /XYZ 79.822 480.446 null ] >> endobj 464 0 obj -<< /D [ 448 0 R /XYZ 79.822 374.842 null ] >> +<< /D [ 449 0 R /XYZ 79.822 421.666 null ] >> endobj 465 0 obj -<< /D [ 448 0 R /XYZ 79.822 339.973 null ] >> +<< /D [ 449 0 R /XYZ 79.822 374.842 null ] >> endobj 466 0 obj -<< /D [ 448 0 R /XYZ 79.822 269.238 null ] >> +<< /D [ 449 0 R /XYZ 79.822 339.973 null ] >> endobj 467 0 obj -<< /D [ 448 0 R /XYZ 79.822 240.346 null ] >> +<< /D [ 449 0 R /XYZ 79.822 269.238 null ] >> endobj 468 0 obj -<< /D [ 448 0 R /XYZ 79.822 193.522 null ] >> +<< /D [ 449 0 R /XYZ 79.822 240.346 null ] >> endobj 469 0 obj -<< /D [ 448 0 R /XYZ 79.822 158.653 null ] >> +<< /D [ 449 0 R /XYZ 79.822 193.522 null ] >> endobj 470 0 obj -<< /D [ 448 0 R /XYZ 79.822 147.694 null ] >> +<< /D [ 449 0 R /XYZ 79.822 158.653 null ] >> endobj 471 0 obj -<< /D [ 448 0 R /XYZ 79.822 112.824 null ] >> +<< /D [ 449 0 R /XYZ 79.822 147.694 null ] >> endobj 472 0 obj -<< /D [ 448 0 R /XYZ 79.822 101.865 null ] >> +<< /D [ 449 0 R /XYZ 79.822 112.824 null ] >> endobj -447 0 obj +473 0 obj +<< /D [ 449 0 R /XYZ 79.822 101.865 null ] >> +endobj +448 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R /F30 206 0 R >> /ProcSet [ /PDF /Text ] >> endobj -475 0 obj +476 0 obj << /Filter /FlateDecode /Length 2078 >> stream xÚÍZÍnã8¾÷)òU%ê(Lšñ @@ -1456,124 +1458,124 @@ zLŽ0ƒÐ.ä8C¹³Tm¦G¹¹‡UnŸê4æAf,Ó¶£CéwW)°fIPÆCQPÄ!§c}ÐÇ°û^Œª0âÅêöˆ|¼2)dX_ ˆ ¤B®J¼7ú\Ö#Ñ“çÌ“V“—í`¨7<àN+M(fù0u;3aRà =E90w\¦@…ˆ±wkI+¦B¬GP¢ÆcX=ïGð¥Ix`¶?5žÆ¿3™4’9)H&UÏÇ„ÜëµgÁ”šó±Þ©¦ƒ—\T`Á¥¨Oüž´yÀ6J<Ñz°x=eñ=ȼ–3gÌ „š¢A¯«o;¬ÄhsR!ï×0²hÿ|ú
$öÈÐ endstream endobj -474 0 obj -<< /Type /Page /Contents 475 0 R /Resources 473 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> -endobj -476 0 obj -<< /D [ 474 0 R /XYZ 78.37 808.885 null ] >> +475 0 obj +<< /Type /Page /Contents 476 0 R /Resources 474 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj 477 0 obj -<< /D [ 474 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 475 0 R /XYZ 78.37 808.885 null ] >> endobj 478 0 obj -<< /D [ 474 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 475 0 R /XYZ 79.822 768.829 null ] >> endobj 479 0 obj -<< /D [ 474 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 475 0 R /XYZ 79.822 757.87 null ] >> endobj 480 0 obj -<< /D [ 474 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 475 0 R /XYZ 79.822 746.912 null ] >> endobj 481 0 obj -<< /D [ 474 0 R /XYZ 79.822 699.71 null ] >> +<< /D [ 475 0 R /XYZ 79.822 735.953 null ] >> endobj 482 0 obj -<< /D [ 474 0 R /XYZ 79.822 688.751 null ] >> +<< /D [ 475 0 R /XYZ 79.822 699.71 null ] >> endobj 483 0 obj -<< /D [ 474 0 R /XYZ 79.822 654.377 null ] >> +<< /D [ 475 0 R /XYZ 79.822 688.751 null ] >> endobj 484 0 obj -<< /D [ 474 0 R /XYZ 79.822 620.003 null ] >> +<< /D [ 475 0 R /XYZ 79.822 654.377 null ] >> endobj 485 0 obj -<< /D [ 474 0 R /XYZ 79.822 585.629 null ] >> +<< /D [ 475 0 R /XYZ 79.822 620.003 null ] >> endobj 486 0 obj -<< /D [ 474 0 R /XYZ 79.822 551.256 null ] >> +<< /D [ 475 0 R /XYZ 79.822 585.629 null ] >> endobj 487 0 obj -<< /D [ 474 0 R /XYZ 79.822 526.968 null ] >> +<< /D [ 475 0 R /XYZ 79.822 551.256 null ] >> endobj 488 0 obj -<< /D [ 474 0 R /XYZ 79.822 516.009 null ] >> +<< /D [ 475 0 R /XYZ 79.822 526.968 null ] >> endobj 489 0 obj -<< /D [ 474 0 R /XYZ 79.822 505.05 null ] >> +<< /D [ 475 0 R /XYZ 79.822 516.009 null ] >> endobj 490 0 obj -<< /D [ 474 0 R /XYZ 79.822 494.091 null ] >> +<< /D [ 475 0 R /XYZ 79.822 505.05 null ] >> endobj 491 0 obj -<< /D [ 474 0 R /XYZ 79.822 483.133 null ] >> +<< /D [ 475 0 R /XYZ 79.822 494.091 null ] >> endobj 492 0 obj -<< /D [ 474 0 R /XYZ 79.822 472.174 null ] >> +<< /D [ 475 0 R /XYZ 79.822 483.133 null ] >> endobj 493 0 obj -<< /D [ 474 0 R /XYZ 79.822 461.215 null ] >> +<< /D [ 475 0 R /XYZ 79.822 472.174 null ] >> endobj 494 0 obj -<< /D [ 474 0 R /XYZ 79.822 424.972 null ] >> +<< /D [ 475 0 R /XYZ 79.822 461.215 null ] >> endobj 495 0 obj -<< /D [ 474 0 R /XYZ 79.822 400.685 null ] >> +<< /D [ 475 0 R /XYZ 79.822 424.972 null ] >> endobj 496 0 obj -<< /D [ 474 0 R /XYZ 79.822 389.726 null ] >> +<< /D [ 475 0 R /XYZ 79.822 400.685 null ] >> endobj 497 0 obj -<< /D [ 474 0 R /XYZ 79.822 353.483 null ] >> +<< /D [ 475 0 R /XYZ 79.822 389.726 null ] >> endobj 498 0 obj -<< /D [ 474 0 R /XYZ 79.822 329.196 null ] >> +<< /D [ 475 0 R /XYZ 79.822 353.483 null ] >> endobj 499 0 obj -<< /D [ 474 0 R /XYZ 79.822 318.237 null ] >> -endobj -122 0 obj -<< /D [ 474 0 R /XYZ 79.37 278.382 null ] >> +<< /D [ 475 0 R /XYZ 79.822 329.196 null ] >> endobj 500 0 obj -<< /D [ 474 0 R /XYZ 79.822 218.736 null ] >> +<< /D [ 475 0 R /XYZ 79.822 318.237 null ] >> +endobj +122 0 obj +<< /D [ 475 0 R /XYZ 79.37 278.382 null ] >> endobj 501 0 obj -<< /D [ 474 0 R /XYZ 79.822 207.777 null ] >> +<< /D [ 475 0 R /XYZ 79.822 218.736 null ] >> endobj 502 0 obj -<< /D [ 474 0 R /XYZ 79.822 196.818 null ] >> +<< /D [ 475 0 R /XYZ 79.822 207.777 null ] >> endobj 503 0 obj -<< /D [ 474 0 R /XYZ 79.822 166.306 null ] >> +<< /D [ 475 0 R /XYZ 79.822 196.818 null ] >> endobj 504 0 obj -<< /D [ 474 0 R /XYZ 79.822 155.347 null ] >> +<< /D [ 475 0 R /XYZ 79.822 166.306 null ] >> endobj 505 0 obj -<< /D [ 474 0 R /XYZ 79.822 144.388 null ] >> +<< /D [ 475 0 R /XYZ 79.822 155.347 null ] >> endobj 506 0 obj -<< /D [ 474 0 R /XYZ 79.822 133.429 null ] >> +<< /D [ 475 0 R /XYZ 79.822 144.388 null ] >> endobj 507 0 obj -<< /D [ 474 0 R /XYZ 79.822 122.47 null ] >> +<< /D [ 475 0 R /XYZ 79.822 133.429 null ] >> endobj 508 0 obj -<< /D [ 474 0 R /XYZ 79.822 111.511 null ] >> +<< /D [ 475 0 R /XYZ 79.822 122.47 null ] >> endobj 509 0 obj -<< /D [ 474 0 R /XYZ 79.822 100.552 null ] >> +<< /D [ 475 0 R /XYZ 79.822 111.511 null ] >> endobj 510 0 obj -<< /D [ 474 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 475 0 R /XYZ 79.822 100.552 null ] >> endobj 511 0 obj -<< /D [ 474 0 R /XYZ 79.822 78.635 null ] >> +<< /D [ 475 0 R /XYZ 79.822 89.593 null ] >> endobj -473 0 obj +512 0 obj +<< /D [ 475 0 R /XYZ 79.822 78.635 null ] >> +endobj +474 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -514 0 obj +515 0 obj << /Filter /FlateDecode /Length 2256 >> stream xÚÍ[Érã6½û+ôƒÊå*Ó²¦*gßR¹&§üÿ5X ¢AZ @@ -1592,187 +1594,187 @@ a™µ®SÅóœ*Zz~c´¢ÐöûW’æ$•—œtß
Èû–¤·Sí×z (¶#ðS|ê¤ÀiæŒèd0×&(óm'°šqéÎ<"(ë‘Uª ƒI‡óe*X‚±ND6³óòs´í<v=´íùý‹ž½qc͉ŠíÝHk}~Šk³õWO«$ž§ôÑ‚œùé³µo[ˆsß‚ endstream endobj -513 0 obj -<< /Type /Page /Contents 514 0 R /Resources 512 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 317 0 R >> -endobj -515 0 obj -<< /D [ 513 0 R /XYZ 78.37 808.885 null ] >> +514 0 obj +<< /Type /Page /Contents 515 0 R /Resources 513 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 316 0 R >> endobj 516 0 obj -<< /D [ 513 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 514 0 R /XYZ 78.37 808.885 null ] >> endobj 517 0 obj -<< /D [ 513 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 514 0 R /XYZ 79.822 768.829 null ] >> endobj 518 0 obj -<< /D [ 513 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 514 0 R /XYZ 79.822 757.87 null ] >> endobj 519 0 obj -<< /D [ 513 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 514 0 R /XYZ 79.822 746.912 null ] >> endobj 520 0 obj -<< /D [ 513 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 514 0 R /XYZ 79.822 735.953 null ] >> endobj 521 0 obj -<< /D [ 513 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 514 0 R /XYZ 79.822 724.994 null ] >> endobj 522 0 obj -<< /D [ 513 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 514 0 R /XYZ 79.822 714.035 null ] >> endobj 523 0 obj -<< /D [ 513 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 514 0 R /XYZ 79.822 703.076 null ] >> endobj 524 0 obj -<< /D [ 513 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 514 0 R /XYZ 79.822 692.117 null ] >> endobj 525 0 obj -<< /D [ 513 0 R /XYZ 79.822 628.939 null ] >> +<< /D [ 514 0 R /XYZ 79.822 681.158 null ] >> endobj 526 0 obj -<< /D [ 513 0 R /XYZ 79.822 617.98 null ] >> +<< /D [ 514 0 R /XYZ 79.822 628.939 null ] >> endobj 527 0 obj -<< /D [ 513 0 R /XYZ 79.822 607.021 null ] >> +<< /D [ 514 0 R /XYZ 79.822 617.98 null ] >> endobj 528 0 obj -<< /D [ 513 0 R /XYZ 79.822 596.062 null ] >> +<< /D [ 514 0 R /XYZ 79.822 607.021 null ] >> endobj 529 0 obj -<< /D [ 513 0 R /XYZ 79.822 585.103 null ] >> +<< /D [ 514 0 R /XYZ 79.822 596.062 null ] >> endobj 530 0 obj -<< /D [ 513 0 R /XYZ 79.822 574.144 null ] >> +<< /D [ 514 0 R /XYZ 79.822 585.103 null ] >> endobj 531 0 obj -<< /D [ 513 0 R /XYZ 79.822 563.185 null ] >> +<< /D [ 514 0 R /XYZ 79.822 574.144 null ] >> endobj 532 0 obj -<< /D [ 513 0 R /XYZ 79.822 552.227 null ] >> +<< /D [ 514 0 R /XYZ 79.822 563.185 null ] >> endobj 533 0 obj -<< /D [ 513 0 R /XYZ 79.822 541.268 null ] >> +<< /D [ 514 0 R /XYZ 79.822 552.227 null ] >> endobj 534 0 obj -<< /D [ 513 0 R /XYZ 79.822 530.309 null ] >> +<< /D [ 514 0 R /XYZ 79.822 541.268 null ] >> endobj 535 0 obj -<< /D [ 513 0 R /XYZ 79.822 519.35 null ] >> +<< /D [ 514 0 R /XYZ 79.822 530.309 null ] >> endobj 536 0 obj -<< /D [ 513 0 R /XYZ 79.822 508.391 null ] >> +<< /D [ 514 0 R /XYZ 79.822 519.35 null ] >> endobj 537 0 obj -<< /D [ 513 0 R /XYZ 79.822 497.432 null ] >> +<< /D [ 514 0 R /XYZ 79.822 508.391 null ] >> endobj 538 0 obj -<< /D [ 513 0 R /XYZ 79.822 486.473 null ] >> +<< /D [ 514 0 R /XYZ 79.822 497.432 null ] >> endobj 539 0 obj -<< /D [ 513 0 R /XYZ 79.822 475.514 null ] >> +<< /D [ 514 0 R /XYZ 79.822 486.473 null ] >> endobj 540 0 obj -<< /D [ 513 0 R /XYZ 79.822 464.555 null ] >> +<< /D [ 514 0 R /XYZ 79.822 475.514 null ] >> endobj 541 0 obj -<< /D [ 513 0 R /XYZ 79.822 453.596 null ] >> +<< /D [ 514 0 R /XYZ 79.822 464.555 null ] >> endobj 542 0 obj -<< /D [ 513 0 R /XYZ 79.822 442.637 null ] >> +<< /D [ 514 0 R /XYZ 79.822 453.596 null ] >> endobj 543 0 obj -<< /D [ 513 0 R /XYZ 79.822 431.679 null ] >> +<< /D [ 514 0 R /XYZ 79.822 442.637 null ] >> endobj 544 0 obj -<< /D [ 513 0 R /XYZ 79.822 420.72 null ] >> +<< /D [ 514 0 R /XYZ 79.822 431.679 null ] >> endobj 545 0 obj -<< /D [ 513 0 R /XYZ 79.822 409.761 null ] >> +<< /D [ 514 0 R /XYZ 79.822 420.72 null ] >> endobj 546 0 obj -<< /D [ 513 0 R /XYZ 79.822 398.802 null ] >> +<< /D [ 514 0 R /XYZ 79.822 409.761 null ] >> endobj 547 0 obj -<< /D [ 513 0 R /XYZ 79.822 370.493 null ] >> +<< /D [ 514 0 R /XYZ 79.822 398.802 null ] >> endobj 548 0 obj -<< /D [ 513 0 R /XYZ 79.822 359.534 null ] >> +<< /D [ 514 0 R /XYZ 79.822 370.493 null ] >> endobj 549 0 obj -<< /D [ 513 0 R /XYZ 79.822 348.575 null ] >> +<< /D [ 514 0 R /XYZ 79.822 359.534 null ] >> endobj 550 0 obj -<< /D [ 513 0 R /XYZ 79.822 337.616 null ] >> +<< /D [ 514 0 R /XYZ 79.822 348.575 null ] >> endobj 551 0 obj -<< /D [ 513 0 R /XYZ 79.822 326.657 null ] >> +<< /D [ 514 0 R /XYZ 79.822 337.616 null ] >> endobj 552 0 obj -<< /D [ 513 0 R /XYZ 79.822 315.698 null ] >> +<< /D [ 514 0 R /XYZ 79.822 326.657 null ] >> endobj 553 0 obj -<< /D [ 513 0 R /XYZ 79.822 304.739 null ] >> +<< /D [ 514 0 R /XYZ 79.822 315.698 null ] >> endobj 554 0 obj -<< /D [ 513 0 R /XYZ 79.822 293.781 null ] >> +<< /D [ 514 0 R /XYZ 79.822 304.739 null ] >> endobj 555 0 obj -<< /D [ 513 0 R /XYZ 79.822 282.822 null ] >> +<< /D [ 514 0 R /XYZ 79.822 293.781 null ] >> endobj 556 0 obj -<< /D [ 513 0 R /XYZ 79.822 271.863 null ] >> +<< /D [ 514 0 R /XYZ 79.822 282.822 null ] >> endobj 557 0 obj -<< /D [ 513 0 R /XYZ 79.822 260.904 null ] >> +<< /D [ 514 0 R /XYZ 79.822 271.863 null ] >> endobj 558 0 obj -<< /D [ 513 0 R /XYZ 79.822 249.945 null ] >> +<< /D [ 514 0 R /XYZ 79.822 260.904 null ] >> endobj 559 0 obj -<< /D [ 513 0 R /XYZ 79.822 238.986 null ] >> +<< /D [ 514 0 R /XYZ 79.822 249.945 null ] >> endobj 560 0 obj -<< /D [ 513 0 R /XYZ 79.822 228.027 null ] >> +<< /D [ 514 0 R /XYZ 79.822 238.986 null ] >> endobj 561 0 obj -<< /D [ 513 0 R /XYZ 79.822 217.068 null ] >> +<< /D [ 514 0 R /XYZ 79.822 228.027 null ] >> endobj 562 0 obj -<< /D [ 513 0 R /XYZ 79.822 206.109 null ] >> +<< /D [ 514 0 R /XYZ 79.822 217.068 null ] >> endobj 563 0 obj -<< /D [ 513 0 R /XYZ 79.822 195.15 null ] >> +<< /D [ 514 0 R /XYZ 79.822 206.109 null ] >> endobj 564 0 obj -<< /D [ 513 0 R /XYZ 79.822 184.192 null ] >> +<< /D [ 514 0 R /XYZ 79.822 195.15 null ] >> endobj 565 0 obj -<< /D [ 513 0 R /XYZ 79.822 173.233 null ] >> +<< /D [ 514 0 R /XYZ 79.822 184.192 null ] >> endobj 566 0 obj -<< /D [ 513 0 R /XYZ 79.822 162.274 null ] >> +<< /D [ 514 0 R /XYZ 79.822 173.233 null ] >> endobj 567 0 obj -<< /D [ 513 0 R /XYZ 79.822 151.315 null ] >> +<< /D [ 514 0 R /XYZ 79.822 162.274 null ] >> endobj 568 0 obj -<< /D [ 513 0 R /XYZ 79.822 140.356 null ] >> +<< /D [ 514 0 R /XYZ 79.822 151.315 null ] >> endobj 569 0 obj -<< /D [ 513 0 R /XYZ 79.822 129.397 null ] >> +<< /D [ 514 0 R /XYZ 79.822 140.356 null ] >> endobj 570 0 obj -<< /D [ 513 0 R /XYZ 79.822 100.552 null ] >> +<< /D [ 514 0 R /XYZ 79.822 129.397 null ] >> endobj 571 0 obj -<< /D [ 513 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 514 0 R /XYZ 79.822 100.552 null ] >> endobj 572 0 obj -<< /D [ 513 0 R /XYZ 79.822 78.635 null ] >> +<< /D [ 514 0 R /XYZ 79.822 89.593 null ] >> endobj -512 0 obj +573 0 obj +<< /D [ 514 0 R /XYZ 79.822 78.635 null ] >> +endobj +513 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> endobj -575 0 obj +576 0 obj << /Filter /FlateDecode /Length 1993 >> stream xÚÕ[M“ã(½÷¯ÈÄwUWWµ;©Ús߶öº{Úÿ]ÀÈ€°ðd¿™dû!Ä“xi~ùãÂ/?^8¾3?…¼,_/ßoÚ_óNH¸|ýþ"ÂMü".N3púb`܈Ëן—__97çÖs.ÝÛo_¿l˜ßo.Žyc¤«A„0ÌjKQ@q® ¼®1 ™Ïp- k®Å÷ð½ø×y)Üë½*¿÷öMƒÎHrÉb}ÅÏÊ•"Bº¶ˆOËë†cjÄø4E4°Ú…ÈÉn¿Ú r½~<’âøIÃ6’]}XÇ£ÅÐœ t1Œ[0LX (aê³fHÏ„’jÌ©™v†¢<³Ó @@ -1784,3545 +1786,3624 @@ xÚÕ[M“ã(½÷¯ÈÄwUWWµ;©Ús߶öº{Úÿ]ÀÈ€°ðd¿™dû!Ä“xi~ùãÂ/?^8¾3?…¼,_/ßoÚ_ó {ºèõ²šŠ¿$E“©ù#æV¸]§ó{õñ¤Ä<-·„eÑÜn³Ü&(ó}!º7Ԍђ2ŸU™+G9è¾²6¹Øõ¿Ü¬€©RÙµ endstream endobj -574 0 obj -<< /Type /Page /Contents 575 0 R /Resources 573 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> -endobj -576 0 obj -<< /D [ 574 0 R /XYZ 78.37 808.885 null ] >> +575 0 obj +<< /Type /Page /Contents 576 0 R /Resources 574 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 577 0 obj -<< /D [ 574 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 575 0 R /XYZ 78.37 808.885 null ] >> endobj 578 0 obj -<< /D [ 574 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 575 0 R /XYZ 79.822 768.829 null ] >> endobj 579 0 obj -<< /D [ 574 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 575 0 R /XYZ 79.822 757.87 null ] >> endobj 580 0 obj -<< /D [ 574 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 575 0 R /XYZ 79.822 746.912 null ] >> endobj 581 0 obj -<< /D [ 574 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 575 0 R /XYZ 79.822 735.953 null ] >> endobj 582 0 obj -<< /D [ 574 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 575 0 R /XYZ 79.822 724.994 null ] >> endobj 583 0 obj -<< /D [ 574 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 575 0 R /XYZ 79.822 714.035 null ] >> endobj 584 0 obj -<< /D [ 574 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 575 0 R /XYZ 79.822 703.076 null ] >> endobj 585 0 obj -<< /D [ 574 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 575 0 R /XYZ 79.822 692.117 null ] >> endobj 586 0 obj -<< /D [ 574 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 575 0 R /XYZ 79.822 681.158 null ] >> endobj 587 0 obj -<< /D [ 574 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 575 0 R /XYZ 79.822 670.199 null ] >> endobj 588 0 obj -<< /D [ 574 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 575 0 R /XYZ 79.822 659.24 null ] >> endobj 589 0 obj -<< /D [ 574 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 575 0 R /XYZ 79.822 648.281 null ] >> endobj 590 0 obj -<< /D [ 574 0 R /XYZ 79.822 604.446 null ] >> +<< /D [ 575 0 R /XYZ 79.822 637.322 null ] >> endobj 591 0 obj -<< /D [ 574 0 R /XYZ 79.822 593.487 null ] >> +<< /D [ 575 0 R /XYZ 79.822 604.446 null ] >> endobj 592 0 obj -<< /D [ 574 0 R /XYZ 79.822 582.528 null ] >> +<< /D [ 575 0 R /XYZ 79.822 593.487 null ] >> endobj 593 0 obj -<< /D [ 574 0 R /XYZ 79.822 571.569 null ] >> +<< /D [ 575 0 R /XYZ 79.822 582.528 null ] >> endobj 594 0 obj -<< /D [ 574 0 R /XYZ 79.822 560.61 null ] >> +<< /D [ 575 0 R /XYZ 79.822 571.569 null ] >> endobj 595 0 obj -<< /D [ 574 0 R /XYZ 79.822 549.651 null ] >> +<< /D [ 575 0 R /XYZ 79.822 560.61 null ] >> endobj 596 0 obj -<< /D [ 574 0 R /XYZ 79.822 538.692 null ] >> +<< /D [ 575 0 R /XYZ 79.822 549.651 null ] >> endobj 597 0 obj -<< /D [ 574 0 R /XYZ 79.822 527.733 null ] >> +<< /D [ 575 0 R /XYZ 79.822 538.692 null ] >> endobj 598 0 obj -<< /D [ 574 0 R /XYZ 79.822 516.775 null ] >> +<< /D [ 575 0 R /XYZ 79.822 527.733 null ] >> endobj 599 0 obj -<< /D [ 574 0 R /XYZ 79.822 505.816 null ] >> +<< /D [ 575 0 R /XYZ 79.822 516.775 null ] >> endobj 600 0 obj -<< /D [ 574 0 R /XYZ 79.822 494.857 null ] >> +<< /D [ 575 0 R /XYZ 79.822 505.816 null ] >> endobj 601 0 obj -<< /D [ 574 0 R /XYZ 79.822 483.898 null ] >> +<< /D [ 575 0 R /XYZ 79.822 494.857 null ] >> endobj 602 0 obj -<< /D [ 574 0 R /XYZ 79.822 472.939 null ] >> +<< /D [ 575 0 R /XYZ 79.822 483.898 null ] >> endobj 603 0 obj -<< /D [ 574 0 R /XYZ 79.822 461.98 null ] >> +<< /D [ 575 0 R /XYZ 79.822 472.939 null ] >> endobj 604 0 obj -<< /D [ 574 0 R /XYZ 79.822 451.021 null ] >> +<< /D [ 575 0 R /XYZ 79.822 461.98 null ] >> endobj 605 0 obj -<< /D [ 574 0 R /XYZ 79.822 440.062 null ] >> +<< /D [ 575 0 R /XYZ 79.822 451.021 null ] >> endobj 606 0 obj -<< /D [ 574 0 R /XYZ 79.822 429.103 null ] >> +<< /D [ 575 0 R /XYZ 79.822 440.062 null ] >> endobj 607 0 obj -<< /D [ 574 0 R /XYZ 79.822 418.144 null ] >> +<< /D [ 575 0 R /XYZ 79.822 429.103 null ] >> endobj 608 0 obj -<< /D [ 574 0 R /XYZ 79.822 407.186 null ] >> +<< /D [ 575 0 R /XYZ 79.822 418.144 null ] >> endobj 609 0 obj -<< /D [ 574 0 R /XYZ 79.822 396.227 null ] >> +<< /D [ 575 0 R /XYZ 79.822 407.186 null ] >> endobj 610 0 obj -<< /D [ 574 0 R /XYZ 79.822 385.268 null ] >> +<< /D [ 575 0 R /XYZ 79.822 396.227 null ] >> endobj 611 0 obj -<< /D [ 574 0 R /XYZ 79.822 374.309 null ] >> +<< /D [ 575 0 R /XYZ 79.822 385.268 null ] >> endobj 612 0 obj -<< /D [ 574 0 R /XYZ 79.822 363.35 null ] >> +<< /D [ 575 0 R /XYZ 79.822 374.309 null ] >> endobj 613 0 obj -<< /D [ 574 0 R /XYZ 79.822 352.391 null ] >> +<< /D [ 575 0 R /XYZ 79.822 363.35 null ] >> endobj 614 0 obj -<< /D [ 574 0 R /XYZ 79.822 341.432 null ] >> +<< /D [ 575 0 R /XYZ 79.822 352.391 null ] >> endobj 615 0 obj -<< /D [ 574 0 R /XYZ 79.822 330.473 null ] >> -endobj -126 0 obj -<< /D [ 574 0 R /XYZ 79.37 291.069 null ] >> +<< /D [ 575 0 R /XYZ 79.822 341.432 null ] >> endobj 616 0 obj -<< /D [ 574 0 R /XYZ 79.822 249.305 null ] >> +<< /D [ 575 0 R /XYZ 79.822 330.473 null ] >> +endobj +126 0 obj +<< /D [ 575 0 R /XYZ 79.37 291.069 null ] >> endobj 617 0 obj -<< /D [ 574 0 R /XYZ 79.822 238.346 null ] >> +<< /D [ 575 0 R /XYZ 79.822 249.305 null ] >> endobj 618 0 obj -<< /D [ 574 0 R /XYZ 79.822 203.477 null ] >> +<< /D [ 575 0 R /XYZ 79.822 238.346 null ] >> endobj 619 0 obj -<< /D [ 574 0 R /XYZ 79.822 148.682 null ] >> +<< /D [ 575 0 R /XYZ 79.822 203.477 null ] >> endobj 620 0 obj -<< /D [ 574 0 R /XYZ 79.822 137.723 null ] >> +<< /D [ 575 0 R /XYZ 79.822 148.682 null ] >> endobj 621 0 obj -<< /D [ 574 0 R /XYZ 79.822 126.765 null ] >> +<< /D [ 575 0 R /XYZ 79.822 137.723 null ] >> endobj 622 0 obj -<< /D [ 574 0 R /XYZ 79.822 115.806 null ] >> +<< /D [ 575 0 R /XYZ 79.822 126.765 null ] >> endobj 623 0 obj -<< /D [ 574 0 R /XYZ 79.822 104.847 null ] >> +<< /D [ 575 0 R /XYZ 79.822 115.806 null ] >> endobj 624 0 obj -<< /D [ 574 0 R /XYZ 79.822 93.888 null ] >> +<< /D [ 575 0 R /XYZ 79.822 104.847 null ] >> endobj 625 0 obj -<< /D [ 574 0 R /XYZ 79.822 82.929 null ] >> +<< /D [ 575 0 R /XYZ 79.822 93.888 null ] >> endobj -573 0 obj +626 0 obj +<< /D [ 575 0 R /XYZ 79.822 82.929 null ] >> +endobj +574 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F22 228 0 R /F15 199 0 R /F74 202 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> endobj -629 0 obj -<< /Filter /FlateDecode /Length 1995 >> +630 0 obj +<< /Filter /FlateDecode /Length 2019 >> stream -xÚå[Moã8½÷Wä”#QßÀ¢@Ó$ì¹·Å^wOûÿ¯#É’mQÎÔtì™ -oþ9b~»y<yÖ*?‘Ò‚3Ž¢(B_„p"¾Ç—Š¨F -jxét|{UÖ™xºñéòcø—½ößÝp©åÒxoëÞÓu—·Wƒ MéúɆắÅËàÚŒ¦¯82¤ÀŽ#Ïã¨EIŽêâ@vDŸ“±ú<8›IHDãÑbå*ý+q’^™¯k:¥œ -o¯ ¾!õtÊá•>S[ò±»¶”ë# WZQrá‘Û¢<BnV^d¾ÄψBÓî(¥¡éuG†æ‘Ñ¢Ô°Ê/Á'ÇLÜÔ8.uÇuW:@4]`©uî¢é¢$‘!ù{3fSÔ*\’„´–’¤¯<’Z”cIš+îwç(áæôYçÞGPö©_1ïIaÄ6î¼¥åÎ ;‚"Š—8ñ“s¦s‡MpË÷ÜYhN긲gW-È×T=sÝd-‚V²£äG A‰Æ=…\66$Ü©-kdŽImIJtJ¿+¥U÷/9n¼ñ$ Ñ8J"³@§(|7ÕEæõèxšT㼪› $粓MÛae’¤žCåRÂâ6$ðZí$/‡Pš'n‹³@yTTkÍÊçvfM=À90FwË+Æ Ê~œßKv5OšsAÄéXNzEŸe"< ÓI&˜Ž7^ÝNQpVXœß^?nØÞkç‰Q8°Êv¬x䔟ó;Wp&X°®+7×VëÅY‚Rç”äQ24——çâ]é¯sMLÙ2küˆåš‰ïNúÆ7½¾”.+‚’Is©®¾^§¸Œ/óiâÃŽƒ4~Ò·fÊqýUénFÎÎäRá48K™X[+Æ[äax!©kKNm BQòÊðÖfç§åKÔê¥ò\µùØ¢j˵ã]ÙD¯±#âGD‹r|CN+Ü=ú -FKð^QÒÖ–UÃ-ʆHRêÎÏ3£E™~IÎýL9Ï‹Èy}¢rÌ<2D~L¼Ú lœyž¶P3"ÄXï7³P£(ó•Sia%Ï\YE•bãgS²U…-ÐhÖ©÷¬ßÛí¿Bql -uð ´ë–WÎQ”õ>¶´w |W1K?Š’Æý6ˆÆáDNZ½×EÕÐ"ZUú-ê¬jg{n\´hTe§F4ï‹J¬K½ñ˜x&”¦wy¯³:c`\¬<±iÍ)ÅnS”móÌý:mM¬Ð)MÌno’ÓS Âì¶]n˜Sùî½¾]²cqgb禰6P"å”Ù&([Iýëb Q¼^0A©Î΃¤V)•¤<‚vúÿ=¢»¹R6Wl¯ß1s.Ljæ/§BÀ é˜0[Ëå 1Y¡Ý"õ´‹”2O¼N4AQØv>'É;Oc9cüWóøØÍÿZ°sÛÒ÷j[°} À'_ -Pm«%'Þ²† @þ£eéQ“º -t?«3W<elÓ×àÆi¿;‡g9VÏ©Å‘³Ó~x›½vÕ/×¼zÃÞ¼}4¬¼m|—@xK&‚rÌ<Œºž¹¸"(ûQ8¥‘1UÜ™{\N\¶Þa§L¬¬…voP_Ù«¨äùàiõoR£SRö™‹3ŠRöSòâ2[ËŽµ¤´‹Šú²vQTö‘JŽ„¢zužê˜L¾˜-®Ç}¤¾I–‰À©É>;ga/É~Üc/Jè6I¬éû|‰Ÿ¾EïßÅ`E7Cáö½*¥XÛîÚ¥—p 4R”
f ‘jÆÊÕFpÐS¥A¯Å§ÃvÓðÿ5èÝ
úÚ5Kt‚ÂߢD@xÓiW½SÆßtÔÙ¹ -‡˜q:xå3EñCï07pDc®íÌ>ÿm4Ç®ízº^–í'[îq?×/µ6†—ÖyóMÈù}ûOžÜ‡éFÞ؃dHë;±óêk‚¢e©n…(œžùÍ©Ù +xÚå\Mã6½Ï¯ÈDI”L6“zž[Ñk{êÿ¿VŸ¶E9;¦ãtôf’ØOäÓERÞÊÓß'yúñ"Û»°é¯øß/çÏ—oWNF¯4œ>ÿzQñ"yR'ox{r¨„DuúüçôÇoRâYJíã+¼ýùùû„ùíêáäE@Ô~ ¢ +gEÑ ¥¹Héd|/Q’ty™4¼½jt6^n}¹T}/?á¥@àG|wåV”õÖø=\Ë«
é¾ËÛ«…„¦MûC¹¯àµoáR\[ÐôGV +%aàÈó8"(¡8œœB(<¥ÏÉØô[rúgÜguЮ¨”4:0^Ýñ¦ðgê‰ß4tæ:Ô;.ó¾\ ª¼ò¬¬U~›G˜P°ý•Â÷é{wÇœè ”ÑtNÐòæ„ 6'O-gðBy3PgxÔõ(ÉÑ6óºR—U_æ\œÍ$$¢ñ€³~uá$³ëoÉòí5Áz^Q'µ%wÓ–zgÄä*' +t6 @7$²Ì¼¢À"µ8¿½¢\ØuìÖhã»S¾#ÇlÏò9å'äüÊ +Î:#R_·&ëÍפí(ÉŸdfN/ÏÕ·Ú\);MØ*+üÅšE-¼TÔµ™tCJÒ#¤¦ùú1¯êb|ÝM¸Ò+»vŽ¯è[S‹+¹TXÞÀ@ÅÆÌX[a=R”h&×£„÷šš±5ç4VDJ(J®¯}$p~.`²¤6—ÊKÝæïVu[ïFe¡¥`"<ˆåñ}9´«z_Áª¹°ƒˆ-OÄ=ÊŽµ$Cdˆ˜[Ó¼fF2/ù59ïkáß!çí¡êŽ¿ ^Hã†EÀËÝÊνçi5ã~ÈE˜‰EYVNµ…•<sµŠªÉûè‰&h4êL'/õsb»ßå7(ŽO¡‹;9t5ÙéEÙNáójmLq(/ÌÔ€¤Y¿É8˜©Iµ{+©JƒhSê·ª²¦œý‘qÕ¢I“ƒÁ®h¶Boú#ž
•ÊúÞr,Æ´X#@f˜¢ì›˜gîÖ£X=ðÄk÷”žê"ÌŽãzËœ +øèúvÍŽÕ“‰ƒÛÂFƒ€`(©Ì¶0AÙK꯬‹
(¡µˆàõ‚ Jsv¹LZ–ÒHÊ3ˆóï·ˆ²ìæJ=4Þp¼~ÃÌ¥0©™ÿ‰8•ºoVäÏk-”ÍÉíV©¯]‚0ãÎÎìD
}ç3q’¼ãñ4¥3Öµ“OÝü¯»´-}n¶±;&|ò½Æú!pðÊ‚ò +7vÁ—³ +c¬ï:êìXÈ@`¦ÏÅ—îanଈÆ~ô{ûò÷Öè¾ûèOÑÓýª?aãv¬_jk
¯ÕyËCÈå¸ãÑ'Oîe»QWö$éø>G–÷”[³óëĨš-\+M0?ó›éÑ‹é«Ñ§ÑºÌòþ¹Oy`E½bæ¼Ec?Ë)ÕÉ.øY-ÍíVgõ„^±é¾)UªÔÐ' ©²6\f¼¼<Í|nª
‹'_C=ö®TëK^Ò\*•Z¥rkîÚ‚a²#&KÚéÁŒwž= +?&« „Q†šÁìISŒ@Ú½S; ÑÎÙ|û=? hʘ
· &ŸžœgçÐt]<‚%TñòR;Df› Ü÷Ï Úšb»‚A˜€ƒyÍ_‚²ýßþí6ÛzaµÌæõb Êö•Ýf'¬óƒpxyA9²zÞé–ÆXÎS¯˜ÉQò-Ý„€v·i[`§"å˜nõn—”‰u6P—˜yAÙöÞw›,u¬U55™Ù«"(Çš@8oyíœä¸“·½Ny%|Ÿ‡'§˜‰E²ý´½F;)<â`4óÿUÐܳƒOª(’8 ¤vÝ< Ä9G‹'#Epýsl½º?>_þu”M endstream endobj -628 0 obj -<< /Type /Page /Contents 629 0 R /Resources 627 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> -endobj -630 0 obj -<< /D [ 628 0 R /XYZ 78.37 808.885 null ] >> +629 0 obj +<< /Type /Page /Contents 630 0 R /Resources 628 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 631 0 obj -<< /D [ 628 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 629 0 R /XYZ 78.37 808.885 null ] >> endobj 632 0 obj -<< /D [ 628 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 629 0 R /XYZ 79.822 768.829 null ] >> endobj 633 0 obj -<< /D [ 628 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 629 0 R /XYZ 79.822 757.87 null ] >> endobj 634 0 obj -<< /D [ 628 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 629 0 R /XYZ 79.822 746.912 null ] >> endobj 635 0 obj -<< /D [ 628 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 629 0 R /XYZ 79.822 735.953 null ] >> endobj 636 0 obj -<< /D [ 628 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 629 0 R /XYZ 79.822 724.994 null ] >> endobj 637 0 obj -<< /D [ 628 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 629 0 R /XYZ 79.822 714.035 null ] >> endobj 638 0 obj -<< /D [ 628 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 629 0 R /XYZ 79.822 703.076 null ] >> endobj 639 0 obj -<< /D [ 628 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 629 0 R /XYZ 79.822 692.117 null ] >> endobj 640 0 obj -<< /D [ 628 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 629 0 R /XYZ 79.822 681.158 null ] >> endobj 641 0 obj -<< /D [ 628 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 629 0 R /XYZ 79.822 670.199 null ] >> endobj 642 0 obj -<< /D [ 628 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 629 0 R /XYZ 79.822 659.24 null ] >> endobj 643 0 obj -<< /D [ 628 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 629 0 R /XYZ 79.822 648.281 null ] >> endobj 644 0 obj -<< /D [ 628 0 R /XYZ 79.822 626.364 null ] >> +<< /D [ 629 0 R /XYZ 79.822 637.322 null ] >> endobj 645 0 obj -<< /D [ 628 0 R /XYZ 79.822 615.405 null ] >> +<< /D [ 629 0 R /XYZ 79.822 626.364 null ] >> endobj 646 0 obj -<< /D [ 628 0 R /XYZ 79.822 604.446 null ] >> +<< /D [ 629 0 R /XYZ 79.822 615.405 null ] >> endobj 647 0 obj -<< /D [ 628 0 R /XYZ 79.822 593.487 null ] >> +<< /D [ 629 0 R /XYZ 79.822 604.446 null ] >> endobj 648 0 obj -<< /D [ 628 0 R /XYZ 79.822 582.528 null ] >> +<< /D [ 629 0 R /XYZ 79.822 593.487 null ] >> endobj 649 0 obj -<< /D [ 628 0 R /XYZ 79.822 571.569 null ] >> +<< /D [ 629 0 R /XYZ 79.822 582.528 null ] >> endobj 650 0 obj -<< /D [ 628 0 R /XYZ 79.822 560.61 null ] >> +<< /D [ 629 0 R /XYZ 79.822 571.569 null ] >> endobj 651 0 obj -<< /D [ 628 0 R /XYZ 79.822 549.651 null ] >> +<< /D [ 629 0 R /XYZ 79.822 560.61 null ] >> endobj 652 0 obj -<< /D [ 628 0 R /XYZ 79.822 538.692 null ] >> +<< /D [ 629 0 R /XYZ 79.822 549.651 null ] >> endobj 653 0 obj -<< /D [ 628 0 R /XYZ 79.822 527.733 null ] >> +<< /D [ 629 0 R /XYZ 79.822 538.692 null ] >> endobj 654 0 obj -<< /D [ 628 0 R /XYZ 79.822 516.775 null ] >> +<< /D [ 629 0 R /XYZ 79.822 527.733 null ] >> endobj 655 0 obj -<< /D [ 628 0 R /XYZ 79.822 505.816 null ] >> +<< /D [ 629 0 R /XYZ 79.822 516.775 null ] >> endobj 656 0 obj -<< /D [ 628 0 R /XYZ 79.822 494.857 null ] >> +<< /D [ 629 0 R /XYZ 79.822 505.816 null ] >> endobj 657 0 obj -<< /D [ 628 0 R /XYZ 79.822 483.898 null ] >> +<< /D [ 629 0 R /XYZ 79.822 494.857 null ] >> endobj 658 0 obj -<< /D [ 628 0 R /XYZ 79.822 472.939 null ] >> +<< /D [ 629 0 R /XYZ 79.822 483.898 null ] >> endobj 659 0 obj -<< /D [ 628 0 R /XYZ 79.822 461.98 null ] >> +<< /D [ 629 0 R /XYZ 79.822 472.939 null ] >> endobj 660 0 obj -<< /D [ 628 0 R /XYZ 79.822 451.021 null ] >> +<< /D [ 629 0 R /XYZ 79.822 461.98 null ] >> endobj 661 0 obj -<< /D [ 628 0 R /XYZ 79.822 440.062 null ] >> +<< /D [ 629 0 R /XYZ 79.822 451.021 null ] >> endobj 662 0 obj -<< /D [ 628 0 R /XYZ 79.822 429.103 null ] >> +<< /D [ 629 0 R /XYZ 79.822 440.062 null ] >> endobj 663 0 obj -<< /D [ 628 0 R /XYZ 79.822 418.144 null ] >> +<< /D [ 629 0 R /XYZ 79.822 429.103 null ] >> endobj 664 0 obj -<< /D [ 628 0 R /XYZ 79.822 407.186 null ] >> +<< /D [ 629 0 R /XYZ 79.822 418.144 null ] >> endobj 665 0 obj -<< /D [ 628 0 R /XYZ 79.822 396.227 null ] >> +<< /D [ 629 0 R /XYZ 79.822 407.186 null ] >> endobj 666 0 obj -<< /D [ 628 0 R /XYZ 79.822 385.268 null ] >> +<< /D [ 629 0 R /XYZ 79.822 396.227 null ] >> endobj 667 0 obj -<< /D [ 628 0 R /XYZ 79.822 374.309 null ] >> +<< /D [ 629 0 R /XYZ 79.822 385.268 null ] >> endobj 668 0 obj -<< /D [ 628 0 R /XYZ 79.822 363.35 null ] >> +<< /D [ 629 0 R /XYZ 79.822 374.309 null ] >> endobj 669 0 obj -<< /D [ 628 0 R /XYZ 79.822 352.391 null ] >> +<< /D [ 629 0 R /XYZ 79.822 363.35 null ] >> endobj 670 0 obj -<< /D [ 628 0 R /XYZ 79.822 341.432 null ] >> +<< /D [ 629 0 R /XYZ 79.822 352.391 null ] >> endobj 671 0 obj -<< /D [ 628 0 R /XYZ 79.822 308.772 null ] >> +<< /D [ 629 0 R /XYZ 79.822 341.432 null ] >> endobj 672 0 obj -<< /D [ 628 0 R /XYZ 79.822 297.813 null ] >> +<< /D [ 629 0 R /XYZ 79.822 330.473 null ] >> endobj 673 0 obj -<< /D [ 628 0 R /XYZ 79.822 286.854 null ] >> +<< /D [ 629 0 R /XYZ 79.822 319.514 null ] >> endobj 674 0 obj -<< /D [ 628 0 R /XYZ 79.822 275.895 null ] >> +<< /D [ 629 0 R /XYZ 79.822 286.854 null ] >> endobj 675 0 obj -<< /D [ 628 0 R /XYZ 79.822 264.936 null ] >> +<< /D [ 629 0 R /XYZ 79.822 275.895 null ] >> endobj 676 0 obj -<< /D [ 628 0 R /XYZ 79.822 253.977 null ] >> +<< /D [ 629 0 R /XYZ 79.822 264.936 null ] >> endobj 677 0 obj -<< /D [ 628 0 R /XYZ 79.822 243.018 null ] >> +<< /D [ 629 0 R /XYZ 79.822 253.977 null ] >> endobj 678 0 obj -<< /D [ 628 0 R /XYZ 79.822 232.059 null ] >> +<< /D [ 629 0 R /XYZ 79.822 243.018 null ] >> endobj 679 0 obj -<< /D [ 628 0 R /XYZ 79.822 221.1 null ] >> +<< /D [ 629 0 R /XYZ 79.822 232.059 null ] >> endobj 680 0 obj -<< /D [ 628 0 R /XYZ 79.822 210.141 null ] >> +<< /D [ 629 0 R /XYZ 79.822 221.1 null ] >> endobj 681 0 obj -<< /D [ 628 0 R /XYZ 79.822 199.183 null ] >> +<< /D [ 629 0 R /XYZ 79.822 210.141 null ] >> endobj 682 0 obj -<< /D [ 628 0 R /XYZ 79.822 188.224 null ] >> +<< /D [ 629 0 R /XYZ 79.822 199.183 null ] >> endobj 683 0 obj -<< /D [ 628 0 R /XYZ 79.822 177.265 null ] >> +<< /D [ 629 0 R /XYZ 79.822 188.224 null ] >> endobj 684 0 obj -<< /D [ 628 0 R /XYZ 79.822 166.306 null ] >> +<< /D [ 629 0 R /XYZ 79.822 177.265 null ] >> endobj 685 0 obj -<< /D [ 628 0 R /XYZ 79.822 155.347 null ] >> +<< /D [ 629 0 R /XYZ 79.822 166.306 null ] >> endobj 686 0 obj -<< /D [ 628 0 R /XYZ 79.822 144.388 null ] >> +<< /D [ 629 0 R /XYZ 79.822 155.347 null ] >> endobj 687 0 obj -<< /D [ 628 0 R /XYZ 79.822 133.429 null ] >> +<< /D [ 629 0 R /XYZ 79.822 144.388 null ] >> endobj 688 0 obj -<< /D [ 628 0 R /XYZ 79.822 122.47 null ] >> +<< /D [ 629 0 R /XYZ 79.822 133.429 null ] >> endobj 689 0 obj -<< /D [ 628 0 R /XYZ 79.822 111.511 null ] >> +<< /D [ 629 0 R /XYZ 79.822 122.47 null ] >> endobj 690 0 obj -<< /D [ 628 0 R /XYZ 79.822 100.552 null ] >> +<< /D [ 629 0 R /XYZ 79.822 111.511 null ] >> endobj 691 0 obj -<< /D [ 628 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 629 0 R /XYZ 79.822 100.552 null ] >> endobj 692 0 obj -<< /D [ 628 0 R /XYZ 79.822 78.635 null ] >> +<< /D [ 629 0 R /XYZ 79.822 89.593 null ] >> endobj -627 0 obj +693 0 obj +<< /D [ 629 0 R /XYZ 79.822 78.635 null ] >> +endobj +628 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> endobj -695 0 obj -<< /Filter /FlateDecode /Length 1984 >> +696 0 obj +<< /Filter /FlateDecode /Length 1974 >> stream -xÚÍZÉnä6½û+ú†CVqÜnk€œ}rMNùÿkX\$²(Ù¢fAín«¥ÇÚ뱚òöÏMÞ¾?Éú.}Š¿?Ýߟ¾.&Ü´^!ÜÞÿ~Rñ&yS7oxssV iÕíýß۟ߤ´/Rˆïæù¯÷?V̯‹‡›ÁZô-ˆRV8㔈`´”ÚÇ¡…üR¯Ræ믫%¯ÒHü™¸F -%aWωۣXúE[H$&ªÌꮈmâ;hzM‹A(\|ÄsâK'PG—žþº(sñ)°º}ÊQe%ÚÍp¤ÊBê<AÄb•Å{|ÆÐ÷¬¬~<ƒ§'B½Ó¨øM]Óé½5•1Âůتd4ƒ[LÞÈ/t¾«×-|¨€Ò[¾JB_õJ¸„¯²Næ;`ÉúÁRï,wØõJ±=O/ÿ¸G¾žìÅä5~6 l°BãúíT@'xBVÖ¯Y;G¾e aðlÖ -íX©¬–¯?™W*BÂÒ -Já²–Ä]®ÐfTX)k -ÂvÍÂ1ÚªnŽŸ,YÑõñCQÀ¼®â[ÐÕíkdáYˆG6[ïM¾¨5²qaW`u×,xq5f‹Š¼ü‡
”Æ -©†ªx–¸EÞWç(ÂÐF ã1N’£…V–£ð€÷q.JåxpÀø2ÁvwjÓS§ÇÄüöݶb)0׃7šG†0ïIªc#ÃCÅQ²©tU1vì4µÔͧ!Öd»\¬¬××(ÔPbÏr«ÛÈ!„ò]“Åpšw¬¥£GùVXê¯è~À_ -F8äRœíäh’*ÖÒ×™á´Å@½ö²ä¨s¬ƒÑol+O›Âkáœlq²Ù{±z06¡gVIýV~>Ü=œŠØ§±A=ņA±?_¦§^·àÙYI‰i†rA|\†þ<(å¡\Ã(>ÀBž”îÈP.ˆ¡%`%1ô9b(§èJÅ-™Ñ‡týÑ©¦nöù\½=â4NÛˉšt$jý)In…¤9ˆ˜ÏR…¯þ –ÎÚÌáÝcÛ-¦ÓHù¾þ¤Î¤ç¼y0ÄÏIZSXñŽíuEÊh~XîãyÓ±ì\LÉ!”'êAF°8ŒxYb}÷mªíµ–}sÖ—G0VgôGÇ-ø)ÖãuLJëFx™Ekm¯´ža*\Íyp¸)Ćgì -ƒÛHÜxvâíýé?Ç”jž +xÚÍZÉnã8½ç+üa“Åh°ã¸9ç6˜ëÌiþÿÚ,’%‘E)ÕúàD–©ÇÚ7Q^þ»ÈË·'Iÿ…Å«ô÷ÛÓíýéËÃÆ‹1(
—÷ŸTZ$/꬀`/Þ)!º¼ÿùû«”î*¥…ôß¾üóþׂùåàDtN‡D)'¼õŠ”R# +~îRš[ùéZ= +rCåg$Z)”„D3G"CIú‘””>]YîÙt¡^©·•…“dë(”ÑœlçÈf(HjH(R=I¡‚ᤙ·9ÒJ•‘çbùdiêrÿŒ@y`[’]âßÇ9’JCž«F€ßÑfñ74¼§oå×ýV¤àgÅÂ+= +’m9ð@’˜ä«m£V|%݆Y²]´BKÏÉv·cdK/´Ž>?ýå¡ì%¦§À™ö)…öç’4ZÅu5¼<k+ó®ê©7æþ!ë™V¢5íéÍÖžÊZáÓOlWHR´z5íli/+‹Ùã=üî;ø3 +kdBÈŠª†I¬áoX<¬eÚ4K2¦ÊuhãŽ6Ñà„òÀQæÍÌÄ œëÛ²ëñÆXÛ$QÇQú2—j˜R`•Ò€—³ºÊÙoÎf-Ö(ˆä’· (}ÚÚÌä©hÆkjþ–n·†¦ªÕ_ç}!>£²à…—‘«ìè +}¬½ÂÂp®n?À¾GoæÜ#T¿éANáR—Õ@Åu*I0”C=™I$Mìõd)Mí÷d‹'n´»kã•+ÞüÍêøâem»–[vÆ`Þ,XwŠœÓ²–)¸à²ž+ÚÈï+XF6qç^²Î|‘¢[®Áf™„)ûc(óÙC‡äF0:ãÜøŸ¡ +œæJ(õ('äŽ +”†“q4SéQhR“kù#-Ò–.Pît€)¿Ÿ¾5Þv_‰äµÃ`oÕg¡nV`*ºdñvØ\âg(ózSéjJ9G-jÊVÉ:jëÑ:(Àßô£/½Ä¯K-Ê'òÁ̇©ª“¡œÐÃ7La0…ƒ©Ükf@É1ëÑGšáÄÅP|mùÉ^îXf£úXwž†Å·IqÆÁt@8ÇAØžI%g\ùù|ww0¾#ŸFt’%³â°;+>] *£„ËÑa ur‚–Å!-(¼õ('ÈPQ8Ý¿á´ÇËšÊ 2p$ë
'ãh’®ÅC94COþ`âäUkêš°Ïëí§qÜ^OÔä3QË«$¹F‘æ$b9L[<z!–ÏÚìâý}mói¤²®?©ÓË{çÌHLAĺ‹Ái–Ç{oïOß Qo endstream endobj -694 0 obj -<< /Type /Page /Contents 695 0 R /Resources 693 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> -endobj -696 0 obj -<< /D [ 694 0 R /XYZ 78.37 808.885 null ] >> +695 0 obj +<< /Type /Page /Contents 696 0 R /Resources 694 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 697 0 obj -<< /D [ 694 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 695 0 R /XYZ 78.37 808.885 null ] >> endobj 698 0 obj -<< /D [ 694 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 695 0 R /XYZ 79.822 768.829 null ] >> endobj 699 0 obj -<< /D [ 694 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 695 0 R /XYZ 79.822 757.87 null ] >> endobj 700 0 obj -<< /D [ 694 0 R /XYZ 79.822 704.201 null ] >> -endobj -130 0 obj -<< /D [ 694 0 R /XYZ 79.37 665.606 null ] >> +<< /D [ 695 0 R /XYZ 79.822 746.912 null ] >> endobj 701 0 obj -<< /D [ 694 0 R /XYZ 79.822 613.234 null ] >> +<< /D [ 695 0 R /XYZ 79.822 735.953 null ] >> endobj 702 0 obj -<< /D [ 694 0 R /XYZ 79.822 597.33 null ] >> +<< /D [ 695 0 R /XYZ 79.822 724.994 null ] >> endobj 703 0 obj -<< /D [ 694 0 R /XYZ 79.822 586.371 null ] >> +<< /D [ 695 0 R /XYZ 79.822 714.035 null ] >> endobj 704 0 obj -<< /D [ 694 0 R /XYZ 79.822 575.412 null ] >> +<< /D [ 695 0 R /XYZ 79.822 703.076 null ] >> endobj 705 0 obj -<< /D [ 694 0 R /XYZ 79.822 564.454 null ] >> +<< /D [ 695 0 R /XYZ 79.822 663.397 null ] >> +endobj +130 0 obj +<< /D [ 695 0 R /XYZ 79.37 627.341 null ] >> endobj 706 0 obj -<< /D [ 694 0 R /XYZ 79.822 553.495 null ] >> +<< /D [ 695 0 R /XYZ 79.822 576.268 null ] >> endobj 707 0 obj -<< /D [ 694 0 R /XYZ 79.822 542.536 null ] >> +<< /D [ 695 0 R /XYZ 79.822 561.23 null ] >> endobj 708 0 obj -<< /D [ 694 0 R /XYZ 79.822 531.577 null ] >> +<< /D [ 695 0 R /XYZ 79.822 550.272 null ] >> endobj 709 0 obj -<< /D [ 694 0 R /XYZ 79.822 520.618 null ] >> +<< /D [ 695 0 R /XYZ 79.822 539.313 null ] >> endobj 710 0 obj -<< /D [ 694 0 R /XYZ 79.822 509.659 null ] >> -endobj -134 0 obj -<< /D [ 694 0 R /XYZ 79.37 470.381 null ] >> +<< /D [ 695 0 R /XYZ 79.822 528.354 null ] >> endobj 711 0 obj -<< /D [ 694 0 R /XYZ 79.822 449.539 null ] >> +<< /D [ 695 0 R /XYZ 79.822 517.395 null ] >> endobj 712 0 obj -<< /D [ 694 0 R /XYZ 79.822 438.58 null ] >> +<< /D [ 695 0 R /XYZ 79.822 506.436 null ] >> endobj 713 0 obj -<< /D [ 694 0 R /XYZ 79.822 427.621 null ] >> +<< /D [ 695 0 R /XYZ 79.822 495.477 null ] >> endobj 714 0 obj -<< /D [ 694 0 R /XYZ 79.822 416.662 null ] >> +<< /D [ 695 0 R /XYZ 79.822 484.518 null ] >> endobj 715 0 obj -<< /D [ 694 0 R /XYZ 79.822 405.703 null ] >> +<< /D [ 695 0 R /XYZ 79.822 473.559 null ] >> +endobj +134 0 obj +<< /D [ 695 0 R /XYZ 79.37 437.253 null ] >> endobj 716 0 obj -<< /D [ 694 0 R /XYZ 79.822 394.744 null ] >> +<< /D [ 695 0 R /XYZ 79.822 416.411 null ] >> endobj 717 0 obj -<< /D [ 694 0 R /XYZ 79.822 383.785 null ] >> +<< /D [ 695 0 R /XYZ 79.822 405.452 null ] >> endobj 718 0 obj -<< /D [ 694 0 R /XYZ 79.822 372.826 null ] >> +<< /D [ 695 0 R /XYZ 79.822 394.493 null ] >> endobj 719 0 obj -<< /D [ 694 0 R /XYZ 79.822 361.868 null ] >> +<< /D [ 695 0 R /XYZ 79.822 383.534 null ] >> endobj 720 0 obj -<< /D [ 694 0 R /XYZ 79.822 350.909 null ] >> +<< /D [ 695 0 R /XYZ 79.822 372.575 null ] >> endobj 721 0 obj -<< /D [ 694 0 R /XYZ 79.822 339.95 null ] >> +<< /D [ 695 0 R /XYZ 79.822 361.616 null ] >> endobj 722 0 obj -<< /D [ 694 0 R /XYZ 79.822 328.991 null ] >> +<< /D [ 695 0 R /XYZ 79.822 350.657 null ] >> endobj 723 0 obj -<< /D [ 694 0 R /XYZ 79.822 318.032 null ] >> +<< /D [ 695 0 R /XYZ 79.822 339.699 null ] >> endobj 724 0 obj -<< /D [ 694 0 R /XYZ 79.822 307.073 null ] >> +<< /D [ 695 0 R /XYZ 79.822 328.74 null ] >> endobj 725 0 obj -<< /D [ 694 0 R /XYZ 79.822 291.17 null ] >> +<< /D [ 695 0 R /XYZ 79.822 317.781 null ] >> endobj 726 0 obj -<< /D [ 694 0 R /XYZ 79.822 280.211 null ] >> +<< /D [ 695 0 R /XYZ 79.822 306.822 null ] >> endobj 727 0 obj -<< /D [ 694 0 R /XYZ 79.822 269.252 null ] >> +<< /D [ 695 0 R /XYZ 79.822 295.863 null ] >> endobj 728 0 obj -<< /D [ 694 0 R /XYZ 79.822 258.293 null ] >> +<< /D [ 695 0 R /XYZ 79.822 284.904 null ] >> endobj 729 0 obj -<< /D [ 694 0 R /XYZ 79.822 247.334 null ] >> +<< /D [ 695 0 R /XYZ 79.822 273.945 null ] >> endobj 730 0 obj -<< /D [ 694 0 R /XYZ 79.822 236.375 null ] >> +<< /D [ 695 0 R /XYZ 79.822 258.908 null ] >> endobj 731 0 obj -<< /D [ 694 0 R /XYZ 79.822 225.416 null ] >> +<< /D [ 695 0 R /XYZ 79.822 247.949 null ] >> endobj 732 0 obj -<< /D [ 694 0 R /XYZ 79.822 214.457 null ] >> +<< /D [ 695 0 R /XYZ 79.822 236.99 null ] >> endobj 733 0 obj -<< /D [ 694 0 R /XYZ 79.822 203.498 null ] >> +<< /D [ 695 0 R /XYZ 79.822 226.031 null ] >> endobj 734 0 obj -<< /D [ 694 0 R /XYZ 79.822 192.54 null ] >> +<< /D [ 695 0 R /XYZ 79.822 215.072 null ] >> endobj 735 0 obj -<< /D [ 694 0 R /XYZ 79.822 181.581 null ] >> +<< /D [ 695 0 R /XYZ 79.822 204.113 null ] >> endobj 736 0 obj -<< /D [ 694 0 R /XYZ 79.822 170.622 null ] >> +<< /D [ 695 0 R /XYZ 79.822 193.155 null ] >> endobj 737 0 obj -<< /D [ 694 0 R /XYZ 79.822 159.663 null ] >> +<< /D [ 695 0 R /XYZ 79.822 182.196 null ] >> endobj 738 0 obj -<< /D [ 694 0 R /XYZ 79.822 148.704 null ] >> -endobj -138 0 obj -<< /D [ 694 0 R /XYZ 79.37 123.365 null ] >> +<< /D [ 695 0 R /XYZ 79.822 171.237 null ] >> endobj 739 0 obj -<< /D [ 694 0 R /XYZ 79.822 96.582 null ] >> +<< /D [ 695 0 R /XYZ 79.822 160.278 null ] >> endobj 740 0 obj -<< /D [ 694 0 R /XYZ 79.822 85.623 null ] >> -endobj -693 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 695 0 R /XYZ 79.822 149.319 null ] >> endobj -743 0 obj -<< /Filter /FlateDecode /Length 2127 >> -stream -xÚí[Ën#¹Ýç+ü–HêÚ‰k€Yg7˜í½«ûÿÛѳJ¢ÊIÉnfwáØ®*‘G”tH)òôß“<ýö"ë»ÐñSøûÛËåãåû¢ý‰„w -áôñŸ’'urZ€Ó'k”F>þwúãUJó#¼´”ÖŸÿüø}Åü¾889áAׂx+<8$%½I‰€Â®RjÞ/ü=Ü»ä{>®ÿÈ÷ãõøRoù,çotD4맀
*¿LÄmAÆIïùº)×6¬üÙÈ׎-Ð¥¹›HhýŠM-…’ÀÙÔpˆM%@ŽL›5½P„Üs9f†2ÂjËQ"óxÉF¦cOFö#Û€¹Gã}*=oÓfƒÊÑ`ö9³{”hv„øB[¢šéB€Î³«¬ -m÷¨ˆš0d¾ÖN?Q`¼(í´zŠ†ò`4˜= -bϧ1j7œ!‘’%Óá(Ìa~ ƒæèèQ¤c7"¢ÛT¦¬4žG‰E#ˆsŒt ‚rw¶XÊ -êšYB>ì¼A8èºÎyߣ|å~Z–ê2åó½ô|ý¼lÔ$ñ~K^ì-lu0Õï ñmGªLË£• ÛË:,ÆV²z”¿¬:©ÂòT’(<¦“tTcU’z”$Y]5)ð¯ÙìHJ’°oã«ù{òS»×±T¥´nž1…ÔŽ¨¶ˆ
µ—Œ£M|}*m—ÄÓýÔƒZ§~RW2”ÏteQózÒ('´×ƒ¹?¦Ô8C¹ƒ5 ÂèÁœJ±È?!Å -:bÓT5¶}‰ËËgqhåý1¨½Æ›M7Õ©e>Å -TX´ClÍÉ>†òüK/¬uƒÙå¡ÂÊÂP~~Š¥µNù¡“qÎÌåWU
š¬pÀ8ª°*Wȯ¦4áe§B«ÊQòÓ5ÿ^„ß ß×"Í“ÒŒ¡<Ohï7÷¨œ©KIRXû¾(}òáW`¨ý•õ"Ì÷äŒ~ú.ç ¸Gé_ó4Ú&cZÁ¾æ¸Úúµ>£àÖêŽJ¾–x[Ñk”_ï«·z/Ò»wYïßn!Æâù¡‰¸æjkòaEÂó7p¯³m“›É*)y•«æœ~#¡"ì7…©æ[ˆ“ç¦Õø)«ò¬ZJÚŸÜî–Z¨"Æ;•ÌQÍ:Ö’PÍ‚~).ù=I³÷Z¨®ú‚6~‹¾ÄiÀš2—Öœü½ÞÍQ(„BOì£TlÈœTzdm ©DÚfM[94I,1²™1PšúÞKV;·+5@ë$ßSÓn—g_ëÕÌîðávñ#CýºÚ’®–7ÕÉ2 -í
H -ŸW¼ãHÝr!|_¸á©3ŒzB¹uÔ×¹}u±éÓ*¤Rȸ2®Ò‘<óºkCyb%0}Û¨«ÙB S-Íùú@MwS™±„{•ÍŠgRÜNNÙ¤• -Ìúê|#³ãø³e,×@·â˜ÿ jaô¶–BöɃZ ú¹2W!±–†C‚Ù§ó‹¡ ´Æ"G›W $Œ·|¬qÊ@>S Ç•åCiÆGb÷q²0ÂPæõ$JÖúÁŒ¹ó@¨‘Iu»¼Õeî‡qÛ¼n”ïè [6Ê7äYgÁ+á`X&O1”Z™Oº¡8šN•ä=wÈÙšŽÚ²fäiGÎÀàè\–ÀP†Tº\·êA#X®l
H§=v´_GC½j®-U<š8îCQ4´XH¿[4 ³£ÄaPÍe;%Ñ¿Ô¿â`S2ÔÔVZΦDG]G¨)ª+;,Ûúe®ý†$ÏÍ¢ŠŽ»çä¬Û62µ~;K°¼
Ïm±1¶;˨ž;þó<z+z›QÈÄn¬Õ9=LsyCI„bvµ–ÜÛ)¤’ˆæ+Ûúq[V«YúÖÂþ¦ûÞ²ÄcóØ„²j8ØòÅÕ/ÖAû΃V‡xçLfce/Ú åF”?0ØÃp•frècB7}b‹¡üÜXø¢¿gVZ(é¸Ã“[|e¯—¿v¶]T¨ÉÌñ~ç$ µ;ÎMžob(÷97ôäŠL*¡Ó¬cÊ£P£_s¡zù BއЙ;Å@U¥PeͦÿÚ]”¾¾W„Ç^¡ì¾$ýî Si#†^™<ÉÄPæ³,EZà0ƒMêAb·BUÜ$yP¯¼»
Ý(š~pônoÞk}bá{Ÿ&IÐVYœ+‰s”i -ÜÙlT‰®›}Ðèð…×7zk]×t-ÝA
C˜Ï‰6†ÒþËß]¼å§F–A9u“’Š¡ÌQ÷*©„Fj©Ñ0]Mg(wüà -ƒž[1Wì1ž}²÷áUn\7åîžÙͧ\Y¹QÚ÷*´$…oNª^¥pýxùèB -endstream +741 0 obj +<< /D [ 695 0 R /XYZ 79.822 138.36 null ] >> endobj 742 0 obj -<< /Type /Page /Contents 743 0 R /Resources 741 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 695 0 R /XYZ 79.822 127.401 null ] >> endobj -744 0 obj -<< /D [ 742 0 R /XYZ 78.37 808.885 null ] >> +743 0 obj +<< /D [ 695 0 R /XYZ 79.822 116.442 null ] >> endobj -745 0 obj -<< /D [ 742 0 R /XYZ 79.822 768.829 null ] >> +138 0 obj +<< /D [ 695 0 R /XYZ 79.37 93.702 null ] >> +endobj +694 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> endobj 746 0 obj -<< /D [ 742 0 R /XYZ 79.822 757.87 null ] >> +<< /Filter /FlateDecode /Length 2162 >> +stream +xÚí[Ër#©Ýû+ôMC&χ#,[5³önb¶÷®îÿo(( )Ù•’51ÓqjKõ8d2á$Ðòôß“<ýö$ë_aÒ·øïoO租‹ '-‚W§ÿ<©ø<©“7¼99«„´êôñ¿ÓÏRÚ×ø1ñs~ùóã÷
óçâáäE°}œà)h)õ›”Rºø‹”FÅ¿çüï×{:~·!^]ï§ëé£ÞÖ{°¼ü0`¢Ý¾El“ða}7¿÷¾Ýu;o¸Õ•Ž–¯81R( '¯‡8QÒ Ô@Qf™±/–ê¾.a¼o+¥ÖÇßàúDÉd$‚žPë'µ1S·^·åZ£~ýžP»n8ˆæäêI~R(ïèÔBÙ©c0°‚uyt°~#û;Á}›€$Nlz^˜(Ñ4® +h=e›9f†²ÂGQósV¬lçŒõ~Í1xc›-UþKÍÖ<³G”dv +„ôAW¢šSß±ÙHÁNŒ,3 JŽës‰Û¿Xb8ýNßM7jé·!#ÆÑéÜz%¹›~籸œó á/c®XɦÂÖQ*ô…GňrÆíQQ'‡œþdø¹“ë…–~ 6æ‚åÎh°{¤žÏ9êNŠDI„»é0Nh(xtŒ(wÒ±Ém]†¬œ£D[¡ƒ¢”Ôƒ%#Ê}” Ü/–2‡únœw»F„ÉýWžû#ÊWî物NTa½—Ÿ¯ß—FM–ï×ÆÞÔVÓi““§»oÐÉ´0)YÈMF”¿¬:¬ÂòP’ +«ôD’ç‘4¢dÑêWY“ÿ²šHÉ"ömp|3O€å:vIU:Á˜îÛ(L¶tD±c"ŽåLÂ16}>·K‹o§^‚°ÆLÉÌS–å3eÙG_Qš „
v2W³ô8Aá³fœ‰~OfTŒ¥È" ÿ„"ëpQ:µàäí1h¬.8ÊæQÑY;uDáYÆ ð8?D¶ð#(/²Œá] fh`…r@Q¾¿È2¨bÔS+j¦jå +)§€:*¬*I#Ê·k†½>Ð!©q¢™'ÍÊãôö^ÈqÅ)§ŽaM%¥°ösQæâ[`uÿVZìˆ.š ThDùµ +ÅÈ=Êð¼£}1fÔ¸ç5®Z¿Ö§S\›ÝQÉçozRê}õVï%z·t—õþõR,¾üÐhٚ}ØðåøçÞÙ¾Éf²ƒJÊšFåª}Éo¯‘Pö›Â¼ê[ˆ“/]«éÛšVåYµ”Â?»=&–ZtELw*
¸Î™¤cµÐMèçÒê²þÍÒì½®ÇET_}A—~%_Ò0àlK—¶!³Þ];¢P…žÔV©ç¼•á¡Ò#kY%ê61Ý„ Bk‰%Fš¥iì½ü`µ³]©Z9]÷`ü._Œy®WW^p‡¿‹Ÿ¢ÛUÅ–|µô¸N–„tz/!SE;N«k.Äß5<wæ¬Ç4îlY_ÇöÍ9Ä®O«Ê!ãK^å'yöy׆òÄF`þ5·Qgœª…¦á:Z)Öë×5ßÍ%Ü«4ÐÐÍx6Ç-wÈ-ô4dkN-E@¨Ø©ÒÃÁw‹½™T eæ²¢P &²£{u"Qø5‘Ž…½––šÁÜ (¯‰0ø1ý{³õ…]Ê”_µÜ@/ET<”,æ +?AùÕÊ
´A”$æš?Aù¹1Ñl¼0SÞ2·FÇFÔhÔÚ£%h£ Ê¡b#Ú-œje륩Ü>6’<hB°J€r彉Ç"?ÓTÊÆšZÞ™7ÍÝœÁ×<p ¥-PѺZ?ˆÖõ-9´ÔýƒÛ@³ôœèϽFPQVìz=+Ö&13e™m³?—”Ñ,áÂÄ@=é’3ˆõÕùN®Ž÷âÏ•\®) ¯Ä¹þ‰¥UΪå°úÖÕA½ý\™+¥EÔì>_¤‚2RX‡¯@!ŠH¦ ðàGQ ä3z\Y~‘J½çù‹·0BPøzœ³Ô`A@w"©n–÷걌ý0oš×mò5áÊ6yCf»jã=˜gÞ©"‚R×å³j(ŽæÓ@¾‹<îl-F]™Wd¶££ýHeÖeÊŸzÐåÒÖ>4tråBf€|ÚcGù
4Ô«öÒSE£‰âÞES‹…ô›%h¡‡!Õ9ìZ‡ dú—ºñWìî–6¥ZN¦$Gý@¨Ÿ)ªó:,mö²—q;’Æg³¨¢ãî99çÛ6¦QÓ»\‚„Ô†ÌÜ`#(do–PÍ;üó8z+z_OÍÈwÄnÔWÒ[J-³ª"(õÄwrµ.¸÷CH%q<#¾Gb¿zÜ/ªÕ½µ°¿å¾7-ÑØ<6 l +Zµ¸ùE:hÀ¹¡s” +ÜÔ9¼bŒ ìEû´\‰òÛ“]… ”õÔiæy-‚ò½±ðEsö^€“ü
>‚²×Ë_;ÛO*º«Ìñvçœ0ÜÌÃM#Èm®M}VþOK^>×l·¬ÐŽŽn~ñNAþ +cW˜¶þR)d.ˆS6…NîlvªÄÔ>ètøBW½uU×-ñé Vƒ”¦fAúÿÄò÷Æmù‘qÿ˜ 'âxzjá÷O(§…EC‰a®£ uôÞ^¾²èÒÁe{Š“Ppm]ê<µ~ùxúiãBš +endstream +endobj +745 0 obj +<< /Type /Page /Contents 746 0 R /Resources 744 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 747 0 obj -<< /D [ 742 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 745 0 R /XYZ 78.37 808.885 null ] >> endobj 748 0 obj -<< /D [ 742 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 745 0 R /XYZ 79.822 768.829 null ] >> endobj 749 0 obj -<< /D [ 742 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 745 0 R /XYZ 79.822 757.87 null ] >> endobj 750 0 obj -<< /D [ 742 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 745 0 R /XYZ 79.822 741.93 null ] >> endobj 751 0 obj -<< /D [ 742 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 745 0 R /XYZ 79.822 730.971 null ] >> endobj 752 0 obj -<< /D [ 742 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 745 0 R /XYZ 79.822 720.012 null ] >> endobj 753 0 obj -<< /D [ 742 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 745 0 R /XYZ 79.822 709.053 null ] >> endobj 754 0 obj -<< /D [ 742 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 745 0 R /XYZ 79.822 698.095 null ] >> endobj 755 0 obj -<< /D [ 742 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 745 0 R /XYZ 79.822 687.136 null ] >> endobj 756 0 obj -<< /D [ 742 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 745 0 R /XYZ 79.822 676.177 null ] >> endobj 757 0 obj -<< /D [ 742 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 745 0 R /XYZ 79.822 665.218 null ] >> endobj 758 0 obj -<< /D [ 742 0 R /XYZ 79.822 626.364 null ] >> +<< /D [ 745 0 R /XYZ 79.822 654.259 null ] >> endobj 759 0 obj -<< /D [ 742 0 R /XYZ 79.822 610.423 null ] >> +<< /D [ 745 0 R /XYZ 79.822 643.3 null ] >> endobj 760 0 obj -<< /D [ 742 0 R /XYZ 79.822 599.464 null ] >> +<< /D [ 745 0 R /XYZ 79.822 632.341 null ] >> endobj 761 0 obj -<< /D [ 742 0 R /XYZ 79.822 588.506 null ] >> +<< /D [ 745 0 R /XYZ 79.822 621.382 null ] >> endobj 762 0 obj -<< /D [ 742 0 R /XYZ 79.822 577.547 null ] >> +<< /D [ 745 0 R /XYZ 79.822 610.423 null ] >> endobj 763 0 obj -<< /D [ 742 0 R /XYZ 79.822 566.588 null ] >> +<< /D [ 745 0 R /XYZ 79.822 599.464 null ] >> endobj 764 0 obj -<< /D [ 742 0 R /XYZ 79.822 555.629 null ] >> +<< /D [ 745 0 R /XYZ 79.822 583.524 null ] >> endobj 765 0 obj -<< /D [ 742 0 R /XYZ 79.822 544.67 null ] >> +<< /D [ 745 0 R /XYZ 79.822 572.565 null ] >> endobj 766 0 obj -<< /D [ 742 0 R /XYZ 79.822 533.711 null ] >> +<< /D [ 745 0 R /XYZ 79.822 561.606 null ] >> endobj 767 0 obj -<< /D [ 742 0 R /XYZ 79.822 522.752 null ] >> +<< /D [ 745 0 R /XYZ 79.822 550.648 null ] >> endobj 768 0 obj -<< /D [ 742 0 R /XYZ 79.822 458.991 null ] >> +<< /D [ 745 0 R /XYZ 79.822 539.689 null ] >> endobj 769 0 obj -<< /D [ 742 0 R /XYZ 79.822 448.032 null ] >> +<< /D [ 745 0 R /XYZ 79.822 528.73 null ] >> endobj 770 0 obj -<< /D [ 742 0 R /XYZ 79.822 437.073 null ] >> +<< /D [ 745 0 R /XYZ 79.822 517.771 null ] >> endobj 771 0 obj -<< /D [ 742 0 R /XYZ 79.822 426.115 null ] >> +<< /D [ 745 0 R /XYZ 79.822 506.812 null ] >> endobj 772 0 obj -<< /D [ 742 0 R /XYZ 79.822 415.156 null ] >> +<< /D [ 745 0 R /XYZ 79.822 495.853 null ] >> endobj 773 0 obj -<< /D [ 742 0 R /XYZ 79.822 404.197 null ] >> +<< /D [ 745 0 R /XYZ 79.822 432.092 null ] >> endobj 774 0 obj -<< /D [ 742 0 R /XYZ 79.822 393.238 null ] >> +<< /D [ 745 0 R /XYZ 79.822 421.133 null ] >> endobj 775 0 obj -<< /D [ 742 0 R /XYZ 79.822 382.279 null ] >> +<< /D [ 745 0 R /XYZ 79.822 410.174 null ] >> endobj 776 0 obj -<< /D [ 742 0 R /XYZ 79.822 332.466 null ] >> +<< /D [ 745 0 R /XYZ 79.822 399.215 null ] >> endobj 777 0 obj -<< /D [ 742 0 R /XYZ 79.822 321.507 null ] >> +<< /D [ 745 0 R /XYZ 79.822 388.256 null ] >> endobj 778 0 obj -<< /D [ 742 0 R /XYZ 79.822 310.548 null ] >> +<< /D [ 745 0 R /XYZ 79.822 377.298 null ] >> endobj 779 0 obj -<< /D [ 742 0 R /XYZ 79.822 299.589 null ] >> +<< /D [ 745 0 R /XYZ 79.822 366.339 null ] >> endobj 780 0 obj -<< /D [ 742 0 R /XYZ 79.822 288.63 null ] >> +<< /D [ 745 0 R /XYZ 79.822 355.38 null ] >> endobj 781 0 obj -<< /D [ 742 0 R /XYZ 79.822 277.671 null ] >> +<< /D [ 745 0 R /XYZ 79.822 305.567 null ] >> endobj 782 0 obj -<< /D [ 742 0 R /XYZ 79.822 266.712 null ] >> +<< /D [ 745 0 R /XYZ 79.822 294.608 null ] >> endobj 783 0 obj -<< /D [ 742 0 R /XYZ 79.822 255.753 null ] >> +<< /D [ 745 0 R /XYZ 79.822 283.649 null ] >> endobj 784 0 obj -<< /D [ 742 0 R /XYZ 79.822 244.794 null ] >> +<< /D [ 745 0 R /XYZ 79.822 272.69 null ] >> endobj 785 0 obj -<< /D [ 742 0 R /XYZ 79.822 233.836 null ] >> +<< /D [ 745 0 R /XYZ 79.822 261.731 null ] >> endobj 786 0 obj -<< /D [ 742 0 R /XYZ 79.822 222.877 null ] >> +<< /D [ 745 0 R /XYZ 79.822 250.772 null ] >> endobj 787 0 obj -<< /D [ 742 0 R /XYZ 79.822 211.918 null ] >> +<< /D [ 745 0 R /XYZ 79.822 239.813 null ] >> endobj 788 0 obj -<< /D [ 742 0 R /XYZ 79.822 200.959 null ] >> +<< /D [ 745 0 R /XYZ 79.822 228.854 null ] >> endobj 789 0 obj -<< /D [ 742 0 R /XYZ 79.822 175.056 null ] >> +<< /D [ 745 0 R /XYZ 79.822 217.895 null ] >> endobj 790 0 obj -<< /D [ 742 0 R /XYZ 79.822 164.097 null ] >> +<< /D [ 745 0 R /XYZ 79.822 206.936 null ] >> endobj 791 0 obj -<< /D [ 742 0 R /XYZ 79.822 153.138 null ] >> +<< /D [ 745 0 R /XYZ 79.822 195.978 null ] >> endobj 792 0 obj -<< /D [ 742 0 R /XYZ 79.822 142.179 null ] >> +<< /D [ 745 0 R /XYZ 79.822 185.019 null ] >> endobj 793 0 obj -<< /D [ 742 0 R /XYZ 79.822 131.22 null ] >> +<< /D [ 745 0 R /XYZ 79.822 174.06 null ] >> endobj 794 0 obj -<< /D [ 742 0 R /XYZ 79.822 120.261 null ] >> +<< /D [ 745 0 R /XYZ 79.822 148.157 null ] >> endobj 795 0 obj -<< /D [ 742 0 R /XYZ 79.822 109.303 null ] >> +<< /D [ 745 0 R /XYZ 79.822 137.198 null ] >> endobj 796 0 obj -<< /D [ 742 0 R /XYZ 79.822 81.407 null ] >> -endobj -741 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 745 0 R /XYZ 79.822 126.239 null ] >> endobj -799 0 obj -<< /Filter /FlateDecode /Length 2594 >> -stream -xÚÍ[Én#9½û+ôÅ"#¸†§ål Ͼ
æ:}êÿ¿6×$¤¥¤Ú®©ƒ,9—Ç`ìù寿üñÄË7Sá—ÿûÇÓöñôsWî"™³áòñ¿'áâq±ŠU£ãZ\>þ¾üç™stœ+à\o/ÿýøóÀü¹[¸Xæ´FÛ‚nJ ( ÓÛ
%÷ÈPœ ¯çÈše( -H´yîÑ„ÿ¾úoM¿û{èïAº/ý·ô÷àm™ltLH¤d£;G6h&P”@v!I»D®±‰Üc*ïé~¸f îÿ{ù¡@›'*Ò'üF“Š†Šž-#ÆQÞ[ -–™– +¦Ø5¦ô(ßÇ”pM¼}+C„a -’×Abº3–jö?QÕÆÜ¡Cn<Voj‘?w¡.Îs -¸ÛØ0¾üˆÓäË£ax48õ&0>7ÞŒ~‰ç~M"I:X¦å1ìËáé(ÂŽäCw!¿o+°aE¤Ï–1ã”lÇQÝX~„ýà7&bŒ.<î¹YˆNÒ5ò†t•bÚõÚ=sÚ×”ÏLõ<z}¦U Sb9°UÊ–QžyˆøÜŒh*_J(<eyƒ²;]íØ.Eg -•Íùj@ù¯Vøø«Á‰ cˆ=«<Ü}O¦'pk鉌æÕðe Ê.{@)™‘]êýPf-y$(‡Ž\3÷³~&9Ñ,¦É1¦©à«^[ÿ‘¥iFëcG5Xº‹€©[xM4~nÜÇã)>÷â¨_º<G™±@E¢à”Hœa,Q2;¸ô_ëàÒløšTóx¶1‚ Êùùb‡0{.Kæff/Ÿ¯ª*ƒd[»åýê³9”ì&FCUЊ,aÀo5%â_«„Ë*¬,H*^6ÚUù0Håwr5[ä׃Tù…µ.#Îfy†þsØŸNþ{›K´z\]¦!Çó˜´¹&|®WÅ×××뀺£‘m"g¹Q͜ϕà¯JQfµ¤øº$Ť±ÂIRu¸.h&ö TÇïñJ+ju“sµqñ¤Dl
_!Îd›ëKñ)FÞ§2êhÉh¶–A#‹æëëD;W%Ì9s\Q Ÿ¬› ÷ ½®x¶ðüzøVÖçORs°+s a!«+«¯Y‘J׉@Sܲ@Y~Êx:ÌnLAPÊ4iQÓm_h5œ¸ocH»þ9癲E+í¶A¥}dM+ÁJ噇¢È
¿?aU<Ú2îU†Šçd)SVS”õJR†y¾
j²Ô 9')J¬Ôî•C¥p4Tdú쵑M´ñ&í-¿\ž¤ôÊ<dægkÒ1Ã-y€Ó^dBõT¼ž_(Ç„ÏbJä´©zùvmòC¨*ÕW—ÉÉ„CJöÉú »GùÔd£/Ê1)ÜLŒ·MâþOÆ,Jʤ³Û.Þˆ•¿DPP1ŒÈ8¹íbiMA¦…éÆÏŸÖêX^™.Î@:ÁPh:ƒ³;07 -t„Û¨A!!’M-éHŽN×Ë•»bÖÊ:/z=6CeÚ%]$(¡Cg]Tkdô(ë&!•eÝ@†\1 r²(³J©4Lü:ˆ‹æw ÖƒÞê3Ø®M]Êí~›zÑ*ƒQ3C -fÀP2Îf
R1¯5%æ¨{-”-`þÍr¶Ž:–ÄÛ̹,«4‹ì·–Sƒ—\5Ú¢Þ«ªŸ53Ú±K]‚’ɸ½›ŠJ1WÕ;ŵ²-”ê¶uû©ÔÐòX‰OÐîrÉ\ó‹¬[^$ ÷FcY+ÈÈN'NÁd¢·ŒÍrÆ„(i±Gƒ œ_ðÍPhÓÓÍÕî絟ÁˆúbÜøœ&Ý -Ùšò|ñ˜AY/ŽÚÍ@ÆÚ1‚2«›Ð£c®sT&xÓ±w’º¿àÚ§qÖ>¨Ûžk“Añ¤“¥E&=Ú{Ó/Ã,äv!ƒájÛJU{6Êó± l/µÔÔ>Œ{yol”-t•æÚñÒX(»×7ݾ×Ó:ôs»öx9z½w -Jßj^¨¿Ùî,½f(a©<ú8}(ìÏÝÙ)Š¦¡Ý”ÛìèÂm²¼ÚO¨º]J’½–oõöÇ"ƒè£m×G0¯Å$ÓÈ"·©Ý"\ˆPÜWo‘Ÿ-³BT=ÎPaCæy‡£ÂzíPã[‘3vÐR3ØG²¶tFa¯)\Rè¦Gñ3²A&í„7ÉâŒP²oŽe€YÃ[úöXž±aѼՄÅ[cú€èÇÔ‹bAHß*‡ÎtÓÅ\¸º½|Ì4ßSŠ‹oS©³£jgóÑ}z“j§LMì2J‘$‰Æc)횬Ž—»ÑÝçÀTž”s4‡³?ΈL\ -endstream +797 0 obj +<< /D [ 745 0 R /XYZ 79.822 115.28 null ] >> endobj 798 0 obj -<< /Type /Page /Contents 799 0 R /Resources 797 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 745 0 R /XYZ 79.822 104.321 null ] >> endobj -800 0 obj -<< /D [ 798 0 R /XYZ 78.37 808.885 null ] >> +799 0 obj +<< /D [ 745 0 R /XYZ 79.822 93.362 null ] >> endobj -801 0 obj -<< /D [ 798 0 R /XYZ 79.822 768.829 null ] >> +800 0 obj +<< /D [ 745 0 R /XYZ 79.822 82.403 null ] >> endobj -802 0 obj -<< /D [ 798 0 R /XYZ 79.822 757.87 null ] >> +744 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> endobj 803 0 obj -<< /D [ 798 0 R /XYZ 79.822 746.912 null ] >> +<< /Filter /FlateDecode /Length 2591 >> +stream +xÚÍ[Én$9½û+òJ%‘ÔNGsömÐמÓüÿu´¯áÌP–]S‡,GÅòD‘7QüòŸ¿üõÄó_&ý•û÷¯§íãéç.í…˜5áòñÏ“p/ñ‹¸ÉÀÈ‹V‚q%.ÿ½üû™s´œKpÍËßÿ*˜?wìRhZ«™3‚ +ÎÆ#)ÑP·wS‘<UE½£_ËÛB±n[·Ÿr
-í€eÿí.¥š_`Ýr’€HŒ‹Å,dHF'LA'¢·êŒõrÄ„€Œ‹É,wh(ç¾£ö“±åéf¶ûyígZD}1n~O
Ý +endstream +endobj +802 0 obj +<< /Type /Page /Contents 803 0 R /Resources 801 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 804 0 obj -<< /D [ 798 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 802 0 R /XYZ 78.37 808.885 null ] >> endobj 805 0 obj -<< /D [ 798 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 802 0 R /XYZ 79.822 768.829 null ] >> endobj 806 0 obj -<< /D [ 798 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 802 0 R /XYZ 79.822 757.87 null ] >> endobj 807 0 obj -<< /D [ 798 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 802 0 R /XYZ 79.822 746.912 null ] >> endobj 808 0 obj -<< /D [ 798 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 802 0 R /XYZ 79.822 735.953 null ] >> endobj 809 0 obj -<< /D [ 798 0 R /XYZ 79.822 652.509 null ] >> +<< /D [ 802 0 R /XYZ 79.822 724.994 null ] >> endobj 810 0 obj -<< /D [ 798 0 R /XYZ 79.822 641.55 null ] >> +<< /D [ 802 0 R /XYZ 79.822 714.035 null ] >> endobj 811 0 obj -<< /D [ 798 0 R /XYZ 79.822 630.591 null ] >> +<< /D [ 802 0 R /XYZ 79.822 703.076 null ] >> endobj 812 0 obj -<< /D [ 798 0 R /XYZ 79.822 619.632 null ] >> +<< /D [ 802 0 R /XYZ 79.822 692.117 null ] >> endobj 813 0 obj -<< /D [ 798 0 R /XYZ 79.822 608.673 null ] >> +<< /D [ 802 0 R /XYZ 79.822 681.158 null ] >> endobj 814 0 obj -<< /D [ 798 0 R /XYZ 79.822 597.714 null ] >> +<< /D [ 802 0 R /XYZ 79.822 641.55 null ] >> endobj 815 0 obj -<< /D [ 798 0 R /XYZ 79.822 586.756 null ] >> +<< /D [ 802 0 R /XYZ 79.822 630.591 null ] >> endobj 816 0 obj -<< /D [ 798 0 R /XYZ 79.822 575.797 null ] >> +<< /D [ 802 0 R /XYZ 79.822 619.632 null ] >> endobj 817 0 obj -<< /D [ 798 0 R /XYZ 79.822 564.838 null ] >> +<< /D [ 802 0 R /XYZ 79.822 608.673 null ] >> endobj 818 0 obj -<< /D [ 798 0 R /XYZ 79.822 553.879 null ] >> +<< /D [ 802 0 R /XYZ 79.822 597.714 null ] >> endobj 819 0 obj -<< /D [ 798 0 R /XYZ 79.822 542.92 null ] >> +<< /D [ 802 0 R /XYZ 79.822 586.756 null ] >> endobj 820 0 obj -<< /D [ 798 0 R /XYZ 79.822 531.961 null ] >> +<< /D [ 802 0 R /XYZ 79.822 575.797 null ] >> endobj 821 0 obj -<< /D [ 798 0 R /XYZ 79.822 521.002 null ] >> +<< /D [ 802 0 R /XYZ 79.822 564.838 null ] >> endobj 822 0 obj -<< /D [ 798 0 R /XYZ 79.822 510.043 null ] >> +<< /D [ 802 0 R /XYZ 79.822 553.879 null ] >> endobj 823 0 obj -<< /D [ 798 0 R /XYZ 79.822 499.084 null ] >> +<< /D [ 802 0 R /XYZ 79.822 542.92 null ] >> endobj 824 0 obj -<< /D [ 798 0 R /XYZ 79.822 488.125 null ] >> +<< /D [ 802 0 R /XYZ 79.822 531.961 null ] >> endobj 825 0 obj -<< /D [ 798 0 R /XYZ 79.822 477.166 null ] >> +<< /D [ 802 0 R /XYZ 79.822 521.002 null ] >> endobj 826 0 obj -<< /D [ 798 0 R /XYZ 79.822 466.208 null ] >> +<< /D [ 802 0 R /XYZ 79.822 510.043 null ] >> endobj 827 0 obj -<< /D [ 798 0 R /XYZ 79.822 455.249 null ] >> +<< /D [ 802 0 R /XYZ 79.822 499.084 null ] >> endobj 828 0 obj -<< /D [ 798 0 R /XYZ 79.822 444.29 null ] >> +<< /D [ 802 0 R /XYZ 79.822 488.125 null ] >> endobj 829 0 obj -<< /D [ 798 0 R /XYZ 79.822 433.331 null ] >> +<< /D [ 802 0 R /XYZ 79.822 477.166 null ] >> endobj 830 0 obj -<< /D [ 798 0 R /XYZ 79.822 422.372 null ] >> +<< /D [ 802 0 R /XYZ 79.822 466.208 null ] >> endobj 831 0 obj -<< /D [ 798 0 R /XYZ 79.822 411.413 null ] >> +<< /D [ 802 0 R /XYZ 79.822 455.249 null ] >> endobj 832 0 obj -<< /D [ 798 0 R /XYZ 79.822 400.454 null ] >> +<< /D [ 802 0 R /XYZ 79.822 444.29 null ] >> endobj 833 0 obj -<< /D [ 798 0 R /XYZ 79.822 389.495 null ] >> +<< /D [ 802 0 R /XYZ 79.822 433.331 null ] >> endobj 834 0 obj -<< /D [ 798 0 R /XYZ 79.822 378.536 null ] >> +<< /D [ 802 0 R /XYZ 79.822 422.372 null ] >> endobj 835 0 obj -<< /D [ 798 0 R /XYZ 79.822 352.755 null ] >> +<< /D [ 802 0 R /XYZ 79.822 411.413 null ] >> endobj 836 0 obj -<< /D [ 798 0 R /XYZ 79.822 341.796 null ] >> +<< /D [ 802 0 R /XYZ 79.822 400.454 null ] >> endobj 837 0 obj -<< /D [ 798 0 R /XYZ 79.822 330.837 null ] >> +<< /D [ 802 0 R /XYZ 79.822 389.495 null ] >> endobj 838 0 obj -<< /D [ 798 0 R /XYZ 79.822 319.878 null ] >> +<< /D [ 802 0 R /XYZ 79.822 378.536 null ] >> endobj 839 0 obj -<< /D [ 798 0 R /XYZ 79.822 308.919 null ] >> +<< /D [ 802 0 R /XYZ 79.822 367.577 null ] >> endobj 840 0 obj -<< /D [ 798 0 R /XYZ 79.822 297.96 null ] >> +<< /D [ 802 0 R /XYZ 79.822 341.796 null ] >> endobj 841 0 obj -<< /D [ 798 0 R /XYZ 79.822 287.001 null ] >> +<< /D [ 802 0 R /XYZ 79.822 330.837 null ] >> endobj 842 0 obj -<< /D [ 798 0 R /XYZ 79.822 276.042 null ] >> +<< /D [ 802 0 R /XYZ 79.822 319.878 null ] >> endobj 843 0 obj -<< /D [ 798 0 R /XYZ 79.822 265.083 null ] >> +<< /D [ 802 0 R /XYZ 79.822 308.919 null ] >> endobj 844 0 obj -<< /D [ 798 0 R /XYZ 79.822 254.125 null ] >> +<< /D [ 802 0 R /XYZ 79.822 297.96 null ] >> endobj 845 0 obj -<< /D [ 798 0 R /XYZ 79.822 243.166 null ] >> +<< /D [ 802 0 R /XYZ 79.822 287.001 null ] >> endobj 846 0 obj -<< /D [ 798 0 R /XYZ 79.822 232.207 null ] >> +<< /D [ 802 0 R /XYZ 79.822 276.042 null ] >> endobj 847 0 obj -<< /D [ 798 0 R /XYZ 79.822 221.248 null ] >> +<< /D [ 802 0 R /XYZ 79.822 265.083 null ] >> endobj 848 0 obj -<< /D [ 798 0 R /XYZ 79.822 210.289 null ] >> +<< /D [ 802 0 R /XYZ 79.822 254.125 null ] >> endobj 849 0 obj -<< /D [ 798 0 R /XYZ 79.822 199.33 null ] >> +<< /D [ 802 0 R /XYZ 79.822 243.166 null ] >> endobj 850 0 obj -<< /D [ 798 0 R /XYZ 79.822 174.033 null ] >> +<< /D [ 802 0 R /XYZ 79.822 232.207 null ] >> endobj 851 0 obj -<< /D [ 798 0 R /XYZ 79.822 163.075 null ] >> +<< /D [ 802 0 R /XYZ 79.822 221.248 null ] >> endobj 852 0 obj -<< /D [ 798 0 R /XYZ 79.822 152.116 null ] >> +<< /D [ 802 0 R /XYZ 79.822 210.289 null ] >> endobj 853 0 obj -<< /D [ 798 0 R /XYZ 79.822 100.552 null ] >> +<< /D [ 802 0 R /XYZ 79.822 199.33 null ] >> endobj 854 0 obj -<< /D [ 798 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 802 0 R /XYZ 79.822 188.371 null ] >> endobj 855 0 obj -<< /D [ 798 0 R /XYZ 79.822 78.635 null ] >> +<< /D [ 802 0 R /XYZ 79.822 163.075 null ] >> endobj -797 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F98 344 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -858 0 obj -<< /Filter /FlateDecode /Length 2418 >> -stream -xÚÍ[Ënë6Ýç+üá‡Ãˆâ¸@×Ùݶ«þÿ¶¾De[tú¸'Ž#çy†/§?OËé——¥üšÞ…Ÿ¿¼¬_/?®ÚŸPx'œ¾þx‘á¢å$ONpúd‹‘§¯¿N¿½-‹òËbtxáù÷¯_+櫃“ÞåZ‰Z,‹ä(€á^Ã>Âk=¿jÐô_SÞ™Ïð—L¯ø~]Þ£K¯xoøÌTŸå.¼†« ¢l»ýe“Ü)@/B.À Ôœz±}qgÅR^HT\,üœ«G!»D}’®U¸à#ý&ÙŠtNŸE»]Óuô>ê):&«`°.\«ÖÜb7e‹ÝÒZa‰ºý›Ù¶Á¥û‘p×,ÛqìYÕƒÒa§ú ˆõÇTFHå Ç”V -Jú‹[±w=ƒ£µÔù5~˜6_.¥å•àÝ)üÇëÆ%éΘð–ì—d’äƒe[Ã_=ÐÕфȦ˜òý®¨B5ªH%¬·ä:–|µš!áZõ’0Ö÷ÚŒ*HB'ëZ¼c]ã„ÑØy·«qBµùd¯Þ-è3ãïz•´Jh9¬LjElÕ”§”zkV´›^p-W¥ÿG¾p)wpu§O;u§:zrŸF”¿J`Ñ+|lEHÕ%®Ùåáá}˜®ˆ…67³ÇûsI*šÍ€ÚŠ¿xT~.ö(ÕG.YûÙ?H 63<²gx´Yl<;ÞC¹ê½ÍÙšvô1›{ÍVôùï’dºÌ'àiC¯†1R7´ç•²&‚ð¾9̉¼a‰|Œå¼÷ä.õºÆ1ɽҵ56`ï:ràt]õô¨Ü”~ï%R@ ˆ\tFâ°
¼¬ÞjªìÏæRã瞪‚œÂ¹aÅbD¸/¯’F8o÷äm]'Ê{Ù\€¢«–ÎûP[| ³¤sÎÕ¨˜"''èå\3
xÝä”l Ò⬙ñdmh;Ž’“\;›2çS¡ÃÚ‚•ªHÇ4„Y¬is€âÚ8b¼çP)N`ÛböF)N%»§ëF¡ÚÎ"ÝÑ#÷w˜·¾PÛÜ!R‰¬˜»·²ºiÍbJ,Z¼®Êw–¦:¯ín‚áµiŠ†¹´rv±ïÚ¨uà\À
y<ﺵ–JHe7™//°ˆÅÁP^Ü\yéQb£§’ŠË@¡ÑKQŸ-ÅoýA63E‘ëèï¡ÙiMoeµZL.
-ûäRY±…Ï{yiw…Yó,¡ã5ô?ú˜yŒNIŽ2ß5jº_3ôÐG•]PnzI¶iô†ý6kÇ6-Kûl¥]èÍ—¡µ>zôä *ò„©lhÍq蘞4y‹PbƒÝdq;•Q™s5¼±1UÌuëF—[u[œÞ¤¡ß®Ý¤R‡Ït`‘ç(Oè:¤?ž‹qðL'x®ðr”¨k»9bÔÜ¥¡€™K“s[WO -t)FcŠ©Œ¶ÎénºÙºéÒ?ù‡%f®Kúœ\Cˆ
\…j2‚z”'ÄÞ„^
b¸©œÙƒÌKÞpð'=#™Ï&èœÐVRàTæf(;ýYQFšÁljÊ{Ê“ÇÛ5ªíÄ|â˜ÿÛ1ĬJF%í`Ý®*íQœÌˆH-ïÊ~’R´GùÙ¨" -‹|GKz1CòD*PJX'¹“%š¡üûÄ„Ä~Ÿ»Gùo©E ÂÅ·p´.fjÁP~BjqÙ²f}JÇ2ç¿MAÂRÑÞ\Õn.Ôz”y1”ó£œvªø3'¤°Ü™AŠ¹›¡ÄûºÎåÕl«N+Â8ô7xÅTÍ@úøã•ÆBsúôñD…"ÐúÄ%”ë†,ÖçcEi+‚\+G»ú|ÄP=QMŸ—ØVy–ÏÑ›÷í#=Äüˆ\=s\©”ì:?—”m瞆1ÈI/nÁf¡×íÉ£®ßÁÜ]w•Å<:ìQÄìQŽŸ—í
Ü´ÑüÜ>"IAwh=…±Ñ‡‘qì<º›Åw}dVøäXC¡-Úec‡ÍC/³‚ƒw]ëYŸpa(Gš¾yvÎvýiõè“蜃Ê<7Zi1ÜT¥d(·:Nõ¾e«H.sÔj«}©¢NoÃè®ß+†Ÿ¢Dë®zqÒÌF8÷k]—'ÖýÝß`€5úÿùÞºÖØyw !Ò6EÏ8çµ=Ê|‚Tm[YœVÍIѤ‹µ¹?¿Ê·ï5ø k;³”GYFIF=JÍ¢°(ÈÃ2C±X9qJ
É7¶²kIi†¦ C‰]ü#é?ô¼m»™Å›$ -åç# -;3Æÿ1AÞwÍfVô$A`(Qmm?LvÜ8®¸¤î#ÏÃÞ'à’v°=l'£.FgÔšÞ}½;¬ Q -Oûë×êMGF+‡ˆ›Ê| γA·™;¼T’Íö³Mã½Åî´1t“~> Ø#”Í”Ž’Æд’Ñ J^996–Âw¹aan0Bð¹‚mŸê…¤ÅîIoqé9êÈPEëwÏ©”µOn³Ð“ãŒe/ËÚTµ{3¢kèžöÑÝÔ?C9ÔƒÓ—Œ¶{óÛyÜ´’ªêf—½aÕ2—^f›pÛ÷:qþ0ÈnÍö#QØíë5ã~*)ÂuœîÆ}ð=#Üš6îu©öÃõð#„Mk䛎œûcê×jì@Tþ}_Ùǵ•C!qP;ôšŽ„…xèÀZŽö.Ò¼™¡p…Àgn>n4ÊyœÅv¯0ß8°óÄGºS_:êAæ[eG¬U ë`Ó¡´ÐÎ0¨—÷ùo~j¸ GûŠ,HÂs~d -endstream +856 0 obj +<< /D [ 802 0 R /XYZ 79.822 152.116 null ] >> endobj 857 0 obj -<< /Type /Page /Contents 858 0 R /Resources 856 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 802 0 R /XYZ 79.822 141.157 null ] >> endobj -859 0 obj -<< /D [ 857 0 R /XYZ 78.37 808.885 null ] >> +858 0 obj +<< /D [ 802 0 R /XYZ 79.822 89.593 null ] >> endobj -860 0 obj -<< /D [ 857 0 R /XYZ 79.822 768.829 null ] >> +859 0 obj +<< /D [ 802 0 R /XYZ 79.822 78.635 null ] >> endobj -861 0 obj -<< /D [ 857 0 R /XYZ 79.822 757.87 null ] >> +801 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F98 345 0 R >> /ProcSet [ /PDF /Text ] >> endobj 862 0 obj -<< /D [ 857 0 R /XYZ 79.822 746.912 null ] >> +<< /Filter /FlateDecode /Length 2421 >> +stream +xÚÍ[Én#9½û+ôÅ"ƒÁ
08V}ö1×™Óüÿµ¹'LɤÜKT’¥ÌÇ`¬/˜Qüò¿¿üöÂË;Sá“ÿ÷·—íóåçM¹2g…„Ëç_„¿ˆ_ÄÅ*V]ŒŒkqùüÿåWÎ¥ã\#çÆ]ÿóù{Åüy³p±Ìi-m"¤bÊjŠ6þõ‘ÞeøìÒßÊÿ®¹é»ð[¼¾|¾ù×;çøž®Å=IÓìì«m)κ-sÛBÅ8%lKïÇv‚ˆ°](PáW]>…-‚H¯øyK[E›^ívõG¹oQ¾‚æ±Íñ—YV€tL ¤ +ÐÛšz” bû*ê\,±ÞÖÄêQª»]KÁ{úu²UÐyø.Úív¸dÔ?/:VÁ=8_Õzƒ[ì&ÍáÆaàÆe= ÷°‰mÜp?Ü-Ë6½ªza€¢ª—“‘š å ÇäšÖƒvÍz{‹bh§˜äfpD5'†B†BS”`Ø`ÈšÛöœë>Z÷ +Á½,®E&Ñ
â⚸=Jsn +bÃâçþ³Kßóäw˜sWðË!OéºõîSÔAáΊ:µB‡¼§«MŽk„ò]ÔÄÏ›Pç5 +òÒé +‹æQÎ7üº;6rþ”JKf¥ (ëM£²¾ù嚊1{ªäé"à€r×K²MËAØI—ub›–¥ýK¶2¾5GC•4{òdÁ* +ò„©tx·ƒ“MΗI3 Äþþv(Èàx¾YÌÕðÆÆT1×m]nÕmpy“>ïHpt““G:ÀCë(ʺFÉä`ðÉï¸Ìq$ QÓæpè·½?1Ö™@[Ûÿ¡=B!QkR÷(€móx˜\‰žÈÇS=yœuäFcuà
¨`ØÂÜ¡øš)…£(Ð¥¹)¦28:§‡éæè¦Kÿä¾,1k]úÓÇäÞ0|W®EP².:Ç”êÛ,ýH9“€<!…µL™î„?æ«l–¢YÏ&hÓBS)f‹lÎÜe²Ó_Uk¦•¥¢N–ºâ=åÉc†÷ãÙvb.qÌíbU¥¡_pnPéÛšJ{”‰3™A*áìs”âŸÈ¯F,PJf¬öh׬У<‘ + +"c‡ª;YûK¬”'Ä0Ýe7œM¸ÕâO@žB[æo£R,vØ%vØ·ãDp-³~ç¬åXuYÊ0¿UÄZM@úø£µÆtƒ7OÔ˜!£ål,íŒÅöXAÍšž(åm騙z"¥hÛ¼D¶Ê#°|Œ.éƒØü´¯(hŸè!æäò™ÓJ¯Æ®ñËz˜¥ ù´’ @Îyq&½Írù–ÜuÍUÓ®‰Ù£Ì—Û´Áü% ¸0:’„îÌz #ƒ#á8yr·àl×F–øXj!(a‹†dCá°ùaäeYpkºÎ³¾6ÞBPfz¾urÆwkb¨P³¢s"(ëÔ´êZÏ,Æì‰A.”å^Ã)ߎl¹e.ƒJ¥/ÔåmxÓµí^˜-€UÖA@”êŠåÌd€ó¼Ôuyb;ßýX£ÿ¯ok‰]w”mÏšÕ<K«ŠÓv O¤' ]W™¥˜å4EŠ%åX¬½ýõ‡xý^ º®³ˆù¶–Œz”šEáàOge†b±QÞ”ú‘olÉ÷”mGš·´HJlâà¯Hÿ¹®Û,â‚òë…“ 㘠k»^³¸öA (Qmm?vÜ9ØSó‘§a3pa°} Ø,&F]Œ4Ž¨5ûöpVA `.ì¯_«7]0Z9Cü²{ž‘xâL1ô¹Ã½’l²Ÿcoì-Ng¡ôÛé `Pæ3S:JCÝJæTòjÍÄÉÜT +Ýå…¹ÁðÁg¶yª +e¡}Ð[\z:”¯¢õ»GÈBA÷à¶$¼µiF‚r‡å¿´©ê$öVD÷A"
•|–wæñýdª"éÛ³áí<kZ)Uu²ýlRµÌ¤—AÅ&Ææ½N›'²S“ýð@¦äýýTJ8ë8 +Ü.Œû {F¸7j܇é R3é‡Ûô„#øM+¤›ŽŒûýèWrì?d~¬ì/gµ¥E&pP{ Yéµ.°ÐŽ²Ú6۸͌2„ª>rãq§)XPÍ×ìô +ý³:ø¯¢ +šm9ò7êAÖÛd«¦BÌvå7v Q/´¸7ìûS¥/È™35uE zÆõñùò'/ +endstream +endobj +861 0 obj +<< /Type /Page /Contents 862 0 R /Resources 860 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 863 0 obj -<< /D [ 857 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 861 0 R /XYZ 78.37 808.885 null ] >> endobj 864 0 obj -<< /D [ 857 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 861 0 R /XYZ 79.822 768.829 null ] >> endobj 865 0 obj -<< /D [ 857 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 861 0 R /XYZ 79.822 757.87 null ] >> endobj 866 0 obj -<< /D [ 857 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 861 0 R /XYZ 79.822 746.912 null ] >> endobj 867 0 obj -<< /D [ 857 0 R /XYZ 79.822 665.463 null ] >> +<< /D [ 861 0 R /XYZ 79.822 735.953 null ] >> endobj 868 0 obj -<< /D [ 857 0 R /XYZ 79.822 627.851 null ] >> +<< /D [ 861 0 R /XYZ 79.822 724.994 null ] >> endobj 869 0 obj -<< /D [ 857 0 R /XYZ 79.822 616.892 null ] >> +<< /D [ 861 0 R /XYZ 79.822 714.035 null ] >> endobj 870 0 obj -<< /D [ 857 0 R /XYZ 79.822 605.933 null ] >> +<< /D [ 861 0 R /XYZ 79.822 703.076 null ] >> endobj 871 0 obj -<< /D [ 857 0 R /XYZ 79.822 594.974 null ] >> +<< /D [ 861 0 R /XYZ 79.822 692.117 null ] >> endobj 872 0 obj -<< /D [ 857 0 R /XYZ 79.822 584.015 null ] >> +<< /D [ 861 0 R /XYZ 79.822 654.504 null ] >> endobj 873 0 obj -<< /D [ 857 0 R /XYZ 79.822 573.056 null ] >> +<< /D [ 861 0 R /XYZ 79.822 616.892 null ] >> endobj 874 0 obj -<< /D [ 857 0 R /XYZ 79.822 562.097 null ] >> +<< /D [ 861 0 R /XYZ 79.822 605.933 null ] >> endobj 875 0 obj -<< /D [ 857 0 R /XYZ 79.822 551.138 null ] >> +<< /D [ 861 0 R /XYZ 79.822 594.974 null ] >> endobj 876 0 obj -<< /D [ 857 0 R /XYZ 79.822 540.179 null ] >> +<< /D [ 861 0 R /XYZ 79.822 584.015 null ] >> endobj 877 0 obj -<< /D [ 857 0 R /XYZ 79.822 529.221 null ] >> +<< /D [ 861 0 R /XYZ 79.822 573.056 null ] >> endobj 878 0 obj -<< /D [ 857 0 R /XYZ 79.822 518.262 null ] >> +<< /D [ 861 0 R /XYZ 79.822 562.097 null ] >> endobj 879 0 obj -<< /D [ 857 0 R /XYZ 79.822 507.303 null ] >> +<< /D [ 861 0 R /XYZ 79.822 551.138 null ] >> endobj 880 0 obj -<< /D [ 857 0 R /XYZ 79.822 496.344 null ] >> +<< /D [ 861 0 R /XYZ 79.822 540.179 null ] >> endobj 881 0 obj -<< /D [ 857 0 R /XYZ 79.822 485.385 null ] >> +<< /D [ 861 0 R /XYZ 79.822 529.221 null ] >> endobj 882 0 obj -<< /D [ 857 0 R /XYZ 79.822 474.426 null ] >> +<< /D [ 861 0 R /XYZ 79.822 518.262 null ] >> endobj 883 0 obj -<< /D [ 857 0 R /XYZ 79.822 463.467 null ] >> +<< /D [ 861 0 R /XYZ 79.822 507.303 null ] >> endobj 884 0 obj -<< /D [ 857 0 R /XYZ 79.822 452.508 null ] >> +<< /D [ 861 0 R /XYZ 79.822 496.344 null ] >> endobj 885 0 obj -<< /D [ 857 0 R /XYZ 79.822 441.549 null ] >> +<< /D [ 861 0 R /XYZ 79.822 485.385 null ] >> endobj 886 0 obj -<< /D [ 857 0 R /XYZ 79.822 430.59 null ] >> +<< /D [ 861 0 R /XYZ 79.822 474.426 null ] >> endobj 887 0 obj -<< /D [ 857 0 R /XYZ 79.822 419.632 null ] >> +<< /D [ 861 0 R /XYZ 79.822 463.467 null ] >> endobj 888 0 obj -<< /D [ 857 0 R /XYZ 79.822 408.673 null ] >> +<< /D [ 861 0 R /XYZ 79.822 452.508 null ] >> endobj 889 0 obj -<< /D [ 857 0 R /XYZ 79.822 397.714 null ] >> +<< /D [ 861 0 R /XYZ 79.822 441.549 null ] >> endobj 890 0 obj -<< /D [ 857 0 R /XYZ 79.822 386.755 null ] >> +<< /D [ 861 0 R /XYZ 79.822 430.59 null ] >> endobj 891 0 obj -<< /D [ 857 0 R /XYZ 79.822 375.796 null ] >> +<< /D [ 861 0 R /XYZ 79.822 419.632 null ] >> endobj 892 0 obj -<< /D [ 857 0 R /XYZ 79.822 364.837 null ] >> +<< /D [ 861 0 R /XYZ 79.822 408.673 null ] >> endobj 893 0 obj -<< /D [ 857 0 R /XYZ 79.822 339.18 null ] >> +<< /D [ 861 0 R /XYZ 79.822 397.714 null ] >> endobj 894 0 obj -<< /D [ 857 0 R /XYZ 79.822 328.221 null ] >> +<< /D [ 861 0 R /XYZ 79.822 386.755 null ] >> endobj 895 0 obj -<< /D [ 857 0 R /XYZ 79.822 317.262 null ] >> +<< /D [ 861 0 R /XYZ 79.822 375.796 null ] >> endobj 896 0 obj -<< /D [ 857 0 R /XYZ 79.822 306.303 null ] >> +<< /D [ 861 0 R /XYZ 79.822 364.837 null ] >> endobj 897 0 obj -<< /D [ 857 0 R /XYZ 79.822 295.344 null ] >> +<< /D [ 861 0 R /XYZ 79.822 353.878 null ] >> endobj 898 0 obj -<< /D [ 857 0 R /XYZ 79.822 284.385 null ] >> +<< /D [ 861 0 R /XYZ 79.822 328.221 null ] >> endobj 899 0 obj -<< /D [ 857 0 R /XYZ 79.822 273.426 null ] >> +<< /D [ 861 0 R /XYZ 79.822 317.262 null ] >> endobj 900 0 obj -<< /D [ 857 0 R /XYZ 79.822 262.467 null ] >> +<< /D [ 861 0 R /XYZ 79.822 306.303 null ] >> endobj 901 0 obj -<< /D [ 857 0 R /XYZ 79.822 251.508 null ] >> +<< /D [ 861 0 R /XYZ 79.822 295.344 null ] >> endobj 902 0 obj -<< /D [ 857 0 R /XYZ 79.822 240.549 null ] >> +<< /D [ 861 0 R /XYZ 79.822 284.385 null ] >> endobj 903 0 obj -<< /D [ 857 0 R /XYZ 79.822 229.59 null ] >> +<< /D [ 861 0 R /XYZ 79.822 273.426 null ] >> endobj 904 0 obj -<< /D [ 857 0 R /XYZ 79.822 218.632 null ] >> +<< /D [ 861 0 R /XYZ 79.822 262.467 null ] >> endobj 905 0 obj -<< /D [ 857 0 R /XYZ 79.822 207.673 null ] >> +<< /D [ 861 0 R /XYZ 79.822 251.508 null ] >> endobj 906 0 obj -<< /D [ 857 0 R /XYZ 79.822 182.015 null ] >> +<< /D [ 861 0 R /XYZ 79.822 240.549 null ] >> endobj 907 0 obj -<< /D [ 857 0 R /XYZ 79.822 171.056 null ] >> +<< /D [ 861 0 R /XYZ 79.822 229.59 null ] >> endobj 908 0 obj -<< /D [ 857 0 R /XYZ 79.822 160.097 null ] >> +<< /D [ 861 0 R /XYZ 79.822 218.632 null ] >> endobj 909 0 obj -<< /D [ 857 0 R /XYZ 79.822 111.511 null ] >> +<< /D [ 861 0 R /XYZ 79.822 207.673 null ] >> endobj 910 0 obj -<< /D [ 857 0 R /XYZ 79.822 100.552 null ] >> +<< /D [ 861 0 R /XYZ 79.822 196.714 null ] >> endobj 911 0 obj -<< /D [ 857 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 861 0 R /XYZ 79.822 171.056 null ] >> endobj 912 0 obj -<< /D [ 857 0 R /XYZ 79.822 78.635 null ] >> -endobj -856 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 861 0 R /XYZ 79.822 160.097 null ] >> endobj -915 0 obj -<< /Filter /FlateDecode /Length 2323 >> -stream -xÚÍ[ËŽã:Ý×WäJ-Qo ( ©T.0ëÚ
f;³šÿß^=L=('e9}ÓYT'vìcêð"e5?üïÀ½qüd:~ÿþõvþ~ûuÕþ ˜wBÂáû¿o"\Äâà4§ÖÆ8|ÿÿðï#çÒqnÎœ[ÿñŸïÌ_WǼ1Òµ Bj¦¡( R@1œs-Âç%|†sæ+ü&ÃoWáS…ßà3?±ü'³5g‚5[ÃœÙ=J4Ûø`’˦ª€(>«éÒæ¡$“Ï˵‡˜‡‘?Õüp¤gBI:sÞ6¥Y°”¢€ùx× ÓÀê·áÈtG¶=’¼=—öH]»ß¾Ú#ÓéSûòŸå¬&N
äæÈëQE^³¢”£dùFß'9/‰Çñ{Ô\—k¾ùûŒ“ÎñE'ó–h:L9©=JòÖ¥+šçâ‹¢4T‘ÿpØIö.ÿ¥{ÏHÞ¥®)$-`[xÀÏÜ00f Àm# -X>ͱܣü–_U•àI(_r.ó”5¾âìq{«ÞÇ{lÿ˜"2n7»N0éõÀ®›c·GyÝ—U¢åLI3Dî\ïBP”®=¥…©Ë"Ó“w߈}liÏ”µ[s½AÙÈÖË*H9¦…¢m®· (·9YæS¿M®ÝÉQWsþ¤ÈfìÜAº´Lë¡tžl5ʃ9o%ýeµ -†õ¹ÎM÷ƽuƒºÿÄnc«A»Œ;O” N¶e‹/«°¸ñÃåg²ß (÷W È*Õòâ
÷è>m-ð#÷²-¼d–4¿nºï (¿‰íWU¨pÀ¬Ñ”³ÉÞƒ Ü]?mÞ´¤WÁâV§‰Q»Ù´‚9>Ì)“½AÙÉæË*Îpæú-u)Jçz‚r£ôÒúZ˜Xœ€??¯¶›Uå™sn`u®!(°ú²ê“aøà‡ëOÊ:OÁH[*\(À*ùÖ8ÁìÏW…ìò¹<¦Æ›¸ö?€e~H“KB7³´]i§v{ÃsÀ¬a»9–qÑï>ÑÓ
Ay€Õvã -endstream +913 0 obj +<< /D [ 861 0 R /XYZ 79.822 149.139 null ] >> endobj 914 0 obj -<< /Type /Page /Contents 915 0 R /Resources 913 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 861 0 R /XYZ 79.822 100.552 null ] >> endobj -916 0 obj -<< /D [ 914 0 R /XYZ 78.37 808.885 null ] >> +915 0 obj +<< /D [ 861 0 R /XYZ 79.822 89.593 null ] >> endobj -917 0 obj -<< /D [ 914 0 R /XYZ 79.822 768.829 null ] >> +916 0 obj +<< /D [ 861 0 R /XYZ 79.822 78.635 null ] >> endobj -918 0 obj -<< /D [ 914 0 R /XYZ 79.822 757.87 null ] >> +860 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> endobj 919 0 obj -<< /D [ 914 0 R /XYZ 79.822 746.912 null ] >> +<< /Filter /FlateDecode /Length 2312 >> +stream +xÚÍ[É’ã6½÷WøšC‚{•ËUv«=U9÷-•krÊÿ_Ã
\e·(O<>xl©¥'ðñ@
=üs ‡Ÿo¿‰ô¿Ü¿?ß._o?®Ò±†q8|ýýÆÜEôÀF0ò #T±Ã׿‡?”rC©º¸Ïùô××óÇÕÀÁ«75ã’H£zîÃâG}R*ݱ¢â±ÿ¥Úƒø¤ÊêïL–”0 +½ÉÜΙܢx“ù%š)½ÙK2Û™<šìÿ.’é;Ìæ–0Á³ÍœÙ-Š7[Yg’‰¦ +‡È>Šé\Ç¡“/éZˆCŒÃˆßb~8`3bŽÜ6!‰³´Guz— ÃÀʯáH5Gº>â´>bK}$®Íß>ë#ÕÉ“u÷Å`ù¬ž&i òÄy-J Ã+ê5à¥ì5 yžMrNñÇþ·×\‹wùÛˆÎѤ“yPE@©Aò|Nò-J˜¥Ë›—<Ya¨U¡zWñŸpïiÁ»„´„Œæ°5ìŸge%áT÷ˆÏm€"LC²Ã#¶1ãìFfçÌhQ +Óž3}[–~\™<X‡JÔhÚ®îD@’2(·Ó»³îW=[’@ýl”Ì/xuœÛÓ;˜#jÙÿ‰ãÅ*!¬¢x&(=Háîöf„ˆÅS„Áá*ü§Š£á·»J¡ÙÉÀ1Y¡m0;šÐ–ø$e3ªæG‹¼%úXü8µ&§xg¹§÷é£7—ãüh±6?,Ñš÷3”£Þùîì +a Èa~'sÂ2šç 6Aa šlÿàNF’¡ó"ÞðÂرÄÁ°´/q}ŒÙG|BpþpuE;‚U´`ÄÏÔX>›PRÑ=/Ïy¸ÁóÓ³£²^Š&Q
^m‚{kyº:¨Ùý†Åã¨äq\8 +ŒñåšÑžìj&y@`%ªGœ|¦0(Êø}Ú„Öó +°ÎsÿÊL»¼G²,¨ìÕœæð2•½6œõÖH1f?íUßkÅ_ Gœ‡=,HÏìRE@–²b'`!;Ñ7îsn…¿¢ˆüÔz½âYçÆqL +qî,Œ´Œ¥(¸2Ë ‰TPÏ2FWÿ$Œ†€ÑP™Úk•é-Rf×l$¿Ðµ‘!©h‰÷£’âˆû«ØGm§9×ÕcCåçµèZ[ÐûT@N¾f"à5!6Óü +¸°Ö¦³ó±¥&=þ]–ÉÙ0IÍâ8îX…9›8QA”Ð}â$a[âÄÑ~1lQBqI³|ÉOÐpʽ)jLhKÕœS\µž¶–ócéZ¥iÞPA¬Rçý ¶´œ(3d¶ê²m‚¨v-ô(›2X©
ÑBölX›£1Xâ”–›ƒÙ;ÖR‚vYÛŒ„þw)mƒdË½È +¶x·ŠÈÕZ1zÑJhÖjÅït¿êµM
K²•”!¦b¡3ø.„@œ’²õé4¦Tï%‡þ&÷29÷Zwi‘L-ùðJ-¸ÇU„1D1Ó»ÊÆ–kr•¤wHÉkZhηçmm![s=•¦¢Á{n!.ß-–[úP>ÙnG×ÒS]¡4QV=ÏS²îU•»ÁzÒÔeÛír¥”EëâG•„…F&õÒ¦&u©·Có’»õeÔ¼™Ò|òkÞë +µÇõKõB¥¨Ù»1o*,[¼aLZG+£jnøÄÌœ‚ eM¿äË©9mA0iF&J“¨ÝüÊIqÕwÎÅÞGÔE`§Ù³¨;Ø¢Ò¶÷kä*ed^U¥$À9é¢Ì,{LcøÀž˜J¶;”NZKé
fÁ›*pµy‘X' Ð/n‘±RYQ¤¤Ù@z@hÜR÷71>#´ä–ë徟®‚8<Á
g91”ÐnÓë¼}3$ɧCqCš5CYBÛM)n·o†¤š¾CA®°/Tº´¥?‹ÊÁ@àBì³fZ§¦ÝÊí#jÉ-¸Ø—[<bdšôešmikwÀ<Û“”å±í00j)íÜ䑸*C9—£õ2Κ±àLhÂÚÌÃs¶µ©œu(jŒ¬Á`Ûr¨L”ŽçÌ‚I-Ÿ¢Î½îf™+ÂÚÖQ`ù<Çr‡ò8Ë/«Jpß¼§‹O†Íħ¿¢J‡‚È®ýðCû÷9ÜjÐn™ Ù@¢™#±EÙÁâËjŒrÂ>)çøiQ|b]7m<ðYqôWôU|?ài‘o¯{Y„K1°,¦XîP~˯ªJ0Œp+¯ås|µ(k|ùÕãöÛz§w_þ6E~gÜnv5%‚ùøÖ² +~ÿ +¼fØnV¹#lÏêd-Ò¡<Àê˪4±º§i²<iAÖYr&ꜟ`› +–äö˜ŸØÿûƈ]\iN˜–WsåF²‘«ç®®y$ëï†ú%ÕAP·(–ŒlüÿæŸ_oÿªÀ}; +endstream +endobj +918 0 obj +<< /Type /Page /Contents 919 0 R /Resources 917 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 920 0 obj -<< /D [ 914 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 918 0 R /XYZ 78.37 808.885 null ] >> endobj 921 0 obj -<< /D [ 914 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 918 0 R /XYZ 79.822 768.829 null ] >> endobj 922 0 obj -<< /D [ 914 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 918 0 R /XYZ 79.822 757.87 null ] >> endobj 923 0 obj -<< /D [ 914 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 918 0 R /XYZ 79.822 746.912 null ] >> endobj 924 0 obj -<< /D [ 914 0 R /XYZ 79.822 623.375 null ] >> +<< /D [ 918 0 R /XYZ 79.822 735.953 null ] >> endobj 925 0 obj -<< /D [ 914 0 R /XYZ 79.822 612.416 null ] >> +<< /D [ 918 0 R /XYZ 79.822 724.994 null ] >> endobj 926 0 obj -<< /D [ 914 0 R /XYZ 79.822 574.558 null ] >> -endobj -142 0 obj -<< /D [ 914 0 R /XYZ 79.37 549.109 null ] >> +<< /D [ 918 0 R /XYZ 79.822 714.035 null ] >> endobj 927 0 obj -<< /D [ 914 0 R /XYZ 79.822 507.345 null ] >> +<< /D [ 918 0 R /XYZ 79.822 703.076 null ] >> endobj 928 0 obj -<< /D [ 914 0 R /XYZ 79.822 472.476 null ] >> +<< /D [ 918 0 R /XYZ 79.822 692.117 null ] >> endobj 929 0 obj -<< /D [ 914 0 R /XYZ 79.822 447.569 null ] >> +<< /D [ 918 0 R /XYZ 79.822 612.416 null ] >> endobj 930 0 obj -<< /D [ 914 0 R /XYZ 79.822 436.61 null ] >> +<< /D [ 918 0 R /XYZ 79.822 601.457 null ] >> endobj 931 0 obj -<< /D [ 914 0 R /XYZ 79.822 409.711 null ] >> +<< /D [ 918 0 R /XYZ 79.822 563.599 null ] >> +endobj +142 0 obj +<< /D [ 918 0 R /XYZ 79.37 538.15 null ] >> endobj 932 0 obj -<< /D [ 914 0 R /XYZ 79.822 398.752 null ] >> +<< /D [ 918 0 R /XYZ 79.822 496.386 null ] >> endobj 933 0 obj -<< /D [ 914 0 R /XYZ 79.822 387.793 null ] >> +<< /D [ 918 0 R /XYZ 79.822 461.517 null ] >> endobj 934 0 obj -<< /D [ 914 0 R /XYZ 79.822 376.834 null ] >> +<< /D [ 918 0 R /XYZ 79.822 436.61 null ] >> endobj 935 0 obj -<< /D [ 914 0 R /XYZ 79.822 365.875 null ] >> +<< /D [ 918 0 R /XYZ 79.822 425.651 null ] >> endobj 936 0 obj -<< /D [ 914 0 R /XYZ 79.822 354.917 null ] >> +<< /D [ 918 0 R /XYZ 79.822 398.752 null ] >> endobj 937 0 obj -<< /D [ 914 0 R /XYZ 79.822 343.958 null ] >> +<< /D [ 918 0 R /XYZ 79.822 387.793 null ] >> endobj 938 0 obj -<< /D [ 914 0 R /XYZ 79.822 332.999 null ] >> +<< /D [ 918 0 R /XYZ 79.822 376.834 null ] >> endobj 939 0 obj -<< /D [ 914 0 R /XYZ 79.822 322.04 null ] >> +<< /D [ 918 0 R /XYZ 79.822 365.875 null ] >> endobj 940 0 obj -<< /D [ 914 0 R /XYZ 79.822 311.081 null ] >> +<< /D [ 918 0 R /XYZ 79.822 354.917 null ] >> endobj 941 0 obj -<< /D [ 914 0 R /XYZ 79.822 300.122 null ] >> +<< /D [ 918 0 R /XYZ 79.822 343.958 null ] >> endobj 942 0 obj -<< /D [ 914 0 R /XYZ 79.822 289.163 null ] >> +<< /D [ 918 0 R /XYZ 79.822 332.999 null ] >> endobj 943 0 obj -<< /D [ 914 0 R /XYZ 79.822 278.204 null ] >> +<< /D [ 918 0 R /XYZ 79.822 322.04 null ] >> endobj 944 0 obj -<< /D [ 914 0 R /XYZ 79.822 267.245 null ] >> +<< /D [ 918 0 R /XYZ 79.822 311.081 null ] >> endobj 945 0 obj -<< /D [ 914 0 R /XYZ 79.822 256.286 null ] >> +<< /D [ 918 0 R /XYZ 79.822 300.122 null ] >> endobj 946 0 obj -<< /D [ 914 0 R /XYZ 79.822 245.327 null ] >> +<< /D [ 918 0 R /XYZ 79.822 289.163 null ] >> endobj 947 0 obj -<< /D [ 914 0 R /XYZ 79.822 234.369 null ] >> +<< /D [ 918 0 R /XYZ 79.822 278.204 null ] >> endobj 948 0 obj -<< /D [ 914 0 R /XYZ 79.822 223.41 null ] >> +<< /D [ 918 0 R /XYZ 79.822 267.245 null ] >> endobj 949 0 obj -<< /D [ 914 0 R /XYZ 79.822 212.451 null ] >> +<< /D [ 918 0 R /XYZ 79.822 256.286 null ] >> endobj 950 0 obj -<< /D [ 914 0 R /XYZ 79.822 201.492 null ] >> +<< /D [ 918 0 R /XYZ 79.822 245.327 null ] >> endobj 951 0 obj -<< /D [ 914 0 R /XYZ 79.822 190.533 null ] >> +<< /D [ 918 0 R /XYZ 79.822 234.369 null ] >> endobj 952 0 obj -<< /D [ 914 0 R /XYZ 79.822 179.574 null ] >> +<< /D [ 918 0 R /XYZ 79.822 223.41 null ] >> endobj 953 0 obj -<< /D [ 914 0 R /XYZ 79.822 168.615 null ] >> +<< /D [ 918 0 R /XYZ 79.822 212.451 null ] >> endobj 954 0 obj -<< /D [ 914 0 R /XYZ 79.822 157.656 null ] >> +<< /D [ 918 0 R /XYZ 79.822 201.492 null ] >> endobj 955 0 obj -<< /D [ 914 0 R /XYZ 79.822 146.697 null ] >> +<< /D [ 918 0 R /XYZ 79.822 190.533 null ] >> endobj 956 0 obj -<< /D [ 914 0 R /XYZ 79.822 135.738 null ] >> +<< /D [ 918 0 R /XYZ 79.822 179.574 null ] >> endobj 957 0 obj -<< /D [ 914 0 R /XYZ 79.822 124.78 null ] >> +<< /D [ 918 0 R /XYZ 79.822 168.615 null ] >> endobj 958 0 obj -<< /D [ 914 0 R /XYZ 79.822 113.821 null ] >> +<< /D [ 918 0 R /XYZ 79.822 157.656 null ] >> endobj 959 0 obj -<< /D [ 914 0 R /XYZ 79.822 102.862 null ] >> +<< /D [ 918 0 R /XYZ 79.822 146.697 null ] >> endobj 960 0 obj -<< /D [ 914 0 R /XYZ 79.822 91.903 null ] >> +<< /D [ 918 0 R /XYZ 79.822 135.738 null ] >> endobj 961 0 obj -<< /D [ 914 0 R /XYZ 79.822 80.944 null ] >> +<< /D [ 918 0 R /XYZ 79.822 124.78 null ] >> endobj -913 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -964 0 obj -<< /Filter /FlateDecode /Length 1732 >> -stream -xÚå[Ënë6Ýç+ôá%gø‚ -“ÞÅ¿¿žO?N&,Z¯–¿ŸT¼H.jñF€7‹³JH«–—?_¤D/¥5éøú×ÇgÌ'‹ÁZôk¥¬pÆQâë=¾ ¢…rToñ˜ÐO«÷ñL×Àë3Ä{â&žvrç’c|ÉòÞÊù_ÏA„…tÏû볓LÑí]¢®+Xí,¼Wr}¦•‘BI ZYÃÓj‹¢ßª1Ñ(Àj¬Œ$3U,¡¯@½${á0Úkt—ÞÔ¡°ª|v¶`u.˜U ƒP•4O¥-Ê
*=¬×€Êëa†!O-JÒ#{¨Æùñ\r•ä -*»I1B™/ôª‚Ó*+' -°v£W´Âž^[”=½àg1>·5Ö£ýF/Ü#4«¢
F tTE, Ê„ŠêeÖk:P}ì§ÏeWèjß«ŽdXøFo»BlZU‡GQòD݀ܡéÃúž¡QQ™áÊžNÖgHÎ’'C¿Íß(™iõŒÚÁ ¯/ (LõÖ³t¼Lá0y} -ë6Õ,"»' («Í=ª¾—ž©UÅu¾Ò'ÈM«Nyª.³W (wªû°žè´p–JÅlH´ÚéÖ£G¡Ê|Yåv™ií, -/Õ ¯= (<õÖ¯¯jÃì Jêͳ‡^Ùæá¯óQ»š!|ùŸÃ/Œp3ä¦ÕÕJxƒº¼ž Ü©îÃz"J@³”×C”õµ-Ǥ›ë‹
M“4‰Ó¿’Ù^j+×"E3ØrceV¨Ø#Ðe¼ó”8”AkõV®±ZmõVmî!Ó^ž*çkÜxµ}»¤^t¡S9Ÿ=Ì–Ïè:‹ô9MÂ6yS^fLRÇ–\ц©vcÓËYŒŒ ðihÇ¥qcu\t^OAö^×™ë`=àÿ·A×ÖÄ™²[o/Ïë˜oA¢\FP@Y0ËX‚’ƒwFYU ª•óæXý£æËõèXØ9wìX9hë¨Ö›ü]ï—= GËTö°c¢Ö(À •‰Y”&Óš>uÐL½®ØæƒSß1m¦§iÕL]'½;ÌEô`.¯è$(Ô+R?çsè"ɼµ—ìy]a4“³G™¶¨ÝÿŸîÉíý©ããêQ†”?ó½çö¾§&cK„R'¶„ ¢¡2kS‚rz‚÷)šJ -Üöf™&¯È#(ü"o–>† ôD™uAcwŒFyï9—IÊÞmü@™·pJQ>mè¦é:'tƒƒðÖ3 -ÿ‰¢iúÖ -32æzáD›¢lãÆ$Ic„ñçî<=éà{¥Ž \£Ùö ÏeMõvo<A…¤¦0ë ‚ÂÛÎœ¦Ž(¬Õ”:3Ç”Ûvÿ§)'Í@™—§ Ê.åÚ®µ^so™|Ò¥„Ó–šÀÌ“eÏ„ëë¨Óô¥Î»>/”¹•fM -í¼ø²jÄzÒ+“äÛ¦(‘Ð` -/OR”k# z!uî%u•Ôz¶ „2Žš€¼å"‚R~œ -endstream +962 0 obj +<< /D [ 918 0 R /XYZ 79.822 113.821 null ] >> endobj 963 0 obj -<< /Type /Page /Contents 964 0 R /Resources 962 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 918 0 R /XYZ 79.822 102.862 null ] >> endobj -965 0 obj -<< /D [ 963 0 R /XYZ 78.37 808.885 null ] >> +964 0 obj +<< /D [ 918 0 R /XYZ 79.822 91.903 null ] >> endobj -966 0 obj -<< /D [ 963 0 R /XYZ 79.822 768.829 null ] >> +965 0 obj +<< /D [ 918 0 R /XYZ 79.822 80.944 null ] >> endobj -967 0 obj -<< /D [ 963 0 R /XYZ 79.822 757.87 null ] >> +917 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> endobj 968 0 obj -<< /D [ 963 0 R /XYZ 79.822 746.912 null ] >> +<< /Filter /FlateDecode /Length 1714 >> +stream +xÚå[MÛ8½Ï¯ðV¢¾b€f’ØóÜ{Ý=íÿ¿V²¤È¢<™PY¤özâØÏOER®XþYÄòóEÔ#˜ôWü÷çËáãåÛÙ„ECðRáòñ÷‹Œ‰E.Þ +麌u‡V*€ÔªÓ*¬<zý^Œ‰F¡*ÆŠHÒ9óoûŒÀ¬JèAzMU2ÈS©G¹A¥§õé +Õæa™Û-d¦Õ3^ã ¯> (<õžÖ³´ïÕ0 y5AIµùªÁ¡e¶ëð—©]Y!|þÍ©F¸rÓê*‡¼˜Y3”;Õ}ZO”!JÐeÃúÄ®!JûÚæcÒ͵vCÕ$MâôS²sµ—ÚʵEˆ§¶ÜšÙ£+l‚‚:÷:%yÐj¾µæX5·z/6·i?Ÿ*—kÜxµ}ÿL½èBç|~õ0›¿+×X¤ïiÖÉ›VfÆ$u\Éuð]ŸJ~kÑ‹ƒ;A™ aM»ÅmÉupqž{‚±7ìºÌ[‡Ûáþß
¹Ñ€©Ø·fçuÈ{”(—†V€F
4xy,AYƒw‰F«®HuËçÍ©xHY/·ãcqçÜ©aAãTƵlܬÏ:~îk´Li;&j…€ASƒ—Ô*Ó–>uÑ•zéØ®;ç¶cZMO«šº]ôî0%(5,g̤“ P¯Hëøe=Ƕ!’ÌÛzÉž÷Ø
F5yõ(S›Úí÷tÏZÞŸ¾Ú¼ÊÖÏõÞKyß–&csŒ’g¶„R€rÃ*ÊÌM ʵì 34U ǘÏLò +?É›¦ï=hséN¤w]\`ç]OÍ1*å½÷\&);:J™Ù8%(_tÓt…ÖÖ®l™íÌ„ÿ>Ñ4ycÀx9°çµ Š6-D;ìãÆ$MÁ¢¢4™:‚rf݃¾$6e$äûÝñD)°vðf>APxÛ™ÓÔÁ 38o'(·íþOS–œ¶eÞ:MPv)—rÖš{mòI„ +jš¾6ôyë%E‘b«:•,“•(EæZIQ>¡XCßÚ^›§Œ„3eÞšHQ®PÖ®…µ;”– +âÃgà‡å +íµý²)ÄZÒ2“äÛ¦iÜ` +o¤(×F@¶DêRKê2*©õ\d ƒœH±úE¥´¾—ÔzÆ”sµ»\ˆÅç"µEbZjêéí5Z%º +ÿíUyõ½é2¦úõŠœz¾)üÞõÕ2-i®ÐÂø“Ùé.Ddõå³ÕæÙèûgoî·Z]wû†zªŠvyF ¼®>UžU^4å¶3Šñ¼®÷'RîòMeÕÕÚ}õNœò6ác|&ÌiMiÔŠšè°2™Çg×M“䨎×VíAø]UocÌ”3_éA>ï©\6ƒÚ¶ê–ª¯á¦fIÒSž,úG^(0EY[û&µý“óåôÙ4Ú7Íøµ¡_âò½/':ÒJª÷Tt Œ
îûTKÃ’>U½úÙ¨v$vì5ÖØEÿ=!þôñò¹>E$ +endstream +endobj +967 0 obj +<< /Type /Page /Contents 968 0 R /Resources 966 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 969 0 obj -<< /D [ 963 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 967 0 R /XYZ 78.37 808.885 null ] >> endobj 970 0 obj -<< /D [ 963 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 967 0 R /XYZ 79.822 768.829 null ] >> endobj 971 0 obj -<< /D [ 963 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 967 0 R /XYZ 79.822 757.87 null ] >> endobj 972 0 obj -<< /D [ 963 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 967 0 R /XYZ 79.822 746.912 null ] >> endobj 973 0 obj -<< /D [ 963 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 967 0 R /XYZ 79.822 735.953 null ] >> endobj 974 0 obj -<< /D [ 963 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 967 0 R /XYZ 79.822 724.994 null ] >> endobj 975 0 obj -<< /D [ 963 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 967 0 R /XYZ 79.822 714.035 null ] >> endobj 976 0 obj -<< /D [ 963 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 967 0 R /XYZ 79.822 703.076 null ] >> endobj 977 0 obj -<< /D [ 963 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 967 0 R /XYZ 79.822 692.117 null ] >> endobj 978 0 obj -<< /D [ 963 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 967 0 R /XYZ 79.822 681.158 null ] >> endobj 979 0 obj -<< /D [ 963 0 R /XYZ 79.822 626.364 null ] >> +<< /D [ 967 0 R /XYZ 79.822 670.199 null ] >> endobj 980 0 obj -<< /D [ 963 0 R /XYZ 79.822 615.405 null ] >> +<< /D [ 967 0 R /XYZ 79.822 659.24 null ] >> endobj 981 0 obj -<< /D [ 963 0 R /XYZ 79.822 604.446 null ] >> +<< /D [ 967 0 R /XYZ 79.822 648.281 null ] >> endobj 982 0 obj -<< /D [ 963 0 R /XYZ 79.822 593.487 null ] >> +<< /D [ 967 0 R /XYZ 79.822 637.322 null ] >> endobj 983 0 obj -<< /D [ 963 0 R /XYZ 79.822 582.528 null ] >> +<< /D [ 967 0 R /XYZ 79.822 626.364 null ] >> endobj 984 0 obj -<< /D [ 963 0 R /XYZ 79.822 571.569 null ] >> +<< /D [ 967 0 R /XYZ 79.822 615.405 null ] >> endobj 985 0 obj -<< /D [ 963 0 R /XYZ 79.822 560.61 null ] >> +<< /D [ 967 0 R /XYZ 79.822 604.446 null ] >> endobj 986 0 obj -<< /D [ 963 0 R /XYZ 79.822 549.651 null ] >> +<< /D [ 967 0 R /XYZ 79.822 593.487 null ] >> endobj 987 0 obj -<< /D [ 963 0 R /XYZ 79.822 538.692 null ] >> +<< /D [ 967 0 R /XYZ 79.822 582.528 null ] >> endobj 988 0 obj -<< /D [ 963 0 R /XYZ 79.822 527.733 null ] >> +<< /D [ 967 0 R /XYZ 79.822 571.569 null ] >> endobj 989 0 obj -<< /D [ 963 0 R /XYZ 79.822 516.775 null ] >> +<< /D [ 967 0 R /XYZ 79.822 560.61 null ] >> endobj 990 0 obj -<< /D [ 963 0 R /XYZ 79.822 483.898 null ] >> +<< /D [ 967 0 R /XYZ 79.822 549.651 null ] >> endobj 991 0 obj -<< /D [ 963 0 R /XYZ 79.822 472.939 null ] >> +<< /D [ 967 0 R /XYZ 79.822 538.692 null ] >> endobj 992 0 obj -<< /D [ 963 0 R /XYZ 79.822 461.98 null ] >> +<< /D [ 967 0 R /XYZ 79.822 527.733 null ] >> endobj 993 0 obj -<< /D [ 963 0 R /XYZ 79.822 451.021 null ] >> +<< /D [ 967 0 R /XYZ 79.822 516.775 null ] >> endobj 994 0 obj -<< /D [ 963 0 R /XYZ 79.822 440.062 null ] >> +<< /D [ 967 0 R /XYZ 79.822 505.816 null ] >> endobj 995 0 obj -<< /D [ 963 0 R /XYZ 79.822 429.103 null ] >> +<< /D [ 967 0 R /XYZ 79.822 472.939 null ] >> endobj 996 0 obj -<< /D [ 963 0 R /XYZ 79.822 418.144 null ] >> +<< /D [ 967 0 R /XYZ 79.822 461.98 null ] >> endobj 997 0 obj -<< /D [ 963 0 R /XYZ 79.822 407.186 null ] >> +<< /D [ 967 0 R /XYZ 79.822 451.021 null ] >> endobj 998 0 obj -<< /D [ 963 0 R /XYZ 79.822 396.227 null ] >> +<< /D [ 967 0 R /XYZ 79.822 440.062 null ] >> endobj 999 0 obj -<< /D [ 963 0 R /XYZ 79.822 385.268 null ] >> +<< /D [ 967 0 R /XYZ 79.822 429.103 null ] >> endobj 1000 0 obj -<< /D [ 963 0 R /XYZ 79.822 374.309 null ] >> +<< /D [ 967 0 R /XYZ 79.822 418.144 null ] >> endobj 1001 0 obj -<< /D [ 963 0 R /XYZ 79.822 363.35 null ] >> +<< /D [ 967 0 R /XYZ 79.822 407.186 null ] >> endobj 1002 0 obj -<< /D [ 963 0 R /XYZ 79.822 352.391 null ] >> +<< /D [ 967 0 R /XYZ 79.822 396.227 null ] >> endobj 1003 0 obj -<< /D [ 963 0 R /XYZ 79.822 341.432 null ] >> +<< /D [ 967 0 R /XYZ 79.822 385.268 null ] >> endobj 1004 0 obj -<< /D [ 963 0 R /XYZ 79.822 330.473 null ] >> +<< /D [ 967 0 R /XYZ 79.822 374.309 null ] >> endobj 1005 0 obj -<< /D [ 963 0 R /XYZ 79.822 319.514 null ] >> +<< /D [ 967 0 R /XYZ 79.822 363.35 null ] >> endobj 1006 0 obj -<< /D [ 963 0 R /XYZ 79.822 308.555 null ] >> +<< /D [ 967 0 R /XYZ 79.822 352.391 null ] >> endobj 1007 0 obj -<< /D [ 963 0 R /XYZ 79.822 297.596 null ] >> +<< /D [ 967 0 R /XYZ 79.822 341.432 null ] >> endobj 1008 0 obj -<< /D [ 963 0 R /XYZ 79.822 286.638 null ] >> +<< /D [ 967 0 R /XYZ 79.822 330.473 null ] >> endobj 1009 0 obj -<< /D [ 963 0 R /XYZ 79.822 275.679 null ] >> +<< /D [ 967 0 R /XYZ 79.822 319.514 null ] >> endobj 1010 0 obj -<< /D [ 963 0 R /XYZ 79.822 264.72 null ] >> +<< /D [ 967 0 R /XYZ 79.822 308.555 null ] >> endobj 1011 0 obj -<< /D [ 963 0 R /XYZ 79.822 253.761 null ] >> +<< /D [ 967 0 R /XYZ 79.822 297.596 null ] >> endobj 1012 0 obj -<< /D [ 963 0 R /XYZ 79.822 242.802 null ] >> +<< /D [ 967 0 R /XYZ 79.822 286.638 null ] >> endobj 1013 0 obj -<< /D [ 963 0 R /XYZ 79.822 231.843 null ] >> +<< /D [ 967 0 R /XYZ 79.822 275.679 null ] >> endobj 1014 0 obj -<< /D [ 963 0 R /XYZ 79.822 220.884 null ] >> +<< /D [ 967 0 R /XYZ 79.822 264.72 null ] >> endobj 1015 0 obj -<< /D [ 963 0 R /XYZ 79.822 209.925 null ] >> -endobj -146 0 obj -<< /D [ 963 0 R /XYZ 79.37 170.521 null ] >> +<< /D [ 967 0 R /XYZ 79.822 253.761 null ] >> endobj 1016 0 obj -<< /D [ 963 0 R /XYZ 79.822 126.765 null ] >> +<< /D [ 967 0 R /XYZ 79.822 242.802 null ] >> endobj 1017 0 obj -<< /D [ 963 0 R /XYZ 79.822 115.806 null ] >> +<< /D [ 967 0 R /XYZ 79.822 231.843 null ] >> endobj 1018 0 obj -<< /D [ 963 0 R /XYZ 79.822 104.847 null ] >> +<< /D [ 967 0 R /XYZ 79.822 220.884 null ] >> endobj 1019 0 obj -<< /D [ 963 0 R /XYZ 79.822 93.888 null ] >> +<< /D [ 967 0 R /XYZ 79.822 209.925 null ] >> endobj 1020 0 obj -<< /D [ 963 0 R /XYZ 79.822 82.929 null ] >> +<< /D [ 967 0 R /XYZ 79.822 198.966 null ] >> endobj -962 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F22 228 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> +146 0 obj +<< /D [ 967 0 R /XYZ 79.37 159.562 null ] >> endobj -1023 0 obj -<< /Filter /FlateDecode /Length 2785 >> -stream -xÚÍ[ËŽã¸Ý÷WäZ-‰zA€¤S`ÖµÜí½«ûÿÛ%QOÇeU¥³pÅ–eZ<¢ÈCÊÅOÿ;ñÓ?8ý2gáï?nï?~=´?)æ -‡zK‡´TlŽ¥*:—¥ç=¡Ñ û¬š3Áå«–k°öRÔïÓ-
0B‰½§A#4e<¿_~JóÍ5º?×ÑÏ„‚s[C§—²‰Î[:'¥QYìƒ(¥ëËO¡í×Q"ë¢L:¤ý>Ò1áÔ„Ïu
Ÿ^Ê&>פbÄ$›<ûºÕ'né -$tW d¼fÀí´õJƒD$ÚÌ-/ - -N1P~BA¡ÐK B¢Ð²½²²/ˆ]à¶/¡aÁÀ},Ò:²¢¥QÏ<Ë7ùSc$S0‘Dõ¶¦ô E$-ièCáö¢u@^€ØËKÖ,˜e‡Âu™*R6Q¨ì••·E娨4Œ8$´œG2Çdž_ÀN…nFìùð(e;Eé…¯K•Hp…˜VÝ—ñ$vC8¾ÄʤgZ«©En<H) ×FbB'¢e³×q9qƒ'"dPPí.y’Ñù#˜â/äHxFJ•s¶Èï¹Íµí«9ˆŽi¯'œ×8ö e‹!¦˜ÓBKýWfe†[fÀŒˆ,²æA -Cr*øKFcÍù½†©íØ&ÒaÞ”$¬NþN”û³Úko˜±vÒ~RЃ+Ys½©õ3ïþ݇_+Ü´ÖØí eßï¾Yft98ì“Mò”ºbEÙö?œUÌNe‘÷B4dõdµ”Ïe—߻渘ÖÉA¼(9J nŸþõúäÃSÒ¨ö)ëÀ”c²ñØ.Ñ“¸~¤;•ö\®â9úá®d~ŸU[ïJ0¢çðÆOÌÑžVR -™–TŽ²’`ïP{…Ö¯ÄJñ0A×,b”žÜÖ>°AŠ¢Z7ŒÁ×wægøEƒlV3”IÊrˆ]`b˜dÄ‘u“oïÝøÁ|ÀÓ+(ßû4IGú±õ˜ðÌmý„ +ÁÃmÐ$åRù{ßʤ`¡mzÃf€([ñfŠ7ø›‘»V&¼`Þ/!^Ã-†EòI§«˜{B1$_ôÎî9N`u©EçK”¨ãÔKB Ÿ7шsË£nÀzlcý‰•
>x6 #òãk;'»x‡8ĸžìÆæUØÀ%!ý(ºm¯ù
kþÓ¹’=öÞ@-yåϵ§Š$•ZijëUôxuÜG(·ï#Ä„®ÊÇ0³ÝÜU^Š-7QÎcðÇ¡hYVJÑ°
?Z‘•ÕÛ¤qb¿¸3%2˜Ñß[K¸d§CBh‡… -fûäüñâZ¦•ƒiZe±\DÝ`fÆTNj,–ž®rÖ=e›³dªR>'º -4ã¶+ÅÄ1—¶´Œ¸„t)ÒR‹lµ.ãÈsY+s!B -oõ8‹udŸ½œ -ãfõ¤¬N…
z¿Ñ‘tKy"—}ïdk5ªAH)TF,257t~å,„>:\µ€ù›kŦQʈì}‚XÌß±X kec$ ëøÜÀ3ú~ËÐ)Ž!v2áµ½ÚAJd¤’iTk6mßj‘(¦,‘|µŽ~³2§Ú e8+Ãþ‹]†B†Ëa„uq7x"ÍPl"=âQ¶U»äR¼ùÂkì³E×Y;„„ž«Ž•á¾Ô"C¤>x KTkagB(½dJˉ^+ l‹¡q/AåT4f6–âP„çT6µæ‚Vºêr¹$'pâääíÁ&q®Àn? -)¿iß•ÆÕßÈnÚaÕJú¤N€½×ýÚ:ÒÖ¤è«#è´l>[™9“×ñ3ö£ŸÍîJôÛýѪüö(Úî:«p‚99…ƒ¥Êì${…ô6<{0HŸäè"º«G{¿zï®áþmö¡i]T>}U÷ÖýH6{<>êÑøY^‹§rnëÿÆœ™BÝÁªižÅ^ÆóYŒÿ©e§ù‘Çfc~ú)VcéYN/™ ‘ -K¾¶V¢æÿuy{ÿñ7r -endstream +1021 0 obj +<< /D [ 967 0 R /XYZ 79.822 115.806 null ] >> endobj 1022 0 obj -<< /Type /Page /Contents 1023 0 R /Resources 1021 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R >> +<< /D [ 967 0 R /XYZ 79.822 104.847 null ] >> endobj -1024 0 obj -<< /D [ 1022 0 R /XYZ 78.37 808.885 null ] >> +1023 0 obj +<< /D [ 967 0 R /XYZ 79.822 93.888 null ] >> endobj -1025 0 obj -<< /D [ 1022 0 R /XYZ 79.822 768.829 null ] >> +1024 0 obj +<< /D [ 967 0 R /XYZ 79.822 82.929 null ] >> endobj -1026 0 obj -<< /D [ 1022 0 R /XYZ 79.822 757.87 null ] >> +966 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F22 228 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1027 0 obj -<< /D [ 1022 0 R /XYZ 79.822 746.912 null ] >> +<< /Filter /FlateDecode /Length 2698 >> +stream +xÚÕ[ËŽë8Ý߯È\]IÔTn’f]»Ao{VóÿÛ%QOÇeU¥=WG¦É#Š<¤\üôŸ?ýñƒÓ'Óxþþñãúþã×Cû“bÞ §÷¿~ˆ0ˆŸÄÉi&>Y#7âôþßÓ¿ÏœŽk8Þ.¾ÿ«Èüõpòä˜7\+D춣¤€äÜšp„O-‚Dι|\~j©y*ž†3©ÂqMƒ”k‡s¸‡óð©ÞÂaÃ5êÓÕ
‡º§CÚN* á.#“:(Uѹ,#oÉÔ¶0Óœ .GÌÀ¯aÖKyŽY8È·Ñ-d‚ùâwþîɘÿkXÁ3¡`‚ÕÁÚKQ¿3Lפ`„½%¥„2žß.?¥yŽæ-º?×Ñ‘Ž §¦…ª×Ðé¥l¢sOçd4‹c¥ôýòShûu”È»è +Ÿ_Æ' ´úÖç2^3àvDHÝ—¤l!4^éÖ*]“ñÚ‹V ¡Ch½%§(ß¡'b
¥^ +"}暀LqHÛ @VS”.¨|&´\¡dD/ E?Æde_¹Àm_ÂÂH¦@Œ`˜ë½”}4Ò:²¢§žÛ‘å›â©Ñ‚…)™¬^#Ö£‘¬$%1†ÂõE뀢 +C +*øINcÍù¦©íÜ&Òaî JH^''Êýiëçn´~‘R0‚+Yk½iõ³èþÝ[Ål· +,°èÝ…µ”?ב*²TºJS[¿Å ߎ åöƒ„€¨@ª|Ìc±ÜÍCå¥øbˆå<æTE˲Rªðˆ†-høÁÑ’FVÖp“ôÄqqkJd0c ¿µžpÉQ‡„ÐDg±ûBëòF€ex
øM%ôYõóùwŠ…ò¬¤$•U.y‰f+óDëqŽÎD +è›mÚEiFé—ê¬ó¬’J0NWº'ŽÓofC°˜ÑÀV.Z$Mâ'y˜µç⸻‰Ö¸P’L’i +£Æq +“½Ç<!eéKÖXàP¡’cF؉Cë§ùW¤…PÿO‹Ê˜M.?Ð+#ï‹%þȯqTËÇüßÍ?yL÷ôeL´gF»“£ÝµÌ+)Ò´Æb¿ˆ»ÁL©ŸÔx,Ý]å¬% +ºË6gÉU¥|Îtוf±r̽--c™*¦ÈÿÉ,òÕºŒ/ Ïeu¬ÌWás*
vëÈ?{!8Ø+Ãå…‡É|îטpØrºbÊos}3¡-Y´ä»©XÀ<°ÀH§u{´7'1…ô.Š.e²¶¸¦ÀVw¢¦ÌA¸±ä +°‚)î'ׅׄlMŒÊý*Ì›uBþÑ“²:Ç*=y´–ãq/D.G¢À›˜ò}·Á-7©F)¥sP±ÈÔÜÐù핳ÆèœpÕ2à˜!Xl7R@@dï3ÄnþFŠÅ]+3}÷
<£·´L[5B·¸[;H‰L‚L2é÷f×ö^»D±d‰ä«
ô›9Õ&-ÓÀYöwxì2¬#ôëÚvð Eš' ØDzÄ£zmkv©¥xóŠ×8f#‹®³và:pK3š½ÈP)…(óZ#¥ ¡´–Y)&BøVI`Û
› *—¢±²±”‡"<—²éjnh¥o]-—ääNœœ¼?Ø”C ÎØîçÀRss¤[£ƒ\k´±ªZ€„9rü[Õ<þΓ«Àr®”€Ó4½¤y/$F‰ìàúZßò¤õáµÝþÀs F›©ûK4&¾Iåê·cZÜê·+!SB–ÞÕÎÝà±í’ohûWYêÐH¤~Uº"Zzfêì6ü°¯`Üd͇ñQ’^1îÅ(¹mìÇߦ• +Õîý_÷i¯¥
~²½Œ/,4mõÃø?kÅ°FÃ㶕#Ÿ°éSâ^®å^¡Þ7í³’^
ëÔ¦ÝV›¤×H*üöV7k«¦?Ñ;GÐYÙ¼´2&«™â¦{ågc§»²¼ÃN¿Ã²*9…}Šž«ûª»=2¶/gÞVú0ÿïÐýýÇÿ +endstream +endobj +1026 0 obj +<< /Type /Page /Contents 1027 0 R /Resources 1025 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R >> endobj 1028 0 obj -<< /D [ 1022 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1026 0 R /XYZ 78.37 808.885 null ] >> endobj 1029 0 obj -<< /D [ 1022 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 768.829 null ] >> endobj 1030 0 obj -<< /D [ 1022 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 757.87 null ] >> endobj 1031 0 obj -<< /D [ 1022 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 746.912 null ] >> endobj 1032 0 obj -<< /D [ 1022 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 735.953 null ] >> endobj 1033 0 obj -<< /D [ 1022 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 724.994 null ] >> endobj 1034 0 obj -<< /D [ 1022 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 714.035 null ] >> endobj 1035 0 obj -<< /D [ 1022 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 703.076 null ] >> endobj 1036 0 obj -<< /D [ 1022 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 692.117 null ] >> endobj 1037 0 obj -<< /D [ 1022 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 681.158 null ] >> endobj 1038 0 obj -<< /D [ 1022 0 R /XYZ 79.822 626.364 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 670.199 null ] >> endobj 1039 0 obj -<< /D [ 1022 0 R /XYZ 79.822 615.405 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 659.24 null ] >> endobj 1040 0 obj -<< /D [ 1022 0 R /XYZ 79.822 604.446 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 648.281 null ] >> endobj 1041 0 obj -<< /D [ 1022 0 R /XYZ 79.822 593.487 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 637.322 null ] >> endobj 1042 0 obj -<< /D [ 1022 0 R /XYZ 79.822 582.528 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 626.364 null ] >> endobj 1043 0 obj -<< /D [ 1022 0 R /XYZ 79.822 571.569 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 615.405 null ] >> endobj 1044 0 obj -<< /D [ 1022 0 R /XYZ 79.822 490.463 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 604.446 null ] >> endobj 1045 0 obj -<< /D [ 1022 0 R /XYZ 79.822 479.504 null ] >> -endobj -150 0 obj -<< /D [ 1022 0 R /XYZ 79.37 444.994 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 593.487 null ] >> endobj 1046 0 obj -<< /D [ 1022 0 R /XYZ 79.822 425.443 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 582.528 null ] >> endobj 1047 0 obj -<< /D [ 1022 0 R /XYZ 79.822 414.484 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 571.569 null ] >> endobj 1048 0 obj -<< /D [ 1022 0 R /XYZ 79.822 403.525 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 560.61 null ] >> endobj 1049 0 obj -<< /D [ 1022 0 R /XYZ 79.822 392.566 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 478.386 null ] >> endobj 1050 0 obj -<< /D [ 1022 0 R /XYZ 79.822 381.607 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 467.427 null ] >> +endobj +150 0 obj +<< /D [ 1026 0 R /XYZ 79.37 431.606 null ] >> endobj 1051 0 obj -<< /D [ 1022 0 R /XYZ 79.822 370.649 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 412.054 null ] >> endobj 1052 0 obj -<< /D [ 1022 0 R /XYZ 79.822 359.69 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 401.096 null ] >> endobj 1053 0 obj -<< /D [ 1022 0 R /XYZ 79.822 348.731 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 390.137 null ] >> endobj 1054 0 obj -<< /D [ 1022 0 R /XYZ 79.822 337.772 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 379.178 null ] >> endobj 1055 0 obj -<< /D [ 1022 0 R /XYZ 79.822 326.813 null ] >> -endobj -154 0 obj -<< /D [ 1022 0 R /XYZ 79.37 305.655 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 368.219 null ] >> endobj 1056 0 obj -<< /D [ 1022 0 R /XYZ 79.822 273.727 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 357.26 null ] >> endobj 1057 0 obj -<< /D [ 1022 0 R /XYZ 79.822 262.768 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 346.301 null ] >> endobj 1058 0 obj -<< /D [ 1022 0 R /XYZ 79.822 198.752 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 335.342 null ] >> endobj 1059 0 obj -<< /D [ 1022 0 R /XYZ 79.822 187.793 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 324.383 null ] >> endobj 1060 0 obj -<< /D [ 1022 0 R /XYZ 79.822 173.283 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 313.424 null ] >> endobj -1061 0 obj -<< /D [ 1022 0 R /XYZ 79.822 162.324 null ] >> +154 0 obj +<< /D [ 1026 0 R /XYZ 79.37 290.925 null ] >> endobj -158 0 obj -<< /D [ 1022 0 R /XYZ 79.37 139.92 null ] >> +1061 0 obj +<< /D [ 1026 0 R /XYZ 79.822 258.101 null ] >> endobj 1062 0 obj -<< /D [ 1022 0 R /XYZ 79.822 89.593 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 247.142 null ] >> endobj 1063 0 obj -<< /D [ 1022 0 R /XYZ 79.822 78.635 null ] >> +<< /D [ 1026 0 R /XYZ 79.822 181.337 null ] >> endobj -1021 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F79 227 0 R /F22 228 0 R /F64 198 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> +1064 0 obj +<< /D [ 1026 0 R /XYZ 79.822 170.378 null ] >> endobj -1067 0 obj -<< /Filter /FlateDecode /Length 3786 >> -stream -xÚå\K$·
¾ï¯è?°ŠD½Á -s(Ï6ð0“¯š÷µ®èÂ…çpÕ"Køhò¥çh+Gó©´d^O<û‘¶êÎwvw2øÎʼn%+Ï7Ô’×ÏRÙ—$ý,GW*—uÉ…Oy -2hã¥oh`6£4H ŒJÍí”ÍL¸WYÍV†·¦.) ÒîÔ‘¸7u„ï~dúfâ!“f(Ÿx¨B(¬çØ‚—'Ñ’iÇá“Þ’U£<ý_v„2;A)€–£¬|©‚‰‡I–Õ×!´U
2ñÐîø\Ì5î,BW[’Pz«»ÈÇ–²³ºô× gz|XÓÞä].¿Z‚,/»NÞY€RÍ–—Ö†Y®
(Ž¦âã,ʶÙõ\ô¥2rf.©%©U5êfÎÑŒcSË»–§9*& ß«Öô(uЉ2T'qIlô~nÞ¡ÙyãsS7Ît8ÿðßQkÚßóNHèµæð”q¨z¸¬»J"ƒÂ¾&BùÅnUo¤ë‰x›4?‰¶hBíkÐç‡in¥¿$•n沤(ÕK>Ö?%©à–I•å™W/Éž²XºŽ;Êô<(.P)BÇRu–—mT»•ÅcYí*©oì÷å Ÿ›ûiNÍòmª<¼I6Ku„%(¥wL+ñ2.ðHDBÅ6GOÚ‹UL:ó»"H2†²O!HÊÙÿ‚¤úºŽ …ÿ IxúîÒ`JŠ‚mNdjAÞܯGéÑ -A‚ÖÝq™ÚídjKd£]
þ-MS1ãdp–P–es~(—ÕcªLOzT™Yêg(pUr½¤³Ã¶á¿ÅlkŽk¥ZÓ~^“‡Åܦ§ÃܦGM!‰%jˆdÙjómî×ÚY‚ââe;GÑÚ?›¸Ò”yô‘S‘Ê“~&â“ÐÊ©Ø_픉Ù*J9çeòR²òn<³˜GÜó4ŒGWƸ<‹ÄËa³u!Å™d0ÉYq:>?9šœ`BzB¬? p¦ÙÈg}œØ²³Æ -é“>àux“põ¡$‚?aVª60®œH–7ÏÈäõÓ]^ZƒÀ8H0 Ô×K²a-ÕʳOú9Ö©UP}©Ó•ÖA¤1ãÔAå-ʼ¥í*¾}¬ÌӦ᰷¶¿Ç#ò²gbiá(°3÷+ÀŽù¨gí÷÷L¢Oƒ-¨¤_.y&”Ê;=“?¿kÏ™¥¢Ke’—°»F´çø2ú+A~»;D’’ŽLîÇ›¤&q)‘ž}”¡qüÈôMeDÒ8ïâG;¼Ü0.¦± -b-Û:…S5®³ É(`ÖLú
v’¸ë}Û!g Ð~©mÔ“¾H¢ðw¬ÞǬzŠõôIíüÂÓ¡¢TX‹ÓÔ?ï†(ƒŽB}BaŽ–Ú’Þd6‰ÑkÁœÒ¦ú³´*·äïwc„VL™ÆñGתž0%Xz4C°¶ºÝvÊÓ1ª<§‹]¹ç`4‰FïÀò…Pº,·Xuc#ì%xJtLMð·É› ïʤgÎoæBLLÇGã _Ÿ–@gú†
yÙf›œçkï:oñÉ‘ú†åþÄx=p+öc–›žˆH³ÀªÄ¯.]zÚÉåmÓ -©´ò@ýÞôâU1¤eFy*Æ“iÅ*ÆH¥‰qh6}>4`˜™¹w×Ô@¤€¾tx_fHhf»Ê°b×Bb”ÊaHì3®˜µ0‰¦®‰6R!ѧì€Gð"ä4÷—cBäR,¬c®3¾Î=TB]pâSkZÕ×ã™J³–; •<Ö=½Í¾Ô6®¯p³æ†ÊqõNUÌy˜´±Dó…Û -ù^UÏì·ïVhõÄD¢K`”¦£]Ý[Œº.ÞÊLÂsaqËAÏïà©RKmÄÄnŽþYcrð!Nˆâ›ä²R}r9µ+ïëÊVË)Omeç_íb©VuÅ•9cIŽ]Å’È]Ž=S'õ ùiÙws-hª€U‹®{µ®4jWN8´l;JÆtPWE{ÕUØïùÅÈ|x·4¯ªrÒç[a`™öæºÏ'ÿñfBã#*·=5ßp6 ôIÏåÅžq/W˜EËþ2e[BÅ -Ìr˜<S©PŽŒu!b,,žá8)„˜-ÇV‹G% z¡SAð&Þ% -ÖªHÔYå‰Óùô‚G[tˤœ°‚•]&ªUWˆ)é'Ü+Žz‹Q¿œg›©—®<¶2Ôr·µñ>ý‚Elu#[!·ï–ÿ -endstream +1065 0 obj +<< /D [ 1026 0 R /XYZ 79.822 155.421 null ] >> endobj 1066 0 obj -<< /Type /Page /Contents 1067 0 R /Resources 1065 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 626 0 R /Annots 1094 0 R >> +<< /D [ 1026 0 R /XYZ 79.822 144.462 null ] >> endobj -1094 0 obj -[ 1064 0 R ] +158 0 obj +<< /D [ 1026 0 R /XYZ 79.37 120.716 null ] >> endobj -1064 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 416.773 191.975 427.2 204.425 ]/A << /S /GoTo /D (Hfootnote.20) >> >> +1025 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F79 227 0 R /F22 228 0 R /F64 198 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1068 0 obj -<< /D [ 1066 0 R /XYZ 78.37 808.885 null ] >> +1070 0 obj +<< /Filter /FlateDecode /Length 3796 >> +stream +xÚå\ËŽd·
Ý÷WÔŒ¬÷h4Ðåš2à]’Ù^%ˆ7ñ"Ùä÷C‰zRÒºÝ#@=Su¯D‘%>TüòÛ…_~záåfâ'ø÷§—ë·—î&\4^(yùö÷øE\¼aÒ›‹³‚q+.ß~¿üòʹ5øgäÛ¯ß~®4¸{yñ,X«|O$8¤§D´‚syå\ü¿¿}1ÒÀ£àé|³bøvï¿Éwú͆éýµ|Sº|Jckx"áÆ7žŽºj1r²lqÔbäx×b”bKçŠêï¦òÑ<ΗtíõÔ<ŽDöóyTnš!ùÜ|̽·ÚB3üá.Ì% +V1Ä 'qV£–âªÈ³‹<Ë{œÉ7Ã{:_táãsXOFd‰#M>|®ŽíLÅ‚™xŠö£\Õ]èìîÁDO#K‚Ií©%#·/J»×¶G9p\¥}ÖU²&kŸJµñÚ7´r6#$¥ævÚe&ü›—YÍNÅ·¶PiwêÈ\›:âçH?1$ûfâ®P³@’OÜu!×sjÁËÜziÇáQo(dÕ(ÇÿËŽPf'*E‚åh§^«`ânѲšâÒ:”mUK…<4;>繶!0ª-)Yz«»È’ÆVª³:ü6ȉïgÛ›¼Ëå·IK2KÊ®“wI©fËõa—kC*ÇPq¢qåÛìzIXôñ +Ó\.æŸs‹šB%jˆdÙj4Oó6÷kí,Asñº£dí_lZiZŒˆ}„È©HåI?éIhåTì¯vJd¶ŠRÎy…^JVCÞ§qóÈ9³VŽgW¹<ËÄËi³õO!ÍYt iÑ]‘:<p8yÁ„ +”ZÀLA²UϺ9©egÕ£FäÛð<ù6¡õ¡à?a—Ú¶r\=‰.oÞ‘ÍkFÞîôÊE’Q¢]€Ê^ÑÒ+÷5ô + +
ûp°*Š$½\‡áçÀix´ŽZ“Ù¾³,û
’êÙ(Gpe_v)å
»«$K\âÛïๆ)ÓN’]b>ù8-œOÚ[IB—ó)Û{YÍ£©è¡zL½`Ƽô˜Ü9Òò(Z‹oŸFkR~Iõ™i¢Ê¯+§»‡Hn‘“ËÓ]\·¥r5ÏcåÂÏÉm6æo÷æÑAI½!ìën-ÑÆ{*#h{ó*ý*LJùÁÉRšý,eýÈpÛøT<á¨|s€Gè¼<¿j-Y0ÓÌŽK%ã—åȇÌGèh;*ˆ5Wó@óL*¸Îýª™‰¡ý±¿[ZÕm"ØT %…†¤Ž¿³÷©%†Ú²¨e)¡ ¥]-{ +®7†µG <ô–*ú¤G % + d»]¾¿XÊ +Œi¡O8óØšVHõEz¶Ò¬5PBg#uÅw¥¹×á€Úùu`†[*ÇÙ‹N3H‹jc é·°´›i +¢‰RœI‹¡Ò¤ü§ºº>4ˆ{óiôê‹”+=’ì&W íÅk—K—àmWæ|·¥á\SdŽº'äÚåë´¬nÃqôV¶
”êX©±ö€$,qíVüØ~;¿÷iÌNæ™[UXj“ʶ%˜øöÚEÀrÕa›8ħ¸úûo"K8Zwvjµ‡Ãܨ•*Ó
Ó|ÙÆégvHá˜h¥WOLd +Ìr˜FÓX6GÆ:7Îp˜BaLÞ–c«E¤P‚E,ÞäðíQ +¯ì«8fݟ똧åo›óiÏõÒC¤ªŠaÆÀ6>¥É€&”ßµ0Øx³§OIšù¶Š©·Aú⸾Ȣ/ú2ÆuÁBì»»Õ`¦[(ƒÊÒý:îãìWÛÏ…HðʉB¸0T¾Ž¥Uf¸©òÄZŽ¨Q€W1*uÖ¹&A50\3z_û$@¿…ÃUðÄ=lãÀÑ<Þw…?Mš#¦sÕ;ùº«ù?^åà :+éˆýZRNÒlŠ“Œ)íħ2*Nö7%9‘¥®6×Ùc‡Ü,¯ˆ˜¼$TÿõÛ?ü9z¸Â^À§v*ÆRIúд°°qO¹ˆ7î’56ý6µˆ¸"Ò]ºxîVåµWϬ°ÝÆŠw6ÕTWÓž^/«'ôt±Î›§Gºüæ5¹ÕQ³»^IÎ9žB¦¦_‘趢BîêyóÌ]½'(?qWq£šàF$ŸZ7*X+$ÑŠO¼É—¼·%·LÊ .¥0]ªXˆ)é'ü'48Œ‹QßWiÛ©—©<¶rÔr×µñ>ý¢Ej“t£Zü ·ïÿ€¸v Àè«-¤y|ÁfÄÜ3ÑðÜÓäÅB_×ù¬EúVðZ³„Â/¯_lò†qk(oûß:ÎÁ¬óû¹;ªJ@¾ë~uÃ}¢V¬WDZš[ÏüNËb5Äк ô–ú`?-ÿöùWZ©Ò~Y£Ä§qû~ô#)«êÉóÖ%6cµc +êžúå
Bä Ã*– ¥ýäV?è×o/ÿ$³äÁA¼üõ÷—_~…‡ƒ¿ŸAJŽË¿S³ßÁ‘ÑÌŠØé—¿¼ü =Ή‹ãÚOÃâ¼@e§5(N]@>—ÂÌŠ9 ++W—µrß°êH8RŽ·à5B pÖ! +endstream endobj 1069 0 obj -<< /D [ 1066 0 R /XYZ 79.822 730.971 null ] >> +<< /Type /Page /Contents 1070 0 R /Resources 1068 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 627 0 R /Annots 1096 0 R >> endobj -1070 0 obj -<< /D [ 1066 0 R /XYZ 79.822 720.012 null ] >> +1096 0 obj +[ 1067 0 R ] +endobj +1067 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 416.773 154.117 427.2 166.567 ]/A << /S /GoTo /D (Hfootnote.20) >> >> endobj 1071 0 obj -<< /D [ 1066 0 R /XYZ 79.822 709.053 null ] >> +<< /D [ 1069 0 R /XYZ 78.37 808.885 null ] >> endobj 1072 0 obj -<< /D [ 1066 0 R /XYZ 79.822 620.386 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 768.829 null ] >> endobj 1073 0 obj -<< /D [ 1066 0 R /XYZ 79.822 609.427 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 757.87 null ] >> endobj 1074 0 obj -<< /D [ 1066 0 R /XYZ 79.822 598.468 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 693.113 null ] >> endobj 1075 0 obj -<< /D [ 1066 0 R /XYZ 79.822 521.756 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 682.154 null ] >> endobj 1076 0 obj -<< /D [ 1066 0 R /XYZ 79.822 510.797 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 671.195 null ] >> endobj 1077 0 obj -<< /D [ 1066 0 R /XYZ 79.822 499.838 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 582.528 null ] >> endobj 1078 0 obj -<< /D [ 1066 0 R /XYZ 79.822 411.171 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 571.569 null ] >> endobj 1079 0 obj -<< /D [ 1066 0 R /XYZ 79.822 400.212 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 560.61 null ] >> endobj 1080 0 obj -<< /D [ 1066 0 R /XYZ 79.822 389.253 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 483.898 null ] >> endobj 1081 0 obj -<< /D [ 1066 0 R /XYZ 79.822 378.294 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 472.939 null ] >> endobj 1082 0 obj -<< /D [ 1066 0 R /XYZ 79.822 367.335 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 461.98 null ] >> endobj 1083 0 obj -<< /D [ 1066 0 R /XYZ 79.822 356.376 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 373.313 null ] >> endobj 1084 0 obj -<< /D [ 1066 0 R /XYZ 79.822 345.417 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 362.354 null ] >> endobj 1085 0 obj -<< /D [ 1066 0 R /XYZ 79.822 334.458 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 351.395 null ] >> endobj 1086 0 obj -<< /D [ 1066 0 R /XYZ 79.822 323.499 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 340.436 null ] >> endobj 1087 0 obj -<< /D [ 1066 0 R /XYZ 79.822 312.54 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 329.477 null ] >> endobj 1088 0 obj -<< /D [ 1066 0 R /XYZ 79.822 301.582 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 318.518 null ] >> endobj 1089 0 obj -<< /D [ 1066 0 R /XYZ 79.822 153.138 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 307.559 null ] >> endobj 1090 0 obj -<< /D [ 1066 0 R /XYZ 79.822 142.179 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 296.6 null ] >> endobj 1091 0 obj -<< /D [ 1066 0 R /XYZ 79.822 131.22 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 285.641 null ] >> endobj 1092 0 obj -<< /D [ 1066 0 R /XYZ 79.822 120.261 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 274.682 null ] >> endobj 1093 0 obj -<< /D [ 1066 0 R /XYZ 93.716 89.269 null ] >> +<< /D [ 1069 0 R /XYZ 79.822 263.723 null ] >> endobj -1065 0 obj -<< /Font << /F15 199 0 R /F74 202 0 R /F81 248 0 R /F79 227 0 R /F65 200 0 R /F59 211 0 R /F82 249 0 R /F98 344 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -1098 0 obj -<< /Filter /FlateDecode /Length 2991 >> -stream -xÚÕ¹Žc¹1ï¯Ð‡,Þ@£©ÕZ`3Û“-6²áM<ø÷]¼Éz‡ÈžlÝzâ#‹ÅºŠ_þ¸ðË//<Þ¾½|}}ñÌ0êòíï/_ð‹¸XϤ½X#7âòíûå·WÎã\>ðÞ¾H)qDZεà\¹ô§Å8·€ßÃßçÜÊì8«ŒVaÄ´o7ÎÅ{šôl|ÚÅp„lÞ\˜§ÝÛïß~}áL‡Ãàÿ_ð,Ú_óNHèÏâ4§/VY&„¬‡Ñˆ„ÄÏk”iòõáàâ Fºˆ·Ìƒ£@â™U8M8gÀªÐ±/'qé½Ö;óMÜüëà„Ü0À£uˆ‡}Ì5"}q;Nɤƒð”gÈk5"2ùMÂk"p@Õª4;¼cVdï}•ØÆ9æFœ±¥_!6²%ìÛ
úµ‘9’6
ÜËÛ F*< -›ïßHëâš[¢]z#UyÚcóùž{+ÎñØ[±ƒ[—3¥5V õªˆêG‚©nå3©(È·/ñ!Ž¢þµ±½è]@PJÑé:ÎMH8±‡„0iŽ¢1ïô¦¬¤&¼Ã1Ù8’-F k Ú¡t8¦žÝ¾vä¶(¤±hŽ9ÂȽ_YÞÄõ…VíDJͤßä*O/gÔÎñO÷R†gè*wNj©q¶°«{iÔOëéª÷ëù^F2àþ˜²èD”þ·/JÉ×ƧÆÅäBê*Ûó° -D†V6GTM˜DYÚ -3é:Ï÷¼6‰ŠDÏt8¤«z¦“)Nnµ+9BÓIDƒßf4ý+&-ˆZ˜VÝìkˆvLJEQH:Ö}¦hUÕlNBò=«½/#O”
_Dµ*‘@úllüŒï6Ê3ηîÄ-¹“ȱ;)ÂÈ7IÝÂÖ”7Ú×'YŸo?Âçòé¥c\o=uxÁ-“ -#Ý-"øäW93ëý:3ëa&f‰àLÀzŸÅgðz -/
Ÿb(XƽØpTqt„r„âUOäÜ,?Ã7Åø+L ÑÔŽ=ÅøǬۧX*‹oˆ…’k,¡ÄOÉæQ‚ |>몦Äcn–û¹fÂnÒ7õ1¸H - -`¨fæ„V3'Š)>©˜ºÆúsJ^ëÌg*¨$ªÈþ¨ÊO6¾)¯çoµÌ@MoñMõJ )p,\¢P–´Vÿ80ÀfJ<u¥TQ°+<y¦´Çñ¤î)•@!Ó”ŠuO‰Ñ‰GÃC œ;ÖsÝìO×Ϩå(·ãו̊º¿ü Ññ}Dc5Ðñ½½×›ã 8:ð7ŽÔ2\ý–@ ÔŽåÞÊ´MÆÎÍ°tÌIOÏ£ô¹E7‹»ÐU¡ ™ÏàH„)ðÏB*õq´+n Ô¼Ž–À1-»5Uë릢p*° -ÔlÈ3/°J+&õF`6êX$÷DQyt5Æ<Šç¡ºŸÍQf‡2ITÑOŒêŒëÄ ¾ j0]6ó&Cxt;o†-Í.7ãó(ükµÒg¾žyÁKæ9lhЪA ŒŠðÑQ(Y-kº6)Q(3áD¥ÑZiÅ»„¡˜äˆM^{YÂnhL[6‰êÁiØ×5¶ž”}í÷®±O&…¹QúÉ”ÅMZæZˆ]²¢ÚÕæ£ßBÅ}aºàaí@Ø2ïPÔxoS¤¾\Iü8·x ˜1›s¨÷Bæ@â¹HSËP-¦Aé0V‘BF~pÔåżgâxºêœ\#Až±ýºÆ•téö§}¢:?wš6ØïX*ÐÌ)Ýë—„ÑFüÀó¾rkŒ)TÔ _fú„~iäGÜ# -‹V’bþÌ=bàm Y$#a\ÂÆ„_6Ú…°¼'¶7AïˆL;|E‚2ý2…k¾˜%ªQ¯Ø©Œo ©ËU•Û<ù8âG/a
¿ƒNäŽ ÉœŸ‹üÆÆèy¬œÅè´§hLì)Ž(,šQá9†°@€9›±,,Sd¯§ ;iHnN¦rmËšý¼w5où\‘Gq`^nŠ<k÷‹“\rߦ·Üq{é1}±›DxòÂNé_(C⺊ŒoËõ“-_fJ "JËŸ÷.ãˆT“Û¼Æþv}“£Í:‚hýLŸÎýY»·ó<ß½›k–Ùe9z#ýz]#”Ž•qFôäˆYŠØ'É8Sût1¡ÍlÊ8Ÿ"ª9„¶J@í÷fC@µFÀÊ -Ïa¹%'•c½UQ¹†òE·ðnE`…uEÒ5<DQ`°ƒ .2UMC©dÐ*“V¤tª}ùx÷§ÔòÛ±tÚ7S&VžÈŽ[ׯ!ÊÖ*‰ùèjBóA!•Ý¸UßÏãO£ÑgØ´z¥¦ß£Ûמ +1©bßHå¼c2OèS@èvC‰\ÈjiÀ^ªQJ;#÷wS
ðŽIh=hÓ"kNIŽAfïÀ>%“«}®Õ!õ¯?.éáÏA„¹ ,Z‰Ò8„–:–Ô$Çè@6NÃŽ8º©&™æ’bo J•ûE±ŒÈuÏ‹®Y*Rˆ×R*/ó‡òe±÷.œvu^W•‹%Ê8ZÕ´®îÌmVÆzÞÁ¾™vŽ™ÒaÈø“xy\áÃ,ÏkºK¢ã˜w…]®Wóp˜|˜]ÌExhõ¦–J|ö§ -Eúp*=C.‚ËDÀ/0\žS'ÁþYÿ#¹HÁ´U”k?Ž!@JѪáÿ¦€ï‰áÿ€3Ó]™+<ZºqN€4U[ÅFxŬؚD½‚
rì²ÂÏÞþ$êT^æŒ_/E -ºë£?™£ÂILæ¶FHÍ^ Åd•Y¿U[¹Ä„È9BçReRþï2Åú`ŠÌÉšÍßêš3gm äk±rÌ-i»eŽ Äú…,<@anpñšx•ˆ -r{öññûŹbÃmG\³g€ÜXŽaHá¹Üω݂ü=âúAé—ýñíåŸ$Û@C 1ýÿë÷—ß~Çá¿á߯HiéÝåßqâwTS…–;,ûÇå//J?•¶â¢1»µÚ&x¡.Ö0ך[n‹Ì“—ðƒ9®HttGs„ù2n„§Ù¹š×ú½µB&„&‹›5ûŒ ¼·f õ×x-Ý ,ÊŸ" -endstream +1094 0 obj +<< /D [ 1069 0 R /XYZ 79.822 115.28 null ] >> endobj -1097 0 obj -<< /Type /Page /Contents 1098 0 R /Resources 1096 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R /Annots 1131 0 R >> +1095 0 obj +<< /D [ 1069 0 R /XYZ 93.716 84.287 null ] >> endobj -1131 0 obj -[ 1095 0 R ] +1068 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F79 227 0 R /F65 200 0 R /F98 345 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1095 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 164.072 295.116 174.499 307.566 ]/A << /S /GoTo /D (Hfootnote.21) >> >> +1100 0 obj +<< /Filter /FlateDecode /Length 2955 >> +stream +xÚÕIŽ#¹ñ^¯È4›î@¡ +‚XžÄÇzç'H&=JŽ$3úÉz(ðG àóõ.ôâ0ªÅÃz&íb¼fN׳8\{ëß¾H)qDÚ¼»KZ¼ÃqU"å•fÇY4Z`ÄSÔoO:Cx¦3ŽÍ›ó´;Ëãó\¯£¦ã-óàF ñ̪j¡.t¨ß#ÅõÆ|âÀZÝÙ–°¹äO¤/nÇGE2)›DFây¡Q#!‘ß$¼&TJ³Ãoa,ÀJÂušØ ™Ñk{(O»²&lÑÜ÷†´YhàF¿1R™'«¿åëâšk¢]úEªb6Ø|¼çÖŠc<¶Vlà6¡´Ü0+Tq"÷l®ô™TäÛ—ø-Ú þµ²ô. (¥htç&$œØBB‡6ÃhôÇ;<†ð‚)+G Þà˜lHÉCeK‡v(ºi€g·¯Íy¥m +i,š£DŽ0rkWÒ/q=ñêƒH©™ô«ƒ\äáñ¥âÌ€Ú8þá^Ê0ã̸ʓZj4gžÝK£~Z?®z¿ïe$î÷Ù*I'¢ô¿}QJ¾V>U.&RVÙ–‡E 2¬°²:"r4aFeiLW]§$i(¼6‰Š½ži¯˜E#Hz¦“)Nnµ+9BÓHVŽ;ÊŒªdÒ‚¨…iEÑͶ†hǤT# +IÇ°Í¢ªšÕI‡|Ëjïiä²…p-œ†"ôYÙøŒïÖN27:õqÆ™t ö] B_ãèÖæ¿Dh¾Æjå)Ggú´#Õ˜S#UÈžK,({(ºkDñÁA.rfÖûefÖÝLÌ!¼™€õ>‹Ïà%ô^žb)fyÎÉ‘¥Î±´‡²‡âEOäÜ,?Ã7ÅøL ÑÔŽw=Åøû¬ëS,Å׃YšýÆ4K{(»ñS²9E”`Ϻ¨)ñ˜›åž"°þK¯|éÜ€g80Y !Ò9—ÄýðÍcßëTR®Sˆ‰„@s`(b›Y¼†,Þ®³øè_ïǽ6£þí 2ä
+…„ + ++|‡œò«:Ûä¿€3Õ•r•¢—*å9CHÔ²"輦/Ð]U'…÷ô+íXK?Ö—vŠMå¨ÊF‚JòaoC:'‰G²‘&Jø÷ös¢î^©jöLôªb¯þd5ÛžÈA;§1'mP@ÎÙ¶ZLµ36JaF¶¨¼åó†\ˆv4ËtªHÞûú!lA9´dN1.ÜˆÑ K†I.óz@|¿!3ša$¿"–®¦ºäR’1HÙfSþ¥y…‘¦ÎO#1S…p¼Œ[cöhL¿™õ{¹¥qF# ÅkÅ©ÂNã*] +ój-6çUSaè%`WèSªÙ9PMñ¤jntGΩùT¹—1%jÓ²K*”ÍoJìù[©3ŒÆ—GU>*T.Á…KʲV ;&ج Œ2?ºªUvÄ“Gš169>¥(fz¤â‰Â§4(OÁôôŽ]ë±v¶§kg”z”ÛpíÒ¦yÙ_~‘ñmPcÜh¢ãïöFÎ7‡Bq´ão)u¸ò-Û<¨]ËÖi«Œb阓~<ÒÇVV¡0«U¡"™Ïà† /RàžD•QêãhS\*¨y¥Ø1-»6½¿¦ài + +‡«ÀáAÍŠ<ó«´bR¯fW`#¡öErKÑkåÚŽøV<ˆ8wåýlŽ2;”I¢Š!T¯Î¸Nà› Óe3o2„{³ójØÒüàt3>wâ_-–RœùzTå/™ç°¢Áªó{lT„®r€’Õ²©K—…Ò9NDÖB+Þäd’#6ymlf »¢ñسITNþ–¸±6¥ìkº7݈m2)¯˜Qú;É”ÅÍÓZ‹ÒÖæ½ßBÅ=1]ð†°¶#,ÍÛ5ÞÚÔ©m ß-fÌêêÈ\/<Š5µd\¯‚Òa¬ªùÎQÓ!ȼgâøqÕ1¹z‚<bÜ+;Úu•9*é8Òì?6ŠÊüÜjZa¿a©gFÚV¿$ô6:àž·ÝkeRQ'<Í$úýÒÈ÷¸Gäˆù#÷ˆ¡·E€Ãª c +~mØhO„àý`{ô6€È4¾ÅG”é—)\2Æ,Q•zd§2¾RÓ]•k<’|ìñ£•°ŠßN+rCŠ”cÆMVUúÖèq°œåè°«hLì*8œ4¤Âsba„²çoúÚL0N‘Ã~ÌÚ‡¦äêl*W¸¬ÙN~Ϧ.ÏUz¤´ÌªÒsîŽÑ +DDX¡ÔzëBŽøh¯ÿµ÷îÚ.‘vm«£ÎÚƒhýL-œû£vo®3úsO_}”\1§jE…ÃÌ÷ª‰]=”†…qF´äˆ‰ŠØ&I?Sût9¡Î¬eÊ8OÕìB;IÀñ;çFÎv†3(gx§sà +ï(Xázª{< +ø–þßñ]Ÿâ«ÄáܵóHUµÓØ€Ç +‰óÍ‚û8¿u36¯õ[k1Œ¡p¿x·L¾€‚y\ÝÁ࿼ +Uƒÿm +Ìh³(Ž‡…¶ËÊ àþádr +endstream endobj 1099 0 obj -<< /D [ 1097 0 R /XYZ 78.37 808.885 null ] >> +<< /Type /Page /Contents 1100 0 R /Resources 1098 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R /Annots 1133 0 R >> endobj -1100 0 obj -<< /D [ 1097 0 R /XYZ 79.822 754.882 null ] >> +1133 0 obj +[ 1097 0 R ] endobj -162 0 obj -<< /D [ 1097 0 R /XYZ 79.37 716.17 null ] >> +1097 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 164.072 229.907 174.499 242.358 ]/A << /S /GoTo /D (Hfootnote.21) >> >> endobj 1101 0 obj -<< /D [ 1097 0 R /XYZ 79.822 696.628 null ] >> +<< /D [ 1099 0 R /XYZ 78.37 808.885 null ] >> endobj 1102 0 obj -<< /D [ 1097 0 R /XYZ 79.822 656.777 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 768.829 null ] >> endobj 1103 0 obj -<< /D [ 1097 0 R /XYZ 79.822 645.818 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 757.87 null ] >> endobj 1104 0 obj -<< /D [ 1097 0 R /XYZ 79.822 634.859 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 746.912 null ] >> endobj 1105 0 obj -<< /D [ 1097 0 R /XYZ 79.822 623.9 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 689.673 null ] >> +endobj +162 0 obj +<< /D [ 1099 0 R /XYZ 79.37 650.962 null ] >> endobj 1106 0 obj -<< /D [ 1097 0 R /XYZ 79.822 612.941 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 631.419 null ] >> endobj 1107 0 obj -<< /D [ 1097 0 R /XYZ 79.822 601.983 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 591.569 null ] >> endobj 1108 0 obj -<< /D [ 1097 0 R /XYZ 79.822 552.169 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 580.61 null ] >> endobj 1109 0 obj -<< /D [ 1097 0 R /XYZ 79.822 520.289 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 569.651 null ] >> endobj 1110 0 obj -<< /D [ 1097 0 R /XYZ 79.822 410.7 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 558.692 null ] >> endobj 1111 0 obj -<< /D [ 1097 0 R /XYZ 79.822 399.741 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 547.733 null ] >> endobj 1112 0 obj -<< /D [ 1097 0 R /XYZ 79.822 388.782 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 536.774 null ] >> endobj 1113 0 obj -<< /D [ 1097 0 R /XYZ 79.822 377.823 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 486.961 null ] >> endobj 1114 0 obj -<< /D [ 1097 0 R /XYZ 79.822 366.864 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 455.081 null ] >> endobj 1115 0 obj -<< /D [ 1097 0 R /XYZ 79.822 355.905 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 345.492 null ] >> endobj 1116 0 obj -<< /D [ 1097 0 R /XYZ 79.822 344.946 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 334.533 null ] >> endobj 1117 0 obj -<< /D [ 1097 0 R /XYZ 79.822 283.178 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 323.574 null ] >> endobj 1118 0 obj -<< /D [ 1097 0 R /XYZ 79.822 272.219 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 312.615 null ] >> endobj 1119 0 obj -<< /D [ 1097 0 R /XYZ 79.822 261.26 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 301.656 null ] >> endobj 1120 0 obj -<< /D [ 1097 0 R /XYZ 79.822 250.301 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 290.697 null ] >> endobj 1121 0 obj -<< /D [ 1097 0 R /XYZ 79.822 239.342 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 279.738 null ] >> endobj 1122 0 obj -<< /D [ 1097 0 R /XYZ 79.822 228.384 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 217.97 null ] >> endobj 1123 0 obj -<< /D [ 1097 0 R /XYZ 79.822 202.481 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 207.011 null ] >> endobj 1124 0 obj -<< /D [ 1097 0 R /XYZ 79.822 191.522 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 196.052 null ] >> endobj 1125 0 obj -<< /D [ 1097 0 R /XYZ 79.822 180.563 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 185.093 null ] >> endobj 1126 0 obj -<< /D [ 1097 0 R /XYZ 79.822 169.604 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 174.134 null ] >> endobj 1127 0 obj -<< /D [ 1097 0 R /XYZ 79.822 158.645 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 163.175 null ] >> endobj 1128 0 obj -<< /D [ 1097 0 R /XYZ 79.822 130.75 null ] >> +<< /D [ 1099 0 R /XYZ 79.822 137.272 null ] >> endobj 1129 0 obj -<< /D [ 1097 0 R /XYZ 93.716 83.466 null ] >> -endobj -1096 0 obj -<< /Font << /F15 199 0 R /F59 211 0 R /F82 249 0 R /F22 228 0 R /F81 248 0 R /F74 202 0 R /F65 200 0 R /F79 227 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 1099 0 R /XYZ 79.822 126.314 null ] >> endobj -1135 0 obj -<< /Filter /FlateDecode /Length 2778 >> -stream -xÚ\ÉŽ9½×Wä˜&ƒÁ
0 -°JU
ômf|kô©Ó—ñaúÒ¿?Ü×””}+•"#ÁØHšüøå…—¿L…'ÿï//—o/Ÿ?”;9+$ßþó"|#~ˆÃ*VFƵ8¾}?~û¹FÎø¿—×ß¿ýZ1?X8,sZKÛƒ8Ã؜Åsñ¾¿~R ¼«0½
¿J?úwxõß?òwÿ¬]jþ"$4¼‰‰¸ŽÑG\*·…˯$.… -ÝbÔq#Š_y»dÃÔJîQ1€(µM„ÖLËÅHI4Žš¿Ž&”fÏl—ð6͸‹„ MÛeE)¦Íbçñ}•E9‚ÉôC1~H}ŒxµÉ8x3€ø%éi4Ûu±¥—Íf%9€ò6NUœ¶W0á{01¸•Ò>½ ßÔlªâïJzÊtû¥¸Õôk ÌòOÑ’ÃÐÑ@& -‰ØôÖðdýÛ¯a€ -U[fžø[ ©9m1²Ctg²E¯ŠJá,]©«ÇWâV¤ „eZÔ¤¾Æ@%¶Ïq×]ΑI¥g”îH¹ÄPR~iK¾,é¶=ã•·/zÌ]â:¶[ëx¹½C2ZÊA´EÔ%96IEçý2_<Îf8¡œY”1q•*;XwÞƒž^)- óJ=Ò‰dLRËNä–»bõ
®œ˜XƒfÂçÊ-2µNC<}ÎZŽ.'$Â"dh.aÇ^&MGQ cs¤¦žš&ƒÌØ% fþešFØ'CKf[p_È fí…Œ%ÄÐ÷FŒUwIUÀ¬£—¯ÛYÀ„²¡b(žr=“1Ê=àབC3ì•ý'gw¨–´çPF}Úšï.]¸Ú‹˜'”ÇÖ¼D%+Y‚›‡-ËnAˆ·® -ý˜‚Òz°ÿpíSχËÆÎ"Ëýöõ˜;æCêY`S2pG¥³Œ/j¼„Œ·µUžuÊ¡†ÆJk˜°hì^ü1¡<ÖØ(Q²jh¸¦“b‡P4(QxœHš‹¼´1%P{¡õ”ÒzÕ6ו5®uÜ]Q\D¹sL(7ÉÏ©zLZ3ûÑÒ`B€Ö%Ì4üÒƒ.´’„–D074µ*=K^ú„ ´bÂáb4ö¢ž å&¹¦éV+û'#B`ÖìØöÐ:¶ÌÕBKgðd£æÉhÊ‘ê.IÄ5ÑwO N!¹_›qâ„r“ìlRéaj ïÎÐ]l+—>…äÔqרբGW¡&¥ô”ÕrW0(˜!•ŽÁŒ(·H
®W~´}#šÁ);Muëëq\É)Æ
žìUƒƒ›«s?c’˜fžðÍBù„B¸Û1ÎUö%&• Þ,©O(M#žp†%Zž+ÙEé¶XéŽ
ßZ\1öcì»mKM0Ç$Ðêñ%^ù!aΤs‹0¾R£npŽ!Îý÷Jø#Æ>$¡•åÞ‚µç£n°–¡{GS&‚¾w§¿N<bù•ÇøšžKZªÛ)ZF‹Pôü7´V¢Ûw5»€\tWm`&”{äÖóÐbÈI1}Šzz‚-ô;K‚ðÒ¢rÚƒæÄjr”•trµ»"Óš)½˜jbTD6¢I·ÝŽ×V¢Tw“Ym7˜#”Ý¢Ö†gþš@wEN8qµÀ½#_ÊÝì0§ÖU'»²ÒFÆÈwâçšzÙní‘©â‘jñk+YÃËÐsW<ˆLãOoc›P(Y£év•kÅÇQ3I ã¹úʹ•‡ÒLe=8OÝõ–Ï&)™¶c4n·7&”{äÒ
Z4Gä4=gúJ;vÇEèåo„óÀ¶VƒÈH:G‡1C?/î -€°³0©©Uæˆr—-ÓÔŸû µ®Så¨=æRm“§p§µyj„`F»YHÔt²iD¹Gª„ærKÄð–êòmluÕNšðŠùÄ®>ºÑs«u٠ʼì -s6%`vã>N–ß -áX7jsr9µOðçsú§ã“<7Sðä½µ[\BØIµ8
âÙ‚xé¡F*v=2ZØyx-#NÅ0C§×2"ØØi¾e™ÚL4˜/=PÚ¸N
Ó"-mje“Ç»–‘ÁQ\õ¢EüÖ§_í.,dÎ>æ«:='ŸþËŸ -êêRë—ËXvödE–ã……ý]}…ó•Y…_Æý„Âz¾íWë¼&pî&²~ðF'Ÿþ§›W0ôÜÖ|ëz¾×[ÿÀôëè -endstream +1130 0 obj +<< /D [ 1099 0 R /XYZ 79.822 115.355 null ] >> endobj -1134 0 obj -<< /Type /Page /Contents 1135 0 R /Resources 1133 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R /Annots 1188 0 R >> +1131 0 obj +<< /D [ 1099 0 R /XYZ 93.716 84.362 null ] >> endobj -1188 0 obj -[ 1132 0 R ] +1098 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F22 228 0 R /F81 248 0 R /F74 202 0 R /F65 200 0 R /F79 227 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1132 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 256.954 625.531 267.381 638.135 ]/A << /S /GoTo /D (Hfootnote.22) >> >> +1137 0 obj +<< /Filter /FlateDecode /Length 2673 >> +stream +xÚ\ÉŽ#¹½×Wä4›Kp +”ZUÌÍvßsÃsqì‹ßîKJ +ªç .)“|c#³ùñçÁ_^xùË4~ÿþòrùþòõSû˜wBÉãû¿^DÄq8ͤӇ5‚q#Žï?Žß^97À¹–áïûÛïß=Åœ4g‚Ë@ùà맓‡cÞåz*¼e^º\ +¸†+×t×ørGAùºŽ®ßŒ¨×ÂLð%"l•Æëu„I¤w<?¢”L+µÈÀmÉ`¹-ãÒ©VÞµêù”€êy“¼JÉ"ö*)ý‘æái0ø[¤~G¼ôôö;Òúñ¼üŒ÷,F¨wä7Ü‘_¸ª!sîªð(Ù¦>óïkã4r(\;™ïr逴…K q)„d|¡h±×^”Ä5}Iå9kZ®rÃ4h~µ³FÓµû†,ýúðU‰jk¬ZÏ”=ŒÖ y¦ O)}û¢”B
ØLŸ+Ú~“.\·²ñ¦.ùINœ=I€`^˜ùY
‡ÁÂ)‚±Ì›ÚGýÜåT8Ãœ^xEêͧáå +jg’EÕe¹‚3”-¿¢ŒŠLdÖ¥Û¶` +’°hB®²„DbAWBâ„ò-i
‰zŒe?AЇšc
g°GÆ„ò—Ta¢*¹dMt¶À«à/éîe³ÈílV–eSLõòLçB">v+B“þ¤kq?= +œ9¿ø9b±XÂr§•É[“M¤˜L)õŸ-yA…¨£ÜÀÅûvU9¡œy¦±Æª‚Á#ùó‘€ïJ‰xtLð$Ì+õé‘N c’Fbb’Gîª5„OVç¤Vj•.
VÎ(·È4&}ñô99†.,ªV{>aÇY6‰£˜„(Íy\1ú)1ñeÈYJÔ&B‘Ò +’Ž¢‘yŸ‡b[Ûm(¤ ».¶NºV +-1)
¬l–»Š±–i³b¨YqQ̈r‹T¼ê³u€h§ìYÕM´Ç3r·¦87ù䬚Ü\ûnhï5Ü'Láng8?·C µfÚ›eéîµæ'”¦ƒÇùž‡‰žçJQ¦-Vz`ƒo-«gŒ9ö]A»Ò̉l}ý’ü”2 +ùcÉ2|kð>›uK)™K®¶yÐeB!XáGw–ì$&–û´¬<æ×ôjÒQO±3ZŽ»ïä +GkÑN¢=l„`ã6”rôz)w`F{ÄÖ“²;‘‹bº€zzy‚Š–ú•@piÙ@97Bbµ4Ê&:…Ú]…qγƨuQÑ؈B&Ýuûf[…RÝ“òd%|¶=9b…üYv„vF[žùk +ÝT žéŽU•l›PîV‡¹°®6Ùµ•6*F¾“?×ÒËuk\H•xT›_[Å\†™»ê±.-šÕ³w nB¡T¶Û›®ýO$•ÏÐWÎ:”æ*ë<ùÔ³»Ùê¹Õd0£Y]››Ê=ré-º£Or™ž«Ns¥ªºc'ôö7ÈóĶvƒÈH&熱B?oî*S›ùQT¦ÛSæˆr—-×ÔŸ¡®¢òÔs«‚¶ +‹ËÓ°3Ú>µ»+ÀÌG¬¢ƒÔ{JQd¹¥Oby+õ-YD›E]·“¦¼â>¡ënÌÜ]6ˆ2/» +TšÛZ{ +QíŽ÷ÒrMFS©†ñäQ€Ðbn¿Ó†³iEEI ‹½ô¡~ú%!qç÷¨ö7¢<"×òNDyÅÑ”Y„\_‚¤ÍÚJ}úÑû金ãa>¢"åØ8è$²«P¡˜XRMj#¤ès +ÝræZ6]OF_ƦB +²œ-CòZÃ|„YÃëØ-*¬ç÷BïZ]°ÎýDÖO¾ùçÿ˜àæ«1^2£ÍoKt=øõØ^ðÿOh@ +endstream endobj 1136 0 obj -<< /D [ 1134 0 R /XYZ 78.37 808.885 null ] >> +<< /Type /Page /Contents 1137 0 R /Resources 1135 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R /Annots 1187 0 R >> endobj -1137 0 obj -<< /D [ 1134 0 R /XYZ 79.822 768.829 null ] >> +1187 0 obj +[ 1134 0 R ] +endobj +1134 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 256.954 559.565 267.381 572.168 ]/A << /S /GoTo /D (Hfootnote.22) >> >> endobj 1138 0 obj -<< /D [ 1134 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 1136 0 R /XYZ 78.37 808.885 null ] >> endobj 1139 0 obj -<< /D [ 1134 0 R /XYZ 79.822 718.235 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 768.829 null ] >> endobj 1140 0 obj -<< /D [ 1134 0 R /XYZ 79.822 707.276 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 757.87 null ] >> endobj 1141 0 obj -<< /D [ 1134 0 R /XYZ 79.822 696.317 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 730.302 null ] >> endobj 1142 0 obj -<< /D [ 1134 0 R /XYZ 79.822 685.358 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 702.733 null ] >> endobj 1143 0 obj -<< /D [ 1134 0 R /XYZ 79.822 674.4 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 691.774 null ] >> endobj 1144 0 obj -<< /D [ 1134 0 R /XYZ 79.822 663.441 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 652.25 null ] >> endobj 1145 0 obj -<< /D [ 1134 0 R /XYZ 79.822 625.619 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 641.291 null ] >> endobj 1146 0 obj -<< /D [ 1134 0 R /XYZ 79.822 614.66 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 630.332 null ] >> endobj 1147 0 obj -<< /D [ 1134 0 R /XYZ 79.822 603.701 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 619.373 null ] >> endobj 1148 0 obj -<< /D [ 1134 0 R /XYZ 79.822 592.742 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 608.415 null ] >> endobj 1149 0 obj -<< /D [ 1134 0 R /XYZ 79.822 567.018 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 597.456 null ] >> endobj 1150 0 obj -<< /D [ 1134 0 R /XYZ 79.822 515.428 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 559.652 null ] >> endobj 1151 0 obj -<< /D [ 1134 0 R /XYZ 79.822 504.469 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 548.693 null ] >> endobj 1152 0 obj -<< /D [ 1134 0 R /XYZ 79.822 493.51 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 537.734 null ] >> endobj 1153 0 obj -<< /D [ 1134 0 R /XYZ 79.822 482.551 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 526.775 null ] >> endobj 1154 0 obj -<< /D [ 1134 0 R /XYZ 79.822 471.592 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 501.145 null ] >> endobj 1155 0 obj -<< /D [ 1134 0 R /XYZ 79.822 460.633 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 449.666 null ] >> endobj 1156 0 obj -<< /D [ 1134 0 R /XYZ 79.822 449.675 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 438.707 null ] >> endobj 1157 0 obj -<< /D [ 1134 0 R /XYZ 79.822 438.716 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 427.748 null ] >> endobj 1158 0 obj -<< /D [ 1134 0 R /XYZ 79.822 427.757 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 416.789 null ] >> endobj 1159 0 obj -<< /D [ 1134 0 R /XYZ 79.822 416.798 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 405.83 null ] >> endobj 1160 0 obj -<< /D [ 1134 0 R /XYZ 79.822 405.839 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 394.871 null ] >> endobj 1161 0 obj -<< /D [ 1134 0 R /XYZ 79.822 394.88 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 383.912 null ] >> endobj 1162 0 obj -<< /D [ 1134 0 R /XYZ 79.822 383.921 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 372.953 null ] >> endobj 1163 0 obj -<< /D [ 1134 0 R /XYZ 79.822 372.962 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 361.994 null ] >> endobj 1164 0 obj -<< /D [ 1134 0 R /XYZ 79.822 362.003 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 351.035 null ] >> endobj 1165 0 obj -<< /D [ 1134 0 R /XYZ 79.822 351.044 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 340.077 null ] >> endobj 1166 0 obj -<< /D [ 1134 0 R /XYZ 79.822 340.085 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 329.118 null ] >> endobj 1167 0 obj -<< /D [ 1134 0 R /XYZ 79.822 329.127 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 318.159 null ] >> endobj 1168 0 obj -<< /D [ 1134 0 R /XYZ 79.822 318.168 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 307.2 null ] >> endobj 1169 0 obj -<< /D [ 1134 0 R /XYZ 79.822 307.209 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 296.241 null ] >> endobj 1170 0 obj -<< /D [ 1134 0 R /XYZ 79.822 296.25 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 285.282 null ] >> endobj 1171 0 obj -<< /D [ 1134 0 R /XYZ 79.822 285.291 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 274.323 null ] >> endobj 1172 0 obj -<< /D [ 1134 0 R /XYZ 79.822 274.332 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 263.364 null ] >> endobj 1173 0 obj -<< /D [ 1134 0 R /XYZ 79.822 263.373 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 252.405 null ] >> endobj 1174 0 obj -<< /D [ 1134 0 R /XYZ 79.822 252.414 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 241.446 null ] >> endobj 1175 0 obj -<< /D [ 1134 0 R /XYZ 79.822 241.455 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 230.487 null ] >> endobj 1176 0 obj -<< /D [ 1134 0 R /XYZ 79.822 230.496 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 219.529 null ] >> endobj 1177 0 obj -<< /D [ 1134 0 R /XYZ 79.822 219.538 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 208.57 null ] >> endobj 1178 0 obj -<< /D [ 1134 0 R /XYZ 79.822 208.579 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 197.611 null ] >> endobj 1179 0 obj -<< /D [ 1134 0 R /XYZ 79.822 197.62 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 186.652 null ] >> endobj 1180 0 obj -<< /D [ 1134 0 R /XYZ 79.822 186.661 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 175.693 null ] >> endobj 1181 0 obj -<< /D [ 1134 0 R /XYZ 79.822 175.702 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 164.734 null ] >> endobj 1182 0 obj -<< /D [ 1134 0 R /XYZ 79.822 164.743 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 153.775 null ] >> endobj 1183 0 obj -<< /D [ 1134 0 R /XYZ 79.822 153.784 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 142.816 null ] >> endobj 1184 0 obj -<< /D [ 1134 0 R /XYZ 79.822 142.825 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 131.857 null ] >> endobj 1185 0 obj -<< /D [ 1134 0 R /XYZ 79.822 131.866 null ] >> +<< /D [ 1136 0 R /XYZ 79.822 120.898 null ] >> endobj 1186 0 obj -<< /D [ 1134 0 R /XYZ 79.822 120.907 null ] >> -endobj -1187 0 obj -<< /D [ 1134 0 R /XYZ 93.716 89.795 null ] >> +<< /D [ 1136 0 R /XYZ 93.716 89.795 null ] >> endobj -1133 0 obj +1135 0 obj << /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R /F16 201 0 R /F79 227 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1191 0 obj -<< /Filter /FlateDecode /Length 3400 >> -stream -xÚÝ\Én$¹½÷WÔ4›î€ KR5àã o†¯öi.þÿƒ¹/Á\ȬòÀð -Ú šÍ¯–Wš@q‹ Ÿ`Á?Íïþî„vNoPC£Ò3}JJ…AŸ?—ôÙƒq©õá“F™éÌ5Mši9?—ÝϪGžtœe˜å’µlÀÎ Šl{—¬Â?ííË[C~ê…:ã–0Á±Î¸]ÒY²ÊÉs:igÀ£ßƒíçÝó„š¼ö/"É„ ^¦?0„1èÏ,鯙¡xãah”M–S°N¨Üùý™}Ù„ŒtD:Sõé‹Ï;ú^ŸÒ—c€øˆgÿ"2M -¥SõõªÄÁ)–øZOìqPk -¿C|ÅÙJý¹Þ
øê3çù&i…7ò¼×|ùº–ü*¥ùY#Íd÷cU;Ìiå ¥Ž9ÒN鳪Z¥x -x6/˜•»7¹}E]<»r[©©ÏêqV^Õ&ÕDq5x·¥Þy×%¾\飼º÷²”ì9!_ßw½íø¿á\ó5“V¥õ ±¥~9ë|uôžÛ ¡6…´Ç¾êd¥µ×ôí²fž\iU[îS33xË¥9ë.…ìáÞX9¼¢~·^Û³õ¹xÛ
)¤—M=¤DNouÑcÌöb¼õ)¨ý¸O÷g&:Ý9¿^ç9¯4Ùé;'uùÖìÖµ¦81´«s9Ÿo]¸ Å`ù59xý*ì«eÂ%# -ôFŒá`²f´šX0¤ÍzcíUÌÕXƒÏE”Ÿæ"² ÊÝAÇ•:É÷~õÓ'
Õ¢BNÝ*'?Mó7Åj^èÎ{ñ#ó3>3Ïo}æœ_)»½µnHœ:UŠÁ~N³Î>$˜,²!õ û†4³¯ÊpµIóø º°Ñ°Ö”Ã\·§ú,#èNö*ßXlûÓöÈó)¡ƒ¼<˜¼yY‚œµ%\ß„åDó¢l‘㌿ÅhúÃ6V˜YtîPž¦t/{ð¦ÙÌAÑÉö=îÇü[A*9sÛ«ÃwÐþë4£K´ÅÝqÀIÌ[r-÷æ0J{K€Ó*‰J‹-Qqp…$gXXÀ̹r®?”éݲ÷Hà#s“=†çÛÿU¿Å»y‘¼U}T^sí–£=6ÔÄnîʵµÑ£ÕG½·YÃ3‰¬Æ0¢uɹ®[)nÔÈ—†¶ÏáùŒ~MZ]šUÏå2Db†8Ù4H~§ÇØw;¸Û>Úú•X¬‹MÕë›Z¥vYÜWëUP,C礙¡z# 9ñ BijñaÛ”|Ç:ôhq%öVbwD µZîÎÜ·0S†a0B–‡§Ñ‡Òûíˆ{`>ų±pe¢µD4¾(_ê[-åjPDyìÑ4'J ÙÞÛ‹oð<Àë\A¸ÓÿÆuþ-8ßð-»]1ïƒX2†Ü¢!4³ŠÙm¯—ŸŠ¦·å`8ÅkÙRÅw© -ÀGðÖ.s%›÷Aí7`ÈHvñc½‡üñPÛvâ2b¥ -|„2Ùåý·ªÐ³ªs‹VãÙV‘„/Êv!Ïø¹ÁíZ^Á]ŽImW™„ -‡¾pÅ…†UTYç¾ÈuªE«ìl±=J™¢Î(¥² ”…ÆK;\ÙψÞKÁ¢O”v-RÒ•®#v§·\¥ùis¾<Tlå‰JÉ,ÃÕ>XÆK÷ý¤’ÅV–Ré¾bÊ‘½FE›,ªàº -ɉ -ÓÞÞ‹ñ\H¢ßª„°¯ª„Ë^k¥:Ð.®{3B;ïÄþúIu ‰Ë1`r‘u\ôñîV„¦Rëìâ=YuåÈ÷î6=ú“h¶¢] -aí;£|å"¨¯–Fr¶ó]Û`êìÝÀ[fÖ¼åB!ÑIëÖHBLÆŸøÙ)˜AnX*÷õ\å#›ÁIÛžðÌçŒ%¶e&üÝq‰ê‚‰ "$ùÔÃ0äÔcÃOv¶PøgÛ'ƒö¶Âéc£ ”›D¸ºcÓØ{ê•–égG™Š|&®ïGÅÙyíVÓ/¡&-bßgãÏzîúfÙiáWš‹]áÇ -¿dVàŠ"yµìcÔkÖ`”eMÀÛH´•¼ák -†¤òÐõQW—)5p¾\:MÅ_S¢µœ×yë4„ØÔÆÝ•èó_ÿøÕìrF´ž
I÷g¥(9äLIyÚ¸*Jðƒ•e“jC„×øœ3Y€³PÅÅ%Y -$«ÊîoýÑÿàd&þ»x,\ŽP¦æsÞPXÓl„vÊPº<BAñ]”ú²œn£íó[…N‹]ëËÔÝø÷xÊûƒ¥Q†f‡eº4„a¥==£¡\*çêøÐÔ4ÿG¦¹¼PO«¤¨½{뽋ÍrQEtm4S˜£¹JÈÃÃ+cWJ!ü³Z´Q"[î}0?ƒ´2w¥[¬ÂÕv¼Â
³dº3^‰™¯Dèéó¥ÚÕµj“nåtrôÆa]ù±ŠàU“ùèN<q´Lß²C„nèQ¤—í±ì¾ÍÓºvb$1š®D7oÑ´£0*§'àþn1?mLwo¬ödóÏ¥ëÂ2ÄÔ‚žCÁ¹˜ ó‚©géí¦ñÒÌô#Þ‰§ñêäôƒ[îÔÇ¥‹ãáhÊb#XŸ~D
b{ýì#Ú¬b€µí¾2ÙâtˆtÁ.9Ø&Ì(D楴Ÿð´a‘Kt“N¤›‡0é‚5Jåª;Ž(]´Fn\‘M1Èk¤œ5ÈíÚ‘!¸3êS›Û˜&í&ªqe§ÛyˆÄÚq>"IRé¶@·Úý¼?vß4WÑq#ƒåC½(³›<6Ä„ËÔ\†Ö/ºt`ˆ<s^Dn”f³#í'>J*gGÄÖ·0ÔÏ¡çòõûÛ +1190 0 obj +<< /Filter /FlateDecode /Length 3108 >> +stream +xÚ½\In$7Ý×)òf‘Ÿ3 P*•xih×èm÷ª7}ÿ…9Ÿ11"]de†"ÿ<‘Qôöß½ýúAóo"ý'÷ÿ_?îß?~>¥½ b
ãpûþÏæn¢7v3’€‘7¡ŠÝ¾ÿwû×¥J¸I©¶ïÿþþ³`þ|¸b•â¦aL-5F‘öý ÒâåÓáRJÙ§[ÁýV௕¿®=a(þNÑÞ
H]Ãé›’F³)á›T. +ëÏe›d•%ê«…“r0Q¡8íkê3E7^ãR‰Á™®®’g65EÄÝñõ×ä0iQZ:š‘ 3\æù —äùzDoi9:†È&¬9Z¾P[î·ffˆœSSr†ã‹ñ+^D{VïSK:~ƪ£îœÕ—Dsn¨Ñc¬nI\’¡nf:^ǹNV§e©› +1XÎW\¡LÀàP=+oʼn¡lˆfS# ²5Mm·|ÇÙJýÚä>ÒD?´ÂyÞk½|^K~•2‡|Ô<spú1« Ĉ¡[›8 ÍÉ9³€Ü¥xæ;þËÍïu”ʾ¢/>ºrÛ©©G·+ÏjS0bL×ýr>;{@ ¯âºd—óótU}¯ÝÏɱ+ÌŽáUèílÅÿ
Wš/ҧĂÀ››W ½ÉçÖDïš'„Þ’}Õ}•Ö6^3·Ëš¹¸Ò¬¶˜uJX[s3 +²7] +Õý±rxÅ|+o½vf«L?
)“¤—íyHj‰{vÐÊÔìÆä=ù<€ûá ÍYw®ïCܹ—Îú‚ï<êÁ›ã–6ÔFXCœ±a½MÍ@(þ¨Í¡×Çk„Ñ„3nŽ¯Zv°X9s¼¬¯‘¹ƒ™³Í‘›ôiñÔKït\©³|ïW¿ÿ¤¡ZT¨ª[åä§iþ¤XìÝÙ?3?ã3ÇùÏìó+eç[ó†¤$aƒ ^tËŽ¤ À`0D>eG=È•cZÍîjSæýƒÁF»šÓ
sÜšr꧲Œ +å«Bc15VÌOÛ-ĊP„òþùdòæs;(ÑÊY[ÂõM€‹W˜cœñ·˜ŽË1 g„;”§é3ÝËž¼D6¡è`{ŠŒÝ1+H¥hn‡buËð´¿Çú»á-mÒ%Ú¢sgp’ó–"˽9‹ÒÞà´J¢ÒbIT‘œaaÛ0çÊu,ø¡Lo–½GŸ™›0<ßþ¯ú-ÞÍ‹¬àê£òš›·œì±¡&vóP®mŽž>ê½ÍžId5L.KˆàººRtÔÈ—†vÐáùýš´º4Ó‹ +ÂíŽ
ràéAÖ·Ö~&Yë’S
û¦6ª]÷ÕƔ̖÷îR½P…lÇ®5¶Ö
¦±NÉWìCöW2li%&Ày‘Äk´< ¹o:1S†a0B–‡§Ñ§‡2Ž·Å=0?þ³±pe¢µD4Ñ(_ê§-åjPDyìÙÌ'JÙÞÛ‹»¸€…`îô߸ÎßBø
Ÿr`Ðó>ˆ%cÈ%Â<«˜Ýòzù©hz!†»"DŠzL»¥Š¯Rþ2(€ +à]æf6ûA9`ÈHv‰d}ŒüùTËv"Q +0K²ÝbªÙ´6¥p‹Qb4MñV•rfËÀX—Îz£ÅœGp?¤ãjàT•hŽ”,))Ím.¸2
í‘!øL!œqóÏüßÇòüå/Ôõ"E|-kú•L§O+D2Ây¥t!L¹ÿ´OTÎ8x&°¿¸E¨TD*Ö£{1„“p' ¶Ü1(΢<žV9·D‰n¯D|žß¦´Š@öÓêJ@>ýÊ…/â”ÌÅä+4å@>T÷O5Ÿ{ÍæÆC" _”׉êâcÛÉjÂeUÍMÛ‘„´ +'¼pÅ%„PKTYmW~(íÐÑ*+¶F)SÔE‚¥t4²0Ïa)]‡+ëuÐ{iTBΉҮÍIº’tÄîô–{¢´qÚ+Zy¢R2¤ÈpµO‘ñÒ}½!©¤F±•¥Tº¯˜rd¯QÑ"‹j)¥.—ƒBr"À +8^ +gm`ù€°ê‚GL—2¢›=*Ù×x¥I+5ItµZd¼£%_‰çErkÔ–¡RLßj ÅPëÛ‰‹švs*_-åY¼GU‹\VaòíµÌ®&6š/õBØWõÂUD +¯5Óh—Ña„•—âX}§'ÐÄU0†È:®û{øp+Â0©
vñž¬ºòæä{W‡ýttð¡]aí;£|6åâ»jéÔˆœíü¡m0uönà-3kÞr{è¤Õ5’“ñ'~VÚ¤A–êjUÛrÊ®#›ý’v,! V,qs Þm7¦.™(Ž I1u3
9õXÁð“-” +È™’ò´q]”à+OÊ&u†¯‰9{² +Y@HâG ¿wä »
Bœ·}×J£°¨Žîh%SëA¤þ·³Q`0GŸ'"zÞÜgUØ“{,Ÿ°›:Ìy¤MDIusñÚêZâ|åÍ×÷¿Oçvä endstream endobj -1190 0 obj -<< /Type /Page /Contents 1191 0 R /Resources 1189 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R >> +1189 0 obj +<< /Type /Page /Contents 1190 0 R /Resources 1188 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R >> +endobj +1191 0 obj +<< /D [ 1189 0 R /XYZ 78.37 808.885 null ] >> endobj 1192 0 obj -<< /D [ 1190 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 768.829 null ] >> endobj 1193 0 obj -<< /D [ 1190 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 757.87 null ] >> endobj 1194 0 obj -<< /D [ 1190 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 746.912 null ] >> endobj 1195 0 obj -<< /D [ 1190 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 735.953 null ] >> endobj 1196 0 obj -<< /D [ 1190 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 724.994 null ] >> endobj 1197 0 obj -<< /D [ 1190 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 714.035 null ] >> endobj 1198 0 obj -<< /D [ 1190 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 703.076 null ] >> endobj 1199 0 obj -<< /D [ 1190 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 692.117 null ] >> endobj 1200 0 obj -<< /D [ 1190 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 681.158 null ] >> endobj 1201 0 obj -<< /D [ 1190 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 670.199 null ] >> endobj 1202 0 obj -<< /D [ 1190 0 R /XYZ 79.822 670.199 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 659.24 null ] >> endobj 1203 0 obj -<< /D [ 1190 0 R /XYZ 79.822 659.24 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 648.281 null ] >> endobj 1204 0 obj -<< /D [ 1190 0 R /XYZ 79.822 648.281 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 637.322 null ] >> endobj 1205 0 obj -<< /D [ 1190 0 R /XYZ 79.822 637.322 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 626.364 null ] >> endobj 1206 0 obj -<< /D [ 1190 0 R /XYZ 79.822 626.364 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 615.405 null ] >> endobj 1207 0 obj -<< /D [ 1190 0 R /XYZ 79.822 615.405 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 604.446 null ] >> endobj 1208 0 obj -<< /D [ 1190 0 R /XYZ 79.822 604.446 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 593.487 null ] >> endobj 1209 0 obj -<< /D [ 1190 0 R /XYZ 79.822 593.487 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 582.528 null ] >> endobj 1210 0 obj -<< /D [ 1190 0 R /XYZ 79.822 582.528 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 571.569 null ] >> endobj 1211 0 obj -<< /D [ 1190 0 R /XYZ 79.822 571.569 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 560.61 null ] >> endobj 1212 0 obj -<< /D [ 1190 0 R /XYZ 79.822 560.61 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 549.651 null ] >> endobj 1213 0 obj -<< /D [ 1190 0 R /XYZ 79.822 549.651 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 538.692 null ] >> endobj 1214 0 obj -<< /D [ 1190 0 R /XYZ 79.822 538.692 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 527.733 null ] >> endobj 1215 0 obj -<< /D [ 1190 0 R /XYZ 79.822 527.733 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 516.775 null ] >> endobj 1216 0 obj -<< /D [ 1190 0 R /XYZ 79.822 478.588 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 505.816 null ] >> endobj 1217 0 obj -<< /D [ 1190 0 R /XYZ 79.822 414.632 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 494.857 null ] >> endobj 1218 0 obj -<< /D [ 1190 0 R /XYZ 79.822 403.673 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 483.898 null ] >> endobj 1219 0 obj -<< /D [ 1190 0 R /XYZ 79.822 262.276 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 472.939 null ] >> endobj 1220 0 obj -<< /D [ 1190 0 R /XYZ 79.822 251.317 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 461.98 null ] >> endobj 1221 0 obj -<< /D [ 1190 0 R /XYZ 79.822 240.358 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 412.167 null ] >> endobj 1222 0 obj -<< /D [ 1190 0 R /XYZ 79.822 229.399 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 347.41 null ] >> endobj 1223 0 obj -<< /D [ 1190 0 R /XYZ 79.822 218.44 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 336.451 null ] >> endobj 1224 0 obj -<< /D [ 1190 0 R /XYZ 79.822 207.481 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 193.985 null ] >> endobj 1225 0 obj -<< /D [ 1190 0 R /XYZ 79.822 196.522 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 183.026 null ] >> endobj 1226 0 obj -<< /D [ 1190 0 R /XYZ 79.822 185.563 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 172.067 null ] >> endobj 1227 0 obj -<< /D [ 1190 0 R /XYZ 79.822 174.604 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 161.108 null ] >> endobj 1228 0 obj -<< /D [ 1190 0 R /XYZ 79.822 163.646 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 150.149 null ] >> endobj 1229 0 obj -<< /D [ 1190 0 R /XYZ 79.822 152.687 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 139.19 null ] >> endobj -1189 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F65 200 0 R /F75 203 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> +1230 0 obj +<< /D [ 1189 0 R /XYZ 79.822 128.232 null ] >> endobj -1233 0 obj -<< /Filter /FlateDecode /Length 3125 >> -stream -xÚÕIŽ$7î^¯ˆX–H@¡€ÎÊJ¾§o†OŒ/Ó‡ñe¾?Ô¾EDFÔÒvHgV„D‘wQÍ—?¾üôÀÓ÷åëÃ7¡Çœ-—¯ÿ~ô‚/b1Ž¡YŒŒk±|ý¶üúÈ9 -Îä\<s./œ+ú--=Îáùé·¯?hÎ$}ôò§_#ÿñËO´’Y]I€bÂØi-ù洆ðk%Øm‚$W!IÍÄG›‚—¥1 +ÿ“p*3•`ˆãTO¢'U;BçÖ¡P&` `gÑ“Ì0†I;Á“Pîâ£Ý!¦ -”ÝŠ}Ä*'òhyš$™Q²H’„;ÿ9Dà†¡„ŠT!Uaùu¥Û?Ëo¡üRž«*j—¡Á*ÉpóïËH}šl¯tNd+8F¶ÐÌ(3BžÒ"îßK¿§…¼2fI^Î=iždyšçŸyv…oðäo°ê¹&?NÙù™†¯7²QH¨G6êË96öPÞÎÆ^ÖÖÇ;ÉÜ7€mÿ¡‰O(‹€hï+n‘”ø7ÄãâáË´éxñÏýùWG“Ç+ŒxE“œôçš0Y÷dÂY¦qAýdñ1S÷ô8ûXázÁ¹;Æñi†°Žaä1rÝ¡Öµ‚³)Olò‚ÃkÆÒƒÖ1AÄ'ïRQ“5s0B,êe«dH¨°‚tÔ¹*Ê@qkð‰6rØqƒ]åKN,‚ÌâÊHbŠÂñ¨ÂÆËÌBáLXœS˜Ãóœ`'ø± -sƒUðÛrËsýXñüæÑ“ìŸÂîö{ðV†"l«OÖÏÀ273.°Ú–u®qvš¼P¨Vˆ¶¸á×í-Y[DeuI•Š5¥ -™C1lWpÃ2ËÔ®VI£™’zÜï@Ýß½¡¡ØDbqŸÁ8 ‚$LX u'º]¸ÖwèwRJ¼Ç¡,3õ
«Ÿ`‚°’)1AÈ*#™AÚ…yUjÄ;ªv~zTÙ#ä"
âŽô†½‘ÍN…Ðì\–S¯»æ±â´&Œ.r;r>½Ï:u ì+´èùâçg‡iom5Š¤iSÍß/_þ[ƒ]ò¤jÑŠ3.Ìòû·‡_£7ÿ¢ÏÏäÒ3ËÿÂØo‹ÐšiË—ÿ,ÿ|øGL†6bhM1´!mAˤ*ÒîÝsËÕ˜ --„½ß¸—ªŽž ôÚ±Ž4s\OHKg_…4p†œ„H8‰îébÅSð xrþy‡½¾=|)ô¨ëÊëk§Î -aÛˆíjœµÊ¤úàuTõLÛ®orþFOøû¸5ª‘_]¡ {’cçúÆð'¥šô^BñÅ,Å|²Ì2Çø´Íà’b‰€‘YÅÈ@S‚°ùÍ›9¬:2Š25ªeŽ({8ÁÜšä§47< ?ït%Y¹cå5´cB‰¹ÆäûÀ’Tõ©ðÖ}HŨKdy儾¶+n‡Å€o =J2]V½fn½YŒž³7II9\¼”dëŒj—_ÎÔñ{ÛeüwTáW—ú¥¥,ÄH0ºSÅÚÊýòk°Õ¥V-Ö£ÜP»ÞeCÊŽNW¬¥¡ -ä=ÇIÔ9ÆöPΔù{–Õ™Þc|€ð’é]–¯½õ¹‘:}š(•bNNçoZžc[åÛÌG©çdIúwÓéÜ,µ -hÇ´Äq[ð\wô -ÃlÝ4Ì}u`Þoe -'ÏiäµiµñÄË©ëæѹ!+0!õû*¶Ž
+M½ÎôÜÿÝž5âÊ¡+/
JbCþq’ì4vj£ïœâ\±ÑpIZžjЕ‹›n7®“šô(5#›/ýÂù¬;^<Y“®˜µ5Ày‰†Ê6HÄæú;ܹk²9ÌÇÒ@'¦º Î:7ÞUba‘#n$‡måû‚"‘9A¯Íy¢k„¡?´?í˽~ºq/ø ühL1®6 ?~?ŠÈÔ·&>FY9Ž&>ío·ÿíÝœt9j–=á#3µ×‡Î…ÜÓ0Ù/?¶í„˜{#Ö¥¢¶jvaêÌ”ø¬©¥Äo -¦9ú.·wðÖ¾íb׈–Î"²V$´wW@Í(I¼kÎùº5âÝØéÞë&iJNw_çÙmj¦š9Bäd{¼…ج9G -ñv«\kBŽwt˽\Ù†Ù&幉ŽA¬Jº¯b;”·öJn+wúöT Q†[4ýIQö0óÊÖ©˜
7ÿv±¢LNJ;bµ~ës3étÀ´Ò‹$Öƒ(ŸA
5k²Ùÿàhw° -endstream +1231 0 obj +<< /D [ 1189 0 R /XYZ 79.822 117.273 null ] >> endobj 1232 0 obj -<< /Type /Page /Contents 1233 0 R /Resources 1231 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R /Annots 1268 0 R >> -endobj -1268 0 obj -[ 1230 0 R ] +<< /D [ 1189 0 R /XYZ 79.822 106.314 null ] >> endobj -1230 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 244.87 560.612 255.296 572.783 ]/A << /S /GoTo /D (Hfootnote.23) >> >> +1233 0 obj +<< /D [ 1189 0 R /XYZ 79.822 95.355 null ] >> endobj 1234 0 obj -<< /D [ 1232 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1189 0 R /XYZ 79.822 84.396 null ] >> endobj -1235 0 obj -<< /D [ 1232 0 R /XYZ 79.822 754.882 null ] >> +1188 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F65 200 0 R /F75 203 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1236 0 obj -<< /D [ 1232 0 R /XYZ 79.822 743.923 null ] >> +1238 0 obj +<< /Filter /FlateDecode /Length 3022 >> +stream +xÚÕIn$7ò®WäÄfw@Ð¥’ø6ž¾>y0¾LÆßÁ5¹eV¦¤n·(W)“ÆÆØ4_þXøòÓÏßLù_ôߟî._î>½(·Hæ,\¾ü÷h_`±Š¡U‹ÑÀ¸†åË×å×Î…àÜ8ÎõçÇß¾ü\`~z±¸Xæ´¶R1Ρ‡‚üñ^¡¢_Rå_ªü’H#^h-ú–WZËÅg¤oúè¯Â3½¢åè#/qœ²ã3íŸËøó¸çE¿ ¼5.Ò]ñðgÀ±g pLjÀ¤–=BÍÏþôjq4iH5Ë8&Ìb„b laz`Ýã½â!î yd€g®&fKb>=ÞK)"ëÅKfy=_F–¿h¦‚¶‚ÈpyyDûa{haÍ$PZ2ÂqqŒÑ‚Ÿ-L¢ÑȨ,ƒžFåvù‚Z3-m?KEËk¯4läʧŒ³Ç0ÐTF…·²Ó'Ï|²ÇNV +ç1€G‹
‘‰¸–=ðTØìXE.&rƒ±³5÷²>–ÝwÉæ5’O¼àzþ#Q5Q]MZˆNÕ„%ùhÏó‚É\W{.¹¬ÄDlƒY‰ÂV~qôd5LJí¨ý¼h\²Þ'wÍŠäL:è©:!iÔŠI’p¡1„Ñè%Œ+–çG눲Êrä&uˆ#3["#òÓŠ-U=WJ'H‚¢GÕoó3Z]‚%X¦µ¡±ìQ˜Ÿ9ó¥D¦GνʧpÚ&è;à]Ó^|pü„v +to×Ep†Õ=žasÖ0K¯‡4ÑÉHg£“-é{:Gö:90sW'•f\‰Õ“:),gšP^£“\0«GÖ©Z¬‘nì)˜9 y^2¦•LBÒMÁ<ã·`‡ä5!¶¯Š+ÚÀ²Ÿ]ëÀÄìÅ„-)VIräÉÉݶ‘Þ óH$EnÜö«ž u2%a€0
mˆ–Kˆ*v7H‚${ˆÓøNkr+b
ÆŠÙ„í¶‰[O)3 ôÑËŸ>EÈüâs£¶‚90vXkt]kÖ±Á+â6ôp´)xY“°ò? §2S©P?µ6â¥A¡*ÜYô$3Œ¡xk€·c;o1¹%C F³q:›jâ²5úÌÐÊÉ78´=è“ÖíèÃÀ˜¹ŒéóhyšÊ©”ò\Žå¹œLÄʬ< DùuíµÛ?Û(lÚë.ù?K6J¦ŒÈ–ÇÈÍŒ2=”µ>¢aˆk2y?v
å,A0
rØâ[(ogc«ksãñN:÷éq;TUV2ƒ8©Ü)Jd“¢³ˆ¦Ì8ÔrRM%W"â•ýï˜ +ÅùÎõ¸ýhÅÚ³£³]èŒÎÝÀ0ŽÈu˜aŽaä±àz£:!•D¯×Œ¥ë¢–\0(1.®µ…8:s0B,ÛË®šQ¢Þ„Q5Wõqq…›DŠ¢Ñ¦Ž¯òxŸDÛ*‰.I‡êWJöõ«kŒ<JÕ$Ìij.*§á’ßЫ0· ^Ã\?žrbäŸâ®üýˆ¥äÚ”BÂÜ’^ÙTÙˆëÔõ#¯ªÖ¢-nøu[S–Ç–¢ò~IÚ²™J%˜ÐËk™näFSdª‰ì¾ü&zCቬË1¡2&é¬ÄU®ë»µ=Ÿ+Ë~Ýê'¸ +£‹æöœOï ÃþN¬•ýlUcæïç/wÿoÓT‹’¤WN-¿½ûõ7zóúüL^Ý8³üÆ~]ÀÖi,_þ·üûî_ñ\i#ŒÖFÚ/Â0[eæÐr5eæ>õˆçuCz‚ªÄ}Ž´ tŠiéì«FÎ'å¤oK G…t1ä)~FT<ùÿ,a¿_Ã>|.ô¨ëäõµÙΈÈXÊÎ)âYw”Y=¡—5¥j˜–ËŸâ€r¹¤¼£áX–ÏŸüÙa/Áœ×‰½rœ4’˜+êCYühª,\siÍ—ÒL)—×þØ\séüFEÁQÌèúUÏX,Êû)ìÑnŽ/†Œ•‹jÌ@Ø–¾šŸ-OÙ¯®=?Ò=˜ô׸Ìmž dð¶ÏÝ9_Yc]1úú·ª™ôbAÓìc˜2î,{Ãèùh'„
Óžê"¨™lw™œ‹Sm]Nd„Ø,‡ÖÇ£òÚl×eXk%äÏ?–ø#Ô5@/š9#(;jÎ'³Z±4ˆµd“di£l¥%Ivƒ]]YnFÕ«XºÖµ˜%C‘Üõ_¶/IºŠÓ«v›=ÇL(–8û‚Gö½×µà éŸÉL¯ÿljYä¡P÷+£¾AÇPÚÒ‚Q„ÛÃÉ•ì +óWøKÿV™¿ªq¶Ž!·ýZÊõE7_AK +~Ö0œdR¸¶1Ã&ý+Î…zþ=Å’‚¾”3þcòðNX9à™ò¨AˆãÝ|@\ã‘“4Q<Å,Ga‡iûΉ3Ž¶[êLµ[+ÆaÀudÍâ˜T¼öû<Sv³ÍÂè{Ÿ×52«©4OJgJycø£RUv_κ+“³É2£ËãÓþ¬"Ä#3ÅÈ`U°ùÍ›9N’’®f–&i2«Œ-+!èçm}®$*7,üÚÒR’G‘KL>O8¡è³Â{ß&šƒ‘Í
IfËꞃ¨g¦Ö›Äè5[sT™“õKAvŽ|E_»”Ïgêøí:þ;îáW×ú…µœ)ö¬4îTµ¶ƒr»þ,õFUÃ<Æ
Åë]6¤äètÉZÃÈ +ôLèÜäÊrôú«°eUän˜•¤ ß×=óòõ-¶Õ¬ÅöÌá-g‚ÜÊ¥/çøÚ +hÇÚ;Àúóñzi–JäGv)oÚû¹ß—Ö]_÷œ?Y¤í ü˜îeÖÃÏ”€‚ëôÐ#êf(#™èš¡`QdŒ²kÈÐ20é@ ™ˆ…|ˆá°ö+‚Ðដ +endstream endobj 1237 0 obj -<< /D [ 1232 0 R /XYZ 79.822 732.964 null ] >> +<< /Type /Page /Contents 1238 0 R /Resources 1236 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R /Annots 1271 0 R >> endobj -1238 0 obj -<< /D [ 1232 0 R /XYZ 79.822 722.005 null ] >> +1271 0 obj +[ 1235 0 R ] +endobj +1235 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 244.87 459.989 255.296 472.16 ]/A << /S /GoTo /D (Hfootnote.23) >> >> endobj 1239 0 obj -<< /D [ 1232 0 R /XYZ 79.37 697.3 null ] >> +<< /D [ 1237 0 R /XYZ 78.37 808.885 null ] >> endobj 1240 0 obj -<< /D [ 1232 0 R /XYZ 79.822 507.548 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 768.829 null ] >> endobj 1241 0 obj -<< /D [ 1232 0 R /XYZ 79.822 496.589 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 757.87 null ] >> endobj 1242 0 obj -<< /D [ 1232 0 R /XYZ 79.822 485.63 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 654.259 null ] >> endobj 1243 0 obj -<< /D [ 1232 0 R /XYZ 79.822 474.671 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 643.3 null ] >> endobj 1244 0 obj -<< /D [ 1232 0 R /XYZ 79.822 463.713 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 632.341 null ] >> endobj 1245 0 obj -<< /D [ 1232 0 R /XYZ 79.822 452.754 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 621.382 null ] >> endobj 1246 0 obj -<< /D [ 1232 0 R /XYZ 79.822 441.795 null ] >> +<< /D [ 1237 0 R /XYZ 79.37 596.677 null ] >> endobj 1247 0 obj -<< /D [ 1232 0 R /XYZ 79.822 430.836 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 406.926 null ] >> endobj 1248 0 obj -<< /D [ 1232 0 R /XYZ 79.822 419.877 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 395.967 null ] >> endobj 1249 0 obj -<< /D [ 1232 0 R /XYZ 79.822 408.918 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 385.008 null ] >> endobj 1250 0 obj -<< /D [ 1232 0 R /XYZ 79.822 397.959 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 374.049 null ] >> endobj 1251 0 obj -<< /D [ 1232 0 R /XYZ 79.822 387 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 363.09 null ] >> endobj 1252 0 obj -<< /D [ 1232 0 R /XYZ 79.822 376.041 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 352.131 null ] >> endobj 1253 0 obj -<< /D [ 1232 0 R /XYZ 79.822 365.082 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 341.172 null ] >> endobj 1254 0 obj -<< /D [ 1232 0 R /XYZ 79.822 354.124 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 330.213 null ] >> endobj 1255 0 obj -<< /D [ 1232 0 R /XYZ 79.822 343.165 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 319.254 null ] >> endobj 1256 0 obj -<< /D [ 1232 0 R /XYZ 79.822 332.206 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 308.295 null ] >> endobj 1257 0 obj -<< /D [ 1232 0 R /XYZ 79.822 321.247 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 297.336 null ] >> endobj 1258 0 obj -<< /D [ 1232 0 R /XYZ 79.822 310.288 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 286.378 null ] >> endobj 1259 0 obj -<< /D [ 1232 0 R /XYZ 79.822 299.329 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 275.419 null ] >> endobj 1260 0 obj -<< /D [ 1232 0 R /XYZ 79.822 288.37 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 264.46 null ] >> endobj 1261 0 obj -<< /D [ 1232 0 R /XYZ 79.822 277.411 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 253.501 null ] >> endobj 1262 0 obj -<< /D [ 1232 0 R /XYZ 79.822 266.452 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 242.542 null ] >> endobj 1263 0 obj -<< /D [ 1232 0 R /XYZ 79.822 187.747 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 231.583 null ] >> endobj 1264 0 obj -<< /D [ 1232 0 R /XYZ 79.822 144.908 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 220.624 null ] >> endobj 1265 0 obj -<< /D [ 1232 0 R /XYZ 79.822 133.949 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 209.665 null ] >> endobj 1266 0 obj -<< /D [ 1232 0 R /XYZ 79.822 122.99 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 198.706 null ] >> endobj 1267 0 obj -<< /D [ 1232 0 R /XYZ 93.716 93.884 null ] >> +<< /D [ 1237 0 R /XYZ 79.822 187.747 null ] >> endobj -1231 0 obj -<< /Font << /F15 199 0 R /F75 203 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F22 228 0 R /F81 248 0 R /F16 201 0 R /F79 227 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -1272 0 obj -<< /Filter /FlateDecode /Length 2390 >> -stream -xÚÝ[Ín举û)ôÃ!«Š€aÀ»Ø[’¹-ö´Aö’9$—¼~Š")‰%µšô´ ‡¶[õ©þYUdëéÏIO¿<èú_ÙôÿþòðòýáëÅƉTaúþÓôd¦`;yg”vfúþcúíQkDݳÖ>>ýþý×óë%ÀTtÃ$z!H -Z[£5¼hm¾¥ë§/,ß·|ǽòwÌ3øšÇðRîiþDþŽy^º®sÒxº&¾&¾‡/)¼aþçV+£Arn¡‹s£½B‰bm%ˆ–oöè.ß’(hý¤kûºÜWžpùÓ1ÓçÏáLX¨Õõ›3ëÓ‹Ú\ÁÙÓçê7ó¶G]ï®ït—¬>Y½Ù@²z-åëd87Þ1ªnŒÊJu»—FÝ[@ -ª/^ÊËö¥•«:ZÓIkd
V„ì…ŒTLA¬sòšúŽF¿Çª"Nì‰R˜.õëjV2§×uµ´J®†}˜hMˆ"¨µ‡sÍãJµ—ý÷ŸSþò×8›K 9ÖŠjÆ cxŽ=aìê¡XN>(»Ü{¬‚ ãÝÑ£}„{wªÈ±øJNKI’Ò"x9ÈBkÿ²î ´ï•ÁÕRó3g‹ù‘ æN•,ÍF…cÝV)¡¿våÅLï@šäòvà%2 -Öü¶¬g3“Ep°tQx%_ÃYn[•ðSíΡK´ŒêH -†¤ÏVÇ¥SÃÀi7gKi±Ãã–’95
)Kk -NŠ3s¡'ƒñ]U–v±£·ÇRÌZ ó•à8ÇŒ®™ör±¤lØ{¸E‹rFßsŒäª:{4åþ#7Ë‘P9ØÅ™Þ\. Dy×Y“QÂ8Qñ;WÀ1Â[”Á¾{‡l”0Êë éf*#-ÊÊH÷ÙûMÈhåÛ=Û_pPœénAî“@dìv/Q6˜N -”ÏL Úí´Ä@÷Ž“á€$Ê;Èðž³ Ü‘ñ<RR -Ï -ïýѹqêçò‰$õ"“:9ÖªhwÞ¹è–ÆŠ -ÅmêodTÂ[”ÿEõfÐ*gÅ©?eªŒ´(ŸY½ EvÐPù&PŠBÜÉX†#Pw¿}ø—hŸF£ÐôLJß~çá¿óçWfc˜þ3OüÁQ”3é±N{øKþ˜7WÞÛ $‘j—@*¸ƒmb N\`xÍpÛ¢•7n -œsÒá¹t °že@}p–a¼u–È‹½¯Üs$!Ï”Íá<º;»ÃvrÀ&°ÿGK‚Ï«'Že5ׇQʪœ?ˆíùƒ²svŒ“tÅkutóÌÖö\W=rÓp~ø2d¿#Ù‚sN: ݉®WÉЦO_T¡ŸlØv¿_ëóÛÃG‚ê Œ2z,µ‚PNñŸÉûÁÖ¼6›üqoG -æ{ßn*:û§eÃ’ØUóãu6øyÂRù=Á²—QîÌwv§OšQ\æý´we˜fgy©KoÝQ_v•ó]³´Âk³¡þŽa¾˜I\v¡}
uj` ß ¯!/Úì@Ä/³–À~åÀ]嬛8¾Çµr=ø‰Gçÿi¾$Ê -endstream +1268 0 obj +<< /D [ 1237 0 R /XYZ 79.822 176.789 null ] >> endobj -1271 0 obj -<< /Type /Page /Contents 1272 0 R /Resources 1270 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R /Annots 1324 0 R >> +1269 0 obj +<< /D [ 1237 0 R /XYZ 79.822 165.83 null ] >> endobj -1324 0 obj -[ 1269 0 R ] +1270 0 obj +<< /D [ 1237 0 R /XYZ 93.716 134.783 null ] >> endobj -1269 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 106.14 489.021 116.567 501.312 ]/A << /S /GoTo /D (Hfootnote.24) >> >> +1236 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F65 200 0 R /F79 227 0 R /F75 203 0 R /F22 228 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1273 0 obj -<< /D [ 1271 0 R /XYZ 78.37 808.885 null ] >> +1275 0 obj +<< /Filter /FlateDecode /Length 2753 >> +stream +xÚÍËrä¶ñ®¯à,‚î@Õ–ªV;Wù–do.ŸœŠ/ÙC|ñïoâÁáÒhã%6ú~€rù}‘ËOO2ÿùöô·+èÅ ÇÈjùöï'ðä‹q‚Ìb„dX¾}_~ù,%[)éê/|þ„~„Œ”¤T6]žÑøqƒþw¸.~ÎËó¯ß~ö+YØZ ÈJ׊ÐTX«°+°y„€/RÂWµ÷Ïh?ìýX¥ +vyÿ÷'ÏQí%œÂ–£V´^I +Ó9âz([Ä•Bqñìv·¨[i‡ü ³÷üVl8…W6ôP‡Ý6ŽÅ¶2PKØǧöx@_ØC¹o$¡‹öæƒô‚œ@¶#YCØ}—¬ +ÞÈ(ó&ï‰!ÎQèEyÜ
5ñAÖú’ƒ«ÜƒÓðüVt#±S„Jl%¤GÛQ}Rÿý½9¼šðûªž¨8ò£Í +öRI”Þ–U-–t,\%|÷1z¤¶¼sóê¿/éæÁw/ì¹D!Öé öDKzeNÔ oNÚgòŽFw~.‰€<¦ÙöèZ)Lj¢ô\69@ºñzª`–þ +endstream endobj 1274 0 obj -<< /D [ 1271 0 R /XYZ 79.822 768.829 null ] >> +<< /Type /Page /Contents 1275 0 R /Resources 1273 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R /Annots 1319 0 R >> endobj -1275 0 obj -<< /D [ 1271 0 R /XYZ 79.822 757.87 null ] >> +1319 0 obj +[ 1272 0 R ] +endobj +1272 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 106.14 363.492 116.567 375.783 ]/A << /S /GoTo /D (Hfootnote.24) >> >> endobj 1276 0 obj -<< /D [ 1271 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 1274 0 R /XYZ 78.37 808.885 null ] >> endobj 1277 0 obj -<< /D [ 1271 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 719.016 null ] >> endobj 1278 0 obj -<< /D [ 1271 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 676.177 null ] >> endobj 1279 0 obj -<< /D [ 1271 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 665.218 null ] >> endobj 1280 0 obj -<< /D [ 1271 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 654.259 null ] >> endobj 1281 0 obj -<< /D [ 1271 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 643.3 null ] >> endobj 1282 0 obj -<< /D [ 1271 0 R /XYZ 79.822 649.278 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 632.341 null ] >> endobj 1283 0 obj -<< /D [ 1271 0 R /XYZ 79.822 638.319 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 621.382 null ] >> endobj 1284 0 obj -<< /D [ 1271 0 R /XYZ 79.822 627.36 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 610.423 null ] >> endobj 1285 0 obj -<< /D [ 1271 0 R /XYZ 79.822 616.401 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 599.464 null ] >> endobj 1286 0 obj -<< /D [ 1271 0 R /XYZ 79.822 605.442 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 588.506 null ] >> endobj 1287 0 obj -<< /D [ 1271 0 R /XYZ 79.822 594.483 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 577.547 null ] >> endobj 1288 0 obj -<< /D [ 1271 0 R /XYZ 79.822 583.524 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 566.588 null ] >> endobj 1289 0 obj -<< /D [ 1271 0 R /XYZ 79.822 572.565 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 523.748 null ] >> endobj 1290 0 obj -<< /D [ 1271 0 R /XYZ 79.822 561.606 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 512.789 null ] >> endobj 1291 0 obj -<< /D [ 1271 0 R /XYZ 79.822 550.648 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 501.831 null ] >> endobj 1292 0 obj -<< /D [ 1271 0 R /XYZ 79.822 485.89 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 490.872 null ] >> endobj 1293 0 obj -<< /D [ 1271 0 R /XYZ 79.822 474.931 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 479.913 null ] >> endobj 1294 0 obj -<< /D [ 1271 0 R /XYZ 79.822 463.973 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 468.954 null ] >> endobj 1295 0 obj -<< /D [ 1271 0 R /XYZ 79.822 435.081 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 457.995 null ] >> endobj 1296 0 obj -<< /D [ 1271 0 R /XYZ 79.822 424.122 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 447.036 null ] >> endobj 1297 0 obj -<< /D [ 1271 0 R /XYZ 79.822 413.163 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 436.077 null ] >> endobj 1298 0 obj -<< /D [ 1271 0 R /XYZ 79.822 402.204 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 425.118 null ] >> endobj 1299 0 obj -<< /D [ 1271 0 R /XYZ 79.822 373.313 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 360.361 null ] >> endobj 1300 0 obj -<< /D [ 1271 0 R /XYZ 79.822 362.354 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 349.402 null ] >> endobj 1301 0 obj -<< /D [ 1271 0 R /XYZ 79.822 351.395 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 338.443 null ] >> endobj 1302 0 obj -<< /D [ 1271 0 R /XYZ 79.822 340.436 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 309.552 null ] >> endobj 1303 0 obj -<< /D [ 1271 0 R /XYZ 79.822 329.477 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 298.593 null ] >> endobj 1304 0 obj -<< /D [ 1271 0 R /XYZ 79.822 318.518 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 287.634 null ] >> endobj 1305 0 obj -<< /D [ 1271 0 R /XYZ 79.822 307.559 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 276.675 null ] >> endobj 1306 0 obj -<< /D [ 1271 0 R /XYZ 79.822 296.6 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 247.783 null ] >> endobj 1307 0 obj -<< /D [ 1271 0 R /XYZ 79.822 285.641 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 236.824 null ] >> endobj 1308 0 obj -<< /D [ 1271 0 R /XYZ 79.822 274.682 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 225.865 null ] >> endobj 1309 0 obj -<< /D [ 1271 0 R /XYZ 79.822 263.723 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 214.907 null ] >> endobj 1310 0 obj -<< /D [ 1271 0 R /XYZ 79.822 252.765 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 203.948 null ] >> endobj 1311 0 obj -<< /D [ 1271 0 R /XYZ 79.822 241.806 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 192.989 null ] >> endobj 1312 0 obj -<< /D [ 1271 0 R /XYZ 79.822 230.847 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 182.03 null ] >> endobj 1313 0 obj -<< /D [ 1271 0 R /XYZ 79.822 219.888 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 171.071 null ] >> endobj 1314 0 obj -<< /D [ 1271 0 R /XYZ 79.822 208.929 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 160.112 null ] >> endobj 1315 0 obj -<< /D [ 1271 0 R /XYZ 79.822 197.97 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 149.153 null ] >> endobj 1316 0 obj -<< /D [ 1271 0 R /XYZ 79.822 187.011 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 138.194 null ] >> endobj 1317 0 obj -<< /D [ 1271 0 R /XYZ 79.822 176.052 null ] >> +<< /D [ 1274 0 R /XYZ 79.822 127.235 null ] >> endobj 1318 0 obj -<< /D [ 1271 0 R /XYZ 79.822 165.093 null ] >> +<< /D [ 1274 0 R /XYZ 93.716 96.189 null ] >> endobj -1319 0 obj -<< /D [ 1271 0 R /XYZ 79.822 154.134 null ] >> +1273 0 obj +<< /Font << /F15 199 0 R /F81 248 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F79 227 0 R /F65 200 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1320 0 obj -<< /D [ 1271 0 R /XYZ 79.822 143.176 null ] >> +1322 0 obj +<< /Filter /FlateDecode /Length 1658 >> +stream +xÚíZÉn#7½û+ôS&«Š`°ck€œ}rMNùÿkÈfo,¶¤.IÎŒƒ9´Ôû±ê±6’mÌáûƒ™þÁ•³üûýáõãáñèÒ!EKxøøëÁæFæ`ÑFwÞ‚ñöðñÏá'cˆŒñœ—ç??~Ÿ1’÷× Ö"˜Íó7‡.Ÿ9WaV"]’Ç°¥<”öÉÃ0±Da·h:£ùì-ã‡,6×s÷6?I'ZûÍÖ^,%°L²Q§l‹Ò°?žá{¾²=Œ¹Ž¹Ì×ùÇg&)?ËçüVχ6ù¾ãÚ†cOÛQmW®§6å~¹f¬ýÒëŠÐñ̾Og!©IÆ6rgáNGr‹²|Ù¶îb)6 +Ž¨£C—ŸÊ¯@2’ë¸À8Õ¦š@ÑgLÊóPo]'ëÆX œÝ)jkúa—vtØÔ]›ƒÎþ²_Ë9ðÎwö®+bÊ–½oí|홿œj=]°Ñ«çA„>u5…r“Q |NÚ#K¨ÉÐ÷—?“¨-Ê-¥:„’HY2H”/–K0Yˆh% ÊjD \ØzúÂþ†1Çw]/:ºZ”Ïñ7ô ’!)*é¦å…&ºÜs'XTšå>É9äg®^Ýr‚@ùº…&R€üjG‡®(ÿãà€Œaï¬SòÛ6 D¹BëÀš.Ñî ê’´ +¡œÝ +Ÿ"aÌ¢o΂ ‡Å®laiq‚A÷60¿<ü‘¯É +endstream endobj 1321 0 obj -<< /D [ 1271 0 R /XYZ 79.822 132.217 null ] >> -endobj -1322 0 obj -<< /D [ 1271 0 R /XYZ 79.822 121.258 null ] >> +<< /Type /Page /Contents 1322 0 R /Resources 1320 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R >> endobj 1323 0 obj -<< /D [ 1271 0 R /XYZ 93.716 91.511 null ] >> +<< /D [ 1321 0 R /XYZ 78.37 808.885 null ] >> endobj -1270 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F65 200 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> +1324 0 obj +<< /D [ 1321 0 R /XYZ 79.822 768.829 null ] >> endobj -1327 0 obj -<< /Filter /FlateDecode /Length 1579 >> -stream -xÚíZËnë6Ýç+ô™óà8}®³+ºmWýÿí¥(Q‡¶#Æ1îu‘…"YÎg†dÌðï`†¦œAÆ«ô÷ÇÃëûÃÓAâÀƒ%Þÿy°é%3Ø!`Á;ÆÙáý¿á¯gcˆŒqlï_þ~ÿsÁ|:Dç(¬A,Z`ÇEÜÔzÅä#bÀ\Ó·Ñ°¦Aóò((éŠ}úõZ~‰,Wo龟y[îö³§–I³¬Ø¯5 -ù¾=ðƒ^1<Ï+;e^z}:{76ÎwÓ;þm‚ŸÈçBª–‡ßʇeûn6ô ß·Ïõ“‰Mi{Þ´ÜɪS}H§%pq¶ñ%Ûœ-!ªe8Þš>‰¹—E¤lBi¤`òZžÓL-÷a¾3Y~•>Ïô—ïJr;“é“GÌß^P²ÌGž+9¾»òž3\‹¼„óÈöÔÈ ˆ>42†Éoǯ,cËóI„”9¢µì4ÂØ_™ä=¸ñUkI]#¡7Š;ÇÀØDqŠ=1T\Ž¡§â {5f?Š«½V -å”Û2ñ@ŒE%ØÑ_äéGsýÅ´bÖ8Ê‹éc›ÓæŽÝÙJ“S·Ë©»WFÓ¦Ké)7ȱÜéæC„}Ç·ñaY£°´³ëN³¹uí³2‚ÖoÊ~u\Q)¥àBã}ÔghR)ß9¼¸øãœRsPçùЖ[qGŸ/Å@)E.”2®\Ù}¹*µo‡¸&‚èÅÝZËqk”³Ut];wR•ÀUþÎûíåþÌ´¹füIðàÕ|T–¤ò?Å|Rç°:ÞÔtÔtàC:5Štû“8©¡±ë£Q£Ü[ªaÄZ„UÁ"Bò±fq™ xiÄ
}âÖ(7ŠX„©PuÍ`>ª5Ê‘êÁS-¡!¶µvˆàMÐ(_Ô½Ö@Œ±éÞ¾l¯P.vïïJŒÓD’Îô\ƒ|’IZL8N@s1±½ “HÔ(ý“Ó<Ô"j[눹‹5ʉ:þ\EŸûð jôF_6™Ó£M!g{Ñß«…ó`i-:‹…rÊßGKŠ]=³—soÁ#ëøö~zÄâ -åkR?ù«œ+ؽ– Pî·ÈL -B¤åè,AÊÿ74xÏZ®U -:°5Ê'h°g¥¡±ëYV tÚMÖwÇ
!'NÛA]ûø -ä6–ÁEß0
[·ÜÉx -M—Éf -åóµ>ZkBC§o†Pú×ÒÐ0¤‰CÓM}s\rg‰ÃFÛjÐ7qA¾#Ö,m@@ÂÆÍû¦Ú -å6Ëzè›t½µ|(Tk”¯X°Î -‹Òérž -ã6É08cž}ÿ*Yƒ\S¼{ÇØøV_¡@~‹Ü²P?ý¯×1/Ò%Aã1Zœp™ýûÃOç˵: -endstream +1325 0 obj +<< /D [ 1321 0 R /XYZ 79.822 757.87 null ] >> endobj 1326 0 obj -<< /Type /Page /Contents 1327 0 R /Resources 1325 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R >> +<< /D [ 1321 0 R /XYZ 79.822 746.912 null ] >> +endobj +1327 0 obj +<< /D [ 1321 0 R /XYZ 79.822 735.953 null ] >> endobj 1328 0 obj -<< /D [ 1326 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 724.994 null ] >> endobj 1329 0 obj -<< /D [ 1326 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 714.035 null ] >> endobj 1330 0 obj -<< /D [ 1326 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 703.076 null ] >> endobj 1331 0 obj -<< /D [ 1326 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 692.117 null ] >> endobj 1332 0 obj -<< /D [ 1326 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 681.158 null ] >> endobj 1333 0 obj -<< /D [ 1326 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 670.199 null ] >> endobj 1334 0 obj -<< /D [ 1326 0 R /XYZ 79.822 672.192 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 659.24 null ] >> endobj 1335 0 obj -<< /D [ 1326 0 R /XYZ 79.822 661.233 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 648.281 null ] >> endobj 1336 0 obj -<< /D [ 1326 0 R /XYZ 79.822 650.274 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 637.322 null ] >> endobj 1337 0 obj -<< /D [ 1326 0 R /XYZ 79.822 639.315 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 626.364 null ] >> endobj 1338 0 obj -<< /D [ 1326 0 R /XYZ 79.822 628.356 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 615.405 null ] >> endobj 1339 0 obj -<< /D [ 1326 0 R /XYZ 79.822 617.397 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 604.446 null ] >> endobj 1340 0 obj -<< /D [ 1326 0 R /XYZ 79.822 606.438 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 593.487 null ] >> endobj 1341 0 obj -<< /D [ 1326 0 R /XYZ 79.822 595.479 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 540.685 null ] >> endobj 1342 0 obj -<< /D [ 1326 0 R /XYZ 79.822 584.52 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 529.726 null ] >> endobj 1343 0 obj -<< /D [ 1326 0 R /XYZ 79.822 573.562 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 518.767 null ] >> endobj 1344 0 obj -<< /D [ 1326 0 R /XYZ 79.822 562.603 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 507.808 null ] >> endobj 1345 0 obj -<< /D [ 1326 0 R /XYZ 79.822 551.644 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 496.849 null ] >> endobj 1346 0 obj -<< /D [ 1326 0 R /XYZ 79.822 540.685 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 485.89 null ] >> endobj 1347 0 obj -<< /D [ 1326 0 R /XYZ 79.822 529.726 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 474.931 null ] >> endobj 1348 0 obj -<< /D [ 1326 0 R /XYZ 79.822 518.767 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 463.973 null ] >> endobj 1349 0 obj -<< /D [ 1326 0 R /XYZ 79.822 507.808 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 453.014 null ] >> endobj 1350 0 obj -<< /D [ 1326 0 R /XYZ 79.822 496.849 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 442.055 null ] >> endobj 1351 0 obj -<< /D [ 1326 0 R /XYZ 79.822 485.89 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 431.096 null ] >> endobj 1352 0 obj -<< /D [ 1326 0 R /XYZ 79.822 474.931 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 420.137 null ] >> endobj 1353 0 obj -<< /D [ 1326 0 R /XYZ 79.822 463.973 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 409.178 null ] >> endobj 1354 0 obj -<< /D [ 1326 0 R /XYZ 79.822 453.014 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 398.219 null ] >> endobj 1355 0 obj -<< /D [ 1326 0 R /XYZ 79.822 442.055 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 387.26 null ] >> endobj 1356 0 obj -<< /D [ 1326 0 R /XYZ 79.822 431.096 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 376.301 null ] >> endobj 1357 0 obj -<< /D [ 1326 0 R /XYZ 79.822 420.137 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 365.342 null ] >> endobj 1358 0 obj -<< /D [ 1326 0 R /XYZ 79.822 409.178 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 354.384 null ] >> endobj 1359 0 obj -<< /D [ 1326 0 R /XYZ 79.822 398.219 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 343.425 null ] >> endobj 1360 0 obj -<< /D [ 1326 0 R /XYZ 79.822 387.26 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 332.466 null ] >> endobj 1361 0 obj -<< /D [ 1326 0 R /XYZ 79.822 376.301 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 321.507 null ] >> endobj 1362 0 obj -<< /D [ 1326 0 R /XYZ 79.822 365.342 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 310.548 null ] >> endobj 1363 0 obj -<< /D [ 1326 0 R /XYZ 79.822 354.384 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 299.589 null ] >> endobj 1364 0 obj -<< /D [ 1326 0 R /XYZ 79.822 343.425 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 288.63 null ] >> endobj 1365 0 obj -<< /D [ 1326 0 R /XYZ 79.822 332.466 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 277.671 null ] >> endobj 1366 0 obj -<< /D [ 1326 0 R /XYZ 79.822 321.507 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 266.712 null ] >> endobj 1367 0 obj -<< /D [ 1326 0 R /XYZ 79.822 310.548 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 255.753 null ] >> endobj 1368 0 obj -<< /D [ 1326 0 R /XYZ 79.822 299.589 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 244.794 null ] >> endobj 1369 0 obj -<< /D [ 1326 0 R /XYZ 79.822 288.63 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 233.836 null ] >> endobj 1370 0 obj -<< /D [ 1326 0 R /XYZ 79.822 277.671 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 222.877 null ] >> endobj 1371 0 obj -<< /D [ 1326 0 R /XYZ 79.822 266.712 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 211.918 null ] >> endobj 1372 0 obj -<< /D [ 1326 0 R /XYZ 79.822 255.753 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 200.959 null ] >> endobj 1373 0 obj -<< /D [ 1326 0 R /XYZ 79.822 244.794 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 190 null ] >> endobj 1374 0 obj -<< /D [ 1326 0 R /XYZ 79.822 233.836 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 179.041 null ] >> endobj 1375 0 obj -<< /D [ 1326 0 R /XYZ 79.822 222.877 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 168.082 null ] >> endobj 1376 0 obj -<< /D [ 1326 0 R /XYZ 79.822 211.918 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 157.123 null ] >> endobj 1377 0 obj -<< /D [ 1326 0 R /XYZ 79.822 200.959 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 146.164 null ] >> endobj 1378 0 obj -<< /D [ 1326 0 R /XYZ 79.822 190 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 135.205 null ] >> endobj 1379 0 obj -<< /D [ 1326 0 R /XYZ 79.822 179.041 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 124.247 null ] >> endobj 1380 0 obj -<< /D [ 1326 0 R /XYZ 79.822 168.082 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 113.288 null ] >> endobj 1381 0 obj -<< /D [ 1326 0 R /XYZ 79.822 157.123 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 102.329 null ] >> endobj 1382 0 obj -<< /D [ 1326 0 R /XYZ 79.822 146.164 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 91.37 null ] >> endobj 1383 0 obj -<< /D [ 1326 0 R /XYZ 79.822 135.205 null ] >> +<< /D [ 1321 0 R /XYZ 79.822 80.411 null ] >> endobj -1384 0 obj -<< /D [ 1326 0 R /XYZ 79.822 124.247 null ] >> -endobj -1385 0 obj -<< /D [ 1326 0 R /XYZ 79.822 113.288 null ] >> +1320 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1386 0 obj -<< /D [ 1326 0 R /XYZ 79.822 102.329 null ] >> +<< /Filter /FlateDecode /Length 2495 >> +stream +xÚí[Ën$»
ÝÏWôŒF"©`p§ÝÈÚ» Ûd•ÿß^½ŸUÕ¥¶›A²hwu•êˆ<¢(’’ùåß~ùãÏßLú+÷÷׿îÒ^ˆY#.ÿú!\#~#yÑJ0®Äåã?—¼pN7ÿyýçÇß毻‹aV)4-ˆ– ÀøëO Ò]I™¯À!Káoî]O†s÷ã}r÷ñê¾Óµ²ñ¹âî9¥6¦àÚU\‰±Ç¸"öáäv_å+ñž¯´œ4ü>"Wr&8Œä¢]#·G©äz¡Šì Ðñ#oË¢¢ëŒpÕ¬‰Ú£TQѱ-=ÓzY00LšTžŒ,ÓÜŒ(_4¼B3 +E”¯ ¤ûÖÂŒ¢
’¿P~ßPTjbº· ³¥ô ÿnBúP„‹‘¹³(&Üz7 <!†fF1ÎF +Ÿ@àâ=¡ fN:½-éÔƒ|vÌÒ$éÉXÃjfÁL &ÎmpóZüÍ¿ÆYœM!Õ¼ ÷ {ÙÚƒìl9ûÛÁóÔüºy±ŽPÔR¢-C}!ÇŒCÊŒhñjÐkä +á¯îž›W0þ)ßõ©{û0b«šùáz ¼SÔä”"Ì5"`Ò_ñ,Iȧïl~ðž>?‰|å§î¼þ +yP°½øûÒ¡Ov”É”øևʃËk
™O( ˜T}’„&šlR“2•P€´ÎÝóݨÜoGÊwÙ±ÆSÊhÚDpé>7“Åyo»EeöÔ‡!±QÚ4rGT‘åLo2å•ó ÎEzîh˜ÎËp[×Õ{*:O¢£±á>Ò–ïvÆWÚ£3íIµHð“\uz—–ÂÓ’¹©–®<U4¥VYZf©ç–Rî2•±ªm%¿–&È.1‡–àlI¸5p‡tÔÇ#-,3ˆãÛR…iº¸ªN3*feUAvW•½83{yhW”UMgÂØi%?™K Å´ÔÊ%PÓ÷ãP»ÒàÛ>ÔKj`Žih)\ìA¶*¾Û!÷W°ýäg¤\uzæ—Goó€Uª!øÿ‚Ä’Ð0ÐSBp6çÍ#Ü£üŽ¹ð¿xVþºì—è$‰RUȱSXáOqWX‹®ñƒ14Á˜¨Ò²-áW·ÞšÃ`/<
‘Ô¯ï—Ð’I—xºt2òõ6>É¡¦ïQ¿Õ-Ÿ¤)è—‡q¤‹Š˜¶0J°GçÝù¤Ãå´‰HÔiŽvÄþ¨%]rPÐn„šƒ¸¹Mª$Æ»ã‚ãñ|&@·†KA£K9Y«JÀ²ÀÛƒI—·œ]DΟ
¼ÙHÙoËóõ&®ºm@éÝv®ê3´ßOó¸ç\aÅêÚÁ¡ª×‘ühÅÛÔzu8\<!‡c(bµ€#€[®êàdù)[è +)éÇq®C¡Wö¥„œƒ%‘ŸejwàšRÆ„Fë$J©öïÙz‹Ÿxw*Ô¾Ho]«#õ•?ý’EIEã +U{ûpv%›àëÖœö¬ÂÞ`193Í2ÓîÓ•¯k“f¶³,î+Ê6Õlw#[ãJwUŽ-‡x;»ƒYïTrB泡Uõ&͙ғ©2cªŒøßXŒ~ì³”:Ù¨k[âï[Ò»´ï ©§ëJò:ªÑLêéDÛpªŠ×lFÝš——Œ θûfw{² +'„fêÒtuŽÔúÁÊB.q“4t“eŒSëÙÌK#S@c8³v:vÀØÍ»N.²C¾UdØ[v)©.Ä™Õ%•Øø×Õ÷…§ºé +endstream +endobj +1385 0 obj +<< /Type /Page /Contents 1386 0 R /Resources 1384 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R >> endobj 1387 0 obj -<< /D [ 1326 0 R /XYZ 79.822 91.37 null ] >> +<< /D [ 1385 0 R /XYZ 78.37 808.885 null ] >> endobj 1388 0 obj -<< /D [ 1326 0 R /XYZ 79.822 80.411 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 768.829 null ] >> endobj -1325 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -1391 0 obj -<< /Filter /FlateDecode /Length 2602 >> -stream -xÚå[ËŽë8Ý×WäZW"õ -*“J½®]c¶3«ùÿíèý lÇv¥Ð=˜Å½•Ø2ERÔ!ðË¿/üòû/™ -Ÿüÿ¿¿Ý¾Þ~=”»Hæ¬@¸|ýëMøAü".V1°êb´`\‹Ë×.¾s.?9×áïõŸ_T™¿.–9ÑöB„rL -맻—$—ÿªûž'5ïG*]>‰Ïòɸîn´¸CïtŠ3Á¡‡]yºQJñßnƒI&ýó&Uýd©ªÿCªŽRšª(¼,T>¬X&¬¤ŠéÛ>Ťc†[*eÅÑGU†¨IµªqNR)›îÕ)jcŒ£~¶à%®ô÷µHß'×Ò3åzˆöðL‹7ÿœM³”çõBúTqÍ@k -ºcpŒRþ?…vŠ!7tvt ™0@¥œPÃJ†ÒMö©!€ñIÈtÑ ›2œM’‡LdüLÖÊ09c¸KQg˜; ±imƒ_×âá{¯y¿ê—3DÍÞ²| -ãúR²Ì1yª.øLÏ逖 ùõêâ<$ e‰qÍEûį”-ˆqµ,òé…Ÿ›+Øp—§¿í®¿“æ°bi†w’Y"î2YòDK¡€Y©©Ìök^4 Ö]›na™¾ÜIx•»¯\‹… -PmÀ”GLY´žG*µŠT‘Õb+çµ¼@VÙŒKBÂèh¶=-³ˆôi¥ã2=º«p`ZMugñVv"duWYã™%ËC¿£´D9Á´Ù¥Ý_Ky02“”Phääs›j7ÂØó”ÆËb
…bo–Ù"‘ÒXMƒb™rÿ½Èöà/’–ªÕé^Ø CÔ6ùAi©´¯[¥.Þ[õRþk)àñºüõ -8ñÏó®(ZˤK´UrÝõS.v#ù©¹¾ÿºÒ•è§:׎šð©Ü§*asŘ¼br®3¸M}Q3+§ñ¢X„^lºRšI¹Iš¯ŽOµ
§Ë¼~l {é[Ù£Gys÷¾ÄFÃpE*†(@<°äjὂ’ŸyÎs½yèÞ+å$‘d4“¡Ò¿€[.Œ¦1Y•Úï_#Ùf ŸtujG©c›8]ºµ4z潨’ÛÆQ\éS–¦r›hAdé:÷nhº¯e¡+ðÔâ£ÊWbôÜSD|PwSòhrGÙî0 Äê1¾ø€ŒÊRÝ‚Z2Õ^Ë‘[o—ÙãX—Çó¡õ«J|÷¥dnŦw1z]þ“ñVNO)×Ä(øØN -™Aúª¶"pld/.´¾Õ¢¥9ô¦»lJçÕ1“-]½½R-ûz›sK¼Óæþr³¼ä¹bíh{+]cü
>ËYt³w®|>‘êqÓÈ]›çvJç«U¿}S¿)ŸQùaéN¿³#—‹*ä\ù<ïq§DÇ4ÊɪCü…H …Hl˹ ‰ž»§?,•öåf†`™65;Ø R~âtÎÓJ~òw«ÑÊ|²¼·º—UÖÒ|pCÌB·îÚáê…aFè N{ÎQJç÷;Ò?{Fyz…D—Š:À(ågÎ’„7óÆÙIÕcm"åEeÉV7”·©õnÆWçW§ßO¿>>ñjƒt†¡_¯Äk -蓼 s(|ÀçS#& í˜å¸ÀeØCð©ŽJž¨´šO\(X:q¯§UÔtZ%Ž)Y((žŽd\{e ëèʨҬô‡q‹Û½ßæj\šõšÜ[Úç2‡ônOˆ„Àˆàz~AuG…HDKð«ôiÏ_òç´6ÒÑ*®´•ˆ‡.%g$f÷ì˜Ûö@4%—]‘’žkN-W걧e A#“qÛŒsñ°¼Uü7 ©O9<„å(q8–QKšIÛ¹|Æ>àÜd oùÞ”+ë:DÂ(1¤RÌDXVÌaªºeWSÇ€æM÷ÌUI| `¼ã_÷ÎsŽ¼¯ŠïkÌÙi™Ùþ]}ÛuëJÌ~™¥wŠª/3û7‘}t嫺Ћ.#Þ÷¾½lW:±ðY°ª¥“ÎG¶Îd›Î˜»"á;Ö¨§sÖ¶Á ›ÆV -~Ïv×ñc´íl]\Ü*ãf:ÐFUñVÐè{G{y™`OÂï^ð./Wa
³€T+z °¤œØ½PvèräÑO6ék7_g‘yŠ–iy¿€+&PLüóÐùX*dµþÚ¹Õž®»„“ñ„±æàë"¥1bÐC›_sG•µÈ<©”•û[ôÈ™õI¤ ˜Oyw«“Íð9–®pßQ -ã÷[7-u,/RPÿp^.õ>Àk\3Åň<–ŸG)‹A{8Q‡º[ÂO;ÏCx‡Ú!$Ã|®¬LµÔ*‹^=à¶}ÜfYjµÑS°«yðóL´’);ñ½dÉxî§YMƒó9ÒP.üPmœýéÕ³vsþÍ/Ó0·Âý´.Ã: -Y…5ï™è¼Ž:T-×ú]á§ú"9s]åó1%…ϯ·ÿiçI -endstream +1389 0 obj +<< /D [ 1385 0 R /XYZ 79.822 757.87 null ] >> endobj 1390 0 obj -<< /Type /Page /Contents 1391 0 R /Resources 1389 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R >> +<< /D [ 1385 0 R /XYZ 79.822 746.912 null ] >> +endobj +1391 0 obj +<< /D [ 1385 0 R /XYZ 79.822 735.953 null ] >> endobj 1392 0 obj -<< /D [ 1390 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 724.994 null ] >> endobj 1393 0 obj -<< /D [ 1390 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 714.035 null ] >> endobj 1394 0 obj -<< /D [ 1390 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 703.076 null ] >> endobj 1395 0 obj -<< /D [ 1390 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 692.117 null ] >> endobj 1396 0 obj -<< /D [ 1390 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 681.158 null ] >> endobj 1397 0 obj -<< /D [ 1390 0 R /XYZ 79.822 724.994 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 670.199 null ] >> endobj 1398 0 obj -<< /D [ 1390 0 R /XYZ 79.822 714.035 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 659.24 null ] >> endobj 1399 0 obj -<< /D [ 1390 0 R /XYZ 79.822 703.076 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 648.281 null ] >> endobj 1400 0 obj -<< /D [ 1390 0 R /XYZ 79.822 692.117 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 637.322 null ] >> endobj 1401 0 obj -<< /D [ 1390 0 R /XYZ 79.822 681.158 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 626.364 null ] >> endobj 1402 0 obj -<< /D [ 1390 0 R /XYZ 79.822 665.218 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 615.405 null ] >> endobj 1403 0 obj -<< /D [ 1390 0 R /XYZ 79.822 610.423 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 604.446 null ] >> endobj 1404 0 obj -<< /D [ 1390 0 R /XYZ 79.822 599.464 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 593.487 null ] >> endobj 1405 0 obj -<< /D [ 1390 0 R /XYZ 79.822 588.506 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 582.528 null ] >> endobj 1406 0 obj -<< /D [ 1390 0 R /XYZ 79.822 577.547 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 571.569 null ] >> endobj 1407 0 obj -<< /D [ 1390 0 R /XYZ 79.37 540.879 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 560.61 null ] >> endobj 1408 0 obj -<< /D [ 1390 0 R /XYZ 79.822 510.789 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 549.651 null ] >> endobj 1409 0 obj -<< /D [ 1390 0 R /XYZ 79.822 499.831 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 533.711 null ] >> endobj 1410 0 obj -<< /D [ 1390 0 R /XYZ 79.822 488.872 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 478.917 null ] >> endobj 1411 0 obj -<< /D [ 1390 0 R /XYZ 79.822 477.913 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 467.958 null ] >> endobj 1412 0 obj -<< /D [ 1390 0 R /XYZ 79.822 466.954 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 456.999 null ] >> endobj 1413 0 obj -<< /D [ 1390 0 R /XYZ 79.822 455.995 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 446.04 null ] >> endobj 1414 0 obj -<< /D [ 1390 0 R /XYZ 79.822 445.036 null ] >> +<< /D [ 1385 0 R /XYZ 79.37 409.372 null ] >> endobj 1415 0 obj -<< /D [ 1390 0 R /XYZ 79.822 434.077 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 379.283 null ] >> endobj 1416 0 obj -<< /D [ 1390 0 R /XYZ 79.822 423.118 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 368.324 null ] >> endobj 1417 0 obj -<< /D [ 1390 0 R /XYZ 79.822 358.361 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 357.365 null ] >> endobj 1418 0 obj -<< /D [ 1390 0 R /XYZ 79.822 347.402 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 346.406 null ] >> endobj 1419 0 obj -<< /D [ 1390 0 R /XYZ 79.822 336.443 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 335.447 null ] >> endobj 1420 0 obj -<< /D [ 1390 0 R /XYZ 79.822 325.484 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 324.488 null ] >> endobj 1421 0 obj -<< /D [ 1390 0 R /XYZ 79.822 314.525 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 313.529 null ] >> endobj 1422 0 obj -<< /D [ 1390 0 R /XYZ 79.822 303.567 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 302.57 null ] >> endobj 1423 0 obj -<< /D [ 1390 0 R /XYZ 79.37 266.899 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 291.611 null ] >> endobj 1424 0 obj -<< /D [ 1390 0 R /XYZ 79.822 212.899 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 226.854 null ] >> endobj 1425 0 obj -<< /D [ 1390 0 R /XYZ 79.822 201.94 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 215.895 null ] >> endobj 1426 0 obj -<< /D [ 1390 0 R /XYZ 79.822 190.981 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 204.936 null ] >> endobj 1427 0 obj -<< /D [ 1390 0 R /XYZ 79.822 180.022 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 193.978 null ] >> endobj 1428 0 obj -<< /D [ 1390 0 R /XYZ 79.822 169.063 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 183.019 null ] >> endobj 1429 0 obj -<< /D [ 1390 0 R /XYZ 79.822 158.105 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 172.06 null ] >> endobj 1430 0 obj -<< /D [ 1390 0 R /XYZ 79.822 147.146 null ] >> +<< /D [ 1385 0 R /XYZ 79.37 135.392 null ] >> endobj 1431 0 obj -<< /D [ 1390 0 R /XYZ 79.822 136.187 null ] >> +<< /D [ 1385 0 R /XYZ 79.822 81.392 null ] >> endobj -1432 0 obj -<< /D [ 1390 0 R /XYZ 79.822 125.228 null ] >> -endobj -1433 0 obj -<< /D [ 1390 0 R /XYZ 79.822 114.269 null ] >> +1384 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R /F22 228 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1434 0 obj -<< /D [ 1390 0 R /XYZ 79.822 103.31 null ] >> +<< /Filter /FlateDecode /Length 3460 >> +stream +xÚÍËŽ¹íî¯èˆ¶$ê ¸Ý=äøäšœö’ÿ?„Ô£$QªêÒŒ½Yí®©–(ŠoRÔvûÏm»ýþe+ßÂÐþÿû—û/¿½›pÓ"x êöãß_$ÚnòæPÞÜœ•b³òöãÛ?¿n›~n›ÕÛþí_?þ¾ÃüíÝ«›ÁZð-¹9Zq(Þþf”Á'eË“y TIßûo´Fƒï+dÍ&ä¦8²Ö\C6á]àP@„@ïÈšýI•'½•'+ÛM)‹GsðCÏ??„ÙFÛl7mv‚Ègyra™„Ô0B_#„ÂmžCQ¸A¹™-í#å…ôz#¸†‘¡ô +8$‹"ïZ8¦N¤Ã½Œ£ç7刢ïåשÒ8ÎV„YM43è¡À•1D¾PšJïíNoö9Æi2ŽÆ f*r*âëìßÌ0£›öRlÚrº%œßŒ$ÜÓFç¿UúV÷SŽ©Ä60u&1qÆM5b
ê4 +çÍ(ž;„~É£æÞg·Ás?Š€Q–O^q£ +3\U„¸QiœÆsHƒÃLÖ²å©æ)Ò[eS÷Þ·è¯v£ÕúY_ü쑹¯câwQrmO‰¢‚ƒóŒŠM +X¨U‹A®ˆN +î‹“ßÏ\tÂl{ÄlÙqx³›ó*µ;%ÉMßFd‚ +"½OÙL1ÄŸ"?(4óC}êj™ZÉÍ0(³"ùr³®èrÃ`{°Ú«ÊÅj3 V;ùã“C»C;?+i6Bñà‡«m½öæz鲡úyVäÙBÍJ|aK™ÑnøBÁ™¨¦q?¯j”øZ+1…uBmžCPÏR`¸”âÖ•Ã} Å<)Ö¯Ð'F²2Öál‰Ð’šRÄæ÷PŒÿN£Ñ-ÄDcÑQ£På£Sc³»Ø3âÛåPï‹ÆÑ[®WÃT`쥧]f^òâ¨æ¨0á• g>Í‚ùÚø£w’MCSRO#W¶j|Û_»KtÆytN»ÄP´É.Ë~È‚¤ñ$iUB·Âõ0MÅò¤y*KÍ´Dì¹.Áµë@z- ÜðíRÒIhTš'ZÁ$ÙЪ-—”.½R[M#»äkn4öÛ€÷Ô(Ì7À +îžÌ·sêš“3!:8ô„„rü0<öÁŽrlIÖí9q'‚ä0Õ·¾× +Dz³Ð§8hLeŒ^À¿]Þ]ŽFœãå(·«xy)œA׋LF‚°º~VM#cU»ÉyG£šÂ‡ž«—²BkÍ¡’‚¦Ïjp€¾ÚŽY#¬·Èap»$}¸TA‘°°]mÈ¥ +åu +÷^·fŽòZÓFdm4öÑJ ”qvýKù¬íº‡Ô§Ÿ-—$©çýÇ«]—ÇÒ‹tW-•‹^¦½çBû).ª …nTº¡Ðb™Aú5E°„³ÇxÏÉ)ÎßÖpî!sõ¬kÚÐsšS/eÙZ‹ôrè*¥šÑÖ4•Aú•<¶RSœ×î³0H/ª j<þ´rÙO¶§e³ŸQCQÚ vóF¿å„Ny`g8Ê•lš3Qåd{’gâý…Ùºcñâµ}7ƒ’S¦Ôf/å42Øx0ÌñìmNþsUk1ËQ|•”Àf©iNŒ}ùát¢ow8^µ5m!Gí òAõyf@„ +#ÃfaY¸²”"Ýw;Ž—¯Ò]&ör²âXTô¦™"RÔšéãÛžôÖ°>¸¶? ÿ*«´¤9¶d´%ÔÍ9û¾@)fœé‡‰ŠâÛZÔ!e‚ØäÅæF0%s¦Úw¬ÙY>‘§îvïÕÛjíPwôXß»[j}•v”¡×™%*‰/ŠzC7Ÿ‹@yü£9ÅÏձ˲î£r(žÚ7Ç1 UMÅpÖó SkôGMy±Ï°‰$J§@m¬ë+„ÅÚö(‰nyŸÿµœšÅ4*G/ô½w.ì0ªu1mœŸø´Ý{©t‘™¦tæ7wúÕðAn±%a"šµð¡‡ô"l[éáþ~ñ‚FçÞ×]ʧÒjA6vJF½DÆÐJð;œR.îÀ{a·i²põÊBÙBiHþô0˜®KX=
ݯ–ÐgRãƒ4Ã>^é&³åÆëF‹uµ…ùc +–¯ ïÝqáù9;)õ +G{éXÈ4ÞÓ©köä´ µØ„ÌÐÉMž|+´÷†ú²)'éð¯›éÖ/†QÇð†¼çÃáUÅ/j¼pÒsfVK7Ü&8{ÓhX\½ümHß?¾üV½Œ +endstream +endobj +1433 0 obj +<< /Type /Page /Contents 1434 0 R /Resources 1432 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R >> endobj 1435 0 obj -<< /D [ 1390 0 R /XYZ 79.822 92.351 null ] >> +<< /D [ 1433 0 R /XYZ 78.37 808.885 null ] >> endobj 1436 0 obj -<< /D [ 1390 0 R /XYZ 79.822 81.392 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 768.829 null ] >> endobj -1389 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R /F22 228 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> -endobj -1439 0 obj -<< /Filter /FlateDecode /Length 3166 >> -stream -xڽˎ#¹í>_ሦD½Aãv{ƒ¹¹&§½äÿ!%Qï*WuÏf -ÿ²F¢ÄÞ„
¹Tv±¤ô÷ -vœ|e#•Â'vQiœÆ¦ý2y•=OuO‘ß]ݳunq»*N«Ýf=o³{‰O6rm™Á+'RfÃ&djÍbÒë=¦)'…ÇÈwd¿_ítÊ¡°K°g¶¼qxSÜyÕÚÂIÚ&‚o²E@è‘æa•O(‚C7£&H%‰øZV‹f“‹Hü5n·]4Ngé놾1Hâà(jP„0…ZñmÞ8‚*$”u¯9r,a„‘a„ÒÊ%kMÁ¸ã6ù´-çÈ HŸKÈæu -ÉSÐ üfš{û#½a©9éq².‚Æ~ÊálF( -z¹*•D·e&(þjf·”‡Œy˜?•‡á¦ÀO@|Ò/öVäö8垨̿ðF~s@Ø0W̹rsƒýŠ%S³9úÑéo61¸'%Ss-«²%——æS,¬s•E•âõZWY‚ ‰Ss5BŸLª1阀t%ˆ«ø¸M87'ùê>#© '(fQéJ9qOZ|”L{–ÑM¤Õs*Sjó# yL˜’nS¹©ùþ¨pÍGS=¹Ê:t›^Ú‘uúãë&¸Pjí5i_‡.éïl+‹u9¿‹Ag“Û˶Ø5ˆã½¯ b½OÙ;â/±_{ákÙOw²<èÑaPV54ÚËÍuCÇÆšz'‹ÊÙk@.xí´Ï½P¥=?¿ªh6JñHQäº\»ózå²áúqV¢)s·Å€HÅJ„-e.xD¿á™ƒ92¦q?.jÔƵ®ÄÖ Øü>¸Àp*Åß-‚Ã}âÅ:aïÇü‰‘¬Œe8ËZ2SŠØ|) -^€Ñãì.öŒøv9TÄû¤„qô–ËÄÕ11ŒRz*:óR{%GÀ(ZN\P9ó¡hV™Í~á.²)*^JYb¶(•:߶Ä×R©Î£:Q‰¡h“]2=äAÒxÒ‚4† -¡K=ÌA{ž4b‘K¦±çºÄh];ÚkêÍH.Õ!TIɆµH64´õaNéÒØ3µÕ4²K¾ÖNAcš`¶ ï¥SX®Pm‚p¯¥ -rÔŎý¼T¦¡¼Nßž•4³—Óš6k#±¯%OŒBF’Ïží3É=”>ïüZ“y´;!è¯!ØCy‘äÂ¥"ÑËd÷X]¿&?0Ô–Sò{±²6@ù+ë^Ê{Œñ¦tølÝ‹î¡Ëó¨ïjÙ¿s˜C_ZËk]e–sB‡0)¿ºÆ¬Ê_*]kq3ñ=[ c|; /ª;œ§ªzüßÊb¿Ùc–Ç~GD)L(þP}Ô(—OâÀ«á¬gͪ9û'Û;»×‡xø;¬;g/Në0?$-ë¡äÔ(µ{ÙS¹‹6 -V°äuUBñt¾9ƈÉ&4•ÁUoƒÊä«2ï4ßÅvÂ&‚àŽ€Ú@×WÙÛö&‰o™Îmü•OÇbÊ”£z–…£z÷ÓFÁÇ“¶K/•(²0Tc)ûÍ‚²I@=ŒÝ[Nù¾Ï‹?×¢‡Ò‹píJ«ö{mËnÊtúÕ5X7Ûûõ-å³ AâãÂ5Í9
Ï^c`>ö®„½Óyä5 HáA®h8{7!Ó0@Z…’¿3NØûMxKìOp×”FH+ì阜š«´+¿U=¼VA»0AÉ‘V»áí-‡§ïuGÍÙB=€¯V3nuÛmãtk=ܹ(C‹;ç¦V2<[aöšÔó»^ˆ^Ä× -Z/ñõ×ðí!ý5¹bÂY;üÉ,íÄ\ù‡Ôãü¢^zpÝët_êoSCÞØ]M0Uû{äÐ3}æ#ˆ.ØàùÏZ]£•šó~cø¸]ò[_ºÉ3BúJ" - - -ù–Á +~Ó¶¹òßfï¡ÓÝ3xY¦§9!ÀHȧŽ/ÖçȨL¸‚WÐ÷î`ðøDÝN†Œnâ¿¢‚CC>]Ïê˜VÆúœ9Ï•i¤È TëmÇ8UÙŠª€óÅ°NÜŒMÊ.bX¶-¢~Ì„…×ö¼³êF©š@xy•eîû>víeþúÍÉ‹O P#ö|Å©Ía»þã›>ÉxøRÔº/ϸבsÞóò ,Þ °5Ç'«Ú» ñÜ¡*Õ?Ô¼¤Ýil—Áéëy×LwçL[>;Ù8CÂ÷°ÊÉÆiÐQ(;áÈ&qäô7&F6ͼÓM7FöÅŠ1&’¦2h6(6G“SæyMCQCYe„QÛ•j‹|ôÿÆþ(¦W¸>Üãˆëõ÷8ŒÚ½ -Ù’õ ‰|ÝUlX%¯ö£€ÿBßúa÷ñEO† &h±ˆ×܃)R¾½úGoáÀ‹»D8{M7N󽜺K('©¥&d™.nîäK ýž¨O;tRÿºyîúE0:+§¸kÄîÝÄÍ#|'ý$Îêñ¦ûƒÔwoìM£{qe‚ý9D}üúö?b‰bN -endstream +1437 0 obj +<< /D [ 1433 0 R /XYZ 79.822 757.87 null ] >> endobj 1438 0 obj -<< /Type /Page /Contents 1439 0 R /Resources 1437 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R >> +<< /D [ 1433 0 R /XYZ 79.822 746.912 null ] >> +endobj +1439 0 obj +<< /D [ 1433 0 R /XYZ 79.822 735.953 null ] >> endobj 1440 0 obj -<< /D [ 1438 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 724.994 null ] >> endobj 1441 0 obj -<< /D [ 1438 0 R /XYZ 79.822 768.829 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 714.035 null ] >> endobj 1442 0 obj -<< /D [ 1438 0 R /XYZ 79.822 757.87 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 703.076 null ] >> endobj 1443 0 obj -<< /D [ 1438 0 R /XYZ 79.822 746.912 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 692.117 null ] >> endobj 1444 0 obj -<< /D [ 1438 0 R /XYZ 79.822 735.953 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 681.158 null ] >> endobj 1445 0 obj -<< /D [ 1438 0 R /XYZ 79.822 611.42 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 670.199 null ] >> endobj 1446 0 obj -<< /D [ 1438 0 R /XYZ 79.822 600.461 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 659.24 null ] >> endobj 1447 0 obj -<< /D [ 1438 0 R /XYZ 79.822 589.502 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 648.281 null ] >> endobj 1448 0 obj -<< /D [ 1438 0 R /XYZ 79.822 578.543 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 637.322 null ] >> endobj 1449 0 obj -<< /D [ 1438 0 R /XYZ 79.822 567.584 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 626.364 null ] >> endobj 1450 0 obj -<< /D [ 1438 0 R /XYZ 79.822 556.625 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 615.405 null ] >> endobj 1451 0 obj -<< /D [ 1438 0 R /XYZ 79.822 529.726 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 604.446 null ] >> endobj 1452 0 obj -<< /D [ 1438 0 R /XYZ 79.822 451.021 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 494.94 null ] >> endobj 1453 0 obj -<< /D [ 1438 0 R /XYZ 79.822 440.062 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 483.981 null ] >> endobj 1454 0 obj -<< /D [ 1438 0 R /XYZ 79.822 429.103 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 473.023 null ] >> endobj 1455 0 obj -<< /D [ 1438 0 R /XYZ 79.822 418.144 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 462.064 null ] >> endobj 1456 0 obj -<< /D [ 1438 0 R /XYZ 79.822 407.186 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 451.105 null ] >> endobj 1457 0 obj -<< /D [ 1438 0 R /XYZ 79.822 396.227 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 440.146 null ] >> endobj 1458 0 obj -<< /D [ 1438 0 R /XYZ 79.822 385.268 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 418.551 null ] >> endobj 1459 0 obj -<< /D [ 1438 0 R /XYZ 79.822 374.309 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 346.034 null ] >> endobj 1460 0 obj -<< /D [ 1438 0 R /XYZ 81.145 321.507 null ] >> +<< /D [ 1433 0 R /XYZ 79.822 335.075 null ] >> endobj 1461 0 obj -<< /D [ 1438 0 R /XYZ 81.145 310.548 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 324.116 null ] >> endobj 1462 0 obj -<< /D [ 1438 0 R /XYZ 81.145 299.589 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 313.157 null ] >> endobj 1463 0 obj -<< /D [ 1438 0 R /XYZ 81.145 288.63 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 302.198 null ] >> endobj 1464 0 obj -<< /D [ 1438 0 R /XYZ 81.145 277.671 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 291.239 null ] >> endobj 1465 0 obj -<< /D [ 1438 0 R /XYZ 81.145 266.712 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 280.28 null ] >> endobj 1466 0 obj -<< /D [ 1438 0 R /XYZ 81.145 255.753 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 269.321 null ] >> endobj 1467 0 obj -<< /D [ 1438 0 R /XYZ 81.145 244.794 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 218.287 null ] >> endobj -1437 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R /F79 227 0 R /F75 203 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> +1468 0 obj +<< /D [ 1433 0 R /XYZ 81.145 207.328 null ] >> endobj -1471 0 obj -<< /Filter /FlateDecode /Length 3060 >> -stream -xÚå\K䶾ï¯Ð0M²øLoOð-ÎÞŸd/ÙC|ÉßOQd‘T‰R‹39%ÆÝGñ«ë)\¾/rùå‹,Ÿ·o_~~h½Dvfùö/ -OÈE-> -ð‹wJH§–o?–ß_¤tAJxàŸ~ýÉBÀ#Ÿ7<ów«ðó.¥úŠÇd>øçÖ»âK¾|ýRz—ïOÔóý¯|ûÑ);B§uÎ(ŽÏ«× -ò= C¾rFŠ-’_û¨üè´ SL×ë[ÆhÜHíà…²ÕÎm”@é—¶:í€$
P½4ʯ"÷Ä]>’ðÒÝíèª÷ÐvÓÊYÈ:htIN…’ˬvä²|2º´ã ZFÑÁƒÎýF‰6…»÷êW?²ÂÆå*É-¯L[µmÀwþ¶hL=*n¨¸›õ7Ä'9²1â¯ø27ôe&ô´v§cÓ¼Ô]ìD[¡¢îAo]DÖh¡ã͈Ž’Z8œ’~ßîk›öÁƒï‰S„Ê<¸ÃˆºØ»¡Í((‚5/M©$ S>]1Þ´t–_þEF”àTY*Äम4Þ¬>ãr¬¬Žcw®:mœ‘O#6òŸ{aÅs_Ÿbi„ʼn§-gã`‹{ÚâýÌ÷²ÅF²Ç£–;—볇ì,WTäÖ
}~÷À0¥:Ø>áx–4¤uŒétˆ¿l1º¦f -ë–eÍw€Ë -šq\ùs£¿ž&£LAq@Ãê)cÞºnÌVf¿±fý £hj¼¶}lìW›3ß‘A]À<§n -ϧX]9ªëBµ˜šFZ°ê–ÒT8ñÃ8ŸÿY•úv8ÿSñ¥KªK»§õ¹ÎH¡ÞÎ;ºÞ -…u_I•ºûž•ÖXƒÚf…%f,_¡ök¬â}˜õãìtbƒv'‰‰!¤®3:&F¡Îï06ÏLÓ™¾À8m@4" ‰ñçz'F9!ãžJêKÅX&²š&²ë.:šFä³^·hÕϨÖÞ–¥yÌpøˆ{Xøê'©Äõ…!J »¾ç™J•–1#:Ôè]§v·å¨æÌ:UÄÅóq8°µ®;TC)pÖP'±ÖËÃõ2¹îüLH¢aDqf&|3BçáûƒbÞ†ûó -Ø`Õìb>} -²ÔÂëzgÕ8?šÛº0zeÅ(¯°>ã>8;â2¥û€¥Ôv‘Ôˆ¬`œÛ2Z_œòtÅFBû—ƉØö¦ÝÀ¸¾Það/ìíóú*|N5éšúB³Ì¯øƺê€|ý5z¹)p5gÎ<tôl„çoâ‰àÜæaYz÷¾w˜
-¿ZxåUÁúâÎ{Bé^=Ô¡Õ¡%H¬OÎ%û×$Žÿ9ô‰Ö-èq£oƒá}E‚^ã?á’ -endstream +1469 0 obj +<< /D [ 1433 0 R /XYZ 81.145 196.369 null ] >> endobj 1470 0 obj -<< /Type /Page /Contents 1471 0 R /Resources 1469 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R /Annots 1516 0 R >> -endobj -1516 0 obj -[ 1468 0 R ] +<< /D [ 1433 0 R /XYZ 81.145 185.41 null ] >> endobj -1468 0 obj -<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 236.441 457.465 246.868 469.985 ]/A << /S /GoTo /D (Hfootnote.25) >> >> +1471 0 obj +<< /D [ 1433 0 R /XYZ 81.145 174.452 null ] >> endobj 1472 0 obj -<< /D [ 1470 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 163.493 null ] >> endobj 1473 0 obj -<< /D [ 1470 0 R /XYZ 79.37 773.016 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 152.534 null ] >> endobj 1474 0 obj -<< /D [ 1470 0 R /XYZ 81.145 647.932 null ] >> +<< /D [ 1433 0 R /XYZ 81.145 141.575 null ] >> endobj -1475 0 obj -<< /D [ 1470 0 R /XYZ 81.145 636.973 null ] >> +1432 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F81 248 0 R /F74 202 0 R /F79 227 0 R /F75 203 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1476 0 obj -<< /D [ 1470 0 R /XYZ 81.145 626.014 null ] >> +1478 0 obj +<< /Filter /FlateDecode /Length 3062 >> +stream +xÚå\K䶾ï¯Ð0M²øLoOð-ÎÞŸd/ÙC|ÉßOQd‘T‰R‹39%ÆÝGñ«ë)\¾/rùå‹,Ÿ·o_~~h½Dvfùö/ +OÈE-> +ð‹wJH§–o?–ß_¤tAJxàŸ~ýÉBÀ#Ÿ7<ów«ðó.¥úŠÇd>øçÖ»âK¾|ýRz—ïOÔóý¯|ûÑ);B§uÎ(ŽÏ«× +ò= C¾rFŠ-’_û¨üè´ SL×ë[ÆhÜHíà…²ÕÎm”@é—¶:í€$
P½4ʯ"÷Ä]>’ðÒÝíèª÷ÐvÓÊYÈ:htIN…’ˬvä²|2º´ã ZFÑÁƒÎýF‰6…»÷êW?²ÂÆå*É-¯L[µmÀwþ¶hL=*n¨¸›õ7Ä'9²1â¯ø27ôe&ô´v§cÓ¼Ô]ìD[¡¢îAo]DÖh¡ã͈Ž’Z8œ’~ßîk›öÁƒï‰S„Ê<¸ÃˆºØ»¡Í((‚5/M©$ S>]1Þ´t–_þEF”àTY*Äम4Þ¬>ãr¬¬Žcw®:mœ‘O#6òŸ{aÅs_Ÿbi„ʼn§-gã`‹{ÚâýÌ÷²ÅF²Ç£–;—볇ì,WTäÖ
}~÷À0¥:Ø>áx–4¤uŒétˆ¿l1º¦f +ë–eÍw€Ë +'~`çó?«R¿Õç*¾tIui÷”£>×)ÁÛyG×[¡°.ã+©Rwß³¢ÒkPûÀ¬Ð ÄŒå+Ô~U¼³aœNcÒî¤511„ÔuFÇÄ(ÔùÝÆæ™i:Ó§ˆF41¾â\ïÄ('dÜSI}©ËDVÓDvÝEGÓˆ|ÖëúÕÚÛ²4q_ý$•¸¾0D t×÷<S©Ò#†aD‡=°ëÔî¶ÕœY§¢Š¸x>¶ÖÕb‡êa(ÎÚê$ÖÚ`y¸^F"ן ©C4Œ(îm&|3BçáûƒbÞ†ûó +Ø`Õìb>} +·£¶ØFyÓå«‘ Æá€kŒ)tÜSŠ}ƒ-ŒÆObƒ˜*‘´‹m‚Ƶî`Yš]†}·âíz·‚ 1J›þÔ§:I˜¹ +«a„ñjc‚02Jͺ._˹þ,N…ÝwÚΫµ>ád”Úv+NáÖæ#ä8ZŽTó£Iü‹‰}ƒ}Åÿ6‡ŸQªø¸ö)'qcâöå„&m˜Qº ÷Y¬è<ݾ½b
sX¥ÈÇ +QÈà†63—1pJÍÆm{ëÃëþm”³1ãñ´þÔ3í®ä»kºŠrw.×è„Ós€Jû¡dçòNiÇ›îÞÒùTTÎåÂÐzçâ6§t1n§.þÿ…X'´Œ#iOfœRã¼'E‚ö¶ßÿ¶dÚî3Ž0qJ›ÈÍ›†¦xåúÔáôþƒ«êîÉL‰Sj¸éÙã[kÏãÔñáœÌŒ8¥Š“ùI|Jcig†øÞ¦Ú«œÒÓ†ù®ùÝõ\f†ÏD£Ç +endstream endobj 1477 0 obj -<< /D [ 1470 0 R /XYZ 81.145 615.056 null ] >> +<< /Type /Page /Contents 1478 0 R /Resources 1476 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R /Annots 1523 0 R >> endobj -1478 0 obj -<< /D [ 1470 0 R /XYZ 81.145 604.097 null ] >> +1523 0 obj +[ 1475 0 R ] +endobj +1475 0 obj +<< /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [ 236.441 457.465 246.868 469.985 ]/A << /S /GoTo /D (Hfootnote.25) >> >> endobj 1479 0 obj -<< /D [ 1470 0 R /XYZ 81.145 593.138 null ] >> +<< /D [ 1477 0 R /XYZ 78.37 808.885 null ] >> endobj 1480 0 obj -<< /D [ 1470 0 R /XYZ 81.145 582.179 null ] >> +<< /D [ 1477 0 R /XYZ 79.37 773.016 null ] >> endobj 1481 0 obj -<< /D [ 1470 0 R /XYZ 81.145 571.22 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 647.932 null ] >> endobj 1482 0 obj -<< /D [ 1470 0 R /XYZ 81.145 560.261 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 636.973 null ] >> endobj 1483 0 obj -<< /D [ 1470 0 R /XYZ 79.37 524.62 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 626.014 null ] >> endobj 1484 0 obj -<< /D [ 1470 0 R /XYZ 81.145 494.97 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 615.056 null ] >> endobj 1485 0 obj -<< /D [ 1470 0 R /XYZ 81.145 455.003 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 604.097 null ] >> endobj 1486 0 obj -<< /D [ 1470 0 R /XYZ 81.145 444.044 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 593.138 null ] >> endobj 1487 0 obj -<< /D [ 1470 0 R /XYZ 81.145 433.086 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 582.179 null ] >> endobj 1488 0 obj -<< /D [ 1470 0 R /XYZ 81.145 422.127 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 571.22 null ] >> endobj 1489 0 obj -<< /D [ 1470 0 R /XYZ 81.145 411.168 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 560.261 null ] >> endobj 1490 0 obj -<< /D [ 1470 0 R /XYZ 81.145 400.209 null ] >> +<< /D [ 1477 0 R /XYZ 79.37 524.62 null ] >> endobj 1491 0 obj -<< /D [ 1470 0 R /XYZ 81.145 389.25 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 494.97 null ] >> endobj 1492 0 obj -<< /D [ 1470 0 R /XYZ 81.145 378.291 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 455.003 null ] >> endobj 1493 0 obj -<< /D [ 1470 0 R /XYZ 81.145 367.332 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 444.044 null ] >> endobj 1494 0 obj -<< /D [ 1470 0 R /XYZ 81.145 356.373 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 433.086 null ] >> endobj 1495 0 obj -<< /D [ 1470 0 R /XYZ 81.145 345.414 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 422.127 null ] >> endobj 1496 0 obj -<< /D [ 1470 0 R /XYZ 81.145 334.455 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 411.168 null ] >> endobj 1497 0 obj -<< /D [ 1470 0 R /XYZ 81.145 323.496 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 400.209 null ] >> endobj 1498 0 obj -<< /D [ 1470 0 R /XYZ 81.145 312.538 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 389.25 null ] >> endobj 1499 0 obj -<< /D [ 1470 0 R /XYZ 81.145 284.526 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 378.291 null ] >> endobj 1500 0 obj -<< /D [ 1470 0 R /XYZ 81.145 273.567 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 367.332 null ] >> endobj 1501 0 obj -<< /D [ 1470 0 R /XYZ 81.145 262.608 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 356.373 null ] >> endobj 1502 0 obj -<< /D [ 1470 0 R /XYZ 81.145 251.649 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 345.414 null ] >> endobj 1503 0 obj -<< /D [ 1470 0 R /XYZ 81.145 240.69 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 334.455 null ] >> endobj 1504 0 obj -<< /D [ 1470 0 R /XYZ 81.145 229.731 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 323.496 null ] >> endobj 1505 0 obj -<< /D [ 1470 0 R /XYZ 81.145 218.772 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 312.538 null ] >> endobj 1506 0 obj -<< /D [ 1470 0 R /XYZ 81.145 207.814 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 284.526 null ] >> endobj 1507 0 obj -<< /D [ 1470 0 R /XYZ 81.145 196.855 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 273.567 null ] >> endobj 1508 0 obj -<< /D [ 1470 0 R /XYZ 81.145 185.896 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 262.608 null ] >> endobj 1509 0 obj -<< /D [ 1470 0 R /XYZ 81.145 174.937 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 251.649 null ] >> endobj 1510 0 obj -<< /D [ 1470 0 R /XYZ 81.145 163.978 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 240.69 null ] >> endobj 1511 0 obj -<< /D [ 1470 0 R /XYZ 81.145 153.019 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 229.731 null ] >> endobj 1512 0 obj -<< /D [ 1470 0 R /XYZ 81.145 142.06 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 218.772 null ] >> endobj 1513 0 obj -<< /D [ 1470 0 R /XYZ 81.145 131.101 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 207.814 null ] >> endobj 1514 0 obj -<< /D [ 1470 0 R /XYZ 81.145 120.142 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 196.855 null ] >> endobj 1515 0 obj -<< /D [ 1470 0 R /XYZ 93.716 89.795 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 185.896 null ] >> endobj -1469 0 obj -<< /Font << /F22 228 0 R /F15 199 0 R /F81 248 0 R /F65 200 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> +1516 0 obj +<< /D [ 1477 0 R /XYZ 81.145 174.937 null ] >> endobj -1519 0 obj -<< /Filter /FlateDecode /Length 2586 >> -stream -xÚÕ¹n,72_1á:—¬â <ÞH+[8õFëÿÍ«xw«9z6°ÔÓl²XëbñÛoüöë7žŸ¯ßþý.ÔÍ1§AËÛÇß„ÿÀoâfCs3Z0®Åíã·ÿ|ç܈g‹þ‰ðü„½s.~<ƒ
_yzÖ¯8לsž.ý¡ÿ-ï4Cüßôݯ“i´éÇ=£ŸÿøÍãlÅ -gàŽÿiÀ:@Q2팯‚‘K¨˜r„ EØ;`šhø¦ñH—ç„iŽx%:ònk£0LÚ‰Ëh$͉/‚„}â`Ïí²4 LÂ?¥¦lĆ3Äïÿÿê1Sî&™³¡ÅÌó¨i€&¼”ßÉJÃ&XY‘¼Dàf=…mÇæÀŽ€¢@<‚ðšÀ>?)PÛŒ¦U(é¼Dfä7¥ƒÛ `‘êœn˜Ç¦¨ -L÷Ïz>?ù
xødÓ†ñ¬¤3eÒ–aûÀ˜€R-‘šf)|Fø^O„†ãLËjÚZ…“Qk÷ðùþg§F eRã¸G`îžBf@P¢~,IPoIJDvå -5yVxCÞp ;X -Å”ƒ•ì ±‡ÔÆÿó·ÂÏ"‡Ê
Š|êŪî½ú]xŸŒ|ÇÈ`ó\Yó7Ò’Z8‘Øä —>ªÁõëÖ¡ï
ÆÊ"R¬cp8b²Xò«YËš¢²Å¯MhJ4Â+ël: iÔûÖ§š=Ç!}¯V§.NØ.æ¾G¹]³È´òµ¨Mg%2‰jdÈýˆÖHfÅÄöâÈ*é2•¸£1Y‡+Å`yd8Bªf¬Z”½¼ç˜Uùà ä9¤*÷º[ã6[igæFNY -&ª¥ëò’’½Ç¼ä -7Ê@¸¦ @Ž¶ùrG(âîè‰_(›©»„ø!¿A›“5ϪUa¸Å©hS£ôBDGê’íI£T h%á°æƧTÁÂ(©Íš±´Îkï$ïÊQ;©MÑ¡^`&»™2»(ñhšr^ÿ@€$z§¾¶ÌrÇ2€~~1¤?úIåãýÉzèàžvn“ÑȦ·Yeá^k°gó¶Ï-¼º-SÍ‹WYäÈHËÀê-†?›¢ð^T®0¼X+öŽƒB¹ÀêO×ñÎŒ›jYáîk³–5@šË ½œ”?DÒØ¥A\hè¾6qÇ,êÍ›¥ŸR_’YɧŽuaõþè,³Æ®ð¿Xxàø)p»Üüï-
׬Á.MÖÛ<á–4½ìÑÔCÝäqBÕ¤P65Õ@.¥5iQ7çk´íÉY‘~5$Ò;@öPkæØ!»‡Péš~}îAæ’pWâÆ>(”_/u¢òa¶„¥vª-‹1@z#)·¸ÄHîa4@ú'’Wq1r©a[) )y=k÷ -:„£vöŽÛ=¨´ŽPÇ""Ýg—(êų®Ë©Bh§ -á?ÑMF2UÝVÛæ
Ý÷Z£€#FU(ås?ŠnqEŸæ1¨TÙ”—g¥·–Aiä©xT¨F&l¦.(ó:;±òàÆ9a]6 e)–rB-+¤¯ìÛ7Ä;æTE$ë×Þ1ç}(šÏM”ÔÒýr ØÏïr‘dö³bjéIiSW)éÒ -endstream +1517 0 obj +<< /D [ 1477 0 R /XYZ 81.145 163.978 null ] >> endobj 1518 0 obj -<< /Type /Page /Contents 1519 0 R /Resources 1517 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1130 0 R >> +<< /D [ 1477 0 R /XYZ 81.145 153.019 null ] >> +endobj +1519 0 obj +<< /D [ 1477 0 R /XYZ 81.145 142.06 null ] >> endobj 1520 0 obj -<< /D [ 1518 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 131.101 null ] >> endobj 1521 0 obj -<< /D [ 1518 0 R /XYZ 81.145 754.995 null ] >> -endobj -166 0 obj -<< /D [ 1518 0 R /XYZ 79.37 716.953 null ] >> +<< /D [ 1477 0 R /XYZ 81.145 120.142 null ] >> endobj 1522 0 obj -<< /D [ 1518 0 R /XYZ 81.145 645.278 null ] >> +<< /D [ 1477 0 R /XYZ 93.716 89.795 null ] >> endobj -1523 0 obj -<< /D [ 1518 0 R /XYZ 81.145 634.319 null ] >> +1476 0 obj +<< /Font << /F22 228 0 R /F15 199 0 R /F81 248 0 R /F65 200 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F16 201 0 R /F71 212 0 R /F53 210 0 R /F73 215 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1524 0 obj -<< /D [ 1518 0 R /XYZ 81.145 623.36 null ] >> +1526 0 obj +<< /Filter /FlateDecode /Length 2582 >> +stream +xÚÕ¹n,72_1á:—¬â < ½–8V¶pêÖÿšWñjvOsôl`©§Ùd±.ÖÅâ·ÿÞøí×o<?ß>¿ýûC¨›cNƒ–·Ï?¾ ÿßÄÍ8†æf´`\‹Ûçÿnÿùιw‹þ‰pAŒ¿>8?î`ÃWžžõ«Î5ç\†§KèËfˆã›Þü:™ÖH›žqÜÃ1úþûçog+f8wÌøOÖŠ’ig|ËŒœB@ÅŒ#-ÂÞÓDCÀ'à¨0Gº<'”HsÄÑ‘w›ó…aÒ&AÒœø(HØ'~ +Â$Ìð£QjÊFl8SAüþÿ¯3ån’9+ZÌ,0ª‘†hÂKùL 4`㬬H^"p³žB¶…ãs`G@Q AxË +`ï/ +Ô2£iJú¯‘ùM©çàv$X¤z +²%RÓ,…w„ïõDhˆ0δ,¡¦eQ8µv÷?;5-“Ç=sðÚ0j„õ»`I‚ªxKR"²+W¨É³Âšð†SØÁjØðvöÒé=œÃBžŸm@¦¼%y"«5ì8{`!¤dÆìxâOò‹Äˆ‘H +ßã[9Þò®Xá2Bs1«»|+ö9Ò› ‹b§='> +·€æ†Ñ*àȵHã F3m±ècäGÁÔdÜìÝFi˃„Ë^NAÂau4‚Ð} +.ˆÇ‚¼ìˆÌŒâÉ2%ÔÓX"WtF¹ª¹4™ÙàË%h¾&ðÄþ½¢¦9½¸“ú’É lÃ:ˆ_4íÇ}D[kçzŒÅî˜Ac/1 +¶q3ãq<sÌYäÚ+3˜'ܲàŠ!Ç¢·85>F0´jÜ!hñ+¨so>ÈÉÆ£C2ܲnl™5 )oäïÕílæ—Ÿ
X! +£ó·íª¤þI£m3“¤ÜI;ø¨Üï!îø|N«çXôü‰PC£aŠ»i¨aWBÐ#?ûÎ*'‡½÷`!¨¨O¦¦ä‚fJͨÕêµÂG(a +E1BNA£ª…«e//ä}̪|pòR•îÖ¸ÍVÅÙ†¹‘S–‚‰j麼¤dï1/9€d-wIŠòž>§—ãÜŽÉóóR1Àݪe_ï-Ó0õõò}åØ€¾èëgã—ÿWè˜6#B½À¸%×Ñ:ñÿ°÷ÿ—~mgÔñæ–_ïAQÒŸ*~Iëñ{ý¦jAfˆ2ϸý×Æ[ýœ¸cQN`™b&(k‚ê!ÍS‡gãQý” +ÃŒ‚múméö€–¼¯t»3ó¾RÚ/–¥¤`¨qQWŸü¨Lå –ˆ¨£WOØw^=
^]J7¤ÖyžYqTTÒœ§ž]+ÆÑä@ÎF-”¤2Sâ–˜'Cáö"ñ3Ö5 +@~>qç‚jåR•,YB>u¹*þâæ,Æä:W²¤p£„k +äh›/Û8BwGOüBÙLÝ%Äù
šØ¤à˜¬yV +õp(¶HE›¥7r :R—lO¥E+ ‡97¾p8¥ +öFI-ÖŒ¥u^{wò®µû"Õ ):ÔÌÎ.C¦ÌNJ|Gš¦œWç? I…Þ©Ï-óëŠe +¥|îGÑM®èÓÜ#•*ûƒòòÌ ôÖ2(|!u¯‚ +ÕÈ„ÅÔ…`^gw¬<¸qNX—†
hYŠ¥œPË +é+A#ûvÀ
ñ9UÉúµwÌyŠæsS%µt¿(ösćœ$Y =Ǭصô¤´©+ˆ”ti€€ÎS˜ÞÒ8ñÕ:][Ãü8ï"P}R{ RS¥G>Õ3¯!¨{Úÿõç/§%zï6Aâˆ@U¤ªBmãBc_";‹p»Ž›8R:M¾)«¢U:X5éÓI1Ž‰zifJË·¡‰É¥F¤ÓN)S>‡0í59*Qi&¸ÞiÜx± WKåò(éáÑÕ’ãgWK +”,^t躥‰ˆ°BÍ4̺š4#gÖÙ= ||mõC©UœA1Åé‹yµ51î ¼{P¯æCRµM.Ìù*æB2çì¾Z#'ÌHjß +endstream endobj 1525 0 obj -<< /D [ 1518 0 R /XYZ 81.145 612.401 null ] >> -endobj -1526 0 obj -<< /D [ 1518 0 R /XYZ 81.145 558.397 null ] >> +<< /Type /Page /Contents 1526 0 R /Resources 1524 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1132 0 R >> endobj 1527 0 obj -<< /D [ 1518 0 R /XYZ 81.145 547.438 null ] >> +<< /D [ 1525 0 R /XYZ 78.37 808.885 null ] >> endobj 1528 0 obj -<< /D [ 1518 0 R /XYZ 81.145 536.479 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 754.995 null ] >> +endobj +166 0 obj +<< /D [ 1525 0 R /XYZ 79.37 716.953 null ] >> endobj 1529 0 obj -<< /D [ 1518 0 R /XYZ 81.145 525.52 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 645.278 null ] >> endobj 1530 0 obj -<< /D [ 1518 0 R /XYZ 81.145 461.441 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 634.319 null ] >> endobj 1531 0 obj -<< /D [ 1518 0 R /XYZ 81.145 450.482 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 623.36 null ] >> endobj 1532 0 obj -<< /D [ 1518 0 R /XYZ 81.145 439.523 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 612.401 null ] >> endobj 1533 0 obj -<< /D [ 1518 0 R /XYZ 81.145 428.564 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 558.397 null ] >> endobj 1534 0 obj -<< /D [ 1518 0 R /XYZ 81.145 417.605 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 547.438 null ] >> endobj 1535 0 obj -<< /D [ 1518 0 R /XYZ 81.145 406.646 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 536.479 null ] >> endobj 1536 0 obj -<< /D [ 1518 0 R /XYZ 81.145 395.687 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 525.52 null ] >> endobj 1537 0 obj -<< /D [ 1518 0 R /XYZ 81.145 384.728 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 461.441 null ] >> endobj 1538 0 obj -<< /D [ 1518 0 R /XYZ 81.145 373.769 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 450.482 null ] >> endobj 1539 0 obj -<< /D [ 1518 0 R /XYZ 81.145 362.81 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 439.523 null ] >> endobj 1540 0 obj -<< /D [ 1518 0 R /XYZ 81.145 351.852 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 428.564 null ] >> endobj 1541 0 obj -<< /D [ 1518 0 R /XYZ 81.145 340.893 null ] >> -endobj -170 0 obj -<< /D [ 1518 0 R /XYZ 79.37 304.782 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 417.605 null ] >> endobj 1542 0 obj -<< /D [ 1518 0 R /XYZ 81.145 221.1 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 406.646 null ] >> endobj 1543 0 obj -<< /D [ 1518 0 R /XYZ 81.145 210.141 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 395.687 null ] >> endobj 1544 0 obj -<< /D [ 1518 0 R /XYZ 81.145 199.183 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 384.728 null ] >> endobj 1545 0 obj -<< /D [ 1518 0 R /XYZ 81.145 188.224 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 373.769 null ] >> endobj 1546 0 obj -<< /D [ 1518 0 R /XYZ 81.145 177.265 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 362.81 null ] >> endobj 1547 0 obj -<< /D [ 1518 0 R /XYZ 81.145 166.306 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 351.852 null ] >> endobj 1548 0 obj -<< /D [ 1518 0 R /XYZ 81.145 155.347 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 340.893 null ] >> +endobj +170 0 obj +<< /D [ 1525 0 R /XYZ 79.37 304.782 null ] >> endobj 1549 0 obj -<< /D [ 1518 0 R /XYZ 81.145 144.388 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 221.1 null ] >> endobj 1550 0 obj -<< /D [ 1518 0 R /XYZ 81.145 133.429 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 210.141 null ] >> endobj 1551 0 obj -<< /D [ 1518 0 R /XYZ 81.145 122.47 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 199.183 null ] >> endobj 1552 0 obj -<< /D [ 1518 0 R /XYZ 81.145 111.511 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 188.224 null ] >> endobj 1553 0 obj -<< /D [ 1518 0 R /XYZ 81.145 100.552 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 177.265 null ] >> endobj 1554 0 obj -<< /D [ 1518 0 R /XYZ 81.145 89.593 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 166.306 null ] >> endobj 1555 0 obj -<< /D [ 1518 0 R /XYZ 81.145 78.635 null ] >> -endobj -1517 0 obj -<< /Font << /F15 199 0 R /F81 248 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F22 228 0 R /F65 200 0 R /F30 206 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 1525 0 R /XYZ 81.145 155.347 null ] >> endobj -1558 0 obj -<< /Filter /FlateDecode /Length 2395 >> -stream -xÚÝ[Io+7¾çWø<=‰Ô -â$.ÐsnE¯í©ÿÿZíÛhÆÒ¼t=L2±%Š¤¨›B/¿_è姚~áÞìÏŸ^îŸ/ßÂ\81š!\>{av½°‹"ùEIF¨d—Ï?.¿\)@©2”"R*_o¿~þœÉ~h¸hb¤D]ÓaU¢§wKQÊßÃ;{³M X1ø„;A £0âÍwJ#pCIÞ¾ ŽÏ·ôÆ3—c|¤o„È££Tð°ßCþ^®Ê…†0ŽC¹ôœ\TäÐSBˆ¬rš0͇v ¦82VÑ {BCßL\ŒvÍj²2ÕEQF$¨4Wj· AÑÈÀQSѨtx»²Ÿ+·J\ ïõhù^LÐm¬Ì2ò£øˆ¦)A+_Ç‘3·õO¤a&lJ7;sé¹O\Þ¾¾&1ñ˜–”g—Šƒ€yŒ9©œÀ¸f#ÆhczÆ=5øÉÆŠCnìÌâîQ*xÄ×xŽ0<no*Nw -ü˜C%söC5Ú¢ÆàÆ|r.ì±~6FIJl|‚!a(ûU„^<R+¢¸žN¾r:;BÁL -@;«öäìÄQå<8Œßãg;•9”Aa@Ý}·žRI¢´‚'.gGIÒÀ‘“Õ+ÝÈêeË°o²ëx*窌R=ôüci¿:K`,gC0Öâkð†q°ò~!Þì@4„l¸n¥CÕĽ÷ôþ/y-ÀZÏ)Ò6xëç¸x!ÉéW‡(Žxñé~ó(ïá^ÅÍ4‘÷ ¨ÒDþŽ•ds~l^8†R»ŒUÅé¯âò½s“~xYzGN]Í -Œ¸é¬ì‘b¡"Mn0GM‘©:yüf€w¦&dUF—Ç
÷†Tèˆû
•y|ÔO\îQBÏBÓj%˜§Ÿ^Ôd°‰nrfdj A0½¨õ1pÎÚº/òMÐëȨn‚]Eî™6"mÏM¯Zqì€ÑbšØlH{¤œö-¯~“yP8Ú]éà݉Š×‘ªSü²A_ìЯ2lq„9š±.qez3ó†”?õ›3°l&Ê’9ˆ -GSŽs/ÇUÂFöoˆ›ˆ-hŽ¤r.#9X™ªÓoÈ["µ5ƒÍÛHSç<Ž7g×õFÚ¼O÷3®z.ÛÃ1ÒŠûVð -°$-,¥“¾0Ù€‹o(w¾Ù,9ЖÐ~Àt2ÂMá_P; -øH@sA@ÑSʹîÖ eY?Ò›Ê!Ða~sg$Ú¸x¯²å
Nßó:°TH1Ò¼¯é ¥Td‰Yê -f‡È>Y¨Êœ´”6G½‚ -¨©>ÙÙAî}º)¨$F
ÈdY!ë²¥4Ô°_µñ3ôf]Ï_xj¸‘ØÐAÍV*"ü÷”Ær<w \3Âò6ñ·µëu1›ONw@ÛAkŽvͬk8öùå^Œ¦«4–˜¢“çŽéYÝ©ýñd]%oHCè*B¤ÿHÌLƧ™‘Ž’Ø
]þÿx抺®®7ÐêlPœ´ÚRúoâÙA ]´¿¨aäÛ6QÒðlÈ4ÜRšHD¸$ÄËÙ°›0[JrcÑbµ–ã.5_U8µi©µÏn¥Â©"Ì -Ýs{T8õÜçßÿuX8õ#ÚF½VYA_ÕuYÔOξ#Ú+‹ÆÌÁ²½Ïòãú|‡WZº¼Y3§@~G™½•2#ÒhŹîè計íK[Ãg›x]Ø·.5åE¹ \és¯aC=uuR)
›Ÿûú9ÛòµÚ¸zÈ+!}š{"Õ¶)ÌÅÙS…s?4[ˆÁ#ñcwÂð
/Xµüݸ|: *Ze?æ+žÜ¦l´“®TÔ—íOîh´Äˆ|¾ä{¹ßÜw"$—mí‰MÀ}Zœxbµ´ÃÓöG\á]]ÙÉi^ßHè@TæЕüøÜãUä\ß4DYæT?¡GºíÐrY·Êª¥£Ô·r3¦àAì<¶¸ä¾)Ùm\ßfࣞ·fLÄÝÜ©îÆ74ಟt²¿À˜«~è
GeîýJÒùû@&ö|L¶ -Qb³¥T÷™Ë.•7}_ÒI<ºÏvôÇwÒº9³õ(AOk:j)!”ô tw8•æ¹wðËÏ÷hS%¼u”æwø¼ƒü;v×&‚–üH?³%ž¤Ÿ–Òé»É -ê‚?=”X/9³–ÐæJ¢EƒÝD…¹Ô(ïžA7ò5z6€Z1}!FßL¸Úæ’®&‹]i„œ>nr ÿI*˜nj#4W÷šþ†ÆýÛróšv¥=AÍÐÚ—nâw„~,l€×Zq¶êEý"r -ÆGf-âé(Õ
ºä"kgYvsüï*ʼnø*ÓÄ¿½<ËIBécE›ûcÊê’ojF5‘8UùŽ’GððBP®ó¥3áÏÐê•!{x¥ÚD'ò>[Mdt„ÒMôÜc‰¼–¢xê¬BgõYN7ƒjg#㼬ޜÕî¶)&#
ÌÆgQ¡Xaåí¹ûúIz/ñ[hŒW§(ÍÒa4°ð¸wo•ßõýçÐÛ¸¯èæ¼4v²ŸŸŒfœ—G5t–ÿ
MXw*GšžŒôÒÿ|5túÚiìÝ#µ¼ØÙ6X4ªÄÛžíÇçËŸàm -endstream +1556 0 obj +<< /D [ 1525 0 R /XYZ 81.145 144.388 null ] >> endobj 1557 0 obj -<< /Type /Page /Contents 1558 0 R /Resources 1556 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1600 0 R >> +<< /D [ 1525 0 R /XYZ 81.145 133.429 null ] >> +endobj +1558 0 obj +<< /D [ 1525 0 R /XYZ 81.145 122.47 null ] >> endobj 1559 0 obj -<< /D [ 1557 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 111.511 null ] >> endobj 1560 0 obj -<< /D [ 1557 0 R /XYZ 81.145 768.829 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 100.552 null ] >> endobj 1561 0 obj -<< /D [ 1557 0 R /XYZ 81.145 757.87 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 89.593 null ] >> endobj 1562 0 obj -<< /D [ 1557 0 R /XYZ 81.145 746.912 null ] >> -endobj -1563 0 obj -<< /D [ 1557 0 R /XYZ 81.145 735.953 null ] >> +<< /D [ 1525 0 R /XYZ 81.145 78.635 null ] >> endobj -1564 0 obj -<< /D [ 1557 0 R /XYZ 81.145 695.516 null ] >> +1524 0 obj +<< /Font << /F15 199 0 R /F81 248 0 R /F74 202 0 R /F59 211 0 R /F82 249 0 R /F22 228 0 R /F65 200 0 R /F30 206 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1565 0 obj -<< /D [ 1557 0 R /XYZ 81.145 684.557 null ] >> +<< /Filter /FlateDecode /Length 2301 >> +stream +xÚå[Én#7¾û)ôÃ!«X\ +ÂXp(‘Šàî‰+iÄçtŽ0¾üÁT<îkN…,…b’vB†sÅJL“™ZP.FÉÿz£‰+ãÞ°µ§Íém
Ó²¿“su|yB)· v›Yô#JC3ôØêyÅt@Ñ k(ñç':ßNyZUO®wçéÿ{z¥»½ÄüaQ¯QªqŸˆî¯-»y¥$“0tóh—Ü|‡¤x¤ÈóÌ”ïx
¼• +Ÿƒ†N)Ð8Ь +é€ã¯#1ç4kç +h’-Ò秅#½ýËC°æFFÒ”KÒìþF"gÿSÕ.Á™áÉYK{¤ãjw:Í™±Ã@¿Ø‰í–?pv´w©ê>ß8Ì„l~bÙ÷η4þÒH¬³‰Mëé«žïŸPúÆF2žÍœ²Œ·HŸZúhÆ©|^*ýz¤™ÒÏíÄDµÙ”~Ü~Ö¸Œ`RB¿×bé'Ó=µgã2úòt7üw:.VlÊ:Á¯M×Øv&Ü\‡êh¦fO¶í–a]ÿpÉ»$—·5[\¹Ù³<þ +;„bîG.A¾cvVdtö?Ú—0†¯ÑG¶ã\î¥b•˜ì2&~>ãá-ÞÀ=Oóå9 +ÜÌvø÷<ßVž´Ù<NëvÏ![fá ‰m7•‘îž— +K‹…X<³+?Ô„•;Z°J÷ëÊé€fb¡øm~ØÅ•VŒ4éëý~XëA&kÑŠÕ&f+‚òË2ÝÏ~%—\Õ‡Òv“aáèóÆ3©mwF¾ôSq¾K¤¯ñÌ”G¾eÿ` qîì°”×çù°´^'ÊÍÍ@âUcyÌ›÷0£9¾vÚlKe;mVws„ý´YÁ«þ ÍžN—I%à B§¸~¼LõñxÙŒ‰¸ÁÚÉÉ2ƒ¤êozp²Lòüž„³§ã)‚Ç‘àN!C=“ãg +tz³Ã|t¶W“fÀ{$ú—Tàç8‹Òrv*qœÓRß³C:é{~ÅŽ»}ê2»cCÒ…-WÎÝgîÞ÷é‚wÉGÇÑÅøL§þ6Ê5ìòÒÿ2ïâÜ(FCYÌ6†Ò1ÝàHh-8S_)LS8t”³ý¡ü³Á
P;^\5T?9§÷)¤g¿µŒÚ<ÒbaëhÌ×÷ª‹«¬.=9Ü~½¾?ýNªx +endstream +endobj +1564 0 obj +<< /Type /Page /Contents 1565 0 R /Resources 1563 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1608 0 R >> endobj 1566 0 obj -<< /D [ 1557 0 R /XYZ 81.145 673.598 null ] >> +<< /D [ 1564 0 R /XYZ 78.37 808.885 null ] >> endobj 1567 0 obj -<< /D [ 1557 0 R /XYZ 81.145 609.251 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 768.829 null ] >> endobj 1568 0 obj -<< /D [ 1557 0 R /XYZ 81.145 598.292 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 757.87 null ] >> endobj 1569 0 obj -<< /D [ 1557 0 R /XYZ 81.145 587.333 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 746.912 null ] >> endobj 1570 0 obj -<< /D [ 1557 0 R /XYZ 81.145 576.374 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 735.953 null ] >> endobj 1571 0 obj -<< /D [ 1557 0 R /XYZ 81.145 547.619 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 683.151 null ] >> endobj 1572 0 obj -<< /D [ 1557 0 R /XYZ 81.145 536.66 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 672.192 null ] >> endobj 1573 0 obj -<< /D [ 1557 0 R /XYZ 81.145 525.701 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 661.233 null ] >> endobj 1574 0 obj -<< /D [ 1557 0 R /XYZ 81.145 514.743 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 596.476 null ] >> endobj 1575 0 obj -<< /D [ 1557 0 R /XYZ 81.145 503.784 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 585.517 null ] >> endobj 1576 0 obj -<< /D [ 1557 0 R /XYZ 81.145 475.029 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 574.558 null ] >> endobj 1577 0 obj -<< /D [ 1557 0 R /XYZ 81.145 464.07 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 563.599 null ] >> endobj 1578 0 obj -<< /D [ 1557 0 R /XYZ 81.145 453.111 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 534.707 null ] >> endobj 1579 0 obj -<< /D [ 1557 0 R /XYZ 81.145 442.152 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 523.748 null ] >> endobj 1580 0 obj -<< /D [ 1557 0 R /XYZ 81.145 431.193 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 512.789 null ] >> endobj 1581 0 obj -<< /D [ 1557 0 R /XYZ 81.145 354.891 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 501.831 null ] >> endobj 1582 0 obj -<< /D [ 1557 0 R /XYZ 81.145 343.932 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 490.872 null ] >> endobj 1583 0 obj -<< /D [ 1557 0 R /XYZ 81.145 332.973 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 461.98 null ] >> endobj 1584 0 obj -<< /D [ 1557 0 R /XYZ 81.145 302.567 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 451.021 null ] >> endobj 1585 0 obj -<< /D [ 1557 0 R /XYZ 81.145 291.608 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 440.062 null ] >> endobj 1586 0 obj -<< /D [ 1557 0 R /XYZ 81.145 280.649 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 429.103 null ] >> endobj 1587 0 obj -<< /D [ 1557 0 R /XYZ 81.145 269.69 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 418.144 null ] >> endobj 1588 0 obj -<< /D [ 1557 0 R /XYZ 81.145 258.732 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 377.298 null ] >> endobj 1589 0 obj -<< /D [ 1557 0 R /XYZ 81.145 247.773 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 366.339 null ] >> endobj 1590 0 obj -<< /D [ 1557 0 R /XYZ 81.145 236.814 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 355.38 null ] >> endobj 1591 0 obj -<< /D [ 1557 0 R /XYZ 81.145 225.855 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 344.421 null ] >> endobj 1592 0 obj -<< /D [ 1557 0 R /XYZ 81.145 214.896 null ] >> -endobj -174 0 obj -<< /D [ 1557 0 R /XYZ 79.37 176.6 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 333.462 null ] >> endobj 1593 0 obj -<< /D [ 1557 0 R /XYZ 81.145 149.277 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 322.503 null ] >> endobj 1594 0 obj -<< /D [ 1557 0 R /XYZ 81.145 138.319 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 311.544 null ] >> endobj 1595 0 obj -<< /D [ 1557 0 R /XYZ 81.145 127.36 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 300.585 null ] >> endobj 1596 0 obj -<< /D [ 1557 0 R /XYZ 81.145 116.401 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 289.626 null ] >> endobj 1597 0 obj -<< /D [ 1557 0 R /XYZ 81.145 105.442 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 278.667 null ] >> endobj 1598 0 obj -<< /D [ 1557 0 R /XYZ 81.145 94.483 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 267.709 null ] >> endobj 1599 0 obj -<< /D [ 1557 0 R /XYZ 81.145 83.524 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 256.75 null ] >> endobj -1556 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F79 227 0 R /F22 228 0 R >> /ProcSet [ /PDF /Text ] >> +1600 0 obj +<< /D [ 1564 0 R /XYZ 81.145 245.791 null ] >> endobj -1603 0 obj -<< /Filter /FlateDecode /Length 1774 >> -stream -xÚíZÉŽ7½ÏWèL“U\CÀl2óÜ‚\“Sþÿš*nÝds$Rž1l €eQlöëÚë‘=òôÏIž¾?Èò-èÿïOo_/&œ´^!œÞþ~P´HžÔɃ°úä¬ÒªÓÛ¿§?¿Ii }ì}ϽýQa¿^<œ¼Ö¢ßã'ø¼H©éhÌàŠçÎ_~œN³|5]¡oOw<¦ß!Þý¼Aþ~J÷ó5gé·KXñ:còÓLz:ß—4olRkg¥&2R( #a˜2‘’N †Iû,!©gþ]ìRdÞô/WP—‘«z`JãP¿¦G‹tUÚEÁåõ0ÍšŒ’©¶}äè¬HóJ™/DU7J¹E®ª¡œ -äWê€~ƒ½Oé‰Ú¡pØKŸ:¤ŸÜµÕ”µÃj={úTôh‘~jO\ÔÙ -?-ê‰J@ð=ý<ã,z¶H÷—zGd,Ñ";ëî—HCÍ’¯"PôilƒÔPà5¦Ô!ýFl½£¨„‘
fÏ¿Š
:¤ÿORî©è¬0‡>Y"qÐ݉Ú+Ç™m–jØË›PÉþûÜéóþ‘mã¿^H.Åïl#°£ÊáN¸T:MüçÁðë>ÌŽ·;šÊ…ÄÙ¬Á帅ÙNâKÅKæ0]O%ÂÎ_ÐŨ¡Þê[ ÷s;8×¹ÒÞÒr'·+,K¹Ñì=p|U™ìŸgŠäÝ~κ¿ äàøA5CäªÉ8%c‰á'"òŒ=ƒÏ²ÅÔ‚ŒJLq€ª -ø\¤:T?Õ–% -TúWjËúv[Î'×ãGybeÊx[îpËO:×ØŸqÜnÏÖOÙÒ!N¶Cå½ -endstream +1601 0 obj +<< /D [ 1564 0 R /XYZ 81.145 234.832 null ] >> endobj 1602 0 obj -<< /Type /Page /Contents 1603 0 R /Resources 1601 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1600 0 R >> +<< /D [ 1564 0 R /XYZ 81.145 158.119 null ] >> +endobj +1603 0 obj +<< /D [ 1564 0 R /XYZ 81.145 147.161 null ] >> endobj 1604 0 obj -<< /D [ 1602 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 136.202 null ] >> endobj 1605 0 obj -<< /D [ 1602 0 R /XYZ 81.145 768.829 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 105.318 null ] >> endobj 1606 0 obj -<< /D [ 1602 0 R /XYZ 81.145 757.87 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 94.359 null ] >> endobj 1607 0 obj -<< /D [ 1602 0 R /XYZ 81.145 746.912 null ] >> +<< /D [ 1564 0 R /XYZ 81.145 83.4 null ] >> endobj -1608 0 obj -<< /D [ 1602 0 R /XYZ 81.145 735.953 null ] >> +1563 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F15 199 0 R /F74 202 0 R /F81 248 0 R /F79 227 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1609 0 obj -<< /D [ 1602 0 R /XYZ 81.145 724.994 null ] >> +1611 0 obj +<< /Filter /FlateDecode /Length 1478 >> +stream +xÚíZÉnã8½ç+ô]!«X\€F +ñ^ŒO¼º× 7ÙèV¼¦4ËE5¹xøìœß¢”*g‡`Mýð<}_urAÌ„9«Ô«k~©g–9iþ¹Œ‘âUœY[U§æ´â–}1`N¦iŽ*::†–ÃÏ<
iº"W¥/ÚH2'¢ÅËjž{Íÿðt¿ùn׋úN9‘CÌÛx§0ÜãtHÉ8™ÙœÍ_2ý¹—o[[ê³÷ËáÐxIŽ½ÝN•£EJ¶ÌlÕZɯkújÏÖÛº–òǶ¶-ÞÀË(y)ù‡Wo±âs‰¶ýÚ|}¯£…ñáLÍÎ +Oçµb5_È¢pRnSnÕ¨^ƒ¥MWI~Ke¢WlFË[Œ +°ÎILö6Eó‚·GZ›ZÛa´hQ?]¹îªY¥i~åå +B›¶¶¿–ã½ô±™yí·|$ÁãÁ‰Îº·ªÎÚÉ’r#^i‰
FR‹t¥i¾‰%‡=76QÞ (éÎ £ +H[‘±«-Òªè‹yxoÿ6ë Gú³±·Ñµó@Á‹º6#%¦:²Èq–üØOˆÐçØØ»IMD +ÀF¬%ƒ›OÒ×DDì·ÙÚÿ ×!}hM”Y;°h%™üëÚš¼}…'ëCÚ’Fï²Sö{+å·-·¢[@Y°ÖIØÛQ¢³E’_GzÇîhLNœò¢œ§!9;¤Ã©^{N÷Áæ¬:ÎǸ EB~ŒP‹t³nQ[O(Út¬Sê¾P·¨Yƒw$êÀŒé Cú³“r4§¦Ý ICM\t<´5ÒA"4öºT”¬¼’*ú¿Ž>â'ê¶{ fém6‘9Û)iÀÉvûFÊÓËÝOç2ac +endstream endobj 1610 0 obj -<< /D [ 1602 0 R /XYZ 81.145 714.035 null ] >> -endobj -1611 0 obj -<< /D [ 1602 0 R /XYZ 81.145 703.076 null ] >> +<< /Type /Page /Contents 1611 0 R /Resources 1609 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1608 0 R >> endobj 1612 0 obj -<< /D [ 1602 0 R /XYZ 81.145 692.117 null ] >> +<< /D [ 1610 0 R /XYZ 78.37 808.885 null ] >> endobj 1613 0 obj -<< /D [ 1602 0 R /XYZ 81.145 681.158 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 768.829 null ] >> endobj 1614 0 obj -<< /D [ 1602 0 R /XYZ 81.145 670.199 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 757.87 null ] >> endobj 1615 0 obj -<< /D [ 1602 0 R /XYZ 81.145 659.24 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 746.912 null ] >> endobj 1616 0 obj -<< /D [ 1602 0 R /XYZ 81.145 648.281 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 735.953 null ] >> endobj 1617 0 obj -<< /D [ 1602 0 R /XYZ 81.145 637.322 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 724.994 null ] >> endobj 1618 0 obj -<< /D [ 1602 0 R /XYZ 81.145 626.364 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 714.035 null ] >> endobj 1619 0 obj -<< /D [ 1602 0 R /XYZ 81.145 615.405 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 703.076 null ] >> endobj 1620 0 obj -<< /D [ 1602 0 R /XYZ 81.145 587.509 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 692.117 null ] >> endobj 1621 0 obj -<< /D [ 1602 0 R /XYZ 81.145 576.55 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 681.158 null ] >> +endobj +174 0 obj +<< /D [ 1610 0 R /XYZ 79.37 642.393 null ] >> endobj 1622 0 obj -<< /D [ 1602 0 R /XYZ 81.145 565.591 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 614.934 null ] >> endobj 1623 0 obj -<< /D [ 1602 0 R /XYZ 81.145 554.633 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 603.975 null ] >> endobj 1624 0 obj -<< /D [ 1602 0 R /XYZ 81.145 543.674 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 593.016 null ] >> endobj 1625 0 obj -<< /D [ 1602 0 R /XYZ 81.145 532.715 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 582.057 null ] >> endobj 1626 0 obj -<< /D [ 1602 0 R /XYZ 81.145 521.756 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 571.098 null ] >> endobj 1627 0 obj -<< /D [ 1602 0 R /XYZ 81.145 493.86 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 560.139 null ] >> endobj 1628 0 obj -<< /D [ 1602 0 R /XYZ 81.145 482.902 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 549.181 null ] >> endobj 1629 0 obj -<< /D [ 1602 0 R /XYZ 81.145 471.943 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 533.24 null ] >> endobj 1630 0 obj -<< /D [ 1602 0 R /XYZ 81.145 460.984 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 522.281 null ] >> endobj 1631 0 obj -<< /D [ 1602 0 R /XYZ 81.145 450.025 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 511.323 null ] >> endobj 1632 0 obj -<< /D [ 1602 0 R /XYZ 81.145 439.066 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 500.364 null ] >> endobj 1633 0 obj -<< /D [ 1602 0 R /XYZ 81.145 428.107 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 489.405 null ] >> endobj 1634 0 obj -<< /D [ 1602 0 R /XYZ 81.145 417.148 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 478.446 null ] >> endobj 1635 0 obj -<< /D [ 1602 0 R /XYZ 81.145 406.189 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 467.487 null ] >> endobj 1636 0 obj -<< /D [ 1602 0 R /XYZ 81.145 395.23 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 456.528 null ] >> endobj 1637 0 obj -<< /D [ 1602 0 R /XYZ 81.145 384.271 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 445.569 null ] >> endobj 1638 0 obj -<< /D [ 1602 0 R /XYZ 81.145 356.376 null ] >> -endobj -178 0 obj -<< /D [ 1602 0 R /XYZ 79.37 314.536 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 434.61 null ] >> endobj 1639 0 obj -<< /D [ 1602 0 R /XYZ 79.37 287.471 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 423.651 null ] >> endobj 1640 0 obj -<< /D [ 1602 0 R /XYZ 79.37 217.262 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 412.692 null ] >> endobj 1641 0 obj -<< /D [ 1602 0 R /XYZ 79.37 159.008 null ] >> -endobj -1601 0 obj -<< /Font << /F59 211 0 R /F82 249 0 R /F64 198 0 R /F15 199 0 R /F74 202 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 1610 0 R /XYZ 81.145 401.733 null ] >> endobj -1644 0 obj -<< /Filter /FlateDecode /Length 743 >> -stream -xÚÍWÉŽÛ0½ç+ü£REA€Éx\ çÜŠ^ÛSÿÿ:¤%y‘'Ì¡cY"ßãòÄîOÝ÷”¿×ÛéÛ€¡³ÖpŒ6u·ß'+_ ³]bãS—Ð@ÛÝþv?Ï -®±r¨n“ŒXëI˜a?9 -‹6ÛHôûŒDQ÷r0n¨ïgÓ’ÔÕ×hc“ -x.VBΩÆkìÄk~rïŽ}}˜WÑV—ìaBMÙö˜Ø¡ô—º¹.Ó¸êóœX˜‹ b¯…1ãÌQ™=ª7ŸŽóê½!ÂM|ßpœÐ¤/C{Rä0òq^¼Èl·ç×÷Ïè IÌ_[#Íë¢F†GõñXÏj¬½ükÜéä`(„gã±@{'&ΤÐÚUý‹›kÒBªú·P’{(€!¶–5ˆ‹EAÉoøÖ~þ&Xr³ËV³p_rÛŠx’‡wh]ëÑi—I`ü*®¾ÄçIÁcáGùˆÆ[j½Å:1NDˆh8ü_Ñ8í<5ÉôôXM0‰áÎC¥{ÒójB [›ÎÏ*>"ƽ*}¬"$×'m—¸ ÷zV“Œ|沇$<ßå׺Þù¼‹w÷dî‹2Š¸•‰Û+®ŸÝÕ¦Û¿º¤íêrl˜e£”(ÑÁ––âц[MOuº°§¸Mä|U‘Æ©½êÿ“Ø°´¥)
Ë@TµFo×Õ÷Ûé6>C -endstream +1642 0 obj +<< /D [ 1610 0 R /XYZ 81.145 390.775 null ] >> endobj 1643 0 obj -<< /Type /Page /Contents 1644 0 R /Resources 1642 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1600 0 R >> +<< /D [ 1610 0 R /XYZ 81.145 379.816 null ] >> +endobj +1644 0 obj +<< /D [ 1610 0 R /XYZ 81.145 351.92 null ] >> endobj 1645 0 obj -<< /D [ 1643 0 R /XYZ 78.37 808.885 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 340.961 null ] >> endobj 1646 0 obj -<< /D [ 1643 0 R /XYZ 79.37 775.009 null ] >> +<< /D [ 1610 0 R /XYZ 81.145 330.002 null ] >> endobj 1647 0 obj -<< /D [ 1643 0 R /XYZ 79.37 680.889 null ] >> -endobj -1642 0 obj -<< /Font << /F64 198 0 R /F15 199 0 R /F74 202 0 R >> /ProcSet [ /PDF /Text ] >> +<< /D [ 1610 0 R /XYZ 81.145 319.044 null ] >> endobj 1648 0 obj -[525 ] +<< /D [ 1610 0 R /XYZ 81.145 308.085 null ] >> endobj 1649 0 obj -[ 28 [ 525 ] 50 [ 525 ] 55 [ 525 ] 72 [ 525 ] 75 [ 525 ] 77 [ 525 ] 81 [ 525 ] 96 [ 525 ] 98 [ 525 ] 105 [ 525 ] 110 [ 525 ] 112 [ 525 ] 116 [ 525 ] 118 [ 525 ] ] +<< /D [ 1610 0 R /XYZ 81.145 297.126 null ] >> +endobj +1650 0 obj +<< /D [ 1610 0 R /XYZ 81.145 286.167 null ] >> endobj 1651 0 obj +<< /D [ 1610 0 R /XYZ 81.145 258.271 null ] >> +endobj +1652 0 obj +<< /D [ 1610 0 R /XYZ 81.145 247.313 null ] >> +endobj +1653 0 obj +<< /D [ 1610 0 R /XYZ 81.145 236.354 null ] >> +endobj +1654 0 obj +<< /D [ 1610 0 R /XYZ 81.145 225.395 null ] >> +endobj +1655 0 obj +<< /D [ 1610 0 R /XYZ 81.145 214.436 null ] >> +endobj +1656 0 obj +<< /D [ 1610 0 R /XYZ 81.145 203.477 null ] >> +endobj +1657 0 obj +<< /D [ 1610 0 R /XYZ 81.145 192.518 null ] >> +endobj +1658 0 obj +<< /D [ 1610 0 R /XYZ 81.145 181.559 null ] >> +endobj +1659 0 obj +<< /D [ 1610 0 R /XYZ 81.145 170.6 null ] >> +endobj +1660 0 obj +<< /D [ 1610 0 R /XYZ 81.145 159.641 null ] >> +endobj +1661 0 obj +<< /D [ 1610 0 R /XYZ 81.145 148.682 null ] >> +endobj +1662 0 obj +<< /D [ 1610 0 R /XYZ 81.145 120.787 null ] >> +endobj +1609 0 obj +<< /Font << /F59 211 0 R /F82 249 0 R /F22 228 0 R /F15 199 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +1665 0 obj +<< /Filter /FlateDecode /Length 1339 >> +stream +xÚÍYÍnä6¾ç)üÑJ¢DI@0À:Î,ÐsnE¯í©ï]R–e´sÈÁXGÖPüùø‘ÔÊéŸIN¿^dþwþ|ùqG3)#À ž>ÿ~QôANjrA€›*!QMŸÿN¾I‰æöª¤”ô +RMKü)-#}rxûëó,V‰`rrÁ Mÿf¹ú' ¼K©ÞIèBï3=Qøíœå@oê-/‡[|wúV×ø1KÙîäú…µb-Y[Ö’X;ÖÝÓ*ÛóQV‹"ú^V¬Nû\Èö);P“{ó”ÞT·™÷¤‰ãSxoÚgýªÇœ9’¨TΆ^&ûœµÔ“éo\Öxð»’ßy?Æó©§6h ÂÛŸhýHdélÀ³È‚Ù×ÑE§…5ú8º>G×G×;ìeƨÊ$!jŒ)š=£³+“ÏôU^ +çw'|m£|ŸZš¯¶i}á-y\ù‹år°¡~?Ð÷ð—zNŤÐÖvA«?_c_Žô³Ë‘1Y3sR×ùVƒ½Y¬5üd•‹wØSFƘt˜A)¬¯„W
Êé`q8¿@ôæ[å×XnÉ-*EÚû§2g'“-b—±E.3'¯q@#£Îc¹å¨„è¥ç(vVI-Hýªoõe«œð{™‰×9§`#[Ì+*a.™xa•èüNú’¸Á¿µ±(Þª(6él¬;¶©oÅÓMÚè¬X¢¡²`h±!'\š²uìA Ý9{[O $ÝRKuÜsÚËôYû¥˜V=7l5—ŽÉ}Ú@½œSý)鄪µO²chï99B†ÎÜrËÉ1´r…Aѽ@cÕ3ye=1‚ÓÈïqçÖï~QãÒR÷KâÄåó¸ +D¢vö–|þo:i(6‡Ö¦áë1éöˆ´4 +Ocaw¢æüÎí@¤ü®ýÖv0Ûw=vi(ߟ6ÖYð¢ýFmÀH[4Â"Z +…á¹,²•Ù“¦±Î]GMG"säVâqþK/´ª½kÂP©ÙësÛÏŸtùëú¿â„&¦ï4Ŧª„o|60Tª%^÷’ÇÐMò)5Ô7B7ß]¡›2à݆ð”}zMè䜔¹15´wçkÛKžâõ×ôIáeku9NÑeƒ°p¨ãê¶1|äS ¨ù¬á%d[áƒ)¦µö;ÝH¢½N1JÓ”¨žŸb[¹¥ýíÍRÇ…Ó€Y+$b/I/ççÈ•…ÝùO i…Â9ÛKLu
Hzé5°ŽB|{ÆPb_Åt_Šä®u÷µ¬Ž7 ewþۤʣ‘Êç÷ºšã6ÎÊuºïP{ÞÒiòç‡$4z8‰‡w$†/ÝÜÒÅðà XìåEdôVùµ¥PïE€AMi'µPV-™j2U +ˆŸÒœn'ã¶rMÉÑ×÷ò^¶›Í7m•ãþ h +ܨ?ÊpRyüñ`} Ôß^MÐMøjJ&ÍÍEr!½hL1o»ctõ¡3k4KO¥…ìŒ@ªå—Î Up\ÊÚœ[nï˶ ë +y@"Ÿ÷[³;:¹K_/^*R4ÀƒHaþ’Ä [Ãþ'P´OÕ MPþ²nZ`ä3×:á2‘ÿÜüàãóå7gæÀ +endstream +endobj +1664 0 obj +<< /Type /Page /Contents 1665 0 R /Resources 1663 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 1608 0 R >> +endobj +1666 0 obj +<< /D [ 1664 0 R /XYZ 78.37 808.885 null ] >> +endobj +178 0 obj +<< /D [ 1664 0 R /XYZ 79.37 771.024 null ] >> +endobj +1667 0 obj +<< /D [ 1664 0 R /XYZ 79.37 751.185 null ] >> +endobj +1668 0 obj +<< /D [ 1664 0 R /XYZ 79.37 704.886 null ] >> +endobj +1669 0 obj +<< /D [ 1664 0 R /XYZ 79.37 646.632 null ] >> +endobj +1670 0 obj +<< /D [ 1664 0 R /XYZ 79.37 552.512 null ] >> +endobj +1671 0 obj +<< /D [ 1664 0 R /XYZ 79.37 494.258 null ] >> +endobj +1672 0 obj +<< /D [ 1664 0 R /XYZ 79.37 436.004 null ] >> +endobj +1663 0 obj +<< /Font << /F64 198 0 R /F15 199 0 R /F74 202 0 R /F65 200 0 R >> /ProcSet [ /PDF /Text ] >> +endobj +1673 0 obj +[525 ] +endobj +1674 0 obj +[ 28 [ 525 ] 50 [ 525 ] 55 [ 525 ] 72 [ 525 ] 75 [ 525 ] 77 [ 525 ] 81 [ 525 ] 96 [ 525 ] 98 [ 525 ] 105 [ 525 ] 110 [ 525 ] 112 [ 525 ] 116 [ 525 ] 118 [ 525 ] ] +endobj +1676 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``à``Pd`˜âÀ°À© endstream endobj -1652 0 obj +1677 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1905 >> stream xÚVPT×¾öÞ®²Ùë:´G¹·ŽåQb‚Jâ V¤qcÓÀÂ.»+Ë.Ü]–wPX¸Ë>‡¼åá’HðQ'UL3—´Wj±v$/mªÍ´1éŒç¦'é½B!;ídzfïcþûŸÿÿ¾ï?ÿÙƒc †ãøšô”½Ù)Yö¥§›Œ¦•Ñò“ø˜—5ÚRƒŠöó?æ×r²H~5ƯÁùÈ žæ‰]†G>Ê3É‚P’,Ø/“|[‚üߌüÓN¬Á0üR˜x¿Cdk…·e‰²u¢á¦l=&
Âpl
¶û @@ -5336,10 +5417,10 @@ qŨËÈÕƒŠ:[ù1úPÑ:HNýõ§M4|‡ôôsn’ý‡ÿ†V‚$O£0+MM в£ Àˆé?9éWáZê'o
ßøÍM0õ>»î ×µ.c®eŽÞ6Â,jEæ÷ª†!=AI±ò‚ºŠZƒ´™lêoð4öK©pì <A‘ÔJ, èᘃ’`óªRrl¡Æ®kcäú†pk¶q?âÔ‰•l¤FYÐTÝ,åZÛZNERÉسºÔÛLqYEI#:1’? ¾üFtÿ1Uüa¡¶b¡â‰hdQÂqÛ*möÊvð;;àKÎ22Miˆ“-ãd!¾åþó=n»8\N·Lö^K‡½³ÕÞþ®{¤]ö?¸ò±âßHµ‰ endstream endobj -1650 0 obj -<< /Type /FontDescriptor /FontName /MHKZHY+LMMonoSlant10-Regular /Flags 4 /FontBBox [ -477 -316 786 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle -10 /StemV 175 /XHeight 431 /FontFile3 1652 0 R /CIDSet 1651 0 R >> +1675 0 obj +<< /Type /FontDescriptor /FontName /MHKZHY+LMMonoSlant10-Regular /Flags 4 /FontBBox [ -477 -316 786 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle -10 /StemV 175 /XHeight 431 /FontFile3 1677 0 R /CIDSet 1676 0 R >> endobj -1653 0 obj +1678 0 obj << /Filter /FlateDecode /Length 434 >> stream xÚ’]kÛ0†ïõ+Î.é…k9Ÿm †ÕI¨YÓ–:ŒmwŽt’ lÉÈöEþý$¸…1Â6~¬÷|½>£/oEôUšFÓ[ïØšÞ @@ -5349,22 +5430,22 @@ OQ;ç|pqn;¬s}4lµ‚ØUVmgÏ¡ÿ¿Z‰V錯5ê„Eß4ú¦€³4‰G—ßùöRÖ±w#—îTu競|îÏ
Â$pB#±m g½§JãÇ–4¦ñQáë5l¾§×-ûú_ endstream endobj -344 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MHKZHY+LMMonoSlant10-Regular /DescendantFonts [ 1654 0 R ] /ToUnicode 1653 0 R >> +345 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MHKZHY+LMMonoSlant10-Regular /DescendantFonts [ 1679 0 R ] /ToUnicode 1678 0 R >> endobj -1654 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MHKZHY+LMMonoSlant10-Regular /FontDescriptor 1650 0 R /W 1649 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1679 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MHKZHY+LMMonoSlant10-Regular /FontDescriptor 1675 0 R /W 1674 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1655 0 obj +1680 0 obj [ 3 [ 602.1 ] 5 [ 602.1 ] 11 [ 602.1 602.1 ] 38 [ 602.1 ] 68 [ 602.1 602.1 602.1 ] 72 [ 602.1 602.1 ] 75 [ 602.1 602.1 ] 79 [ 602.1 602.1 602.1 602.1 602.1 ] 85 [ 602.1 602.1 602.1 602.1 602.1 ] 91 [ 602.1 ] ] endobj -1657 0 obj +1682 0 obj << /Filter /FlateDecode /Length 20 >> stream xÚ›"ÁÀÀÄÀÀÀwóû endstream endobj -1658 0 obj +1683 0 obj << /Filter /FlateDecode /Length 11571 >> stream xÚí| |UÖïºU½%étv¶î®î& ˜&Av"J IL¡“î,’¤cºC@DÜ ""âÂ(.ƒ(ã‚{TÔ™qG™‡apFÒè'ƒ>Ÿ£Pýþ÷Vu6Pç›÷¾÷~ßï÷Òž>·nÝ{ösî©J„xr%¡¤ ¼*oܱÇ?ý3oÔµøÚFŽ{÷1B„‘„¤¤×+¯8šEHê4̽PßÖÐrôÖÿ±Ÿ´ï°~cCóªú;ÞzêEBÒ¯%$éÚƀϯvTÜMÈ(îOjÄ„e†èÅu®G6¶„WÆ¿.Íŵ×Ï7ë|T%2Za×-¾•m’O2àú/¸VZ}-Zóòq}’W}[{ mJtÃZBæb¿tœÒûÂMD&D/ßA& †£Åô¤^U1Î`¦TŠ¥1D+ɪDPeRQ_ì'Q¢QCªš*l3¶Ÿ,#Â/ÿ‘h? Ù‰DˆáÂìF’â1+ðyJ,|^2ü¶y“FË‘+„ׄCÂ'·Â?E§èÅbqž¸G|EüøøWñ3ñ¸ø5NgÒEÔG;èeô @@ -5400,10 +5481,10 @@ R¸kBXäæ±_"‘öPS°U—;~Â@Ž1~1ncÎÌ1c¼ÆüˆØõ|»$a= b‚Ö[á¬0\Hx …ù$¿Nchäbo å
ßÓëâi×ÂL¹ËOׯÛ+¯Wéºk—ÈëöÒuWJ×^“)_»„^[ ]“I¯VéU[é•Ø´V¥W endstream endobj -1656 0 obj -<< /Type /FontDescriptor /FontName /GMFTGJ+DejaVuSansMono-Oblique /Flags 4 /FontBBox [ 0 -208 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -208 /ItalicAngle 0 /StemV 86 /XHeight 547 /FontFile2 1658 0 R /CIDSet 1657 0 R >> +1681 0 obj +<< /Type /FontDescriptor /FontName /GMFTGJ+DejaVuSansMono-Oblique /Flags 4 /FontBBox [ 0 -208 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -208 /ItalicAngle 0 /StemV 86 /XHeight 547 /FontFile2 1683 0 R /CIDSet 1682 0 R >> endobj -1659 0 obj +1684 0 obj << /Filter /FlateDecode /Length 477 >> stream xÚ“Ooâ0ÅïùÞ=¤8!h…"µ¡T¬D© @@ -5414,22 +5495,22 @@ xÚ“Ooâ0ÅïùÞ=¤8!h…"µ¡T¬D© Ÿ1|¦ðÃg:Ë0[7K»{»>w_öZ›Å»+èöj7ZIú¼¥jl”{Üõþ|–6Kï/õ?'ä endstream endobj -325 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /GMFTGJ+DejaVuSansMono-Oblique /DescendantFonts [ 1660 0 R ] /ToUnicode 1659 0 R >> +324 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /GMFTGJ+DejaVuSansMono-Oblique /DescendantFonts [ 1685 0 R ] /ToUnicode 1684 0 R >> endobj -1660 0 obj -<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /GMFTGJ+DejaVuSansMono-Oblique /FontDescriptor 1656 0 R /W 1655 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1685 0 obj +<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /GMFTGJ+DejaVuSansMono-Oblique /FontDescriptor 1681 0 R /W 1680 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1661 0 obj +1686 0 obj [ 3 [ 602.1 ] 6 [ 602.1 ] 11 [ 602.1 602.1 602.1 602.1 602.1 602.1 ] 18 [ 602.1 602.1 602.1 602.1 ] 29 [ 602.1 ] 31 [ 602.1 602.1 602.1 ] 68 [ 602.1 ] 70 [ 602.1 ] 72 [ 602.1 602.1 602.1 602.1 602.1 ] 78 [ 602.1 602.1 602.1 602.1 ] 83 [ 602.1 ] 85 [ 602.1 602.1 602.1 602.1 ] 91 [ 602.1 ] 171 [ 602.1 ] ] endobj -1663 0 obj +1688 0 obj << /Filter /FlateDecode /Length 24 >> stream xÚ›$¿‡õ endstream endobj -1664 0 obj +1689 0 obj << /Filter /FlateDecode /Length 12999 >> stream xÚí|
\TUúÿ9÷Ü{ç
†Áf.3Âø2á»Y¼‰Š"à[åËÀB @@ -5491,10 +5572,10 @@ ffäÏRò'(y³”)9yã½JöÌ‚Âì¢"%¿PÉ™Z›“±œ¼¬Üiãsò&*™X——_¬äæLÍ)Óâ|¾4Ä*'»Hc65»0k.32 •ÝnÏ”n/b·©lùvë-ˤ[UvË2¶ÌÁnVÙR+»Ie‹U¶HeõuaR}«o¤$ý±.ŒÕk#YmºX£²UV²`U‘\Ϫ*JUE¬r [¨²©ì•U¤²òïÙüý¬Le•ùUVZâJUVBlR‰ƒùT6OesU6çZ‹4ÇÊfûÙõo±ëpq]»Ö€è™Ql†Ê¦«lZ¿>Ò´TV¬²"•ªìše¬@eùQ,OeSéPiªÊr÷³)ÙäœXiò(–“)åIJIÙ±Ò$•MÄÕD?›€« ûYv,ñ£XV¦]ÊŠdYBzºIÌ̈2í,³Q ¸ÊH·J,£‘ÂUzZ˜”neét9®ÒÂLRZKk¤éé~ñj•]®úžSÙ•ÙX•ÇøÙè+úJ£§°Q*94J©²SØð”¾Òð)lša*KÅÄT•]ÛWôe)}Y2zɱ,ÉÔ[JÚφz{IC£ØÐFAÛÖk³KÞ^Ì«‰»^28A¢²Á˜98
ÆJƒT6Pe•%F°„Þ™RB6ÁÜ*sEDH.•Å+C¥øeLÊœS˜;;T§²þ°m•õƒWúõa}UÖGe±*‹‡˜ ¬wôP©w&‹Ž²IÑCY”õ¼^Q,ë#Uf‡æöLfÃ6;³é¶‹°†I,B·5Ü,YØU·]8lnfá°Ý‹b˜‰…iØ%ZTf†&f•™z3£T&ƒµ¬2)Š1(Ǿg„±ŒB endstream endobj -1662 0 obj -<< /Type /FontDescriptor /FontName /TNBLMB+DejaVuSansMono /Flags 4 /FontBBox [ 0 -208 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -208 /ItalicAngle 0 /StemV 86 /XHeight 547 /FontFile2 1664 0 R /CIDSet 1663 0 R >> +1687 0 obj +<< /Type /FontDescriptor /FontName /TNBLMB+DejaVuSansMono /Flags 4 /FontBBox [ 0 -208 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -208 /ItalicAngle 0 /StemV 86 /XHeight 547 /FontFile2 1689 0 R /CIDSet 1688 0 R >> endobj -1665 0 obj +1690 0 obj << /Filter /FlateDecode /Length 512 >> stream xÚ}“[kã0…ßý+´öÁ|oJ0ä @@ -5502,22 +5583,22 @@ xÚ}“[kã0…ßý+´öÁ|oJ0ä ñ3(M@)hÊ@˜DŠIĘDŠIÄðžÂ{e)”%P–BYe)”%ðžÁ{·Ü&ЙAg’bTgP@Ye3Ðj’ã»·lÄîù÷6V½ÖfÝepgw–ô}_ÕØSîë.ÚpÝ-½®½/„87D endstream endobj -324 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TNBLMB+DejaVuSansMono /DescendantFonts [ 1666 0 R ] /ToUnicode 1665 0 R >> +323 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TNBLMB+DejaVuSansMono /DescendantFonts [ 1691 0 R ] /ToUnicode 1690 0 R >> endobj -1666 0 obj -<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /TNBLMB+DejaVuSansMono /FontDescriptor 1662 0 R /W 1661 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1691 0 obj +<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /TNBLMB+DejaVuSansMono /FontDescriptor 1687 0 R /W 1686 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1667 0 obj +1692 0 obj [ 68 [ 602.1 ] 70 [ 602.1 602.1 602.1 602.1 ] 76 [ 602.1 ] 79 [ 602.1 602.1 602.1 602.1 602.1 ] 85 [ 602.1 602.1 602.1 602.1 ] ] endobj -1669 0 obj +1694 0 obj << /Filter /FlateDecode /Length 15 >> stream xÚk`€ endstream endobj -1670 0 obj +1695 0 obj << /Filter /FlateDecode /Length 10706 >> stream xÚí{xTÕ¹öÚ{í=3™I& ¹.3³g†d ¡( $@$7“pS&™I2dâÌ„- @@ -5573,10 +5654,10 @@ L‹/ª´ø"àhéˆB¸_él÷ë
_Q ‡UzEíÀÛŽÍ4”CÛÛŽÈí*mk]#·¡m[¤Ö`®Üº†¶K6ÐõxX„‹ã¹´kZü´M³Ÿ6AR“Ò¨_¥*mP©o3]§ÒËýô²K3åËTzi&½¤ˆ®ž6F^MWeÓ•dŒ¼R¥+Šèr•Ö×Yäú4Zg¡µg˵{èÅ5iòÅÙ´&V«´ªÒ/Wí¡•~Z¡Òe*½¨<C¾h-Ï KÏÐ%gèâÍ´¬4C.ÛLK3è¢Zb¥Šè…éô‚ùVù•ÎÿšEžo¥_³ÐysÇÊóöйç[ä¹céÜ-Òùz~±4ç¼yÎz”;/‡Îž•#Ï^FgÍÌ”gåЙ™´hFŽ\ä§3ðzF^˜Sœ-O/¥…9´ endstream endobj -1668 0 obj -<< /Type /FontDescriptor /FontName /WYCBGG+DejaVuSansMono-Bold /Flags 4 /FontBBox [ 0 -207 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -207 /ItalicAngle 0 /StemV 150 /XHeight 547 /FontFile2 1670 0 R /CIDSet 1669 0 R >> +1693 0 obj +<< /Type /FontDescriptor /FontName /WYCBGG+DejaVuSansMono-Bold /Flags 4 /FontBBox [ 0 -207 1000 760 ] /Ascent 760 /CapHeight 729 /Descent -207 /ItalicAngle 0 /StemV 150 /XHeight 547 /FontFile2 1695 0 R /CIDSet 1694 0 R >> endobj -1671 0 obj +1696 0 obj << /Filter /FlateDecode /Length 434 >> stream xÚ…’Mo›@†ïû+¦KΰØÆ4‘…Tã8â+mxwìnevÑÿûîî˜DŠš Äü3¼3;“/ÏUôMš=Fók/Ø™Á @@ -5584,22 +5665,22 @@ xÚ…’Mo›@†ïû+¦KΰØÆ4‘…Tã8â+mxwìnevÑÿûîî˜DŠš Äü3¼3;“/ÏUôMš=Fók/Ø™Á wX´qû==mÙRlÁ endstream endobj -323 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /WYCBGG+DejaVuSansMono-Bold /DescendantFonts [ 1672 0 R ] /ToUnicode 1671 0 R >> +322 0 obj +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /WYCBGG+DejaVuSansMono-Bold /DescendantFonts [ 1697 0 R ] /ToUnicode 1696 0 R >> endobj -1672 0 obj -<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /WYCBGG+DejaVuSansMono-Bold /FontDescriptor 1668 0 R /W 1667 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1697 0 obj +<< /Type /Font /Subtype /CIDFontType2 /CIDToGIDMap /Identity /BaseFont /WYCBGG+DejaVuSansMono-Bold /FontDescriptor 1693 0 R /W 1692 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1673 0 obj +1698 0 obj [ 28 [ 603 ] 35 [ 544 ] 43 [ 544 ] ] endobj -1675 0 obj +1700 0 obj << /Filter /FlateDecode /Length 14 >> stream xÚc``à endstream endobj -1676 0 obj +1701 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 852 >> stream xÚmS]LY¾Óãʈʦ;0sÅ°b[¢£Ñ!¨¨©Y‰ò0¥ÓvdèàÌÔ @@ -5608,10 +5689,10 @@ xÚmS]LY¾Óãʈʦ;0sÅ°b[¢£Ñ!¨¨©Y‰ò0¥ÓvdèàÌÔ Õ|M-¶#=Ú´øœÌÎìÇJ…À×jã
6eF½>'0ªTžCbddt Yãàlø2ž•ZöoV*99éÕ‘!Ÿ93ŒD£§cƒ)|ù'ùa½ endstream endobj -1674 0 obj -<< /Type /FontDescriptor /FontName /HSGBBJ+LMRoman7-Italic /Flags 4 /FontBBox [ -528 -292 1571 1123 ] /Ascent 1123 /CapHeight 683 /Descent -292 /ItalicAngle -15 /StemV 123 /XHeight 431 /FontFile3 1676 0 R /CIDSet 1675 0 R >> +1699 0 obj +<< /Type /FontDescriptor /FontName /HSGBBJ+LMRoman7-Italic /Flags 4 /FontBBox [ -528 -292 1571 1123 ] /Ascent 1123 /CapHeight 683 /Descent -292 /ItalicAngle -15 /StemV 123 /XHeight 431 /FontFile3 1701 0 R /CIDSet 1700 0 R >> endobj -1677 0 obj +1702 0 obj << /Filter /FlateDecode /Length 370 >> stream xÚ}R]kƒ0}ϯ¸{(´ÖØÂE„µ]7ÇúA-c¯6¹vM$Ƈþû%±¶0º ŠÇsÎõÜ£ƒ‡]<suÄ`:¦°ÇFµša°Xç5–ŠµJ³AäÈ{¶™ÁN+–¡á"]¦R˜‘§’•-Ç^u_4Ç“7‰{ø¼e¯óù{ð±Þ«*—OAjòR°€:ÓA˜ÒŠÿÕ%á> ~È'êF(9ƒhL)µ^$_¨Ê×ðÂ>t!$×—œpt©I4.˜¹ e•íÉ™³sc°Je¡HC¸·dcôÙg‘p«9j!O0¼ÑJ²¶®Ktq€’$Ž…lûÙäBèvO¹e…9ÿQÂÍr8×£..S›:g¨syBÛ @@ -5619,21 +5700,21 @@ hñÊ AÉñ´s‹ZA;íök7'ZØ9”>F‰C“i‡&šwhšt#¼Ç½ÍÕvݵZÛÅ|·>¾.$^ë¯Uí\þôßÿÚ®È endstream endobj 311 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /HSGBBJ+LMRoman7-Italic /DescendantFonts [ 1678 0 R ] /ToUnicode 1677 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /HSGBBJ+LMRoman7-Italic /DescendantFonts [ 1703 0 R ] /ToUnicode 1702 0 R >> endobj -1678 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /HSGBBJ+LMRoman7-Italic /FontDescriptor 1674 0 R /W 1673 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1703 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /HSGBBJ+LMRoman7-Italic /FontDescriptor 1699 0 R /W 1698 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1679 0 obj +1704 0 obj [ 27 [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] 61 [ 525 525 525 525 525 525 ] 68 [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] 93 [ 525 525 525 525 525 525 525 ] 101 [ 525 525 ] 104 [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] 138 [ 525 525 ] 162 [ 525 525 ] 201 [ 525 525 ] 245 [ 525 525 ] 251 [ 525 525 ] 265 [ 525 525 ] 271 [ 525 525 ] 337 [ 525 525 ] 341 [ 525 525 ] 420 [ 525 525 ] 564 [ 525 525 ] 568 [ 525 525 ] 602 [ 525 ] ] endobj -1681 0 obj +1706 0 obj << /Filter /FlateDecode /Length 52 >> stream xÚc``ÿÿÿÿ÷÷@üíÿÿ ÄÀ endstream endobj -1682 0 obj +1707 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 8866 >> stream xÚÍ{`Wºî{FŒ&̈PBè-BB¯cz3Õ½KV±\dY–ÜGr•{ï°©¦ãPL‚è“JB @@ -5679,10 +5760,10 @@ l¼».ngâó2>Þ6ÄæØÅ(˜’û ¾gÂú¤ÐxÈ¿; 1”¢k6¿…;¾š…ÛYg”Îÿ[iùÜî³_[ôÛ} áú/Ÿh¨Bþú‘DmA)Ü N/ˆ¢¨bYlBR¢–ÓôT§(òå¥é™\âLÇ“hnZqf¥àÕ«YZBàþ'!p§ppçõ'ô¿{&G Í‹_#r³Šlð¿Ubpð5ð6u|mÚØ‘d–ÔOÝØšÿcëƒÀ#/&æA’PEˆ¤4”«êJ+)à6èw÷^Iìz'3]ÇíŽøvüÑ¿×ÒÁàÌLçÃ?˜Îÿ?þ:äÅô¿HþóþÂŒ,é#ÏÿKÛì«^,y
¿³&{@Ã
ößÚ†_Áf¼†oYÔ»£ÀTØ?ý—V…†q/f½¦‹X÷Y‡#pêÈ3©;þÛG
¦A5[úš~`ò–Í«ÁÿöÍ«Dvüëa)Ê-;\ƒÿú.ÔƒÿT§NÆÑÂÉþOp2pùº©õÿsÃŲ¾¯aí/%ÜñKG‰Ë£ÿÒÁà0äµ…k—<2ùXÁÛ„»«ÿ¹¨êÕEVÈo…E °åµiánß·Ø°²18Ã/dŠdr&Œ“ÙQø=8Úãú?0-¾žb¬>-žv0ÿ¸þ,i?j(‚ ³Ìÿ¡mš£:›]
>ÌKÑa”óºÀ‰ö½û¾Æ>¦¾ÍY:^Ÿª+ÔgÚÛ7•ëSÒRõ:C+0Ú¿Á–
ü…ø2®Õž endstream endobj -1680 0 obj -<< /Type /FontDescriptor /FontName /FFZKTM+LMMono9-Regular /Flags 4 /FontBBox [ -451 -318 734 1016 ] /Ascent 1016 /CapHeight 611 /Descent -318 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1682 0 R /CIDSet 1681 0 R >> +1705 0 obj +<< /Type /FontDescriptor /FontName /FFZKTM+LMMono9-Regular /Flags 4 /FontBBox [ -451 -318 734 1016 ] /Ascent 1016 /CapHeight 611 /Descent -318 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1707 0 R /CIDSet 1706 0 R >> endobj -1683 0 obj +1708 0 obj << /Filter /FlateDecode /Length 841 >> stream xÚ}–QOã8Fßû+²HÌC§I;0B•JšHÕ.3£VóVÃD¢I•¶üûM|¾‚4b ÄÁŽïw®Ý˜‹?¾ßÏWMÿèçæsýð‡þ4Ô~^Üm÷³‹‹u_Ÿv¾;~õ¾ñÍyôð%ú>ôõ½?F—Åf½éÚã§qò¦«_N?ÏúxÒn»÷)SèòÁÿ3¯ªŸ>ÜÍÿº»ë»þzþÃ?Ÿ^¶Ã<žzh/ãäÿƒÑǃQXäo?Ú¾û%Ÿã8ÿPvMÑï&½Ãl¡ˆÑâú©íšA9£Ç)õ,I£¦¢ð³Þ}š¾=ýnÓ=õ³››h1VnÇá5dþ4[|?´ÝstùqÄqÊýi¿ñSœ(ž-—QãŸÆ•Çþ|Ýî|´˜Ü7Í8Ú_ÿ£ ï<¼î}”Nˆ[÷?ì·µ¶Ý³ŸÝŒ-ˆ—ÑM5~-g¾k~yêñ 'œMâ·±ú×v˜VJnÇ•â8K–Š@N´”:¨dK¨ @@ -5694,21 +5775,21 @@ RHhE£×ÄÌ*Pª××úÒ˜ˆF¯ˆÔŽšMÌwÕ颚nÜ·k±>
Ãx'†k9Ü|Ó×vþíæÞ÷ûé©ð®üóÿ}«fÿ6 endstream endobj 249 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /FFZKTM+LMMono9-Regular /DescendantFonts [ 1684 0 R ] /ToUnicode 1683 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /FFZKTM+LMMono9-Regular /DescendantFonts [ 1709 0 R ] /ToUnicode 1708 0 R >> endobj -1684 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /FFZKTM+LMMono9-Regular /FontDescriptor 1680 0 R /W 1679 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1709 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /FFZKTM+LMMono9-Regular /FontDescriptor 1705 0 R /W 1704 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1685 0 obj +1710 0 obj [ 35 [ 580 ] 47 [ 624 ] 50 [ 558 ] 55 [ 536 ] 59 [ 641 ] 72 [ 513 ] 77 [ 613 ] 81 [ 636 ] 84 [ 558 ] 116 [ 613 ] ] endobj -1687 0 obj +1712 0 obj << /Filter /FlateDecode /Length 21 >> stream xÚc````T`hñ endstream endobj -1688 0 obj +1713 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1497 >> stream xÚ}•LW†gØÝ„uEÆ¥–•™Q)‘*,¥ZkÕZäá‚€©ÕXMv`W–œT”G\fw‘UÀˆèøÀW¢X«ZC4im‹Pj5i’˜6±‰¤í½¤é¬Ð&Ó;“3“›{î9ÿwÎÍÅ1Ãq<&';?Õ’>=;'/µºReî7’ò¸âr§U.ÈP&+S$=L”\¡CF£°Z§×ôèµÃµèì$Ýí§wu1†´_‡1ú)êÑ¢
N\Ö¿†…†`8ƒMÁãNá¯â4÷¡““’f¦òeG±]d““’Þœ´sØ…‰l–µ°„¯p—8X«ËÆf%²9‰l._¡Î:Øi¼‹-àìVg˱ùÜ @@ -5718,10 +5799,10 @@ xÚ}•LW†gØÝ„uEÆ¥–•™Q)‘*,¥ZkÕZäá‚€©ÕXMv`W–œT”G\fw‘UÀˆèøÀW¢X«ZC4im‹Pj5i ¹+Õ³@\軺•h =Ò§Ü~Ø,ãçTLÒà„IJ£2Æ8¸ ‘4:ðâq ólK}óÞ‚hòák7™YQ6é]I#–Ž4J?‘Ò‚Bæ?xG e
¤|)Ô-åç(™t‰RG%Sµ%CYuÇcˆ™xò³Ó{ÎyCÕöœ
‚É,F‡§FˆÞX³¥¶†ž7yuÛvIMÑ{ÚZ÷zÕ±Ûue6¯¯Tŵ¥Îv˜å!™uÔ>·Ö‘é HŸÜí=h:vÞÓЦ®ðUïîŒÞÓè袞éþôX„£Ùëýõ5ѵõxψPÝžÏQƼm"“>N½3°YÁûãpdy—h:ÐÜEÐYùN³~Œ¤—Ãî…wù½^¯Ï»Ã×t©U¯—›;÷ü~c£ß¯û±ä® endstream endobj -1686 0 obj -<< /Type /FontDescriptor /FontName /MLTCHE+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 1688 0 R /CIDSet 1687 0 R >> +1711 0 obj +<< /Type /FontDescriptor /FontName /MLTCHE+LMRomanCaps10-Regular /Flags 4 /FontBBox [ -496 -290 1501 1100 ] /Ascent 1100 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 106 /XHeight 514 /FontFile3 1713 0 R /CIDSet 1712 0 R >> endobj -1689 0 obj +1714 0 obj << /Filter /FlateDecode /Length 411 >> stream xÚ’_kÂ0Åßó)î÷Ð5nŠ”Â¬Ê @@ -5729,21 +5810,21 @@ s-c¯5¹º€MJÚ>øí—?ÖÁ²BK½çÞžœdp·ÙÏ\í1=PØb£:Í0ÈÖeMƒ…b]…²}CäÈûj3ƒVl‡-³|‘KÑÞq endstream endobj 248 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MLTCHE+LMRomanCaps10-Regular /DescendantFonts [ 1690 0 R ] /ToUnicode 1689 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MLTCHE+LMRomanCaps10-Regular /DescendantFonts [ 1715 0 R ] /ToUnicode 1714 0 R >> endobj -1690 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MLTCHE+LMRomanCaps10-Regular /FontDescriptor 1686 0 R /W 1685 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1715 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MLTCHE+LMRomanCaps10-Regular /FontDescriptor 1711 0 R /W 1710 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1691 0 obj +1716 0 obj [ 28 [ 500 ] 50 [ 444 ] 52 [ 778 ] 70 [ 528 ] 72 [ 278 ] 109 [ 556 ] 112 [ 528 ] 118 [ 528 ] ] endobj -1693 0 obj +1718 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``à``Ð``j````i endstream endobj -1694 0 obj +1719 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1359 >> stream xÚ}”LgÇï @@ -5754,10 +5835,10 @@ KR·mÍÎ),ÎÑÐÕ4Yf±’:ŠÖŒ6Í¿¿ôÙl¡ÅjÒßÔYQ[u”™6Ð5ˆ´d’‹ä#&¤9%uSZ‹E‘¾F#gÑxÔ*{Q ÄåôìøUŸÁ¨BuœxBSøú/sÇEB×Tó!¨…šÑØoçS_<ŸŠßï…¿ÆõrÕl=±ðX^_ÍV1 Š ±§ á‘ütˆíå@…¸û‰¢ŽXx$ÇûêžjZBl!<–wIP ý,/`<<Â/Ǥixa —ùy¬ÌÎÞ0ƒ50Ïím x8µïÁŽ`âWcÞ>ŸgL
¬…(/ôzêÓr®uKÕ±ãMb¦¨ŠÿF 1ü¼¸Úá4b_¶6ím™=Ø“6Ÿp¡Œƒ(#Qòì• è™ûúæí•CÅLºš©i©Ž(P;Îí:TgùyôI…K¦ñaø¤¼§Æ9á¿ûŸ”hS 7a?ÎñÈ
x¾0±ç4µ^k·!Äða1åo»YÌÅ6Ôåm!^ó]ý8pÅ$|ø—æ¾›‘þ‘U\ƒmj¨K‡k‰Ékç>uë0|³ÔËö£Bû½P¿P-ÔãEÂ=!9Nb¹h“›&29§qØÝJ3ÕjW#Óâtˆ«Ä`|ÄZ:Y»|À?ž!ü¼(c°JÇkøC 9Å5ƒ`F„X½Ïãì$:mí~ endstream endobj -1692 0 obj -<< /Type /FontDescriptor /FontName /ZUCODC+LMRomanSlant10-Regular /Flags 4 /FontBBox [ -457 -290 1446 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle -10 /StemV 93 /XHeight 431 /FontFile3 1694 0 R /CIDSet 1693 0 R >> +1717 0 obj +<< /Type /FontDescriptor /FontName /ZUCODC+LMRomanSlant10-Regular /Flags 4 /FontBBox [ -457 -290 1446 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle -10 /StemV 93 /XHeight 431 /FontFile3 1719 0 R /CIDSet 1718 0 R >> endobj -1695 0 obj +1720 0 obj << /Filter /FlateDecode /Length 406 >> stream xÚ’_KÃ0Åßó)®ƒùP›nº©Œ‚¶ @@ -5767,21 +5848,21 @@ n«ÂN'óãÜZ„‰ç$4ÏÇ®êJî‘,l 4…Å£½R‚’ÿªÓàÚîZÁðz=TØg¥Ý:Ifסt–¤Ž¦“@W.=MsO—³P»t endstream endobj 238 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZUCODC+LMRomanSlant10-Regular /DescendantFonts [ 1696 0 R ] /ToUnicode 1695 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZUCODC+LMRomanSlant10-Regular /DescendantFonts [ 1721 0 R ] /ToUnicode 1720 0 R >> endobj -1696 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZUCODC+LMRomanSlant10-Regular /FontDescriptor 1692 0 R /W 1691 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1721 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZUCODC+LMRomanSlant10-Regular /FontDescriptor 1717 0 R /W 1716 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1697 0 obj +1722 0 obj [ 28 [ 559 ] 35 [ 639 ] 43 [ 511 319 ] 46 [ 882 639 ] 49 [ 756 527 575 ] 54 [ 724 351 575 575 904 575 ] 63 [ 639 383 ] 66 [ 319 ] 70 [ 607 692 319 ] 75 [ 958 900 639 575 ] 80 [ 864 575 575 786 639 ] 88 [ 319 ] 96 [ 474 639 454 ] 100 [ 575 575 ] 104 [ 800 447 575 575 ] 109 [ 639 ] 112 [ 607 ] 114 [ 831 869 607 ] 118 [ 607 ] 121 [ 575 ] 125 [ 639 ] 284 [ 575 ] 499 [ 571 571 ] ] endobj -1699 0 obj +1724 0 obj << /Filter /FlateDecode /Length 32 >> stream xÚc``à.þ¸xÞ†7_v¹0`œ@ endstream endobj -1700 0 obj +1725 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5315 >> stream xÚ•Y TWÖ®º)›˜.jÁ%.qÜ"¢€® ¢6 @@ -5805,10 +5886,10 @@ n_‚›éÁÞtykt³_BRfÚ6BGæ7º«Ê-r9†|EQzQæv,ù+=ù\è<B< äÚþ£É|¢$V×óÕ›ùòÅÏä×7}¼ÜKXàƃ!§«ìÝÇ©±¹‡oBªÅÍÍnÅ®â]e ù”¦ùþ‹ÑV¦o¬EÖÒaEQš¾:(·I/—ÂúÊ¢b·Ðw‹‹ed9P endstream endobj -1698 0 obj -<< /Type /FontDescriptor /FontName /OPWSTO+LMRoman10-Bold /Flags 4 /FontBBox [ -486 -295 1607 1133 ] /Ascent 1133 /CapHeight 686 /Descent -295 /ItalicAngle 0 /StemV 106 /XHeight 444 /FontFile3 1700 0 R /CIDSet 1699 0 R >> +1723 0 obj +<< /Type /FontDescriptor /FontName /OPWSTO+LMRoman10-Bold /Flags 4 /FontBBox [ -486 -295 1607 1133 ] /Ascent 1133 /CapHeight 686 /Descent -295 /ItalicAngle 0 /StemV 106 /XHeight 444 /FontFile3 1725 0 R /CIDSet 1724 0 R >> endobj -1701 0 obj +1726 0 obj << /Filter /FlateDecode /Length 587 >> stream xÚ}”]kâ@†ïó+f/{‘:ù0Ó hT¶UTv÷6fF7`&!‰þû™÷¤…"[°øx>Þ3ïädôcwðç²>)?zæl¯ºúÖÊÏÞóÆ–uq«”î?”’JÑîíÚº8¨ž³Ír£ËþÉ$otq½I5d=NZ¨K©¿R¬Õ»û}8nýŸïûºÊuÀýE}•>·5Dz¿šÜÿ¥1cc̵ø¥Ú®¬õž9ç懕–Y]Ù³uÞ„æc“aâs©eKC²“ÙB&Ë¢'rÿ‹Ê˜d‹÷®WÕFŸko6c“½ v}{w?y“m+U[ê?œÐdnMsUvƽ4eRMcãÍG^)6±ßH-ûûc¾*Ž÷F±Ðq€a‹Zª®ÉÕæú¢¼™1€§l¶6©§´üç¨:&aø:
†Pñ7om£ 38O‚ÔRBÐÍA+GqZ#ˆMA!bDPˆ^@ 2@&Ñ2©îD @@ -5816,76 +5897,74 @@ sÔ ÍID³@!æŽÂ%ˆfyA=Y€ g ¨'D¤@]àD¼-#‚/¦P× ø’a–ÎOá‹)p;D˜%„B‚žw” çw” § endstream endobj 228 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /OPWSTO+LMRoman10-Bold /DescendantFonts [ 1702 0 R ] /ToUnicode 1701 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /OPWSTO+LMRoman10-Bold /DescendantFonts [ 1727 0 R ] /ToUnicode 1726 0 R >> endobj -1702 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /OPWSTO+LMRoman10-Bold /FontDescriptor 1698 0 R /W 1697 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1727 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /OPWSTO+LMRoman10-Bold /FontDescriptor 1723 0 R /W 1722 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1703 0 obj -[ 28 [ 511 ] 35 [ 460 ] 42 [ 716 460 ] 46 [ 755 511 ] 50 [ 460 ] 54 [ 653 307 ] 59 [ 460 ] 63 [ 511 358 ] 66 [ 307 ] 68 [ 307 ] 70 [ 460 627 256 ] 74 [ 897 818 ] 77 [ 562 ] 81 [ 511 ] 84 [ 511 ] 95 [ 729 422 562 409 ] 104 [ 716 332 ] 109 [ 537 ] 111 [ 743 460 ] 114 [ 664 743 464 ] 118 [ 486 ] 251 [ 460 ] ] +1728 0 obj +[ 28 [ 511 ] 35 [ 460 ] 42 [ 716 460 ] 46 [ 755 511 ] 50 [ 460 ] 54 [ 653 307 ] 59 [ 460 ] 63 [ 511 358 ] 66 [ 307 ] 68 [ 307 ] 71 [ 627 256 ] 74 [ 897 818 ] 77 [ 562 ] 81 [ 511 ] 84 [ 511 ] 96 [ 422 562 409 ] 104 [ 716 332 ] 109 [ 537 ] 111 [ 743 460 ] 114 [ 664 743 464 ] 118 [ 486 ] 251 [ 460 ] ] endobj -1705 0 obj +1730 0 obj << /Filter /FlateDecode /Length 27 >> stream -xÚc``à0V\½ÅƒñÁÑ]h@ +xÚc``à0V\¹ÅƒáÁÑ]h@ endstream endobj -1706 0 obj -<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 4671 >> -stream -xÚµX|SåÙ?!œX¤« -d£çè9‚Jqˆ"¹–Òb)`é-mCÚ$¤iš6M›4·“¼Iš{zMzOïJ[h‹"wfÑMÜd‚:ݜ߮:÷&;ý¶ï¤ÅÉüé>¾}ß—üš¤IÞœç}þÏóÿÿŸ—…Ì‹°X¬ÅIvîß}ð‰]»÷‰óÓE«WØ.KÏdF>‹=Z¢‰ÐƒHè!Vˆ˜"Ù!Þ\âƒfvFÿߣçÐK£ÙƒÑs§SéáÑ£
£!+p_äñ³ =z ój1ýhäO£¿DÍAXÈbä!ä·È4eÍgÝÿ—*nÕª§·ˆ%ÅRAN®Œ÷ÔªUkžŒ<>ËÛÇÛ‘ž)¼tQoGowo¸ˆyWÀ[&ñ2ø¹éyÙ<q6/‰€WXÀ—ðr¤âBIÁò8^R® €W$– -y̳”ŸÇO/àgñ -EY|)O–ËçmÛŸ˜Ä{Q,’ñv 2ù¢>oÅ -¯€ÏçåÊd’çV®”æĉ¥9+³™ï¬Ì›ýRÁÊȺ/ÆïIZ±kû–{·ÆÉ2^¶XÊËâËÒyq_ßã?þß#–æ§çmÊgð·gñE2¬an" #O qÈJä)d-ò²ù²ÙŒ¼€¼ˆlC^Bv ;‘ÝH’„AÒt$ÉEH>"F$ˆ)@dˆ¡ÙLÒ™Û÷‘ïGÒ?±³fÕ°þ:GÎ^ÎvÏM™ûG´‚³†#ä|qOIÔž¨©y[î]4Ÿ38úžèñïTÅ|7æ£ûRî_|¿ãuœZ°jÁç?Zäæ>ǽ1£„VX¿›b‡ð®Gtåfs¡žHT)v ðc µÚ jmälF+«ÕŽ5–Ø5BÀ`&†ÂZ!N³é{é'é¥kG·^ï=Ùxz<èí“÷à}ÍÁ²¾ßw`ô6W¨Ýý\~X{¾c<çÕŸ /6Žá'›“ÓYgÒ“14&˜}‚ïyJÞ`‡ŽÀî_âOÇór¡€xv¡›Õ0·Þ¦¥4f3E,Ó¢åfµY©= ú”U§¡( –M“¨™Òdð±gNlû)œçÁÇác}ýWZž¶õ -²Â/Ýd‡kC;¸ð‘çþDs ú*G©Šrð[A LFIãÓƒ¨@«×nÃg>tƒZ^àÀ˜°\×ÏÝ+¢ã×>Fì;øBúzüQN°96ÅAB"4Žö¸–.ü·œ_¼›JŒù -c„©ºÎoºG MÝ%â t,•´¦ß]A¾$çæi÷¬ÿ†‚t7‹ëIÒ#R`”ÙhÒ߆C€ë<8× ¡ÿñØ¡~k ß3âl%8oØü§Èw;ÁU'6š=°s ýÈRzëêSk?E
º¸ÓÏ‚£„œ×
fóàƒÇ%2F ‚p,Gƒ¬Ká5ìprè÷8ÜŠ¶Øô@ŽOâ”h@q™4œÚ - -t„œžƒn\d
y‰³yz^ùnM†^+Ж%çà…FMvØ«›°@±G)•å¦Ëû>‚Ù½N†
hô=NÔWiA ¹Ó ×¢}.ï™^ÜÕhRV‘ùUAVX¯©mnnè‰ÀÈ„wBK"}Åß½»¸ÚVÖ0y™!¶r™Vd$ÚU’¶4œžKßC/£^;¶íúÄðÏGÊŸ)OÑËÅ‚ØÙ™ /Ë^ Ùàò5ÖaUþcÅyª¬Ì¾â[~çÇïø %Lf8oφ$|¿éï©8¯qŒ|µùäÈ -VæõLâøíÀgc¨ýo3[ýâ‹pÑÙ±×þŒY~çVEZÉ ¸Veim©êªê#¯À¡žv«Ë½ÆoÎ^! —"ôXe±VW]î–OÎá^¯AV édþºìe¨ŠoTaYM“¿é‚Wy¡\nci _(ÌÖÊÛ;;ƒ·k3ô‡H(¹·`î&”‚$î'¡{™LVÖVccùÉË^¦ÓÍ\XjÄåæÁK“x³µ°XI)˜~ybš‹êÍyôw6ã†à)&{¼–^0SE¢’ÜÔ UïÍkׯû™ Žû¦ "„2õ‹ªYìÇ®œg^ñOLx L±í.1o8îl³ØI{#°TaS[[w¹‰ãÕÁ¨ó“£ã¸ßUÈt!W‹•¹-¶úþ–âîÔ—ÓÒ3ľíJenÉŸBO.þ·Ê¤ÃÙæ¶ðÚg¸"OÀtÀH©c Ði°-cÒ¾“.¿—ôW_´a1鳚r)tžžÍ\ÃåfJ¡#ž¦ÑQô*ü¹;•áÁУÏ/p§ÎË°”ÉÔÃÔ+é¶L\_v72ÚÈ X,uò(Dc¦W«aî Öo.°a×ídôÀ@:)ºµD‘.þ÷”…~`šBÍFCQ)öroö©þ†Öæ*¢®§ú -³i¨˜Ýõÿú<;|£ž[¥E ÀåÀUYC@<Ôvº\®Ëx£û6MÑ‹8…(V“ô'Ó—CçÐ€É -p:ö›¤wÑ´O•È/O5ÅjÕæâ -å$;ºmÁÎ*ˆ;| Þ§³”“û¬¦–Ì•µŒ
µ¡ÎÅéÏÐ+ÐÕàUv§×A†æ…YÌÛôÃÓ—¿.}¶þþ!ªw2¿GÆÀ峎0¼0BHá›wCH·oM9r$Ÿ¸¦Mö§âñ¾" OëixN‘,_I*2Ëö -Ýà$[ÛmmÝ‘rbz\T€Ããp¶TÖ’½p)ZâlΘķ<.ƒËÉ;üy‚æ}—iP9Ðn×¥w_û'o~¡0ÀX¥38\*†¬îÖ…s~ÍušeefC9E$–äóð|ªµ³ÅÖdk!mÇí'±³¹'0Ê´¤wêßbïþèý -ÓÛ§Åêq^_K§§*jß•R¦ @6Äà&—UêÀë7`ÜÔ8Ó3qgá‚×Ù¡‡àjî‡ê3Ü„Ø‘ãÆš§n´öi²¼„Ш•h0µ£¤©®Å7<š1°ž—ñDò¯ªÚôÄI͈f?&”¬´0Á>¡$&ìà$ÀüeUr™¸$uϹœ·àãý0f”ˆÁÍÌ[Âó#óU>·nc’ì·½Ò´‡SÄh€žÜKoC
eÀÈÈØ*+ÍFX‹§% -><ÖÖ¹x7ç80êt¦ -fBf¬~7š[Q¡Yƒ+9%‘šô;9qÆ61ù*51û
^
(%K9Ê<+…‹m†ÊjF˜ê$ ꉔšËkuµ‚:üóãªÝL“jö’&u$€²HYmõ6Æ|ÌpLl&1}ɈièKgÌÅZâPqæÆ}¸4×Ξ¼
ÇÑ÷g%<2h¬çôÁewH5r±,z
ºv6äˆpßàl¡M5*UXJWæä'fÝåâÛä¶òbÍYvèÜ¿<‘ø B‹Ý†yµ5Eù:‘ÖDl¦GÅÀTQ+Vˆòà©'».v}Ü<EºíÕ~lüh0-.—^¦ÿÊL]ŸFÌ$u¬@#Qe‘Ƕ۔Œ=}Nôê™îŽŽ&bý°ÞÿO³cÌÛfyx-/?ü; -?Í&¯š(PÒü£6®gÒªv—™¬57é -°2u‘QGÐ'¦‹„ÑŽ3Oõ¬ß¡ˆìLŠ/ȵÅ
¿Ã˜Žqk…ÔJ^˜žFV‹¡÷Ù-õ^þGèÁ7z¼}¶X—…Y‹}yT‚«.VŸ…ó>b‡4¡hnOyP$“ÊdeNCG4³ å˜ø0]Iß³_=Þu®óÃÖŸöZGÍ]%"omQüalÕÑyøü(üÏ"Æpûš«/V}ÿ"Üò;¼û[®š)\R’A$ -3^ÁS”C'Ü–&ïIò|u<ƒ•3‰t²}´Õ‰Ír¦Î[÷òVðvÕ«-oß#œ~ûÝÅ™B?ŽI0KÐR@ˆ;G¨:¼³§j¢ƒÌ®”œÇ/œz«ƒì˜€qgèfíÚD¸†ÞËØ5-Pî7zý<óáuøŒ÷yšZú†Þ±Çz-Ì`‰¹u6=!ΧD‚l¥dÝfé4·›$˜–RËÏLÿp3<dô¡ÎŸ°{-u^UGò3©¬põ·Á}µRSè"?£;é,Z³w["uÔ«6›‹f´j=D[ÐÖÞÝKuáöjÐà)³ -5ó+Ž?G§«µ?‡SÖ™[pœQ“Ò¯šJi ~ IÉJÇ‹$¾É&ï°«›ì†¡“Õ¯á¶f ª%35€þ! >QÒу -
q¡ð KŠ?¶ŸþžìË9ÉN~Ð:90ˆ·ûe™å+²IÙ*t‡R¾>§ -@u Ùár7×`-rG™T*?šuB6zª«¿£ŽØ×pZÝ‚6±&Þ‘}c¤Ðüþ,`x`áoCk(îïBjqX¿Öíc¨H—¿÷×ç£Á¦ª*‚~–¿éH -~HÕo«ÓBí¾ÖZ¬Qé-&Ú˳ô‰ÉC‚×>ÿÕg¿o&ï8º%‡‰EfO…þêÿëXháâ_ÂKÜz¥§\¥ÕVTŒÓ[‚j4ÀDaZw…Ófe\ -¡-^X`
pˆIy+£çèù{ÏÎØ¡fîu•Žèèþ:æµÓZm±ûCÑß ¹…Wsÿ£½u +1731 0 obj +<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 4357 >> +stream +xÚµX xSeº>!œÈR«™¡çè9a¹ +"eQd†EDÖR(–ÍB—´M—$¤iš6M›4ÛIþìi’îmèž–ÒR––ÍÊ:‚:‚## .£^Ç™«£ÿ‰§wæž´80>:—;÷Þœ'ÛÉùs¾ÿ{ßïýÞÿç cÇ"gêÖØm;6ÆÎÙ¸i«$;Q¼`þÜuòÄ,Qrø·z=Dôãý‡&ÆÐ$—Œ%>là&uý-bód·'bìpÓ÷8šñ}}A8G¯_=ÓÙO¿H‰˜>ñiÄ¿!ãÆ d*òò%2ÌA99þìíFÏŸ¿xµDš/¥¥ËçÏ_ôLøõyÁªhÁúÄäLI^N¦H(N¬lŠl–ä±gE‚Y± I˜ž˜•*¤ +â„;¹9BYŽ M&É•æÌŽÄ¥‹ryY¦€}— ³„‰9ÂA®8E(ÈÓ…‚µÛ·Å ^–ˆå‚¢d¡8G(˜;W È +ér¹ô…yóä¹iÑYÚ¼TöšœyY£åÌ›ûrÌ渹×^³yÛšh¹R.H•È)By¢(+'úÇsüû÷ÍYvbÖÊI’p]ŠP,Éóöñ82y™ƒD#ó…Èä9dòkd² +y Y‹¼‚¬G6 ›X$Ù‡$"IH:"B² "EdH"GÃeÎ>f 3©‹89Ó8œïÇ(¸³¹¥cwŽý3ZÂ[ÄËä}ûPÁCÌ8ÉøN¸3qÑÄÏ#Ò~öá`¤(òÎ#æG#Õ>öÒ¤g'}2Lyf8*R ç8¼Â¥pß«úb‹%×@lS+7Šðý ©Ü
*ÝÍäØ€:Ê͉Õ8µ™z‘ÑBô)3+3q†ËL`žaž\rt͵CGêNô»|Š¼³®!XAVwùÏŒY«ägê6½‡ïѽÑ:„ã«“çŽôâGâEo6‘Œp$˜z˜zJßäÒ{a7ÿ»˜1B‘"SD¼ÛQ«ÝæX©Á®£´EÌÒ¡ÅE‰i¼ ü¸M¯¥(5 f
“¨…Ò& ±ç¯ý-ÇçáSóó +_V¼oÍ\–QwíHiGä‘îz`«¨×ÓÒu°ï÷nÍL”2ÅÈÈc¹ÁÐÜ >}‡-ç[V—¯– +ÓzÓg·V9ˆ‘LÀ®÷û8æ-˜x›K§Ãwê|:“Å¢ÕsW.4àÛeýC§šþÒxœ¼|h £÷õ›“*È°`*Ÿê@S} ëľÎ
Ì£Ÿ™Î<9ëuÁ)7ÿTAD~‚!Nzå&7TI¯çÃ/üÃ'˜Ë<•(‹= &Ø +(`6©IîAE:ƒn->òc)¨$á9Œ…Û æ’K»ø[ÄLÌ’§ˆ»^J\†Ïäe»Ûe÷Z]$$è´£ÔmmÇ¿äýþýæ—dä=Œ–um?˺ +W= gÐWñX¦
J›Œ¯(øYºÍË~‚žI5éUyÅJŒ²˜Ì†»pHp‹ï*4vý$ë5owwyûÝMd7¯õM{Íqòý6pÙMíÞ0™ñ$³fÁñ%_Œ"°zøÓ˜çA¡àÁ¥}_Û½xÏ©ˆŒT <„Gƒœ¡EÜP<½Ÿ +´ ¿È
j‡€® +
Ùê,¯¯Åù^•L–—žÐ§èü¦¦r³jÀ 𪼠ºL +Èå¼6¸íôøNÂ=ufU™mTçäa¹ÕÚʆ†ÚŽ0ŒlXpC€ž®+–|6ò!‡^:*ؼŒ[±\'6-jió>œË<ÄÌb¦-9¶öÚ`_¯ßO*ž+ÞiPHDQ{’“A!^”|R²Ö㯫ÂÊJjöçg©S’;óoýåúo®×*ÏjÞæåqøvóußñV8¾îyºáH7~®ô9I©ÑûjáöÙêó÷ª¡˜M„T'‹+,å
ÞFO=Y{ªŽÂ>ˆìz%==;‹ø-ìÀê`f
ßA-f‹`šÒšº²*Ÿèƒ+W3UzÈj«n×VÛwñ-üˆ-A±i/3QL‰¨¶·9íøgál'›ÂK0æ,çCèâÂ[p7ßærX˜`ÏË3ƒ"i6•F¬Èª Ç«q¿•ö¿ŽLõÛo'Á)g™ü;üþ©ŠuÒ9±¸Nmmj,k/ë$/Á_£Þ›§;#lH+bfÃòXfµ•;ˆöÒÆφpŸÏ(ÏшõJ2{iê,T-4iò°”ú¤“Ÿ·Ã§ÄdAί+dgffeæV*ZÚÚ‚mw¹Iÿ)Jú-˜~Ž
%'Žÿ=ͤ£²;–Ý·mÖ«ÌSú‘ûk¥‹¸ØÐsá$Þ`ËÍWQJ¶^æóQƒ%‹yxn, +3
S¨ÅdÌ+Ä^=”z¼«¶©¡Œ¨ê(¿dÇ"¡rtÖ¿ùþEnèF5¿Lòb§ +MoèæƒïØÚ=kvîÝ›M\ÕÅ×$à1»2^‘'ô¢Ö}xZž<[E*“‹6l”íÖ€“x«ºæDobÍ(ûV0§P³Áb¤0§°Ö_å®q=pñÝJ.;lþºq-}CWñ£`G¡T/6—뙲ÿÉ Ÿ+Áè„é‘ Ó7Tžß£,"þ'9¬U-ãêËû¯]ÿ§r5nØCùßâÒ.ä±åêâÑÌ‹›nÂG!Ngášnþ¾Ü™™1DœxGÂ.<%5øÎ@#ä¶&ÏwoíÆO4ïÝÂêØ«AøÌhbX{ê¾kOwíK‰‰¡â¿ì¿ ¨ô’á
'è²tTŠ%ª¤(õN£›lj±7·ÓµŒq-Pï +*L'ÔSOz¨ªüq>µ/7
›¿ü©…+Vú怳Éî#¬.ÔWÅæ0wã!ʺ ŠÂN“Ëmµy=„ÏßØæ-·½óR!›õI18‰Íe™&ðú
}e€%VôY8éu.ý\À¿³¼:©”¸Ò<}X}Ý•MÚ‘iÒIµ˜ÆUP_Õèï;šÔ½ŽŸ4'þW—ÕÍ∶_»Ë”.›™ëTƒNp`5Ee +¹¤ aóPÚÛðé.y”ˆ<‚4Ã.DV‡&†
{6¿®e“œw›ï°——Ç +¥Ü¬EEÀĶy?°;Àn'l6«ÕÛ8N;Ö\ùøAÞ`ÒëÍ%ì’‹õŽÑô’í"\Å+Ëœ8ÉÁSöÁ“§©Á°{¬õiA!YÈSeÙ(\b7:ÊYõ´9Ê ˆÑîVÍc²yš@þÍõ&–ÉÚ-¤Y (Ì"›½ÚÎöÜOØBŒ +Âø<–¼lÇ¡0ýÀ’¯#vç'¯ØŠKACåèRó]8€ÞísaçºŒ× gÝ·ö”i,b)Ì"tÉhÈáîvƒ·šéaI¥Æv¶'Ÿüóà¨]™zWæ¯8Ë¥‡þé÷Ø‹Ú\V§óé*ò²õb™XÅôó¹¤(J¢gïÅJŽ´Ÿoÿ¤á +é©s–×`Á}ÑéÌ,Ã=wô4}v'ÔþTBî_³e<¶xH|úÔÁÖÖzb{uŸ¡æ#‘ïZ¡%,¼ÂÐSÜZÌfŸ†È‘R²ì»7°iÕx€ÇBVZêõ9X‘&Ϥ'˜ÃÃy;è:´õ”Õ[>j +("5™ŠÒí¸1l +ØÎ<`+‘ÙÈsÃèÒf5Vâ~§µÚG§ßîy³Ã×iòXÙ±Økoœ¾ü,ÿ1—ÖÒüŽâ X.“Ë‹Üz—ž¨ßoÏT`’=Œƒyh»f }¨íNÓ;„³ÒUñ@‰ÈZ’³›Iü|ñ(üÏF"Òx÷žÎ—½}®þ˜Úô3wMÎœ^DÄçf&½†ïTõ.µÖûŽ‡á‹¨+àíqŒ@&ÖKYȶ2JT/±(Ô˜&ké«kÀ»e§ß
~@¸kœçNæq°_Š‰<¢ÆBÒÖOUámeƒdjEô
üÜáÞ·[ÉÖ+Ý0úݨ§UpC[XO£ªí&_
ÏDx
>cüÞúÆÎÞëÎ(Ÿ•]©`¥z»dSbQ*‹Ò²¥;鶴˜¥˜ŽÒä+X¯ÎüjÜmò£îÚšN;áôY«|z›ž&S)#àî‚{Ú¡Íõ_3mL +£Ý²v•aŽÒX,ù endstream endobj -1704 0 obj -<< /Type /FontDescriptor /FontName /TXKUMZ+LMRoman10-Italic /Flags 4 /FontBBox [ -458 -290 1386 1125 ] /Ascent 1125 /CapHeight 683 /Descent -290 /ItalicAngle -15 /StemV 102 /XHeight 431 /FontFile3 1706 0 R /CIDSet 1705 0 R >> +1729 0 obj +<< /Type /FontDescriptor /FontName /RQSXLQ+LMRoman10-Italic /Flags 4 /FontBBox [ -458 -290 1386 1125 ] /Ascent 1125 /CapHeight 683 /Descent -290 /ItalicAngle -15 /StemV 102 /XHeight 431 /FontFile3 1731 0 R /CIDSet 1730 0 R >> endobj -1707 0 obj -<< /Filter /FlateDecode /Length 520 >> +1732 0 obj +<< /Filter /FlateDecode /Length 512 >> stream -xÚ}”Koâ0…÷ùžR»HqIÚ -Eâ)E3´UaFÕì‚}a"'r‚?¶ÓJ£v@|œûòá:£o/»p.›…“;Î^©k.ZP¸Ü–m0q©IõOD’ä vìE7bG=»Y«BUý .”8_$
QŸ-èT©Û‡Ýìé-Ü¿}ÿ¹ýþؾ6u©"}y®DÈmÖ¾êÏ&úÿ̨앹2¿HwU£YtÇ97?¬•\6µ=aŒý”l<Ì}¬”Ô~Tv°ƒQÌd%zOîSÔÆ*›¼»v=Õ…:6ÁlÆƯFìz}uSßãg-IWêdøóMÌîÒ¶g²ó0ä9“t4¥GOeMll_H£Výõ+>rö×–Xì8ÂÀ¢‘Ôµ¥ ]ª3cÏÙlc^y@Jþ£sdŽ@0|¤ƒ$þ”ÚŠ–¦çi”[Š' 4w4€Ð<¡MAh IJ@)"SPÍ“¯™|•{GSî(^|ÍÐ4¡Cº +xÚ}“Koâ0…÷ùž]¤8!¶B‘()RŸ€FÝûÂD"N”„ÿ~l§•ªR$P>ÎõõñÉõèÏÛÖŸËzOþô–³
uõ¹ä/ž‹Æ–µ8W¤ú"IrP»öÖÖbK=/òe®ÊþFçJœÎ’†ªŸ‹éXª¯³ïèÃß¼o?žÞý§çM]*à~Þ§RøܬڕýIWÿ^È´Ê®¨Ì¶ùKmWÖê·œsýÇJÉE]™vÞĹd“Á÷¡T²uVÙÞ÷‚ÉRôŽì¯¨tTfñöÒõTåêP{³›l´Øõíź¾ñ&¯¤¶TG6¾âQ×lÏMs"ã‡q/˘¤ƒn3z)*bsü\jµì/×røZ³»4ÄBË‹ZRׂÚBÉ›éxÆfkýÉ<Rò›Î±j +z„æh-¡¦!(%¨L@)4G®g +r]î,EÜR¸¹ž÷ 4¡g´ endstream endobj 227 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TXKUMZ+LMRoman10-Italic /DescendantFonts [ 1708 0 R ] /ToUnicode 1707 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RQSXLQ+LMRoman10-Italic /DescendantFonts [ 1733 0 R ] /ToUnicode 1732 0 R >> endobj -1708 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /TXKUMZ+LMRoman10-Italic /FontDescriptor 1704 0 R /W 1703 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1733 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RQSXLQ+LMRoman10-Italic /FontDescriptor 1729 0 R /W 1728 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1709 0 obj +1734 0 obj [ 27 [ 531 531 ] 31 [ 531 ] 33 [ 531 ] 35 [ 531 531 ] 38 [ 531 531 ] 42 [ 531 531 531 ] 47 [ 531 ] 50 [ 531 531 531 ] 54 [ 531 531 531 531 ] 59 [ 531 ] 61 [ 531 ] 63 [ 531 531 531 531 ] 68 [ 531 ] 70 [ 531 531 531 ] 75 [ 531 ] 77 [ 531 531 531 531 531 531 531 531 ] 88 [ 531 ] 94 [ 531 ] 96 [ 531 531 531 ] 100 [ 531 531 531 531 531 531 531 531 ] 109 [ 531 531 ] 112 [ 531 ] 114 [ 531 ] 116 [ 531 ] 118 [ 531 ] 121 [ 531 ] ] endobj -1711 0 obj +1736 0 obj << /Filter /FlateDecode /Length 25 >> stream xÚc``Œ¶´¾úzú¦÷ßV9 endstream endobj -1712 0 obj +1737 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5269 >> stream xÚY XçÖž2AÅ1Z3u&.Õ^WŠKmÝêR\Š{]XÂHBa ëdEÅ
+j[[iEƒµµµ¶½z«½í½gÚÏûÿÿA¡·Þûüž™Ìœsæ;ç}Ï{áà@ˆD¢±Û7ymysíôµžžµfÁÌÊÀH•Vøj7›ˆœîE‚/â˜A+æ'ç$þÐÉáÉÛ¸û·˜ß3%ã BT8‚ßrÃ&òÉ3œ&'†8½D8"DÄXâEâñ;oW*r~¾[×Y..s=4áÑÚàÀ ½ÂÕÅeÎaÿšÂ}–bµ_¨Æ¨
Vø¨ý«g)<g)¼4Fþl°âeZá«òQ(4 @@ -5906,10 +5985,10 @@ _‘{¬Î'lT¸=jdb°˜4ñ–Ò-QåÉlz^*§·âi±;#ßLÑŽãkJ…/`ê¥5(;-È.,,—¼55ËX™Âfä6ð·‚ÿ* ¹ANÃþã§Ñ` endstream endobj -1710 0 obj -<< /Type /FontDescriptor /FontName /ZUNWIL+LMMono8-Regular /Flags 4 /FontBBox [ -456 -320 743 1014 ] /Ascent 1014 /CapHeight 611 /Descent -320 /ItalicAngle 0 /StemV 177 /XHeight 431 /FontFile3 1712 0 R /CIDSet 1711 0 R >> +1735 0 obj +<< /Type /FontDescriptor /FontName /ZUNWIL+LMMono8-Regular /Flags 4 /FontBBox [ -456 -320 743 1014 ] /Ascent 1014 /CapHeight 611 /Descent -320 /ItalicAngle 0 /StemV 177 /XHeight 431 /FontFile3 1737 0 R /CIDSet 1736 0 R >> endobj -1713 0 obj +1738 0 obj << /Filter /FlateDecode /Length 619 >> stream xÚ}”Koâ0…÷ùž]¤8/›V‰§©Ðª0ÍÃD'ÊcÁ¿Û禕*f@|ñµÏñ¹±ßÞvþ,/Ê9{WMÙÕ™ò›Cå
Ë2ë®J·[¥r•÷£Í3{«Ël§Z6\¤ËTíƒ)NuvérÕWÝ/š«s¡?K¬îÕ/ÿ÷÷íÏôÅÙlJ]Žýwuî.‡ÚçvÒ¾h/¦ø¿u̲ûƒÌ-òCÕMQêg<rÎ̓•ÎåÕn¯ñFd‘zÓ§Bç5ùdGëÚB–YKä~³«ÉÉNÞÝšV]S}*½É„ŒrÑ´õÍy~ðF¯u®êBŸÙð¾ES²ëªê¢¬Æ½é”åêdV6ùlWÅFvïinF‹öö>§ìo•b¡ã @@ -5919,21 +5998,21 @@ p"ÁÎÌCGp&ˆà,Bo$˜ › |J"x ¡—@/D. endstream endobj 215 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZUNWIL+LMMono8-Regular /DescendantFonts [ 1714 0 R ] /ToUnicode 1713 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZUNWIL+LMMono8-Regular /DescendantFonts [ 1739 0 R ] /ToUnicode 1738 0 R >> endobj -1714 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZUNWIL+LMMono8-Regular /FontDescriptor 1710 0 R /W 1709 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1739 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZUNWIL+LMMono8-Regular /FontDescriptor 1735 0 R /W 1734 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1715 0 obj +1740 0 obj [ 28 [ 549 ] 50 [ 494 ] 59 [ 494 ] 66 [ 329 ] 75 [ 878 ] 77 [ 603 ] 81 [ 549 ] 84 [ 549 ] 96 [ 453 ] 98 [ 439 ] 105 [ 357 ] 116 [ 495 ] ] endobj -1717 0 obj +1742 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``à``PPñ`XàÀ endstream endobj -1718 0 obj +1743 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1943 >> stream xÚ¥VPéßA#UœÜ
YÜ]=¼—>zÚÖÎÝ‹TWé`ò"IȃG B`“ž!$!ÔÕQóQGñðtÚ;mÇë\íµio¦7íõúîuÚM±×¹ÎÍ´Ó~;óí·ßþ¿ùÿ~ÿßÿÿÍŸ%&B<ïù’Ç÷~/wóƒ‡È*‰æYùz‰ZQÿUÄl`6R”É€˜õ<M`0>ƒ'¢Oñ¥±¿ ØJøy#;—_ÊÀë!ˆüZ|¾º¤6r«ä+‚ÌøÆ%Á&(9âAÏCÐÇÐS^/™·š'üjïÛ³·nýú²Ú¬UTÊõøö[wl‰ÏßÄs³ñI¹Š4êT @@ -5951,32 +6030,32 @@ nÿM x9 š¨zlWÒÈ„»†(—G4jôØT-U¶´‚Í·%™›(Sã 5„}˜”ÇFa»‘j³ŠŠg•oÿùÀã9Øb¥ý@Ù#?Í»ùüˆ|0î»j·´;¬4Su°Vƒ¨
á™°w¡oÏÁKþ î¶;°tº0›£¦^óEoú”R…¾¼kª:_ˆl,fÓªãJ
ºÝýnì‘Û§£Ht¸Ff´šOb*ö9Xi3ì<€ÔÖõyÚ°PïP0,:«ó4kjµU'®fç¢ôä*ÄjOoƒ5ç°Ôxw²†A/rôZ¼Íx/Í0ÂìéúþÞ‘$´@¬Î¤P‚UôÊ{«h—Óårzœ]Óà’3ärv;.ww·`õßq¤u endstream endobj -1716 0 obj -<< /Type /FontDescriptor /FontName /QSSFHB+LMRoman8-Italic /Flags 4 /FontBBox [ -489 -292 1472 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle -15 /StemV 110 /XHeight 431 /FontFile3 1718 0 R /CIDSet 1717 0 R >> +1741 0 obj +<< /Type /FontDescriptor /FontName /QSSFHB+LMRoman8-Italic /Flags 4 /FontBBox [ -489 -292 1472 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle -15 /StemV 110 /XHeight 431 /FontFile3 1743 0 R /CIDSet 1742 0 R >> endobj -1719 0 obj +1744 0 obj << /Filter /FlateDecode /Length 419 >> stream xÚ}’Okã0Åïú³‡@zp-'iÓ–`h’†5lÿl–½:Ò$Ä’‘åC¾ýJ»…’®ÁÆ?¿™ñÓ“F?ÞÊäQš=&Ók[lMg&«çªa£ÑÚˆ®Fí^%ÊAmàÍQ¢ƒñªXZ¹+_\hqê$U—‹–xTú³$üÆ;ü›ü.ËÍÏeòëykêJß%…«NJ$<4í”;ùâÿÖá²qÈ´2ú²kιÿð¤åÊÔay-K{‹¦JKÛû„}pͲ H%\Oñ)jŸSh.ÏúÐÃH·^l=GÏW,}µÒG_¶èKÊ®iNì endstream endobj 214 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QSSFHB+LMRoman8-Italic /DescendantFonts [ 1720 0 R ] /ToUnicode 1719 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QSSFHB+LMRoman8-Italic /DescendantFonts [ 1745 0 R ] /ToUnicode 1744 0 R >> endobj -1720 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QSSFHB+LMRoman8-Italic /FontDescriptor 1716 0 R /W 1715 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1745 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QSSFHB+LMRoman8-Italic /FontDescriptor 1741 0 R /W 1740 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1721 0 obj +1746 0 obj [ 51 [ 611 ] 56 [ 611 611 ] 78 [ 611 ] 82 [ 611 ] 100 [ 611 611 ] 106 [ 611 611 ] 121 [ 611 ] ] endobj -1723 0 obj +1748 0 obj << /Filter /FlateDecode /Length 21 >> stream xÚc` < endstream endobj -1724 0 obj +1749 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1695 >> stream xÚuU}PSWù%+…4-}Oß{¥ ¶…ÄBkQ·ŠP`@EØÁ²Z‚y„„‡I @@ -5991,10 +6070,10 @@ E±0Ò÷‡ý—§HÇwâ/ø²Ól:ÝNÒhÖWçòä$ô ±{>Þ4Ä`ûß·YQ$¶Õ4dì—6}¼Ôh³¾ðóб{þÁ—FÏ}ƒÃp$ºŽp¤xse\ÞɦŽ£¿ëé«õ|Dž;2uükâ—ñwW¿÷›äÔ
j@FQCCs³çÒÅA*<OøÞä¼0'àNÃiÅu endstream endobj -1722 0 obj -<< /Type /FontDescriptor /FontName /XENFPT+LMRoman6-Regular /Flags 4 /FontBBox [ -515 -298 1647 1125 ] /Ascent 1125 /CapHeight 683 /Descent -298 /ItalicAngle 0 /StemV 117 /XHeight 431 /FontFile3 1724 0 R /CIDSet 1723 0 R >> +1747 0 obj +<< /Type /FontDescriptor /FontName /XENFPT+LMRoman6-Regular /Flags 4 /FontBBox [ -515 -298 1647 1125 ] /Ascent 1125 /CapHeight 683 /Descent -298 /ItalicAngle 0 /StemV 117 /XHeight 431 /FontFile3 1749 0 R /CIDSet 1748 0 R >> endobj -1725 0 obj +1750 0 obj << /Filter /FlateDecode /Length 404 >> stream xÚ}’K‹Â0…÷ùw‚.jSŸ£HÁ'fTT·5¹:›”´]øï'«0ŒSèãë=799Iãm»¦\0è¶)ì°P•fÌ?Óœ4Ūe¹FäÈëj1†Vl%4çÉ"‘¢lq"ÙµâX«þÍð"äSbçæÁq¹^mÁÇçNe©;¼T×TÔvDy5êÿ…`ªð¢ @@ -6002,21 +6081,21 @@ n˜/Ô…PrQ›Rj~,%Ÿ«Ì®° áÝ%„µï³\ßÂÉ'Q¸`åÜ“e&*Û¼¿%f‰<+2™@hfE©oÎu‹„ÍQyæF³ endstream endobj 212 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /XENFPT+LMRoman6-Regular /DescendantFonts [ 1726 0 R ] /ToUnicode 1725 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /XENFPT+LMRoman6-Regular /DescendantFonts [ 1751 0 R ] /ToUnicode 1750 0 R >> endobj -1726 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /XENFPT+LMRoman6-Regular /FontDescriptor 1722 0 R /W 1721 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1751 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /XENFPT+LMRoman6-Regular /FontDescriptor 1747 0 R /W 1746 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1727 0 obj +1752 0 obj [ 28 [ 510 ] 35 [ 549 ] 43 [ 472 ] 50 [ 472 531 ] 55 [ 325 531 531 ] 66 [ 253 ] 72 [ 253 ] 75 [ 844 ] 77 [ 549 531 ] 81 [ 531 531 ] 84 [ 549 ] 96 [ 363 ] 98 [ 407 ] 100 [ 531 531 ] 105 [ 384 531 531 ] 116 [ 490 ] 121 [ 531 ] ] endobj -1729 0 obj +1754 0 obj << /Filter /FlateDecode /Length 24 >> stream xÚc``à0< 0-ƒaM‡ endstream endobj -1730 0 obj +1755 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2339 >> stream xÚmVTWž!$ƒ5¦•8 œ±Z*ò¨à‚E(R@A
2@H"+ZÚúL´âq•µV.V¨RlðAk{ @@ -6028,10 +6107,10 @@ adðÁ+Mø]ÁÕ?ó/½DØî¤Üu#Qc+œ ! G³ \üŠV¡"”‹*ÄßK`.¤À<”"?>o³ãB¾8)È|3ô“—Í0aÕ·ôpfÔál*'²r~“±á*Å¢wƒ/¼F¿jí5tP?Ñn«goï¹®!•æhC"ýº.óõ”:ûD·ž1}¹ÛÖ£1ƒ|ÀÇŒ”A´Ìu3{§¤³…ë6ßuÕ²{–Õò)‡!«öH„NH/’N0K'ÚŸšØaÙc±ìÙ+”}5Ré×–½ïî±ì¯¥“þù ~ endstream endobj -1728 0 obj -<< /Type /FontDescriptor /FontName /PEUXRX+LMSans8-Regular /Flags 4 /FontBBox [ -446 -314 1510 1154 ] /Ascent 1154 /CapHeight 694 /Descent -314 /ItalicAngle 0 /StemV 98 /XHeight 444 /FontFile3 1730 0 R /CIDSet 1729 0 R >> +1753 0 obj +<< /Type /FontDescriptor /FontName /PEUXRX+LMSans8-Regular /Flags 4 /FontBBox [ -446 -314 1510 1154 ] /Ascent 1154 /CapHeight 694 /Descent -314 /ItalicAngle 0 /StemV 98 /XHeight 444 /FontFile3 1755 0 R /CIDSet 1754 0 R >> endobj -1731 0 obj +1756 0 obj << /Filter /FlateDecode /Length 479 >> stream xÚ}“Ño¢@Æßù+öLìeÛ’5!¹¶F½‹¯ÈŽ‰,dÿûÛÝÚ¤ñÎãùfö›Ùqòc»w_D}"7|älGmÝ«‚Üô-oœÉdU}E²{'$Æhû̶ª.öÔ±iš2YvZœÉâÚU÷E¯t)å—Ĝæ:ºÛõ¯ãîèþ|Ûç²]¸;ºô×\¹Ü$ÊîªÅÿÕ1d÷ƒÌùMª-kùÌüGι~±–"+Ó^ëxƒEæ¦Ï¥jðÉNƵãL”E7ý.*='“¼¿µU™<×ÎrÉ<}rÙvêf=?8Þ‡¤JyaÓûµdß7Í•ŒÆ$a‚κ²žÏ{^óLï™ÐѲ»ýc_)‡[C,°ìÃnQj›¼ •Ë9K=ž°åF‡¤øçÈ:Z0þæc¨ø“+SÈOu!Î#?1„ @@ -6040,21 +6119,21 @@ xÚ}“Ño¢@Æßù+öLìeÛ’5!¹¶F½‹¯ÈŽ‰,dÿûÛÝÚ¤ñÎãùfö›Ùqòc»w_D}"7|älGmÝ«‚Üô-o endstream endobj 211 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PEUXRX+LMSans8-Regular /DescendantFonts [ 1732 0 R ] /ToUnicode 1731 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PEUXRX+LMSans8-Regular /DescendantFonts [ 1757 0 R ] /ToUnicode 1756 0 R >> endobj -1732 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PEUXRX+LMSans8-Regular /FontDescriptor 1728 0 R /W 1727 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1757 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PEUXRX+LMSans8-Regular /FontDescriptor 1753 0 R /W 1752 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1733 0 obj +1758 0 obj [ 28 [ 531 ] 34 [ 752 590 ] 42 [ 767 472 295 295 ] 47 [ 590 ] 49 [ 723 472 ] 54 [ 693 325 ] 58 [ 834 531 ] 62 [ 796 590 354 383 295 ] 70 [ 561 664 295 ] 74 [ 973 885 ] 77 [ 590 531 ] 81 [ 531 531 723 590 413 413 ] 88 [ 295 826 ] 95 [ 782 414 590 419 ] 102 [ 531 ] 104 [ 767 413 ] 107 [ 531 ] 109 [ 590 ] 112 [ 561 1091 767 796 561 ] 118 [ 561 ] 121 [ 531 ] 125 [ 590 ] 284 [ 531 ] 499 [ 502 502 ] 502 [ 295 ] ] endobj -1735 0 obj +1760 0 obj << /Filter /FlateDecode /Length 32 >> stream xÚc``à0°M6~¼îà£+¿\0N endstream endobj -1736 0 obj +1761 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5717 >> stream xÚY \WþŸ“AETÆ ÎèL¼/@k«õ ÞU<k½9Â7B8CÂ! ÷}b@<8o-Vkk\mu±®õh·Zßàcwÿ/`Õݶ»ÿÿà3™7ó¾¿ßû~Ç‹€0€£œ–Z¹jëŒuë7)ÜçÙo’y‡ËÝBÌ÷VòãøñÀŠåÇüXÏZðœ—@„‡¬ô:£¶1¢›/zDc B7Ÿ-¬‡óÀj<þ)´šh¾ ¶šDXZb1–xDô @@ -6079,10 +6158,10 @@ dùôê}.ŠÕg$1™Ùù\Á€+z³DñÊ"¦(#» =lÿ·CqÊ;¼Ú)þ¿NdmþæmÏXMKÄówi6åüòB¨È9P.f×l‘Ï´¬›]lК½^›~à‚••AWX«ËÌÒ¥ëõ™VCþP#2q endstream endobj -1734 0 obj -<< /Type /FontDescriptor /FontName /HBGFGU+LMRoman8-Regular /Flags 4 /FontBBox [ -456 -292 1497 1125 ] /Ascent 1125 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 98 /XHeight 431 /FontFile3 1736 0 R /CIDSet 1735 0 R >> +1759 0 obj +<< /Type /FontDescriptor /FontName /HBGFGU+LMRoman8-Regular /Flags 4 /FontBBox [ -456 -292 1497 1125 ] /Ascent 1125 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 98 /XHeight 431 /FontFile3 1761 0 R /CIDSet 1760 0 R >> endobj -1737 0 obj +1762 0 obj << /Filter /FlateDecode /Length 601 >> stream xÚ}”[Ú0…ßó+Ü$ö!‹“`{Y¡H\·H{Ъ¯!148Qø÷µ}&»RÕ-ˆ/3žsf{ðí}Ίê Ãäž³n«k“ëpñ’ÕÁ`°¬òëE›îUëB}´}dïM•ïtdž‹ÍrcÊîÎ&oL~¾ºÏúwÒ\ŸJó™âtØp¯…ßçOë§áó˶ºdæ!ÜêÓõœ5!w«öew¶ÙÿOd6ʾˆ2_æ§nÚ²2,ºçœÛ+S,ª‹ë°
Fä’zßÇÒ
Yeg<ˆbV”yGäó‹•[¼»µ¾ḻ @@ -6092,36 +6171,36 @@ xÚ}”[Ú0…ßó+Ü$ö!‹“`{Y¡H\·H{Ъ¯!148Qø÷µ}&»RÕ-ˆ/3žsf{ðí}Ίê Ãäž³n«k“ëpñ’ endstream endobj 210 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /HBGFGU+LMRoman8-Regular /DescendantFonts [ 1738 0 R ] /ToUnicode 1737 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /HBGFGU+LMRoman8-Regular /DescendantFonts [ 1763 0 R ] /ToUnicode 1762 0 R >> endobj -1738 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /HBGFGU+LMRoman8-Regular /FontDescriptor 1734 0 R /W 1733 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1763 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /HBGFGU+LMRoman8-Regular /FontDescriptor 1759 0 R /W 1758 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1740 0 obj +1765 0 obj [638.9 ] endobj -1742 0 obj +1767 0 obj [569.4 ] endobj -1744 0 obj +1769 0 obj [668 ] endobj -1745 0 obj +1770 0 obj [570 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 277.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 777.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600.2 0 0 0 0 0 0 0 0 0 571.5 ] endobj -1746 0 obj +1771 0 obj [388.9 388.9 0 777.8 0 0 0 0 500 500 500 0 500 0 0 0 0 0 0 0 0 777.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 444.5 0 0 0 0 0 0 0 0 0 0 555.5 0 0 0 391.7 0 388.9 ] endobj -1747 0 obj +1772 0 obj [ 28 [ 525 ] 35 [ 525 525 ] 42 [ 525 525 ] 47 [ 525 ] 50 [ 525 ] 55 [ 525 ] 59 [ 525 ] 63 [ 525 ] 66 [ 525 ] 72 [ 525 ] 75 [ 525 ] 77 [ 525 ] 79 [ 525 ] 81 [ 525 ] 84 [ 525 525 525 ] 93 [ 525 525 ] 96 [ 525 ] 98 [ 525 ] 103 [ 525 ] 105 [ 525 ] 109 [ 525 ] 112 [ 525 ] 116 [ 525 ] 118 [ 525 ] ] endobj -1749 0 obj +1774 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``à0TT˜êǶХ endstream endobj -1750 0 obj +1775 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 3390 >> stream xÚW{T綟 @@ -6143,10 +6222,10 @@ oÉà>:M„ˆ™äYœV—“ðkzŽè R©vùŒT§ÏÒe›i$¢Úƒ‡‡LõvGAQdXßGBÎG0itz¼û1JßõWÂwÃSéï2;Ô¼bfØôb¥ÔlÂQJE1zb
y étÇ`ËÈàW”»Ïé$.æ÷ç8ŒOG¥«œk„I¯¾¾Á¤kSEKU‡r‰UWÊ&Ç"]X*ÛúÜV²NãhÓSÁ6º‡&Ò£½ìü Í3ef^†³¿„é_wÔø÷ø¿0dÊöS{>þY}1¾•Ùn‡=V3ìÈ._•2›N™›;ÞfŽ6s«Ëž’rÑl³[Ø[«9àL™Çtýæ¼ÿ§tyE endstream endobj -1748 0 obj -<< /Type /FontDescriptor /FontName /PRYBOS+LMMono10-Italic /Flags 4 /FontBBox [ -491 -316 834 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle -15 /StemV 175 /XHeight 431 /FontFile3 1750 0 R /CIDSet 1749 0 R >> +1773 0 obj +<< /Type /FontDescriptor /FontName /PRYBOS+LMMono10-Italic /Flags 4 /FontBBox [ -491 -316 834 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle -15 /StemV 175 /XHeight 431 /FontFile3 1775 0 R /CIDSet 1774 0 R >> endobj -1751 0 obj +1776 0 obj << /Filter /FlateDecode /Length 495 >> stream xÚ}“]‹â0†ïû+²‚sÑ1¶)Œ_PØEeÙ½¬ÉÑ-hRÒzá¿ß$o;‹»‚ÒÇ÷|¼99|ÛîÃ7©ŽŸ9ÛQ£oFP¸x/ë`0Xjq»’j?ˆ$É^m^ÙÖh±§–
ŲPUûdƒ%.7I}Ôã 9+õâú°á~†Ûݯùf~×JG<,ÚòR‰»¤CÕ^lðã˜Ùc‘ù"?È4•V¯,zæœÛ?VJ.ôÕ¯ FE6êMŸ*%Mç“ë Š™¬DÛ‘ÿW;'—¼¿7-]uÒÁlÆF;+6¹{ÏOÁhc$™JÙð±E²¿Õõ…œÆƒ<g’N¶²ÏGy%6rg/¤U«öþ!|¥î5±Øs»BKjêR)Õ™‚™ÏÙlm?y@Jþ¥sdO@Ð?ÆÓ^¿Kã @@ -6154,21 +6233,21 @@ E[ˆó4ÊÅcPšxJ 7O“1hŽÈŽÖ ‰§qJ@(uy¨Ë{ñ4éò¦ ºOº¼%h ZP%†—$‚¶á%ˆD¿$¡_‚ endstream endobj 204 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PRYBOS+LMMono10-Italic /DescendantFonts [ 1752 0 R ] /ToUnicode 1751 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /PRYBOS+LMMono10-Italic /DescendantFonts [ 1777 0 R ] /ToUnicode 1776 0 R >> endobj -1752 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PRYBOS+LMMono10-Italic /FontDescriptor 1748 0 R /W 1747 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1777 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /PRYBOS+LMMono10-Italic /FontDescriptor 1773 0 R /W 1772 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1753 0 obj +1778 0 obj [ 28 [ 525 ] 35 [ 525 ] 43 [ 525 ] 47 [ 525 ] 50 [ 525 ] 55 [ 525 ] 66 [ 525 ] 72 [ 525 ] 75 [ 525 ] 77 [ 525 ] 81 [ 525 ] 84 [ 525 ] 96 [ 525 ] 98 [ 525 ] 105 [ 525 ] 109 [ 525 ] 118 [ 525 ] ] endobj -1755 0 obj +1780 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``àTdP˜âÁ°À… endstream endobj -1756 0 obj +1781 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2043 >> stream xÚmV
PgÞ@Ø%µÊGôjôÛmµFþüE¯¨(ÒZñ·Ö1â&f’(TK²´‚ZÊük uŠ =µÓÖÖŸ±bw×&wöjÖ»Úo¯Ÿ3½Ý€Óéff“wóîû>ïÏóÌ'!¤RB"‘LÉZ½yYFöì¬5kŒŒ1Ë2'9a™Ñ ÿÊàiþ—òÓ~º„‡a<ÎÇH9¹/”‡äÒG[ðÇÿ5ÿÒ1 $5O‰÷³“P”üYáWd¼|¦øàùs„,ŒSˆiÄ÷Ä/©$R2é÷“ÎMLNž¿Ühr˜õZ…ž›œ</^¼§ÐËéUª¼B£-ÔÓ*FM¯J¤×$ÒÙF›ðTOÇ:W£Sòic>£ÙD[Y™¥µf£ÕÄÆ%Ò9:=KÛŒæBZø6k«QÓVF1Ó†N_¿.‡^id,t–>Oð:!¦Y†ÖY,¦ÅII«6ÑhÖ&å>l’aĉMßKXùrvNBVæò´ìui‰»…Î7šiµÆ¢ÒØÄß”8f¦ª¹šLµ†±è-B¸¦3ˆÙD1—XH,#2ˆÕÄb-‘Cl'r =±ƒ( @@ -6187,10 +6266,10 @@ YQ¼L¤†¸ZŽ¿A69[ó„ȸüEYh¥Úfþ
ï"c¯knÝ œùvT}Bc¯Û¹5(°¨˜¯
Éân¨y^~X
Ç
Õ‹·’`hqj)“îlo‡¨þ±ðÿe½¸’ŒÞy«·ïPÓI¶²9E¡l„r6_ÍD_ë>}ôòNþÙQ8·Ð˜êÉøh,:q„+‡!¨k$¢ñÃ}¥Ei¥Ö§56ƒÅ®äªkÝoO¦Ž¢ãŒÁ^Älón?w=]W
Q¿:¢eT3ÄÃÐD^)Ÿ%hˆÅâáfiti¿¨-ª«®#áªC’<Ò%ò?Œl®æÄ«¦±ú€\~}?Ǭc‡¸Cò'ù¦˜ŸÿŠ3Ç endstream endobj -1754 0 obj -<< /Type /FontDescriptor /FontName /LKYBHN+LMMonoLt10-Bold /Flags 4 /FontBBox [ -454 -308 734 1039 ] /Ascent 1039 /CapHeight 611 /Descent -308 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1756 0 R /CIDSet 1755 0 R >> +1779 0 obj +<< /Type /FontDescriptor /FontName /LKYBHN+LMMonoLt10-Bold /Flags 4 /FontBBox [ -454 -308 734 1039 ] /Ascent 1039 /CapHeight 611 /Descent -308 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1781 0 R /CIDSet 1780 0 R >> endobj -1757 0 obj +1782 0 obj << /Filter /FlateDecode /Length 443 >> stream xÚ}“Qo›0Çßý)¼‡HéÅÖ*BZH£¡%iÕDÓöHìKf)ØȘ‡|ûÙ>h¥*ˆÿ»óßwfòåu}úÑìžÑ7èto8Då¶nÉd²Ò¼o@Ù€ @@ -6199,21 +6278,21 @@ OÞ¸>ùäýµ³ÐTê¤ÉbAã7'vÖ\ƒç;¿Fª3Þ¶èBö}Û^ÀÛ¡Œpr•]vu4ö{¯„S¥½þ£ )‡k4
œ ]®t endstream endobj 203 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /LKYBHN+LMMonoLt10-Bold /DescendantFonts [ 1758 0 R ] /ToUnicode 1757 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /LKYBHN+LMMonoLt10-Bold /DescendantFonts [ 1783 0 R ] /ToUnicode 1782 0 R >> endobj -1758 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /LKYBHN+LMMonoLt10-Bold /FontDescriptor 1754 0 R /W 1753 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1783 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /LKYBHN+LMMonoLt10-Bold /FontDescriptor 1779 0 R /W 1778 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1759 0 obj +1784 0 obj [ 27 [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] 61 [ 525 ] 63 [ 525 525 525 525 ] 68 [ 525 525 525 525 525 525 525 525 525 525 ] 79 [ 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] 96 [ 525 525 525 525 ] 102 [ 525 525 525 525 525 525 ] 109 [ 525 525 525 525 525 525 525 525 ] 118 [ 525 ] 120 [ 525 525 ] 139 [ 525 ] 163 [ 525 ] 202 [ 525 ] 294 [ 525 ] 602 [ 525 ] ] endobj -1761 0 obj +1786 0 obj << /Filter /FlateDecode /Length 40 >> stream xÚc``ÿÿÿÿ×÷ÿÿûüý×b`P`€&¢€ endstream endobj -1762 0 obj +1787 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 8021 >> stream xÚÍzy\W×ÿDÈ$*EeÅŒ½ƒ{ë^·Zw¬¢ ¨UÜPAÑ°C $a a½aß û¾‰¸ï+.Am[µõiíŠÕÖÖîïöÒ÷óN}Ú>ïïŸßçó†d½sgî¹÷œó=ßs&ÂÚšöŽîNnë6Îpus“…È^›;k‹Ô7"h¿Ü|n=7›m @@ -6250,10 +6329,10 @@ Cbé7ÈþxTvjM È}WQÿÙ^º`×w]ow}ËÛ!ñ]ä{—Rq¾åô7"Cl± Iàâ4Çf(´nf~Ä£7¿²+³rllÚ«2²rõú‚+m6/qÕ£ÿ‹þÄ>Òy endstream endobj -1760 0 obj -<< /Type /FontDescriptor /FontName /ATFMGN+LMMono10-Regular /Flags 4 /FontBBox [ -451 -316 731 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1762 0 R /CIDSet 1761 0 R >> +1785 0 obj +<< /Type /FontDescriptor /FontName /ATFMGN+LMMono10-Regular /Flags 4 /FontBBox [ -451 -316 731 1016 ] /Ascent 1016 /CapHeight 611 /Descent -316 /ItalicAngle 0 /StemV 175 /XHeight 431 /FontFile3 1787 0 R /CIDSet 1786 0 R >> endobj -1763 0 obj +1788 0 obj << /Filter /FlateDecode /Length 741 >> stream xÚ}•]oÚ0…ïó+¼‹Jí%ñg[!$ÊÇ„4Úª i·41,$(„þýŸ•¦u•ZõÁŽßó¼6ÎÍ··eoTÔ¾§îSñîõ©É}o¼X’››IŸö¾j_¼/|q=>‰·¦Î—¾·ãùd^•í]˜<¯òÝ©ð—Yÿžôì·eõ9¥«#nWþWo´š-¾¿ô~,uUgiïÝoO»uÓK»§Ve»³ÿ?Q„QñŨˆËüôͱ¬«'‘ݧi>˜VŸÞw†Ç¤Ï”¢É½)«¢aTñÑO2)Š2oIño¾ê^žßÏ«M¢*—Ƕ9ÇÔwIÿµ)|SV[qûEÆ0gy:v¾Ë#Òd8…ß„¥C^Ö{/úþ¼£e{þªŸÏ¬Î/däóºðÇÃ:÷ͺÚúdšÅ`~†‰¯Š¿ÆS<õ±† —¯CùïuÓ-”=‡…ÒTgÃHãH–4‰$-hÉLA³H$SÌ2¬™‚$H‚*4ÖƒÖ$YÐ3È& <DZGÇF¨§@ð³$ø)æ¤ëÁOkü,HÑD?‚Ÿ%ÁO=€à§LÁO¢» @@ -6262,22 +6341,22 @@ xÚ}•]oÚ0…ïó+¼‹Jí%ñg[!$ÊÇ„4Úª i·41,$(„þýŸ•¦u•ZõÁŽßó¼6ÎÍ··eoTÔ¾§îSñîõ©É}o¼ endstream endobj 202 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ATFMGN+LMMono10-Regular /DescendantFonts [ 1764 0 R ] /ToUnicode 1763 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ATFMGN+LMMono10-Regular /DescendantFonts [ 1789 0 R ] /ToUnicode 1788 0 R >> endobj -1764 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ATFMGN+LMMono10-Regular /FontDescriptor 1760 0 R /W 1759 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1789 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ATFMGN+LMMono10-Regular /FontDescriptor 1785 0 R /W 1784 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1765 0 obj +1790 0 obj [ 51 [ 569 ] 56 [ 569 569 ] 78 [ 569 ] 82 [ 569 ] 100 [ 569 569 ] 106 [ 569 569 ] 121 [ 569 ] ] endobj -1767 0 obj +1792 0 obj << /Filter /FlateDecode /Length 21 >> stream xÚc` < endstream endobj -1768 0 obj +1793 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1685 >> stream xÚuUkPTG¾óȆë(uGû^QWÂCÅøZ·`‰¸ òô±™Ë0Ì0çáˆjÒ3GAŠG@^òX"")E0‚kŠZ]CP*–•X,PšÑ¾nócg´öÏVmwÕéîÓ§«¿ï;Ýu„XLÿÄÈÝá »¢câ¹Lµqs`<«µÔ&ïÞN~9¿* @@ -6287,31 +6366,31 @@ GK›êtôËdžïýmšBó—áExáæÐà}½gËZªÝ5g:÷‚\þû¥~ÕóÛBc"õZŠOI NÁbŽâC¤^ú®×r—`à)ê|*â+Ð%æM¤Ü×1=ÛU8⦈ˆkQʨöR¡‡áyÑ Ä¶ËšªJ‰mž´Ñ¹ÃprŒú~_9&꾩ûR58WCW%Ù#B)_o-ZÈ««=%…Øä-/7ýlµ|D%2–]¨•‚¨DC°bTø¸ß™ðir8ö‡ÓálkQ(\ç-µ—:KÏ—:óÿàY endstream endobj -1766 0 obj -<< /Type /FontDescriptor /FontName /TFIASI+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 1768 0 R /CIDSet 1767 0 R >> +1791 0 obj +<< /Type /FontDescriptor /FontName /TFIASI+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 1124 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 108 /XHeight 431 /FontFile3 1793 0 R /CIDSet 1792 0 R >> endobj -1769 0 obj +1794 0 obj << /Filter /FlateDecode /Length 405 >> stream xÚ}’]KÃ0†ïó+ŽwQ›îSeætPp›¬C¼í’³X“’¶û÷ž$ëQýxzÞ“¼y“ÞÍ[Í¥Ùc4¼ã°ÅÚ´V`´XëõžhKÔÍQ¢ìªõ#¼Y#rlàv‘=gZ5}gZœZ‰êwÑ•þ–¸yàv‡Ñn™Íó,z]mMYèi´Åc{*lÄ]×N5'Rÿ/ªÂUðü£•ÑÜqÎéÇ‹–SºÖ,¾¸„¸ó}PZÚ‹UØ;ã,€T¢¹Š’¢rÍù¹n°ÌôÁ°ÙbšYÕ={×}o¬D«ô‘øw¤ÉÛª:¡óœ¥)H<ÐДѺ(b·üLRU5ç¿røîÙ+„ç$Fb]m¡ÈfOa¶¤+e¨å:]ûC@tŸÉµ$>ëi zݧ,¼<=y½zð4J<MF¦Æ&憞
<M/3ð4¸ô®Ü‚ÜÞ\óµžß@ŸËFi¼îqe*×åo8ºƒêh³d_K}÷O endstream endobj 201 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TFIASI+LMRoman7-Regular /DescendantFonts [ 1770 0 R ] /ToUnicode 1769 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TFIASI+LMRoman7-Regular /DescendantFonts [ 1795 0 R ] /ToUnicode 1794 0 R >> endobj -1770 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /TFIASI+LMRoman7-Regular /FontDescriptor 1766 0 R /W 1765 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1795 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /TFIASI+LMRoman7-Regular /FontDescriptor 1791 0 R /W 1790 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1771 0 obj +1796 0 obj [ 28 [ 481 ] 35 [ 517 ] 43 [ 444 ] 50 [ 444 ] 55 [ 306 ] 59 [ 500 ] 63 [ 517 ] 66 [ 239 ] 72 [ 239 ] 75 [ 794 ] 77 [ 517 ] 81 [ 500 ] 84 [ 517 ] 96 [ 342 556 383 ] 105 [ 361 ] 109 [ 517 ] 116 [ 461 ] 118 [ 461 ] ] endobj -1773 0 obj +1798 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``àPT˜âÁðÀ… endstream endobj -1774 0 obj +1799 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1948 >> stream xÚuUPSW¾—p”ˆJLdrñÞ‹kÕj!€vU,S% @@ -6332,32 +6411,32 @@ u5+¡NG"^H X€w©ç#';³ÐWÔÁ®aâ>’ áÊÌ*›WûàrH(¯]ÓýÞáCÊ„BB$å¿ï(!‹
;÷n¤wɉ-‡+ZH‘¢½cïó/i÷?%…s¹g{ÛýdK|í-¬¢ R[[ø”\i” '9„Þý“]Þû>äZu
×÷…Îúêš·Í™Â)ÿ¤ ¸+ endstream endobj -1772 0 obj -<< /Type /FontDescriptor /FontName /QCVRJJ+LMSans10-Regular /Flags 4 /FontBBox [ -420 -309 1431 1154 ] /Ascent 1154 /CapHeight 694 /Descent -309 /ItalicAngle 0 /StemV 93 /XHeight 444 /FontFile3 1774 0 R /CIDSet 1773 0 R >> +1797 0 obj +<< /Type /FontDescriptor /FontName /QCVRJJ+LMSans10-Regular /Flags 4 /FontBBox [ -420 -309 1431 1154 ] /Ascent 1154 /CapHeight 694 /Descent -309 /ItalicAngle 0 /StemV 93 /XHeight 444 /FontFile3 1799 0 R /CIDSet 1798 0 R >> endobj -1775 0 obj +1800 0 obj << /Filter /FlateDecode /Length 453 >> stream xÚ}“Mo£0†ïþÞC¤ô@1$¦Š¶¤‘¨¶¢j¯Äž¤–‚òïk{ •ªf‘@<Ì;ã×ãaòë~½‡`vËèZÝAþ\5d2YkÞ× º endstream endobj 200 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QCVRJJ+LMSans10-Regular /DescendantFonts [ 1776 0 R ] /ToUnicode 1775 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /QCVRJJ+LMSans10-Regular /DescendantFonts [ 1801 0 R ] /ToUnicode 1800 0 R >> endobj -1776 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QCVRJJ+LMSans10-Regular /FontDescriptor 1772 0 R /W 1771 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1801 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /QCVRJJ+LMSans10-Regular /FontDescriptor 1797 0 R /W 1796 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1777 0 obj +1802 0 obj [ 27 [ 750 500 ] 34 [ 708 556 ] 41 [ 278 722 444 278 278 764 556 ] 49 [ 681 444 500 778 278 653 306 500 500 785 500 ] 62 [ 750 556 333 361 278 ] 68 [ 306 778 528 625 278 ] 74 [ 917 833 750 556 500 ] 80 [ 778 500 500 681 556 389 389 ] 88 [ 278 778 ] 91 [ 528 ] 95 [ 736 392 556 394 278 500 500 ] 104 [ 722 389 500 500 750 556 ] 112 [ 528 1028 722 750 528 ] 118 [ 528 ] 120 [ 444 500 583 ] 125 [ 556 556 ] 199 [ 778 ] 251 [ 444 ] 280 [ 670 ] 284 [ 500 ] 499 [ 472 472 ] 502 [ 278 ] 612 [ 500 ] ] endobj -1779 0 obj +1804 0 obj << /Filter /FlateDecode /Length 40 >> stream xÚc``0¨¯ÿü~ß¿‹þüzÆ I endstream endobj -1780 0 obj +1805 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 7657 >> stream xÚµz\×Úþ,Ëî`Ce\£3fKŒ{,Ñ(hlQQ°zïm©KY¶œÝ¥÷º°¤Ø{ìJ®M,c‚å&–ÄÄœÁýßvQãýbrï÷ÿ~ß®¿ffgÞ÷9oyž÷ ÀÌÍ1@0ÜÖÁqµƒýÄU«‚]ƒ¦Mìàé-
p
3ž\ÊäFþ47ãÞp´Ç9ks4¶¿°µ¿yÚ;B¤z‰Dïc˜ x ÿif7˜ëî?Šÿi¬Cÿ1Æóú€Y˜al8FcO° @@ -6389,10 +6468,10 @@ IP(*‡K1ÄI(üáïp3M#Ù¶ÄzÓö;Ò"¨Ug‹äLÌAp»”¼Yÿì~ñ°š¥K½Àæ|ÿôâ³aM$ÜÈ ¶ ¹]0Nrkå¥ùóW®œ?ÿÒÊ[·.]ºE¿µoØ ×FY™6‰ÿ»‡Ä0%g#))Ù)“É4ê&—ÄÀIÐR”“•—ϳ¸é&‘yŸ y§Ò„›‡þGÇø,‚ÙzàF™’-Ñ÷(¤¸%ÀÑ/à†(Á—z¸Ho¤ÚŽ’êØï¨ø$¹œæƒC
€ª0¬ÏúòÂy:¿Ww§¥§Éæ,D}í«œö6–ÖTÓpãÐÿù—ŒÏþö… endstream endobj -1778 0 obj -<< /Type /FontDescriptor /FontName /ARSMRO+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 1780 0 R /CIDSet 1779 0 R >> +1803 0 obj +<< /Type /FontDescriptor /FontName /ARSMRO+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 1805 0 R /CIDSet 1804 0 R >> endobj -1781 0 obj +1806 0 obj << /Filter /FlateDecode /Length 708 >> stream xÚ…•Aoâ0…ïùÞ=¤$±c— @@ -6401,21 +6480,21 @@ D‘jªNªA"BuhÔÃD=Aµ„/ªÅÕ’ª<P-‰H'Õ#Dp^,Ap^¡-)T‹ª%Tsø™Ây{ÁzPDä<œH endstream endobj 199 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ARSMRO+LMRoman10-Regular /DescendantFonts [ 1782 0 R ] /ToUnicode 1781 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ARSMRO+LMRoman10-Regular /DescendantFonts [ 1807 0 R ] /ToUnicode 1806 0 R >> endobj -1782 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ARSMRO+LMRoman10-Regular /FontDescriptor 1778 0 R /W 1777 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1807 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ARSMRO+LMRoman10-Regular /FontDescriptor 1803 0 R /W 1802 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1783 0 obj +1808 0 obj [ 27 [ 850 547 ] 35 [ 625 575 ] 42 [ 813 500 ] 47 [ 625 ] 49 [ 738 513 563 ] 54 [ 707 344 563 563 ] 59 [ 563 ] 62 [ 880 625 ] 65 [ 419 313 ] 70 [ 594 676 313 ] 74 [ 1067 938 880 625 563 ] 80 [ 845 563 563 769 625 ] 88 [ 313 ] 96 [ 460 ] 98 [ 444 ] 100 [ 563 563 ] 104 [ 782 438 563 563 865 625 ] 112 [ 594 ] 114 [ 813 850 594 ] 118 [ 594 ] 120 [ 500 563 ] ] endobj -1785 0 obj +1810 0 obj << /Filter /FlateDecode /Length 25 >> stream xÚc``0,¾œ¼ïGÚ?» endstream endobj -1786 0 obj +1811 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 5209 >> stream xÚ•Y XS׶>!$£rÅœzNPQÁáV¥Z8[Z§€ÌS0)ìdž¢ˆšàЫ¨VóðnëPÛz¯}µW®®ƒ›Þïí€÷uºï½ïäœ=¬ý¯õ¯ƒˆ²·§D"‘óÊE{ÏÿÄ}鲕ê(ÿèÉS&ÎUGÚî,”‚+rä„·)a¸Hàì^,µÇóÅ—í{b°åm鸷í·H†S”
²½C@æ8‚üå2ÒÑÍvá'ÇQmG‰(gŠ¥~¤²¬T$û·[N™äé9mž:&Q«œâé9u‚í}¦rî$åbÿÍj6"Lé¨\<I¹l’r¹ZG®†)Ǫ£•A¡þ‘ÁJu°rUŸ2N¤Ñ*C4ê¸í¸IÊU¡aZ¥N‰P’ßš È mP 2.:0H£Œ
R.Xí»J鎎U.
Û
RNœ¨Tjƒ‚”¡±±1ïzxÄÆ…LRkB<‚ÉGdß ‡mÞDï–¯š¸tѼùË}çOŠMˆU«5ÊÀ Xÿ°Hí¤ßžð¿?}¨Z›H‘K½M¤Ü¨ñ”;åAM¦¦PS©w¨éÔj&5‹zŸšM}@Í¥¼©ÔBj1µ„ZJ-£–S>Ô @@ -6439,10 +6518,10 @@ M‚TB\k*PT§¡ÿSªÇsHŽü± ¶Äì_¥¸¹‡–¤ë‘!C¡+&yE •¥š…gfQ;‘7)6yS7åOdb=NC8c¼;© ½’ ¾Ø½»\!³ý`°À:ŽNQÔ{¶§úÓRËŸbØ´»¤LÊ-^éáØ9°öÑ€Æ<c^žÑd,*,½ãèhÉ?V¶ÃT\˜g*Îw(œÚ]/ÿ/1䡹 endstream endobj -1784 0 obj -<< /Type /FontDescriptor /FontName /RIYFEZ+LMRoman12-Bold /Flags 4 /FontBBox [ -476 -289 1577 1137 ] /Ascent 1137 /CapHeight 686 /Descent -289 /ItalicAngle 0 /StemV 104 /XHeight 444 /FontFile3 1786 0 R /CIDSet 1785 0 R >> +1809 0 obj +<< /Type /FontDescriptor /FontName /RIYFEZ+LMRoman12-Bold /Flags 4 /FontBBox [ -476 -289 1577 1137 ] /Ascent 1137 /CapHeight 686 /Descent -289 /ItalicAngle 0 /StemV 104 /XHeight 444 /FontFile3 1811 0 R /CIDSet 1810 0 R >> endobj -1787 0 obj +1812 0 obj << /Filter /FlateDecode /Length 574 >> stream xÚ}”ÛŠâ@†ïó½‚s‘±sì™A!°s@e˜Ý»˜nÝ€é„$^øöÛÝéÀ"+(~Öé¯*+£[&›½ò£GÎ6ªoÎ]©üÅkÑz£Ñ²)ϵÒÛRRÉ«µa]SnÕÀÆ‹|™ëjx0ι.Og©®^÷æêXéo[‡wêËßä¿Ö«ßþÏ×MS:ýys’>·1»j8ßÿ¹1ccwmÌ¥øT]_5ú…œsóÃJËESÛÞzoBúØäªøPiÙ‘H¶·’½ d²*"÷YÖfH6x{éUçúÐxÓ)›lŒ±º‹SüàMÞ;©ºJÙø®Bã±=·íIY5Œ{YƤ:˜Äf6oEØÄ6žKc†Ëý |Gì.b¡ã @@ -6452,21 +6531,21 @@ A±£dš!.!KJ´ÅŽ¢ endstream endobj 198 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RIYFEZ+LMRoman12-Bold /DescendantFonts [ 1788 0 R ] /ToUnicode 1787 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RIYFEZ+LMRoman12-Bold /DescendantFonts [ 1813 0 R ] /ToUnicode 1812 0 R >> endobj -1788 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RIYFEZ+LMRoman12-Bold /FontDescriptor 1784 0 R /W 1783 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1813 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RIYFEZ+LMRoman12-Bold /FontDescriptor 1809 0 R /W 1808 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1789 0 obj +1814 0 obj [ 66 [ 245 ] 77 [ 531 ] 81 [ 514 ] 84 [ 531 ] 105 [ 371 ] ] endobj -1791 0 obj +1816 0 obj << /Filter /FlateDecode /Length 17 >> stream xÚc`€ endstream endobj -1792 0 obj +1817 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 764 >> stream xÚmRkHQ¾ã®NÑÌmµZ›½‰VfûÀ,ìaàc·²Õ6Ý
! @@ -6475,31 +6554,31 @@ J‘j¨íB.Ô¨+S-
¥%—§E…h/ºŠ€(Ð~¥UvFÀ˜ÈšLOéÁúlÙ¹iÖIê¬ä}¢¨ˆÌûUÐÒQâuöÅ5²; KŠóWV¸Wv^wï¥Þ4ºÚÅZ¨¹ÔüÑy‰ùƒbÑÎX4=ÓÝMQ#§»c±Îh´3z6F¥ÿçE:’ endstream endobj -1790 0 obj -<< /Type /FontDescriptor /FontName /BLRUUF+LMSans9-Regular /Flags 4 /FontBBox [ -433 -313 1466 1155 ] /Ascent 1155 /CapHeight 694 /Descent -313 /ItalicAngle 0 /StemV 95 /XHeight 444 /FontFile3 1792 0 R /CIDSet 1791 0 R >> +1815 0 obj +<< /Type /FontDescriptor /FontName /BLRUUF+LMSans9-Regular /Flags 4 /FontBBox [ -433 -313 1466 1155 ] /Ascent 1155 /CapHeight 694 /Descent -313 /ItalicAngle 0 /StemV 95 /XHeight 444 /FontFile3 1817 0 R /CIDSet 1816 0 R >> endobj -1793 0 obj +1818 0 obj << /Filter /FlateDecode /Length 382 >> stream xÚ}R]kÂ0}ϯ¸{ô¡6uº¡”Âü‚‚_X{ÉÕÚ¤¤íƒÿ~Ij†[!¥'÷Ü“sOÚyÙ%ÞW'ô^ûöXªZ3ôfë´ Î\±:GYm9ò¶ZN`§K°‚î,žÇRT=CŽ%ËjŽ-ë9iŠ!{tøåMWûãqéÖI*˱·ÇK¥Ú£¶é ªÌÿå)Âó"8‘OÔ¥PrAŸRj6’ÏTnÇ+‰³~kú,$×7Ÿp²®I0 endstream endobj 197 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /BLRUUF+LMSans9-Regular /DescendantFonts [ 1794 0 R ] /ToUnicode 1793 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /BLRUUF+LMSans9-Regular /DescendantFonts [ 1819 0 R ] /ToUnicode 1818 0 R >> endobj -1794 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /BLRUUF+LMSans9-Regular /FontDescriptor 1790 0 R /W 1789 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1819 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /BLRUUF+LMSans9-Regular /FontDescriptor 1815 0 R /W 1814 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1795 0 obj +1820 0 obj [ 28 [ 514 ] 35 [ 571 ] 43 [ 457 ] 47 [ 571 ] 49 [ 699 457 ] 58 [ 807 514 ] 63 [ 571 ] 65 [ 371 286 ] 70 [ 542 642 286 ] 77 [ 571 ] 81 [ 514 ] 83 [ 699 571 ] 88 [ 286 ] 91 [ 542 ] 96 [ 402 ] 98 [ 405 ] 104 [ 742 400 ] 109 [ 571 ] 112 [ 542 ] 114 [ 742 771 ] 118 [ 542 ] ] endobj -1797 0 obj +1822 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``àL0Ln‰˜°àÈ& endstream endobj -1798 0 obj +1823 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 3483 >> stream xÚ…WTSWº>’ƒB¡rŒ¶9öœŒUŠ¨à£Ž¢3ÖG•J}UÑÁV @@ -6520,10 +6599,10 @@ C„X—2T%±|ÕÚaénhg›ë:êô=¨c¡û¤§x×ڨŦ_°þÌ…úÊî²ÿ#ꂾ¦Õ,¦9à0«à÷ô†7`ü
JÏ¿ÉM ³h&™ ò«ËÌæ¦F¦¤¬ª¦´Ô3f`Ø`£¡ïàõ«Ø/2±‰!ìŸâÎGˆÓqûÿ;)JGiB&Yms'¤›:±’m,6çi$˜¾ àÈ\&[m/tsz->zY.ŽœêºVm7W4—0–ÊÐHÃÀædR‹ñŸ‡5Hqpkºßw7ÔŽK7ðËø endstream endobj -1796 0 obj -<< /Type /FontDescriptor /FontName /MNZPCD+LMRoman9-Regular /Flags 4 /FontBBox [ -443 -292 1454 1128 ] /Ascent 1128 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 95 /XHeight 431 /FontFile3 1798 0 R /CIDSet 1797 0 R >> +1821 0 obj +<< /Type /FontDescriptor /FontName /MNZPCD+LMRoman9-Regular /Flags 4 /FontBBox [ -443 -292 1454 1128 ] /Ascent 1128 /CapHeight 683 /Descent -292 /ItalicAngle 0 /StemV 95 /XHeight 431 /FontFile3 1823 0 R /CIDSet 1822 0 R >> endobj -1799 0 obj +1824 0 obj << /Filter /FlateDecode /Length 492 >> stream xÚ}“Q‹â0…ßû+²‚óÐiZµ)ŒuauDeYö&W7`“’¶þûMrÓXÖ”~Þ{OONoGßöÇøMè3Ä“gJÐêÞpˆËmÕD£ÑJó¾Õí @@ -6531,21 +6610,21 @@ xÚ}“Q‹â0…ßû+²‚óÐiZµ)ŒuauDeYö&W7`“’¶þûMrÓXÖ”~Þ{OONoGßöÇøMè3Ä“gJÐêÞpˆËmÕ endstream endobj 196 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MNZPCD+LMRoman9-Regular /DescendantFonts [ 1800 0 R ] /ToUnicode 1799 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /MNZPCD+LMRoman9-Regular /DescendantFonts [ 1825 0 R ] /ToUnicode 1824 0 R >> endobj -1800 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MNZPCD+LMRoman9-Regular /FontDescriptor 1796 0 R /W 1795 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1825 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /MNZPCD+LMRoman9-Regular /FontDescriptor 1821 0 R /W 1820 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1801 0 obj +1826 0 obj [ 27 [ 893 575 ] 35 [ 657 ] 43 [ 526 ] 96 [ 488 ] 98 [ 467 ] 105 [ 460 ] ] endobj -1803 0 obj +1828 0 obj << /Filter /FlateDecode /Length 18 >> stream xÚc``` endstream endobj -1804 0 obj +1829 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1258 >> stream xÚmTmLSW¾—~Ü"]•^‹Úâ½Gãd-DñƒeNNˆÀƒM)ôR*]‹m¡”XçøÓAQðcê`lR>TÔm€Mó‡[21?Ì–,fºèâ’é{õ¸emÌ–,Ùûã9ç=ç9çÉóüxiJ*¥hšÖäenÉ(HÎÊγd´mÐo±[M‘‹‰Ë°’ã)q)-rQ"/JÉ"¥dZ)}qLÆË÷ÆK«eK)Šn™ÁS±O” áô‘21Òw+“(&Š¢)
¥¥PO©¿h ó‚«
©©k·Ú«=‹¹Ò…V§¦®y-‚ÐÊ4–WÙÝÎ*2ÚL(Ó€²
(ÇîŸZÐJ»
• •Fk²W ¡Õ8‡™öšjç«TPiq"·ÝQ…«C° @@ -6553,32 +6632,32 @@ F§`B56“à@®Jm{7¿ ‰»Ýjöг{q¡U9þL*ð6bÎÓˆ«½<é|ñHÆnþ¤·;Ú¬÷`}]{½®¶XÎnö_ïñMéØ3ƒ¸í&bª-ø¨ÿËàœ|†,—é#¬ÀÈc|)̺ün»À“»Ð¬!ûä0†d*ñvó˜eXœ?¦þâ`=D³ãâ~M_ÞϽãÃÝ}ZØÃü¼õ[bÈ#¦ì®ì»ôeýɶ endstream endobj -1802 0 obj -<< /Type /FontDescriptor /FontName /RMWBFT+LMRoman9-Bold /Flags 4 /FontBBox [ -501 -299 1649 1136 ] /Ascent 1136 /CapHeight 686 /Descent -299 /ItalicAngle 0 /StemV 110 /XHeight 444 /FontFile3 1804 0 R /CIDSet 1803 0 R >> +1827 0 obj +<< /Type /FontDescriptor /FontName /RMWBFT+LMRoman9-Bold /Flags 4 /FontBBox [ -501 -299 1649 1136 ] /Ascent 1136 /CapHeight 686 /Descent -299 /ItalicAngle 0 /StemV 110 /XHeight 444 /FontFile3 1829 0 R /CIDSet 1828 0 R >> endobj -1805 0 obj +1830 0 obj << /Filter /FlateDecode /Length 388 >> stream xÚ}RMkÂ@½ï¯˜=ÄlTEVT+Ú^ãîÄ.˜Ý°Iþûî‡Q(Ò@B^Þ›™÷fÓ{ÙƒW®NŒ‡X«V3VÛ¼"½ÞZ±¶DÙì9òŽ°×Š±þ*]§R4#N%»´;ÕsQ‚g!;ú~‡íW²É‚÷íA•¹œ‰ºð€Ú’L4#ýG†‚g¸Ÿ¨k¡ä¢!¥Ô|x“|¥J¬&áÍ„ÝBH®oádý’h\°æ†Ü“•fC¶øx,SY(²\Bx0dÝè«ó; á‡æ¨…<Cÿ™A#8¶UuAk(‰càX˜¾f/»¼Dmê”V4קñÙµB9y«Lq¬«œ¡ÎåÉÒħ1,7æŠ Jþ‡§¾êTxhÝë¬cØO®mŸ(1}(D±C+‡¦Æ<òÊéØ¡)uhæ9#qèÆÍ=šÄ~´›e]ÚUß7ÂZÍ:Üy¸Ø6°x?²JU¶ÊÝßÍ¢
ùÝèèÖ endstream endobj 195 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RMWBFT+LMRoman9-Bold /DescendantFonts [ 1806 0 R ] /ToUnicode 1805 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RMWBFT+LMRoman9-Bold /DescendantFonts [ 1831 0 R ] /ToUnicode 1830 0 R >> endobj -1806 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RMWBFT+LMRoman9-Bold /FontDescriptor 1802 0 R /W 1801 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1831 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RMWBFT+LMRoman9-Bold /FontDescriptor 1827 0 R /W 1826 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1807 0 obj +1832 0 obj [ 28 [ 515 ] 33 [ 515 ] 47 [ 515 ] 55 [ 515 ] 59 [ 515 ] 66 [ 515 ] 77 [ 515 ] 81 [ 515 ] 84 [ 515 ] 88 [ 515 ] 96 [ 515 ] 105 [ 515 ] 114 [ 515 ] 118 [ 515 ] ] endobj -1809 0 obj +1834 0 obj << /Filter /FlateDecode /Length 23 >> stream xÚc``àp`dP`ñhhpP D) endstream endobj -1810 0 obj +1835 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1845 >> stream xÚuV}TWŸ!É@5ÊšiZ©3£K- ˆ_EÛAE¥ž%1„L˜BD<u¡¼ @@ -6593,78 +6672,76 @@ oŒRWƒÉ§Ç<ï§|âÂ Æ ‡ùP"‚{än£ËPÂq%e}åGÜ®þ©”Â(ï¼WÈ—N˜)QuoY—U–O&¿˜Pn^ g÷žÇ4úÊ8Ô‚û¼ÁE>*Ó`¨ÜzŠK@E%µ¡1«Î¬xŒºhàÒà@á,ý+ñ&p–³•Š_(½›ÈN(/è?=ûuÿ0Ý•ÂLïªDB½0O>`ôåRì±ñ’F¢¾o§§n0Äkmè(V”Ô×®·Ò–ä×
ÖF"ò’3Dg¿Ï·Ñïûñö^à¢?@·%ºÖî§âxSÛEÝþV÷ûÍý!6¶ËÎúMÈ:GÓž·`xý¼#qõNfª‚Ó4¼ áe'¯Ö_%#…ÚÁÀõl|ZQ“åñ»žúýuýJØæœeŠq?ôHÒR@8(«f©½u\Þoí!d¦¹¹u8iwîì6sÕ;ÌÚÁí£YpoÊÛši¸PÐHú&N¥gúŸ
¿Òy¾«[â”Èj;„¤ørg³ RsJc¤Oét~šwú@û[“Ífk¶9ìR©ÛéúýMíÒÿ®ÌÞÀ endstream endobj -1808 0 obj -<< /Type /FontDescriptor /FontName /CKBVSC+LMMono12-Regular /Flags 4 /FontBBox [ -444 -311 715 1019 ] /Ascent 1019 /CapHeight 611 /Descent -311 /ItalicAngle 0 /StemV 172 /XHeight 431 /FontFile3 1810 0 R /CIDSet 1809 0 R >> +1833 0 obj +<< /Type /FontDescriptor /FontName /CKBVSC+LMMono12-Regular /Flags 4 /FontBBox [ -444 -311 715 1019 ] /Ascent 1019 /CapHeight 611 /Descent -311 /ItalicAngle 0 /StemV 172 /XHeight 431 /FontFile3 1835 0 R /CIDSet 1834 0 R >> endobj -1811 0 obj +1836 0 obj << /Filter /FlateDecode /Length 428 >> stream xÚ}’]Oƒ0†ïû+êŽ`Dpf!qÌ%D§f,Æ[ÖžÍ&£%.öïm{†&F%ðpÞóõÒÉÅkܽƒàzÊè:=A±®[2™,5Pý3€ endstream endobj 194 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /CKBVSC+LMMono12-Regular /DescendantFonts [ 1812 0 R ] /ToUnicode 1811 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /CKBVSC+LMMono12-Regular /DescendantFonts [ 1837 0 R ] /ToUnicode 1836 0 R >> endobj -1812 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 1808 0 R /W 1807 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1837 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /CKBVSC+LMMono12-Regular /FontDescriptor 1833 0 R /W 1832 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1813 0 obj -[ 28 [ 490 ] 35 [ 544 ] 45 [ 272 ] 50 [ 435 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 75 [ 816 734 544 490 ] 81 [ 490 ] 83 [ 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 ] 107 [ 490 ] 112 [ 517 ] 118 [ 517 ] 121 [ 490 ] ] +1838 0 obj +[ 28 [ 490 ] 35 [ 544 ] 43 [ 435 ] 45 [ 272 748 ] 50 [ 435 ] 54 [ 639 ] 59 [ 490 ] 66 [ 272 ] 75 [ 816 ] 77 [ 544 490 ] 83 [ 666 ] 88 [ 272 ] 96 [ 381 ] 105 [ 381 ] 107 [ 490 ] 118 [ 517 ] 121 [ 490 ] ] endobj -1815 0 obj +1840 0 obj << /Filter /FlateDecode /Length 24 >> stream -xÚc``à`QPhhhr +xÚc``àSPhh`r endstream endobj -1816 0 obj -<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2572 >> -stream -xÚV{TWŸ’ÁŠ©fœ.fìÌ`§‚<Ô*}(´j1àŠàƒ1HxH˜@T„ -"Bf#$òù»MÉEŠ_‚]òj„6;_—‘–n ‡„,Yè_§ÃƒèHÕöLIŸ™A«˜:2ˆŽ -¢£µ&a6ƒ~EËÐÉêt•&•Ö¦Ò±êÍ´Q¯Öéé4Ö˜_DǦgèi“V—IOZ£VéÕ)´‘IQëhCºš^·!–^¥e´2c»šÑ«éÀ@šÖ«ÕtºÁýFp°Á˜¤Õ¥§ -6ú`Í3#}°g]àªuѱÊw#Þ‰ÞðN!Ï@§jutŠÚ ÊÐèƒþã'šˆÖê²Tš•)Údõ»)jÆaÈG„6y D#Ë7‘pd-¢D¢hd=²ÙŒlC2L$ÉEòÅBÃÜC°R)š*Š
MyI,gyx’I¤3¤…ÒVt&š„Þð^îý‡©ëùÈ,ìž\XåèûÌ$ï˜<2êÄÚ8æ+üœq£/)Pƒ3HžƒIä¡ôMIÄëʸHÆQÐÑÙÒÒ9”vSG;Nµï_T/¢¶£|byXèr¶â?é.ýþÄà)‰¹ª¦#Ú/4}Fñ¡§ñá;¶Å'÷‚¾pù¾>){ÅÜÆ·ÁŒA¹{\QŽBû(–ÎÙ¡‡Xà#^› Seð&Š
ðT‘„A?®+§&:ѾIjÇ1õU¢' N…UâkÌ*}©1m×l!âÒ{];©=í ºE“QlU+°56“}ÇÙa¢ç‡B>–’M¢üŠ\7!‚mb¸©¿œ;Âäs²Æžµö²ªÊ -ô½÷•¥Ø,ôUë¾> -Úî£ã
;B)'l6JCÍ;É%°AzØV{œ„3¥p»‘÷k¢d¼ªÆ}ôÇvhk—»†w_‡×Á°y8m›µ‚Órþxk;}SJæî²#+}¿šX´fõò˜ÞÔ†b -{XT¸;ŸIQ¬ïÕÕYÈÄ=‰i›«ÆcàópÚ·gnw•^\wìÞ¼,%¢K#Ÿ27;Ú-5-
M¤æä h$¾¾öñWIæ!jpà$°Õv`¦°¥+Ìes‘¢ ¡°¹®Õî$ùåü<$ïÌ&™¼,s.±<îhC-.Šuô4´Ø•¢û`¾‚Èäsøo‚‡Ï×Ùú»É&g=¸A܃ðª' - -*ÑÀm8D0 5Äkªu)»¨;qN%á¯~ÍTBU|/ž}¶…óŸïüiÝg›`Ïk7Å¢kÁ -F£?\?wùrÓæh’/üŸeß -Y‡@òÑN8"ÄùÅ»ï?€¡Ää,ø„ÿ}ž ù¯Ò÷Ï´eLÈüž1`í¤XQÞp„‚økNýÛÝÇTÐ*ÀKùP’§`×3u—Âe€—lû±Ø&D_Nˆ¡rwÚuŒÉ ËêÊëp9ÛÝ‚žvsm°Õò¿\)»{è.6þ•Ãðžl÷¶eLpÞ^²Š¥Ë+þ[ˆÝ šçúX;„c¥&)nm„o:1øÍ:¨¨&KÊvíÍV0EÍmmû]L`•&ù÷#F'œãÄ~€wáü¼1`T)«Áƒ†~,ï'$–n”V¦„”{›PìæüA)/¾e8såðåOIø>‡V><~çß~+å”ð-Ü(-ßYkÞå]\²>Jêê¸tµ»Ó{ -BúÜéo
¹#„Õ{õ+K7UíݹóÚb+¨('?vœ}„øâôÛÁËâWƬ¥ø|®DωP/oÌåBXQ+gsn¾§F™ !^· µÚ³ŠÅÂQTH¾Ì7ò^°Wbiª -ÿÚð¾·É°ëúÓÄ—œ¾ÀR}·m.(Âöák@X‘ Sò”yéDfd+åQE¿£7càVóEòZˇýKÔþðÖj…ÌsSžÁ>ó…û.ò¦çî›$Ïmç"@mC]»”ŒŒÕûL>ÓØçF¦9*möÊÊšêJÛ৫ÉVc¯²Ùªkª}¦s{f=ùþOãÄ7þ +1841 0 obj +<< /Subtype /CIDFontType0C /Filter /FlateDecode /Length 2448 >> +stream +xÚV{TWŸ’ÁÓ–!]ÌØ™ÑZby¨UZÚŸ°"Tåø +$<ȃ +ÒO„qB£ðG<?éñžÇô±‰Ý—Ë£_<?¸c‡GìD§úVrQ¿Ôæ*Áùz +†âƒ wWu,qgÝ.òmYt˜ÊšÛÜÒÐÐÒ— +G+2`ô$†6ñá–bÉÕŒ…*SŸžfÕwÔ¬®¬¢ÊË- +„pQÍxc;ùSšTF‹‹Ï¸6ÎúFÙá\»×=n‚Û)I‡ZÁ”ã‹Úþe‘ÐÒò-è ;Ç™¥ÙTüMó¡.ZÆñ‰Ú=´Ñ{|©%°VøÌ0ø²ÎeßG³ëœ±•Û`ô…?Ú ÅæéȹC¯ƒã@ +·´÷–<x˜? ïÍÜ#I‡ÖªUgèÓÒíú¶kK%†+‘;Î9î ±açÚ^bbìéNÛ4 £”†2üh×£zTÛ«’È·ä{é;¹Ñvé£|ËPH—>?<‡ð¬‚QË/ÚA;ÉsÍâòÀiFàO®_¼zµnk…òþ'FñüÿOÜä÷¿±Nþÿ°Š3Ý£š¾h‚Ã-¼¾QX<Êç¢à¨Ú‘ûµ%ÈÍÇy#ï‹þr«{ðlµGùsb6jß/ïÔPUÂjsWÕ ©=Çšž¾7;=üŒüø2œgÂT*ð¾$P¹p‰,í¬µ€ÚÛ
úOK/‚þ¶>ÊÑè`ÉKì6]-Ý–åHÅÍN7œlÃÏÊG`à>9“dÒg‘ºÿë~⬾QgntŒsÍðÐ’Ú44ÁßãpÚOwÑ~¯È¢@ +Ñ°õyýMá2€»Ÿ¥ã$ï›I>”
H:›FeÐiR[3›v[;%FõN4×z]AùÛPñÝcw /ø#GH:ÒÚw/Sùgî§J!_H°Húß‚Ð~ÁÙ7€¹Ù¢È $ÂBÌa>ÙûÝ( +‹÷îO“ªšó45v¸t휔…2ƒçãa½Î²Oà]ø’ä’> +UÉkÁƒ +‡³Y4Û™D¢^Xê›°0 ÄÀ7ï¡£BÄ¿¥;?tüꗔ܀?O@ë90qgLÄEœ¾+ÑK²£Œ{= +Š"A*‰Â…Žæ+Ÿ¶µx?;/æ⹤¸ƒ<ÇÚùK·žå¶¶úcí™Vu”–PŸ[?&ï[å¿,feäíD-ÇÃÅÎ+fCF÷·iDÅzZoƒÛ°ú6áÉ™¸y7«rA2dq:ë„ù€.KZ`6©×Q¥€˜‹ø°U°¿T)ÕÖ š(§@zP“>.Ë5¦”Ã4\0å¶k60ÎLÍNSî$S2
:+:¥-™‡³(¢>;èRžˆ?±o`¨†+¹å‚kŽË¬¤d<
1ðúF`͈+³oJÆL_'ŒPc±¡örÓ*Õ[ñ´ZfG˜Ô§:¤kÜs]{Žüæ̹Ë,ÝuÛòð²4ødÎwV[¦,3‘Lk„¼L:ÿ`äé(¸uäêZÃÙ£’Ý—uKôáHðîZ©Ø5œ¾Ä‘¢yÎ{Ç5nÞðÌ°q¡õP][cRaQ)þ¢i@4}axºµÌRYVVUQfé‰ìŽ:KUe¹ÅRQU!šÁíózú;É?CÒúm endstream endobj -1814 0 obj -<< /Type /FontDescriptor /FontName /AWLLKQ+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 1816 0 R /CIDSet 1815 0 R >> +1839 0 obj +<< /Type /FontDescriptor /FontName /ZEJYLD+LMRoman12-Regular /Flags 4 /FontBBox [ -422 -280 1394 1127 ] /Ascent 1127 /CapHeight 683 /Descent -280 /ItalicAngle 0 /StemV 91 /XHeight 431 /FontFile3 1841 0 R /CIDSet 1840 0 R >> endobj -1817 0 obj -<< /Filter /FlateDecode /Length 460 >> +1842 0 obj +<< /Filter /FlateDecode /Length 456 >> stream -xÚ…“Ooâ0ÅïþÞ=¤qHÚ -EjHÑÒ?hw¯ÁXKÄŽœäÀ·_Û“P©Z´H üxo<Ïcgòíc<}€ ¹gtî
‡ x2™,5ïkPÝ€ -®7®Ñ«ò_UÇ7ÇÑûšü¢J +xÚ…“Okã0ÅïúÚC =¸–íÄÞ–`hí\ú$,»½9Ò$Ä’‘íC¾ýJ»…²a ùå½™yɳoÛàNè=É5£èô`8ÅsÝ’Ù¬Ô|h@õ/ +>ïX«[WåßþrNÏŠ£×ò¥åg endstream endobj 193 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /AWLLKQ+LMRoman12-Regular /DescendantFonts [ 1818 0 R ] /ToUnicode 1817 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /ZEJYLD+LMRoman12-Regular /DescendantFonts [ 1843 0 R ] /ToUnicode 1842 0 R >> endobj -1818 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /AWLLKQ+LMRoman12-Regular /FontDescriptor 1814 0 R /W 1813 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1843 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /ZEJYLD+LMRoman12-Regular /FontDescriptor 1839 0 R /W 1838 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1819 0 obj +1844 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj -1820 0 obj +1845 0 obj [ 66 [ 223 ] 77 [ 484 ] 81 [ 470 ] 84 [ 484 ] 105 [ 340 ] ] endobj -1822 0 obj +1847 0 obj << /Filter /FlateDecode /Length 17 >> stream xÚc`€ endstream endobj -1823 0 obj +1848 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 759 >> stream xÚuR]HQ¾×uM'×´Ý$uö&JîìfšôâØZù³¦n¡c;îŽN;23»«E˜ýàƒÙöPaPQ½(ê*YØßFB>ô¢XD܉1h†è%è»ðÝû{¾{¸‡A @@ -6673,10 +6750,10 @@ xÚuR]HQ¾×uM'×´Ý$uö&JîìfšôâØZù³¦n¡c;îŽN;23»«E˜ýàƒÙöPaPQ½(ê*YØßFB>ô¢ Û'5;¶îÕ¬{ßk—-MW<sÏžŒŒ>¢ÒyÎPsÈ-úT‚2LDf_Le†qgìF,™ªñ .rÍ endstream endobj -1821 0 obj -<< /Type /FontDescriptor /FontName /BTPEXR+LMSans17-Regular /Flags 4 /FontBBox [ -395 -305 1355 1159 ] /Ascent 1159 /CapHeight 694 /Descent -305 /ItalicAngle 0 /StemV 87 /XHeight 431 /FontFile3 1823 0 R /CIDSet 1822 0 R >> +1846 0 obj +<< /Type /FontDescriptor /FontName /BTPEXR+LMSans17-Regular /Flags 4 /FontBBox [ -395 -305 1355 1159 ] /Ascent 1159 /CapHeight 694 /Descent -305 /ItalicAngle 0 /StemV 87 /XHeight 431 /FontFile3 1848 0 R /CIDSet 1847 0 R >> endobj -1824 0 obj +1849 0 obj << /Filter /FlateDecode /Length 383 >> stream xÚ}R]kÂ0}ϯ¸{ô¡6u:™”Âü‚ÂüÀ–ákMn]À&%mü÷KR«0æ @@ -6685,21 +6762,21 @@ Oªàd¾PWBÉCJ©ÙXI¾P…°"þÍ%øï\H®oVád“`\°ú†Ü›&*Ûœ\«‹X抄!øædQÕúê\ˆ¿Óµgè?ñh endstream endobj 191 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /BTPEXR+LMSans17-Regular /DescendantFonts [ 1825 0 R ] /ToUnicode 1824 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /BTPEXR+LMSans17-Regular /DescendantFonts [ 1850 0 R ] /ToUnicode 1849 0 R >> endobj -1825 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /BTPEXR+LMSans17-Regular /FontDescriptor 1821 0 R /W 1820 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1850 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /BTPEXR+LMSans17-Regular /FontDescriptor 1846 0 R /W 1845 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1826 0 obj +1851 0 obj [ 28 [ 459 ] 43 [ 406 ] 50 [ 406 ] 59 [ 459 ] 63 [ 511 ] 70 [ 485 ] 84 [ 511 ] 104 [ 668 ] ] endobj -1828 0 obj +1853 0 obj << /Filter /FlateDecode /Length 20 >> stream xÚc``à`PdR
endstream endobj -1829 0 obj +1854 0 obj << /Subtype /CIDFontType0C /Filter /FlateDecode /Length 1482 >> stream xÚ}UkPWÞ@’Eh³Æ²¸{u¨¨HÀרԱTä¡BЊm!%‰$,y` @@ -6711,10 +6788,10 @@ xÚ}UkPWÞ@’Eh³Æ²¸{u¨¨HÀרԱTä¡BЊm!%‰$,y` ‚6Ša¨†VŠ<4º¢âÀQ’B;˜·“À@U]ãÆaxs.ÕHú~ƒé,.™Ë?êÈ2ß-ÝÑ®i€t]S‹˜X§ÔGH&1’)žÉî)ÍUUU5UGmõÑz‰Äín¨vÔÖ8NgdêŸ{0¼¬ endstream endobj -1827 0 obj -<< /Type /FontDescriptor /FontName /RKQUSG+LMRoman17-Regular /Flags 4 /FontBBox [ -400 -286 1338 1125 ] /Ascent 1125 /CapHeight 683 /Descent -286 /ItalicAngle 0 /StemV 83 /XHeight 431 /FontFile3 1829 0 R /CIDSet 1828 0 R >> +1852 0 obj +<< /Type /FontDescriptor /FontName /RKQUSG+LMRoman17-Regular /Flags 4 /FontBBox [ -400 -286 1338 1125 ] /Ascent 1125 /CapHeight 683 /Descent -286 /ItalicAngle 0 /StemV 83 /XHeight 431 /FontFile3 1854 0 R /CIDSet 1853 0 R >> endobj -1830 0 obj +1855 0 obj << /Filter /FlateDecode /Length 401 >> stream xÚ…’_OÂ0Åßû)®$ø0Ö @@ -6723,12 +6800,12 @@ ag=’ë“[Ø[ï$¬9‘û²Ò¤e›ÓcÝ`™È\‘ÙB³²¨}t¾¯I¸Öµô/™4¢´ªZC@IÇÜÌmrzÍJ„Ð&pS endstream endobj 190 0 obj -<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RKQUSG+LMRoman17-Regular /DescendantFonts [ 1831 0 R ] /ToUnicode 1830 0 R >> +<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /RKQUSG+LMRoman17-Regular /DescendantFonts [ 1856 0 R ] /ToUnicode 1855 0 R >> endobj -1831 0 obj -<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RKQUSG+LMRoman17-Regular /FontDescriptor 1827 0 R /W 1826 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> +1856 0 obj +<< /Type /Font /Subtype /CIDFontType0 /BaseFont /RKQUSG+LMRoman17-Regular /FontDescriptor 1852 0 R /W 1851 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj -1833 0 obj +1858 0 obj << /Length1 1401 /Length2 5895 /Length3 0 /Filter /FlateDecode /Length 6849 >> stream xÚtTSí²6EAB“Ò‚tHèMzïB”^Ò€P¡¤H“"½£€"UDš¨t¤i‚ M:Š Â~~çœïüÿZ÷®¬µ³ß™gfÞgfžÍÏcf!¦ŽÀÀ:4N,RjC `’$üüÎù·À‰õAaЊÿÐÄ"¡8‚MŠ# @@ -6754,10 +6831,10 @@ l/©Ð:diA®xmÄ·iQØâìÓ³gw¢m*˜Î“C7Ë‹HÕ<KÈðå ŒÙ!ðÄO
^v1|kú?Ncpv¢ßt.:¼ï>jsMg€}fh Aü>Egiû÷(¼ oJÔ*ùh!¨cÎVBÔ”L4·Ÿi§3$éñ?ªhA2 endstream endobj -1832 0 obj -<< /Type /FontDescriptor /FontName /DGBCZV+CMTT10 /Flags 4 /FontBBox [ -4 -233 537 696 ] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet( /visiblespace) /FontFile 1833 0 R >> +1857 0 obj +<< /Type /FontDescriptor /FontName /DGBCZV+CMTT10 /Flags 4 /FontBBox [ -4 -233 537 696 ] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet( /visiblespace) /FontFile 1858 0 R >> endobj -1835 0 obj +1860 0 obj << /Length1 1776 /Length2 2308 /Length3 0 /Filter /FlateDecode /Length 3418 >> stream xÚµUy<TëÿKiZ¤Õšƒ0-cû’²ŒdKv¢:fΘÃÌ9š9à ¢(¡Ò-JneI @@ -6770,10 +6847,10 @@ xÚµUy<TëÿKiZ¤Õšƒ0-cû’²ŒdKv¢:fΘÃÌ9š9à ¢(¡Ò-JneI »–ËÂÊ™ï%¸”þ.@C\–¯*[ð±÷ØÝ“óÒŽ¸^X“µL '—ä&}¶ÆA÷½A§·Ï!ök‹ÊÄÊê7>|¾ÿHnÈì„סÁ^öÕ5Qšé>;º_œì>7.¯·ê¦“z¦¨p»ºØôÄTÕŠK9’9£žÚÝ¡ûÔenÍwÕ»_’¡ñ{ËN ·A™Þ{´Kt~M'ÄyGb™ãÕl¨ÞO,ª’¶½,×½ájÊ-&Ð’I×m:øR%Ç¥º‚r0åF굄”„Í~7›à'ñKæ\8zõíÿ¢CÎ^ endstream endobj -1834 0 obj -<< /Type /FontDescriptor /FontName /RCORWO+LMMathItalic10-Regular /Flags 4 /FontBBox [ -32 -250 1048 750 ] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 60 /XHeight 431 /CharSet( /arrowhookleft /greater /n /pi /slash /x) /FontFile 1835 0 R >> +1859 0 obj +<< /Type /FontDescriptor /FontName /RCORWO+LMMathItalic10-Regular /Flags 4 /FontBBox [ -32 -250 1048 750 ] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 60 /XHeight 431 /CharSet( /arrowhookleft /greater /n /pi /slash /x) /FontFile 1860 0 R >> endobj -1837 0 obj +1862 0 obj << /Length1 1674 /Length2 1333 /Length3 0 /Filter /FlateDecode /Length 2358 >> stream xÚµTiX×¾¶—Xm«BQ`0¢ÙXD š†$ [DHkeHNÈH2f&À V/J‹Ü¢R©â‚U¹ ¨¸qHÕ*®lŠ¬ˆˆ¶.Upí™ U¹½?ï3Ofr¾õ=ïy¿ÃË—jÉB_,‚Ȩ(ŒÑ‡1˜×øóc`¢Ù€Q@,ð‰8\®Œ‚ƒ“„c` Odô šhL€@!.…¤_Ò@d0Uš Š³-¢Išá'`4rC"'à8”"#Miž¨gØ>|>[‰Í€pL“D¦ÒI8À-D €’LEFðH$@=fÐRT0¨c1± 4fš::vœ @@ -6785,10 +6862,10 @@ kmé;ƒgä†ë¦FÓ9ý<ô;îÛ93ö`0¾;÷mÉ–Eù‹ßµÄO¨jŠt¹Î2j[󮋵E|·»‘ÖZÇË#M{Ÿ>J²s½äu -~ö‹ŽÕëy¢#œNÊyT‘ï[”wAâåqošÆ±¤Ø%¾#eµuü˜
1{›=ÆØåÓ«?‘¤\jÝtÁy}Qµ=—wøhe×´ÖoÛË“ä~¾þÓ·o^°œË•ÜéÌ™Ó} 䔿îé“—}¶Õо¨bž‚Oá Ÿ•…îKS+ä•Ón¹•u°~süÎ)§ãR㮚‚ÃóÊg=]ÚºËéOÝÇ„ endstream endobj -1836 0 obj -<< /Type /FontDescriptor /FontName /TTQMLC+LMMathItalic7-Regular /Flags 4 /FontBBox [ -1 -250 1171 750 ] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet( /pi) /FontFile 1837 0 R >> +1861 0 obj +<< /Type /FontDescriptor /FontName /TTQMLC+LMMathItalic7-Regular /Flags 4 /FontBBox [ -1 -250 1171 750 ] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet( /pi) /FontFile 1862 0 R >> endobj -1839 0 obj +1864 0 obj << /Length1 1846 /Length2 22110 /Length3 0 /Filter /FlateDecode /Length 23294 >> stream xÚ´¸sxœíó>7j¬†Û¶mÛÙ8«±“ƶƶ7Nã¤ac7~Óçùøûû÷=öXÌ9¼ç:göÞ%'VR¥6³7J؃\虘x @@ -6884,10 +6961,10 @@ cˆdw$ûÈÞwä(ßÍ<c‚|‹Ðõ Z§_rRIÅýo}[GÚe¿AûX¯PñýzëÑ Î¼Ë~ÜáÇm–ÏÑ™,¾E&‹kd&W V—h‰˜Ô¸h7Sg5T%€ÂõdÔнxÙtP2{zïvòÞ5ìØè%Û| wÁÔµn.²;¿çòZƒ]IJ´Yõ´ß“%˜güŒ‰w;Åd›6Btšö‡K4¿¥B7Çn3Û³™Aèo-Në™3Kˆ=QÀÒç7–OëJø´tÚæ&
¦§@Gâ±,žúmÜ‚7i'‚£Ñ5)Ó>™·é`ט ]±Ã®qp#é—
E«zh!éEKÞm¦ÈI%Z“ þ9~`Gë5çéª[VÒŽ¿IÊè¹–ôãu}·ÛÏþœÿIbÜl/ÕYA±dK>@óuº¤¦T%sÊÎ
¼úš–ø+ßRøý¿‘+„u
5ÞkEM¹ endstream endobj -1838 0 obj -<< /Type /FontDescriptor /FontName /DDAMXW+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 689 /CapHeight 689 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet( /a /c /equal /four /n /one /parenleft /parenright /plus /r /t /two /zero) /FontFile 1839 0 R >> +1863 0 obj +<< /Type /FontDescriptor /FontName /DDAMXW+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 689 /CapHeight 689 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet( /a /c /equal /four /n /one /parenleft /parenright /plus /r /t /two /zero) /FontFile 1864 0 R >> endobj -1841 0 obj +1866 0 obj << /Length1 1637 /Length2 12903 /Length3 0 /Filter /FlateDecode /Length 13952 >> stream xÚµºuT›ßº-Œ»»ÜŠC)Š»»K€àNpw‡â®-îîPŠkq(î®Å>úÛçÜsö¾÷ßod$oÖ£ók>k$#¡¡PRe6µ7IØÛ™ÙYØø @@ -6951,10 +7028,10 @@ bh‰Dù5ñäé£dÈ—yžžÚsµßœµÓ‘ƒŽqêr߸‰Fæ{ç˜ôGœòö3'±óHÆ—ÐPë=7LíJg2ï8("?ð÷/ ú¿¢aýÊ›ˆðàŒ‰Íýµj¥(l{V冢©WËá÷m¥@ŽC¡è›zX•\ï‡Ð´H©éKЇiõGË=«µl܆¼‡T¬ªB¼öÁglýqJ('”ŠAa$Mþ¼òCÿÖúXkFKy?¬+ó¦Çmhió¯³]òý³6“8266‡¹‡ÿ!ÍSþ endstream endobj -1840 0 obj -<< /Type /FontDescriptor /FontName /SDXHST+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 689 /CapHeight 689 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet( /two) /FontFile 1841 0 R >> +1865 0 obj +<< /Type /FontDescriptor /FontName /SDXHST+LMRoman7-Regular /Flags 4 /FontBBox [ -483 -292 1562 1124 ] /Ascent 689 /CapHeight 689 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet( /two) /FontFile 1866 0 R >> endobj -1843 0 obj +1868 0 obj << /Length1 1721 /Length2 1854 /Length3 0 /Filter /FlateDecode /Length 2912 >> stream xÚµTy<Tk¯5©,…ˆžDˆÙ¬Mrk¬Y™9f3猙3%[Š @@ -6969,10 +7046,10 @@ GnFˆÜÕ.ï—~L“>WÜ{ïʸð—ºú§¾)sõŠo
Ì‚;øþñ8ß*½
§;®» 9^Ò¿m<{)öXWT ×È4nvLÙú Û¼¢YÁé“_‹ûˆ„®¼¤*“ˆzéèj0Òr°×lGÌ€²L,e']õÉ¿è;!ÕüÌ‘2ödì/é5it¾ÅˆzšóžÑí2íYYw<]¹×zÔdºû½%¼ðRˆ´æ㯷>xê÷T2Û˜Iõ}Q6$6p¬òLñPF~Þß’úNñµýyj) CµómµuU—ÕÄ"'7”P7™A6¬àˆvÏöÒO^!Ó_5wšåc´ŒÑwi¿±§µü9½‘Õa½\s‚ÂànÒ
k“¾ÍŠ¡Ç'fÔgŠ™[óRÞnØÍžX¨›mϳ=°=½"sã0×Å<¦%U‡Ó5AõõÐœ–ù;2_:Ö›®^úgóÄuE‹4îûhŽ6zü’êWtöÂ$“´‘0—3Ýû´÷65zæq#ïÙþüÐ˚ɿ6qŽÝ[óùDjcÈ…¼à“¨.¼}=Í¥6—ÛýÇE‹'¦½·Gÿ~¾ÏÇX˜Z.ò^MÚþ棵ûûíEõU ÚT9C|èØ !눑ý£€Ñ┧f9FÎ<úò
oºÛÍTò›Kío:h('èð•ÅçˆRw½Õ“4csPyåó%Sï)4Rý<¡Þw®œ^*ñkpŒu¯i™/R[üö´Z±BËýg§àó»wk¤î{€´þ1;-ùS·š©OÐ_W¶õ7š¯Š¶ÕL,÷I¦þM{oßoßo“7¥¢¬4écú-ÏeMüŸ:ÿ>PTXÎL˜’åý{`>ŸŽÔüëñ~ÍÖÑȆšEVêûl#Ž¤ÊÝ^
Á¤ÿöãÄ endstream endobj -1842 0 obj -<< /Type /FontDescriptor /FontName /NDZRTZ+LMMathSymbols10-Regular /Flags 4 /FontBBox [ -29 -960 1116 775 ] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet( /arrowright /asteriskmath) /FontFile 1843 0 R >> +1867 0 obj +<< /Type /FontDescriptor /FontName /NDZRTZ+LMMathSymbols10-Regular /Flags 4 /FontBBox [ -29 -960 1116 775 ] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet( /arrowright /asteriskmath) /FontFile 1868 0 R >> endobj -1845 0 obj +1870 0 obj << /Length1 1689 /Length2 1347 /Length3 0 /Filter /FlateDecode /Length 2378 >> stream xÚµTyT×v5µîR @@ -6989,62 +7066,62 @@ cÊÒk©¥G<<[$…[æn›t©à`ÎÁ1@Yó‡(èÐÑÎu¾µ/†=Êó˜_z°á;ëÖ+ª‘”q¸íÚP—î×.îͼ處‰Ÿ ¶zÂÿòÔFåŸÆÛy¦«õ£rÝ®,º×БÝÒ9÷võBG/ý§ëNrþáÍÁ endstream endobj -1844 0 obj -<< /Type /FontDescriptor /FontName /DTFCKV+LMMathSymbols6-Regular /Flags 4 /FontBBox [ -4 -948 1329 786 ] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 52 /XHeight 431 /CharSet( /asteriskmath) /FontFile 1845 0 R >> +1869 0 obj +<< /Type /FontDescriptor /FontName /DTFCKV+LMMathSymbols6-Regular /Flags 4 /FontBBox [ -4 -948 1329 786 ] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 52 /XHeight 431 /CharSet( /asteriskmath) /FontFile 1870 0 R >> endobj -1743 0 obj +1768 0 obj << /Type /Encoding /Differences [ 25 /pi 44 /arrowhookleft 61 /slash /greater 110 /n 120 /x ] >> endobj -1739 0 obj +1764 0 obj << /Type /Encoding /Differences [ 3 /asteriskmath 33 /arrowright ] >> endobj -1741 0 obj +1766 0 obj << /Type /Encoding /Differences [ 40 /parenleft /parenright 43 /plus 48 /zero /one /two 52 /four 61 /equal 97 /a 99 /c 110 /n 114 /r 116 /t ] >> endobj -352 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /DGBCZV+CMTT10 /FontDescriptor 1832 0 R /FirstChar 32 /LastChar 32 /Widths 1648 0 R >> +353 0 obj +<< /Type /Font /Subtype /Type1 /BaseFont /DGBCZV+CMTT10 /FontDescriptor 1857 0 R /FirstChar 32 /LastChar 32 /Widths 1673 0 R >> endobj 206 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /RCORWO+LMMathItalic10-Regular /FontDescriptor 1834 0 R /FirstChar 25 /LastChar 120 /Widths 1745 0 R /Encoding 1743 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /RCORWO+LMMathItalic10-Regular /FontDescriptor 1859 0 R /FirstChar 25 /LastChar 120 /Widths 1770 0 R /Encoding 1768 0 R >> endobj 207 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /TTQMLC+LMMathItalic7-Regular /FontDescriptor 1836 0 R /FirstChar 25 /LastChar 25 /Widths 1744 0 R /Encoding 1743 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /TTQMLC+LMMathItalic7-Regular /FontDescriptor 1861 0 R /FirstChar 25 /LastChar 25 /Widths 1769 0 R /Encoding 1768 0 R >> endobj 192 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /NDZRTZ+LMMathSymbols10-Regular /FontDescriptor 1842 0 R /FirstChar 3 /LastChar 33 /Widths 1819 0 R /Encoding 1739 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /NDZRTZ+LMMathSymbols10-Regular /FontDescriptor 1867 0 R /FirstChar 3 /LastChar 33 /Widths 1844 0 R /Encoding 1764 0 R >> endobj 209 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /DTFCKV+LMMathSymbols6-Regular /FontDescriptor 1844 0 R /FirstChar 3 /LastChar 3 /Widths 1740 0 R /Encoding 1739 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /DTFCKV+LMMathSymbols6-Regular /FontDescriptor 1869 0 R /FirstChar 3 /LastChar 3 /Widths 1765 0 R /Encoding 1764 0 R >> endobj 205 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /DDAMXW+LMRoman10-Regular /FontDescriptor 1838 0 R /FirstChar 40 /LastChar 116 /Widths 1746 0 R /Encoding 1741 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /DDAMXW+LMRoman10-Regular /FontDescriptor 1863 0 R /FirstChar 40 /LastChar 116 /Widths 1771 0 R /Encoding 1766 0 R >> endobj 208 0 obj -<< /Type /Font /Subtype /Type1 /BaseFont /SDXHST+LMRoman7-Regular /FontDescriptor 1840 0 R /FirstChar 50 /LastChar 50 /Widths 1742 0 R /Encoding 1741 0 R >> +<< /Type /Font /Subtype /Type1 /BaseFont /SDXHST+LMRoman7-Regular /FontDescriptor 1865 0 R /FirstChar 50 /LastChar 50 /Widths 1767 0 R /Encoding 1766 0 R >> endobj 218 0 obj -<< /Type /Pages /Parent 1846 0 R /Count 10 /Kids [ 182 0 R 224 0 R 235 0 R 245 0 R 257 0 R 266 0 R 272 0 R 280 0 R 285 0 R 293 0 R ] >> +<< /Type /Pages /Parent 1871 0 R /Count 10 /Kids [ 182 0 R 224 0 R 235 0 R 245 0 R 257 0 R 266 0 R 272 0 R 280 0 R 285 0 R 293 0 R ] >> endobj -317 0 obj -<< /Type /Pages /Parent 1846 0 R /Count 10 /Kids [ 308 0 R 320 0 R 327 0 R 331 0 R 339 0 R 349 0 R 390 0 R 448 0 R 474 0 R 513 0 R ] >> +316 0 obj +<< /Type /Pages /Parent 1871 0 R /Count 10 /Kids [ 308 0 R 319 0 R 328 0 R 332 0 R 340 0 R 350 0 R 391 0 R 449 0 R 475 0 R 514 0 R ] >> endobj -626 0 obj -<< /Type /Pages /Parent 1846 0 R /Count 10 /Kids [ 574 0 R 628 0 R 694 0 R 742 0 R 798 0 R 857 0 R 914 0 R 963 0 R 1022 0 R 1066 0 R ] >> +627 0 obj +<< /Type /Pages /Parent 1871 0 R /Count 10 /Kids [ 575 0 R 629 0 R 695 0 R 745 0 R 802 0 R 861 0 R 918 0 R 967 0 R 1026 0 R 1069 0 R ] >> endobj -1130 0 obj -<< /Type /Pages /Parent 1846 0 R /Count 10 /Kids [ 1097 0 R 1134 0 R 1190 0 R 1232 0 R 1271 0 R 1326 0 R 1390 0 R 1438 0 R 1470 0 R 1518 0 R ] >> +1132 0 obj +<< /Type /Pages /Parent 1871 0 R /Count 10 /Kids [ 1099 0 R 1136 0 R 1189 0 R 1237 0 R 1274 0 R 1321 0 R 1385 0 R 1433 0 R 1477 0 R 1525 0 R ] >> endobj -1600 0 obj -<< /Type /Pages /Parent 1846 0 R /Count 3 /Kids [ 1557 0 R 1602 0 R 1643 0 R ] >> +1608 0 obj +<< /Type /Pages /Parent 1871 0 R /Count 3 /Kids [ 1564 0 R 1610 0 R 1664 0 R ] >> endobj -1846 0 obj -<< /Type /Pages /Count 43 /Kids [ 218 0 R 317 0 R 626 0 R 1130 0 R 1600 0 R ] >> +1871 0 obj +<< /Type /Pages /Count 43 /Kids [ 218 0 R 316 0 R 627 0 R 1132 0 R 1608 0 R ] >> endobj -1847 0 obj +1872 0 obj << /Type /Outlines /First 3 0 R /Last 179 0 R /Count 7 >> endobj 179 0 obj -<< /Title 180 0 R /A 177 0 R /Parent 1847 0 R /Prev 103 0 R >> +<< /Title 180 0 R /A 177 0 R /Parent 1872 0 R /Prev 103 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 155 0 R /Prev 171 0 R >> @@ -7101,7 +7178,7 @@ endobj << /Title 108 0 R /A 105 0 R /Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj -<< /Title 104 0 R /A 101 0 R /Parent 1847 0 R /Prev 79 0 R /Next 179 0 R /First 107 0 R /Last 155 0 R /Count -3 >> +<< /Title 104 0 R /A 101 0 R /Parent 1872 0 R /Prev 79 0 R /Next 179 0 R /First 107 0 R /Last 155 0 R /Count -3 >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 79 0 R /Prev 95 0 R >> @@ -7119,7 +7196,7 @@ endobj << /Title 84 0 R /A 81 0 R /Parent 79 0 R /Next 87 0 R >> endobj 79 0 obj -<< /Title 80 0 R /A 77 0 R /Parent 1847 0 R /Prev 39 0 R /Next 103 0 R /First 83 0 R /Last 99 0 R /Count -5 >> +<< /Title 80 0 R /A 77 0 R /Parent 1872 0 R /Prev 39 0 R /Next 103 0 R /First 83 0 R /Last 99 0 R /Count -5 >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 39 0 R /Prev 71 0 R >> @@ -7149,7 +7226,7 @@ endobj << /Title 44 0 R /A 41 0 R /Parent 39 0 R /Next 59 0 R /First 47 0 R /Last 55 0 R /Count -3 >> endobj 39 0 obj -<< /Title 40 0 R /A 37 0 R /Parent 1847 0 R /Prev 23 0 R /Next 79 0 R /First 43 0 R /Last 75 0 R /Count -4 >> +<< /Title 40 0 R /A 37 0 R /Parent 1872 0 R /Prev 23 0 R /Next 79 0 R /First 43 0 R /Last 75 0 R /Count -4 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 23 0 R /Prev 31 0 R >> @@ -7161,7 +7238,7 @@ endobj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj -<< /Title 24 0 R /A 21 0 R /Parent 1847 0 R /Prev 7 0 R /Next 39 0 R /First 27 0 R /Last 35 0 R /Count -3 >> +<< /Title 24 0 R /A 21 0 R /Parent 1872 0 R /Prev 7 0 R /Next 39 0 R /First 27 0 R /Last 35 0 R /Count -3 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 7 0 R /Prev 15 0 R >> @@ -7173,1129 +7250,1124 @@ endobj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj -<< /Title 8 0 R /A 5 0 R /Parent 1847 0 R /Prev 3 0 R /Next 23 0 R /First 11 0 R /Last 19 0 R /Count -3 >> +<< /Title 8 0 R /A 5 0 R /Parent 1872 0 R /Prev 3 0 R /Next 23 0 R /First 11 0 R /Last 19 0 R /Count -3 >> endobj 3 0 obj -<< /Title 4 0 R /A 1 0 R /Parent 1847 0 R /Next 7 0 R >> +<< /Title 4 0 R /A 1 0 R /Parent 1872 0 R /Next 7 0 R >> endobj -1848 0 obj -<< /Names [ (Doc-Start) 189 0 R (HD.1) 353 0 R (HD.10) 362 0 R (HD.100) 460 0 R (HD.1000) 1460 0 R (HD.1001) 1461 0 R (HD.1002) 1462 0 R (HD.1003) 1463 0 R (HD.1004) 1464 0 R (HD.1005) 1465 0 R (HD.1006) 1466 0 R (HD.1007) 1467 0 R (HD.1008) 1474 0 R (HD.1009) 1475 0 R (HD.101) 461 0 R (HD.1010) 1476 0 R (HD.1011) 1477 0 R (HD.1012) 1478 0 R (HD.1013) 1479 0 R (HD.1014) 1480 0 R (HD.1015) 1481 0 R (HD.1016) 1482 0 R (HD.1017) 1484 0 R (HD.1018) 1485 0 R (HD.1019) 1486 0 R (HD.102) 462 0 R (HD.1020) 1487 0 R (HD.1021) 1488 0 R (HD.1022) 1489 0 R (HD.1023) 1490 0 R (HD.1024) 1491 0 R (HD.1025) 1492 0 R ] /Limits [ (Doc-Start) (HD.1025) ] >> +1873 0 obj +<< /Names [ (Doc-Start) 189 0 R (HD.1) 354 0 R (HD.10) 363 0 R (HD.100) 461 0 R (HD.1000) 1461 0 R (HD.1001) 1462 0 R (HD.1002) 1463 0 R (HD.1003) 1464 0 R (HD.1004) 1465 0 R (HD.1005) 1466 0 R (HD.1006) 1467 0 R (HD.1007) 1468 0 R (HD.1008) 1469 0 R (HD.1009) 1470 0 R (HD.101) 462 0 R (HD.1010) 1471 0 R (HD.1011) 1472 0 R (HD.1012) 1473 0 R (HD.1013) 1474 0 R (HD.1014) 1481 0 R (HD.1015) 1482 0 R (HD.1016) 1483 0 R (HD.1017) 1484 0 R (HD.1018) 1485 0 R (HD.1019) 1486 0 R (HD.102) 463 0 R (HD.1020) 1487 0 R (HD.1021) 1488 0 R (HD.1022) 1489 0 R (HD.1023) 1491 0 R (HD.1024) 1492 0 R (HD.1025) 1493 0 R ] /Limits [ (Doc-Start) (HD.1025) ] >> endobj -1849 0 obj -<< /Names [ (HD.1026) 1493 0 R (HD.1027) 1494 0 R (HD.1028) 1495 0 R (HD.1029) 1496 0 R (HD.103) 463 0 R (HD.1030) 1497 0 R (HD.1031) 1498 0 R (HD.1032) 1499 0 R (HD.1033) 1500 0 R (HD.1034) 1501 0 R (HD.1035) 1502 0 R (HD.1036) 1503 0 R (HD.1037) 1504 0 R (HD.1038) 1505 0 R (HD.1039) 1506 0 R (HD.104) 464 0 R (HD.1040) 1507 0 R (HD.1041) 1508 0 R (HD.1042) 1509 0 R (HD.1043) 1510 0 R (HD.1044) 1511 0 R (HD.1045) 1512 0 R (HD.1046) 1513 0 R (HD.1047) 1514 0 R (HD.1048) 1521 0 R (HD.1049) 1522 0 R (HD.105) 465 0 R (HD.1050) 1523 0 R (HD.1051) 1524 0 R (HD.1052) 1525 0 R (HD.1053) 1526 0 R (HD.1054) 1527 0 R ] /Limits [ (HD.1026) (HD.1054) ] >> +1874 0 obj +<< /Names [ (HD.1026) 1494 0 R (HD.1027) 1495 0 R (HD.1028) 1496 0 R (HD.1029) 1497 0 R (HD.103) 464 0 R (HD.1030) 1498 0 R (HD.1031) 1499 0 R (HD.1032) 1500 0 R (HD.1033) 1501 0 R (HD.1034) 1502 0 R (HD.1035) 1503 0 R (HD.1036) 1504 0 R (HD.1037) 1505 0 R (HD.1038) 1506 0 R (HD.1039) 1507 0 R (HD.104) 465 0 R (HD.1040) 1508 0 R (HD.1041) 1509 0 R (HD.1042) 1510 0 R (HD.1043) 1511 0 R (HD.1044) 1512 0 R (HD.1045) 1513 0 R (HD.1046) 1514 0 R (HD.1047) 1515 0 R (HD.1048) 1516 0 R (HD.1049) 1517 0 R (HD.105) 466 0 R (HD.1050) 1518 0 R (HD.1051) 1519 0 R (HD.1052) 1520 0 R (HD.1053) 1521 0 R (HD.1054) 1528 0 R ] /Limits [ (HD.1026) (HD.1054) ] >> endobj -1850 0 obj -<< /Names [ (HD.1055) 1528 0 R (HD.1056) 1529 0 R (HD.1057) 1530 0 R (HD.1058) 1531 0 R (HD.1059) 1532 0 R (HD.106) 466 0 R (HD.1060) 1533 0 R (HD.1061) 1534 0 R (HD.1062) 1535 0 R (HD.1063) 1536 0 R (HD.1064) 1537 0 R (HD.1065) 1538 0 R (HD.1066) 1539 0 R (HD.1067) 1540 0 R (HD.1068) 1541 0 R (HD.1069) 1542 0 R (HD.107) 467 0 R (HD.1070) 1543 0 R (HD.1071) 1544 0 R (HD.1072) 1545 0 R (HD.1073) 1546 0 R (HD.1074) 1547 0 R (HD.1075) 1548 0 R (HD.1076) 1549 0 R (HD.1077) 1550 0 R (HD.1078) 1551 0 R (HD.1079) 1552 0 R (HD.108) 468 0 R (HD.1080) 1553 0 R (HD.1081) 1554 0 R (HD.1082) 1555 0 R (HD.1083) 1560 0 R ] /Limits [ (HD.1055) (HD.1083) ] >> +1875 0 obj +<< /Names [ (HD.1055) 1529 0 R (HD.1056) 1530 0 R (HD.1057) 1531 0 R (HD.1058) 1532 0 R (HD.1059) 1533 0 R (HD.106) 467 0 R (HD.1060) 1534 0 R (HD.1061) 1535 0 R (HD.1062) 1536 0 R (HD.1063) 1537 0 R (HD.1064) 1538 0 R (HD.1065) 1539 0 R (HD.1066) 1540 0 R (HD.1067) 1541 0 R (HD.1068) 1542 0 R (HD.1069) 1543 0 R (HD.107) 468 0 R (HD.1070) 1544 0 R (HD.1071) 1545 0 R (HD.1072) 1546 0 R (HD.1073) 1547 0 R (HD.1074) 1548 0 R (HD.1075) 1549 0 R (HD.1076) 1550 0 R (HD.1077) 1551 0 R (HD.1078) 1552 0 R (HD.1079) 1553 0 R (HD.108) 469 0 R (HD.1080) 1554 0 R (HD.1081) 1555 0 R (HD.1082) 1556 0 R (HD.1083) 1557 0 R ] /Limits [ (HD.1055) (HD.1083) ] >> endobj -1851 0 obj -<< /Names [ (HD.1084) 1561 0 R (HD.1085) 1562 0 R (HD.1086) 1563 0 R (HD.1087) 1564 0 R (HD.1088) 1565 0 R (HD.1089) 1566 0 R (HD.109) 469 0 R (HD.1090) 1567 0 R (HD.1091) 1568 0 R (HD.1092) 1569 0 R (HD.1093) 1570 0 R (HD.1094) 1571 0 R (HD.1095) 1572 0 R (HD.1096) 1573 0 R (HD.1097) 1574 0 R (HD.1098) 1575 0 R (HD.1099) 1576 0 R (HD.11) 363 0 R (HD.110) 470 0 R (HD.1100) 1577 0 R (HD.1101) 1578 0 R (HD.1102) 1579 0 R (HD.1103) 1580 0 R (HD.1104) 1581 0 R (HD.1105) 1582 0 R (HD.1106) 1583 0 R (HD.1107) 1584 0 R (HD.1108) 1585 0 R (HD.1109) 1586 0 R (HD.111) 471 0 R (HD.1110) 1587 0 R (HD.1111) 1588 0 R ] /Limits [ (HD.1084) (HD.1111) ] >> +1876 0 obj +<< /Names [ (HD.1084) 1558 0 R (HD.1085) 1559 0 R (HD.1086) 1560 0 R (HD.1087) 1561 0 R (HD.1088) 1562 0 R (HD.1089) 1567 0 R (HD.109) 470 0 R (HD.1090) 1568 0 R (HD.1091) 1569 0 R (HD.1092) 1570 0 R (HD.1093) 1571 0 R (HD.1094) 1572 0 R (HD.1095) 1573 0 R (HD.1096) 1574 0 R (HD.1097) 1575 0 R (HD.1098) 1576 0 R (HD.1099) 1577 0 R (HD.11) 364 0 R (HD.110) 471 0 R (HD.1100) 1578 0 R (HD.1101) 1579 0 R (HD.1102) 1580 0 R (HD.1103) 1581 0 R (HD.1104) 1582 0 R (HD.1105) 1583 0 R (HD.1106) 1584 0 R (HD.1107) 1585 0 R (HD.1108) 1586 0 R (HD.1109) 1587 0 R (HD.111) 472 0 R (HD.1110) 1588 0 R (HD.1111) 1589 0 R ] /Limits [ (HD.1084) (HD.1111) ] >> endobj -1852 0 obj -<< /Names [ (HD.1112) 1589 0 R (HD.1113) 1590 0 R (HD.1114) 1591 0 R (HD.1115) 1592 0 R (HD.1116) 1593 0 R (HD.1117) 1594 0 R (HD.1118) 1595 0 R (HD.1119) 1596 0 R (HD.112) 472 0 R (HD.1120) 1597 0 R (HD.1121) 1598 0 R (HD.1122) 1599 0 R (HD.1123) 1605 0 R (HD.1124) 1606 0 R (HD.1125) 1607 0 R (HD.1126) 1608 0 R (HD.1127) 1609 0 R (HD.1128) 1610 0 R (HD.1129) 1611 0 R (HD.113) 477 0 R (HD.1130) 1612 0 R (HD.1131) 1613 0 R (HD.1132) 1614 0 R (HD.1133) 1615 0 R (HD.1134) 1616 0 R (HD.1135) 1617 0 R (HD.1136) 1618 0 R (HD.1137) 1619 0 R (HD.1138) 1620 0 R (HD.1139) 1621 0 R (HD.114) 478 0 R (HD.1140) 1622 0 R ] /Limits [ (HD.1112) (HD.1140) ] >> +1877 0 obj +<< /Names [ (HD.1112) 1590 0 R (HD.1113) 1591 0 R (HD.1114) 1592 0 R (HD.1115) 1593 0 R (HD.1116) 1594 0 R (HD.1117) 1595 0 R (HD.1118) 1596 0 R (HD.1119) 1597 0 R (HD.112) 473 0 R (HD.1120) 1598 0 R (HD.1121) 1599 0 R (HD.1122) 1600 0 R (HD.1123) 1601 0 R (HD.1124) 1602 0 R (HD.1125) 1603 0 R (HD.1126) 1604 0 R (HD.1127) 1605 0 R (HD.1128) 1606 0 R (HD.1129) 1607 0 R (HD.113) 478 0 R (HD.1130) 1613 0 R (HD.1131) 1614 0 R (HD.1132) 1615 0 R (HD.1133) 1616 0 R (HD.1134) 1617 0 R (HD.1135) 1618 0 R (HD.1136) 1619 0 R (HD.1137) 1620 0 R (HD.1138) 1621 0 R (HD.1139) 1622 0 R (HD.114) 479 0 R (HD.1140) 1623 0 R ] /Limits [ (HD.1112) (HD.1140) ] >> endobj -1853 0 obj -<< /Names [ (HD.1141) 1623 0 R (HD.1142) 1624 0 R (HD.1143) 1625 0 R (HD.1144) 1626 0 R (HD.1145) 1627 0 R (HD.1146) 1628 0 R (HD.1147) 1629 0 R (HD.1148) 1630 0 R (HD.1149) 1631 0 R (HD.115) 479 0 R (HD.1150) 1632 0 R (HD.1151) 1633 0 R (HD.1152) 1634 0 R (HD.1153) 1635 0 R (HD.1154) 1636 0 R (HD.1155) 1637 0 R (HD.1156) 1638 0 R (HD.116) 480 0 R (HD.117) 481 0 R (HD.118) 482 0 R (HD.119) 483 0 R (HD.12) 364 0 R (HD.120) 484 0 R (HD.121) 485 0 R (HD.122) 486 0 R (HD.123) 487 0 R (HD.124) 488 0 R (HD.125) 489 0 R (HD.126) 490 0 R (HD.127) 491 0 R (HD.128) 492 0 R (HD.129) 493 0 R ] /Limits [ (HD.1141) (HD.129) ] >> +1878 0 obj +<< /Names [ (HD.1141) 1624 0 R (HD.1142) 1625 0 R (HD.1143) 1626 0 R (HD.1144) 1627 0 R (HD.1145) 1628 0 R (HD.1146) 1629 0 R (HD.1147) 1630 0 R (HD.1148) 1631 0 R (HD.1149) 1632 0 R (HD.115) 480 0 R (HD.1150) 1633 0 R (HD.1151) 1634 0 R (HD.1152) 1635 0 R (HD.1153) 1636 0 R (HD.1154) 1637 0 R (HD.1155) 1638 0 R (HD.1156) 1639 0 R (HD.1157) 1640 0 R (HD.1158) 1641 0 R (HD.1159) 1642 0 R (HD.116) 481 0 R (HD.1160) 1643 0 R (HD.1161) 1644 0 R (HD.1162) 1645 0 R (HD.1163) 1646 0 R (HD.1164) 1647 0 R (HD.1165) 1648 0 R (HD.1166) 1649 0 R (HD.1167) 1650 0 R (HD.1168) 1651 0 R (HD.1169) 1652 0 R (HD.117) 482 0 R ] /Limits [ (HD.1141) (HD.117) ] >> endobj -1854 0 obj -<< /Names [ (HD.13) 365 0 R (HD.130) 494 0 R (HD.131) 495 0 R (HD.132) 496 0 R (HD.133) 497 0 R (HD.134) 498 0 R (HD.135) 499 0 R (HD.136) 500 0 R (HD.137) 501 0 R (HD.138) 502 0 R (HD.139) 503 0 R (HD.14) 366 0 R (HD.140) 504 0 R (HD.141) 505 0 R (HD.142) 506 0 R (HD.143) 507 0 R (HD.144) 508 0 R (HD.145) 509 0 R (HD.146) 510 0 R (HD.147) 511 0 R (HD.148) 516 0 R (HD.149) 517 0 R (HD.15) 367 0 R (HD.150) 518 0 R (HD.151) 519 0 R (HD.152) 520 0 R (HD.153) 521 0 R (HD.154) 522 0 R (HD.155) 523 0 R (HD.156) 524 0 R (HD.157) 525 0 R (HD.158) 526 0 R ] /Limits [ (HD.13) (HD.158) ] >> +1879 0 obj +<< /Names [ (HD.1170) 1653 0 R (HD.1171) 1654 0 R (HD.1172) 1655 0 R (HD.1173) 1656 0 R (HD.1174) 1657 0 R (HD.1175) 1658 0 R (HD.1176) 1659 0 R (HD.1177) 1660 0 R (HD.1178) 1661 0 R (HD.1179) 1662 0 R (HD.118) 483 0 R (HD.119) 484 0 R (HD.12) 365 0 R (HD.120) 485 0 R (HD.121) 486 0 R (HD.122) 487 0 R (HD.123) 488 0 R (HD.124) 489 0 R (HD.125) 490 0 R (HD.126) 491 0 R (HD.127) 492 0 R (HD.128) 493 0 R (HD.129) 494 0 R (HD.13) 366 0 R (HD.130) 495 0 R (HD.131) 496 0 R (HD.132) 497 0 R (HD.133) 498 0 R (HD.134) 499 0 R (HD.135) 500 0 R (HD.136) 501 0 R (HD.137) 502 0 R ] /Limits [ (HD.1170) (HD.137) ] >> endobj -1855 0 obj -<< /Names [ (HD.159) 527 0 R (HD.16) 368 0 R (HD.160) 528 0 R (HD.161) 529 0 R (HD.162) 530 0 R (HD.163) 531 0 R (HD.164) 532 0 R (HD.165) 533 0 R (HD.166) 534 0 R (HD.167) 535 0 R (HD.168) 536 0 R (HD.169) 537 0 R (HD.17) 369 0 R (HD.170) 538 0 R (HD.171) 539 0 R (HD.172) 540 0 R (HD.173) 541 0 R (HD.174) 542 0 R (HD.175) 543 0 R (HD.176) 544 0 R (HD.177) 545 0 R (HD.178) 546 0 R (HD.179) 547 0 R (HD.18) 370 0 R (HD.180) 548 0 R (HD.181) 549 0 R (HD.182) 550 0 R (HD.183) 551 0 R (HD.184) 552 0 R (HD.185) 553 0 R (HD.186) 554 0 R (HD.187) 555 0 R ] /Limits [ (HD.159) (HD.187) ] >> +1880 0 obj +<< /Names [ (HD.138) 503 0 R (HD.139) 504 0 R (HD.14) 367 0 R (HD.140) 505 0 R (HD.141) 506 0 R (HD.142) 507 0 R (HD.143) 508 0 R (HD.144) 509 0 R (HD.145) 510 0 R (HD.146) 511 0 R (HD.147) 512 0 R (HD.148) 517 0 R (HD.149) 518 0 R (HD.15) 368 0 R (HD.150) 519 0 R (HD.151) 520 0 R (HD.152) 521 0 R (HD.153) 522 0 R (HD.154) 523 0 R (HD.155) 524 0 R (HD.156) 525 0 R (HD.157) 526 0 R (HD.158) 527 0 R (HD.159) 528 0 R (HD.16) 369 0 R (HD.160) 529 0 R (HD.161) 530 0 R (HD.162) 531 0 R (HD.163) 532 0 R (HD.164) 533 0 R (HD.165) 534 0 R (HD.166) 535 0 R ] /Limits [ (HD.138) (HD.166) ] >> endobj -1856 0 obj -<< /Names [ (HD.188) 556 0 R (HD.189) 557 0 R (HD.19) 371 0 R (HD.190) 558 0 R (HD.191) 559 0 R (HD.192) 560 0 R (HD.193) 561 0 R (HD.194) 562 0 R (HD.195) 563 0 R (HD.196) 564 0 R (HD.197) 565 0 R (HD.198) 566 0 R (HD.199) 567 0 R (HD.2) 354 0 R (HD.20) 372 0 R (HD.200) 568 0 R (HD.201) 569 0 R (HD.202) 570 0 R (HD.203) 571 0 R (HD.204) 572 0 R (HD.205) 577 0 R (HD.206) 578 0 R (HD.207) 579 0 R (HD.208) 580 0 R (HD.209) 581 0 R (HD.21) 373 0 R (HD.210) 582 0 R (HD.211) 583 0 R (HD.212) 584 0 R (HD.213) 585 0 R (HD.214) 586 0 R (HD.215) 587 0 R ] /Limits [ (HD.188) (HD.215) ] >> +1881 0 obj +<< /Names [ (HD.167) 536 0 R (HD.168) 537 0 R (HD.169) 538 0 R (HD.17) 370 0 R (HD.170) 539 0 R (HD.171) 540 0 R (HD.172) 541 0 R (HD.173) 542 0 R (HD.174) 543 0 R (HD.175) 544 0 R (HD.176) 545 0 R (HD.177) 546 0 R (HD.178) 547 0 R (HD.179) 548 0 R (HD.18) 371 0 R (HD.180) 549 0 R (HD.181) 550 0 R (HD.182) 551 0 R (HD.183) 552 0 R (HD.184) 553 0 R (HD.185) 554 0 R (HD.186) 555 0 R (HD.187) 556 0 R (HD.188) 557 0 R (HD.189) 558 0 R (HD.19) 372 0 R (HD.190) 559 0 R (HD.191) 560 0 R (HD.192) 561 0 R (HD.193) 562 0 R (HD.194) 563 0 R (HD.195) 564 0 R ] /Limits [ (HD.167) (HD.195) ] >> endobj -1857 0 obj -<< /Names [ (HD.216) 588 0 R (HD.217) 589 0 R (HD.218) 590 0 R (HD.219) 591 0 R (HD.22) 374 0 R (HD.220) 592 0 R (HD.221) 593 0 R (HD.222) 594 0 R (HD.223) 595 0 R (HD.224) 596 0 R (HD.225) 597 0 R (HD.226) 598 0 R (HD.227) 599 0 R (HD.228) 600 0 R (HD.229) 601 0 R (HD.23) 375 0 R (HD.230) 602 0 R (HD.231) 603 0 R (HD.232) 604 0 R (HD.233) 605 0 R (HD.234) 606 0 R (HD.235) 607 0 R (HD.236) 608 0 R (HD.237) 609 0 R (HD.238) 610 0 R (HD.239) 611 0 R (HD.24) 376 0 R (HD.240) 612 0 R (HD.241) 613 0 R (HD.242) 614 0 R (HD.243) 615 0 R (HD.244) 616 0 R ] /Limits [ (HD.216) (HD.244) ] >> +1882 0 obj +<< /Names [ (HD.196) 565 0 R (HD.197) 566 0 R (HD.198) 567 0 R (HD.199) 568 0 R (HD.2) 355 0 R (HD.20) 373 0 R (HD.200) 569 0 R (HD.201) 570 0 R (HD.202) 571 0 R (HD.203) 572 0 R (HD.204) 573 0 R (HD.205) 578 0 R (HD.206) 579 0 R (HD.207) 580 0 R (HD.208) 581 0 R (HD.209) 582 0 R (HD.21) 374 0 R (HD.210) 583 0 R (HD.211) 584 0 R (HD.212) 585 0 R (HD.213) 586 0 R (HD.214) 587 0 R (HD.215) 588 0 R (HD.216) 589 0 R (HD.217) 590 0 R (HD.218) 591 0 R (HD.219) 592 0 R (HD.22) 375 0 R (HD.220) 593 0 R (HD.221) 594 0 R (HD.222) 595 0 R (HD.223) 596 0 R ] /Limits [ (HD.196) (HD.223) ] >> endobj -1858 0 obj -<< /Names [ (HD.245) 617 0 R (HD.246) 618 0 R (HD.247) 619 0 R (HD.248) 620 0 R (HD.249) 621 0 R (HD.25) 377 0 R (HD.250) 622 0 R (HD.251) 623 0 R (HD.252) 624 0 R (HD.253) 625 0 R (HD.254) 631 0 R (HD.255) 632 0 R (HD.256) 633 0 R (HD.257) 634 0 R (HD.258) 635 0 R (HD.259) 636 0 R (HD.26) 378 0 R (HD.260) 637 0 R (HD.261) 638 0 R (HD.262) 639 0 R (HD.263) 640 0 R (HD.264) 641 0 R (HD.265) 642 0 R (HD.266) 643 0 R (HD.267) 644 0 R (HD.268) 645 0 R (HD.269) 646 0 R (HD.27) 379 0 R (HD.270) 647 0 R (HD.271) 648 0 R (HD.272) 649 0 R (HD.273) 650 0 R ] /Limits [ (HD.245) (HD.273) ] >> +1883 0 obj +<< /Names [ (HD.224) 597 0 R (HD.225) 598 0 R (HD.226) 599 0 R (HD.227) 600 0 R (HD.228) 601 0 R (HD.229) 602 0 R (HD.23) 376 0 R (HD.230) 603 0 R (HD.231) 604 0 R (HD.232) 605 0 R (HD.233) 606 0 R (HD.234) 607 0 R (HD.235) 608 0 R (HD.236) 609 0 R (HD.237) 610 0 R (HD.238) 611 0 R (HD.239) 612 0 R (HD.24) 377 0 R (HD.240) 613 0 R (HD.241) 614 0 R (HD.242) 615 0 R (HD.243) 616 0 R (HD.244) 617 0 R (HD.245) 618 0 R (HD.246) 619 0 R (HD.247) 620 0 R (HD.248) 621 0 R (HD.249) 622 0 R (HD.25) 378 0 R (HD.250) 623 0 R (HD.251) 624 0 R (HD.252) 625 0 R ] /Limits [ (HD.224) (HD.252) ] >> endobj -1859 0 obj -<< /Names [ (HD.274) 651 0 R (HD.275) 652 0 R (HD.276) 653 0 R (HD.277) 654 0 R (HD.278) 655 0 R (HD.279) 656 0 R (HD.28) 380 0 R (HD.280) 657 0 R (HD.281) 658 0 R (HD.282) 659 0 R (HD.283) 660 0 R (HD.284) 661 0 R (HD.285) 662 0 R (HD.286) 663 0 R (HD.287) 664 0 R (HD.288) 665 0 R (HD.289) 666 0 R (HD.29) 381 0 R (HD.290) 667 0 R (HD.291) 668 0 R (HD.292) 669 0 R (HD.293) 670 0 R (HD.294) 671 0 R (HD.295) 672 0 R (HD.296) 673 0 R (HD.297) 674 0 R (HD.298) 675 0 R (HD.299) 676 0 R (HD.3) 355 0 R (HD.30) 382 0 R (HD.300) 677 0 R (HD.301) 678 0 R ] /Limits [ (HD.274) (HD.301) ] >> +1884 0 obj +<< /Names [ (HD.253) 626 0 R (HD.254) 632 0 R (HD.255) 633 0 R (HD.256) 634 0 R (HD.257) 635 0 R (HD.258) 636 0 R (HD.259) 637 0 R (HD.26) 379 0 R (HD.260) 638 0 R (HD.261) 639 0 R (HD.262) 640 0 R (HD.263) 641 0 R (HD.264) 642 0 R (HD.265) 643 0 R (HD.266) 644 0 R (HD.267) 645 0 R (HD.268) 646 0 R (HD.269) 647 0 R (HD.27) 380 0 R (HD.270) 648 0 R (HD.271) 649 0 R (HD.272) 650 0 R (HD.273) 651 0 R (HD.274) 652 0 R (HD.275) 653 0 R (HD.276) 654 0 R (HD.277) 655 0 R (HD.278) 656 0 R (HD.279) 657 0 R (HD.28) 381 0 R (HD.280) 658 0 R (HD.281) 659 0 R ] /Limits [ (HD.253) (HD.281) ] >> endobj -1860 0 obj -<< /Names [ (HD.302) 679 0 R (HD.303) 680 0 R (HD.304) 681 0 R (HD.305) 682 0 R (HD.306) 683 0 R (HD.307) 684 0 R (HD.308) 685 0 R (HD.309) 686 0 R (HD.31) 383 0 R (HD.310) 687 0 R (HD.311) 688 0 R (HD.312) 689 0 R (HD.313) 690 0 R (HD.314) 691 0 R (HD.315) 692 0 R (HD.316) 697 0 R (HD.317) 698 0 R (HD.318) 699 0 R (HD.319) 700 0 R (HD.32) 384 0 R (HD.320) 701 0 R (HD.321) 702 0 R (HD.322) 703 0 R (HD.323) 704 0 R (HD.324) 705 0 R (HD.325) 706 0 R (HD.326) 707 0 R (HD.327) 708 0 R (HD.328) 709 0 R (HD.329) 710 0 R (HD.33) 385 0 R (HD.330) 711 0 R ] /Limits [ (HD.302) (HD.330) ] >> +1885 0 obj +<< /Names [ (HD.282) 660 0 R (HD.283) 661 0 R (HD.284) 662 0 R (HD.285) 663 0 R (HD.286) 664 0 R (HD.287) 665 0 R (HD.288) 666 0 R (HD.289) 667 0 R (HD.29) 382 0 R (HD.290) 668 0 R (HD.291) 669 0 R (HD.292) 670 0 R (HD.293) 671 0 R (HD.294) 672 0 R (HD.295) 673 0 R (HD.296) 674 0 R (HD.297) 675 0 R (HD.298) 676 0 R (HD.299) 677 0 R (HD.3) 356 0 R (HD.30) 383 0 R (HD.300) 678 0 R (HD.301) 679 0 R (HD.302) 680 0 R (HD.303) 681 0 R (HD.304) 682 0 R (HD.305) 683 0 R (HD.306) 684 0 R (HD.307) 685 0 R (HD.308) 686 0 R (HD.309) 687 0 R (HD.31) 384 0 R ] /Limits [ (HD.282) (HD.31) ] >> endobj -1861 0 obj -<< /Names [ (HD.331) 712 0 R (HD.332) 713 0 R (HD.333) 714 0 R (HD.334) 715 0 R (HD.335) 716 0 R (HD.336) 717 0 R (HD.337) 718 0 R (HD.338) 719 0 R (HD.339) 720 0 R (HD.34) 386 0 R (HD.340) 721 0 R (HD.341) 722 0 R (HD.342) 723 0 R (HD.343) 724 0 R (HD.344) 725 0 R (HD.345) 726 0 R (HD.346) 727 0 R (HD.347) 728 0 R (HD.348) 729 0 R (HD.349) 730 0 R (HD.35) 387 0 R (HD.350) 731 0 R (HD.351) 732 0 R (HD.352) 733 0 R (HD.353) 734 0 R (HD.354) 735 0 R (HD.355) 736 0 R (HD.356) 737 0 R (HD.357) 738 0 R (HD.358) 739 0 R (HD.359) 740 0 R (HD.36) 388 0 R ] /Limits [ (HD.331) (HD.36) ] >> +1886 0 obj +<< /Names [ (HD.310) 688 0 R (HD.311) 689 0 R (HD.312) 690 0 R (HD.313) 691 0 R (HD.314) 692 0 R (HD.315) 693 0 R (HD.316) 698 0 R (HD.317) 699 0 R (HD.318) 700 0 R (HD.319) 701 0 R (HD.32) 385 0 R (HD.320) 702 0 R (HD.321) 703 0 R (HD.322) 704 0 R (HD.323) 705 0 R (HD.324) 706 0 R (HD.325) 707 0 R (HD.326) 708 0 R (HD.327) 709 0 R (HD.328) 710 0 R (HD.329) 711 0 R (HD.33) 386 0 R (HD.330) 712 0 R (HD.331) 713 0 R (HD.332) 714 0 R (HD.333) 715 0 R (HD.334) 716 0 R (HD.335) 717 0 R (HD.336) 718 0 R (HD.337) 719 0 R (HD.338) 720 0 R (HD.339) 721 0 R ] /Limits [ (HD.310) (HD.339) ] >> endobj -1862 0 obj -<< /Names [ (HD.360) 745 0 R (HD.361) 746 0 R (HD.362) 747 0 R (HD.363) 748 0 R (HD.364) 749 0 R (HD.365) 750 0 R (HD.366) 751 0 R (HD.367) 752 0 R (HD.368) 753 0 R (HD.369) 754 0 R (HD.37) 393 0 R (HD.370) 755 0 R (HD.371) 756 0 R (HD.372) 757 0 R (HD.373) 758 0 R (HD.374) 759 0 R (HD.375) 760 0 R (HD.376) 761 0 R (HD.377) 762 0 R (HD.378) 763 0 R (HD.379) 764 0 R (HD.38) 394 0 R (HD.380) 765 0 R (HD.381) 766 0 R (HD.382) 767 0 R (HD.383) 768 0 R (HD.384) 769 0 R (HD.385) 770 0 R (HD.386) 771 0 R (HD.387) 772 0 R (HD.388) 773 0 R (HD.389) 774 0 R ] /Limits [ (HD.360) (HD.389) ] >> +1887 0 obj +<< /Names [ (HD.34) 387 0 R (HD.340) 722 0 R (HD.341) 723 0 R (HD.342) 724 0 R (HD.343) 725 0 R (HD.344) 726 0 R (HD.345) 727 0 R (HD.346) 728 0 R (HD.347) 729 0 R (HD.348) 730 0 R (HD.349) 731 0 R (HD.35) 388 0 R (HD.350) 732 0 R (HD.351) 733 0 R (HD.352) 734 0 R (HD.353) 735 0 R (HD.354) 736 0 R (HD.355) 737 0 R (HD.356) 738 0 R (HD.357) 739 0 R (HD.358) 740 0 R (HD.359) 741 0 R (HD.36) 389 0 R (HD.360) 742 0 R (HD.361) 743 0 R (HD.362) 748 0 R (HD.363) 749 0 R (HD.364) 750 0 R (HD.365) 751 0 R (HD.366) 752 0 R (HD.367) 753 0 R (HD.368) 754 0 R ] /Limits [ (HD.34) (HD.368) ] >> endobj -1863 0 obj -<< /Names [ (HD.39) 395 0 R (HD.390) 775 0 R (HD.391) 776 0 R (HD.392) 777 0 R (HD.393) 778 0 R (HD.394) 779 0 R (HD.395) 780 0 R (HD.396) 781 0 R (HD.397) 782 0 R (HD.398) 783 0 R (HD.399) 784 0 R (HD.4) 356 0 R (HD.40) 396 0 R (HD.400) 785 0 R (HD.401) 786 0 R (HD.402) 787 0 R (HD.403) 788 0 R (HD.404) 789 0 R (HD.405) 790 0 R (HD.406) 791 0 R (HD.407) 792 0 R (HD.408) 793 0 R (HD.409) 794 0 R (HD.41) 397 0 R (HD.410) 795 0 R (HD.411) 796 0 R (HD.412) 801 0 R (HD.413) 802 0 R (HD.414) 803 0 R (HD.415) 804 0 R (HD.416) 805 0 R (HD.417) 806 0 R ] /Limits [ (HD.39) (HD.417) ] >> +1888 0 obj +<< /Names [ (HD.369) 755 0 R (HD.37) 394 0 R (HD.370) 756 0 R (HD.371) 757 0 R (HD.372) 758 0 R (HD.373) 759 0 R (HD.374) 760 0 R (HD.375) 761 0 R (HD.376) 762 0 R (HD.377) 763 0 R (HD.378) 764 0 R (HD.379) 765 0 R (HD.38) 395 0 R (HD.380) 766 0 R (HD.381) 767 0 R (HD.382) 768 0 R (HD.383) 769 0 R (HD.384) 770 0 R (HD.385) 771 0 R (HD.386) 772 0 R (HD.387) 773 0 R (HD.388) 774 0 R (HD.389) 775 0 R (HD.39) 396 0 R (HD.390) 776 0 R (HD.391) 777 0 R (HD.392) 778 0 R (HD.393) 779 0 R (HD.394) 780 0 R (HD.395) 781 0 R (HD.396) 782 0 R (HD.397) 783 0 R ] /Limits [ (HD.369) (HD.397) ] >> endobj -1864 0 obj -<< /Names [ (HD.418) 807 0 R (HD.419) 808 0 R (HD.42) 398 0 R (HD.420) 809 0 R (HD.421) 810 0 R (HD.422) 811 0 R (HD.423) 812 0 R (HD.424) 813 0 R (HD.425) 814 0 R (HD.426) 815 0 R (HD.427) 816 0 R (HD.428) 817 0 R (HD.429) 818 0 R (HD.43) 399 0 R (HD.430) 819 0 R (HD.431) 820 0 R (HD.432) 821 0 R (HD.433) 822 0 R (HD.434) 823 0 R (HD.435) 824 0 R (HD.436) 825 0 R (HD.437) 826 0 R (HD.438) 827 0 R (HD.439) 828 0 R (HD.44) 400 0 R (HD.440) 829 0 R (HD.441) 830 0 R (HD.442) 831 0 R (HD.443) 832 0 R (HD.444) 833 0 R (HD.445) 834 0 R (HD.446) 835 0 R ] /Limits [ (HD.418) (HD.446) ] >> +1889 0 obj +<< /Names [ (HD.398) 784 0 R (HD.399) 785 0 R (HD.4) 357 0 R (HD.40) 397 0 R (HD.400) 786 0 R (HD.401) 787 0 R (HD.402) 788 0 R (HD.403) 789 0 R (HD.404) 790 0 R (HD.405) 791 0 R (HD.406) 792 0 R (HD.407) 793 0 R (HD.408) 794 0 R (HD.409) 795 0 R (HD.41) 398 0 R (HD.410) 796 0 R (HD.411) 797 0 R (HD.412) 798 0 R (HD.413) 799 0 R (HD.414) 800 0 R (HD.415) 805 0 R (HD.416) 806 0 R (HD.417) 807 0 R (HD.418) 808 0 R (HD.419) 809 0 R (HD.42) 399 0 R (HD.420) 810 0 R (HD.421) 811 0 R (HD.422) 812 0 R (HD.423) 813 0 R (HD.424) 814 0 R (HD.425) 815 0 R ] /Limits [ (HD.398) (HD.425) ] >> endobj -1865 0 obj -<< /Names [ (HD.447) 836 0 R (HD.448) 837 0 R (HD.449) 838 0 R (HD.45) 401 0 R (HD.450) 839 0 R (HD.451) 840 0 R (HD.452) 841 0 R (HD.453) 842 0 R (HD.454) 843 0 R (HD.455) 844 0 R (HD.456) 845 0 R (HD.457) 846 0 R (HD.458) 847 0 R (HD.459) 848 0 R (HD.46) 402 0 R (HD.460) 849 0 R (HD.461) 850 0 R (HD.462) 851 0 R (HD.463) 852 0 R (HD.464) 853 0 R (HD.465) 854 0 R (HD.466) 855 0 R (HD.467) 860 0 R (HD.468) 861 0 R (HD.469) 862 0 R (HD.47) 403 0 R (HD.470) 863 0 R (HD.471) 864 0 R (HD.472) 865 0 R (HD.473) 866 0 R (HD.474) 867 0 R (HD.475) 868 0 R ] /Limits [ (HD.447) (HD.475) ] >> +1890 0 obj +<< /Names [ (HD.426) 816 0 R (HD.427) 817 0 R (HD.428) 818 0 R (HD.429) 819 0 R (HD.43) 400 0 R (HD.430) 820 0 R (HD.431) 821 0 R (HD.432) 822 0 R (HD.433) 823 0 R (HD.434) 824 0 R (HD.435) 825 0 R (HD.436) 826 0 R (HD.437) 827 0 R (HD.438) 828 0 R (HD.439) 829 0 R (HD.44) 401 0 R (HD.440) 830 0 R (HD.441) 831 0 R (HD.442) 832 0 R (HD.443) 833 0 R (HD.444) 834 0 R (HD.445) 835 0 R (HD.446) 836 0 R (HD.447) 837 0 R (HD.448) 838 0 R (HD.449) 839 0 R (HD.45) 402 0 R (HD.450) 840 0 R (HD.451) 841 0 R (HD.452) 842 0 R (HD.453) 843 0 R (HD.454) 844 0 R ] /Limits [ (HD.426) (HD.454) ] >> endobj -1866 0 obj -<< /Names [ (HD.476) 869 0 R (HD.477) 870 0 R (HD.478) 871 0 R (HD.479) 872 0 R (HD.48) 404 0 R (HD.480) 873 0 R (HD.481) 874 0 R (HD.482) 875 0 R (HD.483) 876 0 R (HD.484) 877 0 R (HD.485) 878 0 R (HD.486) 879 0 R (HD.487) 880 0 R (HD.488) 881 0 R (HD.489) 882 0 R (HD.49) 405 0 R (HD.490) 883 0 R (HD.491) 884 0 R (HD.492) 885 0 R (HD.493) 886 0 R (HD.494) 887 0 R (HD.495) 888 0 R (HD.496) 889 0 R (HD.497) 890 0 R (HD.498) 891 0 R (HD.499) 892 0 R (HD.5) 357 0 R (HD.50) 406 0 R (HD.500) 893 0 R (HD.501) 894 0 R (HD.502) 895 0 R (HD.503) 896 0 R ] /Limits [ (HD.476) (HD.503) ] >> +1891 0 obj +<< /Names [ (HD.455) 845 0 R (HD.456) 846 0 R (HD.457) 847 0 R (HD.458) 848 0 R (HD.459) 849 0 R (HD.46) 403 0 R (HD.460) 850 0 R (HD.461) 851 0 R (HD.462) 852 0 R (HD.463) 853 0 R (HD.464) 854 0 R (HD.465) 855 0 R (HD.466) 856 0 R (HD.467) 857 0 R (HD.468) 858 0 R (HD.469) 859 0 R (HD.47) 404 0 R (HD.470) 864 0 R (HD.471) 865 0 R (HD.472) 866 0 R (HD.473) 867 0 R (HD.474) 868 0 R (HD.475) 869 0 R (HD.476) 870 0 R (HD.477) 871 0 R (HD.478) 872 0 R (HD.479) 873 0 R (HD.48) 405 0 R (HD.480) 874 0 R (HD.481) 875 0 R (HD.482) 876 0 R (HD.483) 877 0 R ] /Limits [ (HD.455) (HD.483) ] >> endobj -1867 0 obj -<< /Names [ (HD.504) 897 0 R (HD.505) 898 0 R (HD.506) 899 0 R (HD.507) 900 0 R (HD.508) 901 0 R (HD.509) 902 0 R (HD.51) 407 0 R (HD.510) 903 0 R (HD.511) 904 0 R (HD.512) 905 0 R (HD.513) 906 0 R (HD.514) 907 0 R (HD.515) 908 0 R (HD.516) 909 0 R (HD.517) 910 0 R (HD.518) 911 0 R (HD.519) 912 0 R (HD.52) 408 0 R (HD.520) 917 0 R (HD.521) 918 0 R (HD.522) 919 0 R (HD.523) 920 0 R (HD.524) 921 0 R (HD.525) 922 0 R (HD.526) 923 0 R (HD.527) 924 0 R (HD.528) 925 0 R (HD.529) 926 0 R (HD.53) 409 0 R (HD.530) 927 0 R (HD.531) 928 0 R (HD.532) 929 0 R ] /Limits [ (HD.504) (HD.532) ] >> +1892 0 obj +<< /Names [ (HD.484) 878 0 R (HD.485) 879 0 R (HD.486) 880 0 R (HD.487) 881 0 R (HD.488) 882 0 R (HD.489) 883 0 R (HD.49) 406 0 R (HD.490) 884 0 R (HD.491) 885 0 R (HD.492) 886 0 R (HD.493) 887 0 R (HD.494) 888 0 R (HD.495) 889 0 R (HD.496) 890 0 R (HD.497) 891 0 R (HD.498) 892 0 R (HD.499) 893 0 R (HD.5) 358 0 R (HD.50) 407 0 R (HD.500) 894 0 R (HD.501) 895 0 R (HD.502) 896 0 R (HD.503) 897 0 R (HD.504) 898 0 R (HD.505) 899 0 R (HD.506) 900 0 R (HD.507) 901 0 R (HD.508) 902 0 R (HD.509) 903 0 R (HD.51) 408 0 R (HD.510) 904 0 R (HD.511) 905 0 R ] /Limits [ (HD.484) (HD.511) ] >> endobj -1868 0 obj -<< /Names [ (HD.533) 930 0 R (HD.534) 931 0 R (HD.535) 932 0 R (HD.536) 933 0 R (HD.537) 934 0 R (HD.538) 935 0 R (HD.539) 936 0 R (HD.54) 410 0 R (HD.540) 937 0 R (HD.541) 938 0 R (HD.542) 939 0 R (HD.543) 940 0 R (HD.544) 941 0 R (HD.545) 942 0 R (HD.546) 943 0 R (HD.547) 944 0 R (HD.548) 945 0 R (HD.549) 946 0 R (HD.55) 411 0 R (HD.550) 947 0 R (HD.551) 948 0 R (HD.552) 949 0 R (HD.553) 950 0 R (HD.554) 951 0 R (HD.555) 952 0 R (HD.556) 953 0 R (HD.557) 954 0 R (HD.558) 955 0 R (HD.559) 956 0 R (HD.56) 412 0 R (HD.560) 957 0 R (HD.561) 958 0 R ] /Limits [ (HD.533) (HD.561) ] >> +1893 0 obj +<< /Names [ (HD.512) 906 0 R (HD.513) 907 0 R (HD.514) 908 0 R (HD.515) 909 0 R (HD.516) 910 0 R (HD.517) 911 0 R (HD.518) 912 0 R (HD.519) 913 0 R (HD.52) 409 0 R (HD.520) 914 0 R (HD.521) 915 0 R (HD.522) 916 0 R (HD.523) 921 0 R (HD.524) 922 0 R (HD.525) 923 0 R (HD.526) 924 0 R (HD.527) 925 0 R (HD.528) 926 0 R (HD.529) 927 0 R (HD.53) 410 0 R (HD.530) 928 0 R (HD.531) 929 0 R (HD.532) 930 0 R (HD.533) 931 0 R (HD.534) 932 0 R (HD.535) 933 0 R (HD.536) 934 0 R (HD.537) 935 0 R (HD.538) 936 0 R (HD.539) 937 0 R (HD.54) 411 0 R (HD.540) 938 0 R ] /Limits [ (HD.512) (HD.540) ] >> endobj -1869 0 obj -<< /Names [ (HD.562) 959 0 R (HD.563) 960 0 R (HD.564) 961 0 R (HD.565) 966 0 R (HD.566) 967 0 R (HD.567) 968 0 R (HD.568) 969 0 R (HD.569) 970 0 R (HD.57) 413 0 R (HD.570) 971 0 R (HD.571) 972 0 R (HD.572) 973 0 R (HD.573) 974 0 R (HD.574) 975 0 R (HD.575) 976 0 R (HD.576) 977 0 R (HD.577) 978 0 R (HD.578) 979 0 R (HD.579) 980 0 R (HD.58) 414 0 R (HD.580) 981 0 R (HD.581) 982 0 R (HD.582) 983 0 R (HD.583) 984 0 R (HD.584) 985 0 R (HD.585) 986 0 R (HD.586) 987 0 R (HD.587) 988 0 R (HD.588) 989 0 R (HD.589) 990 0 R (HD.59) 415 0 R (HD.590) 991 0 R ] /Limits [ (HD.562) (HD.590) ] >> +1894 0 obj +<< /Names [ (HD.541) 939 0 R (HD.542) 940 0 R (HD.543) 941 0 R (HD.544) 942 0 R (HD.545) 943 0 R (HD.546) 944 0 R (HD.547) 945 0 R (HD.548) 946 0 R (HD.549) 947 0 R (HD.55) 412 0 R (HD.550) 948 0 R (HD.551) 949 0 R (HD.552) 950 0 R (HD.553) 951 0 R (HD.554) 952 0 R (HD.555) 953 0 R (HD.556) 954 0 R (HD.557) 955 0 R (HD.558) 956 0 R (HD.559) 957 0 R (HD.56) 413 0 R (HD.560) 958 0 R (HD.561) 959 0 R (HD.562) 960 0 R (HD.563) 961 0 R (HD.564) 962 0 R (HD.565) 963 0 R (HD.566) 964 0 R (HD.567) 965 0 R (HD.568) 970 0 R (HD.569) 971 0 R (HD.57) 414 0 R ] /Limits [ (HD.541) (HD.57) ] >> endobj -1870 0 obj -<< /Names [ (HD.591) 992 0 R (HD.592) 993 0 R (HD.593) 994 0 R (HD.594) 995 0 R (HD.595) 996 0 R (HD.596) 997 0 R (HD.597) 998 0 R (HD.598) 999 0 R (HD.599) 1000 0 R (HD.6) 358 0 R (HD.60) 416 0 R (HD.600) 1001 0 R (HD.601) 1002 0 R (HD.602) 1003 0 R (HD.603) 1004 0 R (HD.604) 1005 0 R (HD.605) 1006 0 R (HD.606) 1007 0 R (HD.607) 1008 0 R (HD.608) 1009 0 R (HD.609) 1010 0 R (HD.61) 417 0 R (HD.610) 1011 0 R (HD.611) 1012 0 R (HD.612) 1013 0 R (HD.613) 1014 0 R (HD.614) 1015 0 R (HD.615) 1016 0 R (HD.616) 1017 0 R (HD.617) 1018 0 R (HD.618) 1019 0 R (HD.619) 1020 0 R ] /Limits [ (HD.591) (HD.619) ] >> +1895 0 obj +<< /Names [ (HD.570) 972 0 R (HD.571) 973 0 R (HD.572) 974 0 R (HD.573) 975 0 R (HD.574) 976 0 R (HD.575) 977 0 R (HD.576) 978 0 R (HD.577) 979 0 R (HD.578) 980 0 R (HD.579) 981 0 R (HD.58) 415 0 R (HD.580) 982 0 R (HD.581) 983 0 R (HD.582) 984 0 R (HD.583) 985 0 R (HD.584) 986 0 R (HD.585) 987 0 R (HD.586) 988 0 R (HD.587) 989 0 R (HD.588) 990 0 R (HD.589) 991 0 R (HD.59) 416 0 R (HD.590) 992 0 R (HD.591) 993 0 R (HD.592) 994 0 R (HD.593) 995 0 R (HD.594) 996 0 R (HD.595) 997 0 R (HD.596) 998 0 R (HD.597) 999 0 R (HD.598) 1000 0 R (HD.599) 1001 0 R ] /Limits [ (HD.570) (HD.599) ] >> endobj -1871 0 obj -<< /Names [ (HD.62) 418 0 R (HD.620) 1025 0 R (HD.621) 1026 0 R (HD.622) 1027 0 R (HD.623) 1028 0 R (HD.624) 1029 0 R (HD.625) 1030 0 R (HD.626) 1031 0 R (HD.627) 1032 0 R (HD.628) 1033 0 R (HD.629) 1034 0 R (HD.63) 419 0 R (HD.630) 1035 0 R (HD.631) 1036 0 R (HD.632) 1037 0 R (HD.633) 1038 0 R (HD.634) 1039 0 R (HD.635) 1040 0 R (HD.636) 1041 0 R (HD.637) 1042 0 R (HD.638) 1043 0 R (HD.639) 1044 0 R (HD.64) 420 0 R (HD.640) 1045 0 R (HD.641) 1046 0 R (HD.642) 1047 0 R (HD.643) 1048 0 R (HD.644) 1049 0 R (HD.645) 1050 0 R (HD.646) 1051 0 R (HD.647) 1052 0 R (HD.648) 1053 0 R ] /Limits [ (HD.62) (HD.648) ] >> +1896 0 obj +<< /Names [ (HD.6) 359 0 R (HD.60) 417 0 R (HD.600) 1002 0 R (HD.601) 1003 0 R (HD.602) 1004 0 R (HD.603) 1005 0 R (HD.604) 1006 0 R (HD.605) 1007 0 R (HD.606) 1008 0 R (HD.607) 1009 0 R (HD.608) 1010 0 R (HD.609) 1011 0 R (HD.61) 418 0 R (HD.610) 1012 0 R (HD.611) 1013 0 R (HD.612) 1014 0 R (HD.613) 1015 0 R (HD.614) 1016 0 R (HD.615) 1017 0 R (HD.616) 1018 0 R (HD.617) 1019 0 R (HD.618) 1020 0 R (HD.619) 1021 0 R (HD.62) 419 0 R (HD.620) 1022 0 R (HD.621) 1023 0 R (HD.622) 1024 0 R (HD.623) 1029 0 R (HD.624) 1030 0 R (HD.625) 1031 0 R (HD.626) 1032 0 R (HD.627) 1033 0 R ] /Limits [ (HD.6) (HD.627) ] >> endobj -1872 0 obj -<< /Names [ (HD.649) 1054 0 R (HD.65) 421 0 R (HD.650) 1055 0 R (HD.651) 1056 0 R (HD.652) 1057 0 R (HD.653) 1058 0 R (HD.654) 1059 0 R (HD.655) 1060 0 R (HD.656) 1061 0 R (HD.657) 1062 0 R (HD.658) 1063 0 R (HD.659) 1069 0 R (HD.66) 422 0 R (HD.660) 1070 0 R (HD.661) 1071 0 R (HD.662) 1072 0 R (HD.663) 1073 0 R (HD.664) 1074 0 R (HD.665) 1075 0 R (HD.666) 1076 0 R (HD.667) 1077 0 R (HD.668) 1078 0 R (HD.669) 1079 0 R (HD.67) 423 0 R (HD.670) 1080 0 R (HD.671) 1081 0 R (HD.672) 1082 0 R (HD.673) 1083 0 R (HD.674) 1084 0 R (HD.675) 1085 0 R (HD.676) 1086 0 R (HD.677) 1087 0 R ] /Limits [ (HD.649) (HD.677) ] >> +1897 0 obj +<< /Names [ (HD.628) 1034 0 R (HD.629) 1035 0 R (HD.63) 420 0 R (HD.630) 1036 0 R (HD.631) 1037 0 R (HD.632) 1038 0 R (HD.633) 1039 0 R (HD.634) 1040 0 R (HD.635) 1041 0 R (HD.636) 1042 0 R (HD.637) 1043 0 R (HD.638) 1044 0 R (HD.639) 1045 0 R (HD.64) 421 0 R (HD.640) 1046 0 R (HD.641) 1047 0 R (HD.642) 1048 0 R (HD.643) 1049 0 R (HD.644) 1050 0 R (HD.645) 1051 0 R (HD.646) 1052 0 R (HD.647) 1053 0 R (HD.648) 1054 0 R (HD.649) 1055 0 R (HD.65) 422 0 R (HD.650) 1056 0 R (HD.651) 1057 0 R (HD.652) 1058 0 R (HD.653) 1059 0 R (HD.654) 1060 0 R (HD.655) 1061 0 R (HD.656) 1062 0 R ] /Limits [ (HD.628) (HD.656) ] >> endobj -1873 0 obj -<< /Names [ (HD.678) 1088 0 R (HD.679) 1089 0 R (HD.68) 424 0 R (HD.680) 1090 0 R (HD.681) 1091 0 R (HD.682) 1092 0 R (HD.683) 1100 0 R (HD.684) 1101 0 R (HD.685) 1102 0 R (HD.686) 1103 0 R (HD.687) 1104 0 R (HD.688) 1105 0 R (HD.689) 1106 0 R (HD.69) 425 0 R (HD.690) 1107 0 R (HD.691) 1108 0 R (HD.692) 1109 0 R (HD.693) 1110 0 R (HD.694) 1111 0 R (HD.695) 1112 0 R (HD.696) 1113 0 R (HD.697) 1114 0 R (HD.698) 1115 0 R (HD.699) 1116 0 R (HD.7) 359 0 R (HD.70) 426 0 R (HD.700) 1117 0 R (HD.701) 1118 0 R (HD.702) 1119 0 R (HD.703) 1120 0 R (HD.704) 1121 0 R (HD.705) 1122 0 R ] /Limits [ (HD.678) (HD.705) ] >> +1898 0 obj +<< /Names [ (HD.657) 1063 0 R (HD.658) 1064 0 R (HD.659) 1065 0 R (HD.66) 423 0 R (HD.660) 1066 0 R (HD.661) 1072 0 R (HD.662) 1073 0 R (HD.663) 1074 0 R (HD.664) 1075 0 R (HD.665) 1076 0 R (HD.666) 1077 0 R (HD.667) 1078 0 R (HD.668) 1079 0 R (HD.669) 1080 0 R (HD.67) 424 0 R (HD.670) 1081 0 R (HD.671) 1082 0 R (HD.672) 1083 0 R (HD.673) 1084 0 R (HD.674) 1085 0 R (HD.675) 1086 0 R (HD.676) 1087 0 R (HD.677) 1088 0 R (HD.678) 1089 0 R (HD.679) 1090 0 R (HD.68) 425 0 R (HD.680) 1091 0 R (HD.681) 1092 0 R (HD.682) 1093 0 R (HD.683) 1094 0 R (HD.684) 1102 0 R (HD.685) 1103 0 R ] /Limits [ (HD.657) (HD.685) ] >> endobj -1874 0 obj -<< /Names [ (HD.706) 1123 0 R (HD.707) 1124 0 R (HD.708) 1125 0 R (HD.709) 1126 0 R (HD.71) 427 0 R (HD.710) 1127 0 R (HD.711) 1128 0 R (HD.712) 1137 0 R (HD.713) 1138 0 R (HD.714) 1139 0 R (HD.715) 1140 0 R (HD.716) 1141 0 R (HD.717) 1142 0 R (HD.718) 1143 0 R (HD.719) 1144 0 R (HD.72) 428 0 R (HD.720) 1145 0 R (HD.721) 1146 0 R (HD.722) 1147 0 R (HD.723) 1148 0 R (HD.724) 1149 0 R (HD.725) 1150 0 R (HD.726) 1151 0 R (HD.727) 1152 0 R (HD.728) 1153 0 R (HD.729) 1154 0 R (HD.73) 429 0 R (HD.730) 1155 0 R (HD.731) 1156 0 R (HD.732) 1157 0 R (HD.733) 1158 0 R (HD.734) 1159 0 R ] /Limits [ (HD.706) (HD.734) ] >> +1899 0 obj +<< /Names [ (HD.686) 1104 0 R (HD.687) 1105 0 R (HD.688) 1106 0 R (HD.689) 1107 0 R (HD.69) 426 0 R (HD.690) 1108 0 R (HD.691) 1109 0 R (HD.692) 1110 0 R (HD.693) 1111 0 R (HD.694) 1112 0 R (HD.695) 1113 0 R (HD.696) 1114 0 R (HD.697) 1115 0 R (HD.698) 1116 0 R (HD.699) 1117 0 R (HD.7) 360 0 R (HD.70) 427 0 R (HD.700) 1118 0 R (HD.701) 1119 0 R (HD.702) 1120 0 R (HD.703) 1121 0 R (HD.704) 1122 0 R (HD.705) 1123 0 R (HD.706) 1124 0 R (HD.707) 1125 0 R (HD.708) 1126 0 R (HD.709) 1127 0 R (HD.71) 428 0 R (HD.710) 1128 0 R (HD.711) 1129 0 R (HD.712) 1130 0 R (HD.713) 1139 0 R ] /Limits [ (HD.686) (HD.713) ] >> endobj -1875 0 obj -<< /Names [ (HD.735) 1160 0 R (HD.736) 1161 0 R (HD.737) 1162 0 R (HD.738) 1163 0 R (HD.739) 1164 0 R (HD.74) 430 0 R (HD.740) 1165 0 R (HD.741) 1166 0 R (HD.742) 1167 0 R (HD.743) 1168 0 R (HD.744) 1169 0 R (HD.745) 1170 0 R (HD.746) 1171 0 R (HD.747) 1172 0 R (HD.748) 1173 0 R (HD.749) 1174 0 R (HD.75) 431 0 R (HD.750) 1175 0 R (HD.751) 1176 0 R (HD.752) 1177 0 R (HD.753) 1178 0 R (HD.754) 1179 0 R (HD.755) 1180 0 R (HD.756) 1181 0 R (HD.757) 1182 0 R (HD.758) 1183 0 R (HD.759) 1184 0 R (HD.76) 432 0 R (HD.760) 1185 0 R (HD.761) 1186 0 R (HD.762) 1193 0 R (HD.763) 1194 0 R ] /Limits [ (HD.735) (HD.763) ] >> +1900 0 obj +<< /Names [ (HD.714) 1140 0 R (HD.715) 1141 0 R (HD.716) 1142 0 R (HD.717) 1143 0 R (HD.718) 1144 0 R (HD.719) 1145 0 R (HD.72) 429 0 R (HD.720) 1146 0 R (HD.721) 1147 0 R (HD.722) 1148 0 R (HD.723) 1149 0 R (HD.724) 1150 0 R (HD.725) 1151 0 R (HD.726) 1152 0 R (HD.727) 1153 0 R (HD.728) 1154 0 R (HD.729) 1155 0 R (HD.73) 430 0 R (HD.730) 1156 0 R (HD.731) 1157 0 R (HD.732) 1158 0 R (HD.733) 1159 0 R (HD.734) 1160 0 R (HD.735) 1161 0 R (HD.736) 1162 0 R (HD.737) 1163 0 R (HD.738) 1164 0 R (HD.739) 1165 0 R (HD.74) 431 0 R (HD.740) 1166 0 R (HD.741) 1167 0 R (HD.742) 1168 0 R ] /Limits [ (HD.714) (HD.742) ] >> endobj -1876 0 obj -<< /Names [ (HD.764) 1195 0 R (HD.765) 1196 0 R (HD.766) 1197 0 R (HD.767) 1198 0 R (HD.768) 1199 0 R (HD.769) 1200 0 R (HD.77) 433 0 R (HD.770) 1201 0 R (HD.771) 1202 0 R (HD.772) 1203 0 R (HD.773) 1204 0 R (HD.774) 1205 0 R (HD.775) 1206 0 R (HD.776) 1207 0 R (HD.777) 1208 0 R (HD.778) 1209 0 R (HD.779) 1210 0 R (HD.78) 434 0 R (HD.780) 1211 0 R (HD.781) 1212 0 R (HD.782) 1213 0 R (HD.783) 1214 0 R (HD.784) 1215 0 R (HD.785) 1216 0 R (HD.786) 1217 0 R (HD.787) 1218 0 R (HD.788) 1219 0 R (HD.789) 1220 0 R (HD.79) 435 0 R (HD.790) 1221 0 R (HD.791) 1222 0 R (HD.792) 1223 0 R ] /Limits [ (HD.764) (HD.792) ] >> +1901 0 obj +<< /Names [ (HD.743) 1169 0 R (HD.744) 1170 0 R (HD.745) 1171 0 R (HD.746) 1172 0 R (HD.747) 1173 0 R (HD.748) 1174 0 R (HD.749) 1175 0 R (HD.75) 432 0 R (HD.750) 1176 0 R (HD.751) 1177 0 R (HD.752) 1178 0 R (HD.753) 1179 0 R (HD.754) 1180 0 R (HD.755) 1181 0 R (HD.756) 1182 0 R (HD.757) 1183 0 R (HD.758) 1184 0 R (HD.759) 1185 0 R (HD.76) 433 0 R (HD.760) 1192 0 R (HD.761) 1193 0 R (HD.762) 1194 0 R (HD.763) 1195 0 R (HD.764) 1196 0 R (HD.765) 1197 0 R (HD.766) 1198 0 R (HD.767) 1199 0 R (HD.768) 1200 0 R (HD.769) 1201 0 R (HD.77) 434 0 R (HD.770) 1202 0 R (HD.771) 1203 0 R ] /Limits [ (HD.743) (HD.771) ] >> endobj -1877 0 obj -<< /Names [ (HD.793) 1224 0 R (HD.794) 1225 0 R (HD.795) 1226 0 R (HD.796) 1227 0 R (HD.797) 1228 0 R (HD.798) 1229 0 R (HD.799) 1235 0 R (HD.8) 360 0 R (HD.80) 436 0 R (HD.800) 1236 0 R (HD.801) 1237 0 R (HD.802) 1238 0 R (HD.803) 1240 0 R (HD.804) 1241 0 R (HD.805) 1242 0 R (HD.806) 1243 0 R (HD.807) 1244 0 R (HD.808) 1245 0 R (HD.809) 1246 0 R (HD.81) 437 0 R (HD.810) 1247 0 R (HD.811) 1248 0 R (HD.812) 1249 0 R (HD.813) 1250 0 R (HD.814) 1251 0 R (HD.815) 1252 0 R (HD.816) 1253 0 R (HD.817) 1254 0 R (HD.818) 1255 0 R (HD.819) 1256 0 R (HD.82) 438 0 R (HD.820) 1257 0 R ] /Limits [ (HD.793) (HD.820) ] >> +1902 0 obj +<< /Names [ (HD.772) 1204 0 R (HD.773) 1205 0 R (HD.774) 1206 0 R (HD.775) 1207 0 R (HD.776) 1208 0 R (HD.777) 1209 0 R (HD.778) 1210 0 R (HD.779) 1211 0 R (HD.78) 435 0 R (HD.780) 1212 0 R (HD.781) 1213 0 R (HD.782) 1214 0 R (HD.783) 1215 0 R (HD.784) 1216 0 R (HD.785) 1217 0 R (HD.786) 1218 0 R (HD.787) 1219 0 R (HD.788) 1220 0 R (HD.789) 1221 0 R (HD.79) 436 0 R (HD.790) 1222 0 R (HD.791) 1223 0 R (HD.792) 1224 0 R (HD.793) 1225 0 R (HD.794) 1226 0 R (HD.795) 1227 0 R (HD.796) 1228 0 R (HD.797) 1229 0 R (HD.798) 1230 0 R (HD.799) 1231 0 R (HD.8) 361 0 R (HD.80) 437 0 R ] /Limits [ (HD.772) (HD.80) ] >> endobj -1878 0 obj -<< /Names [ (HD.821) 1258 0 R (HD.822) 1259 0 R (HD.823) 1260 0 R (HD.824) 1261 0 R (HD.825) 1262 0 R (HD.826) 1263 0 R (HD.827) 1264 0 R (HD.828) 1265 0 R (HD.829) 1266 0 R (HD.83) 439 0 R (HD.830) 1274 0 R (HD.831) 1275 0 R (HD.832) 1276 0 R (HD.833) 1277 0 R (HD.834) 1278 0 R (HD.835) 1279 0 R (HD.836) 1280 0 R (HD.837) 1281 0 R (HD.838) 1282 0 R (HD.839) 1283 0 R (HD.84) 440 0 R (HD.840) 1284 0 R (HD.841) 1285 0 R (HD.842) 1286 0 R (HD.843) 1287 0 R (HD.844) 1288 0 R (HD.845) 1289 0 R (HD.846) 1290 0 R (HD.847) 1291 0 R (HD.848) 1292 0 R (HD.849) 1293 0 R (HD.85) 441 0 R ] /Limits [ (HD.821) (HD.85) ] >> +1903 0 obj +<< /Names [ (HD.800) 1232 0 R (HD.801) 1233 0 R (HD.802) 1234 0 R (HD.803) 1240 0 R (HD.804) 1241 0 R (HD.805) 1242 0 R (HD.806) 1243 0 R (HD.807) 1244 0 R (HD.808) 1245 0 R (HD.809) 1247 0 R (HD.81) 438 0 R (HD.810) 1248 0 R (HD.811) 1249 0 R (HD.812) 1250 0 R (HD.813) 1251 0 R (HD.814) 1252 0 R (HD.815) 1253 0 R (HD.816) 1254 0 R (HD.817) 1255 0 R (HD.818) 1256 0 R (HD.819) 1257 0 R (HD.82) 439 0 R (HD.820) 1258 0 R (HD.821) 1259 0 R (HD.822) 1260 0 R (HD.823) 1261 0 R (HD.824) 1262 0 R (HD.825) 1263 0 R (HD.826) 1264 0 R (HD.827) 1265 0 R (HD.828) 1266 0 R (HD.829) 1267 0 R ] /Limits [ (HD.800) (HD.829) ] >> endobj -1879 0 obj -<< /Names [ (HD.850) 1294 0 R (HD.851) 1295 0 R (HD.852) 1296 0 R (HD.853) 1297 0 R (HD.854) 1298 0 R (HD.855) 1299 0 R (HD.856) 1300 0 R (HD.857) 1301 0 R (HD.858) 1302 0 R (HD.859) 1303 0 R (HD.86) 442 0 R (HD.860) 1304 0 R (HD.861) 1305 0 R (HD.862) 1306 0 R (HD.863) 1307 0 R (HD.864) 1308 0 R (HD.865) 1309 0 R (HD.866) 1310 0 R (HD.867) 1311 0 R (HD.868) 1312 0 R (HD.869) 1313 0 R (HD.87) 443 0 R (HD.870) 1314 0 R (HD.871) 1315 0 R (HD.872) 1316 0 R (HD.873) 1317 0 R (HD.874) 1318 0 R (HD.875) 1319 0 R (HD.876) 1320 0 R (HD.877) 1321 0 R (HD.878) 1322 0 R (HD.879) 1329 0 R ] /Limits [ (HD.850) (HD.879) ] >> +1904 0 obj +<< /Names [ (HD.83) 440 0 R (HD.830) 1268 0 R (HD.831) 1269 0 R (HD.832) 1277 0 R (HD.833) 1278 0 R (HD.834) 1279 0 R (HD.835) 1280 0 R (HD.836) 1281 0 R (HD.837) 1282 0 R (HD.838) 1283 0 R (HD.839) 1284 0 R (HD.84) 441 0 R (HD.840) 1285 0 R (HD.841) 1286 0 R (HD.842) 1287 0 R (HD.843) 1288 0 R (HD.844) 1289 0 R (HD.845) 1290 0 R (HD.846) 1291 0 R (HD.847) 1292 0 R (HD.848) 1293 0 R (HD.849) 1294 0 R (HD.85) 442 0 R (HD.850) 1295 0 R (HD.851) 1296 0 R (HD.852) 1297 0 R (HD.853) 1298 0 R (HD.854) 1299 0 R (HD.855) 1300 0 R (HD.856) 1301 0 R (HD.857) 1302 0 R (HD.858) 1303 0 R ] /Limits [ (HD.83) (HD.858) ] >> endobj -1880 0 obj -<< /Names [ (HD.88) 444 0 R (HD.880) 1330 0 R (HD.881) 1331 0 R (HD.882) 1332 0 R (HD.883) 1333 0 R (HD.884) 1334 0 R (HD.885) 1335 0 R (HD.886) 1336 0 R (HD.887) 1337 0 R (HD.888) 1338 0 R (HD.889) 1339 0 R (HD.89) 445 0 R (HD.890) 1340 0 R (HD.891) 1341 0 R (HD.892) 1342 0 R (HD.893) 1343 0 R (HD.894) 1344 0 R (HD.895) 1345 0 R (HD.896) 1346 0 R (HD.897) 1347 0 R (HD.898) 1348 0 R (HD.899) 1349 0 R (HD.9) 361 0 R (HD.90) 446 0 R (HD.900) 1350 0 R (HD.901) 1351 0 R (HD.902) 1352 0 R (HD.903) 1353 0 R (HD.904) 1354 0 R (HD.905) 1355 0 R (HD.906) 1356 0 R (HD.907) 1357 0 R ] /Limits [ (HD.88) (HD.907) ] >> +1905 0 obj +<< /Names [ (HD.859) 1304 0 R (HD.86) 443 0 R (HD.860) 1305 0 R (HD.861) 1306 0 R (HD.862) 1307 0 R (HD.863) 1308 0 R (HD.864) 1309 0 R (HD.865) 1310 0 R (HD.866) 1311 0 R (HD.867) 1312 0 R (HD.868) 1313 0 R (HD.869) 1314 0 R (HD.87) 444 0 R (HD.870) 1315 0 R (HD.871) 1316 0 R (HD.872) 1317 0 R (HD.873) 1324 0 R (HD.874) 1325 0 R (HD.875) 1326 0 R (HD.876) 1327 0 R (HD.877) 1328 0 R (HD.878) 1329 0 R (HD.879) 1330 0 R (HD.88) 445 0 R (HD.880) 1331 0 R (HD.881) 1332 0 R (HD.882) 1333 0 R (HD.883) 1334 0 R (HD.884) 1335 0 R (HD.885) 1336 0 R (HD.886) 1337 0 R (HD.887) 1338 0 R ] /Limits [ (HD.859) (HD.887) ] >> endobj -1881 0 obj -<< /Names [ (HD.908) 1358 0 R (HD.909) 1359 0 R (HD.91) 451 0 R (HD.910) 1360 0 R (HD.911) 1361 0 R (HD.912) 1362 0 R (HD.913) 1363 0 R (HD.914) 1364 0 R (HD.915) 1365 0 R (HD.916) 1366 0 R (HD.917) 1367 0 R (HD.918) 1368 0 R (HD.919) 1369 0 R (HD.92) 452 0 R (HD.920) 1370 0 R (HD.921) 1371 0 R (HD.922) 1372 0 R (HD.923) 1373 0 R (HD.924) 1374 0 R (HD.925) 1375 0 R (HD.926) 1376 0 R (HD.927) 1377 0 R (HD.928) 1378 0 R (HD.929) 1379 0 R (HD.93) 453 0 R (HD.930) 1380 0 R (HD.931) 1381 0 R (HD.932) 1382 0 R (HD.933) 1383 0 R (HD.934) 1384 0 R (HD.935) 1385 0 R (HD.936) 1386 0 R ] /Limits [ (HD.908) (HD.936) ] >> +1906 0 obj +<< /Names [ (HD.888) 1339 0 R (HD.889) 1340 0 R (HD.89) 446 0 R (HD.890) 1341 0 R (HD.891) 1342 0 R (HD.892) 1343 0 R (HD.893) 1344 0 R (HD.894) 1345 0 R (HD.895) 1346 0 R (HD.896) 1347 0 R (HD.897) 1348 0 R (HD.898) 1349 0 R (HD.899) 1350 0 R (HD.9) 362 0 R (HD.90) 447 0 R (HD.900) 1351 0 R (HD.901) 1352 0 R (HD.902) 1353 0 R (HD.903) 1354 0 R (HD.904) 1355 0 R (HD.905) 1356 0 R (HD.906) 1357 0 R (HD.907) 1358 0 R (HD.908) 1359 0 R (HD.909) 1360 0 R (HD.91) 452 0 R (HD.910) 1361 0 R (HD.911) 1362 0 R (HD.912) 1363 0 R (HD.913) 1364 0 R (HD.914) 1365 0 R (HD.915) 1366 0 R ] /Limits [ (HD.888) (HD.915) ] >> endobj -1882 0 obj -<< /Names [ (HD.937) 1387 0 R (HD.938) 1388 0 R (HD.939) 1393 0 R (HD.94) 454 0 R (HD.940) 1394 0 R (HD.941) 1395 0 R (HD.942) 1396 0 R (HD.943) 1397 0 R (HD.944) 1398 0 R (HD.945) 1399 0 R (HD.946) 1400 0 R (HD.947) 1401 0 R (HD.948) 1402 0 R (HD.949) 1403 0 R (HD.95) 455 0 R (HD.950) 1404 0 R (HD.951) 1405 0 R (HD.952) 1406 0 R (HD.953) 1408 0 R (HD.954) 1409 0 R (HD.955) 1410 0 R (HD.956) 1411 0 R (HD.957) 1412 0 R (HD.958) 1413 0 R (HD.959) 1414 0 R (HD.96) 456 0 R (HD.960) 1415 0 R (HD.961) 1416 0 R (HD.962) 1417 0 R (HD.963) 1418 0 R (HD.964) 1419 0 R (HD.965) 1420 0 R ] /Limits [ (HD.937) (HD.965) ] >> +1907 0 obj +<< /Names [ (HD.916) 1367 0 R (HD.917) 1368 0 R (HD.918) 1369 0 R (HD.919) 1370 0 R (HD.92) 453 0 R (HD.920) 1371 0 R (HD.921) 1372 0 R (HD.922) 1373 0 R (HD.923) 1374 0 R (HD.924) 1375 0 R (HD.925) 1376 0 R (HD.926) 1377 0 R (HD.927) 1378 0 R (HD.928) 1379 0 R (HD.929) 1380 0 R (HD.93) 454 0 R (HD.930) 1381 0 R (HD.931) 1382 0 R (HD.932) 1383 0 R (HD.933) 1388 0 R (HD.934) 1389 0 R (HD.935) 1390 0 R (HD.936) 1391 0 R (HD.937) 1392 0 R (HD.938) 1393 0 R (HD.939) 1394 0 R (HD.94) 455 0 R (HD.940) 1395 0 R (HD.941) 1396 0 R (HD.942) 1397 0 R (HD.943) 1398 0 R (HD.944) 1399 0 R ] /Limits [ (HD.916) (HD.944) ] >> endobj -1883 0 obj -<< /Names [ (HD.966) 1421 0 R (HD.967) 1422 0 R (HD.968) 1424 0 R (HD.969) 1425 0 R (HD.97) 457 0 R (HD.970) 1426 0 R (HD.971) 1427 0 R (HD.972) 1428 0 R (HD.973) 1429 0 R (HD.974) 1430 0 R (HD.975) 1431 0 R (HD.976) 1432 0 R (HD.977) 1433 0 R (HD.978) 1434 0 R (HD.979) 1435 0 R (HD.98) 458 0 R (HD.980) 1436 0 R (HD.981) 1441 0 R (HD.982) 1442 0 R (HD.983) 1443 0 R (HD.984) 1444 0 R (HD.985) 1445 0 R (HD.986) 1446 0 R (HD.987) 1447 0 R (HD.988) 1448 0 R (HD.989) 1449 0 R (HD.99) 459 0 R (HD.990) 1450 0 R (HD.991) 1451 0 R (HD.992) 1452 0 R (HD.993) 1453 0 R (HD.994) 1454 0 R ] /Limits [ (HD.966) (HD.994) ] >> +1908 0 obj +<< /Names [ (HD.945) 1400 0 R (HD.946) 1401 0 R (HD.947) 1402 0 R (HD.948) 1403 0 R (HD.949) 1404 0 R (HD.95) 456 0 R (HD.950) 1405 0 R (HD.951) 1406 0 R (HD.952) 1407 0 R (HD.953) 1408 0 R (HD.954) 1409 0 R (HD.955) 1410 0 R (HD.956) 1411 0 R (HD.957) 1412 0 R (HD.958) 1413 0 R (HD.959) 1415 0 R (HD.96) 457 0 R (HD.960) 1416 0 R (HD.961) 1417 0 R (HD.962) 1418 0 R (HD.963) 1419 0 R (HD.964) 1420 0 R (HD.965) 1421 0 R (HD.966) 1422 0 R (HD.967) 1423 0 R (HD.968) 1424 0 R (HD.969) 1425 0 R (HD.97) 458 0 R (HD.970) 1426 0 R (HD.971) 1427 0 R (HD.972) 1428 0 R (HD.973) 1429 0 R ] /Limits [ (HD.945) (HD.973) ] >> endobj -1884 0 obj -<< /Names [ (HD.995) 1455 0 R (HD.996) 1456 0 R (HD.997) 1457 0 R (HD.998) 1458 0 R (HD.999) 1459 0 R (Hfootnote.1) 213 0 R (Hfootnote.10) 297 0 R (Hfootnote.11) 312 0 R (Hfootnote.12) 313 0 R (Hfootnote.13) 314 0 R (Hfootnote.14) 315 0 R (Hfootnote.15) 316 0 R (Hfootnote.16) 346 0 R (Hfootnote.17) 342 0 R (Hfootnote.18) 343 0 R (Hfootnote.19) 345 0 R (Hfootnote.2) 217 0 R (Hfootnote.20) 1093 0 R (Hfootnote.21) 1129 0 R (Hfootnote.22) 1187 0 R (Hfootnote.23) 1267 0 R (Hfootnote.24) 1323 0 R (Hfootnote.25) 1515 0 R (Hfootnote.3) 239 0 R (Hfootnote.4) 240 0 R (Hfootnote.5) 250 0 R (Hfootnote.6) 251 0 R (Hfootnote.7) 260 0 R (Hfootnote.8) 275 0 R (Hfootnote.9) 296 0 R (page.1) 188 0 R (page.10) 295 0 R ] /Limits [ (HD.995) (page.10) ] >> +1909 0 obj +<< /Names [ (HD.974) 1431 0 R (HD.975) 1436 0 R (HD.976) 1437 0 R (HD.977) 1438 0 R (HD.978) 1439 0 R (HD.979) 1440 0 R (HD.98) 459 0 R (HD.980) 1441 0 R (HD.981) 1442 0 R (HD.982) 1443 0 R (HD.983) 1444 0 R (HD.984) 1445 0 R (HD.985) 1446 0 R (HD.986) 1447 0 R (HD.987) 1448 0 R (HD.988) 1449 0 R (HD.989) 1450 0 R (HD.99) 460 0 R (HD.990) 1451 0 R (HD.991) 1452 0 R (HD.992) 1453 0 R (HD.993) 1454 0 R (HD.994) 1455 0 R (HD.995) 1456 0 R (HD.996) 1457 0 R (HD.997) 1458 0 R (HD.998) 1459 0 R (HD.999) 1460 0 R (Hfootnote.1) 213 0 R (Hfootnote.10) 297 0 R (Hfootnote.11) 312 0 R (Hfootnote.12) 313 0 R ] /Limits [ (HD.974) (Hfootnote.12) ] >> endobj -1885 0 obj -<< /Names [ (page.11) 310 0 R (page.12) 322 0 R (page.13) 329 0 R (page.14) 333 0 R (page.15) 341 0 R (page.16) 351 0 R (page.17) 392 0 R (page.18) 450 0 R (page.19) 476 0 R (page.2) 226 0 R (page.20) 515 0 R (page.21) 576 0 R (page.22) 630 0 R (page.23) 696 0 R (page.24) 744 0 R (page.25) 800 0 R (page.26) 859 0 R (page.27) 916 0 R (page.28) 965 0 R (page.29) 1024 0 R (page.3) 237 0 R (page.30) 1068 0 R (page.31) 1099 0 R (page.32) 1136 0 R (page.33) 1192 0 R (page.34) 1234 0 R (page.35) 1273 0 R (page.36) 1328 0 R (page.37) 1392 0 R (page.38) 1440 0 R (page.39) 1472 0 R (page.4) 247 0 R ] /Limits [ (page.11) (page.4) ] >> +1910 0 obj +<< /Names [ (Hfootnote.13) 314 0 R (Hfootnote.14) 315 0 R (Hfootnote.15) 325 0 R (Hfootnote.16) 347 0 R (Hfootnote.17) 343 0 R (Hfootnote.18) 344 0 R (Hfootnote.19) 346 0 R (Hfootnote.2) 217 0 R (Hfootnote.20) 1095 0 R (Hfootnote.21) 1131 0 R (Hfootnote.22) 1186 0 R (Hfootnote.23) 1270 0 R (Hfootnote.24) 1318 0 R (Hfootnote.25) 1522 0 R (Hfootnote.3) 239 0 R (Hfootnote.4) 240 0 R (Hfootnote.5) 250 0 R (Hfootnote.6) 251 0 R (Hfootnote.7) 260 0 R (Hfootnote.8) 275 0 R (Hfootnote.9) 296 0 R (page.1) 188 0 R (page.10) 295 0 R (page.11) 310 0 R (page.12) 321 0 R (page.13) 330 0 R (page.14) 334 0 R (page.15) 342 0 R (page.16) 352 0 R (page.17) 393 0 R (page.18) 451 0 R (page.19) 477 0 R ] /Limits [ (Hfootnote.13) (page.19) ] >> endobj -1886 0 obj -<< /Names [ (page.40) 1520 0 R (page.41) 1559 0 R (page.42) 1604 0 R (page.43) 1645 0 R (page.5) 259 0 R (page.6) 268 0 R (page.7) 274 0 R (page.8) 282 0 R (page.9) 287 0 R (section*.10) 1646 0 R (section*.11) 1647 0 R (section*.2) 1239 0 R (section*.3) 1407 0 R (section*.4) 1423 0 R (section*.5) 1473 0 R (section*.6) 1483 0 R (section*.7) 1639 0 R (section*.8) 1640 0 R (section*.9) 1641 0 R (section.0.1) 2 0 R (section.0.2) 6 0 R (section.0.3) 22 0 R (section.0.4) 38 0 R (section.0.5) 78 0 R (section.0.6) 102 0 R (section.0.7) 178 0 R (subsection.0.2.1) 10 0 R (subsection.0.2.2) 14 0 R (subsection.0.2.3) 18 0 R (subsection.0.3.1) 26 0 R (subsection.0.3.2) 30 0 R (subsection.0.3.3) 34 0 R ] /Limits [ (page.40) (subsection.0.3.3) ] >> +1911 0 obj +<< /Names [ (page.2) 226 0 R (page.20) 516 0 R (page.21) 577 0 R (page.22) 631 0 R (page.23) 697 0 R (page.24) 747 0 R (page.25) 804 0 R (page.26) 863 0 R (page.27) 920 0 R (page.28) 969 0 R (page.29) 1028 0 R (page.3) 237 0 R (page.30) 1071 0 R (page.31) 1101 0 R (page.32) 1138 0 R (page.33) 1191 0 R (page.34) 1239 0 R (page.35) 1276 0 R (page.36) 1323 0 R (page.37) 1387 0 R (page.38) 1435 0 R (page.39) 1479 0 R (page.4) 247 0 R (page.40) 1527 0 R (page.41) 1566 0 R (page.42) 1612 0 R (page.43) 1666 0 R (page.5) 259 0 R (page.6) 268 0 R (page.7) 274 0 R (page.8) 282 0 R (page.9) 287 0 R ] /Limits [ (page.2) (page.9) ] >> endobj -1887 0 obj -<< /Names [ (subsection.0.4.1) 42 0 R (subsection.0.4.2) 58 0 R (subsection.0.4.3) 70 0 R (subsection.0.4.4) 74 0 R (subsection.0.5.1) 82 0 R (subsection.0.5.2) 86 0 R (subsection.0.5.3) 90 0 R (subsection.0.5.4) 94 0 R (subsection.0.5.5) 98 0 R (subsection.0.6.1) 106 0 R (subsection.0.6.2) 110 0 R (subsection.0.6.3) 154 0 R (subsubsection.0.4.1.1) 46 0 R (subsubsection.0.4.1.2) 50 0 R (subsubsection.0.4.1.3) 54 0 R (subsubsection.0.4.2.1) 62 0 R (subsubsection.0.4.2.2) 66 0 R (subsubsection.0.6.2.1) 114 0 R (subsubsection.0.6.2.10) 150 0 R (subsubsection.0.6.2.2) 118 0 R (subsubsection.0.6.2.3) 122 0 R (subsubsection.0.6.2.4) 126 0 R (subsubsection.0.6.2.5) 130 0 R (subsubsection.0.6.2.6) 134 0 R (subsubsection.0.6.2.7) 138 0 R (subsubsection.0.6.2.8) 142 0 R (subsubsection.0.6.2.9) 146 0 R (subsubsection.0.6.3.1) 158 0 R (subsubsection.0.6.3.2) 162 0 R (subsubsection.0.6.3.3) 166 0 R (subsubsection.0.6.3.4) 170 0 R (subsubsection.0.6.3.5) 174 0 R ] /Limits [ (subsection.0.4.1) (subsubsection.0.6.3.5) ] >> +1912 0 obj +<< /Names [ (section*.10) 1670 0 R (section*.11) 1671 0 R (section*.12) 1672 0 R (section*.2) 1246 0 R (section*.3) 1414 0 R (section*.4) 1430 0 R (section*.5) 1480 0 R (section*.6) 1490 0 R (section*.7) 1667 0 R (section*.8) 1668 0 R (section*.9) 1669 0 R (section.0.1) 2 0 R (section.0.2) 6 0 R (section.0.3) 22 0 R (section.0.4) 38 0 R (section.0.5) 78 0 R (section.0.6) 102 0 R (section.0.7) 178 0 R (subsection.0.2.1) 10 0 R (subsection.0.2.2) 14 0 R (subsection.0.2.3) 18 0 R (subsection.0.3.1) 26 0 R (subsection.0.3.2) 30 0 R (subsection.0.3.3) 34 0 R (subsection.0.4.1) 42 0 R (subsection.0.4.2) 58 0 R (subsection.0.4.3) 70 0 R (subsection.0.4.4) 74 0 R (subsection.0.5.1) 82 0 R (subsection.0.5.2) 86 0 R (subsection.0.5.3) 90 0 R (subsection.0.5.4) 94 0 R ] /Limits [ (section*.10) (subsection.0.5.4) ] >> endobj -1888 0 obj -<< /Names [ (table.caption.1) 262 0 R ] /Limits [ (table.caption.1) (table.caption.1) ] >> +1913 0 obj +<< /Names [ (subsection.0.5.5) 98 0 R (subsection.0.6.1) 106 0 R (subsection.0.6.2) 110 0 R (subsection.0.6.3) 154 0 R (subsubsection.0.4.1.1) 46 0 R (subsubsection.0.4.1.2) 50 0 R (subsubsection.0.4.1.3) 54 0 R (subsubsection.0.4.2.1) 62 0 R (subsubsection.0.4.2.2) 66 0 R (subsubsection.0.6.2.1) 114 0 R (subsubsection.0.6.2.10) 150 0 R (subsubsection.0.6.2.2) 118 0 R (subsubsection.0.6.2.3) 122 0 R (subsubsection.0.6.2.4) 126 0 R (subsubsection.0.6.2.5) 130 0 R (subsubsection.0.6.2.6) 134 0 R (subsubsection.0.6.2.7) 138 0 R (subsubsection.0.6.2.8) 142 0 R (subsubsection.0.6.2.9) 146 0 R (subsubsection.0.6.3.1) 158 0 R (subsubsection.0.6.3.2) 162 0 R (subsubsection.0.6.3.3) 166 0 R (subsubsection.0.6.3.4) 170 0 R (subsubsection.0.6.3.5) 174 0 R (table.caption.1) 262 0 R ] /Limits [ (subsection.0.5.5) (table.caption.1) ] >> endobj -1889 0 obj -<< /Kids [ 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R ] /Limits [ (Doc-Start) (HD.879) ] >> +1914 0 obj +<< /Kids [ 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R ] /Limits [ (Doc-Start) (HD.858) ] >> endobj -1890 0 obj -<< /Kids [ 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R ] /Limits [ (HD.88) (table.caption.1) ] >> +1915 0 obj +<< /Kids [ 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R ] /Limits [ (HD.859) (table.caption.1) ] >> endobj -1891 0 obj -<< /Kids [ 1889 0 R 1890 0 R ] /Limits [ (Doc-Start) (table.caption.1) ] >> +1916 0 obj +<< /Kids [ 1914 0 R 1915 0 R ] /Limits [ (Doc-Start) (table.caption.1) ] >> endobj -1892 0 obj -<< /Dests 1891 0 R >> +1917 0 obj +<< /Dests 1916 0 R >> endobj -1893 0 obj -<< /Type /Catalog /Pages 1846 0 R /Outlines 1847 0 R /Names 1892 0 R /PageMode/UseOutlines /OpenAction 181 0 R >> +1918 0 obj +<< /Type /Catalog /Pages 1871 0 R /Outlines 1872 0 R /Names 1917 0 R /PageMode/UseOutlines /OpenAction 181 0 R >> endobj -1894 0 obj -<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.15.1) /CreationDate (D:20221129111113+01'00') /ModDate (D:20221129111113+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.15.1 (MiKTeX 22.11.25)) >> +1919 0 obj +<< /Author(\376\377\000F\000.\000\040\000P\000a\000n\000t\000i\000g\000n\000y\000\040\000,\000\040\000f\000p\000a\000n\000t\000i\000g\000n\000y\000@\000w\000a\000n\000a\000d\000o\000o\000.\000f\000r)/Title(\376\377\000T\000h\000e\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000p\000i\000t\000o\000n)/Subject()/Creator(LaTeX with hyperref)/Keywords() /Producer (LuaTeX-1.15.1) /CreationDate (D:20221229200319+01'00') /ModDate (D:20221229200319+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.15.1 (MiKTeX 22.12)) >> endobj xref -0 1895 +0 1920 0000000000 65535 f 0000000020 00000 n -0000015027 00000 n -0000464163 00000 n +0000015028 00000 n +0000465843 00000 n 0000000067 00000 n 0000000167 00000 n -0000020398 00000 n -0000464041 00000 n +0000020399 00000 n +0000465721 00000 n 0000000214 00000 n 0000000353 00000 n -0000020458 00000 n -0000463969 00000 n +0000020459 00000 n +0000465649 00000 n 0000000405 00000 n 0000000557 00000 n -0000020519 00000 n -0000463883 00000 n +0000020520 00000 n +0000465563 00000 n 0000000610 00000 n 0000000826 00000 n -0000020580 00000 n -0000463810 00000 n +0000020581 00000 n +0000465490 00000 n 0000000879 00000 n 0000001108 00000 n -0000026203 00000 n -0000463685 00000 n +0000026204 00000 n +0000465365 00000 n 0000001156 00000 n 0000001262 00000 n -0000026264 00000 n -0000463611 00000 n +0000026265 00000 n +0000465291 00000 n 0000001315 00000 n 0000001500 00000 n -0000031343 00000 n -0000463524 00000 n +0000031344 00000 n +0000465204 00000 n 0000001553 00000 n 0000001657 00000 n -0000036095 00000 n -0000463450 00000 n +0000036096 00000 n +0000465130 00000 n 0000001710 00000 n 0000001910 00000 n -0000036156 00000 n -0000463324 00000 n +0000036157 00000 n +0000465004 00000 n 0000001958 00000 n 0000002087 00000 n -0000036217 00000 n -0000463213 00000 n +0000036218 00000 n +0000464893 00000 n 0000002140 00000 n 0000002348 00000 n -0000040507 00000 n -0000463139 00000 n +0000040508 00000 n +0000464819 00000 n 0000002406 00000 n 0000002583 00000 n -0000040568 00000 n -0000463052 00000 n +0000040569 00000 n +0000464732 00000 n 0000002641 00000 n 0000002833 00000 n -0000040629 00000 n -0000462978 00000 n +0000040630 00000 n +0000464658 00000 n 0000002891 00000 n 0000003113 00000 n -0000044885 00000 n -0000462854 00000 n +0000044886 00000 n +0000464534 00000 n 0000003166 00000 n 0000003364 00000 n -0000044946 00000 n -0000462780 00000 n +0000044947 00000 n +0000464460 00000 n 0000003422 00000 n 0000003541 00000 n -0000045007 00000 n -0000462706 00000 n +0000045008 00000 n +0000464386 00000 n 0000003599 00000 n 0000003718 00000 n -0000050402 00000 n -0000462619 00000 n +0000050260 00000 n +0000464299 00000 n 0000003771 00000 n 0000004027 00000 n -0000050463 00000 n -0000462545 00000 n +0000050321 00000 n +0000464225 00000 n 0000004080 00000 n 0000004186 00000 n -0000050524 00000 n -0000462418 00000 n +0000050382 00000 n +0000464098 00000 n 0000004234 00000 n 0000004315 00000 n -0000050585 00000 n -0000462344 00000 n +0000050443 00000 n +0000464024 00000 n 0000004368 00000 n 0000004492 00000 n -0000054128 00000 n -0000462257 00000 n +0000054333 00000 n +0000463937 00000 n 0000004545 00000 n 0000004768 00000 n -0000058710 00000 n -0000462170 00000 n +0000058918 00000 n +0000463850 00000 n 0000004821 00000 n 0000004986 00000 n -0000064110 00000 n -0000462083 00000 n +0000063619 00000 n +0000463763 00000 n 0000005039 00000 n 0000005278 00000 n -0000067130 00000 n -0000462008 00000 n +0000067264 00000 n +0000463688 00000 n 0000005331 00000 n 0000005474 00000 n -0000075140 00000 n -0000461876 00000 n +0000075536 00000 n +0000463556 00000 n 0000005523 00000 n 0000005635 00000 n -0000075202 00000 n -0000461797 00000 n +0000075598 00000 n +0000463477 00000 n 0000005689 00000 n 0000005801 00000 n -0000078619 00000 n -0000461664 00000 n +0000079015 00000 n +0000463344 00000 n 0000005855 00000 n 0000006087 00000 n -0000078681 00000 n -0000461585 00000 n +0000079077 00000 n +0000463265 00000 n 0000006146 00000 n 0000006347 00000 n -0000090580 00000 n -0000461492 00000 n +0000090940 00000 n +0000463172 00000 n 0000006406 00000 n 0000006657 00000 n -0000095449 00000 n -0000461399 00000 n +0000095809 00000 n +0000463079 00000 n 0000006716 00000 n 0000006928 00000 n -0000107314 00000 n -0000461306 00000 n +0000107674 00000 n +0000462986 00000 n 0000006987 00000 n 0000007109 00000 n -0000116895 00000 n -0000461213 00000 n +0000117521 00000 n +0000462893 00000 n 0000007168 00000 n 0000007362 00000 n -0000117586 00000 n -0000461120 00000 n +0000118212 00000 n +0000462800 00000 n 0000007421 00000 n 0000007684 00000 n -0000119408 00000 n -0000461027 00000 n +0000120035 00000 n +0000462707 00000 n 0000007743 00000 n 0000008094 00000 n -0000141275 00000 n -0000460934 00000 n +0000141923 00000 n +0000462614 00000 n 0000008153 00000 n 0000008268 00000 n -0000148817 00000 n -0000460841 00000 n +0000149451 00000 n +0000462521 00000 n 0000008327 00000 n 0000008480 00000 n -0000153727 00000 n -0000460762 00000 n +0000154274 00000 n +0000462442 00000 n 0000008540 00000 n 0000008647 00000 n -0000154439 00000 n -0000460644 00000 n +0000154986 00000 n +0000462324 00000 n 0000008701 00000 n 0000008938 00000 n -0000154892 00000 n -0000460565 00000 n +0000155439 00000 n +0000462245 00000 n 0000008997 00000 n 0000009246 00000 n -0000164879 00000 n -0000460472 00000 n +0000165398 00000 n +0000462152 00000 n 0000009305 00000 n 0000009478 00000 n -0000218822 00000 n -0000460379 00000 n +0000219616 00000 n +0000462059 00000 n 0000009537 00000 n 0000009695 00000 n -0000220182 00000 n -0000460286 00000 n +0000220976 00000 n +0000461966 00000 n 0000009754 00000 n 0000010026 00000 n -0000226122 00000 n -0000460207 00000 n +0000229810 00000 n +0000461887 00000 n 0000010085 00000 n 0000010302 00000 n -0000231037 00000 n -0000460127 00000 n +0000234256 00000 n +0000461807 00000 n 0000010351 00000 n 0000010428 00000 n -0000014018 00000 n -0000014208 00000 n -0000014520 00000 n -0000014364 00000 n -0000015213 00000 n +0000014019 00000 n +0000014209 00000 n +0000014521 00000 n +0000014365 00000 n +0000015214 00000 n 0000010492 00000 n -0000014903 00000 n -0000014965 00000 n -0000399448 00000 n -0000396556 00000 n -0000458518 00000 n -0000394352 00000 n -0000390192 00000 n -0000386846 00000 n -0000384214 00000 n -0000379051 00000 n -0000376938 00000 n -0000369876 00000 n -0000360081 00000 n -0000356548 00000 n -0000353445 00000 n -0000343272 00000 n -0000339677 00000 n -0000458876 00000 n -0000458158 00000 n -0000458339 00000 n -0000459052 00000 n -0000458698 00000 n -0000334050 00000 n -0000326396 00000 n -0000322433 00000 n -0000015087 00000 n -0000319323 00000 n -0000315905 00000 n -0000014712 00000 n -0000015150 00000 n -0000459226 00000 n -0000014155 00000 n -0000020014 00000 n -0000020175 00000 n -0000025508 00000 n -0000020640 00000 n -0000019840 00000 n -0000015597 00000 n -0000020336 00000 n -0000308673 00000 n -0000302253 00000 n -0000019977 00000 n -0000025664 00000 n -0000025819 00000 n -0000025980 00000 n -0000030808 00000 n -0000026451 00000 n -0000025318 00000 n -0000020803 00000 n -0000026141 00000 n -0000295034 00000 n -0000026325 00000 n -0000026388 00000 n -0000025455 00000 n -0000030964 00000 n -0000031125 00000 n -0000031529 00000 n -0000030626 00000 n -0000026679 00000 n -0000031281 00000 n -0000292238 00000 n -0000289295 00000 n -0000031404 00000 n -0000031467 00000 n -0000030763 00000 n -0000035539 00000 n -0000035698 00000 n -0000035853 00000 n -0000036341 00000 n -0000035357 00000 n -0000031822 00000 n -0000036033 00000 n -0000036278 00000 n -0000035494 00000 n -0000070418 00000 n -0000040123 00000 n -0000040284 00000 n -0000040690 00000 n -0000039949 00000 n -0000036543 00000 n -0000040445 00000 n -0000040086 00000 n -0000044667 00000 n -0000045129 00000 n -0000044501 00000 n -0000040866 00000 n -0000044823 00000 n -0000045068 00000 n -0000044638 00000 n -0000050018 00000 n -0000050179 00000 n -0000050646 00000 n -0000049844 00000 n -0000045357 00000 n -0000050340 00000 n -0000049981 00000 n -0000054189 00000 n -0000053945 00000 n -0000050848 00000 n -0000054066 00000 n -0000058015 00000 n -0000058175 00000 n -0000058336 00000 n -0000058492 00000 n -0000058895 00000 n -0000057825 00000 n -0000054326 00000 n -0000058648 00000 n -0000058771 00000 n -0000058833 00000 n -0000057962 00000 n -0000062635 00000 n -0000062792 00000 n -0000062949 00000 n -0000063106 00000 n -0000063263 00000 n -0000063424 00000 n -0000063585 00000 n -0000063742 00000 n -0000064358 00000 n -0000062413 00000 n -0000059084 00000 n -0000063922 00000 n -0000278032 00000 n -0000063984 00000 n -0000064047 00000 n -0000064171 00000 n -0000064234 00000 n -0000064296 00000 n -0000459379 00000 n -0000062550 00000 n -0000067191 00000 n -0000066947 00000 n -0000064573 00000 n -0000067068 00000 n -0000275833 00000 n -0000263660 00000 n -0000248921 00000 n -0000068116 00000 n -0000067933 00000 n -0000067367 00000 n -0000068054 00000 n -0000070480 00000 n -0000070235 00000 n -0000068201 00000 n -0000070356 00000 n -0000074454 00000 n -0000074610 00000 n -0000074765 00000 n -0000074922 00000 n -0000075514 00000 n -0000074264 00000 n -0000070591 00000 n -0000075078 00000 n -0000075264 00000 n -0000075327 00000 n -0000235761 00000 n -0000075390 00000 n -0000075453 00000 n -0000074401 00000 n -0000081007 00000 n -0000078436 00000 n -0000075755 00000 n -0000078557 00000 n -0000458013 00000 n -0000078743 00000 n -0000078806 00000 n -0000078869 00000 n -0000078932 00000 n -0000078995 00000 n -0000079058 00000 n -0000079120 00000 n -0000079183 00000 n -0000079246 00000 n -0000079309 00000 n -0000079372 00000 n -0000079435 00000 n -0000079498 00000 n -0000079561 00000 n -0000079624 00000 n -0000079687 00000 n -0000079750 00000 n -0000079813 00000 n -0000079875 00000 n -0000079938 00000 n -0000080001 00000 n -0000080064 00000 n -0000080127 00000 n -0000080190 00000 n -0000080253 00000 n -0000080316 00000 n -0000080379 00000 n -0000080442 00000 n -0000080505 00000 n -0000080568 00000 n -0000080630 00000 n -0000080693 00000 n -0000080756 00000 n -0000080819 00000 n -0000080882 00000 n -0000080945 00000 n -0000086731 00000 n -0000083151 00000 n -0000081157 00000 n -0000083272 00000 n -0000083334 00000 n -0000083397 00000 n -0000083459 00000 n -0000083522 00000 n -0000083585 00000 n -0000083648 00000 n -0000083711 00000 n -0000083774 00000 n -0000083837 00000 n -0000083900 00000 n -0000083963 00000 n -0000084026 00000 n -0000084089 00000 n -0000084152 00000 n -0000084215 00000 n -0000084278 00000 n -0000084341 00000 n -0000084404 00000 n -0000084466 00000 n -0000084529 00000 n -0000084592 00000 n -0000084655 00000 n -0000084718 00000 n -0000084781 00000 n -0000084844 00000 n -0000084907 00000 n -0000084970 00000 n -0000085033 00000 n -0000085095 00000 n -0000085158 00000 n -0000085221 00000 n -0000085284 00000 n -0000085347 00000 n -0000085410 00000 n -0000085473 00000 n -0000085536 00000 n -0000085599 00000 n -0000085662 00000 n -0000085725 00000 n -0000085788 00000 n -0000085851 00000 n -0000085914 00000 n -0000085977 00000 n -0000086040 00000 n -0000086103 00000 n -0000086166 00000 n -0000086229 00000 n -0000086292 00000 n -0000086354 00000 n -0000086417 00000 n -0000086480 00000 n -0000086543 00000 n -0000086606 00000 n -0000086669 00000 n -0000091523 00000 n -0000089894 00000 n -0000086842 00000 n -0000090015 00000 n -0000090077 00000 n -0000090140 00000 n -0000090202 00000 n -0000090265 00000 n -0000090328 00000 n -0000090391 00000 n -0000090454 00000 n -0000090517 00000 n -0000090642 00000 n -0000090705 00000 n -0000090768 00000 n -0000090830 00000 n -0000090893 00000 n -0000090956 00000 n -0000091019 00000 n -0000091082 00000 n -0000091145 00000 n -0000091208 00000 n -0000091271 00000 n -0000091334 00000 n -0000091397 00000 n -0000091460 00000 n -0000096264 00000 n -0000093820 00000 n -0000091660 00000 n -0000093941 00000 n -0000094003 00000 n -0000094066 00000 n -0000094128 00000 n -0000094191 00000 n -0000094254 00000 n -0000094316 00000 n -0000094379 00000 n -0000094442 00000 n -0000094505 00000 n -0000094568 00000 n -0000094631 00000 n -0000094694 00000 n -0000094757 00000 n -0000094819 00000 n -0000094882 00000 n -0000094945 00000 n -0000095008 00000 n -0000095071 00000 n -0000095134 00000 n -0000095197 00000 n -0000095260 00000 n -0000095323 00000 n -0000095386 00000 n -0000095511 00000 n -0000095574 00000 n -0000095637 00000 n -0000095700 00000 n -0000095763 00000 n -0000095826 00000 n -0000095889 00000 n -0000095952 00000 n -0000096014 00000 n -0000096077 00000 n -0000096140 00000 n -0000096202 00000 n -0000102493 00000 n -0000098726 00000 n -0000096388 00000 n -0000098847 00000 n -0000098909 00000 n -0000098972 00000 n -0000099034 00000 n -0000099097 00000 n -0000099160 00000 n -0000099223 00000 n -0000099286 00000 n -0000099349 00000 n -0000099412 00000 n -0000099475 00000 n -0000099538 00000 n -0000099600 00000 n -0000099663 00000 n -0000099726 00000 n -0000099789 00000 n -0000099852 00000 n -0000099915 00000 n -0000099978 00000 n -0000100041 00000 n -0000100104 00000 n -0000100166 00000 n -0000100229 00000 n -0000100292 00000 n -0000100355 00000 n -0000100418 00000 n -0000100481 00000 n -0000100544 00000 n -0000100607 00000 n -0000100670 00000 n -0000100732 00000 n -0000100795 00000 n -0000100858 00000 n -0000100921 00000 n -0000100984 00000 n -0000101047 00000 n -0000101110 00000 n -0000101173 00000 n -0000101236 00000 n -0000101299 00000 n -0000101362 00000 n -0000101425 00000 n -0000101488 00000 n -0000101551 00000 n -0000101614 00000 n -0000101677 00000 n -0000101740 00000 n -0000101803 00000 n -0000101866 00000 n -0000101928 00000 n -0000101991 00000 n -0000102054 00000 n -0000102117 00000 n -0000102180 00000 n -0000102243 00000 n -0000102306 00000 n -0000102369 00000 n -0000102431 00000 n -0000108004 00000 n -0000104679 00000 n -0000102604 00000 n -0000104800 00000 n -0000104862 00000 n -0000104925 00000 n -0000104987 00000 n -0000105050 00000 n -0000105113 00000 n -0000105176 00000 n -0000105239 00000 n -0000105302 00000 n -0000105365 00000 n -0000105428 00000 n -0000105491 00000 n -0000105553 00000 n -0000105616 00000 n -0000105679 00000 n -0000105742 00000 n -0000105805 00000 n -0000105868 00000 n -0000105931 00000 n -0000105993 00000 n -0000106056 00000 n -0000106119 00000 n -0000106182 00000 n -0000106245 00000 n -0000106308 00000 n -0000106371 00000 n -0000106434 00000 n -0000106497 00000 n -0000106559 00000 n -0000106622 00000 n -0000106685 00000 n -0000106748 00000 n -0000106811 00000 n -0000106874 00000 n -0000106937 00000 n -0000107000 00000 n -0000107063 00000 n -0000107125 00000 n -0000107188 00000 n -0000107251 00000 n -0000107376 00000 n -0000107439 00000 n -0000107502 00000 n -0000107565 00000 n -0000107628 00000 n -0000107691 00000 n -0000107754 00000 n -0000107817 00000 n -0000107880 00000 n -0000107942 00000 n -0000459532 00000 n -0000114297 00000 n -0000110218 00000 n -0000108141 00000 n -0000110339 00000 n -0000110401 00000 n -0000110464 00000 n -0000110526 00000 n -0000110589 00000 n -0000110652 00000 n -0000110715 00000 n -0000110778 00000 n -0000110841 00000 n -0000110904 00000 n -0000110967 00000 n -0000111030 00000 n -0000111092 00000 n -0000111155 00000 n -0000111218 00000 n -0000111281 00000 n -0000111344 00000 n -0000111407 00000 n -0000111470 00000 n -0000111533 00000 n -0000111596 00000 n -0000111658 00000 n -0000111721 00000 n -0000111784 00000 n -0000111847 00000 n -0000111910 00000 n -0000111973 00000 n -0000112036 00000 n -0000112099 00000 n -0000112162 00000 n -0000112224 00000 n -0000112287 00000 n -0000112350 00000 n -0000112413 00000 n -0000112476 00000 n -0000112539 00000 n -0000112602 00000 n -0000112665 00000 n -0000112728 00000 n -0000112790 00000 n -0000112853 00000 n -0000112916 00000 n -0000112979 00000 n -0000113042 00000 n -0000113105 00000 n -0000113168 00000 n -0000113231 00000 n -0000113294 00000 n -0000113357 00000 n -0000113420 00000 n -0000113481 00000 n -0000113544 00000 n -0000113607 00000 n -0000113670 00000 n -0000113733 00000 n -0000113796 00000 n -0000113859 00000 n -0000113922 00000 n -0000113985 00000 n -0000114047 00000 n -0000114110 00000 n -0000114173 00000 n -0000114235 00000 n -0000119594 00000 n -0000116461 00000 n -0000114395 00000 n -0000116582 00000 n -0000116644 00000 n -0000116707 00000 n -0000116769 00000 n -0000116832 00000 n -0000116957 00000 n -0000117020 00000 n -0000117082 00000 n -0000117145 00000 n -0000117208 00000 n -0000117271 00000 n -0000117334 00000 n -0000117397 00000 n -0000117460 00000 n -0000117523 00000 n -0000117648 00000 n -0000117711 00000 n -0000117773 00000 n -0000117836 00000 n -0000117899 00000 n -0000117962 00000 n -0000118025 00000 n -0000118088 00000 n -0000118151 00000 n -0000118214 00000 n -0000118277 00000 n -0000118339 00000 n -0000118402 00000 n -0000118465 00000 n -0000118528 00000 n -0000118590 00000 n -0000118653 00000 n -0000118716 00000 n -0000118779 00000 n -0000118842 00000 n -0000118905 00000 n -0000118968 00000 n -0000119031 00000 n -0000119094 00000 n -0000119156 00000 n -0000119219 00000 n -0000119282 00000 n -0000119345 00000 n -0000119470 00000 n +0000014904 00000 n +0000014966 00000 n +0000401128 00000 n +0000398236 00000 n +0000460198 00000 n +0000396032 00000 n +0000392005 00000 n +0000388659 00000 n +0000386027 00000 n +0000380864 00000 n +0000378751 00000 n +0000371689 00000 n +0000361894 00000 n +0000358361 00000 n +0000355258 00000 n +0000345085 00000 n +0000341490 00000 n +0000460556 00000 n +0000459838 00000 n +0000460019 00000 n +0000460732 00000 n +0000460378 00000 n +0000335863 00000 n +0000328209 00000 n +0000324246 00000 n +0000015088 00000 n +0000321136 00000 n +0000317718 00000 n +0000014713 00000 n +0000015151 00000 n +0000460906 00000 n +0000014156 00000 n +0000020015 00000 n +0000020176 00000 n +0000025509 00000 n +0000020641 00000 n +0000019841 00000 n +0000015598 00000 n +0000020337 00000 n +0000310486 00000 n +0000304396 00000 n +0000019978 00000 n +0000025665 00000 n +0000025820 00000 n +0000025981 00000 n +0000030809 00000 n +0000026452 00000 n +0000025319 00000 n +0000020804 00000 n +0000026142 00000 n +0000297177 00000 n +0000026326 00000 n +0000026389 00000 n +0000025456 00000 n +0000030965 00000 n +0000031126 00000 n +0000031530 00000 n +0000030627 00000 n +0000026680 00000 n +0000031282 00000 n +0000294381 00000 n +0000291438 00000 n +0000031405 00000 n +0000031468 00000 n +0000030764 00000 n +0000035540 00000 n +0000035699 00000 n +0000035854 00000 n +0000036342 00000 n +0000035358 00000 n +0000031823 00000 n +0000036034 00000 n +0000036279 00000 n +0000035495 00000 n +0000070814 00000 n +0000040124 00000 n +0000040285 00000 n +0000040691 00000 n +0000039950 00000 n +0000036544 00000 n +0000040446 00000 n +0000040087 00000 n +0000044668 00000 n +0000045130 00000 n +0000044502 00000 n +0000040867 00000 n +0000044824 00000 n +0000045069 00000 n +0000044639 00000 n +0000049876 00000 n +0000050037 00000 n +0000050504 00000 n +0000049702 00000 n +0000045358 00000 n +0000050198 00000 n +0000049839 00000 n +0000054394 00000 n +0000054150 00000 n +0000050706 00000 n +0000054271 00000 n +0000058222 00000 n +0000058382 00000 n +0000058543 00000 n +0000058699 00000 n +0000059104 00000 n +0000058032 00000 n +0000054544 00000 n +0000058856 00000 n +0000058979 00000 n +0000059042 00000 n +0000058169 00000 n +0000062483 00000 n +0000062639 00000 n +0000062795 00000 n +0000062952 00000 n +0000063109 00000 n +0000063270 00000 n +0000066865 00000 n +0000067022 00000 n +0000063804 00000 n +0000062277 00000 n +0000059293 00000 n +0000063431 00000 n +0000280175 00000 n +0000063493 00000 n +0000063556 00000 n +0000063680 00000 n +0000063743 00000 n +0000461059 00000 n +0000062414 00000 n +0000067386 00000 n +0000066691 00000 n +0000063993 00000 n +0000067202 00000 n +0000277976 00000 n +0000265803 00000 n +0000251064 00000 n +0000067324 00000 n +0000066828 00000 n +0000068512 00000 n +0000068329 00000 n +0000067627 00000 n +0000068450 00000 n +0000070876 00000 n +0000070631 00000 n +0000068597 00000 n +0000070752 00000 n +0000074850 00000 n +0000075006 00000 n +0000075161 00000 n +0000075318 00000 n +0000075910 00000 n +0000074660 00000 n +0000070987 00000 n +0000075474 00000 n +0000075660 00000 n +0000075723 00000 n +0000237904 00000 n +0000075786 00000 n +0000075849 00000 n +0000074797 00000 n +0000081403 00000 n +0000078832 00000 n +0000076151 00000 n +0000078953 00000 n +0000459693 00000 n +0000079139 00000 n +0000079202 00000 n +0000079265 00000 n +0000079328 00000 n +0000079391 00000 n +0000079454 00000 n +0000079516 00000 n +0000079579 00000 n +0000079642 00000 n +0000079705 00000 n +0000079768 00000 n +0000079831 00000 n +0000079894 00000 n +0000079957 00000 n +0000080020 00000 n +0000080083 00000 n +0000080146 00000 n +0000080209 00000 n +0000080271 00000 n +0000080334 00000 n +0000080397 00000 n +0000080460 00000 n +0000080523 00000 n +0000080586 00000 n +0000080649 00000 n +0000080712 00000 n +0000080775 00000 n +0000080838 00000 n +0000080901 00000 n +0000080964 00000 n +0000081026 00000 n +0000081089 00000 n +0000081152 00000 n +0000081215 00000 n +0000081278 00000 n +0000081341 00000 n +0000087127 00000 n +0000083547 00000 n +0000081553 00000 n +0000083668 00000 n +0000083730 00000 n +0000083793 00000 n +0000083855 00000 n +0000083918 00000 n +0000083981 00000 n +0000084044 00000 n +0000084107 00000 n +0000084170 00000 n +0000084233 00000 n +0000084296 00000 n +0000084359 00000 n +0000084422 00000 n +0000084485 00000 n +0000084548 00000 n +0000084611 00000 n +0000084674 00000 n +0000084737 00000 n +0000084800 00000 n +0000084862 00000 n +0000084925 00000 n +0000084988 00000 n +0000085051 00000 n +0000085114 00000 n +0000085177 00000 n +0000085240 00000 n +0000085303 00000 n +0000085366 00000 n +0000085429 00000 n +0000085491 00000 n +0000085554 00000 n +0000085617 00000 n +0000085680 00000 n +0000085743 00000 n +0000085806 00000 n +0000085869 00000 n +0000085932 00000 n +0000085995 00000 n +0000086058 00000 n +0000086121 00000 n +0000086184 00000 n +0000086247 00000 n +0000086310 00000 n +0000086373 00000 n +0000086436 00000 n +0000086499 00000 n +0000086562 00000 n +0000086625 00000 n +0000086688 00000 n +0000086750 00000 n +0000086813 00000 n +0000086876 00000 n +0000086939 00000 n +0000087002 00000 n +0000087065 00000 n +0000091883 00000 n +0000090254 00000 n +0000087238 00000 n +0000090375 00000 n +0000090437 00000 n +0000090500 00000 n +0000090562 00000 n +0000090625 00000 n +0000090688 00000 n +0000090751 00000 n +0000090814 00000 n +0000090877 00000 n +0000091002 00000 n +0000091065 00000 n +0000091128 00000 n +0000091190 00000 n +0000091253 00000 n +0000091316 00000 n +0000091379 00000 n +0000091442 00000 n +0000091505 00000 n +0000091568 00000 n +0000091631 00000 n +0000091694 00000 n +0000091757 00000 n +0000091820 00000 n +0000096624 00000 n +0000094180 00000 n +0000092020 00000 n +0000094301 00000 n +0000094363 00000 n +0000094426 00000 n +0000094488 00000 n +0000094551 00000 n +0000094614 00000 n +0000094676 00000 n +0000094739 00000 n +0000094802 00000 n +0000094865 00000 n +0000094928 00000 n +0000094991 00000 n +0000095054 00000 n +0000095117 00000 n +0000095179 00000 n +0000095242 00000 n +0000095305 00000 n +0000095368 00000 n +0000095431 00000 n +0000095494 00000 n +0000095557 00000 n +0000095620 00000 n +0000095683 00000 n +0000095746 00000 n +0000095871 00000 n +0000095934 00000 n +0000095997 00000 n +0000096060 00000 n +0000096123 00000 n +0000096186 00000 n +0000096249 00000 n +0000096312 00000 n +0000096374 00000 n +0000096437 00000 n +0000096500 00000 n +0000096562 00000 n +0000102853 00000 n +0000099086 00000 n +0000096748 00000 n +0000099207 00000 n +0000099269 00000 n +0000099332 00000 n +0000099394 00000 n +0000099457 00000 n +0000099520 00000 n +0000099583 00000 n +0000099646 00000 n +0000099709 00000 n +0000099772 00000 n +0000099835 00000 n +0000099898 00000 n +0000099960 00000 n +0000100023 00000 n +0000100086 00000 n +0000100149 00000 n +0000100212 00000 n +0000100275 00000 n +0000100338 00000 n +0000100401 00000 n +0000100464 00000 n +0000100526 00000 n +0000100589 00000 n +0000100652 00000 n +0000100715 00000 n +0000100778 00000 n +0000100841 00000 n +0000100904 00000 n +0000100967 00000 n +0000101030 00000 n +0000101092 00000 n +0000101155 00000 n +0000101218 00000 n +0000101281 00000 n +0000101344 00000 n +0000101407 00000 n +0000101470 00000 n +0000101533 00000 n +0000101596 00000 n +0000101659 00000 n +0000101722 00000 n +0000101785 00000 n +0000101848 00000 n +0000101911 00000 n +0000101974 00000 n +0000102037 00000 n +0000102100 00000 n +0000102163 00000 n +0000102226 00000 n +0000102288 00000 n +0000102351 00000 n +0000102414 00000 n +0000102477 00000 n +0000102540 00000 n +0000102603 00000 n +0000102666 00000 n +0000102729 00000 n +0000102791 00000 n +0000108364 00000 n +0000105039 00000 n +0000102964 00000 n +0000105160 00000 n +0000105222 00000 n +0000105285 00000 n +0000105347 00000 n +0000105410 00000 n +0000105473 00000 n +0000105536 00000 n +0000105599 00000 n +0000105662 00000 n +0000105725 00000 n +0000105788 00000 n +0000105851 00000 n +0000105913 00000 n +0000105976 00000 n +0000106039 00000 n +0000106102 00000 n +0000106165 00000 n +0000106228 00000 n +0000106291 00000 n +0000106353 00000 n +0000106416 00000 n +0000106479 00000 n +0000106542 00000 n +0000106605 00000 n +0000106668 00000 n +0000106731 00000 n +0000106794 00000 n +0000106857 00000 n +0000106919 00000 n +0000106982 00000 n +0000107045 00000 n +0000107108 00000 n +0000107171 00000 n +0000107234 00000 n +0000107297 00000 n +0000107360 00000 n +0000107423 00000 n +0000107485 00000 n +0000107548 00000 n +0000107611 00000 n +0000107736 00000 n +0000107799 00000 n +0000107862 00000 n +0000107925 00000 n +0000107988 00000 n +0000108051 00000 n +0000108114 00000 n +0000108177 00000 n +0000108240 00000 n +0000108302 00000 n +0000461212 00000 n +0000114681 00000 n +0000110602 00000 n +0000108501 00000 n +0000110723 00000 n +0000110785 00000 n +0000110848 00000 n +0000110910 00000 n +0000110973 00000 n +0000111036 00000 n +0000111099 00000 n +0000111162 00000 n +0000111225 00000 n +0000111288 00000 n +0000111351 00000 n +0000111414 00000 n +0000111476 00000 n +0000111539 00000 n +0000111602 00000 n +0000111665 00000 n +0000111728 00000 n +0000111791 00000 n +0000111854 00000 n +0000111917 00000 n +0000111980 00000 n +0000112042 00000 n +0000112105 00000 n +0000112168 00000 n +0000112231 00000 n +0000112294 00000 n +0000112357 00000 n +0000112420 00000 n +0000112483 00000 n +0000112546 00000 n +0000112608 00000 n +0000112671 00000 n +0000112734 00000 n +0000112797 00000 n +0000112860 00000 n +0000112923 00000 n +0000112986 00000 n +0000113049 00000 n +0000113112 00000 n +0000113174 00000 n +0000113237 00000 n +0000113300 00000 n +0000113363 00000 n +0000113426 00000 n +0000113489 00000 n +0000113552 00000 n +0000113615 00000 n +0000113678 00000 n +0000113741 00000 n +0000113804 00000 n +0000113865 00000 n +0000113928 00000 n +0000113991 00000 n +0000114054 00000 n +0000114117 00000 n +0000114180 00000 n +0000114243 00000 n +0000114306 00000 n +0000114369 00000 n +0000114431 00000 n +0000114494 00000 n +0000114557 00000 n +0000114619 00000 n +0000120096 00000 n +0000116835 00000 n +0000114779 00000 n +0000116956 00000 n +0000117018 00000 n +0000117081 00000 n +0000117143 00000 n +0000117206 00000 n +0000117269 00000 n +0000117332 00000 n +0000117395 00000 n +0000117458 00000 n +0000117583 00000 n +0000117646 00000 n +0000117708 00000 n +0000117771 00000 n +0000117834 00000 n +0000117897 00000 n +0000117960 00000 n +0000118023 00000 n +0000118086 00000 n +0000118149 00000 n +0000118274 00000 n +0000118337 00000 n +0000118400 00000 n +0000118463 00000 n +0000118526 00000 n +0000118589 00000 n +0000118652 00000 n +0000118715 00000 n +0000118778 00000 n +0000118840 00000 n +0000118903 00000 n +0000118966 00000 n +0000119029 00000 n +0000119092 00000 n +0000119155 00000 n +0000119218 00000 n +0000119281 00000 n +0000119343 00000 n +0000119406 00000 n +0000119469 00000 n 0000119532 00000 n -0000125380 00000 n -0000121927 00000 n -0000119718 00000 n -0000122048 00000 n -0000122110 00000 n -0000122173 00000 n -0000122235 00000 n -0000122298 00000 n -0000122361 00000 n -0000122424 00000 n -0000122487 00000 n -0000122550 00000 n -0000122613 00000 n -0000122676 00000 n -0000122739 00000 n -0000122801 00000 n -0000122864 00000 n -0000122927 00000 n -0000122990 00000 n -0000123053 00000 n -0000123116 00000 n -0000123179 00000 n -0000123242 00000 n -0000123305 00000 n -0000123368 00000 n -0000123430 00000 n -0000123493 00000 n -0000123556 00000 n -0000123619 00000 n -0000123682 00000 n -0000123745 00000 n -0000123808 00000 n -0000123871 00000 n -0000123934 00000 n -0000123997 00000 n -0000124060 00000 n -0000124123 00000 n -0000124186 00000 n -0000124249 00000 n -0000124312 00000 n -0000124374 00000 n -0000124437 00000 n -0000124500 00000 n -0000124563 00000 n -0000124626 00000 n -0000124689 00000 n -0000124752 00000 n -0000124815 00000 n -0000124878 00000 n -0000124941 00000 n -0000125004 00000 n -0000125067 00000 n -0000125130 00000 n -0000125192 00000 n -0000125255 00000 n -0000125318 00000 n -0000131807 00000 n -0000128167 00000 n -0000125491 00000 n -0000128288 00000 n -0000128350 00000 n -0000128413 00000 n -0000128475 00000 n -0000128538 00000 n -0000128601 00000 n -0000128664 00000 n -0000128727 00000 n -0000128790 00000 n -0000128853 00000 n -0000128916 00000 n -0000128978 00000 n -0000129041 00000 n -0000129104 00000 n -0000129167 00000 n -0000129230 00000 n -0000129293 00000 n -0000129356 00000 n -0000129419 00000 n -0000129482 00000 n -0000129544 00000 n -0000129607 00000 n -0000129670 00000 n -0000129733 00000 n -0000129796 00000 n -0000129859 00000 n -0000129922 00000 n -0000129985 00000 n -0000130048 00000 n -0000130110 00000 n -0000130173 00000 n -0000130236 00000 n -0000130299 00000 n -0000130362 00000 n -0000130425 00000 n -0000130488 00000 n -0000130551 00000 n -0000130614 00000 n -0000130677 00000 n -0000130740 00000 n -0000130803 00000 n -0000130865 00000 n -0000130928 00000 n -0000130991 00000 n -0000131054 00000 n -0000131117 00000 n -0000131180 00000 n -0000131243 00000 n -0000131306 00000 n -0000131369 00000 n -0000131431 00000 n -0000131494 00000 n -0000131557 00000 n -0000131620 00000 n -0000131683 00000 n -0000131745 00000 n -0000137947 00000 n -0000134431 00000 n -0000131931 00000 n -0000134552 00000 n -0000134614 00000 n -0000134677 00000 n -0000134739 00000 n -0000134802 00000 n -0000134865 00000 n -0000134928 00000 n -0000134991 00000 n -0000135054 00000 n -0000135117 00000 n -0000135180 00000 n -0000135243 00000 n -0000135306 00000 n -0000135369 00000 n -0000135432 00000 n -0000135495 00000 n -0000135558 00000 n -0000135621 00000 n -0000135684 00000 n -0000135747 00000 n -0000135810 00000 n -0000135873 00000 n -0000135936 00000 n -0000135999 00000 n -0000136062 00000 n -0000136125 00000 n -0000136188 00000 n -0000136251 00000 n -0000136313 00000 n -0000136376 00000 n -0000136439 00000 n -0000136502 00000 n -0000136565 00000 n -0000136628 00000 n -0000136691 00000 n -0000136753 00000 n -0000136816 00000 n -0000136879 00000 n -0000136942 00000 n -0000137005 00000 n -0000137068 00000 n -0000137131 00000 n -0000137194 00000 n -0000137257 00000 n -0000137320 00000 n -0000137382 00000 n -0000137445 00000 n -0000137508 00000 n -0000137571 00000 n -0000137634 00000 n -0000137697 00000 n -0000137760 00000 n -0000137823 00000 n -0000137885 00000 n -0000143536 00000 n -0000140463 00000 n -0000138058 00000 n -0000140584 00000 n -0000140646 00000 n -0000140709 00000 n -0000140771 00000 n -0000140834 00000 n -0000140897 00000 n -0000140960 00000 n -0000141023 00000 n -0000141086 00000 n -0000141149 00000 n -0000141212 00000 n -0000141337 00000 n -0000141400 00000 n -0000141463 00000 n -0000141526 00000 n -0000141588 00000 n -0000141651 00000 n -0000141714 00000 n -0000141777 00000 n -0000141840 00000 n -0000141903 00000 n -0000141966 00000 n -0000142029 00000 n -0000142092 00000 n -0000142154 00000 n -0000142217 00000 n -0000142280 00000 n -0000142343 00000 n -0000142406 00000 n -0000142469 00000 n -0000142532 00000 n -0000142595 00000 n -0000142658 00000 n -0000142720 00000 n -0000142783 00000 n -0000142846 00000 n -0000142909 00000 n -0000142972 00000 n -0000143035 00000 n -0000143098 00000 n -0000143161 00000 n -0000143224 00000 n -0000143286 00000 n -0000143349 00000 n -0000143412 00000 n -0000143474 00000 n -0000149197 00000 n -0000145474 00000 n -0000143660 00000 n -0000145595 00000 n -0000145657 00000 n -0000145720 00000 n -0000145782 00000 n -0000145845 00000 n -0000145908 00000 n -0000145971 00000 n -0000146034 00000 n -0000146097 00000 n -0000146160 00000 n +0000119595 00000 n +0000119658 00000 n +0000119721 00000 n +0000119784 00000 n +0000119847 00000 n +0000119909 00000 n +0000119972 00000 n +0000125975 00000 n +0000122464 00000 n +0000120220 00000 n +0000122585 00000 n +0000122647 00000 n +0000122710 00000 n +0000122772 00000 n +0000122834 00000 n +0000122897 00000 n +0000122960 00000 n +0000123023 00000 n +0000123086 00000 n +0000123149 00000 n +0000123212 00000 n +0000123275 00000 n +0000123338 00000 n +0000123399 00000 n +0000123462 00000 n +0000123525 00000 n +0000123588 00000 n +0000123651 00000 n +0000123714 00000 n +0000123777 00000 n +0000123840 00000 n +0000123903 00000 n +0000123966 00000 n +0000124028 00000 n +0000124091 00000 n +0000124154 00000 n +0000124217 00000 n +0000124280 00000 n +0000124343 00000 n +0000124406 00000 n +0000124469 00000 n +0000124532 00000 n +0000124595 00000 n +0000124658 00000 n +0000124720 00000 n +0000124783 00000 n +0000124846 00000 n +0000124909 00000 n +0000124971 00000 n +0000125034 00000 n +0000125097 00000 n +0000125160 00000 n +0000125223 00000 n +0000125286 00000 n +0000125349 00000 n +0000125412 00000 n +0000125475 00000 n +0000125537 00000 n +0000125600 00000 n +0000125663 00000 n +0000125726 00000 n +0000125788 00000 n +0000125851 00000 n +0000125913 00000 n +0000132399 00000 n +0000128759 00000 n +0000126086 00000 n +0000128880 00000 n +0000128942 00000 n +0000129005 00000 n +0000129067 00000 n +0000129130 00000 n +0000129193 00000 n +0000129256 00000 n +0000129319 00000 n +0000129382 00000 n +0000129445 00000 n +0000129508 00000 n +0000129570 00000 n +0000129633 00000 n +0000129696 00000 n +0000129759 00000 n +0000129822 00000 n +0000129885 00000 n +0000129948 00000 n +0000130011 00000 n +0000130074 00000 n +0000130136 00000 n +0000130199 00000 n +0000130262 00000 n +0000130325 00000 n +0000130388 00000 n +0000130451 00000 n +0000130514 00000 n +0000130577 00000 n +0000130640 00000 n +0000130702 00000 n +0000130765 00000 n +0000130828 00000 n +0000130891 00000 n +0000130954 00000 n +0000131017 00000 n +0000131080 00000 n +0000131143 00000 n +0000131206 00000 n +0000131269 00000 n +0000131332 00000 n +0000131395 00000 n +0000131457 00000 n +0000131520 00000 n +0000131583 00000 n +0000131646 00000 n +0000131709 00000 n +0000131772 00000 n +0000131835 00000 n +0000131898 00000 n +0000131961 00000 n +0000132023 00000 n +0000132086 00000 n +0000132149 00000 n +0000132212 00000 n +0000132275 00000 n +0000132337 00000 n +0000138543 00000 n +0000135026 00000 n +0000132523 00000 n +0000135147 00000 n +0000135209 00000 n +0000135272 00000 n +0000135334 00000 n +0000135397 00000 n +0000135460 00000 n +0000135523 00000 n +0000135586 00000 n +0000135649 00000 n +0000135712 00000 n +0000135775 00000 n +0000135838 00000 n +0000135901 00000 n +0000135964 00000 n +0000136027 00000 n +0000136090 00000 n +0000136153 00000 n +0000136216 00000 n +0000136279 00000 n +0000136342 00000 n +0000136405 00000 n +0000136468 00000 n +0000136531 00000 n +0000136594 00000 n +0000136657 00000 n +0000136720 00000 n +0000136783 00000 n +0000136846 00000 n +0000136908 00000 n +0000136971 00000 n +0000137034 00000 n +0000137097 00000 n +0000137160 00000 n +0000137223 00000 n +0000137286 00000 n +0000137349 00000 n +0000137412 00000 n +0000137475 00000 n +0000137538 00000 n +0000137601 00000 n +0000137664 00000 n +0000137727 00000 n +0000137790 00000 n +0000137853 00000 n +0000137916 00000 n +0000137978 00000 n +0000138041 00000 n +0000138104 00000 n +0000138167 00000 n +0000138230 00000 n +0000138293 00000 n +0000138356 00000 n +0000138419 00000 n +0000138481 00000 n +0000144120 00000 n +0000141048 00000 n +0000138654 00000 n +0000141169 00000 n +0000141231 00000 n +0000141294 00000 n +0000141356 00000 n +0000141419 00000 n +0000141482 00000 n +0000141545 00000 n +0000141608 00000 n +0000141671 00000 n +0000141734 00000 n +0000141797 00000 n +0000141860 00000 n +0000141984 00000 n +0000142047 00000 n +0000142110 00000 n +0000142172 00000 n +0000142235 00000 n +0000142298 00000 n +0000142361 00000 n +0000142424 00000 n +0000142487 00000 n +0000142550 00000 n +0000142613 00000 n +0000142676 00000 n +0000142738 00000 n +0000142801 00000 n +0000142864 00000 n +0000142927 00000 n +0000142990 00000 n +0000143053 00000 n +0000143116 00000 n +0000143179 00000 n +0000143242 00000 n +0000143304 00000 n +0000143367 00000 n +0000143430 00000 n +0000143493 00000 n +0000143556 00000 n +0000143619 00000 n +0000143682 00000 n +0000143745 00000 n +0000143808 00000 n +0000143870 00000 n +0000143933 00000 n +0000143996 00000 n +0000144058 00000 n +0000149767 00000 n +0000146040 00000 n +0000144244 00000 n +0000146161 00000 n 0000146223 00000 n 0000146286 00000 n 0000146348 00000 n @@ -8314,910 +8386,940 @@ xref 0000147166 00000 n 0000147229 00000 n 0000147292 00000 n -0000147354 00000 n -0000147417 00000 n +0000147355 00000 n +0000147418 00000 n 0000147480 00000 n 0000147543 00000 n 0000147606 00000 n 0000147669 00000 n 0000147732 00000 n 0000147795 00000 n -0000147859 00000 n -0000147922 00000 n -0000147986 00000 n -0000148050 00000 n -0000148114 00000 n -0000148178 00000 n -0000148242 00000 n -0000148306 00000 n -0000148370 00000 n -0000148434 00000 n -0000148497 00000 n -0000148561 00000 n -0000148625 00000 n -0000148689 00000 n -0000148753 00000 n -0000148879 00000 n -0000148943 00000 n -0000149007 00000 n -0000149071 00000 n -0000149134 00000 n -0000155082 00000 n -0000152176 00000 n -0000149308 00000 n -0000152300 00000 n -0000152364 00000 n -0000152429 00000 n -0000152493 00000 n -0000152558 00000 n -0000152623 00000 n -0000152688 00000 n -0000152753 00000 n -0000152818 00000 n -0000152883 00000 n -0000152948 00000 n -0000153013 00000 n -0000153077 00000 n -0000153142 00000 n -0000153207 00000 n -0000153272 00000 n -0000153337 00000 n -0000153402 00000 n -0000153467 00000 n -0000153532 00000 n -0000153597 00000 n -0000153662 00000 n -0000153790 00000 n -0000153855 00000 n -0000153920 00000 n -0000153985 00000 n -0000154050 00000 n -0000154115 00000 n -0000154180 00000 n -0000154244 00000 n -0000154309 00000 n -0000154374 00000 n -0000154502 00000 n -0000154567 00000 n -0000154632 00000 n -0000154697 00000 n -0000154762 00000 n -0000154827 00000 n -0000154954 00000 n -0000155018 00000 n -0000159287 00000 n -0000161129 00000 n -0000159115 00000 n -0000155246 00000 n -0000159443 00000 n -0000159507 00000 n -0000159572 00000 n -0000159637 00000 n -0000159702 00000 n -0000159767 00000 n -0000159832 00000 n -0000159897 00000 n -0000159962 00000 n -0000160027 00000 n -0000160092 00000 n -0000160157 00000 n -0000160222 00000 n -0000160287 00000 n -0000160352 00000 n -0000160417 00000 n -0000160482 00000 n -0000160547 00000 n -0000160612 00000 n -0000160677 00000 n -0000160741 00000 n -0000160806 00000 n -0000160871 00000 n -0000160936 00000 n -0000161000 00000 n -0000161065 00000 n -0000159256 00000 n -0000164592 00000 n -0000166819 00000 n -0000164419 00000 n -0000161345 00000 n -0000164750 00000 n -0000164814 00000 n -0000164941 00000 n -0000165006 00000 n -0000165071 00000 n -0000165136 00000 n -0000165201 00000 n -0000165264 00000 n -0000165329 00000 n -0000165394 00000 n -0000165459 00000 n -0000165524 00000 n -0000165587 00000 n -0000165652 00000 n -0000165717 00000 n -0000165782 00000 n -0000165847 00000 n -0000165912 00000 n -0000165977 00000 n -0000166042 00000 n -0000166107 00000 n -0000166171 00000 n -0000166236 00000 n -0000166301 00000 n -0000166366 00000 n -0000166431 00000 n -0000166496 00000 n -0000166561 00000 n -0000166626 00000 n -0000166691 00000 n -0000166755 00000 n -0000459687 00000 n -0000164561 00000 n -0000170069 00000 n -0000173597 00000 n -0000169896 00000 n -0000167035 00000 n -0000170227 00000 n -0000170291 00000 n -0000170356 00000 n -0000170420 00000 n -0000170485 00000 n -0000170550 00000 n -0000170615 00000 n -0000170680 00000 n -0000170743 00000 n -0000170808 00000 n -0000170873 00000 n -0000170937 00000 n -0000171002 00000 n -0000171067 00000 n -0000171132 00000 n -0000171197 00000 n -0000171262 00000 n -0000171326 00000 n -0000171391 00000 n -0000171456 00000 n -0000171521 00000 n -0000171586 00000 n -0000171651 00000 n -0000171716 00000 n -0000171781 00000 n -0000171846 00000 n -0000171910 00000 n -0000171975 00000 n -0000172040 00000 n -0000172105 00000 n -0000172170 00000 n -0000172235 00000 n -0000172300 00000 n -0000172365 00000 n -0000172430 00000 n -0000172494 00000 n -0000172559 00000 n -0000172624 00000 n -0000172689 00000 n -0000172754 00000 n -0000172819 00000 n -0000172884 00000 n -0000172949 00000 n -0000173014 00000 n -0000173078 00000 n -0000173143 00000 n -0000173208 00000 n -0000173273 00000 n -0000173338 00000 n -0000173403 00000 n -0000173468 00000 n -0000173533 00000 n -0000170038 00000 n -0000179860 00000 n -0000177270 00000 n -0000173787 00000 n -0000177395 00000 n -0000177459 00000 n -0000177524 00000 n -0000177588 00000 n -0000177653 00000 n -0000177718 00000 n -0000177783 00000 n -0000177848 00000 n -0000177913 00000 n -0000177978 00000 n -0000178043 00000 n -0000178108 00000 n -0000178172 00000 n -0000178237 00000 n -0000178302 00000 n -0000178367 00000 n -0000178432 00000 n -0000178497 00000 n -0000178562 00000 n -0000178627 00000 n -0000178692 00000 n -0000178756 00000 n -0000178821 00000 n -0000178886 00000 n -0000178951 00000 n -0000179016 00000 n -0000179081 00000 n -0000179146 00000 n -0000179211 00000 n -0000179276 00000 n -0000179341 00000 n -0000179406 00000 n -0000179470 00000 n -0000179535 00000 n -0000179600 00000 n -0000179665 00000 n -0000179730 00000 n -0000179795 00000 n -0000183405 00000 n -0000185760 00000 n -0000183232 00000 n -0000180024 00000 n -0000183562 00000 n -0000183626 00000 n -0000183691 00000 n -0000183756 00000 n -0000183821 00000 n -0000183886 00000 n -0000183948 00000 n -0000184013 00000 n -0000184078 00000 n -0000184142 00000 n -0000184207 00000 n -0000184272 00000 n -0000184337 00000 n -0000184402 00000 n -0000184467 00000 n -0000184532 00000 n -0000184597 00000 n -0000184662 00000 n -0000184723 00000 n -0000184788 00000 n -0000184853 00000 n -0000184918 00000 n -0000184983 00000 n -0000185048 00000 n -0000185113 00000 n -0000185178 00000 n -0000185243 00000 n -0000185307 00000 n -0000185372 00000 n -0000185437 00000 n -0000185502 00000 n -0000185567 00000 n -0000185632 00000 n -0000185696 00000 n -0000183374 00000 n -0000188622 00000 n -0000192086 00000 n -0000188449 00000 n -0000185976 00000 n -0000188779 00000 n -0000188843 00000 n -0000188908 00000 n -0000188972 00000 n +0000147858 00000 n +0000147920 00000 n +0000147983 00000 n +0000148046 00000 n +0000148109 00000 n +0000148173 00000 n +0000148237 00000 n +0000148301 00000 n +0000148365 00000 n +0000148429 00000 n +0000148492 00000 n +0000148556 00000 n +0000148620 00000 n +0000148684 00000 n +0000148748 00000 n +0000148812 00000 n +0000148876 00000 n +0000148940 00000 n +0000149004 00000 n +0000149067 00000 n +0000149131 00000 n +0000149195 00000 n +0000149259 00000 n +0000149323 00000 n +0000149387 00000 n +0000149513 00000 n +0000149577 00000 n +0000149641 00000 n +0000149704 00000 n +0000155502 00000 n +0000152659 00000 n +0000149878 00000 n +0000152783 00000 n +0000152847 00000 n +0000152912 00000 n +0000152976 00000 n +0000153041 00000 n +0000153106 00000 n +0000153171 00000 n +0000153236 00000 n +0000153301 00000 n +0000153366 00000 n +0000153431 00000 n +0000153496 00000 n +0000153560 00000 n +0000153625 00000 n +0000153690 00000 n +0000153755 00000 n +0000153820 00000 n +0000153885 00000 n +0000153950 00000 n +0000154015 00000 n +0000154080 00000 n +0000154144 00000 n +0000154209 00000 n +0000154337 00000 n +0000154402 00000 n +0000154467 00000 n +0000154532 00000 n +0000154597 00000 n +0000154662 00000 n +0000154726 00000 n +0000154791 00000 n +0000154856 00000 n +0000154921 00000 n +0000155049 00000 n +0000155114 00000 n +0000155179 00000 n +0000155244 00000 n +0000155309 00000 n +0000155374 00000 n +0000159717 00000 n +0000161490 00000 n +0000159545 00000 n +0000155666 00000 n +0000159873 00000 n +0000159937 00000 n +0000160002 00000 n +0000160066 00000 n +0000160131 00000 n +0000160196 00000 n +0000160261 00000 n +0000160326 00000 n +0000160391 00000 n +0000160455 00000 n +0000160520 00000 n +0000160585 00000 n +0000160649 00000 n +0000160714 00000 n +0000160779 00000 n +0000160844 00000 n +0000160909 00000 n +0000160974 00000 n +0000161039 00000 n +0000161104 00000 n +0000161167 00000 n +0000161232 00000 n +0000161297 00000 n +0000161362 00000 n +0000161426 00000 n +0000159686 00000 n +0000164917 00000 n +0000167148 00000 n +0000164744 00000 n +0000161706 00000 n +0000165075 00000 n +0000165139 00000 n +0000165204 00000 n +0000165268 00000 n +0000165333 00000 n +0000165461 00000 n +0000165526 00000 n +0000165591 00000 n +0000165655 00000 n +0000165720 00000 n +0000165785 00000 n +0000165850 00000 n +0000165915 00000 n +0000165980 00000 n +0000166045 00000 n +0000166110 00000 n +0000166175 00000 n +0000166240 00000 n +0000166305 00000 n +0000166370 00000 n +0000166435 00000 n +0000166500 00000 n +0000166564 00000 n +0000166629 00000 n +0000166694 00000 n +0000166759 00000 n +0000166824 00000 n +0000166889 00000 n +0000166954 00000 n +0000167019 00000 n +0000167084 00000 n +0000461367 00000 n +0000164886 00000 n +0000170293 00000 n +0000173628 00000 n +0000170120 00000 n +0000167364 00000 n +0000170451 00000 n +0000170515 00000 n +0000170580 00000 n +0000170644 00000 n +0000170709 00000 n +0000170774 00000 n +0000170839 00000 n +0000170903 00000 n +0000170968 00000 n +0000171033 00000 n +0000171098 00000 n +0000171163 00000 n +0000171228 00000 n +0000171293 00000 n +0000171358 00000 n +0000171423 00000 n +0000171488 00000 n +0000171553 00000 n +0000171618 00000 n +0000171683 00000 n +0000171748 00000 n +0000171813 00000 n +0000171877 00000 n +0000171942 00000 n +0000172007 00000 n +0000172072 00000 n +0000172137 00000 n +0000172202 00000 n +0000172267 00000 n +0000172332 00000 n +0000172397 00000 n +0000172460 00000 n +0000172525 00000 n +0000172590 00000 n +0000172655 00000 n +0000172720 00000 n +0000172785 00000 n +0000172850 00000 n +0000172915 00000 n +0000172980 00000 n +0000173044 00000 n +0000173109 00000 n +0000173174 00000 n +0000173239 00000 n +0000173304 00000 n +0000173369 00000 n +0000173434 00000 n +0000173499 00000 n +0000173564 00000 n +0000170262 00000 n +0000179985 00000 n +0000177009 00000 n +0000173818 00000 n +0000177134 00000 n +0000177198 00000 n +0000177263 00000 n +0000177327 00000 n +0000177392 00000 n +0000177457 00000 n +0000177522 00000 n +0000177587 00000 n +0000177652 00000 n +0000177717 00000 n +0000177782 00000 n +0000177847 00000 n +0000177911 00000 n +0000177976 00000 n +0000178041 00000 n +0000178106 00000 n +0000178171 00000 n +0000178236 00000 n +0000178301 00000 n +0000178366 00000 n +0000178431 00000 n +0000178495 00000 n +0000178560 00000 n +0000178625 00000 n +0000178690 00000 n +0000178755 00000 n +0000178820 00000 n +0000178885 00000 n +0000178950 00000 n +0000179015 00000 n +0000179079 00000 n +0000179144 00000 n +0000179208 00000 n +0000179273 00000 n +0000179338 00000 n +0000179403 00000 n +0000179468 00000 n +0000179533 00000 n +0000179598 00000 n +0000179662 00000 n +0000179727 00000 n +0000179792 00000 n +0000179857 00000 n +0000179921 00000 n +0000183414 00000 n +0000185642 00000 n +0000183241 00000 n +0000180136 00000 n +0000183570 00000 n +0000183634 00000 n +0000183699 00000 n +0000183763 00000 n +0000183828 00000 n +0000183891 00000 n +0000183956 00000 n +0000184021 00000 n +0000184085 00000 n +0000184150 00000 n +0000184215 00000 n +0000184280 00000 n +0000184345 00000 n +0000184409 00000 n +0000184474 00000 n +0000184539 00000 n +0000184604 00000 n +0000184669 00000 n +0000184734 00000 n +0000184799 00000 n +0000184864 00000 n +0000184929 00000 n +0000184993 00000 n +0000185058 00000 n +0000185123 00000 n +0000185188 00000 n +0000185253 00000 n +0000185318 00000 n +0000185383 00000 n +0000185448 00000 n +0000185513 00000 n +0000185577 00000 n +0000183383 00000 n +0000188880 00000 n +0000191827 00000 n +0000188707 00000 n +0000185871 00000 n 0000189037 00000 n -0000189102 00000 n -0000189167 00000 n -0000189232 00000 n -0000189297 00000 n -0000189362 00000 n -0000189427 00000 n -0000189492 00000 n -0000189556 00000 n -0000189621 00000 n -0000189686 00000 n -0000189751 00000 n -0000189816 00000 n -0000189881 00000 n -0000189946 00000 n -0000190011 00000 n -0000190075 00000 n -0000190140 00000 n -0000190205 00000 n -0000190270 00000 n -0000190335 00000 n -0000190400 00000 n -0000190465 00000 n -0000190530 00000 n -0000190595 00000 n -0000190660 00000 n -0000190725 00000 n -0000190790 00000 n -0000190855 00000 n -0000190920 00000 n -0000190983 00000 n -0000191048 00000 n -0000191113 00000 n -0000191178 00000 n -0000191243 00000 n -0000191308 00000 n -0000191373 00000 n +0000189101 00000 n +0000189166 00000 n +0000189231 00000 n +0000189296 00000 n +0000189361 00000 n +0000189424 00000 n +0000189489 00000 n +0000189554 00000 n +0000189619 00000 n +0000189684 00000 n +0000189749 00000 n +0000189814 00000 n +0000189879 00000 n +0000189944 00000 n +0000190009 00000 n +0000190074 00000 n +0000190139 00000 n +0000190204 00000 n +0000190269 00000 n +0000190334 00000 n +0000190399 00000 n +0000190464 00000 n +0000190529 00000 n +0000190594 00000 n +0000190659 00000 n +0000190724 00000 n +0000190789 00000 n +0000190854 00000 n +0000190919 00000 n +0000190984 00000 n +0000191049 00000 n +0000191114 00000 n +0000191179 00000 n +0000191244 00000 n +0000191309 00000 n +0000191374 00000 n 0000191438 00000 n 0000191503 00000 n -0000191567 00000 n -0000191632 00000 n -0000191697 00000 n -0000191762 00000 n -0000191827 00000 n -0000191892 00000 n -0000191957 00000 n -0000192022 00000 n -0000188591 00000 n -0000198015 00000 n -0000193938 00000 n -0000192276 00000 n -0000194063 00000 n -0000194127 00000 n -0000194192 00000 n -0000194256 00000 n -0000194321 00000 n -0000194386 00000 n -0000194451 00000 n -0000194516 00000 n -0000194581 00000 n -0000194646 00000 n -0000194711 00000 n -0000194776 00000 n -0000194841 00000 n -0000194906 00000 n -0000194971 00000 n -0000195035 00000 n -0000195100 00000 n -0000195165 00000 n -0000195230 00000 n -0000195295 00000 n -0000195360 00000 n -0000195425 00000 n -0000195490 00000 n -0000195555 00000 n -0000195619 00000 n -0000195684 00000 n -0000195749 00000 n -0000195814 00000 n -0000195879 00000 n -0000195944 00000 n -0000196009 00000 n -0000196074 00000 n -0000196139 00000 n -0000196203 00000 n -0000196268 00000 n -0000196333 00000 n -0000196398 00000 n -0000196463 00000 n -0000196528 00000 n -0000196593 00000 n -0000196658 00000 n -0000196723 00000 n -0000196787 00000 n -0000196852 00000 n -0000196917 00000 n -0000196982 00000 n -0000197047 00000 n -0000197112 00000 n -0000197177 00000 n -0000197242 00000 n -0000197307 00000 n -0000197368 00000 n -0000197433 00000 n -0000197498 00000 n -0000197563 00000 n -0000197628 00000 n -0000197693 00000 n -0000197758 00000 n -0000197823 00000 n -0000197888 00000 n -0000197951 00000 n -0000203867 00000 n -0000200825 00000 n -0000198140 00000 n -0000200950 00000 n -0000201014 00000 n -0000201079 00000 n -0000201143 00000 n -0000201208 00000 n -0000201273 00000 n -0000201338 00000 n -0000201403 00000 n -0000201468 00000 n -0000201533 00000 n -0000201598 00000 n -0000201663 00000 n -0000201728 00000 n -0000201793 00000 n -0000201858 00000 n -0000201923 00000 n -0000201987 00000 n -0000202052 00000 n -0000202117 00000 n -0000202182 00000 n -0000202247 00000 n -0000202312 00000 n -0000202377 00000 n -0000202442 00000 n -0000202507 00000 n -0000202572 00000 n -0000202637 00000 n -0000202702 00000 n -0000202767 00000 n -0000202832 00000 n -0000202897 00000 n -0000202962 00000 n -0000203026 00000 n -0000203091 00000 n -0000203155 00000 n -0000203220 00000 n -0000203285 00000 n -0000203350 00000 n -0000203415 00000 n -0000203480 00000 n -0000203545 00000 n -0000203610 00000 n -0000203675 00000 n -0000203739 00000 n -0000203803 00000 n -0000209208 00000 n -0000207267 00000 n -0000204018 00000 n -0000207392 00000 n -0000207456 00000 n -0000207521 00000 n -0000207585 00000 n -0000207650 00000 n -0000207715 00000 n -0000207779 00000 n -0000207844 00000 n -0000207909 00000 n -0000207974 00000 n -0000208039 00000 n -0000208104 00000 n -0000208169 00000 n -0000208234 00000 n -0000208299 00000 n -0000208364 00000 n -0000208429 00000 n -0000208494 00000 n -0000208559 00000 n -0000208624 00000 n -0000208689 00000 n -0000208754 00000 n -0000208819 00000 n -0000208884 00000 n -0000208948 00000 n -0000209013 00000 n -0000209078 00000 n -0000209143 00000 n -0000212688 00000 n -0000215696 00000 n -0000212515 00000 n -0000209372 00000 n -0000212846 00000 n -0000212910 00000 n -0000212974 00000 n -0000213039 00000 n -0000213104 00000 n -0000213169 00000 n -0000213234 00000 n -0000213299 00000 n -0000213364 00000 n -0000213429 00000 n -0000213493 00000 n -0000213558 00000 n -0000213621 00000 n -0000213685 00000 n -0000213750 00000 n -0000213815 00000 n -0000213880 00000 n -0000213945 00000 n -0000214010 00000 n -0000214075 00000 n -0000214139 00000 n -0000214204 00000 n -0000214269 00000 n -0000214334 00000 n -0000214399 00000 n -0000214464 00000 n -0000214529 00000 n -0000214594 00000 n -0000214659 00000 n -0000214724 00000 n -0000214789 00000 n -0000214854 00000 n -0000214918 00000 n -0000214983 00000 n -0000215048 00000 n -0000215113 00000 n -0000215178 00000 n -0000215243 00000 n -0000215308 00000 n -0000215373 00000 n -0000215438 00000 n -0000215502 00000 n -0000215567 00000 n -0000215632 00000 n -0000212657 00000 n -0000221150 00000 n -0000218568 00000 n -0000215899 00000 n -0000218693 00000 n -0000218757 00000 n -0000218885 00000 n -0000218950 00000 n -0000219015 00000 n -0000219079 00000 n -0000219144 00000 n -0000219209 00000 n -0000219274 00000 n -0000219339 00000 n -0000219403 00000 n -0000219468 00000 n -0000219533 00000 n -0000219598 00000 n -0000219663 00000 n -0000219728 00000 n -0000219793 00000 n -0000219858 00000 n -0000219923 00000 n -0000219988 00000 n -0000220052 00000 n -0000220117 00000 n -0000220245 00000 n -0000220308 00000 n -0000220373 00000 n -0000220438 00000 n -0000220503 00000 n -0000220568 00000 n -0000220633 00000 n -0000220698 00000 n -0000220763 00000 n -0000220828 00000 n -0000220892 00000 n -0000220957 00000 n -0000221022 00000 n -0000221086 00000 n -0000226635 00000 n -0000223792 00000 n -0000221314 00000 n -0000223917 00000 n -0000223981 00000 n -0000224046 00000 n -0000224110 00000 n -0000224175 00000 n -0000224240 00000 n -0000224305 00000 n -0000224370 00000 n -0000224435 00000 n -0000224500 00000 n -0000224565 00000 n -0000224630 00000 n -0000224695 00000 n -0000224760 00000 n -0000224824 00000 n -0000224889 00000 n -0000224954 00000 n -0000225019 00000 n -0000225084 00000 n -0000225148 00000 n -0000225213 00000 n -0000225278 00000 n -0000225343 00000 n -0000225408 00000 n -0000225473 00000 n -0000225538 00000 n -0000225603 00000 n -0000225668 00000 n -0000225733 00000 n -0000225797 00000 n -0000225862 00000 n -0000225927 00000 n -0000225992 00000 n -0000226057 00000 n -0000226183 00000 n -0000226248 00000 n -0000226313 00000 n -0000226377 00000 n -0000226442 00000 n -0000226507 00000 n -0000226571 00000 n -0000459851 00000 n -0000231292 00000 n -0000228643 00000 n -0000226786 00000 n -0000228768 00000 n -0000228832 00000 n -0000228897 00000 n -0000228961 00000 n -0000229026 00000 n -0000229091 00000 n -0000229156 00000 n -0000229221 00000 n -0000229286 00000 n -0000229351 00000 n -0000229416 00000 n -0000229481 00000 n -0000229545 00000 n -0000229610 00000 n -0000229675 00000 n -0000229740 00000 n -0000229805 00000 n -0000229870 00000 n -0000229934 00000 n -0000229999 00000 n -0000230064 00000 n -0000230129 00000 n -0000230194 00000 n -0000230259 00000 n -0000230323 00000 n -0000230388 00000 n -0000230453 00000 n -0000230518 00000 n -0000230583 00000 n -0000230648 00000 n -0000230713 00000 n -0000230778 00000 n -0000230843 00000 n -0000230907 00000 n -0000230972 00000 n -0000231100 00000 n -0000231164 00000 n -0000231228 00000 n -0000232573 00000 n -0000232256 00000 n +0000191568 00000 n +0000191633 00000 n +0000191698 00000 n +0000191763 00000 n +0000188849 00000 n +0000197848 00000 n +0000193771 00000 n +0000192030 00000 n +0000193896 00000 n +0000193960 00000 n +0000194025 00000 n +0000194089 00000 n +0000194154 00000 n +0000194219 00000 n +0000194284 00000 n +0000194349 00000 n +0000194414 00000 n +0000194479 00000 n +0000194544 00000 n +0000194609 00000 n +0000194673 00000 n +0000194738 00000 n +0000194803 00000 n +0000194868 00000 n +0000194933 00000 n +0000194998 00000 n +0000195063 00000 n +0000195128 00000 n +0000195193 00000 n +0000195258 00000 n +0000195323 00000 n +0000195388 00000 n +0000195452 00000 n +0000195517 00000 n +0000195582 00000 n +0000195647 00000 n +0000195712 00000 n +0000195777 00000 n +0000195842 00000 n +0000195907 00000 n +0000195972 00000 n +0000196036 00000 n +0000196101 00000 n +0000196166 00000 n +0000196231 00000 n +0000196296 00000 n +0000196361 00000 n +0000196426 00000 n +0000196491 00000 n +0000196556 00000 n +0000196620 00000 n +0000196685 00000 n +0000196750 00000 n +0000196815 00000 n +0000196880 00000 n +0000196945 00000 n +0000197010 00000 n +0000197075 00000 n +0000197140 00000 n +0000197201 00000 n +0000197266 00000 n +0000197331 00000 n +0000197396 00000 n +0000197461 00000 n +0000197526 00000 n +0000197591 00000 n +0000197656 00000 n +0000197721 00000 n +0000197784 00000 n +0000203591 00000 n +0000200551 00000 n +0000197973 00000 n +0000200676 00000 n +0000200740 00000 n +0000200805 00000 n +0000200869 00000 n +0000200934 00000 n +0000200999 00000 n +0000201064 00000 n +0000201129 00000 n +0000201194 00000 n +0000201259 00000 n +0000201324 00000 n +0000201389 00000 n +0000201453 00000 n +0000201518 00000 n +0000201583 00000 n +0000201648 00000 n +0000201713 00000 n +0000201778 00000 n +0000201843 00000 n +0000201908 00000 n +0000201973 00000 n +0000202037 00000 n +0000202102 00000 n +0000202167 00000 n +0000202232 00000 n +0000202297 00000 n +0000202362 00000 n +0000202426 00000 n +0000202490 00000 n +0000202555 00000 n +0000202620 00000 n +0000202685 00000 n +0000202750 00000 n +0000202815 00000 n +0000202880 00000 n +0000202945 00000 n +0000203009 00000 n +0000203074 00000 n +0000203139 00000 n +0000203204 00000 n +0000203269 00000 n +0000203334 00000 n +0000203399 00000 n +0000203463 00000 n +0000203527 00000 n +0000210004 00000 n +0000207285 00000 n +0000203742 00000 n +0000207410 00000 n +0000207474 00000 n +0000207539 00000 n +0000207603 00000 n +0000207668 00000 n +0000207733 00000 n +0000207798 00000 n +0000207863 00000 n +0000207928 00000 n +0000207993 00000 n +0000208058 00000 n +0000208123 00000 n +0000208187 00000 n +0000208252 00000 n +0000208317 00000 n +0000208382 00000 n +0000208447 00000 n +0000208512 00000 n +0000208576 00000 n +0000208641 00000 n +0000208706 00000 n +0000208771 00000 n +0000208836 00000 n +0000208901 00000 n +0000208966 00000 n +0000209031 00000 n +0000209096 00000 n +0000209161 00000 n +0000209226 00000 n +0000209291 00000 n +0000209356 00000 n +0000209420 00000 n +0000209485 00000 n +0000209550 00000 n +0000209615 00000 n +0000209680 00000 n +0000209744 00000 n +0000209809 00000 n +0000209874 00000 n +0000209939 00000 n +0000213486 00000 n +0000216494 00000 n +0000213313 00000 n +0000210168 00000 n +0000213644 00000 n +0000213708 00000 n +0000213772 00000 n +0000213837 00000 n +0000213902 00000 n +0000213967 00000 n +0000214032 00000 n +0000214097 00000 n +0000214162 00000 n +0000214227 00000 n +0000214291 00000 n +0000214356 00000 n +0000214419 00000 n +0000214483 00000 n +0000214548 00000 n +0000214613 00000 n +0000214678 00000 n +0000214743 00000 n +0000214808 00000 n +0000214873 00000 n +0000214937 00000 n +0000215002 00000 n +0000215067 00000 n +0000215132 00000 n +0000215197 00000 n +0000215262 00000 n +0000215327 00000 n +0000215392 00000 n +0000215457 00000 n +0000215522 00000 n +0000215587 00000 n +0000215652 00000 n +0000215716 00000 n +0000215781 00000 n +0000215846 00000 n +0000215911 00000 n +0000215976 00000 n +0000216041 00000 n +0000216106 00000 n +0000216171 00000 n +0000216236 00000 n +0000216300 00000 n +0000216365 00000 n +0000216430 00000 n +0000213455 00000 n +0000221944 00000 n +0000219362 00000 n +0000216697 00000 n +0000219487 00000 n +0000219551 00000 n +0000219679 00000 n +0000219744 00000 n +0000219809 00000 n +0000219873 00000 n +0000219938 00000 n +0000220003 00000 n +0000220068 00000 n +0000220133 00000 n +0000220197 00000 n +0000220262 00000 n +0000220327 00000 n +0000220392 00000 n +0000220457 00000 n +0000220522 00000 n +0000220587 00000 n +0000220652 00000 n +0000220717 00000 n +0000220782 00000 n +0000220846 00000 n +0000220911 00000 n +0000221039 00000 n +0000221102 00000 n +0000221167 00000 n +0000221232 00000 n +0000221297 00000 n +0000221362 00000 n +0000221427 00000 n +0000221492 00000 n +0000221557 00000 n +0000221622 00000 n +0000221686 00000 n +0000221751 00000 n +0000221816 00000 n +0000221880 00000 n +0000227338 00000 n +0000224492 00000 n +0000222108 00000 n +0000224617 00000 n +0000224681 00000 n +0000224746 00000 n +0000224810 00000 n +0000224875 00000 n +0000224940 00000 n +0000225005 00000 n +0000225070 00000 n +0000225135 00000 n +0000225200 00000 n +0000225265 00000 n +0000225330 00000 n +0000225395 00000 n +0000225460 00000 n +0000225525 00000 n +0000225590 00000 n +0000225655 00000 n +0000225720 00000 n +0000225784 00000 n +0000225849 00000 n +0000225914 00000 n +0000225979 00000 n +0000226044 00000 n +0000226109 00000 n +0000226174 00000 n +0000226238 00000 n +0000226303 00000 n +0000226368 00000 n +0000226433 00000 n +0000226498 00000 n +0000226563 00000 n +0000226628 00000 n +0000226693 00000 n +0000226758 00000 n +0000226822 00000 n +0000226887 00000 n +0000226952 00000 n +0000227017 00000 n +0000227082 00000 n +0000227147 00000 n +0000227212 00000 n +0000227276 00000 n +0000461531 00000 n +0000232533 00000 n +0000229037 00000 n +0000227476 00000 n +0000229162 00000 n +0000229226 00000 n +0000229291 00000 n +0000229355 00000 n +0000229420 00000 n +0000229485 00000 n +0000229550 00000 n +0000229615 00000 n +0000229680 00000 n +0000229745 00000 n +0000229873 00000 n +0000229938 00000 n +0000230003 00000 n +0000230068 00000 n +0000230133 00000 n +0000230198 00000 n +0000230263 00000 n +0000230328 00000 n +0000230392 00000 n +0000230457 00000 n +0000230522 00000 n +0000230587 00000 n +0000230652 00000 n +0000230717 00000 n +0000230782 00000 n +0000230847 00000 n +0000230912 00000 n +0000230976 00000 n +0000231041 00000 n +0000231106 00000 n +0000231171 00000 n +0000231236 00000 n +0000231301 00000 n +0000231365 00000 n 0000231430 00000 n -0000232381 00000 n -0000232445 00000 n -0000232509 00000 n -0000232672 00000 n -0000232697 00000 n -0000234996 00000 n -0000232878 00000 n -0000232984 00000 n -0000235244 00000 n -0000235924 00000 n -0000236134 00000 n -0000248119 00000 n -0000236362 00000 n -0000236465 00000 n -0000248361 00000 n -0000249085 00000 n -0000249319 00000 n -0000262831 00000 n -0000249642 00000 n -0000249749 00000 n -0000263065 00000 n -0000263816 00000 n -0000264042 00000 n -0000275076 00000 n -0000264189 00000 n -0000264287 00000 n -0000275316 00000 n -0000275994 00000 n -0000276225 00000 n -0000277336 00000 n -0000276280 00000 n -0000276377 00000 n -0000277579 00000 n -0000278189 00000 n -0000278393 00000 n -0000288131 00000 n -0000279023 00000 n -0000279158 00000 n -0000288371 00000 n -0000289452 00000 n -0000289656 00000 n -0000291497 00000 n -0000289789 00000 n -0000289893 00000 n -0000291744 00000 n -0000292401 00000 n -0000292611 00000 n -0000294296 00000 n -0000292724 00000 n -0000292830 00000 n -0000294545 00000 n -0000295198 00000 n -0000295409 00000 n -0000301343 00000 n -0000295806 00000 n -0000295921 00000 n -0000301583 00000 n -0000302409 00000 n -0000302612 00000 n -0000307826 00000 n -0000302938 00000 n -0000303048 00000 n -0000308070 00000 n -0000308831 00000 n -0000309036 00000 n -0000314963 00000 n -0000309479 00000 n -0000309587 00000 n -0000315203 00000 n -0000316062 00000 n -0000316266 00000 n -0000318578 00000 n -0000316422 00000 n -0000316528 00000 n -0000318821 00000 n -0000319480 00000 n -0000319684 00000 n -0000321704 00000 n -0000319798 00000 n -0000319902 00000 n -0000321946 00000 n -0000322591 00000 n -0000322796 00000 n -0000325594 00000 n -0000323041 00000 n -0000323148 00000 n -0000325834 00000 n -0000326553 00000 n -0000326757 00000 n -0000333125 00000 n -0000327186 00000 n -0000327301 00000 n -0000333366 00000 n -0000334208 00000 n -0000457762 00000 n -0000334413 00000 n -0000457850 00000 n -0000334440 00000 n -0000457647 00000 n -0000334467 00000 n -0000334492 00000 n -0000334725 00000 n -0000334942 00000 n -0000338857 00000 n -0000335254 00000 n -0000335360 00000 n -0000339099 00000 n -0000339834 00000 n -0000340038 00000 n -0000342506 00000 n -0000340250 00000 n -0000340356 00000 n -0000342746 00000 n -0000343429 00000 n -0000343633 00000 n -0000352380 00000 n -0000344129 00000 n -0000344252 00000 n -0000352621 00000 n -0000353603 00000 n -0000353808 00000 n -0000355818 00000 n -0000353922 00000 n -0000354026 00000 n -0000356060 00000 n -0000356706 00000 n -0000356911 00000 n -0000359304 00000 n -0000357143 00000 n -0000357249 00000 n -0000359545 00000 n -0000360239 00000 n -0000360444 00000 n -0000368843 00000 n -0000360956 00000 n -0000361079 00000 n -0000369085 00000 n -0000370035 00000 n -0000370241 00000 n -0000376041 00000 n -0000370617 00000 n -0000370725 00000 n -0000376281 00000 n -0000377094 00000 n -0000377297 00000 n -0000378346 00000 n -0000377375 00000 n -0000377475 00000 n -0000378586 00000 n -0000379208 00000 n -0000379412 00000 n -0000383398 00000 n -0000379702 00000 n -0000379808 00000 n -0000383639 00000 n -0000384372 00000 n -0000384577 00000 n -0000386136 00000 n -0000384670 00000 n -0000384771 00000 n -0000386375 00000 n -0000387001 00000 n -0000387203 00000 n -0000389440 00000 n -0000387382 00000 n -0000387488 00000 n -0000389681 00000 n -0000390350 00000 n -0000390555 00000 n -0000393567 00000 n -0000390781 00000 n -0000390888 00000 n -0000393809 00000 n -0000394511 00000 n -0000394717 00000 n -0000394805 00000 n -0000395849 00000 n -0000394883 00000 n -0000394983 00000 n -0000396090 00000 n -0000396714 00000 n -0000396919 00000 n -0000398722 00000 n -0000397030 00000 n -0000397133 00000 n -0000398964 00000 n -0000399607 00000 n -0000406784 00000 n -0000399813 00000 n -0000410557 00000 n -0000407017 00000 n -0000413317 00000 n -0000410837 00000 n -0000436975 00000 n -0000413558 00000 n -0000451357 00000 n -0000437282 00000 n -0000454629 00000 n -0000451595 00000 n -0000457395 00000 n -0000454895 00000 n -0000459951 00000 n -0000460051 00000 n -0000464235 00000 n -0000464900 00000 n -0000465569 00000 n -0000466238 00000 n -0000466904 00000 n -0000467573 00000 n -0000468214 00000 n -0000468819 00000 n -0000469425 00000 n -0000470029 00000 n -0000470635 00000 n -0000471241 00000 n -0000471845 00000 n -0000472451 00000 n -0000473056 00000 n -0000473663 00000 n -0000474266 00000 n -0000474872 00000 n -0000475478 00000 n -0000476082 00000 n -0000476688 00000 n -0000477294 00000 n -0000477900 00000 n -0000478526 00000 n -0000479160 00000 n -0000479795 00000 n -0000480427 00000 n -0000481062 00000 n -0000481697 00000 n -0000482332 00000 n -0000482964 00000 n -0000483598 00000 n -0000484235 00000 n -0000484866 00000 n -0000485501 00000 n -0000486136 00000 n -0000486771 00000 n -0000487534 00000 n -0000488184 00000 n -0000488946 00000 n -0000489987 00000 n -0000490096 00000 n -0000490451 00000 n -0000490604 00000 n -0000490698 00000 n -0000490738 00000 n -0000490870 00000 n +0000231495 00000 n +0000231560 00000 n +0000231625 00000 n +0000231690 00000 n +0000231755 00000 n +0000231820 00000 n +0000231885 00000 n +0000231950 00000 n +0000232015 00000 n +0000232080 00000 n +0000232145 00000 n +0000232210 00000 n +0000232275 00000 n +0000232338 00000 n +0000232403 00000 n +0000232468 00000 n +0000234703 00000 n +0000234067 00000 n +0000232645 00000 n +0000234192 00000 n +0000234319 00000 n +0000234383 00000 n +0000234447 00000 n +0000234511 00000 n +0000234575 00000 n +0000234639 00000 n +0000234815 00000 n +0000234840 00000 n +0000237139 00000 n +0000235021 00000 n +0000235127 00000 n +0000237387 00000 n +0000238067 00000 n +0000238277 00000 n +0000250262 00000 n +0000238505 00000 n +0000238608 00000 n +0000250504 00000 n +0000251228 00000 n +0000251462 00000 n +0000264974 00000 n +0000251785 00000 n +0000251892 00000 n +0000265208 00000 n +0000265959 00000 n +0000266185 00000 n +0000277219 00000 n +0000266332 00000 n +0000266430 00000 n +0000277459 00000 n +0000278137 00000 n +0000278368 00000 n +0000279479 00000 n +0000278423 00000 n +0000278520 00000 n +0000279722 00000 n +0000280332 00000 n +0000280536 00000 n +0000290274 00000 n +0000281166 00000 n +0000281301 00000 n +0000290514 00000 n +0000291595 00000 n +0000291799 00000 n +0000293640 00000 n +0000291932 00000 n +0000292036 00000 n +0000293887 00000 n +0000294544 00000 n +0000294754 00000 n +0000296439 00000 n +0000294867 00000 n +0000294973 00000 n +0000296688 00000 n +0000297341 00000 n +0000297552 00000 n +0000303486 00000 n +0000297949 00000 n +0000298064 00000 n +0000303726 00000 n +0000304552 00000 n +0000304755 00000 n +0000309647 00000 n +0000305073 00000 n +0000305183 00000 n +0000309891 00000 n +0000310644 00000 n +0000310849 00000 n +0000316776 00000 n +0000311292 00000 n +0000311400 00000 n +0000317016 00000 n +0000317875 00000 n +0000318079 00000 n +0000320391 00000 n +0000318235 00000 n +0000318341 00000 n +0000320634 00000 n +0000321293 00000 n +0000321497 00000 n +0000323517 00000 n +0000321611 00000 n +0000321715 00000 n +0000323759 00000 n +0000324404 00000 n +0000324609 00000 n +0000327407 00000 n +0000324854 00000 n +0000324961 00000 n +0000327647 00000 n +0000328366 00000 n +0000328570 00000 n +0000334938 00000 n +0000328999 00000 n +0000329114 00000 n +0000335179 00000 n +0000336021 00000 n +0000459442 00000 n +0000336226 00000 n +0000459530 00000 n +0000336253 00000 n +0000459327 00000 n +0000336280 00000 n +0000336305 00000 n +0000336538 00000 n +0000336755 00000 n +0000340670 00000 n +0000337067 00000 n +0000337173 00000 n +0000340912 00000 n +0000341647 00000 n +0000341851 00000 n +0000344319 00000 n +0000342063 00000 n +0000342169 00000 n +0000344559 00000 n +0000345242 00000 n +0000345446 00000 n +0000354193 00000 n +0000345942 00000 n +0000346065 00000 n +0000354434 00000 n +0000355416 00000 n +0000355621 00000 n +0000357631 00000 n +0000355735 00000 n +0000355839 00000 n +0000357873 00000 n +0000358519 00000 n +0000358724 00000 n +0000361117 00000 n +0000358956 00000 n +0000359062 00000 n +0000361358 00000 n +0000362052 00000 n +0000362257 00000 n +0000370656 00000 n +0000362769 00000 n +0000362892 00000 n +0000370898 00000 n +0000371848 00000 n +0000372054 00000 n +0000377854 00000 n +0000372430 00000 n +0000372538 00000 n +0000378094 00000 n +0000378907 00000 n +0000379110 00000 n +0000380159 00000 n +0000379188 00000 n +0000379288 00000 n +0000380399 00000 n +0000381021 00000 n +0000381225 00000 n +0000385211 00000 n +0000381515 00000 n +0000381621 00000 n +0000385452 00000 n +0000386185 00000 n +0000386390 00000 n +0000387949 00000 n +0000386483 00000 n +0000386584 00000 n +0000388188 00000 n +0000388814 00000 n +0000389016 00000 n +0000391253 00000 n +0000389195 00000 n +0000389301 00000 n +0000391494 00000 n +0000392163 00000 n +0000392368 00000 n +0000395251 00000 n +0000392589 00000 n +0000392696 00000 n +0000395493 00000 n +0000396191 00000 n +0000396397 00000 n +0000396485 00000 n +0000397529 00000 n +0000396563 00000 n +0000396663 00000 n +0000397770 00000 n +0000398394 00000 n +0000398599 00000 n +0000400402 00000 n +0000398710 00000 n +0000398813 00000 n +0000400644 00000 n +0000401287 00000 n +0000408464 00000 n +0000401493 00000 n +0000412237 00000 n +0000408697 00000 n +0000414997 00000 n +0000412517 00000 n +0000438655 00000 n +0000415238 00000 n +0000453037 00000 n +0000438962 00000 n +0000456309 00000 n +0000453275 00000 n +0000459075 00000 n +0000456575 00000 n +0000461631 00000 n +0000461731 00000 n +0000465915 00000 n +0000466580 00000 n +0000467249 00000 n +0000467918 00000 n +0000468584 00000 n +0000469253 00000 n +0000469921 00000 n +0000470549 00000 n +0000471155 00000 n +0000471761 00000 n +0000472365 00000 n +0000472971 00000 n +0000473577 00000 n +0000474180 00000 n +0000474787 00000 n +0000475392 00000 n +0000475998 00000 n +0000476602 00000 n +0000477208 00000 n +0000477814 00000 n +0000478418 00000 n +0000479024 00000 n +0000479629 00000 n +0000480238 00000 n +0000480868 00000 n +0000481503 00000 n +0000482138 00000 n +0000482770 00000 n +0000483405 00000 n +0000484040 00000 n +0000484671 00000 n +0000485308 00000 n +0000485942 00000 n +0000486577 00000 n +0000487209 00000 n +0000487844 00000 n +0000488479 00000 n +0000489141 00000 n +0000489891 00000 n +0000490539 00000 n +0000491375 00000 n +0000492228 00000 n +0000492583 00000 n +0000492737 00000 n +0000492831 00000 n +0000492871 00000 n +0000493003 00000 n trailer -<< /Size 1895 /Root 1893 0 R /Info 1894 0 R /ID [ <2E85B73DACE03732EB5E6D180AE6AD32> <2E85B73DACE03732EB5E6D180AE6AD32> ] >> +<< /Size 1920 /Root 1918 0 R /Info 1919 0 R /ID [ <CE3FAA8CB68C789CB36052F565B87EB6> <CE3FAA8CB68C789CB36052F565B87EB6> ] >> startxref -491435 +493565 %%EOF diff --git a/support/texlab/CHANGELOG.md b/support/texlab/CHANGELOG.md index 85f8d0bdb3..5b12294b3e 100644 --- a/support/texlab/CHANGELOG.md +++ b/support/texlab/CHANGELOG.md @@ -5,7 +5,73 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [4.2.0] - 03.07.2022 +## [5.0.0] - 2022-12-29 + +### Changed + +- _BREAKING_: `texlab.rootDirectory` is now used as the folder path from which the compiler is executed + relative to the main document. By default it is equal to `"."`. For more information, please visit the wiki. +- Improve performance of completion by a huge margin due to a faster filtering method used internally +- Do not discover project files beyond the provided workspace folders +- Try to guess the root directory by checking for files such as `.latexmkrc` or `Tectonic.toml` if `texlab.rootDirectory` is not set + +### Fixed + +- Update positions of reported build diagnostics when editing the affected line +- Do not treat links to files as bidirectional by default. This prevents issues where `texlab` ends up compiling the wrong file + in projects with shared files ([#806](https://github.com/latex-lsp/texlab/issues/806), [#757](https://github.com/latex-lsp/texlab/issues/757), [#679](https://github.com/latex-lsp/texlab/issues/679)) +- Fix coverage of directories which need to be watched for changes ([#502](https://github.com/latex-lsp/texlab/issues/502), [#491](https://github.com/latex-lsp/texlab/issues/491)) +- Resolve links of the `import` package correctly +- Use `filterText` of completion items when filtering internally ([#829](https://github.com/latex-lsp/texlab/issues/829)) + +## [4.3.2] - 2022-11-20 + +### Fixed + +- Do not try to run the TeX engine on package files and fail the build instead ([#801](https://github.com/latex-lsp/texlab/issues/801)) +- Handle URIs with URL-encoded drive letters on Windows ([#802](https://github.com/latex-lsp/texlab/issues/802)) +- Parse BibTeX entries with unbalanced quotes correctly ([#809](https://github.com/latex-lsp/texlab/issues/809)) +- Provide completion for more acronym commands ([#813](https://github.com/latex-lsp/texlab/issues/813)) +- Fix parsing acronym definitions ([#813](https://github.com/latex-lsp/texlab/issues/813)) + +## [4.3.1] - 2022-10-22 + +### Fixed + +- Do not crash with a stack overflow when trying to load packages with many internal dependencies ([#793](https://github.com/latex-lsp/texlab/issues/793)) +- Normalize drive letters of all document URIs +- Fix parsing commands that take file paths as arguments ([#789](https://github.com/latex-lsp/texlab/issues/789)) +- Use the correct working directory and command line arguments when calling `latexindent` ([#645](https://github.com/latex-lsp/texlab/issues/645)) +- Fix publishing to CTAN + +## [4.3.0] - 2022-09-25 + +### Added + +- Add inlay hints for `\label{...}` ([#753](https://github.com/latex-lsp/texlab/issues/753)) + +### Fixed + +- Improve accuracy of the error locations reported by the TeX engine ([#738](https://github.com/latex-lsp/texlab/issues/738)) +- Reduce number of false positive errors reported by `texlab` ([#745](https://github.com/latex-lsp/texlab/issues/745)) + +## [4.2.2] - 2022-08-28 + +### Fixed + +- Do not watch the same directory multiple times, which can result in a memory leak on Windows ([#737](https://github.com/latex-lsp/texlab/issues/679)) +- Fix detection of root document when sharing files between projects ([#679](https://github.com/latex-lsp/texlab/issues/679)) +- Fix text synchronization problem caused by file watcher ([#724](https://github.com/latex-lsp/texlab/issues/724)) + +## [4.2.1] - 2022-08-05 + +### Fixed + +- Deserialize server options with missing keys (or not keys at all) correctly ([#707](https://github.com/latex-lsp/texlab/issues/707)) +- Pass `chktexrc` files if they are not in the current directory ([#683](https://github.com/latex-lsp/texlab/issues/683)) +- Revert back to server-side file watching due to lack of client support ([#679](https://github.com/latex-lsp/texlab/issues/679)) + +## [4.2.0] - 2022-07-03 ### Added @@ -22,7 +88,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parse incomplete server options correctly ([#651](https://github.com/latex-lsp/texlab/issues/651)) -## [4.1.0] - 12.06.2022 +## [4.1.0] - 2022-06-12 ### Added @@ -38,7 +104,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow brackets in included file paths ([#639](https://github.com/latex-lsp/texlab/issues/639)) - Allow commands in included file paths ([#641](https://github.com/latex-lsp/texlab/issues/641)) -## [4.0.0] - 25.05.2022 +## [4.0.0] - 2022-05-25 ### Added @@ -63,7 +129,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow optional arguments in environment definitions ([#570](https://github.com/latex-lsp/texlab/issues/570)) - Allow `=` in include paths ([#568](https://github.com/latex-lsp/texlab/issues/568)) -## [3.3.2] - 26.02.2022 +## [3.3.2] - 2022-02-26 ### Fixed @@ -78,7 +144,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Make directory path in `\import` optional ([#540](https://github.com/latex-lsp/texlab/issues/540)) - Do not spam workspace/configuration requests ([#533](https://github.com/latex-lsp/texlab/issues/533)) -## [3.3.1] - 10.11.2021 +## [3.3.1] - 2021-11-10 ### Fixed @@ -87,7 +153,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix a bug that sometimes causes the `aux` file to pick up the diagnostics of the `tex` file ([#502](https://github.com/latex-lsp/texlab/issues/502)) - Fix a bug that sometimes prevents `log` files from being reanalyzed ([#502](https://github.com/latex-lsp/texlab/issues/502)) -## [3.3.0] - 10.10.2021 +## [3.3.0] - 2021-10-10 ### Added @@ -103,7 +169,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Prevent `texlab` from hanging because of unanswered configuration requests sent to Emacs ([#456](https://github.com/latex-lsp/texlab/issues/456)) - Re-analyze the workspace if the initial configuration has been received late -## [3.2.0] - 12.06.2021 +## [3.2.0] - 2021-06-12 ### Added @@ -122,7 +188,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix conditional compilation of the `citation` feature. -## [3.1.0] - 03.06.2021 +## [3.1.0] - 2021-06-03 ### Added @@ -140,14 +206,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -## [3.0.1] - 22.05.2021 +## [3.0.1] - 2021-05-22 ### Fixed - Sometimes the log parser does not pick up errors from the log file ([#426](https://github.com/latex-lsp/texlab/issues/426)) - Fix a bug involving characters that are not part of the ASCII charset ([#428](https://github.com/latex-lsp/texlab/issues/428)) -## [3.0.0] - 16.05.2021 +## [3.0.0] - 2021-05-16 ### Added @@ -180,13 +246,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Hopefully fixes the ChkTeX spamming issue ([#186](https://github.com/latex-lsp/texlab/issues/186)) - Reduce CPU-load when idle ([#400](https://github.com/latex-lsp/texlab/issues/400)) -## [2.2.2] - 10.01.2021 +## [2.2.2] - 2021-01-10 ### Fixed - Fix compilation on `arm64-apple-darwin` (Apple Silicon) ([#343](https://github.com/latex-lsp/texlab/issues/343)) -## [2.2.1] - 06.01.2021 +## [2.2.1] - 2021-01-06 ### Added @@ -201,7 +267,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix compilation on `aarch64` and `armv7l` ([#289](https://github.com/latex-lsp/texlab/issues/289)) -## [2.2.0] - 27.05.2020 +## [2.2.0] - 2020-05-27 ### Added @@ -216,7 +282,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix the ordering of completion items when using `lsp-mode` ([#227](https://github.com/latex-lsp/texlab/issues/227)) - Fix preview when using custom class files ([#228](https://github.com/latex-lsp/texlab/issues/228)) -## [2.1.0] - 10.05.2020 +## [2.1.0] - 2020-05-10 ### Added @@ -229,7 +295,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix a parsing error that caused `texlab` to take 100% CPU usage in some cases ([#212](https://github.com/latex-lsp/texlab/issues/212)) - Prevent building the same file multiple times at once -## [2.0.0] - 20.04.2020 +## [2.0.0] - 2020-04-20 ### Added @@ -253,7 +319,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improve performance of completion (when completing LaTeX commands) - Improve workspace detection algorithm -## [1.10.0] - 11.02.2020 +## [1.10.0] - 2020-02-11 ### Added @@ -266,7 +332,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Show all digits of chktex warning number ([#160](https://github.com/latex-lsp/texlab/issues/160)) -## [1.9.0] - 30.12.2019 +## [1.9.0] - 2019-12-30 ### Added @@ -282,7 +348,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Run LaTeX linter when opening a file if enabled - Handle `\hyphen` when rendering citations -## [1.8.0] - 01.12.2019 +## [1.8.0] - 2019-12-01 ### Added @@ -294,7 +360,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Change license to GPLv3 - Do not require Node.js when building the server (#[87](https://github.com/latex-lsp/texlab/issues/87)) -## [1.7.0] - 20.11.2019 +## [1.7.0] - 2019-11-20 ### Added @@ -315,7 +381,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#110](https://github.com/latex-lsp/texlab/issues/110)) - Fix potential crash in "Goto Definition" -## [1.6.0] - 29.09.2019 +## [1.6.0] - 2019-09-29 ### Added @@ -341,7 +407,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix filter text of citations with braces inside a field - Handle invalid UTF-8 in log files -## [1.5.0] - 27.08.2019 +## [1.5.0] - 2019-08-27 ### Added @@ -357,7 +423,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Do not run ChkTeX on BibTeX files - Fix build freezes on Windows ([#63](https://github.com/latex-lsp/texlab/issues/63)) -## [1.4.1] - 22.08.2019 +## [1.4.1] - 2019-08-22 ### Added @@ -369,7 +435,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix rendering of theorem labels - Handle Windows paths correctly -## [1.4.0] - 20.08.2019 +## [1.4.0] - 2019-08-20 ### Added @@ -383,7 +449,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use LocationLink for "peek definition" when possible - Node.js is no longer a dependency -## [1.3.0] - 06.08.2019 +## [1.3.0] - 2019-08-06 ### Added @@ -398,7 +464,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Build cancellation has been reimplemented ([#47](https://github.com/latex-lsp/texlab/issues/47), [#63](https://github.com/latex-lsp/texlab/issues/63)) -## [1.2.0] - 23.07.2019 +## [1.2.0] - 2019-07-23 ### Added @@ -409,7 +475,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The index mechanism has been removed. Packages are now indexed with a script beforehand. -## [1.1.0] - 13.07.2019 +## [1.1.0] - 2019-07-13 ### Added @@ -427,7 +493,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix preselect for environments with missing braces -## [1.0.0] - 04.07.2019 +## [1.0.0] - 2019-07-04 ### Added @@ -464,14 +530,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Do not depend on the `workspace/configuration` request (#[22](https://github.com/latex-lsp/texlab/issues/22)) - Prevent completion from triggering too often -## [0.4.2] - 10.04.2019 +## [0.4.2] - 2019-04-10 ### Fixed - Fix completion inside `\( \)`. ([#14](https://github.com/latex-lsp/texlab/issues/14)) - Do not crash on invalid requests. -## [0.4.1] - 30.03.2019 +## [0.4.1] - 2019-03-30 ### Changed @@ -481,7 +547,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improve MiKTeX support ([#8](https://github.com/latex-lsp/texlab-vscode/issues/8)) -## [0.4.0] - 09.03.2019 +## [0.4.0] - 2019-03-09 ### Added @@ -493,7 +559,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improve completion for includes - Improve performance of completion -## [0.3.0] - 05.03.2019 +## [0.3.0] - 2019-03-05 ### Added @@ -510,7 +576,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix crash when hovering over invalid BibTeX entries - Fix a bug where the completion does not get triggered correctly -## [0.2.0] - 01.03.2019 +## [0.2.0] - 2019-03-01 ### Added @@ -523,14 +589,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix completion of file includes - Prevent server crash when opening a locked file -## [0.1.2] - 16.02.2019 +## [0.1.2] - 2019-02-16 ### Fixed - Do not display an error when PDF viewers return a non-zero exit code while performing forward search -## [0.1.1] - 15.02.2019 +## [0.1.1] - 2019-02-15 ### Changed @@ -540,6 +606,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix rendering of completion symbols -## [0.1.0] - 15.02.2019 +## [0.1.0] - 2019-02-15 - Initial release diff --git a/support/texlab/Cargo.lock b/support/texlab/Cargo.lock index cd1348e8c7..7f205d9514 100644 --- a/support/texlab/Cargo.lock +++ b/support/texlab/Cargo.lock @@ -9,15 +9,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] name = "ansi_term" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -28,9 +45,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.58" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7724808837b77f4b4de9d283820f9d98bcf496d5692934b857a2399d31ff22e6" + +[[package]] +name = "arc-swap" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" +checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164" [[package]] name = "assert_unordered" @@ -47,7 +70,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -72,63 +95,39 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.7.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "block-padding", - "byte-tools", - "byteorder", "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] name = "bstr" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ - "lazy_static", "memchr", - "regex-automata", - "serde", ] [[package]] name = "bumpalo" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" - -[[package]] -name = "byte-tools" -version = "0.3.1" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] -name = "byteorder" -version = "1.4.3" +name = "cast" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] -name = "cast" -version = "0.2.7" +name = "cc" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" -dependencies = [ - "rustc_version", -] +checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" [[package]] name = "cfg-if" @@ -138,44 +137,73 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "num-integer", "num-traits", ] [[package]] +name = "ciborium" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" + +[[package]] +name = "ciborium-ll" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] name = "clap" -version = "2.34.0" +version = "3.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ "bitflags", - "textwrap 0.11.0", - "unicode-width", + "clap_lex 0.2.4", + "indexmap", + "textwrap", ] [[package]] name = "clap" -version = "3.2.8" +version = "4.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190814073e85d238f31ff738fcb0bf6910cedeb73376c87cd69291028966fd83" +checksum = "4d63b9e9c07271b9957ad22c173bae2a4d9a81127680962039296abcd2f8251d" dependencies = [ "bitflags", "clap_derive", - "clap_lex", - "indexmap", + "clap_lex 0.3.0", + "is-terminal", "once_cell", - "textwrap 0.15.0", + "strsim", + "termcolor", ] [[package]] name = "clap_derive" -version = "3.2.7" +version = "4.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759bf187376e1afa7b85b959e6a664a3e7a95203415dba952ad19139e798f902" +checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" dependencies = [ "heck", "proc-macro-error", @@ -194,31 +222,43 @@ dependencies = [ ] [[package]] +name = "clap_lex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +dependencies = [ + "os_str_bytes", +] + +[[package]] name = "console" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" +checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", "terminal_size", "winapi", ] [[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] name = "countme" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" [[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -229,15 +269,16 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" dependencies = [ + "anes", "atty", "cast", - "clap 2.34.0", + "ciborium", + "clap 3.2.23", "criterion-plot", - "csv", "itertools", "lazy_static", "num-traits", @@ -246,7 +287,6 @@ dependencies = [ "rayon", "regex", "serde", - "serde_cbor", "serde_derive", "serde_json", "tinytemplate", @@ -255,19 +295,33 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools", ] [[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] name = "crossbeam-channel" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -275,9 +329,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -286,88 +340,94 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", - "once_cell", + "memoffset 0.7.1", "scopeguard", ] [[package]] -name = "crossbeam-utils" -version = "0.8.10" +name = "crossbeam-queue" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" dependencies = [ "cfg-if", - "once_cell", + "crossbeam-utils", ] [[package]] -name = "csv" -version = "1.1.6" +name = "crossbeam-utils" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", + "cfg-if", ] [[package]] -name = "csv-core" -version = "0.1.10" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "memchr", + "generic-array", + "typenum", ] [[package]] name = "dashmap" -version = "5.2.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", - "num_cpus", - "parking_lot", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] -name = "derive_more" -version = "0.99.17" +name = "digest" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn", + "block-buffer", + "crypto-common", ] [[package]] -name = "digest" -version = "0.8.1" +name = "dirs" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ - "generic-array", + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", ] [[package]] name = "either" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "encode_unicode" @@ -394,16 +454,54 @@ dependencies = [ ] [[package]] -name = "fake-simd" +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] @@ -418,22 +516,41 @@ dependencies = [ ] [[package]] -name = "fixedbitset" -version = "0.4.1" +name = "filetime" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" +checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys", +] [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin", +] + +[[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -441,15 +558,35 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] [[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "futures-core" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" + +[[package]] +name = "futures-sink" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" + +[[package]] name = "fuzzy-matcher" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -460,22 +597,38 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.12.4" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", + "version_check", ] [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "globset" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", ] [[package]] @@ -486,9 +639,21 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" @@ -506,58 +671,102 @@ dependencies = [ ] [[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] name = "human_name" -version = "1.0.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d4c0030db95c2e6e68fc240def0fc5bcbecab549c1c856a9f14ec309ccb332" +checksum = "42af7ece82db04720531abb16506781d40a72c8e62ecb0762d39746d2173255e" dependencies = [ + "crossbeam-utils", "libc", "phf", + "phf_codegen", "serde", - "serde_derive", "serde_json", "smallstr", "smallvec", + "unicode-case-mapping", "unicode-normalization", "unicode-segmentation", "unidecode", ] [[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", ] [[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] name = "insta" -version = "1.15.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4126dd76ebfe2561486a1bd6738a33d2029ffb068a99ac446b7f8c77b2e58dbc" +checksum = "e48b08a091dfe5b09a6a9688c468fdd5b4396e92ce09e2eb932f0884b02788a4" dependencies = [ "console", - "once_cell", + "globset", + "lazy_static", + "linked-hash-map", "pest", "pest_derive", "serde", - "serde_json", - "serde_yaml", "similar", + "walkdir", + "yaml-rust", ] [[package]] @@ -570,6 +779,28 @@ dependencies = [ ] [[package]] +name = "io-lifetimes" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" +dependencies = [ + "hermit-abi 0.2.6", + "io-lifetimes", + "rustix", + "windows-sys", +] + +[[package]] name = "isocountry" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -581,24 +812,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "itoa" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jod-thread" @@ -607,15 +832,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b23360e99b8717f20aaa4598f5a6541efbe30630039fbc7706cf954a87947ae" [[package]] +name = "joinery" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72167d68f5fce3b8655487b8038691a3c9984ee769590f93f2a631f4ad64e4f5" + +[[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" dependencies = [ "wasm-bindgen", ] [[package]] +name = "kqueue" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8fc60ba15bf51257aa9807a48a61013db043fcf3a78cb0d916e8e396dcad98" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -623,9 +874,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "linked-hash-map" @@ -634,10 +885,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -689,9 +946,9 @@ dependencies = [ [[package]] name = "lsp-types" -version = "0.93.0" +version = "0.93.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70c74e2173b2b31f8655d33724b4b45ac13f439386f66290f539c22b144c2212" +checksum = "9be6e9c7e2d18f651974370d7aff703f9513e0df6e464fd795660edc77e6ca51" dependencies = [ "bitflags", "serde", @@ -701,18 +958,6 @@ dependencies = [ ] [[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -728,15 +973,63 @@ dependencies = [ ] [[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] name = "miniz_oxide" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] [[package]] +name = "mio" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "notify" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2c66da08abae1c024c01d635253e402341b4060a12e99b31c7594063bf490a" +dependencies = [ + "bitflags", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "mio", + "walkdir", + "winapi", +] + +[[package]] name = "num-integer" version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -757,19 +1050,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] [[package]] name = "once_cell" -version = "1.12.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "oorandom" @@ -778,16 +1071,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] name = "os_str_bytes" -version = "6.1.0" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] name = "parking_lot" @@ -801,9 +1088,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", @@ -814,24 +1101,25 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" -version = "2.1.3" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "cc8bed3549e0f9b0a2a78bf7c0018237a2cdf085eecbbc048e52612438e4e9d0" dependencies = [ + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "cdc078600d06ff90d4ed238f0119d84ab5d43dbaad278b0e33a8820293b32344" dependencies = [ "pest", "pest_generator", @@ -839,9 +1127,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.3" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +checksum = "28a1af60b1c4148bb269006a750cff8e2ea36aff34d2d96cf7be0b14d1bed23c" dependencies = [ "pest", "pest_meta", @@ -852,74 +1140,78 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.1.3" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +checksum = "fec8605d59fc2ae0c6c1aefc0c7c7a9769732017c0ce07f7a9cfffa7b4404f20" dependencies = [ - "maplit", + "once_cell", "pest", - "sha-1", + "sha1", ] [[package]] -name = "petgraph" -version = "0.6.2" +name = "phf" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" dependencies = [ - "fixedbitset", - "indexmap", + "phf_shared", ] [[package]] -name = "phf" -version = "0.10.1" +name = "phf_codegen" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" dependencies = [ - "phf_macros", + "phf_generator", "phf_shared", - "proc-macro-hack", ] [[package]] name = "phf_generator" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" dependencies = [ "phf_shared", "rand", ] [[package]] -name = "phf_macros" -version = "0.10.0" +name = "phf_shared" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", + "siphasher", ] [[package]] -name = "phf_shared" -version = "0.10.0" +name = "pin-project" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ - "siphasher", + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "plotters" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" dependencies = [ "num-traits", "plotters-backend", @@ -930,26 +1222,20 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] [[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -974,25 +1260,19 @@ dependencies = [ ] [[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "e9d89e5dba24725ae5678020bf8f1357a9aa7ff10736b551adbcd3f8d17d766f" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "556d0f47a940e895261e77dc200d5eadfc6ef644c179c6f5edfc105e3a2292c8" dependencies = [ "proc-macro2", ] @@ -1003,47 +1283,30 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rayon" -version = "1.5.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1053,18 +1316,29 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] name = "regex" -version = "1.5.6" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -1072,16 +1346,10 @@ dependencies = [ ] [[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - -[[package]] name = "regex-syntax" -version = "0.6.26" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -1094,13 +1362,13 @@ dependencies = [ [[package]] name = "rowan" -version = "0.15.5" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1f383129e417a6265b16ed78e6e9307748f0863b2ba75f78ff14717db5b017" +checksum = "5811547e7ba31e903fe48c8ceab10d40d70a101f3d15523c847cce91aa71f332" dependencies = [ "countme", "hashbrown", - "memoffset", + "memoffset 0.6.5", "rustc-hash", "text-size", ] @@ -1112,25 +1380,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustc_version" -version = "0.4.0" +name = "rustix" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" dependencies = [ - "semver", + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", ] [[package]] name = "rustversion" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + +[[package]] +name = "salsa-2022" +version = "0.1.0" +source = "git+https://github.com/salsa-rs/salsa?rev=20c7834ff34fd00a41b59bec61f3d5c85ea3abd4#20c7834ff34fd00a41b59bec61f3d5c85ea3abd4" +dependencies = [ + "arc-swap", + "crossbeam", + "crossbeam-utils", + "dashmap", + "hashlink", + "indexmap", + "log", + "parking_lot", + "rustc-hash", + "salsa-2022-macros", + "smallvec", +] + +[[package]] +name = "salsa-2022-macros" +version = "0.1.0" +source = "git+https://github.com/salsa-rs/salsa?rev=20c7834ff34fd00a41b59bec61f3d5c85ea3abd4#20c7834ff34fd00a41b59bec61f3d5c85ea3abd4" +dependencies = [ + "eyre", + "heck", + "proc-macro2", + "quote", + "syn", +] [[package]] name = "same-file" @@ -1148,35 +1451,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "semver" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2333e6df6d6598f2b1974829f853c2b4c5f4a6e503c10af918081aa6f8564e1" - -[[package]] name = "serde" -version = "1.0.138" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" dependencies = [ "serde_derive", ] [[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - -[[package]] name = "serde_derive" -version = "1.0.138" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" dependencies = [ "proc-macro2", "quote", @@ -1185,16 +1472,25 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "8778cc0b528968fe72abec38b5db5a20a70d148116cd9325d2bc5f5180ca3faf" dependencies = [ - "itoa 1.0.2", + "itoa", "ryu", "serde", ] [[package]] +name = "serde_millis" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e2dc780ca5ee2c369d1d01d100270203c4ff923d2a4264812d723766434d00" +dependencies = [ + "serde", +] + +[[package]] name = "serde_regex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1206,9 +1502,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" +checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e" dependencies = [ "proc-macro2", "quote", @@ -1216,34 +1512,21 @@ dependencies = [ ] [[package]] -name = "serde_yaml" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" -dependencies = [ - "indexmap", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha-1" -version = "0.8.2" +name = "sha1" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "block-buffer", + "cfg-if", + "cpufeatures", "digest", - "fake-simd", - "opaque-debug", ] [[package]] name = "similar" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3" +checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" [[package]] name = "siphasher" @@ -1253,18 +1536,18 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "smallstr" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e922794d168678729ffc7e07182721a14219c65814e66e91b839a272fe5ae4f" +checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" dependencies = [ "smallvec", ] [[package]] name = "smallvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "smol_str" @@ -1276,6 +1559,21 @@ dependencies = [ ] [[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +dependencies = [ + "lock_api", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] name = "strum" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1286,9 +1584,9 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4faebde00e8ff94316c01800f9054fd2ba77d30d9e922541913051d1d978918b" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck", "proc-macro2", @@ -1299,9 +1597,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.98" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "09ee3a69cd2c7e06684677e5629b3878b253af05e4714964204279c6bc02cf0b" dependencies = [ "proc-macro2", "quote", @@ -1323,6 +1621,15 @@ dependencies = [ ] [[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] name = "terminal_size" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1334,21 +1641,22 @@ dependencies = [ [[package]] name = "texlab" -version = "4.2.0" +version = "5.0.0" dependencies = [ "anyhow", "assert_unordered", - "byteorder", "chrono", - "clap 3.2.8", + "clap 4.0.29", "criterion", "crossbeam-channel", "dashmap", - "derive_more", + "dirs", "encoding_rs", "encoding_rs_io", + "env_logger", "fern", "flate2", + "flume", "fuzzy-matcher", "human_name", "insta", @@ -1359,23 +1667,24 @@ dependencies = [ "logos", "lsp-server", "lsp-types", + "notify", "once_cell", - "petgraph", "regex", "rowan", "rustc-hash", + "salsa-2022", "serde", "serde_json", + "serde_millis", "serde_regex", "serde_repr", "smol_str", "strum", "tempfile", + "thiserror", "threadpool", "titlecase", "unicode-normalization", - "url", - "uuid", ] [[package]] @@ -1386,33 +1695,24 @@ checksum = "288cb548dbe72b652243ea797201f3d481a0609a967980fcc5b2315ea811560a" [[package]] name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "textwrap" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", @@ -1464,25 +1764,26 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "titlecase" -version = "2.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea7a2f1a76e892e6c07c275e6e851400257304a6e34c0e4e32ebbd3871808802" +checksum = "38397a8cdb017cfeb48bf6c154d6de975ac69ffeed35980fde199d2ee0842042" dependencies = [ + "joinery", "lazy_static", "regex", ] [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unicode-bidi" @@ -1491,31 +1792,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] +name = "unicode-case-mapping" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a391c62ffbc5b6220fdafa353e93b530d21904d82ca1a2e29cdb5cfb4399f" + +[[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" - -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" [[package]] name = "unidecode" @@ -1525,27 +1826,17 @@ checksum = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", "serde", ] [[package]] -name = "uuid" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" -dependencies = [ - "getrandom", -] - -[[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1570,9 +1861,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1580,13 +1871,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -1595,9 +1886,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1605,9 +1896,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", @@ -1618,15 +1909,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" [[package]] name = "web-sys" -version = "0.3.58" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" dependencies = [ "js-sys", "wasm-bindgen", @@ -1665,46 +1956,60 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ + "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", + "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" [[package]] name = "yaml-rust" diff --git a/support/texlab/Cargo.toml b/support/texlab/Cargo.toml index 803f280e39..62e487b394 100644 --- a/support/texlab/Cargo.toml +++ b/support/texlab/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "texlab" description = "LaTeX Language Server" -version = "4.2.0" +version = "5.0.0" license = "GPL-3.0" readme = "README.md" authors = [ @@ -9,7 +9,7 @@ authors = [ "Patrick Förster <patrick.foerster@outlook.de>", ] edition = "2021" -rust-version = "1.58.1" +rust-version = "1.60" homepage = "https://github.com/latex-lsp/texlab" repository = "https://github.com/latex-lsp/texlab" documentation = "https://github.com/latex-lsp/texlab" @@ -33,55 +33,54 @@ test = false [lib] doctest = false -[features] -default = ["completion"] -completion = ["fuzzy-matcher"] - [dependencies] -anyhow = "1.0.58" -byteorder = "1.4.3" -chrono = { version = "0.4.19", default-features = false, features = ["std"] } -clap = { version = "3.2.8", features = [ - "std", - "derive", -], default-features = false } -crossbeam-channel = "0.5.5" -dashmap = "~5.2.0" -derive_more = "0.99.17" +anyhow = "1.0.66" +chrono = { version = "0.4.23", default-features = false, features = ["std"] } +clap = { version = "4.0.29", features = ["derive"] } +crossbeam-channel = "0.5.6" +dashmap = "5.4.0" +dirs = "4.0.0" encoding_rs = "0.8.31" encoding_rs_io = "0.1.7" -fern = "0.6" -flate2 = "1.0.24" -fuzzy-matcher = { version = "0.3.7", optional = true } -human_name = { version = "1.0.3", default-features = false } +fern = "0.6.1" +flate2 = "1.0.25" +flume = "0.10.14" +fuzzy-matcher = { version = "0.3.7", features = ["compact"] } +human_name = { version = "2.0.1", default-features = false } isocountry = "0.3.2" -itertools = "0.10.1" +itertools = "0.10.5" log = "0.4.17" logos = "0.12.1" lsp-server = "0.6.0" -lsp-types = "0.93.0" -once_cell = "1.10.0" -petgraph = "0.6.2" -regex = "1.5.5" -rowan = "0.15.5" +lsp-types = { version = "0.93.2", features = ["proposed"] } +notify = "5.0.0" +once_cell = "1.16.0" +regex = "1.7.0" +rowan = "0.15.10" rustc-hash = "1.1.0" -serde = "1.0.137" -serde_json = "1.0.82" +serde = "1.0.151" +serde_json = "1.0.90" +serde_millis = "0.1.1" serde_regex = "1.1.0" -serde_repr = "0.1.8" +serde_repr = "0.1.10" smol_str = { version = "0.1.23", features = ["serde"] } -strum = { version = "0.24.0", features = ["derive"] } +strum = { version = "0.24.1", features = ["derive"] } tempfile = "3.3.0" +thiserror = "1.0.38" threadpool = "1.8.1" -titlecase = "2.0.0" -unicode-normalization = "0.1.20" -url = { version = "2.2.2", features = ["serde"] } -uuid = { version = "1.1.2", features = ["v4"] } +titlecase = "2.2.1" +unicode-normalization = "0.1.22" + +[dependencies.salsa] +git = "https://github.com/salsa-rs/salsa" +rev = "20c7834ff34fd00a41b59bec61f3d5c85ea3abd4" +package = "salsa-2022" [dev-dependencies] assert_unordered = "0.3.5" -criterion = { version = "0.3.5" } -insta = { version = "1.15.0", features = ["backtrace", "redactions"] } +criterion = { version = "0.4.0" } +env_logger = "0.10.0" +insta = { version = "1.23.0", features = ["glob", "redactions", "json"] } jod-thread = "0.1.2" [profile.release] diff --git a/support/texlab/README.md b/support/texlab/README.md index e43082f20f..6e96e40f75 100644 --- a/support/texlab/README.md +++ b/support/texlab/README.md @@ -1,6 +1,7 @@ [![CI](https://github.com/latex-lsp/texlab/workflows/CI/badge.svg)](https://github.com/latex-lsp/texlab/actions) [![Coverage](https://codecov.io/gh/latex-lsp/texlab/branch/master/graph/badge.svg)](https://codecov.io/gh/latex-lsp/texlab) -[![Rust](https://img.shields.io/badge/rustc-1.58.1%2B-blue)](https://blog.rust-lang.org/2022/01/20/Rust-1.58.1.html) +![Rust](https://img.shields.io/badge/rustc-1.60%2B-blue) +[![Wiki](https://img.shields.io/badge/docs-Wiki-success)](https://github.com/latex-lsp/texlab/wiki) [![GitHub release](https://img.shields.io/github/release/latex-lsp/texlab?label=github)](https://github.com/latex-lsp/texlab/releases) [![crates.io](https://img.shields.io/crates/v/texlab)](https://crates.io/crates/texlab) @@ -12,7 +13,7 @@ A cross-platform implementation of the [Language Server Protocol](https://micros providing rich cross-editing support for the [LaTeX](https://www.latex-project.org/) typesetting system. The server may be used with [any editor that implements the Language Server Protocol](https://microsoft.github.io/language-server-protocol/implementors/tools/). -![Demo](docs/demo.gif) +![Demo](images/demo.gif) ## Getting Started @@ -30,7 +31,7 @@ For a list of supported package managers, you can take a look at [Repology](http A [TeX distribution](https://www.latex-project.org/get/#tex-distributions) is _not_ strictly required to use the server but TexLab cannot compile your documents without one. TexLab supports compiling using [Tectonic](https://tectonic-typesetting.github.io/). -For an example configuration, please see [here](docs/tectonic.md). +For an example configuration, please see [here](https://github.com/latex-lsp/texlab/wiki/Tectonic). On Windows, you may need to install [Microsoft Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-US/download/details.aspx?id=48145). @@ -59,7 +60,9 @@ There is no need for magic comments like `%!TEX root` and TexLab should figure out the dependencies of a file on its own. Note that you may need to set the `texlab.rootDirectory` option for some multi-folder projects. -TexLab features a variety of [options](docs/options.md) which can be used to configure features like building or [forward search](docs/previewing.md). +TexLab features a variety of options which can be used to configure features like building or forward search. + +See the [Wiki](https://github.com/latex-lsp/texlab/wiki) for more information. ## Development @@ -75,8 +78,6 @@ cargo test in the project folder. -For a list of custom messages, please see [here](docs/custom_messages.md). - ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. diff --git a/support/texlab/benches/bench_main.rs b/support/texlab/benches/bench_main.rs index 44364c5d5e..196afb1f43 100644 --- a/support/texlab/benches/bench_main.rs +++ b/support/texlab/benches/bench_main.rs @@ -1,39 +1,22 @@ -use std::sync::Arc; - use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use lsp_types::{ - CompletionParams, Position, TextDocumentIdentifier, TextDocumentPositionParams, Url, +use lsp_types::{Position, Url}; +use texlab::{ + db::{Language, Owner, Workspace}, + parser::parse_latex, + Database, }; -use texlab::{features::FeatureRequest, syntax::latex, DocumentLanguage, Workspace}; fn criterion_benchmark(c: &mut Criterion) { c.bench_function("LaTeX/Parser", |b| { - b.iter(|| latex::parse(black_box(include_str!("../texlab.tex")))); + b.iter(|| parse_latex(black_box(include_str!("../texlab.tex")))); }); c.bench_function("LaTeX/Completion/Command", |b| { - let uri = Arc::new(Url::parse("http://example.com/texlab.tex").unwrap()); - let text = Arc::new(include_str!("../texlab.tex").to_string()); - let mut workspace = Workspace::default(); - workspace - .open(Arc::clone(&uri), text, DocumentLanguage::Latex) - .unwrap(); - - b.iter(|| { - texlab::features::complete(FeatureRequest { - params: CompletionParams { - context: None, - partial_result_params: Default::default(), - work_done_progress_params: Default::default(), - text_document_position: TextDocumentPositionParams::new( - TextDocumentIdentifier::new(uri.as_ref().clone()), - Position::new(0, 1), - ), - }, - workspace: workspace.clone(), - uri: Arc::clone(&uri), - }) - }); + let uri = Url::parse("http://example.com/texlab.tex").unwrap(); + let text = include_str!("../texlab.tex").to_string(); + let mut db = Database::default(); + Workspace::get(&db).open(&mut db, uri.clone(), text, Language::Tex, Owner::Client); + b.iter(|| texlab::features::completion::complete(&db, &uri, Position::new(0, 1))); }); } diff --git a/support/texlab/docs/custom_commands.md b/support/texlab/docs/custom_commands.md deleted file mode 100644 index 2b85787f35..0000000000 --- a/support/texlab/docs/custom_commands.md +++ /dev/null @@ -1,21 +0,0 @@ -# Custom Commands - -The server provides the following commands through the `workspace/executeCommand` request: - -## texlab.cleanAuxiliary - -Removes the auxiliary files produced by compiling the specified LaTeX document. -At the moment, this command simply calls `latexmk -c` with the currently configured output directory. - -Parameters: - -- `document`: `TextDocumentIdentifier` (_Required_) - -## texlab.cleanArtifacts - -Removes the auxiliary files and the artifacts produced by compiling the specified LaTeX document. -At the moment, this command simply calls `latexmk -C` with the currently configured output directory. - -Parameters: - -- `document`: `TextDocumentIdentifier` (_Required_) diff --git a/support/texlab/docs/custom_messages.md b/support/texlab/docs/custom_messages.md deleted file mode 100644 index 0142a76342..0000000000 --- a/support/texlab/docs/custom_messages.md +++ /dev/null @@ -1,102 +0,0 @@ -# Custom Messages - -We extend the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/specification) -with custom messages to provide better LaTeX integration. -These messages are _optional_ and it is up to the client to support them. - -## Build Request - -The build request is sent from the client to the server to build a given LaTeX document. - -_Request_: - -- method: 'textDocument/build' -- params: `BuildTextDocumentParams` defined as follows: - -```typescript -interface BuildTextDocumentParams { - /** - * The text document to build. - */ - textDocument: TextDocumentIdentifier; -} -``` - -_Response_: - -- result: `BuildResult` defined as follows: - -```typescript -interface BuildResult { - /** - * The status of the build process. - */ - status: BuildStatus; -} - -enum BuildStatus { - /** - * The build process terminated without any errors. - */ - Success = 0, - - /** - * The build process terminated with errors. - */ - Error = 1, - - /** - * The build process failed to start or crashed. - */ - Failure = 2, - - /** - * The build process was cancelled. - */ - Cancelled = 3, -} -``` - -## Forward Search Request - -The forward search request is sent from the client to the server when the user requests a forward search via SyncTeX. - -_Request_: - -- method: 'textDocument/forwardSearch' -- params: [`TextDocumentPositionParams`](https://microsoft.github.io/language-server-protocol/specification#textdocumentpositionparams) - -_Response_: - -- result: `ForwardSearchResult` defined as follows: - -```typescript -interface ForwardSearchResult { - /** - * The status of the previewer process. - */ - status: ForwardSearchStatus; -} - -enum ForwardSearchStatus { - /** - * The previewer process executed the command without any errors. - */ - Success = 0, - - /** - * The previewer process executed the command with errors. - */ - Error = 1, - - /** - * The previewer process failed to start or crashed. - */ - Failure = 2, - - /** - * The previewer command is not configured. - */ - Unconfigured = 3, -} -``` diff --git a/support/texlab/docs/lsp_kinds.md b/support/texlab/docs/lsp_kinds.md deleted file mode 100644 index 8d6ad6efc7..0000000000 --- a/support/texlab/docs/lsp_kinds.md +++ /dev/null @@ -1,31 +0,0 @@ -The following table describes the mapping of LaTeX and BibTeX structures -to their `CompletionItemKind` and `SymbolKind`. - -| LaTeX / BibTeX structure | CompletionItemKind | SymbolKind | -| ------------------------- | -------------------- | -------------------- | -| Command | `Function` (3) | `Function` (12) | -| Command Argument | `Value` (12) | `Number` (16) | -| Snippet | `Snippet` (15) | | -| Environment | `Enum` (13) | `Enum` (10) | -| Section | `Module` (9) | `Module` (2) | -| Float | `Method` (2) | `Method` (6) | -| Theorem | `Variable` (6) | `Variable` (13) | -| Equation | `Constant` (21) | `Constant` (14) | -| Enumeration Item | `EnumMember` (20) | `EnumMember` (22) | -| Label | `Constructor` (4) | `Constructor` (9) | -| Folder | `Folder` (19) | `Namespace` (3) | -| File | `File` (17) | `File` (1) | -| PGF Library | `Property` (10) | `Property` (7) | -| TikZ Library | `Property` (10) | `Property` (7) | -| Color | `Color` (16) | | -| Color Model | `Color` (16) | | -| Package | `Class` (7) | `Class` (5) | -| Class | `Class` (7) | `Class` (5) | -| BibTeX Entry (Misc) | `Interface` (8) | `Interface` (11) | -| BibTeX Entry (Article) | `Event` (23) | `Event` (24) | -| BibTeX Entry (Book) | `Struct` (22) | `Struct` (23) | -| BibTeX Entry (Collection) | `TypeParameter` (25) | `TypeParameter` (26) | -| BibTeX Entry (Part) | `Operator` (24) | `Operator` (25) | -| BibTeX Entry (Thesis) | `Unit` (11) | `Object` (19) | -| BibTeX String | `Text` (1) | `String` (15) | -| BibTeX Field | `Field` (5) | `Field` (8) | diff --git a/support/texlab/docs/options.md b/support/texlab/docs/options.md deleted file mode 100644 index 9b3599cce1..0000000000 --- a/support/texlab/docs/options.md +++ /dev/null @@ -1,225 +0,0 @@ -# Configuration - -This document describes the configuration settings -that the server will query from the LSP client / extension. - ---- - -## texlab.rootDirectory - -Defines the directory from which the source files get compiled. -You may need to set this property for multi-folder projects -where TexLab fails to detect the root document. - -**Type:** `string | null` - -**Default value**: `null` - ---- - -## texlab.build.executable - -Defines the executable of the LaTeX build tool. - -**Type:** `string` - -**Default value:** `latexmk` - ---- - -## texlab.build.args - -Defines additional arguments that are passed to the configured LaTeX build tool. -Note that flags and their arguments need to be separate -elements in this array. -To pass the arguments `-foo bar` to a build tool, -`latex.build.args` needs to be `["-foo", "bar"]`. -The placeholder `%f` will be replaced by the server. - -**Placeholders:** - -- `%f`: The path of the TeX file to compile. - -**Type:** `string[]` - -**Default value:** `["-pdf", "-interaction=nonstopmode", "-synctex=1", "%f"]` - ---- - -## texlab.build.forwardSearchAfter - -Set this property to `true` if you want to execute a forward search after a build. - -**Type:** `boolean` - -**Default value:** `false` - ---- - -## texlab.build.onSave - -Set this property to `true` if you want to compile the project after saving a file. - -**Type:** `boolean` - -**Default value:** `false` - ---- - -## texlab.auxDirectory - -Defines the directory containing the build artifacts. -Note that you need to set the output directory in `latex.build.args` too, -if you want to change the build directory. -In this case, use the `-outdir` flag for `latexmk`. - -**Type:** `string` - -**Default value:** `.` (the same directory as the TeX file) - ---- - -## texlab.forwardSearch.executable - -Defines the executable of the PDF previewer. -The previewer needs to support [SyncTeX](http://www.tug.org/TUGboat/tb29-3/tb93laurens.pdf). - -**Type:** `string | null` - -**Default value:** `null` - ---- - -## texlab.forwardSearch.args - -Defines additional arguments that are passed to the configured previewer to perform the forward search. -The placeholders `%f, %p, %l` will be replaced by the server. - -**Placeholders:** - -- `%f`: The path of the current TeX file. -- `%p`: The path of the current PDF file. -- `%l`: The current line number. - -**Type:** `string[] | null` - -**Default value:** `null` - ---- - -## texlab.chktex.onOpenAndSave - -Lint using [chktex](https://www.nongnu.org/chktex/) after opening and saving a file. - -**Type:** `boolean` - -**Default value:** `false` - ---- - -## texlab.chktex.onEdit - -Lint using [chktex](https://www.nongnu.org/chktex/) after editing a file. - -**Type:** `boolean` - -**Default value:** `false` - ---- - -## texlab.diagnosticsDelay - -Delay in milliseconds before reporting diagnostics. - -**Type:** `integer` - -**Default value:** `300` - ---- - -## texlab.diagnostics.allowedPatterns - -A list of regular expressions used to filter the list of reported diagnostics. -If specified, only diagnostics that match _at least one_ of the specified patterns -are sent to the client. - -See also [`texlab.diagnostics.ignoredPatterns`](#texlabdiagnosticsignoredpatterns). - -_Hint_: -If both `allowedPatterns` and `ignoredPatterns` are set, -then allowed patterns are applied first. Afterwards, the results are filtered with the ignored patterns. - -**Type:** `RegExp[]` - -**Default value:** `[]` - ---- - -## texlab.diagnostics.ignoredPatterns - -A list of regular expressions used to filter the list of reported diagnostics. -If specified, only diagnostics that match _none_ of the specified patterns -are sent to the client. - -See also [`texlab.diagnostics.allowedPatterns`](#texlabdiagnosticsallowedpatterns). - -**Type:** `RegExp[]` - -**Default value:** `[]` - ---- - -## texlab.formatterLineLength - -Defines the maximum amount of characters per line (0 = disable) when formatting BibTeX files. - -**Type:** `integer` - -**Default value:** `80` - ---- - -## texlab.bibtexFormatter - -Defines the formatter to use for BibTeX formatting. -Possible values are either `texlab` or `latexindent`. - -**Type:** `string` - -**Default value:** `texlab` - ---- - -## texlab.latexFormatter - -Defines the formatter to use for LaTeX formatting. -Possible values are either `texlab` or `latexindent`. -Note that `texlab` is not implemented yet. - -**Type:** `string` - -**Default value:** `latexindent` - ---- - -## texlab.latexindent.local - -Defines the path of a file containing the `latexindent` configuration. -This corresponds to the `--local=file.yaml` flag of `latexindent`. -By default the configuration inside the project root directory is used. - -**Type:** `string` - -**Default value:** `null` - ---- - -## texlab.latexindent.modifyLineBreaks - -Modifies linebreaks before, during, and at the end of code blocks -when formatting with `latexindent`. -This corresponds to the `--modifylinebreaks` flag of `latexindent`. - -**Type:** `boolean` - -**Default value:** `false` diff --git a/support/texlab/docs/previewing.md b/support/texlab/docs/previewing.md deleted file mode 100644 index 3e97390429..0000000000 --- a/support/texlab/docs/previewing.md +++ /dev/null @@ -1,195 +0,0 @@ -# Previewing - -`texlab` supports compiling LaTeX using a custom request (`textDocument/build`) -and by building a document after saving if configured to do so. -To enable building on save, simply set `texlab.build.onSave` to true. -Previewing can be configured in a variety of ways: - -1. If you are using `latexmk`, you can create a `.latexmkrc` file and call your viewer accordingly. - Afterwards, you can add the `-pv` flag to your `texlab.build.args`. - -2. If you want the PDF viewer to stay synchronized with the cursor position in your editor, - you can instruct `texlab` to execute a forward search after every build (`texlab.build.forwardSearchAfter`). - To do so, you need to enable [SyncTeX](http://www.tug.org/TUGboat/tb29-3/tb93laurens.pdf) - and update the `texlab.forwardSearch` configuration. - If you want to use this feature, we do _not_ recommend the `-pvc` flag - because `texlab` does not get notified by `latexmk` when a document gets built. - Instead, you can use `texlab.build.onSave`. - -In the following sections, we will give forward search configurations for several popular viewers. -If your viewer is not listed here, you can send us a pull request or create an issue. - -The inverse search configuration depends on the editor. -In this section, we will give instructions for [Visual Studio Code](https://code.visualstudio.com/). -However, these settings can easily be adapted to other editors. -Some plugins can help with setting up inverse search: - -- `Neovim`: [`f3fora/nvim-texlabconfig`](https://github.com/f3fora/nvim-texlabconfig) -- `Emacs`: [`ROCKTAKEY/lsp-latex`](https://github.com/ROCKTAKEY/lsp-latex#inverse-search) - ---- - -## SumatraPDF - -We highly recommend [SumatraPDF](https://www.sumatrapdfreader.org) on Windows -because Adobe Reader locks the opened PDF file and will therefore prevent further builds. - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "C:/Users/{User}/AppData/Local/SumatraPDF/SumatraPDF.exe", - "texlab.forwardSearch.args": [ - "-reuse-instance", - "%p", - "-forward-search", - "%f", - "%l" - ] -} -``` - -### Inverse Search - -Add the following line to your SumatraPDF settings file (Menu -> Settings -> Advanced Options): - -```ini -InverseSearchCmdLine = "C:\Users\{User}\AppData\Local\Programs\Microsoft VS Code\Code.exe" -g "%f":%l -``` - -> **Note**: Please make sure to replace `{User}` with your Windows username. - -You can execute the search by pressing `Alt+DoubleClick` in the PDF document. - ---- - -## Evince - -The SyncTeX feature of [Evince](https://wiki.gnome.org/Apps/Evince) requires communication via D-Bus. -In order to use it from the command line, install the [evince-synctex](https://github.com/latex-lsp/evince-synctex) script. - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "evince-synctex", - "texlab.forwardSearch.args": ["-f", "%l", "%p", "\"code -g %f:%l\""] -} -``` - -### Inverse Search - -The inverse search feature is already configured if you use `evince-synctex`. -You can execute the search by pressing `Ctrl+Click` in the PDF document. - ---- - -## Okular - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "okular", - "texlab.forwardSearch.args": ["--editor-cmd": "code -g \"%%f\":%%l", "--unique", "file:%p#src:%l%f"] -} -``` - -### Inverse Search - -Change the editor of Okular (Settings -> Configure Okular... -> Editor) to "Custom Text Editor" and set the following command: - -```bash -code -g "%f":%l -``` - -You can execute the search by pressing `Shift+Click` in the PDF document. - ---- - -## Zathura - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "zathura", - "texlab.forwardSearch.args": ["--synctex-forward", "%l:1:%f", "%p"] -} -``` - -### Inverse Search - -Add the following lines to your `~/.config/zathura/zathurarc` file: - -```bash -set synctex true -set synctex-editor-command "code -g %{input}:%{line}" -``` - -You can execute the search by pressing `Ctrl+Click` in the PDF document. - ---- - -## qpdfview - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "qpdfview", - "texlab.forwardSearch.args": ["--unique", "%p#src:%f:%l:1"] -} -``` - -### Inverse Search - -Change the source editor setting (Edit -> Settings... -> Behavior -> Source editor) to: - -```bash -code -g "%1":%2 -``` - -and select a mouse button modifier (Edit -> Settings... -> Behavior -> Modifiers -> Mouse button modifiers -> Open in Source Editor) -of choice. -You can execute the search by pressing `Modifier+Click` in the PDF document. - ---- - -## Skim - -We recommend [Skim](https://skim-app.sourceforge.io/) on macOS since it is the only native viewer that supports SyncTeX. - -Additionally, enable the "Reload automatically" setting in the Skim preferences (Skim -> Preferences -> Sync -> Check for file changes). - -### Forward Search - -Add the following lines to your editor config: - -```json -{ - "texlab.forwardSearch.executable": "/Applications/Skim.app/Contents/SharedSupport/displayline", - "texlab.forwardSearch.args": ["%l", "%p", "%f"] -} -``` - -If you want Skim to stay in the background after -executing the forward search, you can add the `-g` option -to `texlab.forwardSearch.args`. - -### Inverse Search - -Select the Visual Studio Code preset in the Skim preferences (Skim -> Preferences -> Sync -> PDF-TeX Sync support). -You can execute the search by pressing `Shift+⌘+Click` in the PDF document. - ---- diff --git a/support/texlab/docs/tectonic.md b/support/texlab/docs/tectonic.md deleted file mode 100644 index b08e64b946..0000000000 --- a/support/texlab/docs/tectonic.md +++ /dev/null @@ -1,48 +0,0 @@ -# Usage with `tectonic` - -[`tectonic`](https://tectonic-typesetting.github.io/) is a modernized, alternative TeX engine. -Most features of `texlab` work out of the box when using `tectonic`. -To compile documents through `texlab`, you need to change the configuration. -See `tectonic --help` for more information about the flags. - ---- - -**Hint:** - -Please make sure to set `texlab.auxDirectory` if you change the build directory with the `--outdir` argument. - -Also, `--keep-intermediates` is recommended because they allow `texlab` -to find out the section numbers and show them in the completion. -Without the `--keep-logs` flag, `texlab` won't be able to report compilation warnings. - ---- - -## V2 CLI - -```json -{ - "texlab.build.executable": "tectonic", - "texlab.build.args": [ - "-X", - "compile", - "%f", - "--synctex", - "--keep-logs", - "--keep-intermediates" - ] -} -``` - -## V1 CLI - -```json -{ - "texlab.build.executable": "tectonic", - "texlab.build.args": [ - "%f", - "--synctex", - "--keep-logs", - "--keep-intermediates" - ] -} -``` diff --git a/support/texlab/docs/demo.gif b/support/texlab/images/demo.gif Binary files differindex 6bb0817a59..6bb0817a59 100644 --- a/support/texlab/docs/demo.gif +++ b/support/texlab/images/demo.gif diff --git a/support/texlab/rust-toolchain b/support/texlab/rust-toolchain deleted file mode 100644 index 870bbe4e50..0000000000 --- a/support/texlab/rust-toolchain +++ /dev/null @@ -1 +0,0 @@ -stable
\ No newline at end of file diff --git a/support/texlab/src/citation/driver.rs b/support/texlab/src/citation/driver.rs index 815474a107..ab3fe6d80f 100644 --- a/support/texlab/src/citation/driver.rs +++ b/support/texlab/src/citation/driver.rs @@ -1,7 +1,7 @@ use isocountry::CountryCode; use itertools::Itertools; +use lsp_types::Url; use titlecase::titlecase; -use url::Url; use crate::syntax::bibtex; diff --git a/support/texlab/src/citation/field/date.rs b/support/texlab/src/citation/field/date.rs index b67972e691..4eba9cdea4 100644 --- a/support/texlab/src/citation/field/date.rs +++ b/support/texlab/src/citation/field/date.rs @@ -42,7 +42,7 @@ impl Add for DateFieldData { | (Self::Other(_), date) | (date, Self::Other(_)) => date, (Self::Year(year), Self::Month(month)) | (Self::Month(month), Self::Year(year)) => { - let new_date = NaiveDate::from_ymd(year, month.number_from_month(), 1); + let new_date = NaiveDate::from_ymd_opt(year, month.number_from_month(), 1).unwrap(); Self::Date(new_date) } (Self::Year(year), Self::Date(date)) | (Self::Date(date), Self::Year(year)) => { diff --git a/support/texlab/src/citation/tests.rs b/support/texlab/src/citation/tests.rs index 16aefea11d..6caff1add0 100644 --- a/support/texlab/src/citation/tests.rs +++ b/support/texlab/src/citation/tests.rs @@ -1,10 +1,10 @@ use insta::assert_snapshot; use rowan::ast::AstNode; -use crate::syntax::bibtex; +use crate::{parser::parse_bibtex, syntax::bibtex}; fn render_entry(input: &str) -> String { - let green = bibtex::parse(input); + let green = parse_bibtex(input); let root = bibtex::Root::cast(bibtex::SyntaxNode::new_root(green)).unwrap(); let entry = root.entries().next().unwrap(); super::render(&entry).unwrap() diff --git a/support/texlab/src/client.rs b/support/texlab/src/client.rs index 72f2ac9eba..ab912653b0 100644 --- a/support/texlab/src/client.rs +++ b/support/texlab/src/client.rs @@ -1,53 +1,109 @@ -use std::sync::Mutex; +use std::sync::{ + atomic::{AtomicI32, Ordering}, + Arc, +}; -use anyhow::{anyhow, Result}; -use crossbeam_channel::{Receiver, Sender}; -use lsp_server::{Message, ResponseError}; +use anyhow::{bail, Result}; +use crossbeam_channel::Sender; +use dashmap::DashMap; +use lsp_server::{ErrorCode, Message, Request, RequestId, Response}; +use lsp_types::{notification::ShowMessage, MessageType, ShowMessageParams}; use serde::{de::DeserializeOwned, Serialize}; -use crate::req_queue::{OutgoingData, ReqQueue}; +use crate::Options; -pub fn send_notification<N>(lsp_sender: &Sender<Message>, params: N::Params) -> Result<()> -where - N: lsp_types::notification::Notification, - N::Params: Serialize, -{ - lsp_sender.send(lsp_server::Notification::new(N::METHOD.to_string(), params).into())?; - Ok(()) +#[derive(Debug)] +struct RawClient { + sender: Sender<Message>, + next_id: AtomicI32, + pending: DashMap<RequestId, Sender<Response>>, } -pub fn send_request<R>( - req_queue: &Mutex<ReqQueue>, - lsp_sender: &Sender<Message>, - params: R::Params, -) -> Result<R::Result> -where - R: lsp_types::request::Request, - R::Params: Serialize, - R::Result: DeserializeOwned, -{ - let receiver = register_outgoing_request::<R>(req_queue, lsp_sender, params)?; - let params = receiver.recv()?.map_err(|err| anyhow!(err.message))?; - let result = serde_json::from_value(params)?; - Ok(result) +#[derive(Debug, Clone)] +pub struct LspClient { + raw: Arc<RawClient>, } -fn register_outgoing_request<R>( - req_queue: &Mutex<ReqQueue>, - lsp_sender: &Sender<Message>, - params: R::Params, -) -> Result<Receiver<Result<serde_json::Value, ResponseError>>> -where - R: lsp_types::request::Request, - R::Params: Serialize, - R::Result: DeserializeOwned, -{ - let mut req_queue = req_queue.lock().unwrap(); - let (sender, receiver) = crossbeam_channel::bounded(1); - let method = R::METHOD.to_string(); - let data = OutgoingData { sender }; - let req = req_queue.outgoing.register(method, params, data); - drop(req_queue); - lsp_sender.send(req.into())?; - Ok(receiver) +impl LspClient { + pub fn new(sender: Sender<Message>) -> Self { + let raw = Arc::new(RawClient { + sender, + next_id: AtomicI32::new(1), + pending: DashMap::default(), + }); + + Self { raw } + } + + pub fn send_notification<N>(&self, params: N::Params) -> Result<()> + where + N: lsp_types::notification::Notification, + N::Params: Serialize, + { + self.raw + .sender + .send(lsp_server::Notification::new(N::METHOD.to_string(), params).into())?; + Ok(()) + } + + pub fn send_request<R>(&self, params: R::Params) -> Result<R::Result> + where + R: lsp_types::request::Request, + R::Params: Serialize, + R::Result: DeserializeOwned, + { + let id = RequestId::from(self.raw.next_id.fetch_add(1, Ordering::SeqCst)); + + let (tx, rx) = crossbeam_channel::bounded(1); + self.raw.pending.insert(id.clone(), tx); + + self.raw + .sender + .send(Request::new(id, R::METHOD.to_string(), params).into())?; + + let response = rx.recv()?; + let result = match response.error { + Some(error) => bail!(error.message), + None => response.result.unwrap_or_default(), + }; + + Ok(serde_json::from_value(result)?) + } + + pub fn send_response(&self, response: lsp_server::Response) -> Result<()> { + self.raw.sender.send(response.into())?; + Ok(()) + } + + pub fn send_error(&self, id: RequestId, code: ErrorCode, message: String) -> Result<()> { + self.send_response(lsp_server::Response::new_err(id, code as i32, message))?; + Ok(()) + } + + pub fn recv_response(&self, response: lsp_server::Response) -> Result<()> { + let (_, tx) = self + .raw + .pending + .remove(&response.id) + .expect("response with known request id received"); + + tx.send(response)?; + Ok(()) + } + + pub fn parse_options(&self, value: serde_json::Value) -> Result<Options> { + let options = match serde_json::from_value(value) { + Ok(new_options) => new_options, + Err(why) => { + let message = format!( + "The texlab configuration is invalid; using the default settings instead.\nDetails: {why}" + ); + let typ = MessageType::WARNING; + self.send_notification::<ShowMessage>(ShowMessageParams { message, typ })?; + None + } + }; + + Ok(options.unwrap_or_default()) + } } diff --git a/support/texlab/src/component_db.rs b/support/texlab/src/component_db.rs deleted file mode 100644 index 8dc547369f..0000000000 --- a/support/texlab/src/component_db.rs +++ /dev/null @@ -1,151 +0,0 @@ -use std::io::Read; - -use flate2::read::GzDecoder; -use itertools::Itertools; -use lsp_types::{MarkupContent, MarkupKind}; -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; -use smol_str::SmolStr; - -use crate::{syntax::latex::ExplicitLink, Workspace}; - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComponentDatabase { - pub components: Vec<Component>, - pub metadata: Vec<ComponentMetadata>, -} - -impl ComponentDatabase { - #[must_use] - pub fn find(&self, name: &str) -> Option<&Component> { - self.components.iter().find(|component| { - component - .file_names - .iter() - .any(|file_name| file_name == name) - }) - } - - #[must_use] - pub fn find_no_ext(&self, name: &str) -> Option<&Component> { - self.components.iter().find(|component| { - component - .file_names - .iter() - .any(|file_name| &file_name[0..file_name.len() - 4] == name) - }) - } - - #[must_use] - pub fn linked_components(&self, workspace: &Workspace) -> Vec<&Component> { - let mut start_components = vec![self.kernel()]; - for document in workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - data.extras - .explicit_links - .iter() - .filter_map(ExplicitLink::as_component_name) - .filter_map(|name| self.find(&name)) - .for_each(|component| start_components.push(component)); - } - } - - let mut all_components = Vec::new(); - for component in start_components { - all_components.push(component); - component - .references - .iter() - .filter_map(|file| self.find(file)) - .for_each(|component| all_components.push(component)); - } - - all_components - .into_iter() - .unique_by(|component| &component.file_names) - .collect() - } - - #[must_use] - pub fn contains(&self, short_name: &str) -> bool { - let sty = format!("{}.sty", short_name); - let cls = format!("{}.cls", short_name); - self.find(&sty).is_some() || self.find(&cls).is_some() - } - - #[must_use] - pub fn kernel(&self) -> &Component { - self.components - .iter() - .find(|component| component.file_names.is_empty()) - .unwrap() - } - - #[must_use] - pub fn exists(&self, file_name: &str) -> bool { - self.components - .iter() - .any(|component| component.file_names.iter().any(|f| f == file_name)) - } - - #[must_use] - pub fn documentation(&self, name: &str) -> Option<MarkupContent> { - let metadata = self - .metadata - .iter() - .find(|metadata| metadata.name == name)?; - - let desc = metadata.description.clone()?; - Some(MarkupContent { - kind: MarkupKind::PlainText, - value: desc, - }) - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct Component { - pub file_names: Vec<SmolStr>, - pub references: Vec<SmolStr>, - pub commands: Vec<ComponentCommand>, - pub environments: Vec<SmolStr>, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComponentCommand { - pub name: SmolStr, - pub image: Option<String>, - pub glyph: Option<SmolStr>, - pub parameters: Vec<ComponentParameter>, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComponentParameter(pub Vec<ComponentArgument>); - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComponentArgument { - pub name: SmolStr, - pub image: Option<String>, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComponentMetadata { - pub name: String, - pub caption: Option<String>, - pub description: Option<String>, -} - -const JSON_GZ: &[u8] = include_bytes!("../data/components.json.gz"); - -pub static COMPONENT_DATABASE: Lazy<ComponentDatabase> = Lazy::new(|| { - let mut decoder = GzDecoder::new(JSON_GZ); - let mut buf = String::new(); - decoder.read_to_string(&mut buf).unwrap(); - serde_json::from_str(&buf).unwrap() -}); diff --git a/support/texlab/src/db.rs b/support/texlab/src/db.rs new file mode 100644 index 0000000000..64165b76c2 --- /dev/null +++ b/support/texlab/src/db.rs @@ -0,0 +1,14 @@ +pub mod analysis; +pub mod diagnostics; +mod discovery; +mod document; +pub mod parse; +mod workspace; + +pub use {discovery::*, document::*, workspace::*}; + +#[salsa::interned] +pub struct Word { + #[return_ref] + pub text: String, +} diff --git a/support/texlab/src/db/analysis.rs b/support/texlab/src/db/analysis.rs new file mode 100644 index 0000000000..35ee4be2a1 --- /dev/null +++ b/support/texlab/src/db/analysis.rs @@ -0,0 +1,199 @@ +pub mod label; + +use rowan::{ast::AstNode, TextRange}; + +use crate::{ + syntax::latex::{self, HasCurly}, + Db, +}; + +use super::Word; + +#[salsa::tracked] +pub struct TexLink { + pub kind: TexLinkKind, + pub path: Word, + pub range: TextRange, + pub base_dir: Option<Word>, +} + +impl TexLink { + fn of_include(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> { + let include = latex::Include::cast(node)?; + let kind = match include.syntax().kind() { + latex::LATEX_INCLUDE => TexLinkKind::Tex, + latex::BIBLATEX_INCLUDE | latex::BIBTEX_INCLUDE => TexLinkKind::Bib, + latex::PACKAGE_INCLUDE => TexLinkKind::Sty, + latex::CLASS_INCLUDE => TexLinkKind::Cls, + _ => return None, + }; + + for path in include.path_list()?.keys() { + results.push(Self::new( + db, + kind, + Word::new(db, path.to_string()), + latex::small_range(&path), + None, + )); + } + + Some(()) + } + + fn of_import(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> { + let import = latex::Import::cast(node)?; + + let mut base_dir = import.directory()?.key()?.to_string(); + if !base_dir.ends_with("/") { + base_dir.push('/'); + } + + let path = import.file()?.key()?; + results.push(Self::new( + db, + TexLinkKind::Tex, + Word::new(db, path.to_string()), + latex::small_range(&path), + Some(Word::new(db, base_dir)), + )); + + Some(()) + } +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub enum TexLinkKind { + Sty, + Cls, + Tex, + Bib, +} + +impl TexLinkKind { + pub fn extensions(self) -> &'static [&'static str] { + match self { + Self::Sty => &["sty"], + Self::Cls => &["cls"], + Self::Tex => &["tex"], + Self::Bib => &["bib"], + } + } +} + +#[salsa::tracked] +pub struct TheoremEnvironment { + pub name: Word, + pub description: Word, +} + +impl TheoremEnvironment { + fn of_definition(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> { + let theorem = latex::TheoremDefinition::cast(node)?; + let name = theorem.name()?.key()?.to_string(); + let description = theorem.description()?; + let description = description.content_text()?; + + results.push(Self::new( + db, + Word::new(db, name), + Word::new(db, description), + )); + + Some(()) + } +} + +#[salsa::tracked] +pub struct GraphicsPath { + #[return_ref] + pub path: String, +} + +impl GraphicsPath { + pub fn of_command(db: &dyn Db, node: latex::SyntaxNode, results: &mut Vec<Self>) -> Option<()> { + let definition = latex::GraphicsPath::cast(node)?; + for path in definition + .path_list() + .filter_map(|group| group.key()) + .map(|path| path.to_string()) + { + results.push(GraphicsPath::new(db, path)); + } + + Some(()) + } +} + +#[salsa::tracked] +pub struct TexAnalysis { + #[return_ref] + pub links: Vec<TexLink>, + + #[return_ref] + pub labels: Vec<label::Name>, + + #[return_ref] + pub label_numbers: Vec<label::Number>, + + #[return_ref] + pub theorem_environments: Vec<TheoremEnvironment>, + + #[return_ref] + pub graphics_paths: Vec<GraphicsPath>, + + #[return_ref] + pub command_name_ranges: Vec<TextRange>, + + #[return_ref] + pub environment_names: Vec<String>, +} + +impl TexAnalysis { + pub(super) fn analyze(db: &dyn Db, root: &latex::SyntaxNode) -> Self { + let mut links = Vec::new(); + let mut labels = Vec::new(); + let mut label_numbers = Vec::new(); + let mut theorem_environments = Vec::new(); + let mut graphics_paths = Vec::new(); + let mut command_name_ranges = Vec::new(); + let mut environment_names = Vec::new(); + + for node in root.descendants() { + TexLink::of_include(db, node.clone(), &mut links) + .or_else(|| TexLink::of_import(db, node.clone(), &mut links)) + .or_else(|| label::Name::of_definition(db, node.clone(), &mut labels)) + .or_else(|| label::Name::of_reference(db, node.clone(), &mut labels)) + .or_else(|| label::Name::of_reference_range(db, node.clone(), &mut labels)) + .or_else(|| label::Number::of_number(db, node.clone(), &mut label_numbers)) + .or_else(|| { + TheoremEnvironment::of_definition(db, node.clone(), &mut theorem_environments) + }) + .or_else(|| GraphicsPath::of_command(db, node.clone(), &mut graphics_paths)) + .or_else(|| { + let range = latex::GenericCommand::cast(node.clone())? + .name()? + .text_range(); + + command_name_ranges.push(range); + Some(()) + }) + .or_else(|| { + let begin = latex::Begin::cast(node.clone())?; + environment_names.push(begin.name()?.key()?.to_string()); + Some(()) + }); + } + + Self::new( + db, + links, + labels, + label_numbers, + theorem_environments, + graphics_paths, + command_name_ranges, + environment_names, + ) + } +} diff --git a/support/texlab/src/db/analysis/label.rs b/support/texlab/src/db/analysis/label.rs new file mode 100644 index 0000000000..77ee5268eb --- /dev/null +++ b/support/texlab/src/db/analysis/label.rs @@ -0,0 +1,122 @@ +use rowan::{ + ast::{AstNode, AstPtr}, + TextRange, +}; + +use crate::{db::Word, syntax::latex, Db}; + +#[salsa::tracked] +pub struct Number { + pub name: Word, + pub text: Word, +} + +impl Number { + pub(super) fn of_number( + db: &dyn Db, + node: latex::SyntaxNode, + results: &mut Vec<Self>, + ) -> Option<()> { + let number = latex::LabelNumber::cast(node)?; + let name = number.name()?.key()?.to_string(); + let text = number + .text()? + .syntax() + .descendants_with_tokens() + .filter_map(|element| element.into_node()) + .find(|node| node.kind() == latex::TEXT || node.kind() == latex::MIXED_GROUP)? + .text() + .to_string(); + + results.push(Self::new(db, Word::new(db, name), Word::new(db, text))); + + Some(()) + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +pub enum Origin { + Definition(AstPtr<latex::LabelDefinition>), + Reference(AstPtr<latex::LabelReference>), + ReferenceRange(AstPtr<latex::LabelReferenceRange>), +} + +impl Origin { + pub fn as_definition(&self) -> Option<&AstPtr<latex::LabelDefinition>> { + match self { + Self::Definition(ptr) => Some(ptr), + _ => None, + } + } +} + +#[salsa::tracked] +pub struct Name { + pub origin: Origin, + pub name: Word, + pub range: TextRange, +} + +impl Name { + pub(super) fn of_definition( + db: &dyn Db, + node: latex::SyntaxNode, + results: &mut Vec<Self>, + ) -> Option<()> { + let label = latex::LabelDefinition::cast(node)?; + let name = label.name()?.key()?; + results.push(Self::new( + db, + Origin::Definition(AstPtr::new(&label)), + Word::new(db, name.to_string()), + latex::small_range(&name), + )); + + Some(()) + } + + pub(super) fn of_reference( + db: &dyn Db, + node: latex::SyntaxNode, + results: &mut Vec<Self>, + ) -> Option<()> { + let label = latex::LabelReference::cast(node)?; + for name in label.name_list()?.keys() { + results.push(Self::new( + db, + Origin::Reference(AstPtr::new(&label)), + Word::new(db, name.to_string()), + latex::small_range(&name), + )); + } + + Some(()) + } + + pub(super) fn of_reference_range( + db: &dyn Db, + node: latex::SyntaxNode, + results: &mut Vec<Self>, + ) -> Option<()> { + let label = latex::LabelReferenceRange::cast(node)?; + if let Some(name) = label.from().and_then(|name| name.key()) { + results.push(Self::new( + db, + Origin::ReferenceRange(AstPtr::new(&label)), + Word::new(db, name.to_string()), + latex::small_range(&name), + )); + } + + if let Some(name) = label.to().and_then(|name| name.key()) { + results.push(Self::new( + db, + Origin::ReferenceRange(AstPtr::new(&label)), + Word::new(db, name.to_string()), + latex::small_range(&name), + )); + } + + Some(()) + } +} diff --git a/support/texlab/src/db/diagnostics.rs b/support/texlab/src/db/diagnostics.rs new file mode 100644 index 0000000000..9b6691b873 --- /dev/null +++ b/support/texlab/src/db/diagnostics.rs @@ -0,0 +1,187 @@ +pub mod bib; +pub mod log; +pub mod tex; + +use lsp_types::{DiagnosticSeverity, NumberOrString, Range}; +use rustc_hash::FxHashMap; + +use crate::{db::workspace::Workspace, Db}; + +use super::document::{Document, Language}; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct Diagnostic { + pub severity: DiagnosticSeverity, + pub range: Range, + pub code: DiagnosticCode, + pub message: String, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] +pub enum DiagnosticCode { + Tex(TexCode), + Bib(BibCode), + Log(Document), + Chktex(String), +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub enum TexCode { + UnexpectedRCurly, + RCurlyInserted, + MismatchedEnvironment, +} + +impl From<TexCode> for String { + fn from(code: TexCode) -> Self { + match code { + TexCode::UnexpectedRCurly => "Unexpected \"}\"".to_string(), + TexCode::RCurlyInserted => "Missing \"}\" inserted".to_string(), + TexCode::MismatchedEnvironment => "Mismatched environment".to_string(), + } + } +} + +impl From<TexCode> for NumberOrString { + fn from(code: TexCode) -> Self { + match code { + TexCode::UnexpectedRCurly => NumberOrString::Number(1), + TexCode::RCurlyInserted => NumberOrString::Number(2), + TexCode::MismatchedEnvironment => NumberOrString::Number(3), + } + } +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +#[allow(clippy::enum_variant_names)] +pub enum BibCode { + ExpectingLCurly, + ExpectingKey, + ExpectingRCurly, + ExpectingEq, + ExpectingFieldValue, +} + +impl From<BibCode> for String { + fn from(code: BibCode) -> Self { + match code { + BibCode::ExpectingLCurly => "Expecting a curly bracket: \"{\"".to_string(), + BibCode::ExpectingKey => "Expecting a key".to_string(), + BibCode::ExpectingRCurly => "Expecting a curly bracket: \"}\"".to_string(), + BibCode::ExpectingEq => "Expecting an equality sign: \"=\"".to_string(), + BibCode::ExpectingFieldValue => "Expecting a field value".to_string(), + } + } +} + +impl From<BibCode> for NumberOrString { + fn from(code: BibCode) -> Self { + match code { + BibCode::ExpectingLCurly => NumberOrString::Number(4), + BibCode::ExpectingKey => NumberOrString::Number(5), + BibCode::ExpectingRCurly => NumberOrString::Number(6), + BibCode::ExpectingEq => NumberOrString::Number(7), + BibCode::ExpectingFieldValue => NumberOrString::Number(8), + } + } +} + +#[salsa::tracked(return_ref)] +pub fn collect(db: &dyn Db, workspace: Workspace) -> FxHashMap<Document, Vec<Diagnostic>> { + let mut results: FxHashMap<Document, Vec<Diagnostic>> = FxHashMap::default(); + + for document in workspace.documents(db).iter().copied() { + match document.language(db) { + Language::Tex => { + results.entry(document).or_default().extend( + tex::collect(db, document) + .iter() + .chain(document.linter(db).chktex(db)) + .cloned(), + ); + } + Language::Bib => { + results + .entry(document) + .or_default() + .extend(bib::collect(db, document).iter().cloned()); + } + Language::Log => { + log::collect(db, workspace, document) + .iter() + .for_each(|(document, diagnostics)| { + results + .entry(*document) + .or_default() + .extend(diagnostics.clone()); + }); + } + } + } + + results +} + +#[salsa::tracked] +pub fn collect_filtered( + db: &dyn Db, + workspace: Workspace, +) -> FxHashMap<Document, Vec<lsp_types::Diagnostic>> { + let all_diagnostics = collect(db, workspace); + let mut all_filtered: FxHashMap<Document, Vec<lsp_types::Diagnostic>> = FxHashMap::default(); + + let options = &workspace.options(db).diagnostics; + for document in workspace.documents(db) { + let mut filtered = Vec::new(); + if !matches!(document.language(db), Language::Tex | Language::Bib) { + continue; + } + + if let Some(diagnostics) = all_diagnostics.get(document) { + for diagnostic in diagnostics.iter() { + if !options.allowed_patterns.is_empty() + && !options + .allowed_patterns + .iter() + .any(|pattern| pattern.0.is_match(&diagnostic.message)) + { + continue; + } + + if options + .ignored_patterns + .iter() + .any(|pattern| pattern.0.is_match(&diagnostic.message)) + { + continue; + } + + let source = match diagnostic.code { + DiagnosticCode::Tex(_) | DiagnosticCode::Bib(_) => "texlab", + DiagnosticCode::Log(_) => "latex-build", + DiagnosticCode::Chktex(_) => "chktex", + }; + + let code = match diagnostic.code.clone() { + DiagnosticCode::Tex(code) => Some(code.into()), + DiagnosticCode::Bib(code) => Some(code.into()), + DiagnosticCode::Chktex(code) => Some(NumberOrString::String(code)), + DiagnosticCode::Log(_) => None, + }; + + filtered.push(lsp_types::Diagnostic { + range: diagnostic.range, + code, + severity: Some(diagnostic.severity), + message: diagnostic.message.clone(), + source: Some(source.to_string()), + ..Default::default() + }); + } + } + + all_filtered.insert(*document, filtered); + } + + all_filtered +} diff --git a/support/texlab/src/db/diagnostics/bib.rs b/support/texlab/src/db/diagnostics/bib.rs new file mode 100644 index 0000000000..6d0f66e960 --- /dev/null +++ b/support/texlab/src/db/diagnostics/bib.rs @@ -0,0 +1,112 @@ +use lsp_types::DiagnosticSeverity; +use rowan::{ast::AstNode, TextRange}; + +use crate::{ + db::document::Document, + syntax::bibtex::{self, HasDelims, HasEq, HasName, HasType, HasValue}, + util::line_index_ext::LineIndexExt, + Db, +}; + +use super::{BibCode, Diagnostic, DiagnosticCode}; + +#[salsa::tracked(return_ref)] +pub fn collect(db: &dyn Db, document: Document) -> Vec<Diagnostic> { + let mut results = Vec::new(); + let data = match document.parse(db).as_bib() { + Some(data) => data, + None => return results, + }; + + for node in data.root(db).descendants() { + analyze_entry(db, document, node.clone(), &mut results) + .or_else(|| analyze_field(db, document, node, &mut results)); + } + + results +} + +fn analyze_entry( + db: &dyn Db, + document: Document, + node: bibtex::SyntaxNode, + results: &mut Vec<Diagnostic>, +) -> Option<()> { + let line_index = document.contents(db).line_index(db); + + let entry = bibtex::Entry::cast(node)?; + if entry.left_delim_token().is_none() { + let code = BibCode::ExpectingLCurly; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: line_index.line_col_lsp_range(entry.type_token()?.text_range()), + code: DiagnosticCode::Bib(code), + message: String::from(code), + }); + + return Some(()); + } + + if entry.name_token().is_none() { + let code = BibCode::ExpectingKey; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: line_index.line_col_lsp_range(entry.left_delim_token()?.text_range()), + code: DiagnosticCode::Bib(code), + message: String::from(code), + }); + + return Some(()); + } + + if entry.right_delim_token().is_none() { + let code = BibCode::ExpectingRCurly; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: line_index + .line_col_lsp_range(TextRange::empty(entry.syntax().text_range().end())), + code: DiagnosticCode::Bib(code), + message: String::from(code), + }); + + return Some(()); + } + + Some(()) +} + +fn analyze_field( + db: &dyn Db, + document: Document, + node: bibtex::SyntaxNode, + results: &mut Vec<Diagnostic>, +) -> Option<()> { + let line_index = document.contents(db).line_index(db); + + let field = bibtex::Field::cast(node)?; + if field.eq_token().is_none() { + let code = BibCode::ExpectingEq; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: line_index.line_col_lsp_range(field.name_token()?.text_range()), + code: DiagnosticCode::Bib(code), + message: String::from(code), + }); + + return Some(()); + } + + if field.value().is_none() { + let code = BibCode::ExpectingFieldValue; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: line_index.line_col_lsp_range(field.name_token()?.text_range()), + code: DiagnosticCode::Bib(code), + message: String::from(code), + }); + + return Some(()); + } + + Some(()) +} diff --git a/support/texlab/src/db/diagnostics/log.rs b/support/texlab/src/db/diagnostics/log.rs new file mode 100644 index 0000000000..436999259b --- /dev/null +++ b/support/texlab/src/db/diagnostics/log.rs @@ -0,0 +1,100 @@ +use lsp_types::{DiagnosticSeverity, Position, Range, Url}; +use rowan::{TextLen, TextRange, TextSize}; +use rustc_hash::FxHashMap; + +use crate::{ + db::{document::Document, workspace::Workspace}, + syntax::{BuildError, BuildErrorLevel}, + util::line_index_ext::LineIndexExt, + Db, +}; + +use super::{Diagnostic, DiagnosticCode}; + +#[salsa::tracked(return_ref)] +pub fn collect( + db: &dyn Db, + workspace: Workspace, + log_document: Document, +) -> FxHashMap<Document, Vec<Diagnostic>> { + let mut results = FxHashMap::default(); + + let log = match log_document.parse(db).as_log() { + Some(data) => data.log(db), + None => return results, + }; + + let root_document = match workspace.parents(db, log_document).iter().next().copied() { + Some(document) => document, + None => return results, + }; + + let base_path = match root_document + .location(db) + .path(db) + .as_deref() + .and_then(|path| path.parent()) + { + Some(path) => path, + None => return results, + }; + + for error in &log.errors { + let full_path = base_path.join(&error.relative_path); + let full_path_uri = if let Ok(uri) = Url::from_file_path(&full_path) { + uri + } else { + continue; + }; + + let severity = match error.level { + BuildErrorLevel::Error => DiagnosticSeverity::ERROR, + BuildErrorLevel::Warning => DiagnosticSeverity::WARNING, + }; + + let range = find_range_of_hint(db, workspace, &full_path_uri, error).unwrap_or_else(|| { + let line = error.line.unwrap_or(0); + Range::new(Position::new(line, 0), Position::new(line, 0)) + }); + + let diagnostic = Diagnostic { + severity, + range, + code: DiagnosticCode::Log(log_document), + message: error.message.clone(), + }; + + let tex_document = workspace + .lookup_uri(db, &full_path_uri) + .unwrap_or(root_document); + + results.entry(tex_document).or_default().push(diagnostic); + } + + results +} + +fn find_range_of_hint( + db: &dyn Db, + workspace: Workspace, + uri: &Url, + error: &BuildError, +) -> Option<Range> { + let document = workspace.lookup_uri(db, uri)?; + let text = document.contents(db).text(db); + let line = error.line? as usize; + let hint = error.hint.as_deref()?; + let line_index = document.contents(db).line_index(db); + + let line_start = line_index.newlines.get(line).copied()?; + let line_end = line_index + .newlines + .get(line + 1) + .copied() + .unwrap_or(text.text_len()); + + let line_text = &text[line_start.into()..line_end.into()]; + let hint_start = line_start + TextSize::try_from(line_text.find(hint)?).unwrap(); + let hint_end = hint_start + hint.text_len(); + Some(line_index.line_col_lsp_range(TextRange::new(hint_start, hint_end))) +} diff --git a/support/texlab/src/db/diagnostics/tex.rs b/support/texlab/src/db/diagnostics/tex.rs new file mode 100644 index 0000000000..50233f8bd6 --- /dev/null +++ b/support/texlab/src/db/diagnostics/tex.rs @@ -0,0 +1,125 @@ +use lsp_types::DiagnosticSeverity; +use rowan::{ast::AstNode, NodeOrToken, TextRange}; + +use crate::{db::document::Document, syntax::latex, util::line_index_ext::LineIndexExt, Db}; + +use super::{Diagnostic, DiagnosticCode, TexCode}; + +#[salsa::tracked(return_ref)] +pub fn collect(db: &dyn Db, document: Document) -> Vec<Diagnostic> { + let mut results = Vec::new(); + + if !document.location(db).uri(db).as_str().ends_with(".tex") { + return results; + } + + let data = match document.parse(db).as_tex() { + Some(data) => data, + None => return results, + }; + + for node in data.root(db).descendants() { + analyze_environment(db, document, node.clone(), &mut results) + .or_else(|| analyze_curly_group(db, document, node.clone(), &mut results)) + .or_else(|| analyze_curly_braces(document, db, node, &mut results)); + } + + results +} + +fn analyze_environment( + db: &dyn Db, + document: Document, + node: latex::SyntaxNode, + results: &mut Vec<Diagnostic>, +) -> Option<()> { + let environment = latex::Environment::cast(node)?; + let name1 = environment.begin()?.name()?.key()?; + let name2 = environment.end()?.name()?.key()?; + if name1 != name2 { + let code = TexCode::MismatchedEnvironment; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: document + .contents(db) + .line_index(db) + .line_col_lsp_range(latex::small_range(&name1)), + code: DiagnosticCode::Tex(code), + message: String::from(code), + }); + } + + Some(()) +} + +fn analyze_curly_group( + db: &dyn Db, + document: Document, + node: latex::SyntaxNode, + results: &mut Vec<Diagnostic>, +) -> Option<()> { + if !matches!( + node.kind(), + latex::CURLY_GROUP + | latex::CURLY_GROUP_COMMAND + | latex::CURLY_GROUP_KEY_VALUE + | latex::CURLY_GROUP_WORD + | latex::CURLY_GROUP_WORD_LIST + ) { + return None; + } + + let is_inside_verbatim_environment = node + .ancestors() + .filter_map(latex::Environment::cast) + .filter_map(|env| env.begin()) + .filter_map(|begin| begin.name()) + .filter_map(|name| name.key()) + .any(|name| { + ["asy", "lstlisting", "minted", "verbatim"].contains(&name.to_string().as_str()) + }); + + if !is_inside_verbatim_environment + && !node + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .any(|token| token.kind() == latex::R_CURLY) + { + let code = TexCode::RCurlyInserted; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: document + .contents(db) + .line_index(db) + .line_col_lsp_range(TextRange::empty(node.text_range().end())), + code: DiagnosticCode::Tex(code), + message: String::from(code), + }); + } + + Some(()) +} + +fn analyze_curly_braces( + document: Document, + db: &dyn Db, + node: rowan::SyntaxNode<latex::LatexLanguage>, + results: &mut Vec<Diagnostic>, +) -> Option<()> { + if node.kind() == latex::ERROR && node.first_token()?.text() == "}" { + let code = TexCode::UnexpectedRCurly; + results.push(Diagnostic { + severity: DiagnosticSeverity::ERROR, + range: document + .contents(db) + .line_index(db) + .line_col_lsp_range(node.text_range()), + code: DiagnosticCode::Tex(code), + message: String::from(code), + }); + + Some(()) + } else { + None + } +} diff --git a/support/texlab/src/db/discovery.rs b/support/texlab/src/db/discovery.rs new file mode 100644 index 0000000000..0e1ec314f7 --- /dev/null +++ b/support/texlab/src/db/discovery.rs @@ -0,0 +1,251 @@ +use std::path::Path; + +use itertools::Itertools; +use lsp_types::Url; +use rustc_hash::FxHashSet; + +use crate::{util::HOME_DIR, Db}; + +use super::{ + analysis::TexLink, + document::{Document, Language, Location, Owner}, + workspace::Workspace, +}; + +#[salsa::accumulator] +pub struct MissingDependencies(MissingDependency); + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub struct MissingDependency { + pub location: Location, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub struct Dependency { + pub source: Document, + pub target: Document, + pub origin: Option<DependencyOrigin>, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub struct DependencyOrigin { + pub link: TexLink, + pub old_base_dir: Location, + pub new_base_dir: Location, +} + +pub fn hidden_dependencies( + db: &dyn Db, + document: Document, + base_dir: Location, + dependencies: &mut Vec<Dependency>, +) { + dependencies.extend(hidden_dependency(db, document, base_dir, "log")); + dependencies.extend(hidden_dependency(db, document, base_dir, "aux")); +} + +#[salsa::tracked] +pub fn hidden_dependency( + db: &dyn Db, + source: Document, + base_dir: Location, + extension: &'static str, +) -> Option<Dependency> { + let workspace = Workspace::get(db); + + let stem = source.location(db).stem(db)?; + let name = format!("{stem}.{extension}"); + + let location = workspace.output_dir(db, base_dir).join(db, &name)?; + match workspace.lookup(db, location) { + Some(target) => Some(Dependency { + source, + target, + origin: None, + }), + None => { + MissingDependencies::push(db, MissingDependency { location }); + None + } + } +} + +pub fn source_dependencies<'db>( + db: &'db dyn Db, + source: Document, + base_dir: Location, +) -> impl Iterator<Item = Dependency> + 'db { + source + .parse(db) + .as_tex() + .into_iter() + .flat_map(|data| data.analyze(db).links(db)) + .filter_map(move |link| source_dependency(db, source, base_dir, *link)) +} + +#[salsa::tracked] +pub fn source_dependency( + db: &dyn Db, + source: Document, + base_dir: Location, + link: TexLink, +) -> Option<Dependency> { + let workspace = Workspace::get(db); + + let stem = link.path(db).text(db); + + let mut file_names = vec![stem.clone()]; + link.kind(db) + .extensions() + .iter() + .map(|ext| format!("{stem}.{ext}")) + .for_each(|name| file_names.push(name)); + + let file_name_db = workspace.file_name_db(db); + let distro_files = file_names + .iter() + .filter_map(|name| file_name_db.get(name)) + .filter(|path| { + HOME_DIR + .as_deref() + .map_or(false, |dir| path.starts_with(dir)) + }) + .flat_map(|path| Url::from_file_path(path)) + .map(|uri| Location::new(db, uri)); + + for location in file_names + .iter() + .filter_map(|file_name| base_dir.join(db, &file_name)) + .chain(distro_files) + { + match workspace.lookup(db, location) { + Some(target) => { + let origin = Some(DependencyOrigin { + link, + old_base_dir: base_dir, + new_base_dir: link + .base_dir(db) + .and_then(|path| base_dir.join(db, path.text(db))) + .unwrap_or(base_dir), + }); + + return Some(Dependency { + source, + target, + origin, + }); + } + None => { + MissingDependencies::push(db, MissingDependency { location }); + } + }; + } + + None +} + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +pub struct DependencyGraph { + pub start: Document, + pub edges: Vec<Dependency>, +} + +impl DependencyGraph { + pub fn preorder(&self) -> impl DoubleEndedIterator<Item = Document> + '_ { + std::iter::once(self.start) + .chain(self.edges.iter().map(|group| group.target)) + .unique() + } +} + +#[salsa::tracked] +pub fn dependency_graph(db: &dyn Db, start: Document) -> DependencyGraph { + let workspace = Workspace::get(db); + + let base_dir = workspace.working_dir(db, start.directory(db)); + let mut edges = Vec::new(); + let mut stack = vec![(start, base_dir)]; + let mut visited = FxHashSet::default(); + + while let Some((source, base_dir)) = stack.pop() { + for edge in source_dependencies(db, source, base_dir) { + edges.push(edge); + if visited.insert(edge.target) { + stack.push((edge.target, edge.origin.unwrap().new_base_dir)); + } + } + + hidden_dependencies(db, source, base_dir, &mut edges); + } + + DependencyGraph { start, edges } +} + +pub fn discover_dependencies(db: &mut dyn Db) { + let workspace = Workspace::get(db); + loop { + let mut changed = discover_parents(db, workspace); + + let paths: FxHashSet<_> = workspace + .documents(db) + .iter() + .flat_map(|&start| dependency_graph::accumulated::<MissingDependencies>(db, start)) + .filter_map(|link| link.location.path(db).as_deref()) + .filter(|path| path.is_file()) + .map(Path::to_path_buf) + .collect(); + + for path in paths { + if workspace.lookup_path(db, &path).is_none() { + let language = Language::from_path(&path).unwrap_or(Language::Tex); + changed |= workspace.load(db, &path, language, Owner::Server).is_some(); + } + } + + if !changed { + break; + } + } +} + +fn discover_parents(db: &mut dyn Db, workspace: Workspace) -> bool { + let mut changed = false; + + let dirs: FxHashSet<_> = workspace + .documents(db) + .iter() + .flat_map(|document| document.ancestor_dirs(db)) + .filter(|path| is_part_of_workspace(db, workspace, path)) + .map(Path::to_path_buf) + .collect(); + + for path in dirs + .iter() + .flat_map(std::fs::read_dir) + .flatten() + .flatten() + .filter(|entry| entry.file_type().map_or(false, |ty| ty.is_file())) + .map(|entry| entry.path()) + .filter(|path| Language::from_path(&path) == Some(Language::Tex)) + { + if workspace.lookup_path(db, &path).is_none() { + changed |= workspace + .load(db, &path, Language::Tex, Owner::Server) + .is_some(); + } + } + + changed +} + +fn is_part_of_workspace(db: &dyn Db, workspace: Workspace, path: &Path) -> bool { + let root_dirs = workspace.root_dirs(db); + if root_dirs.is_empty() { + return true; + } + + root_dirs + .iter() + .filter_map(|dir| dir.path(db).as_deref()) + .any(|dir| path.starts_with(dir)) +} diff --git a/support/texlab/src/db/document.rs b/support/texlab/src/db/document.rs new file mode 100644 index 0000000000..186bd06ab3 --- /dev/null +++ b/support/texlab/src/db/document.rs @@ -0,0 +1,193 @@ +use std::{ + ffi::OsStr, + path::{Path, PathBuf}, +}; + +use lsp_types::Url; +use rowan::{TextRange, TextSize}; + +use crate::{ + db::{ + diagnostics::Diagnostic, + parse::{BibDocumentData, LogDocumentData, TexDocumentData}, + }, + parser::{parse_bibtex, parse_build_log, parse_latex}, + util::line_index::LineIndex, + Db, +}; + +use super::{ + analysis::TexLinkKind, + parse::{self, DocumentData}, +}; + +#[salsa::interned] +pub struct Location { + #[return_ref] + pub uri: Url, +} + +#[salsa::tracked] +impl Location { + #[salsa::tracked(return_ref)] + pub fn path(self, db: &dyn Db) -> Option<PathBuf> { + let uri = self.uri(db); + if uri.scheme() == "file" { + uri.to_file_path().ok() + } else { + None + } + } + + pub fn stem<'db>(self, db: &'db dyn Db) -> Option<&'db str> { + let name = self.uri(db).path_segments()?.last()?; + let stem = name.rsplit_once('.').map_or(name, |(stem, _)| stem); + Some(stem) + } + + pub fn join(self, db: &dyn Db, path: &str) -> Option<Location> { + let uri = self.uri(db).join(path).ok()?; + Some(Location::new(db, uri)) + } + + pub fn into_dir(self, db: &dyn Db) -> Location { + if self.uri(db).path().ends_with("/") { + self.join(db, ".").unwrap() + } else { + self + } + } +} + +#[salsa::input] +pub struct Contents { + #[return_ref] + pub text: String, +} + +#[salsa::tracked] +impl Contents { + #[salsa::tracked(return_ref)] + pub fn line_index(self, db: &dyn Db) -> LineIndex { + LineIndex::new(self.text(db)) + } +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub enum Owner { + Client, + Server, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub enum Language { + Tex, + Bib, + Log, +} + +impl Language { + pub fn from_path(path: &Path) -> Option<Self> { + path.extension() + .and_then(OsStr::to_str) + .and_then(Self::from_extension) + } + + pub fn from_extension(extension: &str) -> Option<Self> { + match extension.to_lowercase().as_str() { + "tex" | "sty" | "cls" | "def" | "lco" | "aux" | "rnw" => Some(Self::Tex), + "bib" | "bibtex" => Some(Self::Bib), + "log" => Some(Self::Log), + _ => None, + } + } + + pub fn from_id(id: &str) -> Option<Self> { + match id { + "tex" | "latex" => Some(Self::Tex), + "bib" | "bibtex" => Some(Self::Bib), + _ => None, + } + } +} + +#[salsa::input] +pub struct LinterData { + #[return_ref] + pub chktex: Vec<Diagnostic>, +} + +#[salsa::input] +pub struct Document { + pub location: Location, + pub contents: Contents, + pub language: Language, + pub owner: Owner, + pub cursor: TextSize, + pub linter: LinterData, +} + +impl Document { + pub fn edit(self, db: &mut dyn Db, range: TextRange, replace_with: &str) { + let mut text = self.contents(db).set_text(db).to(String::new()); + text.replace_range(std::ops::Range::<usize>::from(range), &replace_with); + self.contents(db).set_text(db).to(text); + self.set_cursor(db).to(range.start()); + } + + pub fn directory(self, db: &dyn Db) -> Location { + self.location(db).into_dir(db) + } + + pub fn ancestor_dirs<'db>(self, db: &'db dyn Db) -> impl Iterator<Item = &'db Path> + 'db { + self.location(db) + .path(db) + .as_deref() + .into_iter() + .flat_map(|path| path.ancestors()) + .skip(1) + } +} + +#[salsa::tracked] +impl Document { + #[salsa::tracked] + pub fn parse(self, db: &dyn Db) -> DocumentData { + let text = self.contents(db).text(db); + match self.language(db) { + Language::Tex => { + let data = TexDocumentData::new(db, parse_latex(text)); + parse::DocumentData::Tex(data) + } + Language::Bib => { + let data = BibDocumentData::new(db, parse_bibtex(text)); + DocumentData::Bib(data) + } + Language::Log => { + let data = LogDocumentData::new(db, parse_build_log(text)); + DocumentData::Log(data) + } + } + } + + #[salsa::tracked] + pub fn can_be_index(self, db: &dyn Db) -> bool { + self.parse(db).as_tex().map_or(false, |data| { + data.analyze(db) + .links(db) + .iter() + .filter(|link| link.kind(db) == TexLinkKind::Cls) + .any(|link| link.path(db).text(db) != "subfiles") + }) + } + + #[salsa::tracked] + pub fn can_be_built(self, db: &dyn Db) -> bool { + self.parse(db).as_tex().map_or(false, |data| { + data.analyze(db) + .links(db) + .iter() + .any(|link| link.kind(db) == TexLinkKind::Cls) + }) + } +} diff --git a/support/texlab/src/db/parse.rs b/support/texlab/src/db/parse.rs new file mode 100644 index 0000000000..d532c536a3 --- /dev/null +++ b/support/texlab/src/db/parse.rs @@ -0,0 +1,71 @@ +use crate::{ + db::analysis::TexAnalysis, + syntax::{bibtex, latex, BuildLog}, + Db, +}; + +#[salsa::interned] +pub struct TexDocumentData { + pub green: rowan::GreenNode, +} + +impl TexDocumentData { + pub fn root(self, db: &dyn Db) -> latex::SyntaxNode { + latex::SyntaxNode::new_root(self.green(db)) + } +} + +#[salsa::tracked] +impl TexDocumentData { + #[salsa::tracked] + pub fn analyze(self, db: &dyn Db) -> TexAnalysis { + let root = latex::SyntaxNode::new_root(self.green(db)); + TexAnalysis::analyze(db, &root) + } +} + +#[salsa::interned] +pub struct BibDocumentData { + pub green: rowan::GreenNode, +} + +impl BibDocumentData { + pub fn root(self, db: &dyn Db) -> bibtex::SyntaxNode { + bibtex::SyntaxNode::new_root(self.green(db)) + } +} + +#[salsa::interned] +pub struct LogDocumentData { + pub log: BuildLog, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +pub enum DocumentData { + Tex(TexDocumentData), + Bib(BibDocumentData), + Log(LogDocumentData), +} + +impl DocumentData { + pub fn as_tex(self) -> Option<TexDocumentData> { + match self { + Self::Tex(data) => Some(data), + _ => None, + } + } + + pub fn as_bib(self) -> Option<BibDocumentData> { + match self { + Self::Bib(data) => Some(data), + _ => None, + } + } + + pub fn as_log(self) -> Option<LogDocumentData> { + match self { + Self::Log(data) => Some(data), + _ => None, + } + } +} diff --git a/support/texlab/src/db/workspace.rs b/support/texlab/src/db/workspace.rs new file mode 100644 index 0000000000..b8bdb27f1f --- /dev/null +++ b/support/texlab/src/db/workspace.rs @@ -0,0 +1,245 @@ +use std::{ + borrow::Cow, + path::{Path, PathBuf}, +}; + +use itertools::Itertools; +use lsp_types::{ClientCapabilities, ClientInfo, Url}; +use rowan::TextSize; +use rustc_hash::FxHashSet; + +use crate::{ + db::document::{Document, Location}, + distro::FileNameDB, + util::HOME_DIR, + Db, Options, +}; + +use super::{ + dependency_graph, + document::{Contents, Language, LinterData, Owner}, + Word, +}; + +#[salsa::input(singleton)] +pub struct Workspace { + #[return_ref] + pub documents: FxHashSet<Document>, + + #[return_ref] + pub options: Options, + + #[return_ref] + pub client_capabilities: ClientCapabilities, + + #[return_ref] + pub client_info: Option<ClientInfo>, + + #[return_ref] + pub root_dirs: Vec<Location>, + + #[return_ref] + pub file_name_db: FileNameDB, +} + +impl Workspace { + pub fn lookup(self, db: &dyn Db, location: Location) -> Option<Document> { + self.documents(db) + .iter() + .find(|document| document.location(db) == location) + .copied() + } + + pub fn lookup_uri(self, db: &dyn Db, uri: &Url) -> Option<Document> { + self.documents(db) + .iter() + .find(|document| document.location(db).uri(db) == uri) + .copied() + } + + pub fn lookup_path(self, db: &dyn Db, path: &Path) -> Option<Document> { + self.documents(db) + .iter() + .find(|document| document.location(db).path(db).as_deref() == Some(path)) + .copied() + } + + pub fn index_files<'db>(self, db: &'db dyn Db) -> impl Iterator<Item = Document> + 'db { + self.documents(db) + .iter() + .copied() + .filter(|&document| document.can_be_index(db)) + } + + pub fn open( + self, + db: &mut dyn Db, + uri: Url, + text: String, + language: Language, + owner: Owner, + ) -> Document { + let location = Location::new(db, uri); + let contents = Contents::new(db, text); + let cursor = TextSize::from(0); + match self.lookup(db, location) { + Some(document) => { + document.set_contents(db).to(contents); + document.set_language(db).to(language); + document.set_owner(db).to(owner); + document.set_cursor(db).to(cursor); + document + } + None => { + let document = Document::new( + db, + location, + contents, + language, + owner, + cursor, + LinterData::new(db, Vec::new()), + ); + + let mut documents = self.set_documents(db).to(FxHashSet::default()); + documents.insert(document); + self.set_documents(db).to(documents); + document + } + } + } + + pub fn load( + self, + db: &mut dyn Db, + path: &Path, + language: Language, + owner: Owner, + ) -> Option<Document> { + log::debug!("Loading document {} from disk...", path.display()); + + let uri = Url::from_file_path(path).ok()?; + let data = std::fs::read(path).ok()?; + let text = match String::from_utf8_lossy(&data) { + Cow::Borrowed(_) => unsafe { String::from_utf8_unchecked(data) }, + Cow::Owned(text) => text, + }; + + Some(self.open(db, uri, text, language, owner)) + } + + pub fn watch( + self, + db: &dyn Db, + watcher: &mut dyn notify::Watcher, + watched_dirs: &mut FxHashSet<PathBuf>, + ) { + let output_dirs = self + .documents(db) + .iter() + .map(|document| self.working_dir(db, document.directory(db))) + .map(|base_dir| self.output_dir(db, base_dir)) + .filter_map(|location| location.path(db).as_deref()); + + self.documents(db) + .iter() + .map(|document| document.location(db)) + .filter_map(|location| location.path(db).as_deref()) + .filter_map(|path| path.parent()) + .chain(output_dirs) + .filter(|path| watched_dirs.insert(path.to_path_buf())) + .for_each(|path| { + let _ = watcher.watch(path, notify::RecursiveMode::NonRecursive); + }); + } +} + +const SPECIAL_ENTRIES: &[&str] = &[ + ".git", + "Tectonic.toml", + ".latexmkrc", + "latexmkrc", + ".chktexrc", + "chktexrc", +]; + +#[salsa::tracked] +impl Workspace { + #[salsa::tracked] + pub fn working_dir(self, db: &dyn Db, base_dir: Location) -> Location { + let mut path = self + .options(db) + .root_directory + .as_deref() + .and_then(|path| path.to_str()) + .or_else(|| { + for dir in base_dir + .path(db) + .as_deref()? + .ancestors() + .skip(1) + .filter(|path| Some(*path) != HOME_DIR.as_deref()) + { + for name in SPECIAL_ENTRIES { + if dir.join(name).exists() { + return Some(dir.to_str()?); + } + } + } + + None + }) + .unwrap_or(".") + .to_string(); + + if !path.ends_with(".") { + path.push('/'); + } + + base_dir.join(db, &path).unwrap_or(base_dir) + } + + #[salsa::tracked] + pub fn output_dir(self, db: &dyn Db, base_dir: Location) -> Location { + let mut path = self + .options(db) + .aux_directory + .as_deref() + .and_then(|path| path.to_str()) + .unwrap_or(".") + .to_string(); + + if !path.ends_with("/") { + path.push('/'); + } + + base_dir.join(db, &path).unwrap_or(base_dir) + } + + #[salsa::tracked(return_ref)] + pub fn parents(self, db: &dyn Db, child: Document) -> Vec<Document> { + self.index_files(db) + .filter(|&parent| dependency_graph(db, parent).preorder().contains(&child)) + .collect() + } + + #[salsa::tracked(return_ref)] + pub fn related(self, db: &dyn Db, child: Document) -> FxHashSet<Document> { + self.index_files(db) + .chain(self.documents(db).iter().copied()) + .map(|start| dependency_graph(db, start).preorder().collect_vec()) + .filter(|project| project.contains(&child)) + .flatten() + .collect() + } + + #[salsa::tracked] + pub fn number_of_label(self, db: &dyn Db, child: Document, name: Word) -> Option<Word> { + self.related(db, child) + .iter() + .filter_map(|document| document.parse(db).as_tex()) + .flat_map(|data| data.analyze(db).label_numbers(db)) + .find(|number| number.name(db) == name) + .map(|number| number.text(db)) + } +} diff --git a/support/texlab/src/debouncer.rs b/support/texlab/src/debouncer.rs deleted file mode 100644 index b123dfc433..0000000000 --- a/support/texlab/src/debouncer.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::time::{Duration, Instant}; - -use anyhow::Result; - -pub struct Sender<T> { - tx: crossbeam_channel::Sender<(T, crossbeam_channel::Receiver<Instant>)>, -} - -impl<T> Clone for Sender<T> { - fn clone(&self) -> Self { - Self { - tx: self.tx.clone(), - } - } -} - -impl<T> Sender<T> -where - T: Send + Sync + 'static, -{ - pub fn send(&self, msg: T, delay: Duration) -> Result<()> { - self.tx.send((msg, crossbeam_channel::after(delay)))?; - Ok(()) - } -} - -pub struct Receiver<T> { - rx: crossbeam_channel::Receiver<(T, crossbeam_channel::Receiver<Instant>)>, -} - -impl<T> Clone for Receiver<T> { - fn clone(&self) -> Self { - Self { - rx: self.rx.clone(), - } - } -} - -impl<T> Receiver<T> { - pub fn recv(&self) -> Result<T> { - let (mut last_msg, delay) = self.rx.recv()?; - delay.recv()?; - while let Ok((msg, delay)) = self.rx.try_recv() { - delay.recv()?; - last_msg = msg; - } - - Ok(last_msg) - } -} - -pub fn unbounded<T>() -> (Sender<T>, Receiver<T>) { - let (tx, rx) = crossbeam_channel::unbounded(); - (Sender { tx }, Receiver { rx }) -} diff --git a/support/texlab/src/diagnostics.rs b/support/texlab/src/diagnostics.rs deleted file mode 100644 index bdd8faf106..0000000000 --- a/support/texlab/src/diagnostics.rs +++ /dev/null @@ -1,167 +0,0 @@ -mod bibtex; -mod build; -mod chktex; -mod latex; - -use std::sync::Arc; - -use dashmap::DashMap; -use lsp_types::{DiagnosticSeverity, NumberOrString, Range, Url}; -use regex::Regex; - -use crate::Workspace; - -use self::{ - bibtex::collect_bibtex_diagnostics, build::collect_build_diagnostics, - chktex::collect_chktex_diagnostics, latex::collect_latex_diagnostics, -}; - -#[derive(Debug, PartialEq, Eq, Clone)] -pub struct Diagnostic { - pub severity: DiagnosticSeverity, - pub range: Range, - pub code: DiagnosticCode, - pub message: String, -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] -pub enum DiagnosticCode { - Latex(LatexCode), - Bibtex(BibtexCode), - Chktex(String), - Build(Arc<Url>), -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] -pub enum LatexCode { - UnexpectedRCurly, - RCurlyInserted, - MismatchedEnvironment, -} - -impl From<LatexCode> for String { - fn from(code: LatexCode) -> Self { - match code { - LatexCode::UnexpectedRCurly => "Unexpected \"}\"".to_string(), - LatexCode::RCurlyInserted => "Missing \"}\" inserted".to_string(), - LatexCode::MismatchedEnvironment => "Mismatched environment".to_string(), - } - } -} - -impl From<LatexCode> for NumberOrString { - fn from(code: LatexCode) -> Self { - match code { - LatexCode::UnexpectedRCurly => NumberOrString::Number(1), - LatexCode::RCurlyInserted => NumberOrString::Number(2), - LatexCode::MismatchedEnvironment => NumberOrString::Number(3), - } - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] -#[allow(clippy::enum_variant_names)] -pub enum BibtexCode { - ExpectingLCurly, - ExpectingKey, - ExpectingRCurly, - ExpectingEq, - ExpectingFieldValue, -} - -impl From<BibtexCode> for String { - fn from(code: BibtexCode) -> Self { - match code { - BibtexCode::ExpectingLCurly => "Expecting a curly bracket: \"{\"".to_string(), - BibtexCode::ExpectingKey => "Expecting a key".to_string(), - BibtexCode::ExpectingRCurly => "Expecting a curly bracket: \"}\"".to_string(), - BibtexCode::ExpectingEq => "Expecting an equality sign: \"=\"".to_string(), - BibtexCode::ExpectingFieldValue => "Expecting a field value".to_string(), - } - } -} - -impl From<BibtexCode> for NumberOrString { - fn from(code: BibtexCode) -> Self { - match code { - BibtexCode::ExpectingLCurly => NumberOrString::Number(4), - BibtexCode::ExpectingKey => NumberOrString::Number(5), - BibtexCode::ExpectingRCurly => NumberOrString::Number(6), - BibtexCode::ExpectingEq => NumberOrString::Number(7), - BibtexCode::ExpectingFieldValue => NumberOrString::Number(8), - } - } -} - -#[derive(Default, Clone)] -pub struct DiagnosticManager { - all_diagnostics: Arc<DashMap<Arc<Url>, Vec<Diagnostic>>>, -} - -impl DiagnosticManager { - pub fn push_syntax(&self, workspace: &Workspace, uri: &Url) { - collect_bibtex_diagnostics(&self.all_diagnostics, workspace, uri) - .or_else(|| collect_latex_diagnostics(&self.all_diagnostics, workspace, uri)) - .or_else(|| collect_build_diagnostics(&self.all_diagnostics, workspace, uri)); - } - - pub fn push_chktex(&self, workspace: &Workspace, uri: &Url) { - collect_chktex_diagnostics(&self.all_diagnostics, workspace, uri); - } - - pub fn publish(&self, workspace: &Workspace, uri: &Url) -> Vec<lsp_types::Diagnostic> { - let options = &workspace.environment.options.diagnostics; - - let mut results = Vec::new(); - if let Some(diagnostics) = self.all_diagnostics.get(uri) { - for diagnostic in diagnostics.iter() { - if !options.allowed_patterns.is_empty() - && !options - .allowed_patterns - .iter() - .any(|pattern| pattern.0.is_match(&diagnostic.message)) - { - continue; - } - - if options - .ignored_patterns - .iter() - .any(|pattern| pattern.0.is_match(&diagnostic.message)) - { - continue; - } - - let source = match diagnostic.code { - DiagnosticCode::Latex(_) | DiagnosticCode::Bibtex(_) => "texlab", - DiagnosticCode::Chktex(_) => "chktex", - DiagnosticCode::Build(_) => "latex-build", - }; - - let code = match diagnostic.code.clone() { - DiagnosticCode::Latex(code) => Some(code.into()), - DiagnosticCode::Bibtex(code) => Some(code.into()), - DiagnosticCode::Chktex(code) => Some(NumberOrString::String(code)), - DiagnosticCode::Build(_) => None, - }; - - results.push(lsp_types::Diagnostic { - range: diagnostic.range, - code, - severity: Some(diagnostic.severity), - message: diagnostic.message.clone(), - source: Some(source.to_string()), - ..Default::default() - }); - } - } - - results - } -} - -#[derive(Debug, Default)] -pub struct DiagnosticFilter { - pub allowed_patterns: Vec<Regex>, - pub ignored_patterns: Vec<Regex>, -} diff --git a/support/texlab/src/diagnostics/bibtex.rs b/support/texlab/src/diagnostics/bibtex.rs deleted file mode 100644 index 42e215a794..0000000000 --- a/support/texlab/src/diagnostics/bibtex.rs +++ /dev/null @@ -1,139 +0,0 @@ -use std::sync::Arc; - -use dashmap::DashMap; -use lsp_types::{DiagnosticSeverity, Url}; -use rowan::{ast::AstNode, TextRange}; - -use crate::{ - syntax::bibtex::{self, HasDelims, HasEq, HasName, HasType, HasValue}, - Document, LineIndexExt, Workspace, -}; - -use super::{BibtexCode, Diagnostic, DiagnosticCode}; - -pub fn collect_bibtex_diagnostics( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - workspace: &Workspace, - uri: &Url, -) -> Option<()> { - let document = workspace.documents_by_uri.get(uri)?; - let data = document.data.as_bibtex()?; - - all_diagnostics.alter(uri, |_, mut diagnostics| { - diagnostics.retain(|diag| !matches!(diag.code, DiagnosticCode::Bibtex(_))); - diagnostics - }); - - let root = bibtex::SyntaxNode::new_root(data.green.clone()); - for node in root.descendants() { - analyze_entry(all_diagnostics, document, node.clone()) - .or_else(|| analyze_field(all_diagnostics, document, node)); - } - - Some(()) -} - -fn analyze_entry( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - document: &Document, - node: bibtex::SyntaxNode, -) -> Option<()> { - let entry = bibtex::Entry::cast(node)?; - if entry.left_delim_token().is_none() { - let code = BibtexCode::ExpectingLCurly; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(entry.type_token()?.text_range()), - code: DiagnosticCode::Bibtex(code), - message: String::from(code), - }); - - return Some(()); - } - - if entry.name_token().is_none() { - let code = BibtexCode::ExpectingKey; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(entry.left_delim_token()?.text_range()), - code: DiagnosticCode::Bibtex(code), - message: String::from(code), - }); - - return Some(()); - } - - if entry.right_delim_token().is_none() { - let code = BibtexCode::ExpectingRCurly; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(TextRange::empty(entry.syntax().text_range().end())), - code: DiagnosticCode::Bibtex(code), - message: String::from(code), - }); - - return Some(()); - } - - Some(()) -} - -fn analyze_field( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - document: &Document, - node: bibtex::SyntaxNode, -) -> Option<()> { - let field = bibtex::Field::cast(node)?; - if field.eq_token().is_none() { - let code = BibtexCode::ExpectingEq; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(field.name_token()?.text_range()), - - code: DiagnosticCode::Bibtex(code), - message: String::from(code), - }); - - return Some(()); - } - - if field.value().is_none() { - let code = BibtexCode::ExpectingFieldValue; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(field.name_token()?.text_range()), - - code: DiagnosticCode::Bibtex(code), - message: String::from(code), - }); - - return Some(()); - } - - Some(()) -} diff --git a/support/texlab/src/diagnostics/build.rs b/support/texlab/src/diagnostics/build.rs deleted file mode 100644 index 4b4ffcc8b4..0000000000 --- a/support/texlab/src/diagnostics/build.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::{path::PathBuf, sync::Arc}; - -use dashmap::DashMap; -use lsp_types::{DiagnosticSeverity, Position, Range, Url}; - -use crate::{syntax::build_log::BuildErrorLevel, Workspace}; - -use super::{Diagnostic, DiagnosticCode}; - -pub fn collect_build_diagnostics( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - workspace: &Workspace, - build_log_uri: &Url, -) -> Option<()> { - let build_log_document = workspace.documents_by_uri.get(build_log_uri)?; - let build_log = build_log_document.data.as_build_log()?; - - all_diagnostics.alter_all(|_, mut diagnostics| { - diagnostics.retain( - |diag| !matches!(&diag.code, DiagnosticCode::Build(uri) if uri.as_ref() == build_log_uri), - ); - diagnostics - }); - - let root_document = workspace.documents_by_uri.values().find(|document| { - document.data.as_latex().map_or(false, |data| { - !document.uri.as_str().ends_with(".aux") - && data - .extras - .implicit_links - .log - .iter() - .any(|u| u.as_ref() == build_log_uri) - }) - })?; - - let base_path = PathBuf::from(root_document.uri.path()); - for error in &build_log.errors { - let position = Position::new(error.line.unwrap_or(0), 0); - let severity = match error.level { - BuildErrorLevel::Error => DiagnosticSeverity::ERROR, - BuildErrorLevel::Warning => DiagnosticSeverity::WARNING, - }; - let range = Range::new(position, position); - let diagnostic = Diagnostic { - severity, - range, - code: DiagnosticCode::Build(Arc::clone(&build_log_document.uri)), - message: error.message.clone(), - }; - - let full_path = base_path.join(&error.relative_path); - - let uri = if full_path.starts_with(&base_path) { - error - .relative_path - .to_str() - .and_then(|path| root_document.uri.join(path).map(Into::into).ok()) - .map_or_else(|| Arc::clone(&root_document.uri), Arc::new) - } else { - Arc::clone(&root_document.uri) - }; - - all_diagnostics.entry(uri).or_default().push(diagnostic); - } - - Some(()) -} diff --git a/support/texlab/src/diagnostics/chktex.rs b/support/texlab/src/diagnostics/chktex.rs deleted file mode 100644 index ad676bd70d..0000000000 --- a/support/texlab/src/diagnostics/chktex.rs +++ /dev/null @@ -1,103 +0,0 @@ -use std::{ - fs, io, - path::Path, - process::{Command, Stdio}, - sync::Arc, -}; - -use dashmap::DashMap; -use lsp_types::{DiagnosticSeverity, Range, Url}; -use once_cell::sync::Lazy; -use regex::Regex; -use tempfile::tempdir; - -use crate::{RangeExt, Workspace}; - -use super::{Diagnostic, DiagnosticCode}; - -pub fn collect_chktex_diagnostics( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - workspace: &Workspace, - uri: &Url, -) -> Option<()> { - let document = workspace.documents_by_uri.get(uri)?; - document.data.as_latex()?; - - all_diagnostics.alter(uri, |_, mut diagnostics| { - diagnostics.retain(|diag| !matches!(diag.code, DiagnosticCode::Chktex(_))); - diagnostics - }); - - let current_dir = workspace - .environment - .options - .root_directory - .as_ref() - .cloned() - .or_else(|| { - if document.uri.scheme() == "file" { - document - .uri - .to_file_path() - .unwrap() - .parent() - .map(ToOwned::to_owned) - } else { - None - } - }) - .unwrap_or_else(|| ".".into()); - - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .extend(lint(&document.text, ¤t_dir).unwrap_or_default()); - - Some(()) -} - -static LINE_REGEX: Lazy<Regex> = - Lazy::new(|| Regex::new("(\\d+):(\\d+):(\\d+):(\\w+):(\\w+):(.*)").unwrap()); - -fn lint(text: &str, current_dir: &Path) -> io::Result<Vec<Diagnostic>> { - let directory = tempdir()?; - fs::write(directory.path().join("file.tex"), text)?; - drop(fs::copy( - current_dir.join("chktexrc"), - directory.path().join("chktexrc"), - )); - - let output = Command::new("chktex") - .args(&["-I0", "-f%l:%c:%d:%k:%n:%m\n", "file.tex"]) - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .current_dir(directory.path()) - .output()?; - - let mut diagnostics = Vec::new(); - for line in String::from_utf8_lossy(&output.stdout).lines() { - let captures = LINE_REGEX.captures(line).unwrap(); - let line = captures[1].parse::<u32>().unwrap() - 1; - let character = captures[2].parse::<u32>().unwrap() - 1; - let digit = captures[3].parse::<u32>().unwrap(); - let kind = &captures[4]; - let code = &captures[5]; - let message = captures[6].into(); - let range = Range::new_simple(line, character, line, character + digit); - let severity = match kind { - "Message" => DiagnosticSeverity::INFORMATION, - "Warning" => DiagnosticSeverity::WARNING, - _ => DiagnosticSeverity::ERROR, - }; - - diagnostics.push(Diagnostic { - range, - severity, - code: DiagnosticCode::Chktex(code.into()), - message, - }); - } - - Ok(diagnostics) -} diff --git a/support/texlab/src/diagnostics/latex.rs b/support/texlab/src/diagnostics/latex.rs deleted file mode 100644 index a17aab3f77..0000000000 --- a/support/texlab/src/diagnostics/latex.rs +++ /dev/null @@ -1,126 +0,0 @@ -use std::sync::Arc; - -use dashmap::DashMap; -use lsp_types::{DiagnosticSeverity, Url}; -use rowan::{ast::AstNode, NodeOrToken, TextRange}; - -use crate::{syntax::latex, Document, LineIndexExt, Workspace}; - -use super::{Diagnostic, DiagnosticCode, LatexCode}; - -pub fn collect_latex_diagnostics( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - workspace: &Workspace, - uri: &Url, -) -> Option<()> { - let document = workspace.documents_by_uri.get(uri)?; - if !document.uri.as_str().ends_with(".tex") { - return None; - } - - let data = document.data.as_latex()?; - - all_diagnostics.alter(uri, |_, mut diagnostics| { - diagnostics.retain(|diag| !matches!(diag.code, DiagnosticCode::Latex(_))); - diagnostics - }); - - for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { - analyze_environment(all_diagnostics, document, node.clone()) - .or_else(|| analyze_curly_group(all_diagnostics, document, &node)) - .or_else(|| { - if node.kind() == latex::ERROR && node.first_token()?.text() == "}" { - let code = LatexCode::UnexpectedRCurly; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document.line_index.line_col_lsp_range(node.text_range()), - code: DiagnosticCode::Latex(code), - message: String::from(code), - }); - - Some(()) - } else { - None - } - }); - } - - Some(()) -} - -fn analyze_environment( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - document: &Document, - node: latex::SyntaxNode, -) -> Option<()> { - let environment = latex::Environment::cast(node)?; - let name1 = environment.begin()?.name()?.key()?; - let name2 = environment.end()?.name()?.key()?; - if name1 != name2 { - let code = LatexCode::MismatchedEnvironment; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(latex::small_range(&name1)), - code: DiagnosticCode::Latex(code), - message: String::from(code), - }); - } - Some(()) -} - -fn analyze_curly_group( - all_diagnostics: &DashMap<Arc<Url>, Vec<Diagnostic>>, - document: &Document, - node: &latex::SyntaxNode, -) -> Option<()> { - if !matches!( - node.kind(), - latex::CURLY_GROUP - | latex::CURLY_GROUP_COMMAND - | latex::CURLY_GROUP_KEY_VALUE - | latex::CURLY_GROUP_WORD - | latex::CURLY_GROUP_WORD_LIST - ) { - return None; - } - - let is_inside_verbatim_environment = node - .ancestors() - .filter_map(latex::Environment::cast) - .filter_map(|env| env.begin()) - .filter_map(|begin| begin.name()) - .filter_map(|name| name.key()) - .any(|name| { - ["asy", "lstlisting", "minted", "verbatim"].contains(&name.to_string().as_str()) - }); - - if !is_inside_verbatim_environment - && !node - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .any(|token| token.kind() == latex::R_CURLY) - { - let code = LatexCode::RCurlyInserted; - all_diagnostics - .entry(Arc::clone(&document.uri)) - .or_default() - .push(Diagnostic { - severity: DiagnosticSeverity::ERROR, - range: document - .line_index - .line_col_lsp_range(TextRange::empty(node.text_range().end())), - code: DiagnosticCode::Latex(code), - message: String::from(code), - }); - } - - Some(()) -} diff --git a/support/texlab/src/distro.rs b/support/texlab/src/distro.rs index f869392366..759374da81 100644 --- a/support/texlab/src/distro.rs +++ b/support/texlab/src/distro.rs @@ -1,3 +1,4 @@ +mod file_name_db; mod kpsewhich; mod miktex; mod texlive; @@ -5,41 +6,40 @@ mod texlive; use std::process::{Command, Stdio}; use anyhow::Result; -use derive_more::Display; -use log::warn; -pub use kpsewhich::Resolver; +pub use file_name_db::FileNameDB; -#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)] -pub enum DistributionKind { - #[display(fmt = "TeXLive")] +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum DistroKind { Texlive, - #[display(fmt = "MikTeX")] Miktex, - #[display(fmt = "Tectonic")] Tectonic, - #[display(fmt = "Unknown")] Unknown, } -#[derive(Debug, Clone)] -pub struct Distribution { - pub kind: DistributionKind, - pub resolver: Resolver, +impl Default for DistroKind { + fn default() -> Self { + Self::Unknown + } +} + +#[derive(Debug, Default)] +pub struct Distro { + pub kind: DistroKind, + pub file_name_db: FileNameDB, } -impl Distribution { - #[must_use] - pub fn detect() -> Self { +impl Distro { + pub fn detect() -> Result<Self> { let kind = match Command::new("latex").arg("--version").output() { Ok(output) => { let stdout = String::from_utf8_lossy(&output.stdout); if stdout.contains("TeX Live") { - DistributionKind::Texlive + DistroKind::Texlive } else if stdout.contains("MiKTeX") { - DistributionKind::Miktex + DistroKind::Miktex } else { - DistributionKind::Unknown + DistroKind::Unknown } } Err(_) => { @@ -50,26 +50,25 @@ impl Distribution { .status() .is_ok() { - DistributionKind::Tectonic + DistroKind::Tectonic } else { - DistributionKind::Unknown + DistroKind::Unknown } } }; - let resolver = match kind { - DistributionKind::Texlive => Self::load_resolver(texlive::load_resolver), - DistributionKind::Miktex => Self::load_resolver(miktex::load_resolver), - DistributionKind::Tectonic | DistributionKind::Unknown => Resolver::default(), + let file_name_db = match kind { + DistroKind::Texlive => { + let root_dirs = kpsewhich::root_directories()?; + FileNameDB::parse(&root_dirs, &mut texlive::read_database)? + } + DistroKind::Miktex => { + let root_dirs = kpsewhich::root_directories()?; + FileNameDB::parse(&root_dirs, &mut miktex::read_database)? + } + DistroKind::Tectonic | DistroKind::Unknown => FileNameDB::default(), }; - Self { kind, resolver } - } - fn load_resolver(loader: impl FnOnce() -> Result<Resolver>) -> Resolver { - match loader() { - Ok(resolver) => return resolver, - Err(why) => warn!("Failed to load resolver: {}", why), - }; - Resolver::default() + Ok(Self { kind, file_name_db }) } } diff --git a/support/texlab/src/distro/file_name_db.rs b/support/texlab/src/distro/file_name_db.rs new file mode 100644 index 0000000000..9234d0a3f9 --- /dev/null +++ b/support/texlab/src/distro/file_name_db.rs @@ -0,0 +1,80 @@ +use std::{ + borrow::Borrow, + path::{Path, PathBuf}, +}; + +use anyhow::Result; +use rustc_hash::FxHashSet; + +use crate::db::Language; + +#[derive(Debug)] +pub struct DistroFile(PathBuf); + +impl DistroFile { + pub fn path(&self) -> &Path { + &self.0 + } + + pub fn name(&self) -> &str { + self.0.file_name().unwrap().to_str().unwrap() + } +} + +impl PartialEq for DistroFile { + fn eq(&self, other: &Self) -> bool { + self.name() == other.name() + } +} + +impl Eq for DistroFile {} + +impl std::hash::Hash for DistroFile { + fn hash<H: std::hash::Hasher>(&self, state: &mut H) { + self.name().hash(state) + } +} + +impl Borrow<str> for DistroFile { + fn borrow(&self) -> &str { + self.name() + } +} + +#[derive(Debug, Default)] +pub struct FileNameDB { + files: FxHashSet<DistroFile>, +} + +impl FileNameDB { + pub fn get(&self, name: &str) -> Option<&Path> { + self.files.get(name).map(|file| file.path()) + } + + pub fn iter(&self) -> impl Iterator<Item = (&str, &Path)> + '_ { + self.files.iter().map(|file| (file.name(), file.path())) + } + + pub fn parse( + root_dirs: &[PathBuf], + reader: &mut dyn FnMut(&Path) -> Result<Vec<PathBuf>>, + ) -> Result<Self> { + let files = root_dirs + .iter() + .flat_map(|dir| reader(dir)) + .flatten() + .filter_map(|rel_path| { + Language::from_path(&rel_path)?; + rel_path.file_name()?.to_str()?; + let abs_path = root_dirs + .iter() + .rev() + .map(|dir| dir.join(&rel_path)) + .find_map(|path| std::fs::canonicalize(path).ok())?; + Some(DistroFile(abs_path)) + }) + .collect(); + + Ok(Self { files }) + } +} diff --git a/support/texlab/src/distro/kpsewhich.rs b/support/texlab/src/distro/kpsewhich.rs index b14e64bf56..0a6d1d35ad 100644 --- a/support/texlab/src/distro/kpsewhich.rs +++ b/support/texlab/src/distro/kpsewhich.rs @@ -1,56 +1,6 @@ -use std::{ - env, - ffi::OsStr, - fs, - path::{Path, PathBuf}, - process::Command, -}; +use std::{env, ffi::OsStr, path::PathBuf, process::Command}; use anyhow::Result; -use rustc_hash::FxHashMap; -use smol_str::SmolStr; - -use crate::DocumentLanguage; - -#[derive(Debug, PartialEq, Eq, Clone, Default)] -pub struct Resolver { - pub files_by_name: FxHashMap<SmolStr, PathBuf>, -} - -impl Resolver { - #[must_use] - pub fn new(files_by_name: FxHashMap<SmolStr, PathBuf>) -> Self { - Self { files_by_name } - } -} - -pub fn parse_database( - root_directories: &[PathBuf], - mut reader: impl FnMut(&Path) -> Result<Vec<PathBuf>>, -) -> Result<Resolver> { - let mut files_by_name = FxHashMap::default(); - for directory in root_directories { - for path in reader(directory)? { - if DocumentLanguage::by_path(&path).is_some() { - if let Some(path) = make_absolute(root_directories, &path) { - if let Some(name) = path.file_name().and_then(OsStr::to_str).map(Into::into) { - files_by_name.insert(name, path); - } - } - } - } - } - Ok(Resolver::new(files_by_name)) -} - -fn make_absolute(root_directories: &[PathBuf], relative_path: &Path) -> Option<PathBuf> { - for dir in root_directories.iter().rev() { - if let Ok(path) = fs::canonicalize(dir.join(&relative_path)) { - return Some(path); - } - } - None -} pub fn root_directories() -> Result<Vec<PathBuf>> { let texmf = run(&["-var-value", "TEXMF"])?; diff --git a/support/texlab/src/distro/miktex.rs b/support/texlab/src/distro/miktex.rs index c7a92d572e..fc778752db 100644 --- a/support/texlab/src/distro/miktex.rs +++ b/support/texlab/src/distro/miktex.rs @@ -1,20 +1,11 @@ use std::{ ffi::OsStr, fs, - io::{self, Cursor}, + io::{self, Cursor, Read}, path::{Path, PathBuf}, }; use anyhow::{Context, Result}; -use byteorder::{LittleEndian, ReadBytesExt}; - -use super::kpsewhich::{self, Resolver}; - -pub fn load_resolver() -> Result<Resolver> { - let root_directories = kpsewhich::root_directories()?; - let resolver = kpsewhich::parse_database(&root_directories, read_database)?; - Ok(resolver) -} const DATABASE_PATH: &str = "miktex/data/le"; const FNDB_SIGNATURE: u32 = 0x42_44_4e_46; @@ -23,7 +14,7 @@ const FNDB_TABLE_POINTER_OFFSET: u32 = 4 * FNDB_WORD_SIZE; const FNDB_TABLE_SIZE_OFFSET: u32 = 6 * FNDB_WORD_SIZE; const FNDB_ENTRY_SIZE: u32 = 4 * FNDB_WORD_SIZE; -fn read_database(directory: &Path) -> Result<Vec<PathBuf>> { +pub(super) fn read_database(directory: &Path) -> Result<Vec<PathBuf>> { let database_directory = directory.join(DATABASE_PATH); if !database_directory.exists() { return Ok(Vec::new()); @@ -36,27 +27,28 @@ fn read_database(directory: &Path) -> Result<Vec<PathBuf>> { database.extend(parse_database(&bytes).context("parsing kpsewhich database")?); } } + Ok(database) } fn parse_database(bytes: &[u8]) -> io::Result<Vec<PathBuf>> { let mut reader = Cursor::new(bytes); - if reader.read_u32::<LittleEndian>()? != FNDB_SIGNATURE { + if read_u32(&mut reader)? != FNDB_SIGNATURE { return Err(io::ErrorKind::InvalidData.into()); } reader.set_position(u64::from(FNDB_TABLE_POINTER_OFFSET)); - let table_address = reader.read_u32::<LittleEndian>()?; + let table_address = read_u32(&mut reader)?; reader.set_position(u64::from(FNDB_TABLE_SIZE_OFFSET)); - let table_size = reader.read_u32::<LittleEndian>()?; + let table_size = read_u32(&mut reader)?; let mut files = Vec::new(); for i in 0..table_size { let offset = table_address + i * FNDB_ENTRY_SIZE as u32; reader.set_position(u64::from(offset)); - let file_name_offset = reader.read_u32::<LittleEndian>()? as usize; - let directory_offset = reader.read_u32::<LittleEndian>()? as usize; + let file_name_offset = read_u32(&mut reader)? as usize; + let directory_offset = read_u32(&mut reader)? as usize; let file_name = read_string(bytes, file_name_offset)?; let directory = read_string(bytes, directory_offset)?; @@ -78,3 +70,9 @@ fn read_string(bytes: &[u8], offset: usize) -> io::Result<&str> { std::str::from_utf8(&bytes[offset..offset + length]) .map_err(|_| io::ErrorKind::InvalidData.into()) } + +fn read_u32(reader: &mut Cursor<&[u8]>) -> io::Result<u32> { + let mut buf = [0u8; std::mem::size_of::<u32>()]; + reader.read_exact(&mut buf)?; + Ok(u32::from_le_bytes(buf)) +} diff --git a/support/texlab/src/distro/texlive.rs b/support/texlab/src/distro/texlive.rs index 47159b2efc..8013033e6d 100644 --- a/support/texlab/src/distro/texlive.rs +++ b/support/texlab/src/distro/texlive.rs @@ -6,17 +6,9 @@ use std::{ use anyhow::Result; -use super::kpsewhich::{self, Resolver}; - -pub fn load_resolver() -> Result<Resolver> { - let root_directories = kpsewhich::root_directories()?; - let resolver = kpsewhich::parse_database(&root_directories, read_database)?; - Ok(resolver) -} - const DATABASE_PATH: &str = "ls-R"; -fn read_database(directory: &Path) -> Result<Vec<PathBuf>> { +pub(super) fn read_database(directory: &Path) -> Result<Vec<PathBuf>> { let file = directory.join(DATABASE_PATH); if !file.is_file() { return Ok(Vec::new()); diff --git a/support/texlab/src/document.rs b/support/texlab/src/document.rs deleted file mode 100644 index 60e295b2e4..0000000000 --- a/support/texlab/src/document.rs +++ /dev/null @@ -1,135 +0,0 @@ -use std::{fmt, sync::Arc}; - -use derive_more::From; -use lsp_types::Url; - -use crate::{ - line_index::LineIndex, - syntax::{ - bibtex, build_log, - latex::{self, LatexAnalyzerContext}, - }, - DocumentLanguage, Environment, -}; - -#[derive(Debug, Clone)] -pub struct LatexDocumentData { - pub green: rowan::GreenNode, - pub extras: Arc<latex::Extras>, -} - -#[derive(Debug, Clone)] -pub struct BibtexDocumentData { - pub green: rowan::GreenNode, -} - -#[derive(Debug, Clone, From)] -pub enum DocumentData { - Latex(Box<LatexDocumentData>), - Bibtex(BibtexDocumentData), - BuildLog(Arc<build_log::Parse>), -} - -impl DocumentData { - #[must_use] - pub fn language(&self) -> DocumentLanguage { - match self { - Self::Latex(_) => DocumentLanguage::Latex, - Self::Bibtex(_) => DocumentLanguage::Bibtex, - Self::BuildLog(_) => DocumentLanguage::BuildLog, - } - } - - #[must_use] - pub fn as_latex(&self) -> Option<&LatexDocumentData> { - if let Self::Latex(data) = self { - Some(data) - } else { - None - } - } - - #[must_use] - pub fn as_bibtex(&self) -> Option<&BibtexDocumentData> { - if let Self::Bibtex(data) = self { - Some(data) - } else { - None - } - } - - #[must_use] - pub fn as_build_log(&self) -> Option<&build_log::Parse> { - if let Self::BuildLog(v) = self { - Some(v) - } else { - None - } - } -} - -#[derive(Clone)] -pub struct Document { - pub uri: Arc<Url>, - pub text: Arc<String>, - pub line_index: Arc<LineIndex>, - pub data: DocumentData, -} - -impl fmt::Debug for Document { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.uri) - } -} - -impl Document { - #[must_use] - pub fn parse( - environment: &Environment, - uri: Arc<Url>, - text: Arc<String>, - language: DocumentLanguage, - ) -> Self { - let line_index = Arc::new(LineIndex::new(&text)); - let data = match language { - DocumentLanguage::Latex => { - let green = latex::parse(&text).green; - let root = latex::SyntaxNode::new_root(green.clone()); - - let base_uri = match &environment.options.root_directory { - Some(root_dir) => { - let root_dir = environment.current_directory.join(&root_dir); - Url::from_directory_path(root_dir) - .map_or_else(|()| Arc::clone(&uri), Arc::new) - } - None => Arc::clone(&uri), - }; - - let mut context = LatexAnalyzerContext { - environment, - extras: latex::Extras::default(), - document_uri: Arc::clone(&uri), - base_uri, - }; - latex::analyze(&mut context, &root); - let extras = Arc::new(context.extras); - DocumentData::Latex(Box::new(LatexDocumentData { green, extras })) - } - DocumentLanguage::Bibtex => { - let green = bibtex::parse(&text); - DocumentData::Bibtex(BibtexDocumentData { green }) - } - DocumentLanguage::BuildLog => { - let data = Arc::new(build_log::parse(&text)); - DocumentData::BuildLog(data) - } - }; - - Self { - uri, - text, - line_index, - data, - } - } -} diff --git a/support/texlab/src/environment.rs b/support/texlab/src/environment.rs deleted file mode 100644 index 54b6279f30..0000000000 --- a/support/texlab/src/environment.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::{path::PathBuf, sync::Arc}; - -use lsp_types::{ClientCapabilities, ClientInfo}; - -use crate::{distro::Resolver, Options}; - -#[derive(Debug, Clone)] -pub struct Environment { - pub current_directory: Arc<PathBuf>, - pub client_capabilities: Arc<ClientCapabilities>, - pub client_info: Option<Arc<ClientInfo>>, - pub options: Arc<Options>, - pub resolver: Arc<Resolver>, -} - -impl Environment { - #[must_use] - pub fn new(current_directory: Arc<PathBuf>) -> Self { - Self { - current_directory, - client_capabilities: Arc::new(ClientCapabilities::default()), - client_info: None, - options: Arc::new(Options::default()), - resolver: Arc::new(Resolver::default()), - } - } -} - -impl Default for Environment { - fn default() -> Self { - Self::new(Arc::new(std::env::temp_dir())) - } -} diff --git a/support/texlab/src/features.rs b/support/texlab/src/features.rs index 9576f266a9..0d82bcb4f4 100644 --- a/support/texlab/src/features.rs +++ b/support/texlab/src/features.rs @@ -1,52 +1,14 @@ -mod build; -#[cfg(feature = "completion")] -mod completion; -mod cursor; -mod definition; -mod execute_command; -mod folding; -mod formatting; -mod forward_search; -mod highlight; -mod hover; -mod link; -mod lsp_kinds; -mod reference; -mod rename; -mod symbol; - -use std::sync::Arc; - -use lsp_types::Url; - -use crate::{Document, Workspace}; - -#[cfg(feature = "completion")] -pub use self::completion::{complete, CompletionItemData, COMPLETION_LIMIT}; -pub use self::{ - build::{BuildEngine, BuildParams, BuildResult, BuildStatus}, - definition::goto_definition, - execute_command::execute_command, - folding::find_foldings, - formatting::format_source_code, - forward_search::{execute_forward_search, ForwardSearchResult, ForwardSearchStatus}, - highlight::find_document_highlights, - hover::find_hover, - link::find_document_links, - reference::find_all_references, - rename::{prepare_rename_all, rename_all}, - symbol::{find_document_symbols, find_workspace_symbols}, -}; - -#[derive(Clone)] -pub struct FeatureRequest<P> { - pub params: P, - pub workspace: Workspace, - pub uri: Arc<Url>, -} - -impl<P> FeatureRequest<P> { - pub fn main_document(&self) -> &Document { - &self.workspace.documents_by_uri[&self.uri] - } -} +pub mod build; +pub mod completion; +pub mod definition; +pub mod folding; +pub mod formatting; +pub mod forward_search; +pub mod highlight; +pub mod hover; +pub mod inlay_hint; +pub mod link; +pub mod reference; +pub mod rename; +pub mod symbol; +pub mod workspace_command; diff --git a/support/texlab/src/features/build.rs b/support/texlab/src/features/build.rs index d961052061..645f1e8e0e 100644 --- a/support/texlab/src/features/build.rs +++ b/support/texlab/src/features/build.rs @@ -1,28 +1,18 @@ +mod progress; + use std::{ io::{BufRead, BufReader, Read}, - path::Path, - process::{Command, Stdio}, - sync::{Arc, Mutex}, + path::{Path, PathBuf}, + process::Stdio, thread::{self, JoinHandle}, }; -use anyhow::Result; -use crossbeam_channel::{Receiver, Sender}; -use dashmap::DashMap; use encoding_rs_io::DecodeReaderBytesBuilder; -use lsp_types::{ - notification::{LogMessage, Progress}, - LogMessageParams, NumberOrString, Position, ProgressParams, ProgressParamsValue, - TextDocumentIdentifier, TextDocumentPositionParams, Url, WorkDoneProgress, - WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd, -}; +use lsp_types::{notification::LogMessage, LogMessageParams, TextDocumentIdentifier, Url}; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; -use uuid::Uuid; -use crate::{client, req_queue::ReqQueue, ClientCapabilitiesExt, DocumentLanguage}; - -use super::{forward_search, FeatureRequest}; +use crate::{client::LspClient, db::Workspace, util::capabilities::ClientCapabilitiesExt, Db}; #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -30,6 +20,12 @@ pub struct BuildParams { pub text_document: TextDocumentIdentifier, } +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BuildResult { + pub status: BuildStatus, +} + #[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize_repr, Deserialize_repr)] #[repr(i32)] pub enum BuildStatus { @@ -39,217 +35,132 @@ pub enum BuildStatus { CANCELLED = 3, } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct BuildResult { - pub status: BuildStatus, -} - -struct ProgressReporter<'a> { - supports_progress: bool, - req_queue: &'a Mutex<ReqQueue>, - lsp_sender: Sender<lsp_server::Message>, - token: &'a str, +#[derive(Debug)] +pub struct Command { + uri: Url, + progress: bool, + executable: String, + args: Vec<String>, + working_dir: PathBuf, + client: LspClient, } -impl<'a> ProgressReporter<'a> { - pub fn start(&self, uri: &Url) -> Result<()> { - if self.supports_progress { - client::send_request::<lsp_types::request::WorkDoneProgressCreate>( - self.req_queue, - &self.lsp_sender, - WorkDoneProgressCreateParams { - token: NumberOrString::String(self.token.to_string()), - }, - )?; - client::send_notification::<Progress>( - &self.lsp_sender, - ProgressParams { - token: NumberOrString::String(self.token.to_string()), - value: ProgressParamsValue::WorkDone(WorkDoneProgress::Begin( - WorkDoneProgressBegin { - title: "Building".to_string(), - message: Some(uri.as_str().to_string()), - cancellable: Some(false), - percentage: None, - }, - )), - }, - )?; +impl Command { + pub fn new(db: &dyn Db, uri: Url, client: LspClient) -> Option<Self> { + let workspace = Workspace::get(db); + let document = match workspace.lookup_uri(db, &uri) { + Some(child) => workspace + .parents(db, child) + .iter() + .next() + .copied() + .unwrap_or(child), + None => return None, }; - Ok(()) - } -} -impl<'a> Drop for ProgressReporter<'a> { - fn drop(&mut self) { - if self.supports_progress { - drop(client::send_notification::<Progress>( - &self.lsp_sender, - ProgressParams { - token: NumberOrString::String(self.token.to_string()), - value: ProgressParamsValue::WorkDone(WorkDoneProgress::End( - WorkDoneProgressEnd { message: None }, - )), - }, - )); + if document.location(db).path(db).is_none() { + log::warn!("Document {uri} cannot be compiled; skipping..."); + return None; } - } -} - -#[derive(Default)] -pub struct BuildEngine { - lock: Mutex<()>, - pub positions_by_uri: DashMap<Arc<Url>, Position>, -} - -impl BuildEngine { - pub fn build( - &self, - request: FeatureRequest<BuildParams>, - req_queue: &Mutex<ReqQueue>, - lsp_sender: &Sender<lsp_server::Message>, - ) -> Result<BuildResult> { - let lock = self.lock.lock().unwrap(); - - let document = request - .workspace - .documents_by_uri - .values() - .find(|document| { - if let Some(data) = document.data.as_latex() { - data.extras.has_document_environment - } else { - false - } - }) - .unwrap_or_else(|| request.main_document()); - - if document.data.language() != DocumentLanguage::Latex { - return Ok(BuildResult { - status: BuildStatus::SUCCESS, - }); - } - - if document.uri.scheme() != "file" { - return Ok(BuildResult { - status: BuildStatus::FAILURE, - }); - } - let path = document.uri.to_file_path().unwrap(); - - let supports_progress = request - .workspace - .environment - .client_capabilities - .has_work_done_progress_support(); - - let token = format!("texlab-build-{}", Uuid::new_v4()); - let progress_reporter = ProgressReporter { - supports_progress, - req_queue, - lsp_sender: lsp_sender.clone(), - token: &token, - }; - progress_reporter.start(&document.uri)?; - let options = &request.workspace.environment.options; - - let build_dir = options - .root_directory - .as_ref() - .map(AsRef::as_ref) - .or_else(|| path.parent()) - .unwrap(); - - let args: Vec<_> = options - .build + let options = &workspace.options(db).build; + let executable = options.executable.0.clone(); + let path = document.location(db).path(db).as_deref().unwrap(); + let args = options .args + .0 .iter() - .map(|arg| replace_placeholder(arg.clone(), &path)) + .map(|arg| replace_placeholder(arg, path)) .collect(); - let mut process = Command::new(&options.build.executable) - .args(args) - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .current_dir(build_dir) - .spawn()?; - - let (exit_sender, exit_receiver) = crossbeam_channel::bounded(1); - let log_handle = capture_output(&mut process, lsp_sender, exit_receiver); - let success = process.wait().map(|status| status.success())?; - exit_sender.send(())?; - drop(exit_sender); + let working_dir = workspace + .working_dir(db, document.directory(db)) + .path(db) + .clone()?; + + Some(Self { + uri: document.location(db).uri(db).clone(), + progress: workspace + .client_capabilities(db) + .has_work_done_progress_support(), + executable, + args, + working_dir, + client, + }) + } - log_handle.join().unwrap(); - let status = if success { - BuildStatus::SUCCESS + pub fn run(self) -> BuildStatus { + let reporter = if self.progress { + let inner = progress::Reporter::new(&self.client); + inner.start(&self.uri).expect("report progress"); + Some(inner) } else { - BuildStatus::ERROR + None }; - drop(progress_reporter); - drop(lock); - - if options.build.forward_search_after { - let request = FeatureRequest { - params: TextDocumentPositionParams { - position: self - .positions_by_uri - .get(&request.main_document().uri) - .map(|guard| *guard) - .unwrap_or_default(), - text_document: TextDocumentIdentifier::new(request.uri.as_ref().clone()), - }, - uri: request.uri, - workspace: request.workspace, - }; - forward_search::execute_forward_search(request); - } - - Ok(BuildResult { status }) - } -} - -fn capture_output( - process: &mut std::process::Child, - lsp_sender: &Sender<lsp_server::Message>, - exit_receiver: Receiver<()>, -) -> JoinHandle<()> { - let (log_sender, log_receiver) = crossbeam_channel::unbounded(); - track_output(process.stdout.take().unwrap(), log_sender.clone()); - track_output(process.stderr.take().unwrap(), log_sender); - let lsp_sender = lsp_sender.clone(); - thread::spawn(move || loop { - crossbeam_channel::select! { - recv(&log_receiver) -> message => { - if let Ok(message) = message { - client::send_notification::<LogMessage>( - &lsp_sender, - LogMessageParams { - message, - typ: lsp_types::MessageType::LOG, - }, - ) - .unwrap(); - } - }, - recv(&exit_receiver) -> _ => break, + let mut process = match std::process::Command::new(&self.executable) + .args(self.args) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .current_dir(self.working_dir) + .spawn() + { + Ok(process) => process, + Err(_) => { + log::error!("Failed to spawn process: {:?}", self.executable); + return BuildStatus::FAILURE; + } }; - }) -} -fn replace_placeholder(arg: String, file: &Path) -> String { - if arg.starts_with('"') || arg.ends_with('"') { - arg - } else { - arg.replace("%f", &file.to_string_lossy()) + let (line_sender, line_receiver) = flume::unbounded(); + let (exit_sender, exit_receiver) = flume::unbounded(); + track_output(process.stderr.take().unwrap(), line_sender.clone()); + track_output(process.stdout.take().unwrap(), line_sender); + let client = self.client.clone(); + let handle = std::thread::spawn(move || { + let typ = lsp_types::MessageType::LOG; + + loop { + let done = flume::Selector::new() + .recv(&line_receiver, |line| match line { + Ok(message) => { + let params = LogMessageParams { message, typ }; + client.send_notification::<LogMessage>(params).unwrap(); + false + } + Err(_) => true, + }) + .recv(&exit_receiver, |_| true) + .wait(); + + if done { + break; + } + } + }); + + let status = process.wait().map_or(BuildStatus::FAILURE, |result| { + if result.success() { + BuildStatus::SUCCESS + } else { + BuildStatus::ERROR + } + }); + + let _ = exit_sender.send(()); + handle.join().unwrap(); + + drop(reporter); + status } } -fn track_output(output: impl Read + Send + 'static, sender: Sender<String>) -> JoinHandle<()> { +fn track_output( + output: impl Read + Send + 'static, + sender: flume::Sender<String>, +) -> JoinHandle<()> { let reader = BufReader::new( DecodeReaderBytesBuilder::new() .encoding(Some(encoding_rs::UTF_8)) @@ -264,3 +175,11 @@ fn track_output(output: impl Read + Send + 'static, sender: Sender<String>) -> J } }) } + +fn replace_placeholder(arg: &str, file: &Path) -> String { + if arg.starts_with('"') || arg.ends_with('"') { + arg.to_string() + } else { + arg.replace("%f", &file.to_string_lossy()) + } +} diff --git a/support/texlab/src/features/build/progress.rs b/support/texlab/src/features/build/progress.rs new file mode 100644 index 0000000000..6f235bebd6 --- /dev/null +++ b/support/texlab/src/features/build/progress.rs @@ -0,0 +1,54 @@ +use std::sync::atomic::{AtomicI32, Ordering}; + +use anyhow::Result; +use lsp_types::{ + notification::Progress, request::WorkDoneProgressCreate, NumberOrString, ProgressParams, + ProgressParamsValue, Url, WorkDoneProgress, WorkDoneProgressBegin, + WorkDoneProgressCreateParams, WorkDoneProgressEnd, +}; + +use crate::client::LspClient; + +static NEXT_TOKEN: AtomicI32 = AtomicI32::new(1); + +pub struct Reporter<'a> { + client: &'a LspClient, + token: i32, +} + +impl<'a> Reporter<'a> { + pub fn new(client: &'a LspClient) -> Self { + let token = NEXT_TOKEN.fetch_add(1, Ordering::SeqCst); + Self { client, token } + } + + pub fn start(&self, uri: &Url) -> Result<()> { + self.client + .send_request::<WorkDoneProgressCreate>(WorkDoneProgressCreateParams { + token: NumberOrString::Number(self.token), + })?; + + self.client.send_notification::<Progress>(ProgressParams { + token: NumberOrString::Number(self.token), + value: ProgressParamsValue::WorkDone(WorkDoneProgress::Begin(WorkDoneProgressBegin { + title: "Building".to_string(), + message: Some(uri.as_str().to_string()), + cancellable: Some(false), + percentage: None, + })), + })?; + + Ok(()) + } +} + +impl<'a> Drop for Reporter<'a> { + fn drop(&mut self) { + let _ = self.client.send_notification::<Progress>(ProgressParams { + token: NumberOrString::Number(self.token), + value: ProgressParamsValue::WorkDone(WorkDoneProgress::End(WorkDoneProgressEnd { + message: None, + })), + }); + } +} diff --git a/support/texlab/src/features/completion.rs b/support/texlab/src/features/completion.rs index 3009b437e7..949b5552e5 100644 --- a/support/texlab/src/features/completion.rs +++ b/support/texlab/src/features/completion.rs @@ -1,6 +1,7 @@ mod acronym_ref; mod argument; -mod begin_command; +mod begin_snippet; +pub mod builder; mod citation; mod color; mod color_model; @@ -14,584 +15,36 @@ mod include; mod label; mod theorem; mod tikz_library; -mod types; mod user_command; mod user_environment; -mod util; -use std::borrow::Cow; +use lsp_types::{CompletionList, Position, Url}; -use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; -use itertools::Itertools; -use lsp_types::{ - CompletionItem, CompletionList, CompletionParams, CompletionTextEdit, Documentation, - InsertTextFormat, MarkupContent, MarkupKind, TextEdit, -}; -use rowan::{ast::AstNode, TextSize}; -use rustc_hash::FxHashSet; - -use crate::{ - syntax::{ - bibtex::{self}, - latex, - }, - LineIndexExt, -}; - -use self::{ - acronym_ref::complete_acronyms, - argument::complete_arguments, - begin_command::complete_begin_command, - citation::complete_citations, - color::complete_colors, - color_model::complete_color_models, - component_command::complete_component_commands, - component_environment::complete_component_environments, - entry_type::complete_entry_types, - field::complete_fields, - glossary_ref::complete_glossary_entries, - import::complete_imports, - include::complete_includes, - label::complete_labels, - theorem::complete_theorem_environments, - tikz_library::complete_tikz_libraries, - types::{InternalCompletionItem, InternalCompletionItemData}, - user_command::complete_user_commands, - user_environment::complete_user_environments, - util::{adjust_kind, component_detail, image_documentation}, -}; - -pub use self::types::CompletionItemData; - -use super::{ - cursor::{Cursor, CursorContext}, - lsp_kinds::Structure, - FeatureRequest, -}; +use crate::{features::completion::builder::CompletionBuilder, util::cursor::CursorContext, Db}; pub const COMPLETION_LIMIT: usize = 50; -#[must_use] -pub fn complete(request: FeatureRequest<CompletionParams>) -> Option<CompletionList> { - let mut items = Vec::new(); - let context = CursorContext::new(request); +pub fn complete(db: &dyn Db, uri: &Url, position: Position) -> Option<CompletionList> { + let context = CursorContext::new(db, uri, position, ())?; + let mut builder = CompletionBuilder::new(&context); log::debug!("[Completion] Cursor: {:?}", context.cursor); - complete_entry_types(&context, &mut items); - complete_fields(&context, &mut items); - complete_arguments(&context, &mut items); - complete_citations(&context, &mut items); - complete_imports(&context, &mut items); - complete_colors(&context, &mut items); - complete_color_models(&context, &mut items); - complete_acronyms(&context, &mut items); - complete_glossary_entries(&context, &mut items); - complete_includes(&context, &mut items); - complete_labels(&context, &mut items); - complete_tikz_libraries(&context, &mut items); - complete_component_environments(&context, &mut items); - complete_theorem_environments(&context, &mut items); - complete_user_environments(&context, &mut items); - complete_begin_command(&context, &mut items); - complete_component_commands(&context, &mut items); - complete_user_commands(&context, &mut items); - - let mut items = dedup(items); - preselect(&context, &mut items); - score(&context, &mut items); - - items.sort_by(|a, b| { - a.preselect - .cmp(&b.preselect) - .reverse() - .then_with(|| a.score.cmp(&b.score).reverse()) - .then_with(|| a.data.label().cmp(b.data.label())) - }); - - let items: Vec<_> = items - .into_iter() - .take(COMPLETION_LIMIT) - .filter(|item| item.score.is_some()) - .map(|item| convert_internal_items(&context, item)) - .enumerate() - .map(|(i, item)| append_sort_text(item, i)) - .collect(); - - let is_incomplete = if context - .request - .workspace - .environment - .client_info - .as_ref() - .as_ref() - .map_or(false, |info| info.name.as_str() == "Visual Studio Code") - { - true - } else { - items.len() >= COMPLETION_LIMIT - }; - - Some(CompletionList { - is_incomplete, - items, - }) -} - -fn dedup(items: Vec<InternalCompletionItem>) -> Vec<InternalCompletionItem> { - let mut labels = FxHashSet::default(); - let mut insert = vec![false; items.len()]; - for (i, item) in items.iter().enumerate() { - insert[i] = labels.insert(item.data.label()); - } - items - .into_iter() - .enumerate() - .filter(|(i, _)| insert[*i]) - .map(|(_, item)| item) - .collect() -} - -fn score(context: &CursorContext<CompletionParams>, items: &mut Vec<InternalCompletionItem>) { - let pattern: Cow<str> = match &context.cursor { - Cursor::Latex(token) if token.kind().is_command_name() => { - if token.text_range().start() + TextSize::from(1) == context.offset { - // Handle cases similar to this one correctly: - // $\|$ % (| is the cursor) - "\\".into() - } else { - token.text().trim_end().into() - } - } - Cursor::Latex(token) if token.kind() == latex::WORD => { - if let Some(key) = token.parent().and_then(latex::Key::cast) { - key.words() - .take_while(|word| word.text_range() != token.text_range()) - .chain(std::iter::once(token.clone())) - .filter(|word| word.text_range().start() < context.offset) - .join(" ") - .into() - } else { - token.text().into() - } - } - Cursor::Bibtex(token) - if matches!( - token.kind(), - bibtex::TYPE - | bibtex::NAME - | bibtex::WORD - | bibtex::COMMAND_NAME - | bibtex::ACCENT_NAME - ) => - { - token.text().into() - } - Cursor::Latex(_) | Cursor::Bibtex(_) | Cursor::Nothing => "".into(), - }; - - let file_pattern = pattern.split('/').last().unwrap(); - let matcher = SkimMatcherV2::default().ignore_case(); - for item in items { - item.score = match &item.data { - InternalCompletionItemData::EntryType { ty } => { - matcher.fuzzy_match(&ty.name, &pattern[1..]) - } - InternalCompletionItemData::Field { field } => { - matcher.fuzzy_match(&field.name, &pattern) - } - InternalCompletionItemData::Argument { name, .. } => { - matcher.fuzzy_match(name, &pattern) - } - InternalCompletionItemData::BeginCommand => matcher.fuzzy_match("begin", &pattern[1..]), - InternalCompletionItemData::Citation { key, .. } => matcher.fuzzy_match(key, &pattern), - InternalCompletionItemData::ComponentCommand { name, .. } => { - matcher.fuzzy_match(name, &pattern[1..]) - } - InternalCompletionItemData::ComponentEnvironment { name, .. } => { - matcher.fuzzy_match(name, &pattern) - } - InternalCompletionItemData::Class { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::Package { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::Color { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::ColorModel { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::Acronym { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::GlossaryEntry { name } => { - matcher.fuzzy_match(name, &pattern) - } - InternalCompletionItemData::File { name } => matcher.fuzzy_match(name, file_pattern), - InternalCompletionItemData::Directory { name } => { - matcher.fuzzy_match(name, file_pattern) - } - InternalCompletionItemData::Label { name, .. } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::UserCommand { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::UserEnvironment { name } => { - matcher.fuzzy_match(name, &pattern) - } - InternalCompletionItemData::PgfLibrary { name } => matcher.fuzzy_match(name, &pattern), - InternalCompletionItemData::TikzLibrary { name } => matcher.fuzzy_match(name, &pattern), - }; - } -} - -fn preselect( - context: &CursorContext<CompletionParams>, - items: &mut [InternalCompletionItem], -) -> Option<()> { - let name = context.cursor.as_latex()?; - let group = latex::CurlyGroupWord::cast(name.parent()?)?; - let end = latex::End::cast(group.syntax().parent()?)?; - let environment = latex::Environment::cast(end.syntax().parent()?)?; - let name = environment.begin()?.name()?.key()?.to_string(); - - for item in items { - if item.data.label() == name { - item.preselect = true; - } - } - Some(()) -} - -fn convert_internal_items( - context: &CursorContext<CompletionParams>, - item: InternalCompletionItem, -) -> CompletionItem { - let range = context - .request - .main_document() - .line_index - .line_col_lsp_range(item.range); - - let mut new_item = match item.data { - InternalCompletionItemData::EntryType { ty } => { - let text_edit = TextEdit::new(range, (&ty.name).into()); - let kind = Structure::Entry(ty.category).completion_kind(); - CompletionItem { - label: (&ty.name).into(), - kind: Some(adjust_kind(&context.request, kind)), - documentation: ty.documentation.as_ref().map(|doc| { - Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: doc.into(), - }) - }), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - data: Some(serde_json::to_value(CompletionItemData::EntryType).unwrap()), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Field { field } => { - let text_edit = TextEdit::new(range, (&field.name).into()); - CompletionItem { - label: (&field.name).into(), - kind: Some(adjust_kind( - &context.request, - Structure::Field.completion_kind(), - )), - documentation: Some(Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: (&field.documentation).into(), - })), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - data: Some(serde_json::to_value(CompletionItemData::FieldName).unwrap()), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Argument { name, image } => { - let text_edit = TextEdit::new(range, name.into()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::Argument.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Argument).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - documentation: image - .and_then(|image| image_documentation(&context.request, name, image)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::BeginCommand => { - if context - .request - .workspace - .environment - .client_capabilities - .text_document - .as_ref() - .and_then(|cap| cap.completion.as_ref()) - .and_then(|cap| cap.completion_item.as_ref()) - .and_then(|cap| cap.snippet_support) - == Some(true) - { - let text_edit = TextEdit::new(range, "begin{$1}\n\t$0\n\\end{$1}".into()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Snippet.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::CommandSnippet).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - insert_text_format: Some(InsertTextFormat::SNIPPET), - ..CompletionItem::new_simple("begin".into(), component_detail(&[])) - } - } else { - let text_edit = TextEdit::new(range, "begin".to_string()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Command.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Command).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::new_simple("begin".to_string(), component_detail(&[])) - } - } - } - InternalCompletionItemData::Citation { uri, key, text, ty } => { - let text_edit = TextEdit::new(range, key.to_string()); - CompletionItem { - label: key.to_string(), - kind: Some(adjust_kind(&context.request, ty.completion_kind())), - filter_text: Some(text.clone()), - sort_text: Some(text), - data: Some( - serde_json::to_value(CompletionItemData::Citation { - uri: uri.as_ref().clone(), - key: key.into(), - }) - .unwrap(), - ), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::ComponentCommand { - name, - image, - glyph, - file_names, - } => { - let detail = glyph.map_or_else( - || component_detail(file_names), - |glyph| format!("{}, {}", glyph, component_detail(file_names)), - ); - let documentation = - image.and_then(|img| image_documentation(&context.request, name, img)); - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Command.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Command).unwrap()), - documentation, - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::new_simple(name.to_string(), detail) - } - } - InternalCompletionItemData::ComponentEnvironment { name, file_names } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Environment.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Environment).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::new_simple(name.to_string(), component_detail(file_names)) - } - } - InternalCompletionItemData::Class { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::Class.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Class).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Package { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::Package.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Package).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Color { name } => { - let text_edit = TextEdit::new(range, name.into()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::Color.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Color).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::ColorModel { name } => { - let text_edit = TextEdit::new(range, name.into()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::ColorModel.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::ColorModel).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Acronym { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name, - kind: Some(adjust_kind( - &context.request, - Structure::GlossaryEntry.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Acronym).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::GlossaryEntry { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name, - kind: Some(adjust_kind( - &context.request, - Structure::GlossaryEntry.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::GlossaryEntry).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::File { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::File.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::File).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Directory { name } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::Folder.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Folder).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::Label { - name, - kind, - header, - footer, - text, - } => { - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - label: name, - kind: Some(adjust_kind(&context.request, kind.completion_kind())), - detail: header, - documentation: footer.map(Documentation::String), - sort_text: Some(text.clone()), - filter_text: Some(text), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - data: Some(serde_json::to_value(CompletionItemData::Label).unwrap()), - ..CompletionItem::default() - } - } - InternalCompletionItemData::UserCommand { name } => { - let detail = "user-defined".into(); - let name = &name[1..]; - let text_edit = TextEdit::new(range, name.to_string()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Command.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Command).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::new_simple(name.into(), detail) - } - } - InternalCompletionItemData::UserEnvironment { name } => { - let detail = "user-defined".into(); - let text_edit = TextEdit::new(range, name.clone()); - CompletionItem { - kind: Some(adjust_kind( - &context.request, - Structure::Environment.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::Environment).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::new_simple(name, detail) - } - } - InternalCompletionItemData::PgfLibrary { name } => { - let text_edit = TextEdit::new(range, name.into()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::PgfLibrary.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::PgfLibrary).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - InternalCompletionItemData::TikzLibrary { name } => { - let text_edit = TextEdit::new(range, name.into()); - CompletionItem { - label: name.into(), - kind: Some(adjust_kind( - &context.request, - Structure::TikzLibrary.completion_kind(), - )), - data: Some(serde_json::to_value(CompletionItemData::TikzLibrary).unwrap()), - text_edit: Some(CompletionTextEdit::Edit(text_edit)), - ..CompletionItem::default() - } - } - }; - new_item.preselect = Some(item.preselect); - new_item -} - -fn append_sort_text(mut item: CompletionItem, index: usize) -> CompletionItem { - let sort_prefix = format!("{:0>2}", index); - match &item.sort_text { - Some(sort_text) => { - item.sort_text = Some(format!("{} {}", sort_prefix, sort_text)); - } - None => { - item.sort_text = Some(sort_prefix); - } - }; - item + entry_type::complete(&context, &mut builder); + field::complete(&context, &mut builder); + argument::complete(&context, &mut builder); + citation::complete(&context, &mut builder); + import::complete(&context, &mut builder); + color::complete(&context, &mut builder); + color_model::complete(&context, &mut builder); + acronym_ref::complete(&context, &mut builder); + glossary_ref::complete(&context, &mut builder); + include::complete(&context, &mut builder); + label::complete(&context, &mut builder); + tikz_library::complete(&context, &mut builder); + component_environment::complete(&context, &mut builder); + theorem::complete(&context, &mut builder); + user_environment::complete(&context, &mut builder); + begin_snippet::complete(&context, &mut builder); + component_command::complete(&context, &mut builder); + user_command::complete(&context, &mut builder); + Some(builder.finish()) } diff --git a/support/texlab/src/features/completion/acronym_ref.rs b/support/texlab/src/features/completion/acronym_ref.rs index 84cbd8bc23..be7725fa2f 100644 --- a/support/texlab/src/features/completion/acronym_ref.rs +++ b/support/texlab/src/features/completion/acronym_ref.rs @@ -1,32 +1,29 @@ -use lsp_types::CompletionParams; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::latex}; +use crate::{syntax::latex, util::cursor::CursorContext}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_acronyms<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range, group) = context.find_curly_group_word()?; latex::AcronymReference::cast(group.syntax().parent()?)?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for name in latex::SyntaxNode::new_root(data.green.clone()) + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { + for name in data + .root(context.db) .descendants() .filter_map(latex::AcronymDefinition::cast) .filter_map(|node| node.name()) .filter_map(|name| name.key()) - .map(|name| name.to_string()) { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::Acronym { name }, - )); + builder.glossary_entry(range, name.to_string()); } } } + Some(()) } diff --git a/support/texlab/src/features/completion/argument.rs b/support/texlab/src/features/completion/argument.rs index 3ba28f9dea..10b377cb0e 100644 --- a/support/texlab/src/features/completion/argument.rs +++ b/support/texlab/src/features/completion/argument.rs @@ -1,15 +1,17 @@ -use lsp_types::CompletionParams; use rowan::{ast::AstNode, TextRange}; -use crate::{component_db::COMPONENT_DATABASE, features::cursor::CursorContext, syntax::latex}; +use crate::{ + syntax::latex, + util::{components::COMPONENT_DATABASE, cursor::CursorContext}, +}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_arguments<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { - let token = context.cursor.as_latex()?; + let token = context.cursor.as_tex()?; let range = if token.kind() == latex::WORD { token.text_range() @@ -37,7 +39,7 @@ pub fn complete_arguments<'a>( let command_name = command.name()?; let command_name = &command_name.text()[1..]; - for component in COMPONENT_DATABASE.linked_components(&context.request.workspace) { + for component in COMPONENT_DATABASE.linked_components(context.db, context.document) { for component_command in component .commands .iter() @@ -50,14 +52,7 @@ pub fn complete_arguments<'a>( .filter(|(i, _)| *i == index) { for arg in ¶m.0 { - let item = InternalCompletionItem::new( - range, - InternalCompletionItemData::Argument { - name: &arg.name, - image: arg.image.as_deref(), - }, - ); - items.push(item); + builder.generic_argument(range, &arg.name, arg.image.as_deref()); } } } diff --git a/support/texlab/src/features/completion/begin_command.rs b/support/texlab/src/features/completion/begin_command.rs deleted file mode 100644 index 699b06c067..0000000000 --- a/support/texlab/src/features/completion/begin_command.rs +++ /dev/null @@ -1,18 +0,0 @@ -use lsp_types::CompletionParams; - -use crate::features::cursor::CursorContext; - -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_begin_command( - context: &CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem>, -) -> Option<()> { - let range = context.cursor.command_range(context.offset)?; - - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::BeginCommand, - )); - Some(()) -} diff --git a/support/texlab/src/features/completion/begin_snippet.rs b/support/texlab/src/features/completion/begin_snippet.rs new file mode 100644 index 0000000000..06be4faf13 --- /dev/null +++ b/support/texlab/src/features/completion/begin_snippet.rs @@ -0,0 +1,9 @@ +use crate::util::cursor::CursorContext; + +use super::builder::CompletionBuilder; + +pub fn complete(context: &CursorContext, builder: &mut CompletionBuilder) -> Option<()> { + let range = context.cursor.command_range(context.offset)?; + builder.begin_snippet(range); + Some(()) +} diff --git a/support/texlab/src/features/completion/builder.rs b/support/texlab/src/features/completion/builder.rs new file mode 100644 index 0000000000..f8ea4c5d15 --- /dev/null +++ b/support/texlab/src/features/completion/builder.rs @@ -0,0 +1,784 @@ +use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; +use itertools::Itertools; +use lsp_types::{ + CompletionItem, CompletionItemKind, CompletionList, CompletionTextEdit, Documentation, + InsertTextFormat, MarkupContent, MarkupKind, TextEdit, Url, +}; +use once_cell::sync::Lazy; +use regex::Regex; +use rowan::{ast::AstNode, TextRange, TextSize}; +use serde::{Deserialize, Serialize}; +use smol_str::SmolStr; + +use crate::{ + db::{Document, Workspace}, + syntax::{ + bibtex::{self, HasName, HasType}, + latex, + }, + util::{ + capabilities::ClientCapabilitiesExt, + cursor::{Cursor, CursorContext}, + lang_data::{BibtexEntryTypeCategory, BibtexEntryTypeDoc, BibtexFieldDoc, LANGUAGE_DATA}, + line_index_ext::LineIndexExt, + lsp_enums::Structure, + }, +}; + +use super::COMPLETION_LIMIT; + +pub struct CompletionBuilder<'db> { + context: &'db CursorContext<'db>, + items: Vec<Item<'db>>, + matcher: SkimMatcherV2, + text_pattern: String, + file_pattern: String, + preselect: Option<String>, + snippets: bool, + markdown: bool, + item_kinds: &'db [CompletionItemKind], +} + +impl<'db> CompletionBuilder<'db> { + pub fn new(context: &'db CursorContext) -> Self { + let items = Vec::new(); + let matcher = SkimMatcherV2::default().ignore_case(); + let text_pattern = match &context.cursor { + Cursor::Tex(token) if token.kind().is_command_name() => { + if token.text_range().start() + TextSize::from(1) == context.offset { + // Handle cases similar to this one correctly: + // $\|$ % (| is the cursor) + String::from("\\") + } else { + token.text().trim_end().into() + } + } + Cursor::Tex(token) if token.kind() == latex::WORD => { + match token.parent().and_then(latex::Key::cast) { + Some(key) => key + .words() + .take_while(|word| word.text_range() != token.text_range()) + .chain(std::iter::once(token.clone())) + .filter(|word| word.text_range().start() < context.offset) + .join(" ") + .into(), + None => token.text().into(), + } + } + Cursor::Bib(token) + if matches!( + token.kind(), + bibtex::TYPE + | bibtex::NAME + | bibtex::WORD + | bibtex::COMMAND_NAME + | bibtex::ACCENT_NAME + ) => + { + token.text().into() + } + Cursor::Tex(_) | Cursor::Bib(_) | Cursor::Nothing => "".into(), + }; + + let file_pattern = text_pattern.split('/').last().unwrap().to_string(); + + let preselect = context + .cursor + .as_tex() + .and_then(|name| name.parent()) + .and_then(latex::CurlyGroupWord::cast) + .and_then(|group| group.syntax().parent()) + .and_then(|end| end.parent()) + .and_then(latex::Environment::cast) + .and_then(|env| env.begin()) + .and_then(|begin| begin.name()) + .and_then(|name| name.key()) + .map(|name| name.to_string()); + + let client_capabilities = context.workspace.client_capabilities(context.db); + let snippets = client_capabilities.has_snippet_support(); + let markdown = client_capabilities.has_completion_markdown_support(); + let item_kinds = client_capabilities + .text_document + .as_ref() + .and_then(|cap| cap.completion.as_ref()) + .and_then(|cap| cap.completion_item_kind.as_ref()) + .and_then(|cap| cap.value_set.as_deref()) + .unwrap_or_default(); + + Self { + context, + items, + matcher, + text_pattern, + file_pattern, + preselect, + snippets, + markdown, + item_kinds, + } + } + + pub fn glossary_entry(&mut self, range: TextRange, name: String) -> Option<()> { + let score = self.matcher.fuzzy_match(&name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::GlossaryEntry { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn generic_argument( + &mut self, + range: TextRange, + name: &'db str, + image: Option<&'db str>, + ) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Argument { name, image }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn begin_snippet(&mut self, range: TextRange) -> Option<()> { + let capabilities = Workspace::get(self.context.db).client_capabilities(self.context.db); + if capabilities.has_snippet_support() { + let score = self.matcher.fuzzy_match("begin", &self.text_pattern[1..])?; + self.items.push(Item { + range, + data: Data::BeginSnippet, + preselect: false, + score, + }); + } + + Some(()) + } + + pub fn citation( + &mut self, + range: TextRange, + document: Document, + entry: &bibtex::Entry, + ) -> Option<()> { + let key = entry.name_token()?.to_string(); + + let category = LANGUAGE_DATA + .find_entry_type(&entry.type_token()?.text()[1..]) + .map_or(BibtexEntryTypeCategory::Misc, |ty| ty.category); + + let code = entry.syntax().text().to_string(); + let filter_text = format!( + "{} {}", + key, + WHITESPACE_REGEX + .replace_all( + &code + .replace('{', " ") + .replace('}', " ") + .replace(',', " ") + .replace('=', " "), + " " + ) + .trim(), + ); + + let score = self.matcher.fuzzy_match(&filter_text, &self.text_pattern)?; + + let data = Data::Citation { + document, + key, + filter_text, + category, + }; + + self.items.push(Item { + range, + data, + preselect: false, + score, + }); + + Some(()) + } + + pub fn color_model(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::ColorModel { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn color(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Color { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn component_command( + &mut self, + range: TextRange, + name: &'db str, + image: Option<&'db str>, + glyph: Option<&'db str>, + file_names: &'db [SmolStr], + ) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern[1..])?; + let data = Data::ComponentCommand { + name, + image, + glyph, + file_names, + }; + + self.items.push(Item { + range, + data, + preselect: false, + score, + }); + + Some(()) + } + + pub fn component_environment( + &mut self, + range: TextRange, + name: &'db str, + file_names: &'db [SmolStr], + ) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::ComponentEnvironment { name, file_names }, + preselect: Some(name) == self.preselect.as_deref(), + score, + }); + + Some(()) + } + + pub fn entry_type( + &mut self, + range: TextRange, + entry_type: &'db BibtexEntryTypeDoc, + ) -> Option<()> { + let score = self + .matcher + .fuzzy_match(&entry_type.name, &self.text_pattern[1..])?; + + self.items.push(Item { + range, + data: Data::EntryType { entry_type }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn field(&mut self, range: TextRange, field: &'db BibtexFieldDoc) -> Option<()> { + let score = self.matcher.fuzzy_match(&field.name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Field { field }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn class(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Class { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn package(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Package { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn file(&mut self, range: TextRange, name: String) -> Option<()> { + let score = self.matcher.fuzzy_match(&name, &self.file_pattern)?; + self.items.push(Item { + range, + data: Data::File { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn directory(&mut self, range: TextRange, name: String) -> Option<()> { + let score = self.matcher.fuzzy_match(&name, &self.file_pattern)?; + self.items.push(Item { + range, + data: Data::Directory { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn label( + &mut self, + range: TextRange, + name: &'db str, + kind: Structure, + header: Option<String>, + footer: Option<String>, + text: String, + ) -> Option<()> { + let score = self.matcher.fuzzy_match(&text, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::Label { + name, + kind, + header, + footer, + text, + }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn tikz_library(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::TikzLibrary { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn user_command(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern[1..])?; + self.items.push(Item { + range, + data: Data::UserCommand { name }, + preselect: false, + score, + }); + + Some(()) + } + + pub fn user_environment(&mut self, range: TextRange, name: &'db str) -> Option<()> { + let score = self.matcher.fuzzy_match(name, &self.text_pattern)?; + self.items.push(Item { + range, + data: Data::UserEnvironment { name }, + preselect: Some(name) == self.preselect.as_deref(), + score, + }); + + Some(()) + } + + pub fn finish(mut self) -> CompletionList { + let mut list = CompletionList::default(); + list.items = std::mem::take(&mut self.items) + .into_iter() + .sorted_by(|a, b| { + b.preselect + .cmp(&a.preselect) + .then_with(|| b.score.cmp(&a.score)) + .then_with(|| a.data.label().cmp(b.data.label())) + }) + .dedup_by(|a, b| a.data.label() == b.data.label()) + .take(COMPLETION_LIMIT) + .enumerate() + .map(|(i, item)| self.convert_item(item, i)) + .collect(); + + list.is_incomplete = if self + .context + .workspace + .client_info(self.context.db) + .as_ref() + .map_or(false, |client| client.name.as_str() == "Visual Studio Code") + { + true + } else { + list.items.len() >= COMPLETION_LIMIT + }; + + list + } + + fn convert_item(&self, item: Item, index: usize) -> CompletionItem { + let range = self.context.line_index.line_col_lsp_range(item.range); + let preselect = item.preselect; + let mut item = match item.data { + Data::EntryType { entry_type } => CompletionItem { + label: entry_type.name.clone(), + kind: Some(Structure::Entry(entry_type.category).completion_kind()), + documentation: entry_type.documentation.clone().map(|value| { + let kind = MarkupKind::Markdown; + Documentation::MarkupContent(MarkupContent { kind, value }) + }), + text_edit: Some(TextEdit::new(range, entry_type.name.clone()).into()), + ..CompletionItem::default() + }, + Data::Field { field } => CompletionItem { + label: field.name.clone(), + kind: Some(Structure::Field.completion_kind()), + documentation: Some(Documentation::MarkupContent(MarkupContent { + kind: MarkupKind::Markdown, + value: field.documentation.clone(), + })), + text_edit: Some(TextEdit::new(range, field.name.clone()).into()), + ..CompletionItem::default() + }, + Data::Argument { name, image } => { + let text_edit = TextEdit::new(range, String::from(name)); + CompletionItem { + label: name.into(), + kind: Some(Structure::Argument.completion_kind()), + text_edit: Some(CompletionTextEdit::Edit(text_edit)), + documentation: image.and_then(|base64| self.inline_image(name, base64)), + ..CompletionItem::default() + } + } + Data::BeginSnippet => { + if self.snippets { + CompletionItem { + kind: Some(Structure::Snippet.completion_kind()), + text_edit: Some( + TextEdit::new(range, "begin{$1}\n\t\n\\end{$1}".into()).into(), + ), + insert_text_format: Some(InsertTextFormat::SNIPPET), + ..CompletionItem::new_simple("begin".into(), self.component_detail(&[])) + } + } else { + CompletionItem { + kind: Some(Structure::Command.completion_kind()), + text_edit: Some(TextEdit::new(range, "begin".to_string()).into()), + ..CompletionItem::new_simple("begin".into(), self.component_detail(&[])) + } + } + } + Data::Citation { + document, + key, + filter_text, + category, + } => CompletionItem { + label: key.clone(), + kind: Some(Structure::Entry(category).completion_kind()), + filter_text: Some(filter_text.clone()), + sort_text: Some(filter_text), + data: Some( + serde_json::to_value(CompletionItemData::Citation { + uri: document + .location(self.context.db) + .uri(self.context.db) + .clone(), + key: key.clone(), + }) + .unwrap(), + ), + text_edit: Some(TextEdit::new(range, key).into()), + ..CompletionItem::default() + }, + Data::ComponentCommand { + name, + image, + glyph, + file_names, + } => CompletionItem { + label: name.into(), + detail: Some(glyph.map_or_else( + || self.component_detail(file_names), + |glyph| format!("{}, {}", glyph, self.component_detail(file_names)), + )), + kind: Some(Structure::Command.completion_kind()), + documentation: image.and_then(|base64| self.inline_image(name, base64)), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::ComponentEnvironment { name, file_names } => CompletionItem { + kind: Some(Structure::Environment.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::new_simple(name.into(), self.component_detail(file_names)) + }, + Data::Class { name } => CompletionItem { + label: name.into(), + kind: Some(Structure::Class.completion_kind()), + data: Some(serde_json::to_value(CompletionItemData::Package).unwrap()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::Package { name } => CompletionItem { + label: name.into(), + kind: Some(Structure::Package.completion_kind()), + data: Some(serde_json::to_value(CompletionItemData::Class).unwrap()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::Color { name } => CompletionItem { + label: name.into(), + kind: Some(Structure::Color.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::ColorModel { name } => CompletionItem { + label: name.into(), + kind: Some(Structure::ColorModel.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::GlossaryEntry { name } => CompletionItem { + label: name.clone(), + kind: Some(Structure::GlossaryEntry.completion_kind()), + text_edit: Some(TextEdit::new(range, name).into()), + ..CompletionItem::default() + }, + Data::File { name } => CompletionItem { + label: name.clone(), + kind: Some(Structure::File.completion_kind()), + text_edit: Some(TextEdit::new(range, name).into()), + ..CompletionItem::default() + }, + Data::Directory { name } => CompletionItem { + label: name.clone(), + kind: Some(Structure::Folder.completion_kind()), + text_edit: Some(TextEdit::new(range, name).into()), + ..CompletionItem::default() + }, + Data::Label { + name, + kind, + header, + footer, + text, + } => CompletionItem { + label: name.into(), + kind: Some(kind.completion_kind()), + detail: header, + documentation: footer.map(Documentation::String), + sort_text: Some(text.clone()), + filter_text: Some(text), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + Data::UserCommand { name } => { + let detail = "user-defined".into(); + let name = &name[1..]; + CompletionItem { + kind: Some(Structure::Command.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::new_simple(name.into(), detail) + } + } + Data::UserEnvironment { name } => { + let detail = "user-defined".into(); + CompletionItem { + kind: Some(Structure::Environment.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::new_simple(name.into(), detail) + } + } + Data::TikzLibrary { name } => CompletionItem { + label: name.into(), + kind: Some(Structure::TikzLibrary.completion_kind()), + text_edit: Some(TextEdit::new(range, name.into()).into()), + ..CompletionItem::default() + }, + }; + + item.preselect = Some(preselect); + + if !self.item_kinds.contains(&item.kind.unwrap()) { + item.kind = Some(CompletionItemKind::TEXT); + } + + let sort_prefix = format!("{:0>2}", index); + match &item.sort_text { + Some(sort_text) => { + item.sort_text = Some(format!("{} {}", sort_prefix, sort_text)); + } + None => { + item.sort_text = Some(sort_prefix); + } + }; + + item + } + + fn inline_image(&self, name: &str, base64: &str) -> Option<Documentation> { + if self.markdown { + let kind = MarkupKind::Markdown; + let value = format!( + "![{}](data:image/png;base64,{}|width=48,height=48)", + name, base64 + ); + + Some(Documentation::MarkupContent(MarkupContent { kind, value })) + } else { + None + } + } + + fn component_detail(&self, file_names: &[SmolStr]) -> String { + if file_names.is_empty() { + "built-in".into() + } else { + file_names.join(", ") + } + } +} + +#[derive(Debug, Clone)] +struct Item<'db> { + range: TextRange, + data: Data<'db>, + preselect: bool, + score: i32, +} + +#[derive(Debug, Clone)] +enum Data<'db> { + EntryType { + entry_type: &'db BibtexEntryTypeDoc, + }, + Field { + field: &'db BibtexFieldDoc, + }, + Argument { + name: &'db str, + image: Option<&'db str>, + }, + BeginSnippet, + Citation { + document: Document, + key: String, + filter_text: String, + category: BibtexEntryTypeCategory, + }, + ComponentCommand { + name: &'db str, + image: Option<&'db str>, + glyph: Option<&'db str>, + file_names: &'db [SmolStr], + }, + ComponentEnvironment { + name: &'db str, + file_names: &'db [SmolStr], + }, + Class { + name: &'db str, + }, + Package { + name: &'db str, + }, + Color { + name: &'db str, + }, + ColorModel { + name: &'db str, + }, + GlossaryEntry { + name: String, + }, + File { + name: String, + }, + Directory { + name: String, + }, + Label { + name: &'db str, + kind: Structure, + header: Option<String>, + footer: Option<String>, + text: String, + }, + UserCommand { + name: &'db str, + }, + UserEnvironment { + name: &'db str, + }, + TikzLibrary { + name: &'db str, + }, +} + +impl<'db> Data<'db> { + pub fn label<'this: 'db>(&'this self) -> &'db str { + match self { + Self::EntryType { entry_type } => &entry_type.name, + Self::Field { field } => &field.name, + Self::Argument { name, .. } => name, + Self::BeginSnippet => "begin", + Self::Citation { key, .. } => key, + Self::ComponentCommand { name, .. } => name, + Self::ComponentEnvironment { name, .. } => name, + Self::Class { name } => name, + Self::Package { name } => name, + Self::Color { name } => name, + Self::ColorModel { name } => name, + Self::GlossaryEntry { name } => name, + Self::File { name } => name, + Self::Directory { name } => name, + Self::Label { name, .. } => name, + Self::UserCommand { name } => name, + Self::UserEnvironment { name } => name, + Self::TikzLibrary { name } => name, + } + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) enum CompletionItemData { + Package, + Class, + Citation { uri: Url, key: String }, +} + +static WHITESPACE_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new("\\s+").unwrap()); diff --git a/support/texlab/src/features/completion/citation.rs b/support/texlab/src/features/completion/citation.rs index e6436689d7..68d72717a7 100644 --- a/support/texlab/src/features/completion/citation.rs +++ b/support/texlab/src/features/completion/citation.rs @@ -1,26 +1,17 @@ -use std::sync::Arc; - -use lsp_types::CompletionParams; -use once_cell::sync::Lazy; -use regex::Regex; use rowan::{ast::AstNode, TextRange}; use crate::{ - features::{cursor::CursorContext, lsp_kinds::Structure}, - syntax::{ - bibtex::{self, HasName, HasType}, - latex, - }, - BibtexEntryTypeCategory, Document, LANGUAGE_DATA, + syntax::{bibtex, latex}, + util::cursor::CursorContext, }; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_citations<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { - let token = context.cursor.as_latex()?; + let token = context.cursor.as_tex()?; let range = if token.kind() == latex::WORD { latex::Key::cast(token.parent()?) @@ -36,15 +27,14 @@ pub fn complete_citations<'a>( }; check_citation(context).or_else(|| check_acronym(context))?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_bibtex() { - for entry in bibtex::SyntaxNode::new_root(data.green.clone()) + for document in context.related() { + if let Some(data) = document.parse(context.db).as_bib() { + for entry in data + .root(context.db) .children() .filter_map(bibtex::Entry::cast) { - if let Some(item) = make_item(document, &entry, range) { - items.push(item); - } + builder.citation(range, document, &entry); } } } @@ -52,14 +42,14 @@ pub fn complete_citations<'a>( Some(()) } -fn check_citation(context: &CursorContext<CompletionParams>) -> Option<()> { +fn check_citation(context: &CursorContext) -> Option<()> { let (_, _, group) = context.find_curly_group_word_list()?; latex::Citation::cast(group.syntax().parent()?)?; Some(()) } -fn check_acronym(context: &CursorContext<CompletionParams>) -> Option<()> { - let token = context.cursor.as_latex()?; +fn check_acronym(context: &CursorContext) -> Option<()> { + let token = context.cursor.as_tex()?; let pair = token .parent_ancestors() @@ -71,45 +61,3 @@ fn check_acronym(context: &CursorContext<CompletionParams>) -> Option<()> { latex::AcronymDeclaration::cast(pair.syntax().parent()?.parent()?.parent()?)?; Some(()) } - -fn make_item<'a>( - document: &'a Document, - entry: &bibtex::Entry, - range: TextRange, -) -> Option<InternalCompletionItem<'a>> { - let key = entry.name_token()?.to_string(); - let ty = LANGUAGE_DATA - .find_entry_type(&entry.type_token()?.text()[1..]) - .map_or_else( - || Structure::Entry(BibtexEntryTypeCategory::Misc), - |ty| Structure::Entry(ty.category), - ); - - let entry_code = entry.syntax().text().to_string(); - let text = format!( - "{} {}", - key, - WHITESPACE_REGEX - .replace_all( - &entry_code - .replace('{', " ") - .replace('}', " ") - .replace(',', " ") - .replace('=', " "), - " " - ) - .trim(), - ); - - Some(InternalCompletionItem::new( - range, - InternalCompletionItemData::Citation { - uri: Arc::clone(&document.uri), - key, - text, - ty, - }, - )) -} - -static WHITESPACE_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new("\\s+").unwrap()); diff --git a/support/texlab/src/features/completion/color.rs b/support/texlab/src/features/completion/color.rs index a9a385c3c9..cce6517cb4 100644 --- a/support/texlab/src/features/completion/color.rs +++ b/support/texlab/src/features/completion/color.rs @@ -1,22 +1,21 @@ -use lsp_types::CompletionParams; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::latex, LANGUAGE_DATA}; +use crate::{ + syntax::latex, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, +}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_colors<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range, group) = context.find_curly_group_word()?; latex::ColorReference::cast(group.syntax().parent()?)?; for name in &LANGUAGE_DATA.colors { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::Color { name }, - )); + builder.color(range, name); } Some(()) diff --git a/support/texlab/src/features/completion/color_model.rs b/support/texlab/src/features/completion/color_model.rs index cd582d0031..af700a96fb 100644 --- a/support/texlab/src/features/completion/color_model.rs +++ b/support/texlab/src/features/completion/color_model.rs @@ -1,29 +1,25 @@ -use lsp_types::CompletionParams; use rowan::{ast::AstNode, TextRange}; -use crate::{features::cursor::CursorContext, syntax::latex}; +use crate::{syntax::latex, util::cursor::CursorContext}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; const MODEL_NAMES: &[&str] = &["gray", "rgb", "RGB", "HTML", "cmyk"]; -pub fn complete_color_models<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let range = check_color_definition(context).or_else(|| check_color_definition_set(context))?; for name in MODEL_NAMES { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::ColorModel { name }, - )); + builder.color_model(range, name); } Some(()) } -fn check_color_definition(context: &CursorContext<CompletionParams>) -> Option<TextRange> { +fn check_color_definition(context: &CursorContext) -> Option<TextRange> { let (_, range, group) = context.find_curly_group_word()?; let definition = latex::ColorDefinition::cast(group.syntax().parent()?)?; @@ -33,7 +29,7 @@ fn check_color_definition(context: &CursorContext<CompletionParams>) -> Option<T Some(range) } -fn check_color_definition_set(context: &CursorContext<CompletionParams>) -> Option<TextRange> { +fn check_color_definition_set(context: &CursorContext) -> Option<TextRange> { let (_, range, group) = context.find_curly_group_word_list()?; let definition = latex::ColorSetDefinition::cast(group.syntax().parent()?)?; definition diff --git a/support/texlab/src/features/completion/component_command.rs b/support/texlab/src/features/completion/component_command.rs index 097b28633f..20cef73848 100644 --- a/support/texlab/src/features/completion/component_command.rs +++ b/support/texlab/src/features/completion/component_command.rs @@ -1,26 +1,22 @@ -use lsp_types::CompletionParams; +use crate::util::{components::COMPONENT_DATABASE, cursor::CursorContext}; -use crate::{component_db::COMPONENT_DATABASE, features::cursor::CursorContext}; +use super::builder::CompletionBuilder; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_component_commands<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let range = context.cursor.command_range(context.offset)?; - for component in COMPONENT_DATABASE.linked_components(&context.request.workspace) { + for component in COMPONENT_DATABASE.linked_components(context.db, context.document) { for command in &component.commands { - items.push(InternalCompletionItem::new( + builder.component_command( range, - InternalCompletionItemData::ComponentCommand { - name: &command.name, - image: command.image.as_deref(), - glyph: command.glyph.as_deref(), - file_names: &component.file_names, - }, - )); + &command.name, + command.image.as_deref(), + command.glyph.as_deref(), + &component.file_names, + ); } } diff --git a/support/texlab/src/features/completion/component_environment.rs b/support/texlab/src/features/completion/component_environment.rs index a9478694bb..e58e319a46 100644 --- a/support/texlab/src/features/completion/component_environment.rs +++ b/support/texlab/src/features/completion/component_environment.rs @@ -1,24 +1,16 @@ -use lsp_types::CompletionParams; +use crate::util::{components::COMPONENT_DATABASE, cursor::CursorContext}; -use crate::{component_db::COMPONENT_DATABASE, features::cursor::CursorContext}; +use super::builder::CompletionBuilder; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_component_environments<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range) = context.find_environment_name()?; - for component in COMPONENT_DATABASE.linked_components(&context.request.workspace) { + for component in COMPONENT_DATABASE.linked_components(context.db, context.document) { for name in &component.environments { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::ComponentEnvironment { - name, - file_names: &component.file_names, - }, - )); + builder.component_environment(range, name, &component.file_names); } } diff --git a/support/texlab/src/features/completion/entry_type.rs b/support/texlab/src/features/completion/entry_type.rs index 519737ed08..38bc0e3f3a 100644 --- a/support/texlab/src/features/completion/entry_type.rs +++ b/support/texlab/src/features/completion/entry_type.rs @@ -1,26 +1,26 @@ -use lsp_types::CompletionParams; use rowan::{TextRange, TextSize}; -use crate::{features::cursor::CursorContext, syntax::bibtex, LANGUAGE_DATA}; +use crate::{ + syntax::bibtex, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, +}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_entry_types<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let range = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::TYPE) .map(bibtex::SyntaxToken::text_range) .filter(|range| range.start() != context.offset) .map(|range| TextRange::new(range.start() + TextSize::from(1), range.end()))?; - for ty in &LANGUAGE_DATA.entry_types { - let data = InternalCompletionItemData::EntryType { ty }; - let item = InternalCompletionItem::new(range, data); - items.push(item); + for entry_type in &LANGUAGE_DATA.entry_types { + builder.entry_type(range, entry_type); } Some(()) diff --git a/support/texlab/src/features/completion/field.rs b/support/texlab/src/features/completion/field.rs index 4f386ed1b1..ff6e54a562 100644 --- a/support/texlab/src/features/completion/field.rs +++ b/support/texlab/src/features/completion/field.rs @@ -1,19 +1,17 @@ -use lsp_types::CompletionParams; use rowan::{ast::AstNode, TextRange}; use crate::{ - features::cursor::CursorContext, syntax::bibtex::{self, HasName}, - LANGUAGE_DATA, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, }; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_fields<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { - let token = context.cursor.as_bibtex()?; + let token = context.cursor.as_bib()?; let range = if token.kind() == bibtex::NAME { token.text_range() @@ -31,9 +29,8 @@ pub fn complete_fields<'a>( } for field in &LANGUAGE_DATA.fields { - let data = InternalCompletionItemData::Field { field }; - let item = InternalCompletionItem::new(range, data); - items.push(item); + builder.field(range, field); } + Some(()) } diff --git a/support/texlab/src/features/completion/glossary_ref.rs b/support/texlab/src/features/completion/glossary_ref.rs index 6223079fdf..34d53bf24d 100644 --- a/support/texlab/src/features/completion/glossary_ref.rs +++ b/support/texlab/src/features/completion/glossary_ref.rs @@ -1,38 +1,31 @@ -use lsp_types::CompletionParams; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::latex}; +use crate::{syntax::latex, util::cursor::CursorContext}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_glossary_entries<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range, group) = context.find_curly_group_word()?; latex::GlossaryEntryReference::cast(group.syntax().parent()?)?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { + for node in data.root(context.db).descendants() { if let Some(name) = latex::GlossaryEntryDefinition::cast(node.clone()) .and_then(|entry| entry.name()) .and_then(|name| name.key()) .map(|name| name.to_string()) { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::GlossaryEntry { name }, - )); + builder.glossary_entry(range, name); } else if let Some(name) = latex::AcronymDefinition::cast(node) .and_then(|entry| entry.name()) .and_then(|name| name.key()) .map(|name| name.to_string()) { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::Acronym { name }, - )); + builder.glossary_entry(range, name); } } } diff --git a/support/texlab/src/features/completion/import.rs b/support/texlab/src/features/completion/import.rs index 9cb35b68a7..bf6da78a43 100644 --- a/support/texlab/src/features/completion/import.rs +++ b/support/texlab/src/features/completion/import.rs @@ -1,31 +1,24 @@ -use lsp_types::CompletionParams; use rowan::ast::AstNode; use rustc_hash::FxHashSet; -use smol_str::SmolStr; -use crate::{component_db::COMPONENT_DATABASE, features::cursor::CursorContext, syntax::latex}; +use crate::{ + syntax::latex, + util::{components::COMPONENT_DATABASE, cursor::CursorContext}, +}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_imports<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range, group) = context.find_curly_group_word_list()?; - let (extension, mut factory): ( - &str, - Box<dyn FnMut(SmolStr) -> InternalCompletionItemData<'a>>, - ) = match group.syntax().parent()?.kind() { - latex::PACKAGE_INCLUDE => ( - "sty", - Box::new(|name| InternalCompletionItemData::Package { name }), - ), - latex::CLASS_INCLUDE => ( - "cls", - Box::new(|name| InternalCompletionItemData::Class { name }), - ), - _ => return None, + let kind = group.syntax().parent()?.kind(); + let extension = match kind { + latex::PACKAGE_INCLUDE => "sty", + latex::CLASS_INCLUDE => "cls", + _ => return Some(()), }; let mut file_names = FxHashSet::default(); @@ -35,21 +28,27 @@ pub fn complete_imports<'a>( .flat_map(|comp| comp.file_names.iter()) .filter(|file_name| file_name.ends_with(extension)) { - file_names.insert(file_name); + file_names.insert(file_name.as_str()); let stem = &file_name[0..file_name.len() - 4]; - let data = factory(stem.into()); - items.push(InternalCompletionItem::new(range, data)); + if kind == latex::PACKAGE_INCLUDE { + builder.package(range, stem); + } else { + builder.class(range, stem); + } } - let resolver = &context.request.workspace.environment.resolver; - for file_name in resolver - .files_by_name - .keys() + let file_name_db = context.workspace.file_name_db(context.db); + for file_name in file_name_db + .iter() + .map(|(file_name, _)| file_name) .filter(|file_name| file_name.ends_with(extension) && !file_names.contains(file_name)) { let stem = &file_name[0..file_name.len() - 4]; - let data = factory(stem.into()); - items.push(InternalCompletionItem::new(range, data)); + if kind == latex::PACKAGE_INCLUDE { + builder.package(range, stem); + } else { + builder.class(range, stem); + } } Some(()) diff --git a/support/texlab/src/features/completion/include.rs b/support/texlab/src/features/completion/include.rs index d851aca820..bde7544570 100644 --- a/support/texlab/src/features/completion/include.rs +++ b/support/texlab/src/features/completion/include.rs @@ -4,18 +4,22 @@ use std::{ path::{Path, PathBuf}, }; -use lsp_types::CompletionParams; use rowan::{ast::AstNode, TextRange, TextSize}; -use crate::{features::cursor::CursorContext, syntax::latex}; +use crate::{syntax::latex, util::cursor::CursorContext}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_includes<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { - if context.request.main_document().uri.scheme() != "file" { + if context + .document + .location(context.db) + .path(context.db) + .is_none() + { return None; } @@ -51,10 +55,15 @@ pub fn complete_includes<'a>( let mut dirs = vec![current_dir(context, &path_text, None)]; if include.kind() == latex::GRAPHICS_INCLUDE { - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for graphics_path in &data.extras.graphics_paths { - dirs.push(current_dir(context, &path_text, Some(graphics_path))); + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { + for path in data + .analyze(context.db) + .graphics_paths(context.db) + .iter() + .map(|node| node.path(context.db)) + { + dirs.push(current_dir(context, &path_text, Some(path))); } } } @@ -74,15 +83,12 @@ pub fn complete_includes<'a>( if !include_extension { remove_extension(&mut path); } + let name = path.file_name()?.to_str()?.into(); - let data = InternalCompletionItemData::File { name }; - let item = InternalCompletionItem::new(segment_range, data); - items.push(item); + builder.file(segment_range, name); } else if file_type.is_dir() { let name = path.file_name()?.to_str()?.into(); - let data = InternalCompletionItemData::Directory { name }; - let item = InternalCompletionItem::new(segment_range, data); - items.push(item); + builder.directory(segment_range, name); } } @@ -90,34 +96,24 @@ pub fn complete_includes<'a>( } fn current_dir( - context: &CursorContext<CompletionParams>, + context: &CursorContext, path_text: &str, graphics_path: Option<&str>, ) -> Option<PathBuf> { - let mut path = context - .request + let parent = context .workspace - .environment - .options - .root_directory - .as_ref() - .map_or_else( - || { - let mut path = context.request.main_document().uri.to_file_path().unwrap(); - path.pop(); - path - }, - |root_directory| { - context - .request - .workspace - .environment - .current_directory - .join(root_directory) - }, - ); - - path = PathBuf::from(path.to_str()?.replace('\\', "/")); + .parents(context.db, context.document) + .iter() + .next() + .map_or(context.document, Clone::clone); + + let path = context + .workspace + .working_dir(context.db, parent.directory(context.db)) + .path(context.db) + .as_deref()?; + + let mut path = PathBuf::from(path.to_str()?.replace('\\', "/")); if !path_text.is_empty() { if let Some(graphics_path) = graphics_path { path.push(graphics_path); diff --git a/support/texlab/src/features/completion/label.rs b/support/texlab/src/features/completion/label.rs index b662f98c8a..ae3e010b0e 100644 --- a/support/texlab/src/features/completion/label.rs +++ b/support/texlab/src/features/completion/label.rs @@ -1,83 +1,61 @@ -use lsp_types::CompletionParams; use rowan::{ast::AstNode, TextRange}; use crate::{ - features::{cursor::CursorContext, lsp_kinds::Structure}, - render_label, syntax::latex, - LabelledObject, + util::{self, cursor::CursorContext, label::LabeledObject, lsp_enums::Structure}, }; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_labels<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (range, is_math) = find_reference(context).or_else(|| find_reference_range(context))?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for label in latex::SyntaxNode::new_root(data.green.clone()) - .descendants() - .filter_map(latex::LabelDefinition::cast) + let db = context.db; + for document in context.related() { + if let Some(data) = document.parse(db).as_tex() { + for label in data + .analyze(db) + .labels(db) + .iter() + .filter(|label| label.origin(db).as_definition().is_some()) { - if let Some(name) = label - .name() - .and_then(|name| name.key()) - .map(|name| name.to_string()) - { - match render_label(&context.request.workspace, &name, Some(label)) { - Some(rendered_label) => { - let kind = match &rendered_label.object { - LabelledObject::Section { .. } => Structure::Section, - LabelledObject::Float { .. } => Structure::Float, - LabelledObject::Theorem { .. } => Structure::Theorem, - LabelledObject::Equation => Structure::Equation, - LabelledObject::EnumItem => Structure::Item, - }; + match util::label::render(db, document, *label) { + Some(rendered_label) => { + let kind = match &rendered_label.object { + LabeledObject::Section { .. } => Structure::Section, + LabeledObject::Float { .. } => Structure::Float, + LabeledObject::Theorem { .. } => Structure::Theorem, + LabeledObject::Equation => Structure::Equation, + LabeledObject::EnumItem => Structure::Item, + }; - if is_math && kind != Structure::Equation { - continue; - } + if is_math && kind != Structure::Equation { + continue; + } - let header = rendered_label.detail(); - let footer = match &rendered_label.object { - LabelledObject::Float { caption, .. } => Some(caption.clone()), - _ => None, - }; + let header = rendered_label.detail(db); + let footer = match &rendered_label.object { + LabeledObject::Float { caption, .. } => Some(caption.clone()), + _ => None, + }; - let text = format!("{} {}", name, rendered_label.reference()); + let text = format!( + "{} {}", + label.name(db).text(db), + rendered_label.reference(db) + ); - let item = InternalCompletionItem::new( - range, - InternalCompletionItemData::Label { - name, - kind, - header, - footer, - text, - }, - ); - items.push(item); - } - None => { - let kind = Structure::Label; - let header = None; - let footer = None; - let text = name.to_string(); - let item = InternalCompletionItem::new( - range, - InternalCompletionItemData::Label { - name, - kind, - header, - footer, - text, - }, - ); - items.push(item); - } + builder.label(range, label.name(db).text(db), kind, header, footer, text); + } + None => { + let kind = Structure::Label; + let header = None; + let footer = None; + let text = label.name(db).text(db).clone(); + builder.label(range, label.name(db).text(db), kind, header, footer, text); } } } @@ -87,14 +65,14 @@ pub fn complete_labels<'a>( Some(()) } -fn find_reference(context: &CursorContext<CompletionParams>) -> Option<(TextRange, bool)> { +fn find_reference(context: &CursorContext) -> Option<(TextRange, bool)> { let (_, range, group) = context.find_curly_group_word_list()?; let reference = latex::LabelReference::cast(group.syntax().parent()?)?; let is_math = reference.command()?.text() == "\\eqref"; Some((range, is_math)) } -fn find_reference_range(context: &CursorContext<CompletionParams>) -> Option<(TextRange, bool)> { +fn find_reference_range(context: &CursorContext) -> Option<(TextRange, bool)> { let (_, range, group) = context.find_curly_group_word()?; latex::LabelReferenceRange::cast(group.syntax().parent()?)?; Some((range, false)) diff --git a/support/texlab/src/features/completion/theorem.rs b/support/texlab/src/features/completion/theorem.rs index 65b511f7ad..cd0dfe3a84 100644 --- a/support/texlab/src/features/completion/theorem.rs +++ b/support/texlab/src/features/completion/theorem.rs @@ -1,24 +1,18 @@ -use lsp_types::CompletionParams; +use crate::util::cursor::CursorContext; -use crate::features::cursor::CursorContext; +use super::builder::CompletionBuilder; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_theorem_environments<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range) = context.find_environment_name()?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for environment in &data.extras.theorem_environments { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::UserEnvironment { - name: environment.name.clone(), - }, - )); + let db = context.db; + for document in context.related() { + if let Some(data) = document.parse(db).as_tex() { + for environment in data.analyze(db).theorem_environments(db) { + builder.user_environment(range, environment.name(db).text(db)); } } } diff --git a/support/texlab/src/features/completion/tikz_library.rs b/support/texlab/src/features/completion/tikz_library.rs index bf15695722..7ea26d50c2 100644 --- a/support/texlab/src/features/completion/tikz_library.rs +++ b/support/texlab/src/features/completion/tikz_library.rs @@ -1,13 +1,15 @@ -use lsp_types::CompletionParams; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::latex, LANGUAGE_DATA}; +use crate::{ + syntax::latex, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, +}; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; +use super::builder::CompletionBuilder; -pub fn complete_tikz_libraries<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (_, range, group) = context.find_curly_group_word_list()?; @@ -15,17 +17,11 @@ pub fn complete_tikz_libraries<'a>( if import.command()?.text() == "\\usepgflibrary" { for name in &LANGUAGE_DATA.pgf_libraries { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::PgfLibrary { name }, - )); + builder.tikz_library(range, name); } } else { for name in &LANGUAGE_DATA.tikz_libraries { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::TikzLibrary { name }, - )); + builder.tikz_library(range, name); } } diff --git a/support/texlab/src/features/completion/types.rs b/support/texlab/src/features/completion/types.rs deleted file mode 100644 index 3655c6a074..0000000000 --- a/support/texlab/src/features/completion/types.rs +++ /dev/null @@ -1,151 +0,0 @@ -use std::sync::Arc; - -use lsp_types::Url; -use rowan::TextRange; -use serde::{Deserialize, Serialize}; -use smol_str::SmolStr; - -use crate::{features::lsp_kinds::Structure, BibtexEntryTypeDoc, BibtexFieldDoc}; - -#[derive(Debug, Clone)] -pub struct InternalCompletionItem<'a> { - pub range: TextRange, - pub data: InternalCompletionItemData<'a>, - pub preselect: bool, - pub score: Option<i64>, -} - -impl<'a> InternalCompletionItem<'a> { - pub fn new(range: TextRange, data: InternalCompletionItemData<'a>) -> Self { - Self { - range, - data, - preselect: false, - score: None, - } - } -} - -#[derive(Debug, Clone)] -pub enum InternalCompletionItemData<'a> { - EntryType { - ty: &'a BibtexEntryTypeDoc, - }, - Field { - field: &'a BibtexFieldDoc, - }, - Argument { - name: &'a str, - image: Option<&'a str>, - }, - BeginCommand, - Citation { - uri: Arc<Url>, - key: String, - text: String, - ty: Structure, - }, - ComponentCommand { - name: &'a SmolStr, - image: Option<&'a str>, - glyph: Option<&'a str>, - file_names: &'a [SmolStr], - }, - ComponentEnvironment { - name: &'a SmolStr, - file_names: &'a [SmolStr], - }, - Class { - name: SmolStr, - }, - Package { - name: SmolStr, - }, - Color { - name: &'a str, - }, - ColorModel { - name: &'a str, - }, - Acronym { - name: String, - }, - GlossaryEntry { - name: String, - }, - File { - name: SmolStr, - }, - Directory { - name: SmolStr, - }, - Label { - name: String, - kind: Structure, - header: Option<String>, - footer: Option<String>, - text: String, - }, - UserCommand { - name: SmolStr, - }, - UserEnvironment { - name: String, - }, - PgfLibrary { - name: &'a str, - }, - TikzLibrary { - name: &'a str, - }, -} - -impl<'a> InternalCompletionItemData<'a> { - pub fn label<'b: 'a>(&'b self) -> &'a str { - match self { - Self::EntryType { ty } => &ty.name, - Self::Field { field } => &field.name, - Self::Argument { name, .. } => name, - Self::BeginCommand => "begin", - Self::Citation { key, .. } => key, - Self::ComponentCommand { name, .. } => name, - Self::ComponentEnvironment { name, .. } => name, - Self::Class { name } => name, - Self::Package { name } => name, - Self::Color { name } => name, - Self::ColorModel { name } => name, - Self::Acronym { name } => name, - Self::GlossaryEntry { name } => name, - Self::File { name } => name, - Self::Directory { name } => name, - Self::Label { name, .. } => name, - Self::UserCommand { name } => name, - Self::UserEnvironment { name } => name, - Self::PgfLibrary { name } => name, - Self::TikzLibrary { name } => name, - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum CompletionItemData { - Command, - CommandSnippet, - Environment, - Label, - Folder, - File, - PgfLibrary, - TikzLibrary, - Color, - ColorModel, - Package, - Class, - EntryType, - FieldName, - Citation { uri: Url, key: SmolStr }, - Argument, - Acronym, - GlossaryEntry, -} diff --git a/support/texlab/src/features/completion/user_command.rs b/support/texlab/src/features/completion/user_command.rs index 8c4d593bee..99d9883ee9 100644 --- a/support/texlab/src/features/completion/user_command.rs +++ b/support/texlab/src/features/completion/user_command.rs @@ -1,29 +1,27 @@ -use lsp_types::CompletionParams; +use crate::util::cursor::CursorContext; -use crate::features::cursor::CursorContext; +use super::builder::CompletionBuilder; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_user_commands<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let range = context.cursor.command_range(context.offset)?; - let token = context.cursor.as_latex()?; + let token = context.cursor.as_tex()?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { + let db = context.db; + for document in context.related() { + if let Some(data) = document.parse(db).as_tex() { + let text = document.contents(db).text(db); for name in data - .extras - .command_names + .analyze(db) + .command_name_ranges(db) .iter() - .filter(|name| name.as_str() != token.text()) - .cloned() + .copied() + .filter(|range| *range != token.text_range()) + .map(|range| &text[std::ops::Range::<usize>::from(range)]) { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::UserCommand { name }, - )); + builder.user_command(range, name); } } } diff --git a/support/texlab/src/features/completion/user_environment.rs b/support/texlab/src/features/completion/user_environment.rs index 91dd5a9ea2..cf6c2a7c78 100644 --- a/support/texlab/src/features/completion/user_environment.rs +++ b/support/texlab/src/features/completion/user_environment.rs @@ -1,28 +1,22 @@ -use lsp_types::CompletionParams; +use crate::util::cursor::CursorContext; -use crate::features::cursor::CursorContext; +use super::builder::CompletionBuilder; -use super::types::{InternalCompletionItem, InternalCompletionItemData}; - -pub fn complete_user_environments<'a>( - context: &'a CursorContext<CompletionParams>, - items: &mut Vec<InternalCompletionItem<'a>>, +pub fn complete<'db>( + context: &'db CursorContext, + builder: &mut CompletionBuilder<'db>, ) -> Option<()> { let (name, range) = context.find_environment_name()?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { for name in data - .extras - .environment_names + .analyze(context.db) + .environment_names(context.db) .iter() .filter(|n| n.as_str() != name) - .cloned() { - items.push(InternalCompletionItem::new( - range, - InternalCompletionItemData::UserEnvironment { name }, - )); + builder.user_environment(range, name); } } } diff --git a/support/texlab/src/features/completion/util.rs b/support/texlab/src/features/completion/util.rs deleted file mode 100644 index 05827bbf24..0000000000 --- a/support/texlab/src/features/completion/util.rs +++ /dev/null @@ -1,64 +0,0 @@ -use lsp_types::{CompletionItemKind, CompletionParams, Documentation, MarkupContent, MarkupKind}; -use smol_str::SmolStr; - -use crate::features::FeatureRequest; - -pub fn component_detail(file_names: &[SmolStr]) -> String { - if file_names.is_empty() { - "built-in".to_owned() - } else { - file_names.join(", ") - } -} - -pub fn image_documentation( - request: &FeatureRequest<CompletionParams>, - name: &str, - image: &str, -) -> Option<Documentation> { - if supports_images(request) { - Some(Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: format!( - "![{}](data:image/png;base64,{}|width=48,height=48)", - name, image - ), - })) - } else { - None - } -} - -fn supports_images(request: &FeatureRequest<CompletionParams>) -> bool { - request - .workspace - .environment - .client_capabilities - .text_document - .as_ref() - .and_then(|cap| cap.completion.as_ref()) - .and_then(|cap| cap.completion_item.as_ref()) - .and_then(|cap| cap.documentation_format.as_ref()) - .map_or(true, |formats| formats.contains(&MarkupKind::Markdown)) -} - -pub fn adjust_kind( - request: &FeatureRequest<CompletionParams>, - kind: CompletionItemKind, -) -> CompletionItemKind { - if let Some(value_set) = request - .workspace - .environment - .client_capabilities - .text_document - .as_ref() - .and_then(|cap| cap.completion.as_ref()) - .and_then(|cap| cap.completion_item_kind.as_ref()) - .and_then(|cap| cap.value_set.as_ref()) - { - if value_set.contains(&kind) { - return kind; - } - } - CompletionItemKind::TEXT -} diff --git a/support/texlab/src/features/definition.rs b/support/texlab/src/features/definition.rs index 20da72a142..7c9e6d4841 100644 --- a/support/texlab/src/features/definition.rs +++ b/support/texlab/src/features/definition.rs @@ -4,48 +4,44 @@ mod entry; mod label; mod string; -use std::sync::Arc; - -use lsp_types::{GotoDefinitionParams, GotoDefinitionResponse, LocationLink, Url}; +use lsp_types::{GotoDefinitionResponse, LocationLink, Position, Url}; use rowan::TextRange; -use crate::LineIndexExt; - -use self::{ - command::goto_command_definition, document::goto_document_definition, - entry::goto_entry_definition, label::goto_label_definition, string::goto_string_definition, +use crate::{ + db::Document, + util::{cursor::CursorContext, line_index_ext::LineIndexExt}, + Db, }; -use super::{cursor::CursorContext, FeatureRequest}; - pub fn goto_definition( - request: FeatureRequest<GotoDefinitionParams>, + db: &dyn Db, + uri: &Url, + position: Position, ) -> Option<GotoDefinitionResponse> { - let context = CursorContext::new(request); + let context = CursorContext::new(db, uri, position, ())?; log::debug!("[Definition] Cursor: {:?}", context.cursor); - let origin_document = context.request.main_document(); - let links: Vec<_> = goto_command_definition(&context) - .or_else(|| goto_document_definition(&context)) - .or_else(|| goto_entry_definition(&context)) - .or_else(|| goto_label_definition(&context)) - .or_else(|| goto_string_definition(&context))? + let links: Vec<_> = command::goto_definition(&context) + .or_else(|| document::goto_definition(&context)) + .or_else(|| entry::goto_definition(&context)) + .or_else(|| label::goto_definition(&context)) + .or_else(|| string::goto_definition(&context))? .into_iter() .map(|result| { let origin_selection_range = Some( - origin_document - .line_index + context + .document + .contents(db) + .line_index(db) .line_col_lsp_range(result.origin_selection_range), ); - let target_document = &context.request.workspace.documents_by_uri[&result.target_uri]; - let target_uri = result.target_uri.as_ref().clone(); - let target_range = target_document - .line_index - .line_col_lsp_range(result.target_range); - let target_selection_range = target_document - .line_index - .line_col_lsp_range(result.target_selection_range); + let target_line_index = result.target.contents(db).line_index(db); + let target_uri = result.target.location(context.db).uri(context.db).clone(); + let target_range = target_line_index.line_col_lsp_range(result.target_range); + + let target_selection_range = + target_line_index.line_col_lsp_range(result.target_selection_range); LocationLink { origin_selection_range, @@ -62,7 +58,7 @@ pub fn goto_definition( #[derive(Debug, Clone)] struct DefinitionResult { origin_selection_range: TextRange, - target_uri: Arc<Url>, + target: Document, target_range: TextRange, target_selection_range: TextRange, } diff --git a/support/texlab/src/features/definition/command.rs b/support/texlab/src/features/definition/command.rs index 599c792dfd..cf9fe1b511 100644 --- a/support/texlab/src/features/definition/command.rs +++ b/support/texlab/src/features/definition/command.rs @@ -1,26 +1,20 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::latex}; +use crate::{syntax::latex, util::cursor::CursorContext}; use super::DefinitionResult; -pub(super) fn goto_command_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { let name = context .cursor - .as_latex() + .as_tex() .filter(|token| token.kind().is_command_name())?; let origin_selection_range = name.text_range(); - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - let root = latex::SyntaxNode::new_root(data.green.clone()); - + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { + let root = data.root(context.db); if let Some(result) = root .descendants() .filter_map(latex::CommandDefinition::cast) @@ -32,7 +26,7 @@ pub(super) fn goto_command_definition( .find_map(|def| { Some(DefinitionResult { origin_selection_range, - target_uri: Arc::clone(&document.uri), + target: document, target_range: latex::small_range(&def), target_selection_range: def.name()?.command()?.text_range(), }) diff --git a/support/texlab/src/features/definition/document.rs b/support/texlab/src/features/definition/document.rs index 1c09bbc88d..58237f7521 100644 --- a/support/texlab/src/features/definition/document.rs +++ b/support/texlab/src/features/definition/document.rs @@ -1,40 +1,30 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; use rowan::TextRange; -use crate::features::cursor::CursorContext; +use crate::{db::dependency_graph, util::cursor::CursorContext}; use super::DefinitionResult; -pub(super) fn goto_document_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { - let data = context.request.main_document().data.as_latex()?; - - for include in data - .extras - .explicit_links +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { + let db = context.db; + context + .workspace + .parents(db, context.document) .iter() - .filter(|link| link.stem_range.contains_inclusive(context.offset)) - { - for target in &include.targets { - if context - .request - .workspace - .documents_by_uri - .values() - .any(|document| document.uri.as_ref() == target.as_ref()) - { - return Some(vec![DefinitionResult { - origin_selection_range: include.stem_range, - target_uri: Arc::clone(target), + .copied() + .chain(std::iter::once(context.document)) + .flat_map(|parent| dependency_graph(db, parent).edges) + .filter(|edge| edge.source == context.document) + .find_map(|edge| { + let range = edge.origin?.link.range(db); + if range.contains_inclusive(context.offset) { + Some(vec![DefinitionResult { + origin_selection_range: range, + target: edge.target, target_range: TextRange::default(), target_selection_range: TextRange::default(), - }]); + }]) + } else { + None } - } - } - - None + }) } diff --git a/support/texlab/src/features/definition/entry.rs b/support/texlab/src/features/definition/entry.rs index 1dcd983af1..a945b18c41 100644 --- a/support/texlab/src/features/definition/entry.rs +++ b/support/texlab/src/features/definition/entry.rs @@ -1,24 +1,21 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; use rowan::ast::AstNode; use crate::{ - features::cursor::CursorContext, syntax::{ bibtex::{self, HasName}, latex, }, + util::cursor::CursorContext, }; use super::DefinitionResult; -pub(super) fn goto_entry_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { + let db = context.db; + let word = context .cursor - .as_latex() + .as_tex() .filter(|token| token.kind() == latex::WORD)?; let key = latex::Key::cast(word.parent()?)?; @@ -27,16 +24,13 @@ pub(super) fn goto_entry_definition( let origin_selection_range = latex::small_range(&key); - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_bibtex() { - for entry in bibtex::SyntaxNode::new_root(data.green.clone()) - .children() - .filter_map(bibtex::Entry::cast) - { + for document in context.related() { + if let Some(data) = document.parse(db).as_bib() { + for entry in data.root(db).children().filter_map(bibtex::Entry::cast) { if let Some(key) = entry.name_token().filter(|k| k.text() == word.text()) { return Some(vec![DefinitionResult { origin_selection_range, - target_uri: Arc::clone(&document.uri), + target: document, target_selection_range: key.text_range(), target_range: entry.syntax().text_range(), }]); diff --git a/support/texlab/src/features/definition/label.rs b/support/texlab/src/features/definition/label.rs index 867e8a1076..a1cc4ed15b 100644 --- a/support/texlab/src/features/definition/label.rs +++ b/support/texlab/src/features/definition/label.rs @@ -1,31 +1,32 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; - -use crate::{features::cursor::CursorContext, find_label_definition, render_label, syntax::latex}; +use crate::{ + db::analysis::label, + util::{self, cursor::CursorContext}, +}; use super::DefinitionResult; -pub(super) fn goto_label_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { + let db = context.db; let (name_text, origin_selection_range) = context .find_label_name_key() .or_else(|| context.find_label_name_command())?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - let root = latex::SyntaxNode::new_root(data.green.clone()); - if let Some(definition) = find_label_definition(&root, &name_text) { - let target_selection_range = latex::small_range(&definition.name()?.key()?); - let target_range = - render_label(&context.request.workspace, &name_text, Some(definition)) - .map(|label| label.range) - .unwrap_or(target_selection_range); + for document in context.related() { + if let Some(data) = document.parse(db).as_tex() { + if let Some(label) = data + .analyze(db) + .labels(db) + .iter() + .filter(|label| matches!(label.origin(db), label::Origin::Definition(_))) + .find(|label| label.name(db).text(db) == name_text.as_str()) + { + let target_selection_range = label.range(db); + let target_range = util::label::render(db, document, *label) + .map_or(target_selection_range, |label| label.range); return Some(vec![DefinitionResult { origin_selection_range, - target_uri: Arc::clone(&document.uri), + target: document, target_range, target_selection_range, }]); diff --git a/support/texlab/src/features/definition/string.rs b/support/texlab/src/features/definition/string.rs index c774e24e1d..44ea1e9094 100644 --- a/support/texlab/src/features/definition/string.rs +++ b/support/texlab/src/features/definition/string.rs @@ -1,43 +1,34 @@ -use std::sync::Arc; - -use lsp_types::GotoDefinitionParams; use rowan::ast::AstNode; use crate::{ - features::cursor::CursorContext, syntax::bibtex::{self, HasName}, + util::cursor::CursorContext, }; use super::DefinitionResult; -pub(super) fn goto_string_definition( - context: &CursorContext<GotoDefinitionParams>, -) -> Option<Vec<DefinitionResult>> { - let main_document = context.request.main_document(); - - let data = main_document.data.as_bibtex()?; +pub(super) fn goto_definition(context: &CursorContext) -> Option<Vec<DefinitionResult>> { + let db = context.db; + let data = context.document.parse(db).as_bib()?; let key = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::NAME)?; bibtex::Value::cast(key.parent()?)?; let origin_selection_range = key.text_range(); - for string in bibtex::SyntaxNode::new_root(data.green.clone()) + data.root(db) .children() .filter_map(bibtex::StringDef::cast) - { - if let Some(string_name) = string.name_token().filter(|k| k.text() == key.text()) { - return Some(vec![DefinitionResult { + .find_map(|string| { + let string_name = string.name_token().filter(|k| k.text() == key.text())?; + Some(vec![DefinitionResult { origin_selection_range, - target_uri: Arc::clone(&main_document.uri), + target: context.document, target_selection_range: string_name.text_range(), target_range: string.syntax().text_range(), - }]); - } - } - - None + }]) + }) } diff --git a/support/texlab/src/features/execute_command.rs b/support/texlab/src/features/execute_command.rs deleted file mode 100644 index b1b89d4f50..0000000000 --- a/support/texlab/src/features/execute_command.rs +++ /dev/null @@ -1,103 +0,0 @@ -use std::{path::PathBuf, process::Stdio, sync::Arc}; - -use anyhow::Result; -use lsp_types::{TextDocumentIdentifier, Url}; - -use crate::Workspace; - -pub fn execute_command( - workspace: &Workspace, - name: &str, - args: Vec<serde_json::Value>, -) -> Result<()> { - match name { - "texlab.cleanAuxiliary" => { - let params = args - .into_iter() - .next() - .ok_or_else(|| anyhow::anyhow!("texlab.cleanAuxiliary requires one argument"))?; - - clean_output_files(workspace, CleanOptions::Auxiliary, params)?; - } - "texlab.cleanArtifacts" => { - let params = args - .into_iter() - .next() - .ok_or_else(|| anyhow::anyhow!("texlab.cleanArtifacts requires one argument"))?; - - clean_output_files(workspace, CleanOptions::Artifacts, params)?; - } - _ => anyhow::bail!("Unknown command: {}", name), - } - - Ok(()) -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] -enum CleanOptions { - Auxiliary, - Artifacts, -} - -fn clean_output_files( - workspace: &Workspace, - options: CleanOptions, - params: serde_json::Value, -) -> Result<()> { - let params: TextDocumentIdentifier = serde_json::from_value(params)?; - - let uri = workspace - .find_parent(¶ms.uri) - .map(|document| document.uri) - .unwrap_or_else(|| Arc::new(params.uri)); - - if let Some(cx) = BuildContext::find(workspace, &uri) { - let flag = match options { - CleanOptions::Auxiliary => "-c", - CleanOptions::Artifacts => "-C", - }; - - std::process::Command::new("latexmk") - .arg(format!("-outdir={}", cx.output_dir.to_string_lossy())) - .arg(flag) - .arg(cx.input_file) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .status()?; - } - - Ok(()) -} - -struct BuildContext { - input_file: PathBuf, - output_dir: PathBuf, -} - -impl BuildContext { - pub fn find(workspace: &Workspace, uri: &Url) -> Option<Self> { - if uri.scheme() != "file" { - return None; - } - - let input_file = uri.to_file_path().ok()?; - let options = &workspace.environment.options; - let current_dir = &workspace.environment.current_directory; - let output_dir = match ( - options.root_directory.as_ref(), - options.aux_directory.as_ref(), - ) { - (_, Some(aux_dir)) => current_dir.join(aux_dir), - (Some(root_dir), None) => current_dir.join(root_dir), - (None, None) => input_file.parent()?.to_path_buf(), - }; - - log::info!("Output = {:#?}", output_dir); - - Some(Self { - input_file, - output_dir, - }) - } -} diff --git a/support/texlab/src/features/folding.rs b/support/texlab/src/features/folding.rs index 71fb0bee6f..ea26121f3f 100644 --- a/support/texlab/src/features/folding.rs +++ b/support/texlab/src/features/folding.rs @@ -1,49 +1,52 @@ -use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams, Range}; +use lsp_types::{FoldingRange, FoldingRangeKind, Range, Url}; use rowan::ast::AstNode; use crate::{ + db::{parse::DocumentData, Workspace}, syntax::{bibtex, latex}, - DocumentData, LineIndexExt, + util::line_index_ext::LineIndexExt, + Db, }; -use super::FeatureRequest; - -pub fn find_foldings(request: FeatureRequest<FoldingRangeParams>) -> Vec<FoldingRange> { - let mut foldings = Vec::new(); - let main_document = request.main_document(); - match &main_document.data { - DocumentData::Latex(data) => { - for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { +pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<FoldingRange>> { + let document = Workspace::get(db).lookup_uri(db, uri)?; + let line_index = document.contents(db).line_index(db); + let foldings = match document.parse(db) { + DocumentData::Tex(data) => { + let mut results = Vec::new(); + let root = data.root(db); + for node in root.descendants() { if let Some(folding) = latex::Environment::cast(node.clone()) .map(|node| latex::small_range(&node)) .or_else(|| { latex::Section::cast(node.clone()).map(|node| latex::small_range(&node)) }) .or_else(|| latex::EnumItem::cast(node).map(|node| latex::small_range(&node))) - .map(|node| main_document.line_index.line_col_lsp_range(node)) + .map(|node| line_index.line_col_lsp_range(node)) .map(create_range) { - foldings.push(folding); + results.push(folding); } } + + results } - DocumentData::Bibtex(data) => { - for node in bibtex::SyntaxNode::new_root(data.green.clone()).descendants() { - if matches!( - node.kind(), - bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY - ) { - foldings.push(create_range( - main_document - .line_index - .line_col_lsp_range(node.text_range()), - )); - } - } + DocumentData::Bib(data) => { + let root = data.root(db); + root.descendants() + .filter(|node| { + matches!( + node.kind(), + bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY + ) + }) + .map(|node| create_range(line_index.line_col_lsp_range(node.text_range()))) + .collect() } - DocumentData::BuildLog(_) => {} - } - foldings + DocumentData::Log(_) => return None, + }; + + Some(foldings) } fn create_range(range: Range) -> FoldingRange { diff --git a/support/texlab/src/features/formatting.rs b/support/texlab/src/features/formatting.rs index 1107e5fd38..66375bd576 100644 --- a/support/texlab/src/features/formatting.rs +++ b/support/texlab/src/features/formatting.rs @@ -1,26 +1,31 @@ mod bibtex_internal; mod latexindent; -use lsp_types::{DocumentFormattingParams, TextEdit}; +use lsp_types::{FormattingOptions, TextEdit, Url}; -use crate::{BibtexFormatter, LatexFormatter}; +use crate::{ + db::{Language, Workspace}, + BibtexFormatter, Db, LatexFormatter, +}; use self::{bibtex_internal::format_bibtex_internal, latexindent::format_with_latexindent}; -use super::FeatureRequest; - pub fn format_source_code( - request: FeatureRequest<DocumentFormattingParams>, + db: &dyn Db, + uri: &Url, + options: &FormattingOptions, ) -> Option<Vec<TextEdit>> { - let mut edits = None; - if request.workspace.environment.options.bibtex_formatter == BibtexFormatter::Texlab { - edits = edits.or_else(|| format_bibtex_internal(&request)); - } - - if request.workspace.environment.options.latex_formatter == LatexFormatter::Texlab { - edits = edits.or_else(|| Some(vec![])); + let workspace = Workspace::get(db); + let document = workspace.lookup_uri(db, uri)?; + match document.language(db) { + Language::Tex => match workspace.options(db).latex_formatter { + LatexFormatter::Texlab => None, + LatexFormatter::Latexindent => format_with_latexindent(db, document), + }, + Language::Bib => match workspace.options(db).bibtex_formatter { + BibtexFormatter::Texlab => format_bibtex_internal(db, document, options), + BibtexFormatter::Latexindent => format_with_latexindent(db, document), + }, + Language::Log => None, } - - edits = edits.or_else(|| format_with_latexindent(&request)); - edits } diff --git a/support/texlab/src/features/formatting/bibtex_internal.rs b/support/texlab/src/features/formatting/bibtex_internal.rs index 2dcc507be9..8447778d90 100644 --- a/support/texlab/src/features/formatting/bibtex_internal.rs +++ b/support/texlab/src/features/formatting/bibtex_internal.rs @@ -1,63 +1,57 @@ -use lsp_types::{DocumentFormattingParams, TextEdit}; +use lsp_types::{FormattingOptions, TextEdit}; use rowan::{ast::AstNode, NodeOrToken}; use crate::{ - features::FeatureRequest, + db::{Document, Workspace}, syntax::bibtex::{self, HasName, HasType, HasValue}, - LineIndex, LineIndexExt, + util::{line_index::LineIndex, line_index_ext::LineIndexExt}, + Db, }; pub fn format_bibtex_internal( - request: &FeatureRequest<DocumentFormattingParams>, + db: &dyn Db, + document: Document, + options: &FormattingOptions, ) -> Option<Vec<TextEdit>> { let mut indent = String::new(); - if request.params.options.insert_spaces { - for _ in 0..request.params.options.tab_size { + + if options.insert_spaces { + for _ in 0..options.tab_size { indent.push(' '); } } else { indent.push('\t'); } - let line_length = request - .workspace - .environment - .options + let line_length = Workspace::get(db) + .options(db) .formatter_line_length - .map(|value| { + .map_or(80, |value| { if value <= 0 { usize::MAX } else { value as usize } - }) - .unwrap_or(80); + }); - let document = request.main_document(); - let data = document.data.as_bibtex()?; + let line_index = document.contents(db).line_index(db); + let data = document.parse(db).as_bib()?; let mut edits = Vec::new(); - for node in bibtex::SyntaxNode::new_root(data.green.clone()) - .children() - .filter(|node| { - matches!( - node.kind(), - bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY - ) - }) - { + for node in data.root(db).children().filter(|node| { + matches!( + node.kind(), + bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY + ) + }) { let range = node.text_range(); - let mut formatter = Formatter::new( - indent.clone(), - request.params.options.tab_size, - line_length, - &document.line_index, - ); + let mut formatter = + Formatter::new(indent.clone(), options.tab_size, line_length, line_index); formatter.visit_node(node); edits.push(TextEdit { - range: document.line_index.line_col_lsp_range(range), + range: line_index.line_col_lsp_range(range), new_text: formatter.output, }); } diff --git a/support/texlab/src/features/formatting/latexindent.rs b/support/texlab/src/features/formatting/latexindent.rs index 4898aa4415..3dab10c923 100644 --- a/support/texlab/src/features/formatting/latexindent.rs +++ b/support/texlab/src/features/formatting/latexindent.rs @@ -1,94 +1,78 @@ use std::{ - fs, + path::Path, process::{Command, Stdio}, }; -use lsp_types::{DocumentFormattingParams, TextEdit}; +use lsp_types::TextEdit; use rowan::{TextLen, TextRange}; use tempfile::tempdir; -use crate::{features::FeatureRequest, DocumentLanguage, LineIndexExt}; - -pub fn format_with_latexindent( - request: &FeatureRequest<DocumentFormattingParams>, -) -> Option<Vec<TextEdit>> { - let directory = tempdir().ok()?; - let document = request.main_document(); +use crate::{ + db::{Document, Language, Workspace}, + util::line_index_ext::LineIndexExt, + Db, LatexindentOptions, +}; - let options = &request.workspace.environment.options; - let current_dir = options - .root_directory - .as_ref() - .cloned() - .or_else(|| { - if document.uri.scheme() == "file" { - document - .uri - .to_file_path() - .unwrap() - .parent() - .map(ToOwned::to_owned) - } else { - None - } - }) - .unwrap_or_else(|| ".".into()); +pub fn format_with_latexindent(db: &dyn Db, document: Document) -> Option<Vec<TextEdit>> { + let workspace = Workspace::get(db); + let options = workspace.options(db); + let target_dir = tempdir().ok()?; + let source_dir = workspace + .working_dir(db, document.directory(db)) + .path(db) + .as_deref()?; - let local = match &options.latexindent.local { - Some(local) => format!("--local={}", local), - None => "-l".to_string(), - }; + let target_file = target_dir + .path() + .join(if document.language(db) == Language::Bib { + "file.bib" + } else { + "file.tex" + }); + std::fs::write(&target_file, document.contents(db).text(db)).ok()?; - let modify_line_breaks = options.latexindent.modify_line_breaks; + let args = build_arguments(&options.latexindent, &target_file); - let path = directory.path(); - let _ = fs::copy( - current_dir.join("localSettings.yaml"), - path.join("localSettings.yaml"), - ); - let _ = fs::copy( - current_dir.join(".localSettings.yaml"), - path.join(".localSettings.yaml"), - ); - let _ = fs::copy( - current_dir.join("latexindent.yaml"), - path.join("latexindent.yaml"), + log::debug!( + "Running latexindent in folder \"{}\" with args: {:?}", + source_dir.display(), + args, ); - let name = if document.data.language() == DocumentLanguage::Bibtex { - "file.bib" - } else { - "file.tex" - }; - - fs::write(directory.path().join(name), document.text.as_str()).ok()?; - - let mut args = Vec::new(); - if modify_line_breaks { - args.push("--modifylinebreaks"); - } - args.push(&local); - args.push(name); - let output = Command::new("latexindent") .args(&args) - .current_dir(current_dir) .stdin(Stdio::null()) .stdout(Stdio::piped()) .stderr(Stdio::null()) - .current_dir(directory.path()) + .current_dir(source_dir) .output() .ok()?; + let old_text = document.contents(db).text(db); let new_text = String::from_utf8_lossy(&output.stdout).into_owned(); if new_text.is_empty() { None } else { + let line_index = document.contents(db).line_index(db); Some(vec![TextEdit { - range: document - .line_index - .line_col_lsp_range(TextRange::new(0.into(), document.text.text_len())), + range: line_index.line_col_lsp_range(TextRange::new(0.into(), old_text.text_len())), new_text, }]) } } + +fn build_arguments(options: &LatexindentOptions, target_file: &Path) -> Vec<String> { + let mut args = Vec::new(); + + args.push(match &options.local { + Some(yaml_file) => format!("--local={yaml_file}"), + None => "--local".to_string(), + }); + + if options.modify_line_breaks { + args.push("--modifylinebreaks".to_string()); + } + + args.push(target_file.display().to_string()); + args +} diff --git a/support/texlab/src/features/forward_search.rs b/support/texlab/src/features/forward_search.rs index 54629d0dc0..47be702659 100644 --- a/support/texlab/src/features/forward_search.rs +++ b/support/texlab/src/features/forward_search.rs @@ -1,94 +1,120 @@ use std::{ io, - path::Path, - process::{Command, Stdio}, + path::{Path, PathBuf}, + process::Stdio, }; use log::error; -use lsp_types::TextDocumentPositionParams; -use serde::{Deserialize, Serialize}; -use serde_repr::{Deserialize_repr, Serialize_repr}; - -use super::FeatureRequest; - -#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize_repr, Deserialize_repr)] -#[repr(i32)] -pub enum ForwardSearchStatus { - SUCCESS = 0, - ERROR = 1, - FAILURE = 2, - UNCONFIGURED = 3, +use lsp_types::{Position, Url}; +use thiserror::Error; + +use crate::{db::Workspace, util::line_index_ext::LineIndexExt, Db}; + +#[derive(Debug, Error)] +pub enum Error { + #[error("TeX document '{0}' not found")] + TexNotFound(Url), + + #[error("PDF document '{0}' not found")] + PdfNotFound(PathBuf), + + #[error("TeX document '{0}' is not a local file")] + NoLocalFile(Url), + + #[error("PDF viewer is not configured")] + Unconfigured, + + #[error("Failed to spawn process: {0}")] + Spawn(io::Error), } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct ForwardSearchResult { - pub status: ForwardSearchStatus, +pub struct Command { + executable: String, + args: Vec<String>, } -pub fn execute_forward_search( - request: FeatureRequest<TextDocumentPositionParams>, -) -> Option<ForwardSearchResult> { - let options = &request.workspace.environment.options.forward_search; +impl Command { + pub fn configure(db: &dyn Db, uri: &Url, position: Option<Position>) -> Result<Self, Error> { + let workspace = Workspace::get(db); + let child = workspace + .lookup_uri(db, uri) + .ok_or_else(|| Error::TexNotFound(uri.clone()))?; + + let parent = workspace + .parents(db, child) + .iter() + .copied() + .next() + .unwrap_or(child); + + let output_dir = workspace + .output_dir(db, workspace.working_dir(db, parent.directory(db))) + .path(db) + .as_deref() + .ok_or_else(|| Error::NoLocalFile(uri.clone()))?; + + let tex_path = child + .location(db) + .path(db) + .as_deref() + .ok_or_else(|| Error::NoLocalFile(uri.clone()))?; + + let pdf_name = format!("{}.pdf", parent.location(db).stem(db).unwrap()); + let pdf_path = output_dir.join(pdf_name); + if !pdf_path.exists() { + return Err(Error::PdfNotFound(pdf_path)); + } - if options.executable.is_none() || options.args.is_none() { - return Some(ForwardSearchResult { - status: ForwardSearchStatus::UNCONFIGURED, + let position = position.unwrap_or_else(|| { + child + .contents(db) + .line_index(db) + .line_col_lsp(child.cursor(db)) }); + + let options = &workspace.options(db).forward_search; + + let executable = options + .executable + .as_deref() + .ok_or(Error::Unconfigured)? + .to_string(); + + let args: Vec<_> = options + .args + .as_deref() + .ok_or(Error::Unconfigured)? + .iter() + .flat_map(|arg| replace_placeholder(tex_path, &pdf_path, position.line, arg)) + .collect(); + + Ok(Self { executable, args }) } +} - let root_document = request - .workspace - .documents_by_uri - .values() - .find(|document| { - if let Some(data) = document.data.as_latex() { - data.extras.has_document_environment - && !data - .extras - .explicit_links - .iter() - .filter_map(|link| link.as_component_name()) - .any(|name| name == "subfiles.cls") - } else { - false - } - }) - .filter(|document| document.uri.scheme() == "file")?; - - let data = root_document.data.as_latex()?; - let pdf_path = data - .extras - .implicit_links - .pdf - .iter() - .filter_map(|uri| uri.to_file_path().ok()) - .find(|path| path.exists())?; - - let tex_path = request.main_document().uri.to_file_path().ok()?; - - let args: Vec<String> = options - .args - .as_ref() - .unwrap() - .iter() - .flat_map(|arg| { - replace_placeholder(&tex_path, &pdf_path, request.params.position.line, arg) - }) - .collect(); - - let status = match run_process(options.executable.as_ref().unwrap(), args) { - Ok(()) => ForwardSearchStatus::SUCCESS, - Err(why) => { - error!("Unable to execute forward search: {}", why); - ForwardSearchStatus::FAILURE - } - }; - Some(ForwardSearchResult { status }) +impl Command { + pub fn run(self) -> Result<(), Error> { + log::debug!( + "Executing forward search: {} {:?}", + self.executable, + self.args + ); + + std::process::Command::new(self.executable) + .args(self.args) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .map_err(Error::Spawn)?; + + Ok(()) + } } /// Iterate overs chunks of a string. Either returns a slice of the /// original string, or the placeholder replacement. -pub struct PlaceHolderIterator<'a> { +struct PlaceHolderIterator<'a> { remainder: &'a str, tex_file: &'a str, pdf_file: &'a str, @@ -168,13 +194,3 @@ fn replace_placeholder( }; Some(result) } - -fn run_process(executable: &str, args: Vec<String>) -> io::Result<()> { - Command::new(executable) - .args(args) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .status()?; - Ok(()) -} diff --git a/support/texlab/src/features/highlight.rs b/support/texlab/src/features/highlight.rs index b2c5794461..52746a040f 100644 --- a/support/texlab/src/features/highlight.rs +++ b/support/texlab/src/features/highlight.rs @@ -1,14 +1,10 @@ mod label; -use lsp_types::{DocumentHighlight, DocumentHighlightParams}; +use lsp_types::{DocumentHighlight, Position, Url}; -use self::label::find_label_highlights; +use crate::{util::cursor::CursorContext, Db}; -use super::{cursor::CursorContext, FeatureRequest}; - -pub fn find_document_highlights( - request: FeatureRequest<DocumentHighlightParams>, -) -> Option<Vec<DocumentHighlight>> { - let context = CursorContext::new(request); - find_label_highlights(&context) +pub fn find_all(db: &dyn Db, uri: &Url, position: Position) -> Option<Vec<DocumentHighlight>> { + let context = CursorContext::new(db, uri, position, ())?; + label::find_highlights(&context) } diff --git a/support/texlab/src/features/highlight/label.rs b/support/texlab/src/features/highlight/label.rs index cb51abdd68..2ae66d5c47 100644 --- a/support/texlab/src/features/highlight/label.rs +++ b/support/texlab/src/features/highlight/label.rs @@ -1,78 +1,31 @@ -use lsp_types::{DocumentHighlight, DocumentHighlightKind, DocumentHighlightParams}; -use rowan::ast::AstNode; +use lsp_types::{DocumentHighlight, DocumentHighlightKind}; -use crate::{features::cursor::CursorContext, syntax::latex, LineIndexExt}; +use crate::{ + db::analysis::label, + util::{cursor::CursorContext, line_index_ext::LineIndexExt}, +}; -pub fn find_label_highlights( - context: &CursorContext<DocumentHighlightParams>, -) -> Option<Vec<DocumentHighlight>> { +pub fn find_highlights(context: &CursorContext) -> Option<Vec<DocumentHighlight>> { + let db = context.db; let (name_text, _) = context.find_label_name_key()?; - - let main_document = context.request.main_document(); - let data = main_document.data.as_latex()?; + let data = context.document.parse(db).as_tex()?; let mut highlights = Vec::new(); - for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { - if let Some(label_name) = latex::LabelDefinition::cast(node.clone()) - .and_then(|label| label.name()) - .and_then(|label_name| label_name.key()) - .filter(|label_name| label_name.to_string() == name_text) - { - let range = main_document - .line_index - .line_col_lsp_range(latex::small_range(&label_name)); - - highlights.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::WRITE), - }); - } else if let Some(label) = latex::LabelReference::cast(node.clone()) { - for label_name in label - .name_list() - .into_iter() - .flat_map(|name| name.keys()) - .filter(|label_name| label_name.to_string() == name_text) - { - let range = main_document - .line_index - .line_col_lsp_range(latex::small_range(&label_name)); - - highlights.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::READ), - }); - } - } else if let Some(label) = latex::LabelReferenceRange::cast(node.clone()) { - if let Some(label_name) = label - .from() - .and_then(|label_name| label_name.key()) - .filter(|label_name| label_name.to_string() == name_text) - { - let range = main_document - .line_index - .line_col_lsp_range(latex::small_range(&label_name)); - - highlights.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::READ), - }); - } - - if let Some(label_name) = label - .to() - .and_then(|label_name| label_name.key()) - .filter(|label_name| label_name.to_string() == name_text) - { - let range = main_document - .line_index - .line_col_lsp_range(latex::small_range(&label_name)); - - highlights.push(DocumentHighlight { - range, - kind: Some(DocumentHighlightKind::READ), - }); - } - } + let line_index = context.document.contents(db).line_index(db); + for label in data + .analyze(db) + .labels(db) + .iter() + .filter(|label| label.name(db).text(db) == &name_text) + { + let range = line_index.line_col_lsp_range(label.range(db)); + let kind = Some(match label.origin(db) { + label::Origin::Definition(_) => DocumentHighlightKind::WRITE, + label::Origin::Reference(_) => DocumentHighlightKind::READ, + label::Origin::ReferenceRange(_) => DocumentHighlightKind::READ, + }); + + highlights.push(DocumentHighlight { range, kind }); } Some(highlights) diff --git a/support/texlab/src/features/hover.rs b/support/texlab/src/features/hover.rs index 8663f6256d..27d07f74cd 100644 --- a/support/texlab/src/features/hover.rs +++ b/support/texlab/src/features/hover.rs @@ -5,43 +5,32 @@ mod field; mod label; mod string_ref; -use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent, MarkupKind}; +use lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, Position, Url}; use rowan::TextRange; use crate::{ - features::{cursor::CursorContext, hover::citation::find_citation_hover}, - LineIndexExt, + util::{cursor::CursorContext, line_index_ext::LineIndexExt}, + Db, }; -use self::{ - component::find_component_hover, entry_type::find_entry_type_hover, field::find_field_hover, - label::find_label_hover, string_ref::find_string_reference_hover, -}; - -use super::FeatureRequest; - -pub fn find_hover(request: FeatureRequest<HoverParams>) -> Option<Hover> { - let context = CursorContext::new(request); +pub fn find(db: &dyn Db, uri: &Url, position: Position) -> Option<Hover> { + let context = CursorContext::new(db, uri, position, ())?; log::debug!("[Hover] Cursor: {:?}", context.cursor); - let result = find_label_hover(&context) - .or_else(|| find_citation_hover(&context)) - .or_else(|| find_component_hover(&context)) - .or_else(|| find_string_reference_hover(&context)) - .or_else(|| find_field_hover(&context)) - .or_else(|| find_entry_type_hover(&context))?; + let result = label::find_hover(&context) + .or_else(|| citation::find_hover(&context)) + .or_else(|| component::find_hover(&context)) + .or_else(|| string_ref::find_hover(&context)) + .or_else(|| field::find_hover(&context)) + .or_else(|| entry_type::find_hover(&context))?; + + let line_index = context.document.contents(db).line_index(db); Some(Hover { contents: HoverContents::Markup(MarkupContent { kind: result.value_kind, value: result.value, }), - range: Some( - context - .request - .main_document() - .line_index - .line_col_lsp_range(result.range), - ), + range: Some(line_index.line_col_lsp_range(result.range)), }) } diff --git a/support/texlab/src/features/hover/citation.rs b/support/texlab/src/features/hover/citation.rs index 5e86019eee..e0e17176d5 100644 --- a/support/texlab/src/features/hover/citation.rs +++ b/support/texlab/src/features/hover/citation.rs @@ -1,28 +1,23 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; use rowan::ast::AstNode; -use crate::{citation, features::cursor::CursorContext, syntax::bibtex}; +use crate::{citation, syntax::bibtex, util::cursor::CursorContext}; use super::HoverResult; -pub(super) fn find_citation_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { let (key, range) = context .find_citation_key_word() .or_else(|| context.find_citation_key_command()) .or_else(|| context.find_entry_key())?; - let value = context - .request - .workspace - .documents_by_uri - .values() - .find_map(|document| { - let data = document.data.as_bibtex()?; - let root = bibtex::SyntaxNode::new_root(data.green.clone()); - let root = bibtex::Root::cast(root)?; - let entry = root.find_entry(&key)?; - citation::render(&entry) - })?; + let value = context.related().find_map(|document| { + let data = document.parse(context.db).as_bib()?; + let root = data.root(context.db); + let root = bibtex::Root::cast(root)?; + let entry = root.find_entry(&key)?; + citation::render(&entry) + })?; Some(HoverResult { range, diff --git a/support/texlab/src/features/hover/component.rs b/support/texlab/src/features/hover/component.rs index 737a99d3ea..61a428a9ce 100644 --- a/support/texlab/src/features/hover/component.rs +++ b/support/texlab/src/features/hover/component.rs @@ -1,25 +1,28 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; -use crate::{component_db::COMPONENT_DATABASE, features::cursor::CursorContext, syntax::latex}; +use crate::{ + db::analysis::TexLinkKind, + util::{components::COMPONENT_DATABASE, cursor::CursorContext}, +}; use super::HoverResult; -pub(super) fn find_component_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { - let data = context.request.main_document().data.as_latex()?; - for link in &data.extras.explicit_links { - if matches!( - link.kind, - latex::ExplicitLinkKind::Package | latex::ExplicitLinkKind::Class - ) && link.stem_range.contains_inclusive(context.offset) - { - let value = COMPONENT_DATABASE.documentation(&link.stem)?.value; - return Some(HoverResult { +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { + let db = context.db; + let links = context.document.parse(db).as_tex()?.analyze(db).links(db); + links + .iter() + .filter(|link| matches!(link.kind(db), TexLinkKind::Sty | TexLinkKind::Cls)) + .filter(|link| link.range(db).contains_inclusive(context.offset)) + .find_map(|link| { + let value = COMPONENT_DATABASE + .documentation(link.path(db).text(db))? + .value; + + Some(HoverResult { value, value_kind: MarkupKind::PlainText, - range: link.stem_range, - }); - } - } - - None + range: link.range(db), + }) + }) } diff --git a/support/texlab/src/features/hover/entry_type.rs b/support/texlab/src/features/hover/entry_type.rs index 41a561395c..0f4ccbdb72 100644 --- a/support/texlab/src/features/hover/entry_type.rs +++ b/support/texlab/src/features/hover/entry_type.rs @@ -1,13 +1,16 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; -use crate::{features::cursor::CursorContext, syntax::bibtex, LANGUAGE_DATA}; +use crate::{ + syntax::bibtex, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, +}; use super::HoverResult; -pub(super) fn find_entry_type_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { let name = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::TYPE)?; let docs = LANGUAGE_DATA.entry_type_documentation(&name.text()[1..])?; diff --git a/support/texlab/src/features/hover/field.rs b/support/texlab/src/features/hover/field.rs index 6102bd6b68..48193997d6 100644 --- a/support/texlab/src/features/hover/field.rs +++ b/support/texlab/src/features/hover/field.rs @@ -1,14 +1,17 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; use rowan::ast::AstNode; -use crate::{features::cursor::CursorContext, syntax::bibtex, LANGUAGE_DATA}; +use crate::{ + syntax::bibtex, + util::{cursor::CursorContext, lang_data::LANGUAGE_DATA}, +}; use super::HoverResult; -pub(super) fn find_field_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { let name = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::NAME)?; bibtex::Field::cast(name.parent()?)?; diff --git a/support/texlab/src/features/hover/label.rs b/support/texlab/src/features/hover/label.rs index 2f8489d769..eafc104de6 100644 --- a/support/texlab/src/features/hover/label.rs +++ b/support/texlab/src/features/hover/label.rs @@ -1,19 +1,23 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; -use crate::{features::cursor::CursorContext, render_label}; +use crate::{ + db::Word, + util::{self, cursor::CursorContext}, +}; use super::HoverResult; -pub(super) fn find_label_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { let (name_text, range) = context .find_label_name_key() .or_else(|| context.find_label_name_command())?; - let label = render_label(&context.request.workspace, &name_text, None)?; - - Some(HoverResult { - range, - value: label.reference(), - value_kind: MarkupKind::PlainText, - }) + let db = context.db; + util::label::find_label_definition(db, context.document, Word::new(db, name_text)) + .and_then(|(document, label)| util::label::render(db, document, label)) + .map(|label| HoverResult { + range, + value: label.reference(db), + value_kind: MarkupKind::PlainText, + }) } diff --git a/support/texlab/src/features/hover/string_ref.rs b/support/texlab/src/features/hover/string_ref.rs index adccdd556c..41c4c5bddb 100644 --- a/support/texlab/src/features/hover/string_ref.rs +++ b/support/texlab/src/features/hover/string_ref.rs @@ -1,29 +1,28 @@ -use lsp_types::{HoverParams, MarkupKind}; +use lsp_types::MarkupKind; use rowan::ast::AstNode; use crate::{ citation::field::text::TextFieldData, - features::cursor::CursorContext, syntax::bibtex::{self, HasName, HasValue}, + util::cursor::CursorContext, }; use super::HoverResult; -pub(super) fn find_string_reference_hover( - context: &CursorContext<HoverParams>, -) -> Option<HoverResult> { - let data = context.request.main_document().data.as_bibtex()?; +pub(super) fn find_hover(context: &CursorContext) -> Option<HoverResult> { + let data = context.document.parse(context.db).as_bib()?; let name = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::NAME) .filter(|token| { let parent = token.parent().unwrap(); bibtex::Value::can_cast(parent.kind()) || bibtex::StringDef::can_cast(parent.kind()) })?; - for string in bibtex::SyntaxNode::new_root(data.green.clone()) + for string in data + .root(context.db) .children() .filter_map(bibtex::StringDef::cast) { diff --git a/support/texlab/src/features/inlay_hint.rs b/support/texlab/src/features/inlay_hint.rs new file mode 100644 index 0000000000..6d53259900 --- /dev/null +++ b/support/texlab/src/features/inlay_hint.rs @@ -0,0 +1,45 @@ +mod label; + +use lsp_types::{InlayHint, InlayHintLabel, Range, Url}; +use rowan::TextSize; + +use crate::{ + db::Workspace, + util::{line_index::LineIndex, line_index_ext::LineIndexExt}, + Db, +}; + +pub fn find_all(db: &dyn Db, uri: &Url, range: Range) -> Option<Vec<InlayHint>> { + let document = Workspace::get(db).lookup_uri(db, uri)?; + let line_index = document.contents(db).line_index(db); + + let mut builder = InlayHintBuilder { + line_index, + hints: Vec::new(), + }; + + let range = line_index.offset_lsp_range(range); + label::find_hints(db, document, range, &mut builder); + Some(builder.hints) +} + +struct InlayHintBuilder<'db> { + line_index: &'db LineIndex, + hints: Vec<InlayHint>, +} + +impl<'db> InlayHintBuilder<'db> { + pub fn push(&mut self, offset: TextSize, text: String) { + let position = self.line_index.line_col_lsp(offset); + self.hints.push(InlayHint { + position, + label: InlayHintLabel::String(text), + kind: None, + text_edits: None, + tooltip: None, + padding_left: Some(true), + padding_right: None, + data: None, + }); + } +} diff --git a/support/texlab/src/features/inlay_hint/label.rs b/support/texlab/src/features/inlay_hint/label.rs new file mode 100644 index 0000000000..5654f79bf4 --- /dev/null +++ b/support/texlab/src/features/inlay_hint/label.rs @@ -0,0 +1,31 @@ +use rowan::TextRange; + +use crate::{ + db::{analysis::label, Document}, + util, Db, +}; + +use super::InlayHintBuilder; + +pub(super) fn find_hints( + db: &dyn Db, + document: Document, + range: TextRange, + builder: &mut InlayHintBuilder, +) -> Option<()> { + let data = document.parse(db).as_tex()?; + for label in data + .analyze(db) + .labels(db) + .iter() + .copied() + .filter(|label| matches!(label.origin(db), label::Origin::Definition(_))) + .filter(|label| label.range(db).intersect(range).is_some()) + { + if let Some(rendered) = util::label::render(db, document, label) { + builder.push(label.range(db).end(), rendered.reference(db)); + } + } + + Some(()) +} diff --git a/support/texlab/src/features/link.rs b/support/texlab/src/features/link.rs index c4ce4413f5..71bba58ba7 100644 --- a/support/texlab/src/features/link.rs +++ b/support/texlab/src/features/link.rs @@ -1,33 +1,41 @@ mod include; -use std::sync::Arc; - -use lsp_types::{DocumentLink, DocumentLinkParams, Url}; +use lsp_types::{DocumentLink, Url}; use rowan::TextRange; -use crate::LineIndexExt; +use crate::{ + db::{Document, Workspace}, + util::{line_index::LineIndex, line_index_ext::LineIndexExt}, + Db, +}; -use self::include::find_include_links; +pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<DocumentLink>> { + let document = Workspace::get(db).lookup_uri(db, uri)?; + let mut builder = LinkBuilder { + db, + line_index: document.contents(db).line_index(db), + links: Vec::new(), + }; -use super::FeatureRequest; + include::find_links(db, document, &mut builder); + Some(builder.links) +} -pub fn find_document_links(request: FeatureRequest<DocumentLinkParams>) -> Vec<DocumentLink> { - let document = request.main_document(); - let mut results = Vec::new(); - find_include_links(&request, &mut results); - results - .into_iter() - .map(|result| DocumentLink { - range: document.line_index.line_col_lsp_range(result.range), - target: Some(result.target.as_ref().clone()), - tooltip: None, - data: None, - }) - .collect() +struct LinkBuilder<'db> { + db: &'db dyn Db, + line_index: &'db LineIndex, + links: Vec<DocumentLink>, } -#[derive(Debug, Clone)] -struct LinkResult { - range: TextRange, - target: Arc<Url>, +impl<'db> LinkBuilder<'db> { + pub fn push(&mut self, range: TextRange, target: Document) { + let range = self.line_index.line_col_lsp_range(range); + let target = Some(target.location(self.db).uri(self.db).clone()); + self.links.push(DocumentLink { + range, + target, + tooltip: None, + data: None, + }); + } } diff --git a/support/texlab/src/features/link/include.rs b/support/texlab/src/features/link/include.rs index b4d1804cce..f0c9d147fb 100644 --- a/support/texlab/src/features/link/include.rs +++ b/support/texlab/src/features/link/include.rs @@ -1,31 +1,23 @@ -use std::sync::Arc; +use crate::{ + db::{dependency_graph, Document, Workspace}, + Db, +}; -use lsp_types::DocumentLinkParams; +use super::LinkBuilder; -use crate::features::FeatureRequest; +pub(super) fn find_links(db: &dyn Db, document: Document, builder: &mut LinkBuilder) -> Option<()> { + let workspace = Workspace::get(db); + let parent = workspace + .parents(db, document) + .iter() + .next() + .copied() + .unwrap_or(document); -use super::LinkResult; - -pub(super) fn find_include_links( - request: &FeatureRequest<DocumentLinkParams>, - results: &mut Vec<LinkResult>, -) -> Option<()> { - let data = request.main_document().data.as_latex()?; - - for include in &data.extras.explicit_links { - for target in &include.targets { - if request - .workspace - .documents_by_uri - .values() - .any(|document| document.uri.as_ref() == target.as_ref()) - { - results.push(LinkResult { - range: include.stem_range, - target: Arc::clone(target), - }); - break; - } + let graph = dependency_graph(db, parent); + for edge in graph.edges.iter().filter(|edge| edge.source == document) { + if let Some(origin) = edge.origin { + builder.push(origin.link.range(db), edge.target); } } diff --git a/support/texlab/src/features/reference.rs b/support/texlab/src/features/reference.rs index f84a3f67d5..54a5fefb27 100644 --- a/support/texlab/src/features/reference.rs +++ b/support/texlab/src/features/reference.rs @@ -2,40 +2,45 @@ mod entry; mod label; mod string; -use std::sync::Arc; - -use lsp_types::{Location, ReferenceParams, Url}; +use lsp_types::{Location, Position, ReferenceContext, Url}; use rowan::TextRange; -use crate::LineIndexExt; - -use self::{ - entry::find_entry_references, label::find_label_references, string::find_string_references, +use crate::{ + db::Document, + util::{cursor::CursorContext, line_index_ext::LineIndexExt}, + Db, }; -use super::{cursor::CursorContext, FeatureRequest}; - -pub fn find_all_references(request: FeatureRequest<ReferenceParams>) -> Vec<Location> { +pub fn find_all( + db: &dyn Db, + uri: &Url, + position: Position, + params: &ReferenceContext, +) -> Option<Vec<Location>> { let mut results = Vec::new(); - let context = CursorContext::new(request); + let context = CursorContext::new(db, uri, position, params)?; log::debug!("[References] Cursor: {:?}", context.cursor); - find_label_references(&context, &mut results); - find_entry_references(&context, &mut results); - find_string_references(&context, &mut results); + label::find_all_references(&context, &mut results); + entry::find_all_references(&context, &mut results); + string::find_all_references(&context, &mut results); - results + let locations = results .into_iter() .map(|result| Location { - uri: result.uri.as_ref().clone(), - range: context.request.workspace.documents_by_uri[&result.uri] - .line_index + uri: result.document.location(db).uri(db).clone(), + range: result + .document + .contents(db) + .line_index(db) .line_col_lsp_range(result.range), }) - .collect() + .collect(); + + Some(locations) } #[derive(Debug, Clone)] struct ReferenceResult { - uri: Arc<Url>, + document: Document, range: TextRange, } diff --git a/support/texlab/src/features/reference/entry.rs b/support/texlab/src/features/reference/entry.rs index 0144d2d074..3dfa10da5b 100644 --- a/support/texlab/src/features/reference/entry.rs +++ b/support/texlab/src/features/reference/entry.rs @@ -1,32 +1,31 @@ -use std::sync::Arc; - -use lsp_types::ReferenceParams; +use lsp_types::ReferenceContext; use rowan::ast::AstNode; use crate::{ - features::cursor::CursorContext, + db::parse::DocumentData, syntax::{ bibtex::{self, HasName}, latex, }, - DocumentData, + util::cursor::CursorContext, }; use super::ReferenceResult; -pub(super) fn find_entry_references( - context: &CursorContext<ReferenceParams>, +pub(super) fn find_all_references( + context: &CursorContext<&ReferenceContext>, results: &mut Vec<ReferenceResult>, ) -> Option<()> { + let db = context.db; let (key_text, _) = context .find_citation_key_word() .or_else(|| context.find_citation_key_command()) .or_else(|| context.find_entry_key())?; - for document in context.request.workspace.documents_by_uri.values() { - match &document.data { - DocumentData::Latex(data) => { - latex::SyntaxNode::new_root(data.green.clone()) + for document in context.related() { + match document.parse(db) { + DocumentData::Tex(data) => { + data.root(db) .descendants() .filter_map(latex::Citation::cast) .filter_map(|citation| citation.key_list()) @@ -34,24 +33,22 @@ pub(super) fn find_entry_references( .filter(|key| key.to_string() == key_text) .map(|key| latex::small_range(&key)) .for_each(|range| { - let uri = Arc::clone(&document.uri); - results.push(ReferenceResult { uri, range }); + results.push(ReferenceResult { document, range }); }); } - DocumentData::Bibtex(data) if context.request.params.context.include_declaration => { - bibtex::SyntaxNode::new_root(data.green.clone()) + DocumentData::Bib(data) if context.params.include_declaration => { + data.root(db) .children() .filter_map(bibtex::Entry::cast) .filter_map(|entry| entry.name_token()) .filter(|key| key.text() == key_text) .map(|key| key.text_range()) .for_each(|range| { - let uri = Arc::clone(&document.uri); - results.push(ReferenceResult { uri, range }); + results.push(ReferenceResult { document, range }); }); } - DocumentData::Bibtex(_) | DocumentData::BuildLog(_) => {} - } + DocumentData::Bib(_) | DocumentData::Log(_) => {} + }; } Some(()) diff --git a/support/texlab/src/features/reference/label.rs b/support/texlab/src/features/reference/label.rs index 3dadada08b..394542320c 100644 --- a/support/texlab/src/features/reference/label.rs +++ b/support/texlab/src/features/reference/label.rs @@ -1,33 +1,32 @@ -use std::sync::Arc; +use lsp_types::ReferenceContext; -use lsp_types::ReferenceParams; - -use crate::features::cursor::CursorContext; +use crate::util::cursor::CursorContext; use super::ReferenceResult; -pub(super) fn find_label_references( - context: &CursorContext<ReferenceParams>, +pub(super) fn find_all_references( + context: &CursorContext<&ReferenceContext>, results: &mut Vec<ReferenceResult>, ) -> Option<()> { + let db = context.db; let (name_text, _) = context .find_label_name_key() .or_else(|| context.find_label_name_command())?; - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - for name in data - .extras - .label_names + for document in context.related() { + if let Some(data) = document.parse(db).as_tex() { + for label in data + .analyze(db) + .labels(db) .iter() - .filter(|name| name.text == name_text) - .filter(|name| { - !name.is_definition || context.request.params.context.include_declaration + .filter(|label| label.name(db).text(db) == &name_text) + .filter(|label| { + label.origin(db).as_definition().is_none() || context.params.include_declaration }) { results.push(ReferenceResult { - uri: Arc::clone(&document.uri), - range: name.range, + document, + range: label.range(db), }); } } diff --git a/support/texlab/src/features/reference/string.rs b/support/texlab/src/features/reference/string.rs index c00cf93546..c4bc6ded3d 100644 --- a/support/texlab/src/features/reference/string.rs +++ b/support/texlab/src/features/reference/string.rs @@ -1,22 +1,21 @@ -use std::sync::Arc; - -use lsp_types::ReferenceParams; +use lsp_types::ReferenceContext; use rowan::ast::AstNode; use crate::{ - features::cursor::CursorContext, syntax::bibtex::{self, HasName}, + util::cursor::CursorContext, }; use super::ReferenceResult; -pub(super) fn find_string_references( - context: &CursorContext<ReferenceParams>, +pub(super) fn find_all_references( + context: &CursorContext<&ReferenceContext>, results: &mut Vec<ReferenceResult>, ) -> Option<()> { + let db = context.db; let name_text = context .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::NAME) .filter(|token| { let parent = token.parent().unwrap(); @@ -24,14 +23,11 @@ pub(super) fn find_string_references( })? .text(); - let document = context.request.main_document(); - let data = document.data.as_bibtex()?; - for node in bibtex::SyntaxNode::new_root(data.green.clone()).descendants() { + let data = context.document.parse(db).as_bib()?; + for node in data.root(db).descendants() { if let Some(name) = bibtex::StringDef::cast(node.clone()) .and_then(|string| string.name_token()) - .filter(|name| { - context.request.params.context.include_declaration && name.text() == name_text - }) + .filter(|name| context.params.include_declaration && name.text() == name_text) .or_else(|| { bibtex::Value::cast(node) .and_then(|token| token.syntax().first_token()) @@ -39,7 +35,7 @@ pub(super) fn find_string_references( }) { results.push(ReferenceResult { - uri: Arc::clone(&document.uri), + document: context.document, range: name.text_range(), }); } diff --git a/support/texlab/src/features/rename.rs b/support/texlab/src/features/rename.rs index c21faf262e..57e1ef5763 100644 --- a/support/texlab/src/features/rename.rs +++ b/support/texlab/src/features/rename.rs @@ -2,57 +2,61 @@ mod command; mod entry; mod label; -use std::sync::Arc; - -use lsp_types::{Range, RenameParams, TextDocumentPositionParams, TextEdit, Url, WorkspaceEdit}; +use lsp_types::{Position, Range, TextEdit, Url, WorkspaceEdit}; use rowan::TextRange; use rustc_hash::FxHashMap; -use crate::LineIndexExt; - -use self::{ - command::{prepare_command_rename, rename_command}, - entry::{prepare_entry_rename, rename_entry}, - label::{prepare_label_rename, rename_label}, +use crate::{ + db::Document, + util::{cursor::CursorContext, line_index_ext::LineIndexExt}, + Db, }; -use super::{cursor::CursorContext, FeatureRequest}; - -pub fn prepare_rename_all(request: FeatureRequest<TextDocumentPositionParams>) -> Option<Range> { - let context = CursorContext::new(request); - let range = prepare_entry_rename(&context) - .or_else(|| prepare_label_rename(&context)) - .or_else(|| prepare_command_rename(&context))?; +pub fn prepare_rename_all(db: &dyn Db, uri: &Url, position: Position) -> Option<Range> { + let context = CursorContext::new(db, uri, position, ())?; + let range = entry::prepare_rename(&context) + .or_else(|| label::prepare_rename(&context)) + .or_else(|| command::prepare_rename(&context))?; - let line_index = &context.request.main_document().line_index; + let line_index = context.document.contents(db).line_index(db); Some(line_index.line_col_lsp_range(range)) } -pub fn rename_all(request: FeatureRequest<RenameParams>) -> Option<WorkspaceEdit> { - let context = CursorContext::new(request); - let result = rename_entry(&context) - .or_else(|| rename_label(&context)) - .or_else(|| rename_command(&context))?; +pub fn rename_all( + db: &dyn Db, + uri: &Url, + position: Position, + new_name: String, +) -> Option<WorkspaceEdit> { + let context = CursorContext::new(db, uri, position, Params { new_name })?; + let result = entry::rename(&context) + .or_else(|| label::rename(&context)) + .or_else(|| command::rename(&context))?; let changes = result .changes .into_iter() - .map(|(uri, old_edits)| { - let document = &context.request.workspace.documents_by_uri[&uri]; + .map(|(document, old_edits)| { + let line_index = document.contents(db).line_index(db); let new_edits = old_edits .into_iter() .map(|Indel { delete, insert }| { - TextEdit::new(document.line_index.line_col_lsp_range(delete), insert) + TextEdit::new(line_index.line_col_lsp_range(delete), insert) }) .collect(); - (uri.as_ref().clone(), new_edits) + (document.location(db).uri(db).clone(), new_edits) }) .collect(); Some(WorkspaceEdit::new(changes)) } +#[derive(Debug)] +struct Params { + new_name: String, +} + #[derive(Debug, PartialEq, Eq, Clone)] struct Indel { delete: TextRange, @@ -61,5 +65,5 @@ struct Indel { #[derive(Debug, PartialEq, Eq, Clone)] struct RenameResult { - changes: FxHashMap<Arc<Url>, Vec<Indel>>, + changes: FxHashMap<Document, Vec<Indel>>, } diff --git a/support/texlab/src/features/rename/command.rs b/support/texlab/src/features/rename/command.rs index aaa08f8cb4..5610b2f7ee 100644 --- a/support/texlab/src/features/rename/command.rs +++ b/support/texlab/src/features/rename/command.rs @@ -1,29 +1,21 @@ -use std::sync::Arc; - -use lsp_types::RenameParams; use rowan::{TextRange, TextSize}; use rustc_hash::FxHashMap; -use crate::{ - features::cursor::{CursorContext, HasPosition}, - syntax::latex, -}; +use crate::util::cursor::CursorContext; -use super::{Indel, RenameResult}; +use super::{Indel, Params, RenameResult}; -pub(super) fn prepare_command_rename<P: HasPosition>( - context: &CursorContext<P>, -) -> Option<TextRange> { +pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> { context.cursor.command_range(context.offset) } -pub(super) fn rename_command(context: &CursorContext<RenameParams>) -> Option<RenameResult> { - prepare_command_rename(context)?; - let name = context.cursor.as_latex()?.text(); +pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> { + prepare_rename(context)?; + let name = context.cursor.as_tex()?.text(); let mut changes = FxHashMap::default(); - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - let root = latex::SyntaxNode::new_root(data.green.clone()); + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { + let root = data.root(context.db); let edits = root .descendants_with_tokens() .filter_map(|element| element.into_token()) @@ -32,12 +24,12 @@ pub(super) fn rename_command(context: &CursorContext<RenameParams>) -> Option<Re let range = token.text_range(); Indel { delete: TextRange::new(range.start() + TextSize::from(1), range.end()), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), } }) .collect(); - changes.insert(Arc::clone(&document.uri), edits); + changes.insert(document, edits); } } diff --git a/support/texlab/src/features/rename/entry.rs b/support/texlab/src/features/rename/entry.rs index 6eac79030b..79ee25ac71 100644 --- a/support/texlab/src/features/rename/entry.rs +++ b/support/texlab/src/features/rename/entry.rs @@ -1,23 +1,18 @@ -use std::sync::Arc; - -use lsp_types::RenameParams; use rowan::{ast::AstNode, TextRange}; use rustc_hash::FxHashMap; use crate::{ - features::cursor::{CursorContext, HasPosition}, + db::parse::DocumentData, syntax::{ bibtex::{self, HasName}, latex, }, - DocumentData, + util::cursor::CursorContext, }; -use super::{Indel, RenameResult}; +use super::{Indel, Params, RenameResult}; -pub(super) fn prepare_entry_rename<P: HasPosition>( - context: &CursorContext<P>, -) -> Option<TextRange> { +pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> { let (_, range) = context .find_citation_key_word() .or_else(|| context.find_entry_key())?; @@ -25,18 +20,17 @@ pub(super) fn prepare_entry_rename<P: HasPosition>( Some(range) } -pub(super) fn rename_entry(context: &CursorContext<RenameParams>) -> Option<RenameResult> { - prepare_entry_rename(context)?; +pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> { + prepare_rename(context)?; let (key_text, _) = context .find_citation_key_word() .or_else(|| context.find_entry_key())?; let mut changes = FxHashMap::default(); - for document in context.request.workspace.documents_by_uri.values() { - let uri = Arc::clone(&document.uri); - match &document.data { - DocumentData::Latex(data) => { - let root = latex::SyntaxNode::new_root(data.green.clone()); + for document in context.related() { + match document.parse(context.db) { + DocumentData::Tex(data) => { + let root = data.root(context.db); let edits: Vec<_> = root .descendants() .filter_map(latex::Citation::cast) @@ -45,13 +39,13 @@ pub(super) fn rename_entry(context: &CursorContext<RenameParams>) -> Option<Rena .filter(|key| key.to_string() == key_text) .map(|key| Indel { delete: latex::small_range(&key), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }) .collect(); - changes.insert(uri, edits); + changes.insert(document, edits); } - DocumentData::Bibtex(data) => { - let root = bibtex::SyntaxNode::new_root(data.green.clone()); + DocumentData::Bib(data) => { + let root = data.root(context.db); let edits: Vec<_> = root .descendants() .filter_map(bibtex::Entry::cast) @@ -59,12 +53,12 @@ pub(super) fn rename_entry(context: &CursorContext<RenameParams>) -> Option<Rena .filter(|key| key.text() == key_text) .map(|key| Indel { delete: key.text_range(), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }) .collect(); - changes.insert(uri, edits); + changes.insert(document, edits); } - DocumentData::BuildLog(_) => {} + DocumentData::Log(_) => {} } } diff --git a/support/texlab/src/features/rename/label.rs b/support/texlab/src/features/rename/label.rs index 30a99c3b36..d38d13ae93 100644 --- a/support/texlab/src/features/rename/label.rs +++ b/support/texlab/src/features/rename/label.rs @@ -1,32 +1,24 @@ -use std::sync::Arc; - -use lsp_types::RenameParams; use rowan::{ast::AstNode, TextRange}; use rustc_hash::FxHashMap; -use crate::{ - features::cursor::{CursorContext, HasPosition}, - syntax::latex, -}; +use crate::{syntax::latex, util::cursor::CursorContext}; -use super::{Indel, RenameResult}; +use super::{Indel, Params, RenameResult}; -pub(super) fn prepare_label_rename<P: HasPosition>( - context: &CursorContext<P>, -) -> Option<TextRange> { +pub(super) fn prepare_rename<T>(context: &CursorContext<T>) -> Option<TextRange> { let (_, range) = context.find_label_name_key()?; Some(range) } -pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<RenameResult> { - prepare_label_rename(context)?; +pub(super) fn rename(context: &CursorContext<Params>) -> Option<RenameResult> { + prepare_rename(context)?; let (name_text, _) = context.find_label_name_key()?; let mut changes = FxHashMap::default(); - for document in context.request.workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { + for document in context.related() { + if let Some(data) = document.parse(context.db).as_tex() { let mut edits = Vec::new(); - for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { + for node in data.root(context.db).descendants() { if let Some(range) = latex::LabelDefinition::cast(node.clone()) .and_then(|label| label.name()) .and_then(|name| name.key()) @@ -35,7 +27,7 @@ pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<Rena { edits.push(Indel { delete: range, - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }); } @@ -47,7 +39,7 @@ pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<Rena .for_each(|name| { edits.push(Indel { delete: latex::small_range(&name), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }); }); @@ -59,7 +51,7 @@ pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<Rena { edits.push(Indel { delete: latex::small_range(&name1), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }); } @@ -70,13 +62,13 @@ pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<Rena { edits.push(Indel { delete: latex::small_range(&name2), - insert: context.request.params.new_name.clone(), + insert: context.params.new_name.clone(), }); } } } - changes.insert(Arc::clone(&document.uri), edits); + changes.insert(document, edits); } } diff --git a/support/texlab/src/features/symbol.rs b/support/texlab/src/features/symbol.rs index 24d599c3e1..c16193efcb 100644 --- a/support/texlab/src/features/symbol.rs +++ b/support/texlab/src/features/symbol.rs @@ -3,49 +3,44 @@ mod latex; mod project_order; mod types; -use std::{cmp::Reverse, sync::Arc}; +use std::cmp::Reverse; -use lsp_types::{ - DocumentSymbolParams, DocumentSymbolResponse, PartialResultParams, SymbolInformation, - TextDocumentIdentifier, WorkDoneProgressParams, WorkspaceSymbolParams, -}; +use lsp_types::{DocumentSymbolResponse, SymbolInformation, Url, WorkspaceSymbolParams}; -use crate::{ClientCapabilitiesExt, Workspace}; +use crate::{db::Workspace, util::capabilities::ClientCapabilitiesExt, Db}; -use self::{ - bibtex::find_bibtex_symbols, latex::find_latex_symbols, project_order::ProjectOrdering, - types::InternalSymbol, -}; +use self::project_order::ProjectOrdering; -use super::FeatureRequest; +pub fn find_document_symbols(db: &dyn Db, uri: &Url) -> Option<DocumentSymbolResponse> { + let workspace = Workspace::get(db); + let document = workspace.lookup_uri(db, uri)?; -#[must_use] -pub fn find_document_symbols(req: FeatureRequest<DocumentSymbolParams>) -> DocumentSymbolResponse { let mut buf = Vec::new(); - find_latex_symbols(&req, &mut buf); - find_bibtex_symbols(&req, &mut buf); - if req - .workspace - .environment - .client_capabilities + latex::find_symbols(db, document, &mut buf); + bibtex::find_symbols(db, document, &mut buf); + if workspace + .client_capabilities(db) .has_hierarchical_document_symbol_support() { - DocumentSymbolResponse::Nested( - buf.into_iter() - .map(InternalSymbol::into_document_symbol) - .collect(), - ) + let symbols = buf + .into_iter() + .map(|symbol| symbol.into_document_symbol(db)) + .collect(); + + Some(DocumentSymbolResponse::Nested(symbols)) } else { let mut new_buf = Vec::new(); for symbol in buf { symbol.flatten(&mut new_buf); } + let mut new_buf: Vec<_> = new_buf .into_iter() - .map(|symbol| symbol.into_symbol_info(req.main_document().uri.as_ref().clone())) + .map(|symbol| symbol.into_symbol_info(uri.clone())) .collect(); - sort_symbols(&req.workspace, &mut new_buf); - DocumentSymbolResponse::Flat(new_buf) + + sort_symbols(db, &mut new_buf); + Some(DocumentSymbolResponse::Flat(new_buf)) } } @@ -57,25 +52,16 @@ struct WorkspaceSymbol { #[must_use] pub fn find_workspace_symbols( - workspace: &Workspace, + db: &dyn Db, params: &WorkspaceSymbolParams, ) -> Vec<SymbolInformation> { let mut symbols = Vec::new(); - for document in workspace.documents_by_uri.values() { - let request = FeatureRequest { - uri: Arc::clone(&document.uri), - params: DocumentSymbolParams { - text_document: TextDocumentIdentifier::new(document.uri.as_ref().clone()), - partial_result_params: PartialResultParams::default(), - work_done_progress_params: WorkDoneProgressParams::default(), - }, - workspace: workspace.slice(&document.uri), - }; - + let workspace = Workspace::get(db); + for document in workspace.documents(db).iter().copied() { let mut buf = Vec::new(); - find_latex_symbols(&request, &mut buf); - find_bibtex_symbols(&request, &mut buf); + latex::find_symbols(db, document, &mut buf); + bibtex::find_symbols(db, document, &mut buf); let mut new_buf = Vec::new(); for symbol in buf { @@ -85,7 +71,7 @@ pub fn find_workspace_symbols( for symbol in new_buf { symbols.push(WorkspaceSymbol { search_text: symbol.search_text(), - info: symbol.into_symbol_info(document.uri.as_ref().clone()), + info: symbol.into_symbol_info(document.location(db).uri(db).clone()), }); } } @@ -95,6 +81,7 @@ pub fn find_workspace_symbols( .split_whitespace() .map(str::to_lowercase) .collect(); + let mut filtered = Vec::new(); for symbol in symbols { let mut included = true; @@ -109,20 +96,21 @@ pub fn find_workspace_symbols( filtered.push(symbol.info); } } - sort_symbols(workspace, &mut filtered); + + sort_symbols(db, &mut filtered); filtered } -fn sort_symbols(workspace: &Workspace, symbols: &mut [SymbolInformation]) { - let ordering = ProjectOrdering::from(workspace); +fn sort_symbols(db: &dyn Db, symbols: &mut [SymbolInformation]) { + let ordering = ProjectOrdering::new(db); symbols.sort_by(|left, right| { let left_key = ( - ordering.get(&left.location.uri), + ordering.get(db, &left.location.uri), left.location.range.start, Reverse(left.location.range.end), ); let right_key = ( - ordering.get(&right.location.uri), + ordering.get(db, &right.location.uri), right.location.range.start, Reverse(right.location.range.end), ); diff --git a/support/texlab/src/features/symbol/bibtex.rs b/support/texlab/src/features/symbol/bibtex.rs index bbc9026b0b..6a92405f17 100644 --- a/support/texlab/src/features/symbol/bibtex.rs +++ b/support/texlab/src/features/symbol/bibtex.rs @@ -1,82 +1,87 @@ -use lsp_types::DocumentSymbolParams; use rowan::ast::AstNode; use crate::{ - features::FeatureRequest, + db::Document, syntax::bibtex::{self, HasName, HasType}, - BibtexEntryTypeCategory, LineIndexExt, LANGUAGE_DATA, + util::{ + lang_data::{BibtexEntryTypeCategory, LANGUAGE_DATA}, + line_index::LineIndex, + line_index_ext::LineIndexExt, + }, + Db, }; use super::types::{InternalSymbol, InternalSymbolKind}; -pub fn find_bibtex_symbols( - request: &FeatureRequest<DocumentSymbolParams>, +pub fn find_symbols(db: &dyn Db, document: Document, buf: &mut Vec<InternalSymbol>) -> Option<()> { + let data = document.parse(db).as_bib()?; + let line_index = document.contents(db).line_index(db); + for node in data.root(db).children() { + process_string(node.clone(), line_index, buf) + .or_else(|| process_entry(node, line_index, buf)); + } + + Some(()) +} + +fn process_string( + node: bibtex::SyntaxNode, + line_index: &LineIndex, buf: &mut Vec<InternalSymbol>, ) -> Option<()> { - let main_document = request.main_document(); - let data = main_document.data.as_bibtex()?; - - for node in bibtex::SyntaxNode::new_root(data.green.clone()).children() { - if let Some(string) = bibtex::StringDef::cast(node.clone()) { - if let Some(name) = string.name_token() { - buf.push(InternalSymbol { - name: name.text().into(), - label: None, - kind: InternalSymbolKind::String, - deprecated: false, - full_range: main_document - .line_index - .line_col_lsp_range(string.syntax().text_range()), - selection_range: main_document - .line_index - .line_col_lsp_range(name.text_range()), - children: Vec::new(), - }) - } - } else if let Some(entry) = bibtex::Entry::cast(node) { - if let Some(ty) = entry.type_token() { - if let Some(key) = entry.name_token() { - let mut children = Vec::new(); - for field in entry.fields() { - if let Some(name) = field.name_token() { - let symbol = InternalSymbol { - name: name.text().to_string(), - label: None, - kind: InternalSymbolKind::Field, - deprecated: false, - full_range: main_document - .line_index - .line_col_lsp_range(field.syntax().text_range()), - selection_range: main_document - .line_index - .line_col_lsp_range(name.text_range()), - children: Vec::new(), - }; - children.push(symbol); - } - } + let string = bibtex::StringDef::cast(node)?; + let name = string.name_token()?; + buf.push(InternalSymbol { + name: name.text().into(), + label: None, + kind: InternalSymbolKind::String, + deprecated: false, + full_range: line_index.line_col_lsp_range(string.syntax().text_range()), + selection_range: line_index.line_col_lsp_range(name.text_range()), + children: Vec::new(), + }); - let category = LANGUAGE_DATA - .find_entry_type(&ty.text()[1..]) - .map(|ty| ty.category) - .unwrap_or(BibtexEntryTypeCategory::Misc); + Some(()) +} - buf.push(InternalSymbol { - name: key.to_string(), - label: None, - kind: InternalSymbolKind::Entry(category), - deprecated: false, - full_range: main_document - .line_index - .line_col_lsp_range(entry.syntax().text_range()), - selection_range: main_document - .line_index - .line_col_lsp_range(key.text_range()), - children, - }); - } - } +fn process_entry( + node: bibtex::SyntaxNode, + line_index: &LineIndex, + buf: &mut Vec<InternalSymbol>, +) -> Option<()> { + let entry = bibtex::Entry::cast(node)?; + let ty = entry.type_token()?; + let key = entry.name_token()?; + let mut children = Vec::new(); + for field in entry.fields() { + if let Some(name) = field.name_token() { + let symbol = InternalSymbol { + name: name.text().to_string(), + label: None, + kind: InternalSymbolKind::Field, + deprecated: false, + full_range: line_index.line_col_lsp_range(field.syntax().text_range()), + selection_range: line_index.line_col_lsp_range(name.text_range()), + children: Vec::new(), + }; + children.push(symbol); } } + + let category = LANGUAGE_DATA + .find_entry_type(&ty.text()[1..]) + .map(|ty| ty.category) + .unwrap_or(BibtexEntryTypeCategory::Misc); + + buf.push(InternalSymbol { + name: key.to_string(), + label: None, + kind: InternalSymbolKind::Entry(category), + deprecated: false, + full_range: line_index.line_col_lsp_range(entry.syntax().text_range()), + selection_range: line_index.line_col_lsp_range(key.text_range()), + children, + }); + Some(()) } diff --git a/support/texlab/src/features/symbol/latex.rs b/support/texlab/src/features/symbol/latex.rs index 8a88ffb0d9..81927ab515 100644 --- a/support/texlab/src/features/symbol/latex.rs +++ b/support/texlab/src/features/symbol/latex.rs @@ -1,38 +1,30 @@ use std::str::FromStr; -use lsp_types::{DocumentSymbolParams, Range}; +use lsp_types::Range; use rowan::ast::AstNode; -use smol_str::SmolStr; use titlecase::titlecase; use crate::{ - features::FeatureRequest, - find_caption_by_parent, find_label_number, + db::{Document, Word, Workspace}, syntax::latex::{self, HasBrack, HasCurly}, - LabelledFloatKind, LatexDocumentData, LineIndexExt, LANGUAGE_DATA, + util::{ + label::{find_caption_by_parent, LabeledFloatKind}, + lang_data::LANGUAGE_DATA, + line_index_ext::LineIndexExt, + }, + Db, }; use super::types::{InternalSymbol, InternalSymbolKind}; -pub fn find_latex_symbols( - request: &FeatureRequest<DocumentSymbolParams>, - buf: &mut Vec<InternalSymbol>, -) -> Option<()> { - let data = request.main_document().data.as_latex()?; - let mut context = Context { request, data }; - - let root = context.data.green.clone(); - let mut symbols = visit(&mut context, latex::SyntaxNode::new_root(root)); +pub fn find_symbols(db: &dyn Db, document: Document, buf: &mut Vec<InternalSymbol>) -> Option<()> { + let data = document.parse(db).as_tex()?; + let mut symbols = visit(db, document, data.root(db)); buf.append(&mut symbols); Some(()) } -struct Context<'a> { - request: &'a FeatureRequest<DocumentSymbolParams>, - data: &'a LatexDocumentData, -} - -fn visit(context: &mut Context, node: latex::SyntaxNode) -> Vec<InternalSymbol> { +fn visit(db: &dyn Db, document: Document, node: latex::SyntaxNode) -> Vec<InternalSymbol> { let symbol = match node.kind() { latex::PART | latex::CHAPTER @@ -40,9 +32,9 @@ fn visit(context: &mut Context, node: latex::SyntaxNode) -> Vec<InternalSymbol> | latex::SUBSECTION | latex::SUBSUBSECTION | latex::PARAGRAPH - | latex::SUBPARAGRAPH => visit_section(context, node.clone()), - latex::ENUM_ITEM => visit_enum_item(context, node.clone()), - latex::EQUATION => visit_equation(context, node.clone()), + | latex::SUBPARAGRAPH => visit_section(db, document, node.clone()), + latex::ENUM_ITEM => visit_enum_item(db, document, node.clone()), + latex::EQUATION => visit_equation(db, document, node.clone()), latex::ENVIRONMENT => latex::Environment::cast(node.clone()) .and_then(|env| env.begin()) .and_then(|begin| begin.name()) @@ -54,17 +46,17 @@ fn visit(context: &mut Context, node: latex::SyntaxNode) -> Vec<InternalSymbol> .iter() .any(|env| env == &name) { - visit_equation_environment(context, node.clone()) + visit_equation_environment(db, document, node.clone()) } else if LANGUAGE_DATA .enum_environments .iter() .any(|env| env == &name) { - visit_enumeration(context, node.clone(), &name) - } else if let Ok(float_kind) = LabelledFloatKind::from_str(&name) { - visit_float(context, node.clone(), float_kind) + visit_enumeration(db, document, node.clone(), &name) + } else if let Ok(float_kind) = LabeledFloatKind::from_str(&name) { + visit_float(db, document, node.clone(), float_kind) } else { - visit_theorem(context, node.clone(), &name) + visit_theorem(db, document, node.clone(), &name) } }), _ => None, @@ -73,39 +65,42 @@ fn visit(context: &mut Context, node: latex::SyntaxNode) -> Vec<InternalSymbol> match symbol { Some(mut parent) => { for child in node.children() { - parent.children.append(&mut visit(context, child)); + parent.children.append(&mut visit(db, document, child)); } vec![parent] } None => { let mut symbols = Vec::new(); for child in node.children() { - symbols.append(&mut visit(context, child)); + symbols.append(&mut visit(db, document, child)); } symbols } } } -fn visit_section(context: &mut Context, node: latex::SyntaxNode) -> Option<InternalSymbol> { +fn visit_section( + db: &dyn Db, + document: Document, + node: latex::SyntaxNode, +) -> Option<InternalSymbol> { let section = latex::Section::cast(node)?; - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(§ion)); let group = section.name()?; let group_text = group.content_text()?; - let symbol = match find_label_by_parent(context, section.syntax()) { + let symbol = match find_label_by_parent(db, document, section.syntax()) { Some(NumberedLabel { name: label, range: selection_range, number, }) => { let name = match number { - Some(number) => format!("{} {}", number, group_text), + Some(number) => format!("{} {}", number.text(db), group_text), None => group_text, }; @@ -129,10 +124,15 @@ fn visit_section(context: &mut Context, node: latex::SyntaxNode) -> Option<Inter children: Vec::new(), }, }; + Some(symbol) } -fn visit_enum_item(context: &mut Context, node: latex::SyntaxNode) -> Option<InternalSymbol> { +fn visit_enum_item( + db: &dyn Db, + document: Document, + node: latex::SyntaxNode, +) -> Option<InternalSymbol> { let enum_item = latex::EnumItem::cast(node.clone())?; if !enum_item .syntax() @@ -151,10 +151,9 @@ fn visit_enum_item(context: &mut Context, node: latex::SyntaxNode) -> Option<Int return None; } - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&enum_item)); let name = enum_item @@ -162,13 +161,15 @@ fn visit_enum_item(context: &mut Context, node: latex::SyntaxNode) -> Option<Int .and_then(|label| label.content_text()) .unwrap_or_else(|| "Item".to_string()); - let symbol = match find_label_by_parent(context, &node) { + let symbol = match find_label_by_parent(db, document, &node) { Some(NumberedLabel { name: label, range: selection_range, number, }) => InternalSymbol { - name: number.map(Into::into).unwrap_or_else(|| name.to_string()), + name: number + .map(|num| num.text(db).clone()) + .unwrap_or_else(|| name.clone()), label: Some(label), kind: InternalSymbolKind::EnumerationItem, deprecated: false, @@ -189,46 +190,50 @@ fn visit_enum_item(context: &mut Context, node: latex::SyntaxNode) -> Option<Int Some(symbol) } -fn visit_equation(context: &mut Context, node: latex::SyntaxNode) -> Option<InternalSymbol> { +fn visit_equation( + db: &dyn Db, + document: Document, + node: latex::SyntaxNode, +) -> Option<InternalSymbol> { let equation = latex::Equation::cast(node)?; - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&equation)); - make_equation_symbol(context, equation.syntax(), full_range) + make_equation_symbol(db, document, equation.syntax(), full_range) } fn visit_equation_environment( - context: &mut Context, + db: &dyn Db, + document: Document, node: latex::SyntaxNode, ) -> Option<InternalSymbol> { let environment = latex::Environment::cast(node)?; - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&environment)); - make_equation_symbol(context, environment.syntax(), full_range) + make_equation_symbol(db, document, environment.syntax(), full_range) } fn make_equation_symbol( - context: &mut Context, + db: &dyn Db, + document: Document, node: &latex::SyntaxNode, full_range: Range, ) -> Option<InternalSymbol> { - let symbol = match find_label_by_parent(context, node) { + let symbol = match find_label_by_parent(db, document, node) { Some(NumberedLabel { name: label, range: selection_range, number, }) => { let name = match number { - Some(number) => format!("Equation ({})", number), + Some(number) => format!("Equation ({})", number.text(db)), None => "Equation".to_string(), }; @@ -256,26 +261,26 @@ fn make_equation_symbol( } fn visit_enumeration( - context: &mut Context, + db: &dyn Db, + document: Document, node: latex::SyntaxNode, env_name: &str, ) -> Option<InternalSymbol> { let environment = latex::Environment::cast(node)?; - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&environment)); let name = titlecase(env_name); - let symbol = match find_label_by_parent(context, environment.syntax()) { + let symbol = match find_label_by_parent(db, document, environment.syntax()) { Some(NumberedLabel { name: label, range: selection_range, number, }) => { let name = match number { - Some(number) => format!("{} {}", name, number), + Some(number) => format!("{} {}", name, number.text(db)), None => name, }; @@ -303,33 +308,33 @@ fn visit_enumeration( } fn visit_float( - context: &mut Context, + db: &dyn Db, + document: Document, node: latex::SyntaxNode, - float_kind: LabelledFloatKind, + float_kind: LabeledFloatKind, ) -> Option<InternalSymbol> { let environment = latex::Environment::cast(node)?; - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&environment)); let (float_kind, symbol_kind) = match float_kind { - LabelledFloatKind::Algorithm => ("Algorithm", InternalSymbolKind::Algorithm), - LabelledFloatKind::Figure => ("Figure", InternalSymbolKind::Figure), - LabelledFloatKind::Listing => ("Listing", InternalSymbolKind::Listing), - LabelledFloatKind::Table => ("Table", InternalSymbolKind::Table), + LabeledFloatKind::Algorithm => ("Algorithm", InternalSymbolKind::Algorithm), + LabeledFloatKind::Figure => ("Figure", InternalSymbolKind::Figure), + LabeledFloatKind::Listing => ("Listing", InternalSymbolKind::Listing), + LabeledFloatKind::Table => ("Table", InternalSymbolKind::Table), }; let caption = find_caption_by_parent(environment.syntax())?; - let symbol = match find_label_by_parent(context, environment.syntax()) { + let symbol = match find_label_by_parent(db, document, environment.syntax()) { Some(NumberedLabel { name: label, range: selection_range, number, }) => { let name = match number { - Some(number) => format!("{} {}: {}", float_kind, number, caption), + Some(number) => format!("{} {}: {}", float_kind, number.text(db), caption), None => format!("{}: {}", float_kind, caption), }; @@ -358,23 +363,17 @@ fn visit_float( } fn visit_theorem( - context: &mut Context, + db: &dyn Db, + document: Document, node: latex::SyntaxNode, environment_name: &str, ) -> Option<InternalSymbol> { - let definition = context - .request - .workspace - .documents_by_uri - .values() - .filter_map(|document| document.data.as_latex()) - .find_map(|data| { - data.extras - .theorem_environments - .iter() - .find(|environment| environment.name == environment_name) - .cloned() - })?; + let definition = Workspace::get(db) + .related(db, document) + .iter() + .filter_map(|document| document.parse(db).as_tex()) + .flat_map(|data| data.analyze(db).theorem_environments(db)) + .find(|env| env.name(db).text(db) == environment_name)?; let node = latex::Environment::cast(node)?; let theorem_description = node @@ -382,13 +381,12 @@ fn visit_theorem( .options() .and_then(|option| option.content_text()); - let full_range = context - .request - .main_document() - .line_index + let full_range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&node)); - let symbol = match find_label_by_parent(context, node.syntax()) { + let symbol = match find_label_by_parent(db, document, node.syntax()) { Some(NumberedLabel { name: label, range: selection_range, @@ -396,11 +394,20 @@ fn visit_theorem( }) => { let name = match (number, theorem_description) { (Some(number), Some(desc)) => { - format!("{} {} ({})", definition.description, number, desc) + format!( + "{} {} ({})", + definition.description(db).text(db), + number.text(db), + desc + ) } - (Some(number), None) => format!("{} {}", definition.description, number), - (None, Some(desc)) => format!("{} ({})", definition.description, desc), - (None, None) => definition.description, + (Some(number), None) => format!( + "{} {}", + definition.description(db).text(db), + number.text(db) + ), + (None, Some(desc)) => format!("{} ({})", definition.description(db).text(db), desc), + (None, None) => definition.description(db).text(db).clone(), }; InternalSymbol { @@ -415,8 +422,8 @@ fn visit_theorem( } None => { let name = match theorem_description { - Some(desc) => format!("{} ({})", definition.description, desc), - None => definition.description, + Some(desc) => format!("{} ({})", definition.description(db).text(db), desc), + None => definition.description(db).text(db).clone(), }; InternalSymbol { name, @@ -434,28 +441,27 @@ fn visit_theorem( #[derive(Debug, PartialEq, Eq, Clone)] struct NumberedLabel { - name: String, + name: Word, range: Range, - number: Option<SmolStr>, + number: Option<Word>, } fn find_label_by_parent( - context: &mut Context, + db: &dyn Db, + document: Document, parent: &latex::SyntaxNode, ) -> Option<NumberedLabel> { let node = parent.children().find_map(latex::LabelDefinition::cast)?; - - let name = node.name()?.key()?.to_string(); - let range = context - .request - .main_document() - .line_index + let name = Word::new(db, node.name()?.key()?.to_string()); + let range = document + .contents(db) + .line_index(db) .line_col_lsp_range(latex::small_range(&node)); - let number = find_label_number(&context.request.workspace, &name); + let number = Workspace::get(db).number_of_label(db, document, name); Some(NumberedLabel { - name: name.to_string(), + name, range, - number: number.map(Into::into), + number, }) } diff --git a/support/texlab/src/features/symbol/project_order.rs b/support/texlab/src/features/symbol/project_order.rs index 794447ecf6..f4aeb63bca 100644 --- a/support/texlab/src/features/symbol/project_order.rs +++ b/support/texlab/src/features/symbol/project_order.rs @@ -1,209 +1,202 @@ -use std::{sync::Arc, usize}; - +use itertools::Itertools; use lsp_types::Url; -use petgraph::{algo::tarjan_scc, Directed, Graph}; -use rustc_hash::FxHashSet; -use crate::{Document, Workspace}; +use crate::{ + db::{dependency_graph, Document, Workspace}, + Db, +}; #[derive(Debug, PartialEq, Eq, Clone)] pub struct ProjectOrdering { - ordering: Vec<Arc<Url>>, + ordering: Vec<Document>, } impl ProjectOrdering { - pub fn get(&self, uri: &Url) -> usize { - self.ordering - .iter() - .position(|u| u.as_ref() == uri) - .unwrap_or(usize::MAX) - } -} - -impl From<&Workspace> for ProjectOrdering { - fn from(workspace: &Workspace) -> Self { - let mut ordering = Vec::new(); - let uris: FxHashSet<Arc<Url>> = workspace - .documents_by_uri - .values() - .map(|document| Arc::clone(&document.uri)) + pub fn new(db: &dyn Db) -> Self { + let workspace = Workspace::get(db); + + let ordering: Vec<_> = workspace + .index_files(db) + .chain(workspace.documents(db).iter().copied()) + .flat_map(|document| { + dependency_graph(db, document) + .preorder() + .rev() + .collect_vec() + }) + .unique() .collect(); - let comps = connected_components(workspace); - for comp in comps { - let (graph, documents) = build_dependency_graph(&comp); - - let mut visited = FxHashSet::default(); - let root_index = *graph.node_weight(tarjan_scc(&graph)[0][0]).unwrap(); - let mut stack = vec![Arc::clone(&documents[root_index].uri)]; - - while let Some(uri) = stack.pop() { - if !visited.insert(Arc::clone(&uri)) { - continue; - } - - ordering.push(Arc::clone(&uri)); - if let Some(document) = workspace.documents_by_uri.get(&uri) { - if let Some(data) = document.data.as_latex() { - for link in data.extras.explicit_links.iter().rev() { - for target in &link.targets { - if uris.contains(target.as_ref()) { - stack.push(Arc::clone(target)); - } - } - } - } - } - } - } - Self { ordering } } -} - -fn connected_components(workspace: &Workspace) -> Vec<Workspace> { - let mut components = Vec::new(); - let mut visited = FxHashSet::default(); - for root_document in workspace.documents_by_uri.values() { - if !visited.insert(Arc::clone(&root_document.uri)) { - continue; - } - - let slice = workspace.slice(&root_document.uri); - for uri in slice.documents_by_uri.keys() { - visited.insert(Arc::clone(uri)); - } - components.push(slice); - } - components -} -fn build_dependency_graph(workspace: &Workspace) -> (Graph<usize, (), Directed>, Vec<&Document>) { - let mut graph = Graph::new(); - let documents: Vec<_> = workspace.documents_by_uri.values().collect(); - let nodes: Vec<_> = (0..documents.len()).map(|i| graph.add_node(i)).collect(); - - for (i, document) in documents.iter().enumerate() { - if let Some(data) = document.data.as_latex() { - for link in &data.extras.explicit_links { - for target in &link.targets { - if let Some(j) = documents - .iter() - .position(|document| document.uri.as_ref() == target.as_ref()) - { - graph.add_edge(nodes[j], nodes[i], ()); - break; - } - } - } - } + pub fn get(&self, db: &dyn Db, uri: &Url) -> usize { + self.ordering + .iter() + .position(|doc| doc.location(db).uri(db) == uri) + .unwrap_or(std::usize::MAX) } - - (graph, documents) } #[cfg(test)] mod tests { - use std::sync::Arc; - - use anyhow::Result; - - use crate::DocumentLanguage; + use crate::{ + db::{Language, Owner}, + Database, + }; use super::*; #[test] - fn test_no_cycles() -> Result<()> { - let mut workspace = Workspace::default(); + fn test_no_cycles() { + let mut db = Database::default(); + let workspace = Workspace::get(&db); let a = workspace.open( - Arc::new(Url::parse("http://example.com/a.tex")?), - Arc::new(String::new()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/a.tex").unwrap(), + String::new(), + Language::Tex, + Owner::Client, + ); let b = workspace.open( - Arc::new(Url::parse("http://example.com/b.tex")?), - Arc::new(String::new()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/b.tex").unwrap(), + String::new(), + Language::Tex, + Owner::Client, + ); let c = workspace.open( - Arc::new(Url::parse("http://example.com/c.tex")?), - Arc::new(r#"\include{b}\include{a}"#.to_string()), - DocumentLanguage::Latex, - )?; - - let ordering = ProjectOrdering::from(&workspace); - - assert_eq!(ordering.get(&a.uri), 2); - assert_eq!(ordering.get(&b.uri), 1); - assert_eq!(ordering.get(&c.uri), 0); - Ok(()) + &mut db, + Url::parse("http://example.com/c.tex").unwrap(), + r#"\documentclass{article}\include{b}\include{a}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + let ordering = ProjectOrdering::new(&db); + + assert_eq!(ordering.get(&db, a.location(&db).uri(&db)), 0); + assert_eq!(ordering.get(&db, b.location(&db).uri(&db)), 1); + assert_eq!(ordering.get(&db, c.location(&db).uri(&db)), 2); } #[test] - fn test_cycles() -> Result<()> { - let mut workspace = Workspace::default(); + fn test_two_layers() { + let mut db = Database::default(); + let workspace = Workspace::get(&db); let a = workspace.open( - Arc::new(Url::parse("http://example.com/a.tex")?), - Arc::new(r#"\include{b}"#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/a.tex").unwrap(), + String::new(), + Language::Tex, + Owner::Client, + ); let b = workspace.open( - Arc::new(Url::parse("http://example.com/b.tex")?), - Arc::new(r#"\include{a}"#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/b.tex").unwrap(), + r#"\include{a}"#.to_string(), + Language::Tex, + Owner::Client, + ); let c = workspace.open( - Arc::new(Url::parse("http://example.com/c.tex")?), - Arc::new(r#"\include{a}"#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/c.tex").unwrap(), + r#"\documentclass{article}\include{b}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + let ordering = ProjectOrdering::new(&db); + + assert_eq!(ordering.get(&db, a.location(&db).uri(&db)), 0); + assert_eq!(ordering.get(&db, b.location(&db).uri(&db)), 1); + assert_eq!(ordering.get(&db, c.location(&db).uri(&db)), 2); + } - let ordering = ProjectOrdering::from(&workspace); + #[test] + fn test_cycles() { + let mut db = Database::default(); + let workspace = Workspace::get(&db); - assert_eq!(ordering.get(&a.uri), 1); - assert_eq!(ordering.get(&b.uri), 2); - assert_eq!(ordering.get(&c.uri), 0); - Ok(()) + let a = workspace.open( + &mut db, + Url::parse("http://example.com/a.tex").unwrap(), + r#"\documentclass{article}\include{b}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + workspace.open( + &mut db, + Url::parse("http://example.com/b.tex").unwrap(), + r#"\include{a}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + workspace.open( + &mut db, + Url::parse("http://example.com/c.tex").unwrap(), + r#"\include{a}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + let ordering = ProjectOrdering::new(&db); + assert_ne!(ordering.get(&db, a.location(&db).uri(&db)), 0); } #[test] - fn test_multiple_roots() -> Result<()> { - let mut workspace = Workspace::default(); + fn test_multiple_roots() { + let mut db = Database::default(); + let workspace = Workspace::get(&db); let a = workspace.open( - Arc::new(Url::parse("http://example.com/a.tex")?), - Arc::new(r#"\include{b}"#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/a.tex").unwrap(), + r#"\documentclass{article}\include{b}"#.to_string(), + Language::Tex, + Owner::Client, + ); let b = workspace.open( - Arc::new(Url::parse("http://example.com/b.tex")?), - Arc::new(r#""#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/b.tex").unwrap(), + String::new(), + Language::Tex, + Owner::Client, + ); let c = workspace.open( - Arc::new(Url::parse("http://example.com/c.tex")?), - Arc::new(r#""#.to_string()), - DocumentLanguage::Latex, - )?; + &mut db, + Url::parse("http://example.com/c.tex").unwrap(), + String::new(), + Language::Tex, + Owner::Client, + ); let d = workspace.open( - Arc::new(Url::parse("http://example.com/d.tex")?), - Arc::new(r#"\include{c}"#.to_string()), - DocumentLanguage::Latex, - )?; - - let ordering = ProjectOrdering::from(&workspace); - - assert!(ordering.get(&a.uri) < ordering.get(&b.uri)); - assert!(ordering.get(&d.uri) < ordering.get(&c.uri)); - Ok(()) + &mut db, + Url::parse("http://example.com/d.tex").unwrap(), + r#"\documentclass{article}\include{c}"#.to_string(), + Language::Tex, + Owner::Client, + ); + + let ordering = ProjectOrdering::new(&db); + assert!( + ordering.get(&db, b.location(&db).uri(&db)) + < ordering.get(&db, a.location(&db).uri(&db)) + ); + assert!( + ordering.get(&db, c.location(&db).uri(&db)) + < ordering.get(&db, d.location(&db).uri(&db)) + ); } } diff --git a/support/texlab/src/features/symbol/types.rs b/support/texlab/src/features/symbol/types.rs index 88e7ffcb86..be0ffeceda 100644 --- a/support/texlab/src/features/symbol/types.rs +++ b/support/texlab/src/features/symbol/types.rs @@ -1,6 +1,10 @@ use lsp_types::{DocumentSymbol, Location, Range, SymbolInformation, SymbolKind, Url}; -use crate::{features::lsp_kinds::Structure, BibtexEntryTypeCategory}; +use crate::{ + db::Word, + util::{lang_data::BibtexEntryTypeCategory, lsp_enums::Structure}, + Db, +}; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum InternalSymbolKind { @@ -39,7 +43,7 @@ impl InternalSymbolKind { #[derive(Debug, PartialEq, Eq, Clone)] pub struct InternalSymbol { pub name: String, - pub label: Option<String>, + pub label: Option<Word>, pub kind: InternalSymbolKind, pub deprecated: bool, pub full_range: Range, @@ -76,16 +80,17 @@ impl InternalSymbol { buffer.push(self); } - pub fn into_document_symbol(self) -> DocumentSymbol { + pub fn into_document_symbol(self, db: &dyn Db) -> DocumentSymbol { let children = self .children .into_iter() - .map(|child| child.into_document_symbol()) + .map(|child| child.into_document_symbol(db)) .collect(); + #[allow(deprecated)] DocumentSymbol { name: self.name, - detail: self.label, + detail: self.label.map(|word| word.text(db).clone()), kind: self.kind.into_symbol_kind(), deprecated: Some(self.deprecated), range: self.full_range, diff --git a/support/texlab/src/features/workspace_command.rs b/support/texlab/src/features/workspace_command.rs new file mode 100644 index 0000000000..8d6732cd1c --- /dev/null +++ b/support/texlab/src/features/workspace_command.rs @@ -0,0 +1,103 @@ +use std::process::Stdio; + +use anyhow::{bail, Result}; +use lsp_types::{TextDocumentIdentifier, Url}; +use thiserror::Error; + +use crate::{db::Workspace, normalize_uri, Db}; + +pub fn select(db: &dyn Db, name: &str, args: Vec<serde_json::Value>) -> Result<CleanCommand> { + Ok(match name { + "texlab.cleanAuxiliary" => CleanCommand::new(db, CleanOptions::Auxiliary, args)?, + "texlab.cleanArtifacts" => CleanCommand::new(db, CleanOptions::Artifacts, args)?, + _ => bail!("Unknown command: {}", name), + }) +} + +#[derive(Debug, Error)] +pub enum CleanError { + #[error("document '{0}' not found")] + DocumentNotFound(Url), + + #[error("document '{0}' is not a local file")] + NoLocalFile(Url), + + #[error("document was not provided as an argument")] + MissingArg, + + #[error("invalid argument: {0}")] + InvalidArg(serde_json::Error), + + #[error("failed to spawn process: {0}")] + Spawn(std::io::Error), +} + +#[derive(Debug)] +pub struct CleanCommand { + executable: String, + args: Vec<String>, +} + +impl CleanCommand { + fn new(db: &dyn Db, options: CleanOptions, args: Vec<serde_json::Value>) -> Result<Self> { + let params: TextDocumentIdentifier = + serde_json::from_value(args.into_iter().next().ok_or(CleanError::MissingArg)?) + .map_err(CleanError::InvalidArg)?; + + let mut uri = params.uri; + normalize_uri(&mut uri); + + let workspace = Workspace::get(db); + + let document = workspace + .lookup_uri(db, &uri) + .ok_or_else(|| CleanError::DocumentNotFound(uri.clone()))?; + + let working_dir = workspace.working_dir(db, document.directory(db)); + + let output_dir = workspace + .output_dir(db, working_dir) + .path(db) + .as_deref() + .ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?; + + let path = document + .location(db) + .path(db) + .as_deref() + .ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?; + + let flag = match options { + CleanOptions::Auxiliary => "-c", + CleanOptions::Artifacts => "-C", + }; + + let executable = "latexmk".to_string(); + let args = vec![ + format!("-outdir={}", output_dir.display()), + flag.to_string(), + path.display().to_string(), + ]; + + Ok(Self { executable, args }) + } + + pub fn run(self) -> Result<(), CleanError> { + log::debug!("Cleaning output files: {} {:?}", self.executable, self.args); + std::process::Command::new(self.executable) + .args(self.args) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .map_err(CleanError::Spawn)?; + + Ok(()) + } +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] +enum CleanOptions { + Auxiliary, + Artifacts, +} diff --git a/support/texlab/src/language.rs b/support/texlab/src/language.rs deleted file mode 100644 index 45ef22daba..0000000000 --- a/support/texlab/src/language.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::{ffi::OsStr, path::Path}; - -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord)] -pub enum DocumentLanguage { - Latex, - Bibtex, - BuildLog, -} - -impl DocumentLanguage { - pub fn by_path(path: &Path) -> Option<Self> { - path.extension() - .and_then(OsStr::to_str) - .and_then(Self::by_extension) - } - - pub fn by_extension(extension: &str) -> Option<Self> { - match extension.to_lowercase().as_str() { - "tex" | "sty" | "cls" | "def" | "lco" | "aux" | "rnw" => Some(Self::Latex), - "bib" | "bibtex" => Some(Self::Bibtex), - "log" => Some(Self::BuildLog), - _ => None, - } - } - - pub fn by_language_id(language_id: &str) -> Option<Self> { - match language_id { - "latex" | "tex" => Some(Self::Latex), - "bibtex" | "bib" => Some(Self::Bibtex), - _ => None, - } - } -} diff --git a/support/texlab/src/lib.rs b/support/texlab/src/lib.rs index 1f3d22d7aa..9a7b587ab8 100644 --- a/support/texlab/src/lib.rs +++ b/support/texlab/src/lib.rs @@ -1,37 +1,120 @@ -mod capabilities; -pub mod citation; +#![allow(clippy::needless_lifetimes)] + +pub(crate) mod citation; mod client; -pub mod component_db; -mod debouncer; -mod diagnostics; -mod dispatch; -pub mod distro; -mod document; -mod environment; +pub mod db; +pub(crate) mod distro; pub mod features; -mod label; -mod lang_data; -mod language; -mod line_index; -mod line_index_ext; mod options; -mod range; -mod req_queue; +pub mod parser; mod server; pub mod syntax; -mod workspace; - -pub use self::{ - capabilities::ClientCapabilitiesExt, - document::*, - environment::Environment, - label::*, - lang_data::*, - language::DocumentLanguage, - line_index::{LineCol, LineColUtf16, LineIndex}, - line_index_ext::LineIndexExt, - options::*, - range::RangeExt, - server::Server, - workspace::{Workspace, WorkspaceEvent}, -}; +pub(crate) mod util; + +pub use self::{options::*, server::Server}; + +#[salsa::jar(db = Db)] +pub struct Jar( + db::Word, + db::Location, + db::Location_path, + db::Contents, + db::Contents_line_index, + db::LinterData, + db::Document, + db::Document_parse, + db::Document_can_be_index, + db::Document_can_be_built, + db::parse::TexDocumentData, + db::parse::TexDocumentData_analyze, + db::parse::BibDocumentData, + db::parse::LogDocumentData, + db::analysis::TexLink, + db::analysis::label::Number, + db::analysis::label::Name, + db::analysis::TheoremEnvironment, + db::analysis::GraphicsPath, + db::analysis::TexAnalysis, + db::MissingDependencies, + db::hidden_dependency, + db::source_dependency, + db::dependency_graph, + db::Workspace, + db::Workspace_working_dir, + db::Workspace_output_dir, + db::Workspace_parents, + db::Workspace_related, + db::Workspace_number_of_label, + db::diagnostics::tex::collect, + db::diagnostics::bib::collect, + db::diagnostics::log::collect, + db::diagnostics::collect, + db::diagnostics::collect_filtered, +); + +pub trait Db: salsa::DbWithJar<Jar> {} + +impl<DB> Db for DB where DB: ?Sized + salsa::DbWithJar<Jar> {} + +#[salsa::db(crate::Jar)] +pub struct Database { + storage: salsa::Storage<Self>, +} + +impl Default for Database { + fn default() -> Self { + let storage = salsa::Storage::default(); + let db = Self { storage }; + db::Workspace::new( + &db, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); + + db + } +} + +impl salsa::Database for Database {} + +impl salsa::ParallelDatabase for Database { + fn snapshot(&self) -> salsa::Snapshot<Self> { + salsa::Snapshot::new(Self { + storage: self.storage.snapshot(), + }) + } +} + +pub(crate) fn normalize_uri(uri: &mut lsp_types::Url) { + fn fix_drive_letter(text: &str) -> Option<String> { + if !text.is_ascii() { + return None; + } + + match &text[1..] { + ":" => Some(text.to_ascii_uppercase()), + "%3A" | "%3a" => Some(format!("{}:", text[0..1].to_ascii_uppercase())), + _ => None, + } + } + + if let Some(mut segments) = uri.path_segments() { + if let Some(mut path) = segments.next().and_then(fix_drive_letter) { + for segment in segments { + path.push('/'); + path.push_str(segment); + } + + uri.set_path(&path); + } + } + + uri.set_fragment(None); +} + +#[cfg(test)] +mod tests; diff --git a/support/texlab/src/main.rs b/support/texlab/src/main.rs index 06cbba3f5d..ed807f8799 100644 --- a/support/texlab/src/main.rs +++ b/support/texlab/src/main.rs @@ -1,4 +1,4 @@ -use std::{env, fs::OpenOptions, io, path::PathBuf}; +use std::{fs::OpenOptions, io, path::PathBuf}; use anyhow::Result; use clap::{ArgAction, Parser}; @@ -21,10 +21,6 @@ struct Opts { /// Write the logging output to FILE #[clap(long, name = "FILE", value_parser)] log_file: Option<PathBuf>, - - /// Print version information and exit - #[clap(short = 'V', long)] - version: bool, } fn main() -> Result<()> { @@ -32,7 +28,7 @@ fn main() -> Result<()> { setup_logger(opts); let (connection, threads) = Connection::stdio(); - Server::with_connection(connection, env::current_dir()?, true).run()?; + Server::new(connection).run()?; threads.join()?; Ok(()) diff --git a/support/texlab/src/options.rs b/support/texlab/src/options.rs index 241126d908..cc0058fc68 100644 --- a/support/texlab/src/options.rs +++ b/support/texlab/src/options.rs @@ -1,47 +1,32 @@ -use std::path::PathBuf; +use std::{path::PathBuf, time::Duration}; use regex::Regex; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct Options { - #[serde(default)] pub root_directory: Option<PathBuf>, - - #[serde(default)] pub aux_directory: Option<PathBuf>, - - #[serde(default)] pub bibtex_formatter: BibtexFormatter, - - #[serde(default)] pub latex_formatter: LatexFormatter, - - #[serde(default)] pub formatter_line_length: Option<i32>, - - #[serde(default)] pub diagnostics: DiagnosticsOptions, - - #[serde(default = "default_diagnostics_delay")] - pub diagnostics_delay: u64, - - #[serde(default)] + pub diagnostics_delay: DiagnosticsDelay, pub build: BuildOptions, - - #[serde(default)] pub chktex: ChktexOptions, - - #[serde(default)] pub latexindent: LatexindentOptions, - - #[serde(default)] pub forward_search: ForwardSearchOptions, } -fn default_diagnostics_delay() -> u64 { - 300 +#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] +pub struct DiagnosticsDelay(#[serde(with = "serde_millis")] pub Duration); + +impl Default for DiagnosticsDelay { + fn default() -> Self { + Self(Duration::from_millis(300)) + } } #[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] @@ -72,75 +57,77 @@ impl Default for LatexFormatter { #[derive(Debug, PartialEq, Eq, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct LatexindentOptions { - #[serde(default)] pub local: Option<String>, - - #[serde(default)] pub modify_line_breaks: bool, } #[derive(Debug, PartialEq, Eq, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct BuildOptions { - #[serde(default = "default_build_executable")] - pub executable: String, - - #[serde(default = "default_build_args")] - pub args: Vec<String>, - - #[serde(default)] - pub is_continuous: bool, - - #[serde(default)] + pub executable: BuildExecutable, + pub args: BuildArgs, pub on_save: bool, - - #[serde(default)] pub forward_search_after: bool, } -fn default_build_executable() -> String { - "latexmk".to_string() +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[serde(transparent)] +pub struct BuildExecutable(pub String); + +impl Default for BuildExecutable { + fn default() -> Self { + Self("latexmk".to_string()) + } } -fn default_build_args() -> Vec<String> { - vec![ - "-pdf".to_string(), - "-interaction=nonstopmode".to_string(), - "-synctex=1".to_string(), - "%f".to_string(), - ] +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[serde(transparent)] +pub struct BuildArgs(pub Vec<String>); + +impl Default for BuildArgs { + fn default() -> Self { + Self(vec![ + "-pdf".to_string(), + "-interaction=nonstopmode".to_string(), + "-synctex=1".to_string(), + "%f".to_string(), + ]) + } } #[derive(Debug, PartialEq, Eq, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct ChktexOptions { - #[serde(default)] pub on_open_and_save: bool, - - #[serde(default)] pub on_edit: bool, } #[derive(Debug, PartialEq, Eq, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct ForwardSearchOptions { - #[serde(default)] pub executable: Option<String>, - - #[serde(default)] pub args: Option<Vec<String>>, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[serde(default)] pub struct DiagnosticsOptions { - #[serde(default)] pub allowed_patterns: Vec<DiagnosticsPattern>, - - #[serde(default)] pub ignored_patterns: Vec<DiagnosticsPattern>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DiagnosticsPattern(#[serde(with = "serde_regex")] pub Regex); + +#[derive(Debug, PartialEq, Eq, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +#[serde(default)] +pub struct StartupOptions { + pub skip_distro: bool, +} diff --git a/support/texlab/src/parser.rs b/support/texlab/src/parser.rs new file mode 100644 index 0000000000..51d56475cf --- /dev/null +++ b/support/texlab/src/parser.rs @@ -0,0 +1,5 @@ +mod bibtex; +mod build_log; +mod latex; + +pub use self::{bibtex::parse_bibtex, build_log::parse_build_log, latex::parse_latex}; diff --git a/support/texlab/src/syntax/bibtex/parser.rs b/support/texlab/src/parser/bibtex.rs index 4a8a429b18..e03a39c9ae 100644 --- a/support/texlab/src/syntax/bibtex/parser.rs +++ b/support/texlab/src/parser/bibtex.rs @@ -1,12 +1,9 @@ -use logos::{Lexer, Logos}; +use logos::Logos; use rowan::{GreenNode, GreenNodeBuilder}; -use super::{ - lexer::*, - SyntaxKind::{self, *}, -}; +use crate::syntax::bibtex::SyntaxKind::{self, *}; -pub fn parse(input: &str) -> GreenNode { +pub fn parse_bibtex(input: &str) -> GreenNode { let mut ptr = TokenPtr { builder: GreenNodeBuilder::new(), lexer: RootToken::lexer(input), @@ -136,9 +133,9 @@ fn curly_group(mut ptr: TokenPtr<ContentToken>) -> TokenPtr<ContentToken> { | ContentToken::Nbsp | ContentToken::Comma | ContentToken::Integer + | ContentToken::Quote | ContentToken::Word => ptr.bump(), ContentToken::LCurly => ptr = curly_group(ptr), - ContentToken::Quote => ptr = quote_group(ptr), ContentToken::AccentName => ptr = accent(ptr), ContentToken::CommandName => ptr = command(ptr), }; @@ -205,7 +202,7 @@ fn command(mut ptr: TokenPtr<ContentToken>) -> TokenPtr<ContentToken> { struct TokenPtr<'a, T: Logos<'a>> { builder: GreenNodeBuilder<'static>, - lexer: Lexer<'a, T>, + lexer: logos::Lexer<'a, T>, token: Option<(T, &'a str)>, } @@ -262,3 +259,196 @@ where self.token } } + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] +enum RootToken { + #[token(r"@preamble", ignore(ascii_case))] + Preamble, + + #[token(r"@string", ignore(ascii_case))] + String, + + #[token(r"@comment", ignore(ascii_case))] + Comment, + + #[regex(r"@[a-zA-Z]*")] + Entry, + + #[regex(r"[^@]+")] + #[error] + Junk, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] +enum BodyToken { + #[regex(r"\s+")] + Whitespace, + + #[token("{")] + #[token("(")] + LDelim, + + #[token("}")] + #[token(")")] + RDelim, + + #[token(",")] + Comma, + + #[token("=")] + Eq, + + #[regex(r"[^\s\(\)\{\}@,=]+")] + Name, + + #[error] + Error, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] +enum ValueToken { + #[regex(r"\s+")] + Whitespace, + + #[token("#")] + Pound, + + #[token(",")] + Comma, + + #[token("{")] + LCurly, + + #[token("}")] + RCurly, + + #[token("\"")] + Quote, + + #[regex(r"\d+", priority = 2)] + Integer, + + #[regex(r#"[^\s"\{\},]+"#)] + #[error] + Name, +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] +enum ContentToken { + #[regex(r"\s+")] + Whitespace, + + #[token(",")] + Comma, + + #[token("{")] + LCurly, + + #[token("}")] + RCurly, + + #[token("\"")] + Quote, + + #[regex(r"\d+", priority = 2)] + Integer, + + #[token(r#"~"#)] + Nbsp, + + #[token(r#"\`"#)] + #[token(r#"\'"#)] + #[token(r#"\^"#)] + #[token(r#"\""#)] + #[token(r#"\H"#)] + #[token(r#"\~"#)] + #[token(r#"\c"#)] + #[token(r#"\k"#)] + #[token(r#"\="#)] + #[token(r#"\b"#)] + #[token(r#"\."#)] + #[token(r#"\d"#)] + #[token(r#"\r"#)] + #[token(r#"\u"#)] + #[token(r#"\v"#)] + #[token(r#"\t"#)] + AccentName, + + #[regex(r"\\([^\r\n]|[@a-zA-Z:_]+\*?)?")] + CommandName, + + #[regex(r#"[^\s"\{\}\\~,]+"#)] + #[error] + Word, +} + +impl From<RootToken> for SyntaxKind { + fn from(token: RootToken) -> Self { + match token { + RootToken::Preamble | RootToken::String | RootToken::Comment | RootToken::Entry => TYPE, + RootToken::Junk => JUNK, + } + } +} + +impl From<BodyToken> for SyntaxKind { + fn from(token: BodyToken) -> Self { + match token { + BodyToken::Whitespace => WHITESPACE, + BodyToken::LDelim => L_DELIM, + BodyToken::RDelim => R_DELIM, + BodyToken::Comma => COMMA, + BodyToken::Eq => EQ, + BodyToken::Name => NAME, + BodyToken::Error => unreachable!(), + } + } +} + +impl From<ValueToken> for SyntaxKind { + fn from(token: ValueToken) -> Self { + match token { + ValueToken::Whitespace => WHITESPACE, + ValueToken::Pound => POUND, + ValueToken::Comma => COMMA, + ValueToken::LCurly => L_CURLY, + ValueToken::RCurly => R_CURLY, + ValueToken::Quote => QUOTE, + ValueToken::Integer => INTEGER, + ValueToken::Name => NAME, + } + } +} + +impl From<ContentToken> for SyntaxKind { + fn from(token: ContentToken) -> Self { + match token { + ContentToken::Whitespace => WHITESPACE, + ContentToken::Comma => COMMA, + ContentToken::LCurly => L_CURLY, + ContentToken::RCurly => R_CURLY, + ContentToken::Quote => QUOTE, + ContentToken::Integer => INTEGER, + ContentToken::Nbsp => NBSP, + ContentToken::AccentName => ACCENT_NAME, + ContentToken::CommandName => COMMAND_NAME, + ContentToken::Word => WORD, + } + } +} + +#[cfg(test)] +mod tests { + use crate::syntax::bibtex; + + use super::parse_bibtex; + + #[test] + fn test_parse() { + insta::glob!("test_data/bibtex/{,**/}*.txt", |path| { + let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n"); + let root = bibtex::SyntaxNode::new_root(parse_bibtex(&text)); + insta::assert_debug_snapshot!(root); + }); + } +} diff --git a/support/texlab/src/parser/build_log.rs b/support/texlab/src/parser/build_log.rs new file mode 100644 index 0000000000..5f99129cdb --- /dev/null +++ b/support/texlab/src/parser/build_log.rs @@ -0,0 +1,184 @@ +use std::{cmp::Ordering, path::PathBuf}; + +use once_cell::sync::Lazy; +use regex::{Match, Regex}; + +use crate::syntax::{BuildError, BuildErrorLevel, BuildLog}; + +const MAX_LINE_LENGTH: usize = 79; + +static PACKAGE_MESSAGE_REGEX: Lazy<Regex> = + Lazy::new(|| Regex::new("^\\([a-zA-Z_\\-]+\\)\\s*(?P<msg>.*)$").unwrap()); + +static FILE_REGEX: Lazy<Regex> = + Lazy::new(|| Regex::new("\\((?P<file>[^\r\n()]+\\.(tex|sty|cls))").unwrap()); + +static TEX_ERROR_REGEX: Lazy<Regex> = Lazy::new(|| { + Regex::new("(?m)^! ((?P<msg1>(.|\r|\n)*?)\r?\nl\\.(?P<line>\\d+)( (\\.\\.\\.)?(?P<hint>[^\r\n]+))?|(?P<msg2>[^\r\n]*))").unwrap() +}); + +static WARNING_REGEX: Lazy<Regex> = + Lazy::new(|| Regex::new("(LaTeX|Package [a-zA-Z_\\-]+) Warning: (?P<msg>[^\r\n]*)").unwrap()); + +static BAD_BOX_REGEX: Lazy<Regex> = Lazy::new(|| { + Regex::new("(?P<msg>(Ov|Und)erfull \\\\[hv]box[^\r\n]*lines? (?P<line>\\d+)[^\r\n]*)").unwrap() +}); + +pub fn parse_build_log(log: &str) -> BuildLog { + let log = prepare_log(log); + let mut ranges: Vec<FileRange> = FILE_REGEX + .find_iter(&log) + .map(|result| FileRange::create(&log, result)) + .collect(); + ranges.sort(); + + let tex_errors = extract_matches(&log, &ranges, &TEX_ERROR_REGEX, BuildErrorLevel::Error); + let warnings = extract_matches(&log, &ranges, &WARNING_REGEX, BuildErrorLevel::Warning); + let bad_boxes = extract_matches(&log, &ranges, &BAD_BOX_REGEX, BuildErrorLevel::Warning); + + let errors = vec![tex_errors, warnings, bad_boxes].concat(); + BuildLog { errors } +} + +fn extract_matches( + log: &str, + ranges: &[FileRange], + regex: &Regex, + level: BuildErrorLevel, +) -> Vec<BuildError> { + let mut errors = Vec::new(); + for result in regex.find_iter(log) { + let captures = regex.captures(&log[result.start()..result.end()]).unwrap(); + let message = captures + .name("msg") + .or_else(|| captures.name("msg1")) + .or_else(|| captures.name("msg2")) + .unwrap() + .as_str() + .lines() + .next() + .unwrap_or_default() + .to_owned(); + + if let Some(range) = ranges.iter().find(|range| range.contains(result.start())) { + let line = captures + .name("line") + .map(|result| result.as_str().parse::<u32>().unwrap() - 1); + + let hint: Option<String> = if line.is_some() { + captures + .name("hint") + .map(|r| String::from(r.as_str().trim())) + } else { + None + }; + + errors.push(BuildError { + relative_path: range.path.clone(), + level, + message, + line, + hint, + }); + } + } + errors +} + +fn prepare_log(log: &str) -> String { + let mut old_lines = log.lines(); + let mut new_lines: Vec<String> = Vec::new(); + while let Some(line) = old_lines.next() { + if PACKAGE_MESSAGE_REGEX.is_match(line) { + let captures = PACKAGE_MESSAGE_REGEX.captures(line).unwrap(); + if let Some(last_line) = new_lines.last_mut() { + last_line.push(' '); + last_line.push_str(captures.name("msg").unwrap().as_str()); + } + } else if line.ends_with("...") { + let mut new_line = line[line.len() - 3..].to_owned(); + if let Some(old_line) = old_lines.next() { + new_line.push_str(old_line); + } + new_lines.push(new_line); + } else if line.chars().count() == MAX_LINE_LENGTH { + let mut new_line = String::new(); + new_line.push_str(line); + if let Some(old_line) = old_lines.next() { + new_line.push_str(old_line); + } + new_lines.push(new_line); + } else { + new_lines.push(line.to_owned()); + } + } + new_lines.join("\n") +} + +#[derive(Debug, PartialEq, Eq, Clone)] +struct FileRange { + pub path: PathBuf, + pub start: usize, + pub end: usize, +} + +impl FileRange { + fn create(log: &str, result: Match) -> Self { + let mut balance = 1; + let mut end = result.start() + 1; + let chars = log[result.start() + 1..].chars(); + for c in chars { + if balance <= 0 { + break; + } + + if c == '(' { + balance += 1; + } else if c == ')' { + balance -= 1; + } + end += c.len_utf8(); + } + + let captures = FILE_REGEX.captures(result.as_str()).unwrap(); + let path = PathBuf::from(captures.name("file").unwrap().as_str()); + Self { + path, + start: result.start(), + end, + } + } + + fn len(&self) -> usize { + self.end - self.start + 1 + } + + fn contains(&self, index: usize) -> bool { + index >= self.start && index <= self.end + } +} + +impl Ord for FileRange { + fn cmp(&self, other: &Self) -> Ordering { + self.len().cmp(&other.len()) + } +} + +impl PartialOrd for FileRange { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + Some(self.cmp(other)) + } +} + +#[cfg(test)] +mod tests { + use super::parse_build_log; + + #[test] + fn test_parse() { + insta::glob!("test_data/build_log/*.txt", |path| { + let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n"); + insta::assert_debug_snapshot!(parse_build_log(&text)); + }); + } +} diff --git a/support/texlab/src/syntax/latex/parser.rs b/support/texlab/src/parser/latex.rs index a43a77ebc9..a103561685 100644 --- a/support/texlab/src/syntax/latex/parser.rs +++ b/support/texlab/src/parser/latex.rs @@ -1,14 +1,10 @@ +mod lexer; + use rowan::{GreenNode, GreenNodeBuilder}; -use super::{ - lexer::Lexer, - SyntaxKind::{self, *}, -}; +use crate::syntax::latex::SyntaxKind::{self, *}; -#[derive(Clone)] -pub struct Parse { - pub green: GreenNode, -} +use self::lexer::Lexer; #[derive(Debug, Clone, Copy)] struct ParserContext { @@ -80,15 +76,14 @@ impl<'a> Parser<'a> { } } - pub fn parse(mut self) -> Parse { + pub fn parse(mut self) -> GreenNode { self.builder.start_node(ROOT.into()); self.preamble(); while self.peek().is_some() { self.content(ParserContext::default()); } self.builder.finish_node(); - let green = self.builder.finish(); - Parse { green } + self.builder.finish() } fn content(&mut self, context: ParserContext) { @@ -177,7 +172,7 @@ impl<'a> Parser<'a> { self.eat(); while self .peek() - .filter(|&kind| !matches!(kind, R_CURLY | END_ENVIRONMENT_NAME)) + .filter(|&kind| !matches!(kind, R_CURLY)) .is_some() { self.content(ParserContext::default()); @@ -518,7 +513,7 @@ impl<'a> Parser<'a> { while self .peek() - .filter(|&kind| kind != END_ENVIRONMENT_NAME) + .filter(|&kind| !matches!(kind, R_CURLY | END_ENVIRONMENT_NAME)) .is_some() { self.content(ParserContext::default()); @@ -854,11 +849,16 @@ impl<'a> Parser<'a> { fn curly_group_path(&mut self) { self.builder.start_node(CURLY_GROUP_WORD.into()); self.eat(); - while matches!( - self.peek(), - Some(WORD | L_BRACK | R_BRACK | GENERIC_COMMAND_NAME) - ) { - self.path(); + self.trivia(); + + while let Some(kind) = self.lexer.peek() { + match kind { + COMMENT | WORD | EQUALITY_SIGN | COMMA | L_BRACK | R_BRACK + | GENERIC_COMMAND_NAME => self.path(), + L_CURLY => self.curly_group_path(), + WHITESPACE => self.eat(), + _ => break, + }; } self.expect(R_CURLY); @@ -868,29 +868,17 @@ impl<'a> Parser<'a> { fn curly_group_path_list(&mut self) { self.builder.start_node(CURLY_GROUP_WORD_LIST.into()); self.eat(); + self.trivia(); - while self.peek().map_or(false, |kind| { - matches!( - kind, - LINE_BREAK - | WHITESPACE - | COMMENT - | WORD - | COMMA - | EQUALITY_SIGN - | L_BRACK - | R_BRACK - | GENERIC_COMMAND_NAME - ) - }) { - if matches!( - self.peek(), - Some(WORD | L_BRACK | R_BRACK | GENERIC_COMMAND_NAME) - ) { - self.path(); - } else { - self.eat(); - } + while let Some(kind) = self.peek() { + match kind { + COMMENT | WORD | EQUALITY_SIGN | L_BRACK | R_BRACK | GENERIC_COMMAND_NAME => { + self.path() + } + WHITESPACE | LINE_BREAK | COMMA => self.eat(), + L_CURLY => self.curly_group_path(), + _ => break, + }; } self.expect(R_CURLY); @@ -900,22 +888,16 @@ impl<'a> Parser<'a> { fn path(&mut self) { self.builder.start_node(KEY.into()); self.eat(); - while self.peek().map_or(false, |kind| { - matches!( - kind, - WHITESPACE - | COMMENT - | WORD - | EQUALITY_SIGN - | L_BRACK - | R_BRACK - | GENERIC_COMMAND_NAME - ) - }) { - self.eat(); + + while let Some(kind) = self.peek() { + match kind { + WHITESPACE | COMMENT | WORD | EQUALITY_SIGN | L_BRACK | R_BRACK + | GENERIC_COMMAND_NAME => self.eat(), + L_CURLY => self.curly_group_path(), + _ => break, + }; } - self.trivia(); self.builder.finish_node(); } @@ -1126,15 +1108,15 @@ impl<'a> Parser<'a> { if self.lexer.peek() == Some(L_CURLY) { self.curly_group_word(); - } else { - self.builder.token(MISSING.into(), ""); + } + + if self.lexer.peek() == Some(L_BRACK) { + self.brack_group(); } for _ in 0..2 { if self.lexer.peek() == Some(L_CURLY) { self.curly_group(); - } else { - self.builder.token(MISSING.into(), ""); } } @@ -1321,603 +1303,49 @@ impl<'a> Parser<'a> { self.eat(); self.trivia(); + let checkpoint = self.builder.checkpoint(); if self.lexer.peek() == Some(L_CURLY) { self.eat(); self.trivia(); - while matches!(self.lexer.peek(), Some(L_CURLY)) { - self.curly_group_path(); + if matches!( + self.lexer.peek(), + Some(WORD | EQUALITY_SIGN | L_BRACK | R_BRACK | GENERIC_COMMAND_NAME) + ) { + self.builder + .start_node_at(checkpoint, CURLY_GROUP_WORD.into()); + self.path(); + } else { + self.builder.start_node_at(checkpoint, CURLY_GROUP.into()); + while matches!(self.lexer.peek(), Some(L_CURLY)) { + self.curly_group_path(); + } } - } else { - self.builder.token(MISSING.into(), ""); + + self.expect(R_CURLY); + self.builder.finish_node(); } - self.expect(R_CURLY); self.builder.finish_node(); } } -pub fn parse(text: &str) -> Parse { +pub fn parse_latex(text: &str) -> GreenNode { Parser::new(text).parse() } #[cfg(test)] mod tests { - use insta::assert_debug_snapshot; - use crate::syntax::latex; - use super::*; - - fn setup(text: &str) -> latex::SyntaxNode { - latex::SyntaxNode::new_root(parse(&text.trim().replace('\r', "")).green) - } - - #[test] - fn test_empty() { - assert_debug_snapshot!(setup(r#""#)); - } - - #[test] - fn test_hello_world() { - assert_debug_snapshot!(setup(r#"Hello World!"#)); - } - - #[test] - fn test_generic_command_empty() { - assert_debug_snapshot!(setup(r#"\foo"#)); - } - - #[test] - fn test_generic_command_escape() { - assert_debug_snapshot!(setup(r#"\#"#)); - } - - #[test] - fn test_generic_command_args() { - assert_debug_snapshot!(setup(r#"\foo{bar}[qux]"#)); - } - - #[test] - fn test_inline() { - assert_debug_snapshot!(setup(r#"$x \in [0, \infty)$"#)); - } - - #[test] - fn test_inline_double_dollar() { - assert_debug_snapshot!(setup(r#"$$x \in [0, \infty)$$"#)); - } - - #[test] - fn test_brace_group_simple() { - assert_debug_snapshot!(setup(r#"{hello world}"#)); - } - - #[test] - fn test_brace_group_missing_end() { - assert_debug_snapshot!(setup(r#"{hello world"#)); - } - - #[test] - fn test_unmatched_braces() { - assert_debug_snapshot!(setup(r#"}{"#)); - } - - #[test] - fn test_unmatched_brackets() { - assert_debug_snapshot!(setup(r#"]["#)); - } - - #[test] - fn test_unmatched_brackets_with_group() { - assert_debug_snapshot!(setup(r#"{][}"#)); - } - - #[test] - fn test_escaped_brackets() { - assert_debug_snapshot!(setup(r#"{[}{]}"#)); - } - - #[test] - fn test_parameter() { - assert_debug_snapshot!(setup(r#"#1"#)); - } - - #[test] - fn test_parameter_error() { - assert_debug_snapshot!(setup(r#"#"#)); - } - - #[test] - fn test_environment_simple() { - assert_debug_snapshot!(setup(r#"\begin{foo} Hello World \end{bar}"#)); - } - - #[test] - fn test_environment_nested() { - assert_debug_snapshot!(setup(r#"\begin{foo} \begin{qux} \end{baz} \end{bar}"#)); - } - - #[test] - fn test_environment_nested_missing_braces() { - assert_debug_snapshot!(setup( - r#"\begin{foo \begin{qux Hello World \end{baz} \end{bar"# - )); - } - - #[test] - fn test_structure_siblings() { - assert_debug_snapshot!(setup(r#"\section{Foo} Foo \section{Bar} Bar"#)); - } - - #[test] - fn test_structure_nested() { - assert_debug_snapshot!(setup( - r#"\part{1}\chapter{2}\section{3}\subsection{4}\subsubsection{5}\paragraph{6}\subparagraph{7}"# - )); - } - - #[test] - fn test_structure_enum_item() { - assert_debug_snapshot!(setup( - r#"\begin{enumerate} \item 1 \item[2] 2 \item 3 \end{enumerate}"# - )); - } - - #[test] - fn test_structure_invalid_nesting() { - assert_debug_snapshot!(setup(r#"\section{Foo} \chapter{Bar}"#)); - } - - #[test] - fn test_equation() { - assert_debug_snapshot!(setup(r#"\[ foo bar \]"#)); - } - - #[test] - fn test_equation_missing_end() { - assert_debug_snapshot!(setup(r#"\begin{a} \[ foo bar \end{b}"#)); - } - - #[test] - fn test_equation_missing_begin() { - assert_debug_snapshot!(setup(r#"\begin{a} foo bar \] \end{b}"#)); - } - - #[test] - fn test_caption_minimal() { - assert_debug_snapshot!(setup(r#"\caption{Foo \Bar Baz}"#)); - } - - #[test] - fn test_caption_minimal_error() { - assert_debug_snapshot!(setup(r#"\caption{Foo \Bar Baz"#)); - } - - #[test] - fn test_caption() { - assert_debug_snapshot!(setup(r#"\caption[qux]{Foo \Bar Baz}"#)); - } - - #[test] - fn test_caption_error() { - assert_debug_snapshot!(setup(r#"\caption[qux]{Foo \Bar Baz"#)); - } - - #[test] - fn test_caption_figure() { - assert_debug_snapshot!(setup(r#"\begin{figure}\caption{Foo}\end{figure}"#)); - } - - #[test] - fn test_citation_empty() { - assert_debug_snapshot!(setup(r#"\cite{}"#)); - } - - #[test] - fn test_citation_simple() { - assert_debug_snapshot!(setup(r#"\cite{foo}"#)); - } - - #[test] - fn test_citation_multiple_keys() { - assert_debug_snapshot!(setup(r#"\cite{foo, bar}"#)); - } - - #[test] - fn test_citation_star() { - assert_debug_snapshot!(setup(r#"\nocite{*}"#)); - } - - #[test] - fn test_citation_prenote() { - assert_debug_snapshot!(setup(r#"\cite[foo]{bar}"#)); - } - - #[test] - fn test_citation_prenote_postnote() { - assert_debug_snapshot!(setup(r#"\cite[foo][bar]{baz}"#)); - } - - #[test] - fn test_citation_missing_brace() { - assert_debug_snapshot!(setup(r#"\cite{foo"#)); - } - - #[test] - fn test_citation_redundant_comma() { - assert_debug_snapshot!(setup(r#"\cite{,foo,}"#)); - } - - #[test] - fn test_package_include_empty() { - assert_debug_snapshot!(setup(r#"\usepackage{}"#)); - } - - #[test] - fn test_package_include_simple() { - assert_debug_snapshot!(setup(r#"\usepackage{amsmath}"#)); - } - - #[test] - fn test_package_include_multiple() { - assert_debug_snapshot!(setup(r#"\usepackage{amsmath, lipsum}"#)); - } - - #[test] - fn test_package_include_options() { - assert_debug_snapshot!(setup(r#"\usepackage[foo = bar, baz, qux]{amsmath}"#)); - } - - #[test] - fn test_class_include_empty() { - assert_debug_snapshot!(setup(r#"\documentclass{}"#)); - } - - #[test] - fn test_class_include_simple() { - assert_debug_snapshot!(setup(r#"\documentclass{article}"#)); - } - - #[test] - fn test_class_include_options() { - assert_debug_snapshot!(setup(r#"\documentclass[foo = bar, baz, qux]{article}"#)); - } - - #[test] - fn test_latex_include_simple() { - assert_debug_snapshot!(setup(r#"\include{foo/bar}"#)); - } - - #[test] - fn test_latex_include_equality_sign() { - assert_debug_snapshot!(setup(r#"\include{foo=bar}"#)); - } - - #[test] - fn test_latex_input_simple() { - assert_debug_snapshot!(setup(r#"\input{foo/bar.tex}"#)); - } - - #[test] - fn test_latex_input_path_with_brackets() { - assert_debug_snapshot!(setup(r#"\input{foo[bar].tex}"#)); - } - - #[test] - fn test_biblatex_include_simple() { - assert_debug_snapshot!(setup(r#"\addbibresource{foo/bar.bib}"#)); - } - - #[test] - fn test_biblatex_include_options() { - assert_debug_snapshot!(setup(r#"\addbibresource[foo=bar, baz]{foo/bar.bib}"#)); - } - - #[test] - fn test_bibtex_include_simple() { - assert_debug_snapshot!(setup(r#"\bibliography{foo/bar}"#)); - } - - #[test] - fn test_graphics_include_simple() { - assert_debug_snapshot!(setup(r#"\includegraphics{foo/bar.pdf}"#)); - } - - #[test] - fn test_graphics_include_options() { - assert_debug_snapshot!(setup(r#"\includegraphics[scale=.5]{foo/bar.pdf}"#)); - } - - #[test] - fn test_graphics_include_complicated_options() { - assert_debug_snapshot!(setup(r#"\includegraphics[width=0.5\textwidth]{}"#)); - } - - #[test] - fn test_graphics_include_command() { - assert_debug_snapshot!(setup( - r#"\includegraphics[width=0.5\textwidth]{\foo.\bar.pdf}"# - )); - } - - #[test] - fn test_svg_include_simple() { - assert_debug_snapshot!(setup(r#"\includesvg{foo/bar.svg}"#)); - } - - #[test] - fn test_svg_include_options() { - assert_debug_snapshot!(setup(r#"\includesvg[scale=.5]{foo/bar.svg}"#)); - } - - #[test] - fn test_inkscape_include_simple() { - assert_debug_snapshot!(setup(r#"\includesvg{foo/bar}"#)); - } - - #[test] - fn test_inkscape_include_options() { - assert_debug_snapshot!(setup(r#"\includesvg[scale=.5]{foo/bar}"#)); - } - - #[test] - fn test_verbatim_include_simple() { - assert_debug_snapshot!(setup(r#"\verbatiminput{foo/bar.txt}"#)); - } - - #[test] - fn test_import_simple() { - assert_debug_snapshot!(setup(r#"\import{foo}{bar}"#)); - } - - #[test] - fn test_import_incomplete() { - assert_debug_snapshot!(setup(r#"\import{foo"#)); - } - - #[test] - fn test_label_definition_simple() { - assert_debug_snapshot!(setup(r#"\label{foo}"#)); - } - - #[test] - fn test_label_reference_simple() { - assert_debug_snapshot!(setup(r#"\ref{foo}"#)); - } - - #[test] - fn test_label_reference_multiple() { - assert_debug_snapshot!(setup(r#"\ref{foo, bar}"#)); - } - - #[test] - fn test_label_reference_incomplete() { - assert_debug_snapshot!(setup(r#"Equation \eqref{eq is a \emph{useful} identity."#)); - } - - #[test] - fn test_equation_label_reference_simple() { - assert_debug_snapshot!(setup(r#"\eqref{foo}"#)); - } - - #[test] - fn test_label_reference_range_simple() { - assert_debug_snapshot!(setup(r#"\crefrange{foo}{bar}"#)); - } - - #[test] - fn test_label_reference_range_incomplete() { - assert_debug_snapshot!(setup(r#"\crefrange{foo}"#)); - } - - #[test] - fn test_label_reference_range_error() { - assert_debug_snapshot!(setup(r#"\crefrange{foo{bar}"#)); - } - - #[test] - fn test_label_number() { - assert_debug_snapshot!(setup(r#"\newlabel{foo}{{1.1}}"#)); - } - - #[test] - fn test_command_definition_simple() { - assert_debug_snapshot!(setup(r#"\newcommand[1]{\id}{#1}"#)); - } - - #[test] - fn test_command_definition_optional() { - assert_debug_snapshot!(setup(r#"\newcommand{\foo}[1][def]{#1}"#)); - } - - #[test] - fn test_command_definition_no_argc() { - assert_debug_snapshot!(setup(r#"\newcommand{\foo}{foo}"#)); - } - - #[test] - fn test_command_definition_no_impl() { - assert_debug_snapshot!(setup(r#"\newcommand{\foo}"#)); - } - - #[test] - fn test_command_definition_no_impl_error() { - assert_debug_snapshot!(setup(r#"\newcommand{\foo"#)); - } - - #[test] - fn test_command_definition_with_begin() { - assert_debug_snapshot!(setup( - r#"\newcommand{\CVSubHeadingListStart}{\begin{itemize}[leftmargin=0.5cm, label={}]}"# - )); - } - - #[test] - fn test_math_operator_simple() { - assert_debug_snapshot!(setup(r#"\DeclareMathOperator{\foo}{foo}"#)); - } - - #[test] - fn test_math_operator_no_impl() { - assert_debug_snapshot!(setup(r#"\DeclareMathOperator{\foo}"#)); - } - - #[test] - fn test_glossary_entry_definition_simple() { - assert_debug_snapshot!(setup(r#"\newglossaryentry{foo}{bar = baz, qux,}"#)); - } - - #[test] - fn test_glossary_entry_reference_simple() { - assert_debug_snapshot!(setup(r#"\gls{foo}"#)); - } - - #[test] - fn test_glossary_entry_reference_options() { - assert_debug_snapshot!(setup(r#"\gls[foo = bar, qux]{baz}"#)); - } - - #[test] - fn test_acroynm_definition_simple() { - assert_debug_snapshot!(setup(r#"\newacronym{fpsLabel}{FPS}{Frame per Second}"#)); - } - - #[test] - fn test_acroynm_definition_options() { - assert_debug_snapshot!(setup( - r#"\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}"# - )); - } - - #[test] - fn test_acroynm_reference_simple() { - assert_debug_snapshot!(setup(r#"\acrshort{fpsLabel}"#)); - } - - #[test] - fn test_acroynm_reference_options() { - assert_debug_snapshot!(setup(r#"\acrshort[foo=bar,baz]{fpsLabel}"#)); - } - - #[test] - fn test_theorem_definition_only_name() { - assert_debug_snapshot!(setup(r#"\newtheorem{foo}"#)); - } - - #[test] - fn test_theorem_definition_name_with_description() { - assert_debug_snapshot!(setup(r#"\newtheorem{foo}{Foo}"#)); - } - - #[test] - fn test_theorem_definition_name_with_description_and_counter() { - assert_debug_snapshot!(setup(r#"\newtheorem{foo}[bar]{Foo}"#)); - } - - #[test] - fn test_theorem_definition_name_with_counter() { - assert_debug_snapshot!(setup(r#"\newtheorem{foo}[bar]"#)); - } - - #[test] - fn test_theorem_definition_full() { - assert_debug_snapshot!(setup(r#"\newtheorem{foo}[bar]{Foo}[baz]"#)); - } - - #[test] - fn test_color_reference_simple() { - assert_debug_snapshot!(setup(r#"\color{black}"#)); - } - - #[test] - fn test_color_definition_simple() { - assert_debug_snapshot!(setup(r#"\definecolor{foo}{rgb}{255,168,0}"#)); - } - - #[test] - fn test_color_set_definition_simple() { - assert_debug_snapshot!(setup(r#"\definecolorset[ty]{rgb,HTML}{foo}{bar}{baz}"#)); - } - - #[test] - fn test_color_set_definition_error1() { - assert_debug_snapshot!(setup(r#"\definecolorset[ty]{rgb,HTML}{foo}{bar}"#)); - } - - #[test] - fn test_color_set_definition_error2() { - assert_debug_snapshot!(setup(r#"\definecolorset{rgb,HTML}{foo}"#)); - } - - #[test] - fn test_color_set_definition_error3() { - assert_debug_snapshot!(setup(r#"\definecolorset{rgb,HTML}"#)); - } - - #[test] - fn test_color_set_definition_error4() { - assert_debug_snapshot!(setup(r#"\definecolorset"#)); - } - - #[test] - fn test_pgf_library_import_simple() { - assert_debug_snapshot!(setup(r#"\usepgflibrary{foo}"#)); - } - - #[test] - fn test_tikz_library_import_simple() { - assert_debug_snapshot!(setup(r#"\usetikzlibrary{foo}"#)); - } - - #[test] - fn test_environment_definition() { - assert_debug_snapshot!(setup(r#"\newenvironment{bar}[1]{\begin{foo}}{\end{foo}}"#)); - } - - #[test] - fn test_environment_definition_optional_arg() { - assert_debug_snapshot!(setup(r#"\newenvironment{foo}[1][default]{begin}{end}"#)); - } - - #[test] - fn test_acronym_declaration() { - assert_debug_snapshot!(setup( - r#"\DeclareAcronym{eg}{short = e.g,long = for example,tag = abbrev}"# - )); - } - - #[test] - fn test_label_definition_line_break() { - assert_debug_snapshot!(setup("\\label{hello\nworld}")); - } - - #[test] - fn test_block_comments() { - assert_debug_snapshot!(setup( - r#"Foo -\iffalse -Test1 -\fi -Bar -\iffalse -\fii -\fi -Baz"# - )); - } - - #[test] - fn test_asymptote() { - assert_debug_snapshot!(setup( - r#"\begin{asy} - printf("Hello World\n"); -\end{asy}"# - )); - } + use super::parse_latex; #[test] - fn test_graphics_path() { - assert_debug_snapshot!(setup(r#"\graphicspath{{../figures/}}"#)); + fn test_parse() { + insta::glob!("test_data/latex/{,**/}*.txt", |path| { + let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n"); + let root = latex::SyntaxNode::new_root(parse_latex(&text)); + insta::assert_debug_snapshot!(root); + }); } } diff --git a/support/texlab/src/syntax/latex/lexer.rs b/support/texlab/src/parser/latex/lexer.rs index 39196375b1..9b0a6726eb 100644 --- a/support/texlab/src/syntax/latex/lexer.rs +++ b/support/texlab/src/parser/latex/lexer.rs @@ -1,9 +1,8 @@ use logos::Logos; -use super::kind::SyntaxKind; +use crate::syntax::latex::SyntaxKind; #[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord, Logos)] -#[allow(non_camel_case_types)] #[repr(u16)] enum RootToken { #[regex(r"[\r\n]+", priority = 2)] @@ -299,6 +298,15 @@ enum CommandNameToken { GlossaryEntryReference, #[token("\\newacronym")] + #[token("\\newacro")] + #[token("\\acrodef")] + #[token("\\acro")] + #[token("\\newacroindefinite")] + #[token("\\acrodefindefinite")] + #[token("\\acroindefinite")] + #[token("\\acroplural")] + #[token("\\newacroplural")] + #[token("\\acrodefplural")] AcronymDefinition, #[token("\\DeclareAcronym")] @@ -332,11 +340,42 @@ enum CommandNameToken { #[token("\\Aclp")] #[token("\\acf")] #[token("\\Acf")] + #[token("\\acfi")] + #[token("\\Acfi")] #[token("\\acfp")] #[token("\\Acfp")] #[token("\\ac")] #[token("\\Ac")] #[token("\\acp")] + #[token("\\Acp")] + #[token("\\acused")] + #[token("\\acsu")] + #[token("\\Aclu")] + #[token("\\iac")] + #[token("\\Iac")] + #[token("\\acs*")] + #[token("\\Acs*")] + #[token("\\acsp*")] + #[token("\\Acsp*")] + #[token("\\acl*")] + #[token("\\Acl*")] + #[token("\\aclp*")] + #[token("\\Aclp*")] + #[token("\\acf*")] + #[token("\\Acf*")] + #[token("\\acfi*")] + #[token("\\Acfi*")] + #[token("\\acfp*")] + #[token("\\Acfp*")] + #[token("\\ac*")] + #[token("\\Ac*")] + #[token("\\acp*")] + #[token("\\Acp*")] + #[token("\\acused*")] + #[token("\\acsu*")] + #[token("\\Aclu*")] + #[token("\\iac*")] + #[token("\\Iac*")] #[token("\\glsentrylong")] #[token("\\Glsentrylong")] #[token("\\glsentrylongpl")] @@ -600,75 +639,3 @@ fn tokenize_verbatim_environment<'a>( &input[end..] } - -#[cfg(test)] -mod tests { - use insta::assert_debug_snapshot; - - use super::*; - - fn verify(text: &str) -> Vec<(SyntaxKind, &str)> { - let mut tokens = Lexer::new(text).tokens; - tokens.reverse(); - tokens - } - - #[test] - fn test_empty() { - assert_debug_snapshot!(verify(r#""#)); - } - - #[test] - fn test_delimiters() { - assert_debug_snapshot!(verify(r#"{foo} (bar) [baz, qux = foo-bar]"#)); - } - - #[test] - fn test_command_with_parameter() { - assert_debug_snapshot!(verify(r#"\newcommand{\id}[1]{#1}"#)); - } - - #[test] - fn test_command_with_star() { - assert_debug_snapshot!(verify(r#"\section*{Foo}"#)); - } - - #[test] - fn test_escape_sequence() { - assert_debug_snapshot!(verify(r#"\% hello"#)); - } - - #[test] - fn test_formula() { - assert_debug_snapshot!(verify(r#"$ f(x) = y $$"#)); - } - - #[test] - fn test_comment() { - assert_debug_snapshot!(verify("hello %world\r\ntest %test")); - } - - #[test] - fn test_invalid_parameter() { - assert_debug_snapshot!(verify(r#"#"#)) - } - - #[test] - fn test_line_break() { - assert_debug_snapshot!(verify("hello\nworld")); - } - - #[test] - fn test_block_comment() { - assert_debug_snapshot!(verify("Foo\\iffalse\n\\Bar{Baz}\n\\fi\\Qux")); - } - - #[test] - fn test_asymptote() { - assert_debug_snapshot!(verify( - r#"\begin{asy} - printf("Hello World\n"); -\end{asy}"# - )); - } -} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap new file mode 100644 index 0000000000..f2e1163eff --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@comment.txt.snap @@ -0,0 +1,10 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/comment.txt +--- +ROOT@0..82 + JUNK@0..16 "Some junk here\n\n" + TYPE@16..24 "@comment" + JUNK@24..82 "{foo,\n author = {F ..." + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap new file mode 100644 index 0000000000..922e926cef --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@issue_809.txt.snap @@ -0,0 +1,31 @@ +--- +source: src/parser/bibtex.rs +expression: root +--- +ROOT@0..50 + ENTRY@0..50 + TYPE@0..8 "@article" + L_DELIM@8..9 "{" + NAME@9..18 "issue_809" + COMMA@18..19 "," + WHITESPACE@19..22 "\n " + FIELD@22..48 + NAME@22..27 "title" + WHITESPACE@27..28 " " + EQ@28..29 "=" + WHITESPACE@29..30 " " + CURLY_GROUP@30..47 + L_CURLY@30..31 "{" + WORD@31..34 "foo" + WHITESPACE@34..35 " " + WORD@35..36 "(" + QUOTE@36..37 "\"" + WHITESPACE@37..38 " " + WORD@38..42 "bar)" + WHITESPACE@42..43 " " + WORD@43..46 "baz" + R_CURLY@46..47 "}" + COMMA@47..48 "," + WHITESPACE@48..49 "\n" + R_DELIM@49..50 "}" + diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__preamble.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap index 596a9d108a..26d8a919ba 100644 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__preamble.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@preamble.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/bibtex/tests.rs -assertion_line: 11 -expression: "setup(r#\"@preamble{\"Hello World!\"}\"#)" +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/preamble.txt --- ROOT@0..25 PREAMBLE@0..25 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap new file mode 100644 index 0000000000..d1d34942d8 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aho_2006.txt.snap @@ -0,0 +1,132 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/aho_2006.txt +--- +ROOT@0..314 + ENTRY@0..314 + TYPE@0..5 "@book" + L_DELIM@5..6 "{" + NAME@6..21 "10.5555/1177220" + COMMA@21..22 "," + WHITESPACE@22..27 "\n " + FIELD@27..111 + NAME@27..33 "author" + WHITESPACE@33..34 " " + EQ@34..35 "=" + WHITESPACE@35..36 " " + CURLY_GROUP@36..110 + L_CURLY@36..37 "{" + WORD@37..40 "Aho" + COMMA@40..41 "," + WHITESPACE@41..42 " " + WORD@42..48 "Alfred" + WHITESPACE@48..49 " " + WORD@49..51 "V." + WHITESPACE@51..52 " " + WORD@52..55 "and" + WHITESPACE@55..56 " " + WORD@56..59 "Lam" + COMMA@59..60 "," + WHITESPACE@60..61 " " + WORD@61..67 "Monica" + WHITESPACE@67..68 " " + WORD@68..70 "S." + WHITESPACE@70..71 " " + WORD@71..74 "and" + WHITESPACE@74..75 " " + WORD@75..80 "Sethi" + COMMA@80..81 "," + WHITESPACE@81..82 " " + WORD@82..86 "Ravi" + WHITESPACE@86..87 " " + WORD@87..90 "and" + WHITESPACE@90..91 " " + WORD@91..97 "Ullman" + COMMA@97..98 "," + WHITESPACE@98..99 " " + WORD@99..106 "Jeffrey" + WHITESPACE@106..107 " " + WORD@107..109 "D." + R_CURLY@109..110 "}" + COMMA@110..111 "," + WHITESPACE@111..116 "\n " + FIELD@116..185 + NAME@116..121 "title" + WHITESPACE@121..122 " " + EQ@122..123 "=" + WHITESPACE@123..124 " " + CURLY_GROUP@124..184 + L_CURLY@124..125 "{" + WORD@125..135 "Compilers:" + WHITESPACE@135..136 " " + WORD@136..146 "Principles" + COMMA@146..147 "," + WHITESPACE@147..148 " " + WORD@148..158 "Techniques" + COMMA@158..159 "," + WHITESPACE@159..160 " " + WORD@160..163 "and" + WHITESPACE@163..164 " " + WORD@164..169 "Tools" + WHITESPACE@169..170 " " + WORD@170..174 "(2nd" + WHITESPACE@174..175 " " + WORD@175..183 "Edition)" + R_CURLY@183..184 "}" + COMMA@184..185 "," + WHITESPACE@185..190 "\n " + FIELD@190..204 + NAME@190..194 "year" + WHITESPACE@194..195 " " + EQ@195..196 "=" + WHITESPACE@196..197 " " + CURLY_GROUP@197..203 + L_CURLY@197..198 "{" + INTEGER@198..202 "2006" + R_CURLY@202..203 "}" + COMMA@203..204 "," + WHITESPACE@204..209 "\n " + FIELD@209..229 + NAME@209..213 "isbn" + WHITESPACE@213..214 " " + EQ@214..215 "=" + WHITESPACE@215..216 " " + CURLY_GROUP@216..228 + L_CURLY@216..217 "{" + INTEGER@217..227 "0321486811" + R_CURLY@227..228 "}" + COMMA@228..229 "," + WHITESPACE@229..234 "\n " + FIELD@234..292 + NAME@234..243 "publisher" + WHITESPACE@243..244 " " + EQ@244..245 "=" + WHITESPACE@245..246 " " + CURLY_GROUP@246..291 + L_CURLY@246..247 "{" + WORD@247..261 "Addison-Wesley" + WHITESPACE@261..262 " " + WORD@262..269 "Longman" + WHITESPACE@269..270 " " + WORD@270..280 "Publishing" + WHITESPACE@280..281 " " + WORD@281..284 "Co." + COMMA@284..285 "," + WHITESPACE@285..286 " " + WORD@286..290 "Inc." + R_CURLY@290..291 "}" + COMMA@291..292 "," + WHITESPACE@292..297 "\n " + FIELD@297..313 + NAME@297..304 "address" + WHITESPACE@304..305 " " + EQ@305..306 "=" + WHITESPACE@306..307 " " + CURLY_GROUP@307..312 + L_CURLY@307..308 "{" + WORD@308..311 "USA" + R_CURLY@311..312 "}" + WHITESPACE@312..313 "\n" + R_DELIM@313..314 "}" + diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_002.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap index 5607e5a507..72e354e3c0 100644 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_002.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__aksin_2006.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/bibtex/tests.rs -assertion_line: 87 -expression: "setup(r#\"@string{jomch = {J.~Organomet. Chem.}}\n\n@article{aksin,\n author = {Aks{\\i}n, {\\\"O}zge and T{\\\"u}rkmen, Hayati and Artok, Levent\n and {\\c{C}}etinkaya, Bekir and Ni, Chaoying and\n B{\\\"u}y{\\\"u}kg{\\\"u}ng{\\\"o}r, Orhan and {\\\"O}zkal, Erhan},\n title = {Effect of immobilization on catalytic characteristics of\n saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}\n reactions},\n journaltitle = jomch,\n date = 2006,\n volume = 691,\n number = 13,\n pages = {3027-3036},\n indextitle = {Effect of immobilization on catalytic characteristics},\n}\"#)" +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/aksin_2006.txt --- ROOT@0..679 STRING@0..40 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap new file mode 100644 index 0000000000..cff0323cb4 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__almendro_1998.txt.snap @@ -0,0 +1,246 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/almendro_1998.txt +--- +ROOT@0..706 + ENTRY@0..706 + TYPE@0..7 "@patent" + L_DELIM@7..8 "{" + NAME@8..16 "almendro" + COMMA@16..17 "," + WHITESPACE@17..22 "\n " + FIELD@22..150 + NAME@22..28 "author" + WHITESPACE@28..35 " " + EQ@35..36 "=" + WHITESPACE@36..37 " " + CURLY_GROUP@37..149 + L_CURLY@37..38 "{" + WORD@38..46 "Almendro" + COMMA@46..47 "," + WHITESPACE@47..48 " " + WORD@48..51 "Jos" + CURLY_GROUP@51..56 + L_CURLY@51..52 "{" + ACCENT@52..55 + ACCENT_NAME@52..54 "\\'" + WORD@54..55 "e" + R_CURLY@55..56 "}" + WHITESPACE@56..57 " " + WORD@57..59 "L." + WHITESPACE@59..60 " " + WORD@60..63 "and" + WHITESPACE@63..64 " " + WORD@64..68 "Mart" + CURLY_GROUP@68..73 + L_CURLY@68..69 "{" + ACCENT@69..72 + ACCENT_NAME@69..71 "\\'" + WORD@71..72 "i" + R_CURLY@72..73 "}" + WORD@73..74 "n" + COMMA@74..75 "," + WHITESPACE@75..76 " " + WORD@76..83 "Jacinto" + WHITESPACE@83..84 " " + WORD@84..87 "and" + WHITESPACE@87..88 " " + WORD@88..89 "S" + CURLY_GROUP@89..94 + L_CURLY@89..90 "{" + ACCENT@90..93 + ACCENT_NAME@90..92 "\\'" + WORD@92..93 "a" + R_CURLY@93..94 "}" + WORD@94..99 "nchez" + COMMA@99..100 "," + WHITESPACE@100..121 "\n " + WORD@121..128 "Alberto" + WHITESPACE@128..129 " " + WORD@129..132 "and" + WHITESPACE@132..133 " " + WORD@133..138 "Nozal" + COMMA@138..139 "," + WHITESPACE@139..140 " " + WORD@140..148 "Fernando" + R_CURLY@148..149 "}" + COMMA@149..150 "," + WHITESPACE@150..155 "\n " + FIELD@155..203 + NAME@155..160 "title" + WHITESPACE@160..168 " " + EQ@168..169 "=" + WHITESPACE@169..170 " " + CURLY_GROUP@170..202 + L_CURLY@170..171 "{" + WORD@171..190 "Elektromagnetisches" + WHITESPACE@190..191 " " + WORD@191..201 "Signalhorn" + R_CURLY@201..202 "}" + COMMA@202..203 "," + WHITESPACE@203..208 "\n " + FIELD@208..238 + NAME@208..214 "number" + WHITESPACE@214..221 " " + EQ@221..222 "=" + WHITESPACE@222..223 " " + CURLY_GROUP@223..237 + L_CURLY@223..224 "{" + WORD@224..236 "EU-29702195U" + R_CURLY@236..237 "}" + COMMA@237..238 "," + WHITESPACE@238..243 "\n " + FIELD@243..263 + NAME@243..247 "date" + WHITESPACE@247..256 " " + EQ@256..257 "=" + WHITESPACE@257..258 " " + LITERAL@258..262 + INTEGER@258..262 "1998" + COMMA@262..263 "," + WHITESPACE@263..268 "\n " + FIELD@268..323 + NAME@268..276 "location" + WHITESPACE@276..281 " " + EQ@281..282 "=" + WHITESPACE@282..283 " " + CURLY_GROUP@283..322 + L_CURLY@283..284 "{" + WORD@284..293 "countryfr" + WHITESPACE@293..294 " " + WORD@294..297 "and" + WHITESPACE@297..298 " " + WORD@298..307 "countryuk" + WHITESPACE@307..308 " " + WORD@308..311 "and" + WHITESPACE@311..312 " " + WORD@312..321 "countryde" + R_CURLY@321..322 "}" + COMMA@322..323 "," + WHITESPACE@323..328 "\n " + FIELD@328..352 + NAME@328..334 "langid" + WHITESPACE@334..341 " " + EQ@341..342 "=" + WHITESPACE@342..343 " " + CURLY_GROUP@343..351 + L_CURLY@343..344 "{" + WORD@344..350 "german" + R_CURLY@350..351 "}" + COMMA@351..352 "," + WHITESPACE@352..357 "\n " + FIELD@357..704 + NAME@357..367 "annotation" + WHITESPACE@367..370 " " + EQ@370..371 "=" + WHITESPACE@371..372 " " + CURLY_GROUP@372..703 + L_CURLY@372..373 "{" + WORD@373..377 "This" + WHITESPACE@377..378 " " + WORD@378..380 "is" + WHITESPACE@380..381 " " + WORD@381..382 "a" + WHITESPACE@382..383 " " + COMMAND@383..390 + COMMAND_NAME@383..390 "\\texttt" + CURLY_GROUP@390..398 + L_CURLY@390..391 "{" + WORD@391..397 "patent" + R_CURLY@397..398 "}" + WHITESPACE@398..399 " " + WORD@399..404 "entry" + WHITESPACE@404..405 " " + WORD@405..409 "with" + WHITESPACE@409..410 " " + WORD@410..411 "a" + WHITESPACE@411..412 " " + COMMAND@412..419 + COMMAND_NAME@412..419 "\\texttt" + CURLY_GROUP@419..429 + L_CURLY@419..420 "{" + WORD@420..428 "location" + R_CURLY@428..429 "}" + WHITESPACE@429..450 "\n " + WORD@450..456 "field." + WHITESPACE@456..457 " " + WORD@457..460 "The" + WHITESPACE@460..461 " " + WORD@461..467 "number" + WHITESPACE@467..468 " " + WORD@468..470 "is" + WHITESPACE@470..471 " " + WORD@471..476 "given" + WHITESPACE@476..477 " " + WORD@477..479 "in" + WHITESPACE@479..480 " " + WORD@480..483 "the" + WHITESPACE@483..484 " " + COMMAND@484..491 + COMMAND_NAME@484..491 "\\texttt" + CURLY_GROUP@491..499 + L_CURLY@491..492 "{" + WORD@492..498 "number" + R_CURLY@498..499 "}" + WHITESPACE@499..500 " " + WORD@500..506 "field." + WHITESPACE@506..507 " " + WORD@507..511 "Note" + WHITESPACE@511..532 "\n " + WORD@532..535 "the" + WHITESPACE@535..536 " " + WORD@536..542 "format" + WHITESPACE@542..543 " " + WORD@543..545 "of" + WHITESPACE@545..546 " " + WORD@546..549 "the" + WHITESPACE@549..550 " " + COMMAND@550..557 + COMMAND_NAME@550..557 "\\texttt" + CURLY_GROUP@557..567 + L_CURLY@557..558 "{" + WORD@558..566 "location" + R_CURLY@566..567 "}" + WHITESPACE@567..568 " " + WORD@568..573 "field" + WHITESPACE@573..574 " " + WORD@574..576 "in" + WHITESPACE@576..577 " " + WORD@577..580 "the" + WHITESPACE@580..581 " " + WORD@581..589 "database" + WHITESPACE@589..610 "\n " + WORD@610..615 "file." + WHITESPACE@615..616 " " + WORD@616..623 "Compare" + WHITESPACE@623..624 " " + COMMAND@624..631 + COMMAND_NAME@624..631 "\\texttt" + CURLY_GROUP@631..643 + L_CURLY@631..632 "{" + WORD@632..642 "laufenberg" + R_CURLY@642..643 "}" + COMMA@643..644 "," + WHITESPACE@644..645 " " + COMMAND@645..652 + COMMAND_NAME@645..652 "\\texttt" + CURLY_GROUP@652..660 + L_CURLY@652..653 "{" + WORD@653..659 "sorace" + R_CURLY@659..660 "}" + COMMA@660..661 "," + WHITESPACE@661..662 " " + WORD@662..665 "and" + WHITESPACE@665..686 "\n " + COMMAND@686..693 + COMMAND_NAME@686..693 "\\texttt" + CURLY_GROUP@693..702 + L_CURLY@693..694 "{" + WORD@694..701 "kowalik" + R_CURLY@701..702 "}" + R_CURLY@702..703 "}" + COMMA@703..704 "," + WHITESPACE@704..705 "\n" + R_DELIM@705..706 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap new file mode 100644 index 0000000000..c02d61d272 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__averroes_1998.txt.snap @@ -0,0 +1,351 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/averroes_1998.txt +--- +ROOT@0..1008 + ENTRY@0..1008 + TYPE@0..5 "@book" + L_DELIM@5..6 "{" + NAME@6..20 "averroes/bland" + COMMA@20..21 "," + WHITESPACE@21..26 "\n " + FIELD@26..52 + NAME@26..32 "author" + WHITESPACE@32..39 " " + EQ@39..40 "=" + WHITESPACE@40..41 " " + CURLY_GROUP@41..51 + L_CURLY@41..42 "{" + WORD@42..50 "Averroes" + R_CURLY@50..51 "}" + COMMA@51..52 "," + WHITESPACE@52..57 "\n " + FIELD@57..220 + NAME@57..62 "title" + WHITESPACE@62..70 " " + EQ@70..71 "=" + WHITESPACE@71..72 " " + CURLY_GROUP@72..219 + L_CURLY@72..73 "{" + WORD@73..76 "The" + WHITESPACE@76..77 " " + WORD@77..84 "Epistle" + WHITESPACE@84..85 " " + WORD@85..87 "on" + WHITESPACE@87..88 " " + WORD@88..91 "the" + WHITESPACE@91..92 " " + WORD@92..103 "Possibility" + WHITESPACE@103..104 " " + WORD@104..106 "of" + WHITESPACE@106..107 " " + WORD@107..118 "Conjunction" + WHITESPACE@118..119 " " + WORD@119..123 "with" + WHITESPACE@123..124 " " + WORD@124..127 "the" + WHITESPACE@127..128 " " + WORD@128..134 "Active" + WHITESPACE@134..155 "\n " + WORD@155..164 "Intellect" + WHITESPACE@164..165 " " + WORD@165..167 "by" + WHITESPACE@167..168 " " + CURLY_GROUP@168..179 + L_CURLY@168..169 "{" + WORD@169..172 "Ibn" + WHITESPACE@172..173 " " + WORD@173..178 "Rushd" + R_CURLY@178..179 "}" + WHITESPACE@179..180 " " + WORD@180..184 "with" + WHITESPACE@184..185 " " + WORD@185..188 "the" + WHITESPACE@188..189 " " + WORD@189..199 "Commentary" + WHITESPACE@199..200 " " + WORD@200..202 "of" + WHITESPACE@202..203 " " + CURLY_GROUP@203..218 + L_CURLY@203..204 "{" + WORD@204..209 "Moses" + WHITESPACE@209..210 " " + WORD@210..217 "Narboni" + R_CURLY@217..218 "}" + R_CURLY@218..219 "}" + COMMA@219..220 "," + WHITESPACE@220..225 "\n " + FIELD@225..245 + NAME@225..229 "date" + WHITESPACE@229..238 " " + EQ@238..239 "=" + WHITESPACE@239..240 " " + LITERAL@240..244 + INTEGER@240..244 "1982" + COMMA@244..245 "," + WHITESPACE@245..250 "\n " + FIELD@250..284 + NAME@250..256 "editor" + WHITESPACE@256..263 " " + EQ@263..264 "=" + WHITESPACE@264..265 " " + CURLY_GROUP@265..283 + L_CURLY@265..266 "{" + WORD@266..271 "Bland" + COMMA@271..272 "," + WHITESPACE@272..273 " " + WORD@273..279 "Kalman" + WHITESPACE@279..280 " " + WORD@280..282 "P." + R_CURLY@282..283 "}" + COMMA@283..284 "," + WHITESPACE@284..289 "\n " + FIELD@289..323 + NAME@289..299 "translator" + WHITESPACE@299..302 " " + EQ@302..303 "=" + WHITESPACE@303..304 " " + CURLY_GROUP@304..322 + L_CURLY@304..305 "{" + WORD@305..310 "Bland" + COMMA@310..311 "," + WHITESPACE@311..312 " " + WORD@312..318 "Kalman" + WHITESPACE@318..319 " " + WORD@319..321 "P." + R_CURLY@321..322 "}" + COMMA@322..323 "," + WHITESPACE@323..328 "\n " + FIELD@328..407 + NAME@328..334 "series" + WHITESPACE@334..341 " " + EQ@341..342 "=" + WHITESPACE@342..343 " " + CURLY_GROUP@343..406 + L_CURLY@343..344 "{" + WORD@344..353 "Moreshet:" + WHITESPACE@353..354 " " + WORD@354..361 "Studies" + WHITESPACE@361..362 " " + WORD@362..364 "in" + WHITESPACE@364..365 " " + CURLY_GROUP@365..373 + L_CURLY@365..366 "{" + WORD@366..372 "Jewish" + R_CURLY@372..373 "}" + WHITESPACE@373..374 " " + WORD@374..381 "History" + COMMA@381..382 "," + WHITESPACE@382..383 " " + WORD@383..393 "Literature" + WHITESPACE@393..394 " " + WORD@394..397 "and" + WHITESPACE@397..398 " " + WORD@398..405 "Thought" + R_CURLY@405..406 "}" + COMMA@406..407 "," + WHITESPACE@407..412 "\n " + FIELD@412..429 + NAME@412..418 "number" + WHITESPACE@418..425 " " + EQ@425..426 "=" + WHITESPACE@426..427 " " + LITERAL@427..428 + INTEGER@427..428 "7" + COMMA@428..429 "," + WHITESPACE@429..434 "\n " + FIELD@434..490 + NAME@434..443 "publisher" + WHITESPACE@443..447 " " + EQ@447..448 "=" + WHITESPACE@448..449 " " + CURLY_GROUP@449..489 + L_CURLY@449..450 "{" + WORD@450..456 "Jewish" + WHITESPACE@456..457 " " + WORD@457..468 "Theological" + WHITESPACE@468..469 " " + WORD@469..477 "Seminary" + WHITESPACE@477..478 " " + WORD@478..480 "of" + WHITESPACE@480..481 " " + WORD@481..488 "America" + R_CURLY@488..489 "}" + COMMA@489..490 "," + WHITESPACE@490..495 "\n " + FIELD@495..521 + NAME@495..503 "location" + WHITESPACE@503..508 " " + EQ@508..509 "=" + WHITESPACE@509..510 " " + CURLY_GROUP@510..520 + L_CURLY@510..511 "{" + WORD@511..514 "New" + WHITESPACE@514..515 " " + WORD@515..519 "York" + R_CURLY@519..520 "}" + COMMA@520..521 "," + WHITESPACE@521..526 "\n " + FIELD@526..551 + NAME@526..534 "keywords" + WHITESPACE@534..539 " " + EQ@539..540 "=" + WHITESPACE@540..541 " " + CURLY_GROUP@541..550 + L_CURLY@541..542 "{" + WORD@542..549 "primary" + R_CURLY@549..550 "}" + COMMA@550..551 "," + WHITESPACE@551..556 "\n " + FIELD@556..581 + NAME@556..562 "langid" + WHITESPACE@562..569 " " + EQ@569..570 "=" + WHITESPACE@570..571 " " + CURLY_GROUP@571..580 + L_CURLY@571..572 "{" + WORD@572..579 "english" + R_CURLY@579..580 "}" + COMMA@580..581 "," + WHITESPACE@581..586 "\n " + FIELD@586..620 + NAME@586..596 "langidopts" + WHITESPACE@596..599 " " + EQ@599..600 "=" + WHITESPACE@600..601 " " + CURLY_GROUP@601..619 + L_CURLY@601..602 "{" + WORD@602..618 "variant=american" + R_CURLY@618..619 "}" + COMMA@619..620 "," + WHITESPACE@620..625 "\n " + FIELD@625..689 + NAME@625..635 "indextitle" + WHITESPACE@635..638 " " + EQ@638..639 "=" + WHITESPACE@639..640 " " + CURLY_GROUP@640..688 + L_CURLY@640..641 "{" + WORD@641..648 "Epistle" + WHITESPACE@648..649 " " + WORD@649..651 "on" + WHITESPACE@651..652 " " + WORD@652..655 "the" + WHITESPACE@655..656 " " + WORD@656..667 "Possibility" + WHITESPACE@667..668 " " + WORD@668..670 "of" + WHITESPACE@670..671 " " + WORD@671..682 "Conjunction" + COMMA@682..683 "," + WHITESPACE@683..684 " " + WORD@684..687 "The" + R_CURLY@687..688 "}" + COMMA@688..689 "," + WHITESPACE@689..694 "\n " + FIELD@694..738 + NAME@694..704 "shorttitle" + WHITESPACE@704..707 " " + EQ@707..708 "=" + WHITESPACE@708..709 " " + CURLY_GROUP@709..737 + L_CURLY@709..710 "{" + WORD@710..721 "Possibility" + WHITESPACE@721..722 " " + WORD@722..724 "of" + WHITESPACE@724..725 " " + WORD@725..736 "Conjunction" + R_CURLY@736..737 "}" + COMMA@737..738 "," + WHITESPACE@738..743 "\n " + FIELD@743..1006 + NAME@743..753 "annotation" + WHITESPACE@753..756 " " + EQ@756..757 "=" + WHITESPACE@757..758 " " + CURLY_GROUP@758..1005 + L_CURLY@758..759 "{" + WORD@759..760 "A" + WHITESPACE@760..761 " " + COMMAND@761..768 + COMMAND_NAME@761..768 "\\texttt" + CURLY_GROUP@768..774 + L_CURLY@768..769 "{" + WORD@769..773 "book" + R_CURLY@773..774 "}" + WHITESPACE@774..775 " " + WORD@775..780 "entry" + WHITESPACE@780..781 " " + WORD@781..785 "with" + WHITESPACE@785..786 " " + WORD@786..787 "a" + WHITESPACE@787..788 " " + COMMAND@788..795 + COMMAND_NAME@788..795 "\\texttt" + CURLY_GROUP@795..803 + L_CURLY@795..796 "{" + WORD@796..802 "series" + R_CURLY@802..803 "}" + WHITESPACE@803..804 " " + WORD@804..807 "and" + WHITESPACE@807..808 " " + WORD@808..809 "a" + WHITESPACE@809..830 "\n " + COMMAND@830..837 + COMMAND_NAME@830..837 "\\texttt" + CURLY_GROUP@837..845 + L_CURLY@837..838 "{" + WORD@838..844 "number" + R_CURLY@844..845 "}" + WORD@845..846 "." + WHITESPACE@846..847 " " + WORD@847..851 "Note" + WHITESPACE@851..852 " " + WORD@852..855 "the" + WHITESPACE@855..856 " " + WORD@856..869 "concatenation" + WHITESPACE@869..870 " " + WORD@870..872 "of" + WHITESPACE@872..873 " " + WORD@873..876 "the" + WHITESPACE@876..877 " " + COMMAND@877..884 + COMMAND_NAME@877..884 "\\texttt" + CURLY_GROUP@884..892 + L_CURLY@884..885 "{" + WORD@885..891 "editor" + R_CURLY@891..892 "}" + WHITESPACE@892..913 "\n " + WORD@913..916 "and" + WHITESPACE@916..917 " " + COMMAND@917..924 + COMMAND_NAME@917..924 "\\texttt" + CURLY_GROUP@924..936 + L_CURLY@924..925 "{" + WORD@925..935 "translator" + R_CURLY@935..936 "}" + WHITESPACE@936..937 " " + WORD@937..943 "fields" + WHITESPACE@943..944 " " + WORD@944..946 "as" + WHITESPACE@946..947 " " + WORD@947..951 "well" + WHITESPACE@951..952 " " + WORD@952..954 "as" + WHITESPACE@954..955 " " + WORD@955..958 "the" + WHITESPACE@958..979 "\n " + COMMAND@979..986 + COMMAND_NAME@979..986 "\\texttt" + CURLY_GROUP@986..998 + L_CURLY@986..987 "{" + WORD@987..997 "indextitle" + R_CURLY@997..998 "}" + WHITESPACE@998..999 " " + WORD@999..1004 "field" + R_CURLY@1004..1005 "}" + COMMA@1005..1006 "," + WHITESPACE@1006..1007 "\n" + R_DELIM@1007..1008 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap new file mode 100644 index 0000000000..c2748c1661 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__betram_1996.txt.snap @@ -0,0 +1,208 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/betram_1996.txt +--- +ROOT@0..556 + STRING@0..40 + TYPE@0..7 "@string" + L_DELIM@7..8 "{" + NAME@8..12 "jams" + WHITESPACE@12..16 " " + EQ@16..17 "=" + WHITESPACE@17..18 " " + CURLY_GROUP@18..39 + L_CURLY@18..19 "{" + WORD@19..21 "J." + NBSP@21..22 "~" + WORD@22..27 "Amer." + WHITESPACE@27..28 " " + WORD@28..33 "Math." + WHITESPACE@33..34 " " + WORD@34..38 "Soc." + R_CURLY@38..39 "}" + R_DELIM@39..40 "}" + JUNK@40..42 "\n\n" + ENTRY@42..556 + TYPE@42..50 "@article" + L_DELIM@50..51 "{" + NAME@51..58 "bertram" + COMMA@58..59 "," + WHITESPACE@59..64 "\n " + FIELD@64..119 + NAME@64..70 "author" + WHITESPACE@70..77 " " + EQ@77..78 "=" + WHITESPACE@78..79 " " + CURLY_GROUP@79..118 + L_CURLY@79..80 "{" + WORD@80..87 "Bertram" + COMMA@87..88 "," + WHITESPACE@88..89 " " + WORD@89..94 "Aaron" + WHITESPACE@94..95 " " + WORD@95..98 "and" + WHITESPACE@98..99 " " + WORD@99..108 "Wentworth" + COMMA@108..109 "," + WHITESPACE@109..110 " " + WORD@110..117 "Richard" + R_CURLY@117..118 "}" + COMMA@118..119 "," + WHITESPACE@119..124 "\n " + FIELD@124..202 + NAME@124..129 "title" + WHITESPACE@129..137 " " + EQ@137..138 "=" + WHITESPACE@138..139 " " + CURLY_GROUP@139..201 + L_CURLY@139..140 "{" + WORD@140..146 "Gromov" + WHITESPACE@146..147 " " + WORD@147..157 "invariants" + WHITESPACE@157..158 " " + WORD@158..161 "for" + WHITESPACE@161..162 " " + WORD@162..173 "holomorphic" + WHITESPACE@173..174 " " + WORD@174..178 "maps" + WHITESPACE@178..179 " " + WORD@179..181 "on" + WHITESPACE@181..182 " " + CURLY_GROUP@182..191 + L_CURLY@182..183 "{" + WORD@183..190 "Riemann" + R_CURLY@190..191 "}" + WHITESPACE@191..192 " " + WORD@192..200 "surfaces" + R_CURLY@200..201 "}" + COMMA@201..202 "," + WHITESPACE@202..207 "\n " + FIELD@207..227 + NAME@207..219 "journaltitle" + WHITESPACE@219..220 " " + EQ@220..221 "=" + WHITESPACE@221..222 " " + LITERAL@222..226 + NAME@222..226 "jams" + COMMA@226..227 "," + WHITESPACE@227..232 "\n " + FIELD@232..252 + NAME@232..236 "date" + WHITESPACE@236..245 " " + EQ@245..246 "=" + WHITESPACE@246..247 " " + LITERAL@247..251 + INTEGER@247..251 "1996" + COMMA@251..252 "," + WHITESPACE@252..257 "\n " + FIELD@257..274 + NAME@257..263 "volume" + WHITESPACE@263..270 " " + EQ@270..271 "=" + WHITESPACE@271..272 " " + LITERAL@272..273 + INTEGER@272..273 "9" + COMMA@273..274 "," + WHITESPACE@274..279 "\n " + FIELD@279..296 + NAME@279..285 "number" + WHITESPACE@285..292 " " + EQ@292..293 "=" + WHITESPACE@293..294 " " + LITERAL@294..295 + INTEGER@294..295 "2" + COMMA@295..296 "," + WHITESPACE@296..301 "\n " + FIELD@301..326 + NAME@301..306 "pages" + WHITESPACE@306..314 " " + EQ@314..315 "=" + WHITESPACE@315..316 " " + CURLY_GROUP@316..325 + L_CURLY@316..317 "{" + WORD@317..324 "529-571" + R_CURLY@324..325 "}" + COMMA@325..326 "," + WHITESPACE@326..331 "\n " + FIELD@331..356 + NAME@331..337 "langid" + WHITESPACE@337..344 " " + EQ@344..345 "=" + WHITESPACE@345..346 " " + CURLY_GROUP@346..355 + L_CURLY@346..347 "{" + WORD@347..354 "english" + R_CURLY@354..355 "}" + COMMA@355..356 "," + WHITESPACE@356..361 "\n " + FIELD@361..395 + NAME@361..371 "langidopts" + WHITESPACE@371..374 " " + EQ@374..375 "=" + WHITESPACE@375..376 " " + CURLY_GROUP@376..394 + L_CURLY@376..377 "{" + WORD@377..393 "variant=american" + R_CURLY@393..394 "}" + COMMA@394..395 "," + WHITESPACE@395..400 "\n " + FIELD@400..435 + NAME@400..410 "shorttitle" + WHITESPACE@410..413 " " + EQ@413..414 "=" + WHITESPACE@414..415 " " + CURLY_GROUP@415..434 + L_CURLY@415..416 "{" + WORD@416..422 "Gromov" + WHITESPACE@422..423 " " + WORD@423..433 "invariants" + R_CURLY@433..434 "}" + COMMA@434..435 "," + WHITESPACE@435..440 "\n " + FIELD@440..554 + NAME@440..450 "annotation" + WHITESPACE@450..453 " " + EQ@453..454 "=" + WHITESPACE@454..455 " " + CURLY_GROUP@455..553 + L_CURLY@455..456 "{" + WORD@456..458 "An" + WHITESPACE@458..459 " " + COMMAND@459..466 + COMMAND_NAME@459..466 "\\texttt" + CURLY_GROUP@466..475 + L_CURLY@466..467 "{" + WORD@467..474 "article" + R_CURLY@474..475 "}" + WHITESPACE@475..476 " " + WORD@476..481 "entry" + WHITESPACE@481..482 " " + WORD@482..486 "with" + WHITESPACE@486..487 " " + WORD@487..488 "a" + WHITESPACE@488..489 " " + COMMAND@489..496 + COMMAND_NAME@489..496 "\\texttt" + CURLY_GROUP@496..504 + L_CURLY@496..497 "{" + WORD@497..503 "volume" + R_CURLY@503..504 "}" + WHITESPACE@504..505 " " + WORD@505..508 "and" + WHITESPACE@508..509 " " + WORD@509..510 "a" + WHITESPACE@510..531 "\n " + COMMAND@531..538 + COMMAND_NAME@531..538 "\\texttt" + CURLY_GROUP@538..546 + L_CURLY@538..539 "{" + WORD@539..545 "number" + R_CURLY@545..546 "}" + WHITESPACE@546..547 " " + WORD@547..552 "field" + R_CURLY@552..553 "}" + COMMA@553..554 "," + WHITESPACE@554..555 "\n" + R_DELIM@555..556 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap new file mode 100644 index 0000000000..417bda4ec9 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__blom_2021.txt.snap @@ -0,0 +1,223 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/blom_2021.txt +--- +ROOT@0..860 + ENTRY@0..860 + TYPE@0..8 "@article" + L_DELIM@8..9 "{" + NAME@9..42 "DBLP:journals/corr/ab ..." + COMMA@42..43 "," + WHITESPACE@43..48 "\n " + FIELD@48..322 + NAME@48..54 "author" + WHITESPACE@54..58 " " + EQ@58..59 "=" + WHITESPACE@59..60 " " + CURLY_GROUP@60..321 + L_CURLY@60..61 "{" + WORD@61..69 "Michelle" + WHITESPACE@69..70 " " + WORD@70..72 "L." + WHITESPACE@72..73 " " + WORD@73..77 "Blom" + WHITESPACE@77..78 " " + WORD@78..81 "and" + WHITESPACE@81..102 "\n " + WORD@102..109 "Jurlind" + WHITESPACE@109..110 " " + WORD@110..119 "Budurushi" + WHITESPACE@119..120 " " + WORD@120..123 "and" + WHITESPACE@123..144 "\n " + WORD@144..150 "Ronald" + WHITESPACE@150..151 " " + WORD@151..153 "L." + WHITESPACE@153..154 " " + WORD@154..160 "Rivest" + WHITESPACE@160..161 " " + WORD@161..164 "and" + WHITESPACE@164..185 "\n " + WORD@185..191 "Philip" + WHITESPACE@191..192 " " + WORD@192..194 "B." + WHITESPACE@194..195 " " + WORD@195..200 "Stark" + WHITESPACE@200..201 " " + WORD@201..204 "and" + WHITESPACE@204..225 "\n " + WORD@225..230 "Peter" + WHITESPACE@230..231 " " + WORD@231..233 "J." + WHITESPACE@233..234 " " + WORD@234..241 "Stuckey" + WHITESPACE@241..242 " " + WORD@242..245 "and" + WHITESPACE@245..266 "\n " + WORD@266..273 "Vanessa" + WHITESPACE@273..274 " " + WORD@274..280 "Teague" + WHITESPACE@280..281 " " + WORD@281..284 "and" + WHITESPACE@284..305 "\n " + WORD@305..311 "Damjan" + WHITESPACE@311..312 " " + WORD@312..320 "Vukcevic" + R_CURLY@320..321 "}" + COMMA@321..322 "," + WHITESPACE@322..327 "\n " + FIELD@327..473 + NAME@327..332 "title" + WHITESPACE@332..337 " " + EQ@337..338 "=" + WHITESPACE@338..339 " " + CURLY_GROUP@339..472 + L_CURLY@339..340 "{" + WORD@340..355 "Assertion-based" + WHITESPACE@355..356 " " + WORD@356..366 "Approaches" + WHITESPACE@366..367 " " + WORD@367..369 "to" + WHITESPACE@369..370 " " + WORD@370..378 "Auditing" + WHITESPACE@378..379 " " + WORD@379..386 "Complex" + WHITESPACE@386..387 " " + WORD@387..396 "Elections" + COMMA@396..397 "," + WHITESPACE@397..398 " " + WORD@398..402 "with" + WHITESPACE@402..403 " " + WORD@403..414 "application" + WHITESPACE@414..435 "\n " + WORD@435..437 "to" + WHITESPACE@437..438 " " + WORD@438..448 "party-list" + WHITESPACE@448..449 " " + WORD@449..461 "proportional" + WHITESPACE@461..462 " " + WORD@462..471 "elections" + R_CURLY@471..472 "}" + COMMA@472..473 "," + WHITESPACE@473..478 "\n " + FIELD@478..497 + NAME@478..485 "journal" + WHITESPACE@485..488 " " + EQ@488..489 "=" + WHITESPACE@489..490 " " + CURLY_GROUP@490..496 + L_CURLY@490..491 "{" + WORD@491..495 "CoRR" + R_CURLY@495..496 "}" + COMMA@496..497 "," + WHITESPACE@497..502 "\n " + FIELD@502..531 + NAME@502..508 "volume" + WHITESPACE@508..512 " " + EQ@512..513 "=" + WHITESPACE@513..514 " " + CURLY_GROUP@514..530 + L_CURLY@514..515 "{" + WORD@515..529 "abs/2107.11903" + R_CURLY@529..530 "}" + COMMA@530..531 "," + WHITESPACE@531..536 "\n " + FIELD@536..555 + NAME@536..540 "year" + WHITESPACE@540..546 " " + EQ@546..547 "=" + WHITESPACE@547..548 " " + CURLY_GROUP@548..554 + L_CURLY@548..549 "{" + INTEGER@549..553 "2021" + R_CURLY@553..554 "}" + COMMA@554..555 "," + WHITESPACE@555..560 "\n " + FIELD@560..607 + NAME@560..563 "url" + WHITESPACE@563..570 " " + EQ@570..571 "=" + WHITESPACE@571..572 " " + CURLY_GROUP@572..606 + L_CURLY@572..573 "{" + WORD@573..605 "https://arxiv.org/abs ..." + R_CURLY@605..606 "}" + COMMA@606..607 "," + WHITESPACE@607..612 "\n " + FIELD@612..633 + NAME@612..622 "eprinttype" + WHITESPACE@622..623 " " + EQ@623..624 "=" + WHITESPACE@624..625 " " + CURLY_GROUP@625..632 + L_CURLY@625..626 "{" + WORD@626..631 "arXiv" + R_CURLY@631..632 "}" + COMMA@632..633 "," + WHITESPACE@633..638 "\n " + FIELD@638..663 + NAME@638..644 "eprint" + WHITESPACE@644..648 " " + EQ@648..649 "=" + WHITESPACE@649..650 " " + CURLY_GROUP@650..662 + L_CURLY@650..651 "{" + WORD@651..661 "2107.11903" + R_CURLY@661..662 "}" + COMMA@662..663 "," + WHITESPACE@663..668 "\n " + FIELD@668..714 + NAME@668..677 "timestamp" + WHITESPACE@677..678 " " + EQ@678..679 "=" + WHITESPACE@679..680 " " + CURLY_GROUP@680..713 + L_CURLY@680..681 "{" + WORD@681..684 "Thu" + COMMA@684..685 "," + WHITESPACE@685..686 " " + INTEGER@686..688 "29" + WHITESPACE@688..689 " " + WORD@689..692 "Jul" + WHITESPACE@692..693 " " + INTEGER@693..697 "2021" + WHITESPACE@697..698 " " + WORD@698..706 "16:14:15" + WHITESPACE@706..707 " " + WORD@707..712 "+0200" + R_CURLY@712..713 "}" + COMMA@713..714 "," + WHITESPACE@714..719 "\n " + FIELD@719..787 + NAME@719..725 "biburl" + WHITESPACE@725..729 " " + EQ@729..730 "=" + WHITESPACE@730..731 " " + CURLY_GROUP@731..786 + L_CURLY@731..732 "{" + WORD@732..785 "https://dblp.org/rec/ ..." + R_CURLY@785..786 "}" + COMMA@786..787 "," + WHITESPACE@787..792 "\n " + FIELD@792..859 + NAME@792..801 "bibsource" + WHITESPACE@801..802 " " + EQ@802..803 "=" + WHITESPACE@803..804 " " + CURLY_GROUP@804..858 + L_CURLY@804..805 "{" + WORD@805..809 "dblp" + WHITESPACE@809..810 " " + WORD@810..818 "computer" + WHITESPACE@818..819 " " + WORD@819..826 "science" + WHITESPACE@826..827 " " + WORD@827..839 "bibliography" + COMMA@839..840 "," + WHITESPACE@840..841 " " + WORD@841..857 "https://dblp.org" + R_CURLY@857..858 "}" + WHITESPACE@858..859 "\n" + R_DELIM@859..860 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap new file mode 100644 index 0000000000..82f58a700f --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__combi_2004.txt.snap @@ -0,0 +1,251 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/combi_2004.txt +--- +ROOT@0..674 + ENTRY@0..674 + TYPE@0..14 "@inproceedings" + L_DELIM@14..15 "{" + NAME@15..36 "10.1145/967900.968040" + COMMA@36..37 "," + WHITESPACE@37..42 "\n " + FIELD@42..86 + NAME@42..48 "author" + WHITESPACE@48..49 " " + EQ@49..50 "=" + WHITESPACE@50..51 " " + CURLY_GROUP@51..85 + L_CURLY@51..52 "{" + WORD@52..57 "Combi" + COMMA@57..58 "," + WHITESPACE@58..59 " " + WORD@59..64 "Carlo" + WHITESPACE@64..65 " " + WORD@65..68 "and" + WHITESPACE@68..69 " " + WORD@69..74 "Pozzi" + COMMA@74..75 "," + WHITESPACE@75..76 " " + WORD@76..84 "Giuseppe" + R_CURLY@84..85 "}" + COMMA@85..86 "," + WHITESPACE@86..91 "\n " + FIELD@91..157 + NAME@91..96 "title" + WHITESPACE@96..97 " " + EQ@97..98 "=" + WHITESPACE@98..99 " " + CURLY_GROUP@99..156 + L_CURLY@99..100 "{" + WORD@100..113 "Architectures" + WHITESPACE@113..114 " " + WORD@114..117 "for" + WHITESPACE@117..118 " " + WORD@118..119 "a" + WHITESPACE@119..120 " " + WORD@120..128 "Temporal" + WHITESPACE@128..129 " " + WORD@129..137 "Workflow" + WHITESPACE@137..138 " " + WORD@138..148 "Management" + WHITESPACE@148..149 " " + WORD@149..155 "System" + R_CURLY@155..156 "}" + COMMA@156..157 "," + WHITESPACE@157..162 "\n " + FIELD@162..176 + NAME@162..166 "year" + WHITESPACE@166..167 " " + EQ@167..168 "=" + WHITESPACE@168..169 " " + CURLY_GROUP@169..175 + L_CURLY@169..170 "{" + INTEGER@170..174 "2004" + R_CURLY@174..175 "}" + COMMA@175..176 "," + WHITESPACE@176..181 "\n " + FIELD@181..201 + NAME@181..185 "isbn" + WHITESPACE@185..186 " " + EQ@186..187 "=" + WHITESPACE@187..188 " " + CURLY_GROUP@188..200 + L_CURLY@188..189 "{" + INTEGER@189..199 "1581138121" + R_CURLY@199..200 "}" + COMMA@200..201 "," + WHITESPACE@201..206 "\n " + FIELD@206..256 + NAME@206..215 "publisher" + WHITESPACE@215..216 " " + EQ@216..217 "=" + WHITESPACE@217..218 " " + CURLY_GROUP@218..255 + L_CURLY@218..219 "{" + WORD@219..230 "Association" + WHITESPACE@230..231 " " + WORD@231..234 "for" + WHITESPACE@234..235 " " + WORD@235..244 "Computing" + WHITESPACE@244..245 " " + WORD@245..254 "Machinery" + R_CURLY@254..255 "}" + COMMA@255..256 "," + WHITESPACE@256..261 "\n " + FIELD@261..291 + NAME@261..268 "address" + WHITESPACE@268..269 " " + EQ@269..270 "=" + WHITESPACE@270..271 " " + CURLY_GROUP@271..290 + L_CURLY@271..272 "{" + WORD@272..275 "New" + WHITESPACE@275..276 " " + WORD@276..280 "York" + COMMA@280..281 "," + WHITESPACE@281..282 " " + WORD@282..284 "NY" + COMMA@284..285 "," + WHITESPACE@285..286 " " + WORD@286..289 "USA" + R_CURLY@289..290 "}" + COMMA@290..291 "," + WHITESPACE@291..296 "\n " + FIELD@296..342 + NAME@296..299 "url" + WHITESPACE@299..300 " " + EQ@300..301 "=" + WHITESPACE@301..302 " " + CURLY_GROUP@302..341 + L_CURLY@302..303 "{" + WORD@303..340 "https://doi.org/10.11 ..." + R_CURLY@340..341 "}" + COMMA@341..342 "," + WHITESPACE@342..347 "\n " + FIELD@347..377 + NAME@347..350 "doi" + WHITESPACE@350..351 " " + EQ@351..352 "=" + WHITESPACE@352..353 " " + CURLY_GROUP@353..376 + L_CURLY@353..354 "{" + WORD@354..375 "10.1145/967900.968040" + R_CURLY@375..376 "}" + COMMA@376..377 "," + WHITESPACE@377..382 "\n " + FIELD@382..455 + NAME@382..391 "booktitle" + WHITESPACE@391..392 " " + EQ@392..393 "=" + WHITESPACE@393..394 " " + CURLY_GROUP@394..454 + L_CURLY@394..395 "{" + WORD@395..406 "Proceedings" + WHITESPACE@406..407 " " + WORD@407..409 "of" + WHITESPACE@409..410 " " + WORD@410..413 "the" + WHITESPACE@413..414 " " + INTEGER@414..418 "2004" + WHITESPACE@418..419 " " + WORD@419..422 "ACM" + WHITESPACE@422..423 " " + WORD@423..432 "Symposium" + WHITESPACE@432..433 " " + WORD@433..435 "on" + WHITESPACE@435..436 " " + WORD@436..443 "Applied" + WHITESPACE@443..444 " " + WORD@444..453 "Computing" + R_CURLY@453..454 "}" + COMMA@454..455 "," + WHITESPACE@455..460 "\n " + FIELD@460..478 + NAME@460..465 "pages" + WHITESPACE@465..466 " " + EQ@466..467 "=" + WHITESPACE@467..468 " " + CURLY_GROUP@468..477 + L_CURLY@468..469 "{" + WORD@469..476 "659-666" + R_CURLY@476..477 "}" + COMMA@477..478 "," + WHITESPACE@478..483 "\n " + FIELD@483..498 + NAME@483..491 "numpages" + WHITESPACE@491..492 " " + EQ@492..493 "=" + WHITESPACE@493..494 " " + CURLY_GROUP@494..497 + L_CURLY@494..495 "{" + INTEGER@495..496 "8" + R_CURLY@496..497 "}" + COMMA@497..498 "," + WHITESPACE@498..503 "\n " + FIELD@503..615 + NAME@503..511 "keywords" + WHITESPACE@511..512 " " + EQ@512..513 "=" + WHITESPACE@513..514 " " + CURLY_GROUP@514..614 + L_CURLY@514..515 "{" + WORD@515..521 "active" + WHITESPACE@521..522 " " + WORD@522..526 "DBMS" + COMMA@526..527 "," + WHITESPACE@527..528 " " + WORD@528..536 "temporal" + WHITESPACE@536..537 " " + WORD@537..541 "DBMS" + COMMA@541..542 "," + WHITESPACE@542..543 " " + WORD@543..551 "workflow" + WHITESPACE@551..552 " " + WORD@552..562 "management" + WHITESPACE@562..563 " " + WORD@563..569 "system" + WHITESPACE@569..570 " " + WORD@570..571 "-" + WHITESPACE@571..572 " " + WORD@572..576 "WfMS" + COMMA@576..577 "," + WHITESPACE@577..578 " " + WORD@578..586 "temporal" + WHITESPACE@586..587 " " + WORD@587..595 "workflow" + WHITESPACE@595..596 " " + WORD@596..606 "management" + WHITESPACE@606..607 " " + WORD@607..613 "system" + R_CURLY@613..614 "}" + COMMA@614..615 "," + WHITESPACE@615..620 "\n " + FIELD@620..649 + NAME@620..628 "location" + WHITESPACE@628..629 " " + EQ@629..630 "=" + WHITESPACE@630..631 " " + CURLY_GROUP@631..648 + L_CURLY@631..632 "{" + WORD@632..639 "Nicosia" + COMMA@639..640 "," + WHITESPACE@640..641 " " + WORD@641..647 "Cyprus" + R_CURLY@647..648 "}" + COMMA@648..649 "," + WHITESPACE@649..654 "\n " + FIELD@654..673 + NAME@654..660 "series" + WHITESPACE@660..661 " " + EQ@661..662 "=" + WHITESPACE@662..663 " " + CURLY_GROUP@663..672 + L_CURLY@663..664 "{" + WORD@664..667 "SAC" + WHITESPACE@667..668 " " + WORD@668..671 "'04" + R_CURLY@671..672 "}" + WHITESPACE@672..673 "\n" + R_DELIM@673..674 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap new file mode 100644 index 0000000000..58094d2f42 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__erwin_2007.txt.snap @@ -0,0 +1,239 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/erwin_2007.txt +--- +ROOT@0..615 + ENTRY@0..615 + TYPE@0..14 "@inproceedings" + L_DELIM@14..15 "{" + NAME@15..38 "10.5555/1386993.1386994" + COMMA@38..39 "," + WHITESPACE@39..44 "\n " + FIELD@44..107 + NAME@44..50 "author" + WHITESPACE@50..51 " " + EQ@51..52 "=" + WHITESPACE@52..53 " " + CURLY_GROUP@53..106 + L_CURLY@53..54 "{" + WORD@54..59 "Erwin" + COMMA@59..60 "," + WHITESPACE@60..61 " " + WORD@61..65 "Alva" + WHITESPACE@65..66 " " + WORD@66..69 "and" + WHITESPACE@69..70 " " + WORD@70..77 "Gopalan" + COMMA@77..78 "," + WHITESPACE@78..79 " " + WORD@79..82 "Raj" + WHITESPACE@82..83 " " + WORD@83..85 "P." + WHITESPACE@85..86 " " + WORD@86..89 "and" + WHITESPACE@89..90 " " + WORD@90..98 "Achuthan" + COMMA@98..99 "," + WHITESPACE@99..100 " " + WORD@100..102 "N." + WHITESPACE@102..103 " " + WORD@103..105 "R." + R_CURLY@105..106 "}" + COMMA@106..107 "," + WHITESPACE@107..112 "\n " + FIELD@112..194 + NAME@112..117 "title" + WHITESPACE@117..118 " " + EQ@118..119 "=" + WHITESPACE@119..120 " " + CURLY_GROUP@120..193 + L_CURLY@120..121 "{" + WORD@121..122 "A" + WHITESPACE@122..123 " " + WORD@123..132 "Bottom-up" + WHITESPACE@132..133 " " + WORD@133..143 "Projection" + WHITESPACE@143..144 " " + WORD@144..149 "Based" + WHITESPACE@149..150 " " + WORD@150..159 "Algorithm" + WHITESPACE@159..160 " " + WORD@160..163 "for" + WHITESPACE@163..164 " " + WORD@164..170 "Mining" + WHITESPACE@170..171 " " + WORD@171..175 "High" + WHITESPACE@175..176 " " + WORD@176..183 "Utility" + WHITESPACE@183..184 " " + WORD@184..192 "Itemsets" + R_CURLY@192..193 "}" + COMMA@193..194 "," + WHITESPACE@194..199 "\n " + FIELD@199..213 + NAME@199..203 "year" + WHITESPACE@203..204 " " + EQ@204..205 "=" + WHITESPACE@205..206 " " + CURLY_GROUP@206..212 + L_CURLY@206..207 "{" + INTEGER@207..211 "2007" + R_CURLY@211..212 "}" + COMMA@212..213 "," + WHITESPACE@213..218 "\n " + FIELD@218..241 + NAME@218..222 "isbn" + WHITESPACE@222..223 " " + EQ@223..224 "=" + WHITESPACE@224..225 " " + CURLY_GROUP@225..240 + L_CURLY@225..226 "{" + INTEGER@226..239 "9781920682651" + R_CURLY@239..240 "}" + COMMA@240..241 "," + WHITESPACE@241..246 "\n " + FIELD@246..294 + NAME@246..255 "publisher" + WHITESPACE@255..256 " " + EQ@256..257 "=" + WHITESPACE@257..258 " " + CURLY_GROUP@258..293 + L_CURLY@258..259 "{" + WORD@259..269 "Australian" + WHITESPACE@269..270 " " + WORD@270..278 "Computer" + WHITESPACE@278..279 " " + WORD@279..286 "Society" + COMMA@286..287 "," + WHITESPACE@287..288 " " + WORD@288..292 "Inc." + R_CURLY@292..293 "}" + COMMA@293..294 "," + WHITESPACE@294..299 "\n " + FIELD@299..315 + NAME@299..306 "address" + WHITESPACE@306..307 " " + EQ@307..308 "=" + WHITESPACE@308..309 " " + CURLY_GROUP@309..314 + L_CURLY@309..310 "{" + WORD@310..313 "AUS" + R_CURLY@313..314 "}" + COMMA@314..315 "," + WHITESPACE@315..320 "\n " + FIELD@320..447 + NAME@320..329 "booktitle" + WHITESPACE@329..330 " " + EQ@330..331 "=" + WHITESPACE@331..332 " " + CURLY_GROUP@332..446 + L_CURLY@332..333 "{" + WORD@333..344 "Proceedings" + WHITESPACE@344..345 " " + WORD@345..347 "of" + WHITESPACE@347..348 " " + WORD@348..351 "the" + WHITESPACE@351..352 " " + WORD@352..355 "2nd" + WHITESPACE@355..356 " " + WORD@356..369 "International" + WHITESPACE@369..370 " " + WORD@370..378 "Workshop" + WHITESPACE@378..379 " " + WORD@379..381 "on" + WHITESPACE@381..382 " " + WORD@382..393 "Integrating" + WHITESPACE@393..394 " " + WORD@394..404 "Artificial" + WHITESPACE@404..405 " " + WORD@405..417 "Intelligence" + WHITESPACE@417..418 " " + WORD@418..421 "and" + WHITESPACE@421..422 " " + WORD@422..426 "Data" + WHITESPACE@426..427 " " + WORD@427..433 "Mining" + WHITESPACE@433..434 " " + WORD@434..435 "-" + WHITESPACE@435..436 " " + WORD@436..442 "Volume" + WHITESPACE@442..443 " " + INTEGER@443..445 "84" + R_CURLY@445..446 "}" + COMMA@446..447 "," + WHITESPACE@447..452 "\n " + FIELD@452..467 + NAME@452..457 "pages" + WHITESPACE@457..458 " " + EQ@458..459 "=" + WHITESPACE@459..460 " " + CURLY_GROUP@460..466 + L_CURLY@460..461 "{" + WORD@461..465 "3-11" + R_CURLY@465..466 "}" + COMMA@466..467 "," + WHITESPACE@467..472 "\n " + FIELD@472..487 + NAME@472..480 "numpages" + WHITESPACE@480..481 " " + EQ@481..482 "=" + WHITESPACE@482..483 " " + CURLY_GROUP@483..486 + L_CURLY@483..484 "{" + INTEGER@484..485 "9" + R_CURLY@485..486 "}" + COMMA@486..487 "," + WHITESPACE@487..492 "\n " + FIELD@492..549 + NAME@492..500 "keywords" + WHITESPACE@500..501 " " + EQ@501..502 "=" + WHITESPACE@502..503 " " + CURLY_GROUP@503..548 + L_CURLY@503..504 "{" + WORD@504..511 "pattern" + WHITESPACE@511..512 " " + WORD@512..518 "growth" + COMMA@518..519 "," + WHITESPACE@519..520 " " + WORD@520..524 "high" + WHITESPACE@524..525 " " + WORD@525..532 "utility" + WHITESPACE@532..533 " " + WORD@533..540 "itemset" + WHITESPACE@540..541 " " + WORD@541..547 "mining" + R_CURLY@547..548 "}" + COMMA@548..549 "," + WHITESPACE@549..554 "\n " + FIELD@554..589 + NAME@554..562 "location" + WHITESPACE@562..563 " " + EQ@563..564 "=" + WHITESPACE@564..565 " " + CURLY_GROUP@565..588 + L_CURLY@565..566 "{" + WORD@566..570 "Gold" + WHITESPACE@570..571 " " + WORD@571..576 "Coast" + COMMA@576..577 "," + WHITESPACE@577..578 " " + WORD@578..587 "Australia" + R_CURLY@587..588 "}" + COMMA@588..589 "," + WHITESPACE@589..594 "\n " + FIELD@594..614 + NAME@594..600 "series" + WHITESPACE@600..601 " " + EQ@601..602 "=" + WHITESPACE@602..603 " " + CURLY_GROUP@603..613 + L_CURLY@603..604 "{" + WORD@604..608 "AIDM" + WHITESPACE@608..609 " " + WORD@609..612 "'07" + R_CURLY@612..613 "}" + WHITESPACE@613..614 "\n" + R_DELIM@614..615 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap new file mode 100644 index 0000000000..d9f83b339a --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__jain_1999.txt.snap @@ -0,0 +1,267 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/jain_1999.txt +--- +ROOT@0..674 + ENTRY@0..674 + TYPE@0..8 "@article" + L_DELIM@8..9 "{" + NAME@9..30 "10.1145/331499.331504" + COMMA@30..31 "," + WHITESPACE@31..36 "\n " + FIELD@36..93 + NAME@36..42 "author" + WHITESPACE@42..43 " " + EQ@43..44 "=" + WHITESPACE@44..45 " " + CURLY_GROUP@45..92 + L_CURLY@45..46 "{" + WORD@46..50 "Jain" + COMMA@50..51 "," + WHITESPACE@51..52 " " + WORD@52..54 "A." + WHITESPACE@54..55 " " + WORD@55..57 "K." + WHITESPACE@57..58 " " + WORD@58..61 "and" + WHITESPACE@61..62 " " + WORD@62..67 "Murty" + COMMA@67..68 "," + WHITESPACE@68..69 " " + WORD@69..71 "M." + WHITESPACE@71..72 " " + WORD@72..74 "N." + WHITESPACE@74..75 " " + WORD@75..78 "and" + WHITESPACE@78..79 " " + WORD@79..84 "Flynn" + COMMA@84..85 "," + WHITESPACE@85..86 " " + WORD@86..88 "P." + WHITESPACE@88..89 " " + WORD@89..91 "J." + R_CURLY@91..92 "}" + COMMA@92..93 "," + WHITESPACE@93..98 "\n " + FIELD@98..134 + NAME@98..103 "title" + WHITESPACE@103..104 " " + EQ@104..105 "=" + WHITESPACE@105..106 " " + CURLY_GROUP@106..133 + L_CURLY@106..107 "{" + WORD@107..111 "Data" + WHITESPACE@111..112 " " + WORD@112..123 "Clustering:" + WHITESPACE@123..124 " " + WORD@124..125 "A" + WHITESPACE@125..126 " " + WORD@126..132 "Review" + R_CURLY@132..133 "}" + COMMA@133..134 "," + WHITESPACE@134..139 "\n " + FIELD@139..153 + NAME@139..143 "year" + WHITESPACE@143..144 " " + EQ@144..145 "=" + WHITESPACE@145..146 " " + CURLY_GROUP@146..152 + L_CURLY@146..147 "{" + INTEGER@147..151 "1999" + R_CURLY@151..152 "}" + COMMA@152..153 "," + WHITESPACE@153..158 "\n " + FIELD@158..184 + NAME@158..168 "issue_date" + WHITESPACE@168..169 " " + EQ@169..170 "=" + WHITESPACE@170..171 " " + CURLY_GROUP@171..183 + L_CURLY@171..172 "{" + WORD@172..177 "Sept." + WHITESPACE@177..178 " " + INTEGER@178..182 "1999" + R_CURLY@182..183 "}" + COMMA@183..184 "," + WHITESPACE@184..189 "\n " + FIELD@189..239 + NAME@189..198 "publisher" + WHITESPACE@198..199 " " + EQ@199..200 "=" + WHITESPACE@200..201 " " + CURLY_GROUP@201..238 + L_CURLY@201..202 "{" + WORD@202..213 "Association" + WHITESPACE@213..214 " " + WORD@214..217 "for" + WHITESPACE@217..218 " " + WORD@218..227 "Computing" + WHITESPACE@227..228 " " + WORD@228..237 "Machinery" + R_CURLY@237..238 "}" + COMMA@238..239 "," + WHITESPACE@239..244 "\n " + FIELD@244..274 + NAME@244..251 "address" + WHITESPACE@251..252 " " + EQ@252..253 "=" + WHITESPACE@253..254 " " + CURLY_GROUP@254..273 + L_CURLY@254..255 "{" + WORD@255..258 "New" + WHITESPACE@258..259 " " + WORD@259..263 "York" + COMMA@263..264 "," + WHITESPACE@264..265 " " + WORD@265..267 "NY" + COMMA@267..268 "," + WHITESPACE@268..269 " " + WORD@269..272 "USA" + R_CURLY@272..273 "}" + COMMA@273..274 "," + WHITESPACE@274..279 "\n " + FIELD@279..293 + NAME@279..285 "volume" + WHITESPACE@285..286 " " + EQ@286..287 "=" + WHITESPACE@287..288 " " + CURLY_GROUP@288..292 + L_CURLY@288..289 "{" + INTEGER@289..291 "31" + R_CURLY@291..292 "}" + COMMA@292..293 "," + WHITESPACE@293..298 "\n " + FIELD@298..311 + NAME@298..304 "number" + WHITESPACE@304..305 " " + EQ@305..306 "=" + WHITESPACE@306..307 " " + CURLY_GROUP@307..310 + L_CURLY@307..308 "{" + INTEGER@308..309 "3" + R_CURLY@309..310 "}" + COMMA@310..311 "," + WHITESPACE@311..316 "\n " + FIELD@316..335 + NAME@316..320 "issn" + WHITESPACE@320..321 " " + EQ@321..322 "=" + WHITESPACE@322..323 " " + CURLY_GROUP@323..334 + L_CURLY@323..324 "{" + WORD@324..333 "0360-0300" + R_CURLY@333..334 "}" + COMMA@334..335 "," + WHITESPACE@335..340 "\n " + FIELD@340..386 + NAME@340..343 "url" + WHITESPACE@343..344 " " + EQ@344..345 "=" + WHITESPACE@345..346 " " + CURLY_GROUP@346..385 + L_CURLY@346..347 "{" + WORD@347..384 "https://doi.org/10.11 ..." + R_CURLY@384..385 "}" + COMMA@385..386 "," + WHITESPACE@386..391 "\n " + FIELD@391..421 + NAME@391..394 "doi" + WHITESPACE@394..395 " " + EQ@395..396 "=" + WHITESPACE@396..397 " " + CURLY_GROUP@397..420 + L_CURLY@397..398 "{" + WORD@398..419 "10.1145/331499.331504" + R_CURLY@419..420 "}" + COMMA@420..421 "," + WHITESPACE@421..426 "\n " + FIELD@426..456 + NAME@426..433 "journal" + WHITESPACE@433..434 " " + EQ@434..435 "=" + WHITESPACE@435..436 " " + CURLY_GROUP@436..455 + L_CURLY@436..437 "{" + WORD@437..440 "ACM" + WHITESPACE@440..441 " " + WORD@441..448 "Comput." + WHITESPACE@448..449 " " + WORD@449..454 "Surv." + R_CURLY@454..455 "}" + COMMA@455..456 "," + WHITESPACE@456..461 "\n " + FIELD@461..475 + NAME@461..466 "month" + WHITESPACE@466..467 " " + EQ@467..468 "=" + WHITESPACE@468..469 " " + CURLY_GROUP@469..474 + L_CURLY@469..470 "{" + WORD@470..473 "sep" + R_CURLY@473..474 "}" + COMMA@474..475 "," + WHITESPACE@475..480 "\n " + FIELD@480..498 + NAME@480..485 "pages" + WHITESPACE@485..486 " " + EQ@486..487 "=" + WHITESPACE@487..488 " " + CURLY_GROUP@488..497 + L_CURLY@488..489 "{" + WORD@489..496 "264-323" + R_CURLY@496..497 "}" + COMMA@497..498 "," + WHITESPACE@498..503 "\n " + FIELD@503..519 + NAME@503..511 "numpages" + WHITESPACE@511..512 " " + EQ@512..513 "=" + WHITESPACE@513..514 " " + CURLY_GROUP@514..518 + L_CURLY@514..515 "{" + INTEGER@515..517 "60" + R_CURLY@517..518 "}" + COMMA@518..519 "," + WHITESPACE@519..524 "\n " + FIELD@524..673 + NAME@524..532 "keywords" + WHITESPACE@532..533 " " + EQ@533..534 "=" + WHITESPACE@534..535 " " + CURLY_GROUP@535..672 + L_CURLY@535..536 "{" + WORD@536..547 "incremental" + WHITESPACE@547..548 " " + WORD@548..558 "clustering" + COMMA@558..559 "," + WHITESPACE@559..560 " " + WORD@560..570 "clustering" + WHITESPACE@570..571 " " + WORD@571..583 "applications" + COMMA@583..584 "," + WHITESPACE@584..585 " " + WORD@585..596 "exploratory" + WHITESPACE@596..597 " " + WORD@597..601 "data" + WHITESPACE@601..602 " " + WORD@602..610 "analysis" + COMMA@610..611 "," + WHITESPACE@611..612 " " + WORD@612..619 "cluster" + WHITESPACE@619..620 " " + WORD@620..628 "analysis" + COMMA@628..629 "," + WHITESPACE@629..630 " " + WORD@630..640 "similarity" + WHITESPACE@640..641 " " + WORD@641..648 "indices" + COMMA@648..649 "," + WHITESPACE@649..650 " " + WORD@650..662 "unsupervised" + WHITESPACE@662..663 " " + WORD@663..671 "learning" + R_CURLY@671..672 "}" + WHITESPACE@672..673 "\n" + R_DELIM@673..674 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap new file mode 100644 index 0000000000..8d67f95096 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap @@ -0,0 +1,302 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/kastenholz_2006.txt +--- +ROOT@0..898 + STRING@0..35 + TYPE@0..7 "@string" + L_DELIM@7..8 "{" + NAME@8..13 "jchph" + WHITESPACE@13..16 " " + EQ@16..17 "=" + WHITESPACE@17..18 " " + CURLY_GROUP@18..34 + L_CURLY@18..19 "{" + WORD@19..21 "J." + NBSP@21..22 "~" + WORD@22..27 "Chem." + WHITESPACE@27..28 " " + WORD@28..33 "Phys." + R_CURLY@33..34 "}" + R_DELIM@34..35 "}" + JUNK@35..37 "\n\n" + ENTRY@37..898 + TYPE@37..45 "@article" + L_DELIM@45..46 "{" + NAME@46..56 "kastenholz" + COMMA@56..57 "," + WHITESPACE@57..62 "\n " + FIELD@62..130 + NAME@62..68 "author" + WHITESPACE@68..75 " " + EQ@75..76 "=" + WHITESPACE@76..77 " " + CURLY_GROUP@77..129 + L_CURLY@77..78 "{" + WORD@78..88 "Kastenholz" + COMMA@88..89 "," + WHITESPACE@89..90 " " + WORD@90..92 "M." + WHITESPACE@92..93 " " + WORD@93..95 "A." + WHITESPACE@95..96 " " + WORD@96..99 "and" + WHITESPACE@99..100 " " + WORD@100..101 "H" + CURLY_GROUP@101..106 + L_CURLY@101..102 "{" + ACCENT@102..105 + ACCENT_NAME@102..104 "\\\"" + WORD@104..105 "u" + R_CURLY@105..106 "}" + WORD@106..115 "nenberger" + COMMA@115..116 "," + WHITESPACE@116..117 " " + WORD@117..125 "Philippe" + WHITESPACE@125..126 " " + WORD@126..128 "H." + R_CURLY@128..129 "}" + COMMA@129..130 "," + WHITESPACE@130..135 "\n " + FIELD@135..275 + NAME@135..140 "title" + WHITESPACE@140..148 " " + EQ@148..149 "=" + WHITESPACE@149..150 " " + CURLY_GROUP@150..274 + L_CURLY@150..151 "{" + WORD@151..162 "Computation" + WHITESPACE@162..163 " " + WORD@163..165 "of" + WHITESPACE@165..166 " " + WORD@166..177 "methodology" + COMMAND@177..184 + COMMAND_NAME@177..184 "\\hyphen" + WHITESPACE@184..185 " " + WORD@185..196 "independent" + WHITESPACE@196..197 " " + WORD@197..202 "ionic" + WHITESPACE@202..203 " " + WORD@203..212 "solvation" + WHITESPACE@212..233 "\n " + WORD@233..237 "free" + WHITESPACE@237..238 " " + WORD@238..246 "energies" + WHITESPACE@246..247 " " + WORD@247..251 "from" + WHITESPACE@251..252 " " + WORD@252..261 "molecular" + WHITESPACE@261..262 " " + WORD@262..273 "simulations" + R_CURLY@273..274 "}" + COMMA@274..275 "," + WHITESPACE@275..280 "\n " + FIELD@280..301 + NAME@280..292 "journaltitle" + WHITESPACE@292..293 " " + EQ@293..294 "=" + WHITESPACE@294..295 " " + LITERAL@295..300 + NAME@295..300 "jchph" + COMMA@300..301 "," + WHITESPACE@301..306 "\n " + FIELD@306..326 + NAME@306..310 "date" + WHITESPACE@310..319 " " + EQ@319..320 "=" + WHITESPACE@320..321 " " + LITERAL@321..325 + INTEGER@321..325 "2006" + COMMA@325..326 "," + WHITESPACE@326..331 "\n " + FIELD@331..404 + NAME@331..339 "subtitle" + WHITESPACE@339..344 " " + EQ@344..345 "=" + WHITESPACE@345..346 " " + CURLY_GROUP@346..403 + L_CURLY@346..347 "{" + CURLY_GROUP@347..350 + L_CURLY@347..348 "{" + WORD@348..349 "I" + R_CURLY@349..350 "}" + WORD@350..351 "." + WHITESPACE@351..352 " " + CURLY_GROUP@352..357 + L_CURLY@352..353 "{" + WORD@353..356 "The" + R_CURLY@356..357 "}" + WHITESPACE@357..358 " " + WORD@358..371 "electrostatic" + WHITESPACE@371..372 " " + WORD@372..381 "potential" + WHITESPACE@381..382 " " + WORD@382..384 "in" + WHITESPACE@384..385 " " + WORD@385..394 "molecular" + WHITESPACE@394..395 " " + WORD@395..402 "liquids" + R_CURLY@402..403 "}" + COMMA@403..404 "," + WHITESPACE@404..409 "\n " + FIELD@409..428 + NAME@409..415 "volume" + WHITESPACE@415..422 " " + EQ@422..423 "=" + WHITESPACE@423..424 " " + LITERAL@424..427 + INTEGER@424..427 "124" + COMMA@427..428 "," + WHITESPACE@428..433 "\n " + FIELD@433..455 + NAME@433..436 "eid" + WHITESPACE@436..446 " " + EQ@446..447 "=" + WHITESPACE@447..448 " " + LITERAL@448..454 + INTEGER@448..454 "124106" + COMMA@454..455 "," + WHITESPACE@455..460 "\n " + FIELD@460..495 + NAME@460..463 "doi" + WHITESPACE@463..473 " " + EQ@473..474 "=" + WHITESPACE@474..475 " " + CURLY_GROUP@475..494 + L_CURLY@475..476 "{" + WORD@476..493 "10.1063/1.2172593" + R_CURLY@493..494 "}" + COMMA@494..495 "," + WHITESPACE@495..500 "\n " + FIELD@500..525 + NAME@500..506 "langid" + WHITESPACE@506..513 " " + EQ@513..514 "=" + WHITESPACE@514..515 " " + CURLY_GROUP@515..524 + L_CURLY@515..516 "{" + WORD@516..523 "english" + R_CURLY@523..524 "}" + COMMA@524..525 "," + WHITESPACE@525..530 "\n " + FIELD@530..564 + NAME@530..540 "langidopts" + WHITESPACE@540..543 " " + EQ@543..544 "=" + WHITESPACE@544..545 " " + CURLY_GROUP@545..563 + L_CURLY@545..546 "{" + WORD@546..562 "variant=american" + R_CURLY@562..563 "}" + COMMA@563..564 "," + WHITESPACE@564..569 "\n " + FIELD@569..631 + NAME@569..579 "indextitle" + WHITESPACE@579..582 " " + EQ@582..583 "=" + WHITESPACE@583..584 " " + CURLY_GROUP@584..630 + L_CURLY@584..585 "{" + WORD@585..596 "Computation" + WHITESPACE@596..597 " " + WORD@597..599 "of" + WHITESPACE@599..600 " " + WORD@600..605 "ionic" + WHITESPACE@605..606 " " + WORD@606..615 "solvation" + WHITESPACE@615..616 " " + WORD@616..620 "free" + WHITESPACE@620..621 " " + WORD@621..629 "energies" + R_CURLY@629..630 "}" + COMMA@630..631 "," + WHITESPACE@631..636 "\n " + FIELD@636..896 + NAME@636..646 "annotation" + WHITESPACE@646..649 " " + EQ@649..650 "=" + WHITESPACE@650..651 " " + CURLY_GROUP@651..895 + L_CURLY@651..652 "{" + WORD@652..654 "An" + WHITESPACE@654..655 " " + COMMAND@655..662 + COMMAND_NAME@655..662 "\\texttt" + CURLY_GROUP@662..671 + L_CURLY@662..663 "{" + WORD@663..670 "article" + R_CURLY@670..671 "}" + WHITESPACE@671..672 " " + WORD@672..677 "entry" + WHITESPACE@677..678 " " + WORD@678..682 "with" + WHITESPACE@682..683 " " + WORD@683..685 "an" + WHITESPACE@685..686 " " + COMMAND@686..693 + COMMAND_NAME@686..693 "\\texttt" + CURLY_GROUP@693..698 + L_CURLY@693..694 "{" + WORD@694..697 "eid" + R_CURLY@697..698 "}" + WHITESPACE@698..699 " " + WORD@699..702 "and" + WHITESPACE@702..703 " " + WORD@703..704 "a" + WHITESPACE@704..725 "\n " + COMMAND@725..732 + COMMAND_NAME@725..732 "\\texttt" + CURLY_GROUP@732..737 + L_CURLY@732..733 "{" + WORD@733..736 "doi" + R_CURLY@736..737 "}" + WHITESPACE@737..738 " " + WORD@738..744 "field." + WHITESPACE@744..745 " " + WORD@745..749 "Note" + WHITESPACE@749..750 " " + WORD@750..754 "that" + WHITESPACE@754..755 " " + WORD@755..758 "the" + WHITESPACE@758..759 " " + COMMAND@759..766 + COMMAND_NAME@759..766 "\\textsc" + CURLY_GROUP@766..771 + L_CURLY@766..767 "{" + WORD@767..770 "doi" + R_CURLY@770..771 "}" + WHITESPACE@771..772 " " + WORD@772..774 "is" + WHITESPACE@774..775 " " + WORD@775..786 "transformed" + WHITESPACE@786..807 "\n " + WORD@807..811 "into" + WHITESPACE@811..812 " " + WORD@812..813 "a" + WHITESPACE@813..814 " " + WORD@814..823 "clickable" + WHITESPACE@823..824 " " + WORD@824..828 "link" + WHITESPACE@828..829 " " + WORD@829..831 "if" + WHITESPACE@831..832 " " + COMMAND@832..839 + COMMAND_NAME@832..839 "\\texttt" + CURLY_GROUP@839..849 + L_CURLY@839..840 "{" + WORD@840..848 "hyperref" + R_CURLY@848..849 "}" + WHITESPACE@849..850 " " + WORD@850..857 "support" + WHITESPACE@857..858 " " + WORD@858..861 "has" + WHITESPACE@861..862 " " + WORD@862..866 "been" + WHITESPACE@866..887 "\n " + WORD@887..894 "enabled" + R_CURLY@894..895 "}" + COMMA@895..896 "," + WHITESPACE@896..897 "\n" + R_DELIM@897..898 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap new file mode 100644 index 0000000000..2be9233f95 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__knuth_1984.txt.snap @@ -0,0 +1,320 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/knuth_1984.txt +--- +ROOT@0..993 + ENTRY@0..993 + TYPE@0..5 "@book" + L_DELIM@5..6 "{" + NAME@6..16 "knuth:ct:a" + COMMA@16..17 "," + WHITESPACE@17..22 "\n " + FIELD@22..56 + NAME@22..28 "author" + WHITESPACE@28..35 " " + EQ@35..36 "=" + WHITESPACE@36..37 " " + CURLY_GROUP@37..55 + L_CURLY@37..38 "{" + WORD@38..43 "Knuth" + COMMA@43..44 "," + WHITESPACE@44..45 " " + WORD@45..51 "Donald" + WHITESPACE@51..52 " " + WORD@52..54 "E." + R_CURLY@54..55 "}" + COMMA@55..56 "," + WHITESPACE@56..61 "\n " + FIELD@61..94 + NAME@61..66 "title" + WHITESPACE@66..74 " " + EQ@74..75 "=" + WHITESPACE@75..76 " " + CURLY_GROUP@76..93 + L_CURLY@76..77 "{" + WORD@77..80 "The" + WHITESPACE@80..81 " " + CURLY_GROUP@81..92 + L_CURLY@81..82 "{" + COMMAND@82..86 + COMMAND_NAME@82..86 "\\TeX" + WHITESPACE@86..87 " " + WORD@87..91 "book" + R_CURLY@91..92 "}" + R_CURLY@92..93 "}" + COMMA@93..94 "," + WHITESPACE@94..99 "\n " + FIELD@99..119 + NAME@99..103 "date" + WHITESPACE@103..112 " " + EQ@112..113 "=" + WHITESPACE@113..114 " " + LITERAL@114..118 + INTEGER@114..118 "1984" + COMMA@118..119 "," + WHITESPACE@119..124 "\n " + FIELD@124..166 + NAME@124..133 "maintitle" + WHITESPACE@133..137 " " + EQ@137..138 "=" + WHITESPACE@138..139 " " + CURLY_GROUP@139..165 + L_CURLY@139..140 "{" + WORD@140..149 "Computers" + WHITESPACE@149..150 " " + COMMAND@150..152 + COMMAND_NAME@150..152 "\\&" + WHITESPACE@152..153 " " + WORD@153..164 "Typesetting" + R_CURLY@164..165 "}" + COMMA@165..166 "," + WHITESPACE@166..171 "\n " + FIELD@171..190 + NAME@171..177 "volume" + WHITESPACE@177..184 " " + EQ@184..185 "=" + WHITESPACE@185..186 " " + CURLY_GROUP@186..189 + L_CURLY@186..187 "{" + WORD@187..188 "A" + R_CURLY@188..189 "}" + COMMA@189..190 "," + WHITESPACE@190..195 "\n " + FIELD@195..227 + NAME@195..204 "publisher" + WHITESPACE@204..208 " " + EQ@208..209 "=" + WHITESPACE@209..210 " " + CURLY_GROUP@210..226 + L_CURLY@210..211 "{" + WORD@211..225 "Addison-Wesley" + R_CURLY@225..226 "}" + COMMA@226..227 "," + WHITESPACE@227..232 "\n " + FIELD@232..264 + NAME@232..240 "location" + WHITESPACE@240..245 " " + EQ@245..246 "=" + WHITESPACE@246..247 " " + CURLY_GROUP@247..263 + L_CURLY@247..248 "{" + WORD@248..255 "Reading" + COMMA@255..256 "," + WHITESPACE@256..257 " " + WORD@257..262 "Mass." + R_CURLY@262..263 "}" + COMMA@263..264 "," + WHITESPACE@264..269 "\n " + FIELD@269..294 + NAME@269..275 "langid" + WHITESPACE@275..282 " " + EQ@282..283 "=" + WHITESPACE@283..284 " " + CURLY_GROUP@284..293 + L_CURLY@284..285 "{" + WORD@285..292 "english" + R_CURLY@292..293 "}" + COMMA@293..294 "," + WHITESPACE@294..299 "\n " + FIELD@299..333 + NAME@299..309 "langidopts" + WHITESPACE@309..312 " " + EQ@312..313 "=" + WHITESPACE@313..314 " " + CURLY_GROUP@314..332 + L_CURLY@314..315 "{" + WORD@315..331 "variant=american" + R_CURLY@331..332 "}" + COMMA@332..333 "," + WHITESPACE@333..338 "\n " + FIELD@338..381 + NAME@338..347 "sorttitle" + WHITESPACE@347..351 " " + EQ@351..352 "=" + WHITESPACE@352..353 " " + CURLY_GROUP@353..380 + L_CURLY@353..354 "{" + WORD@354..363 "Computers" + WHITESPACE@363..364 " " + WORD@364..365 "&" + WHITESPACE@365..366 " " + WORD@366..377 "Typesetting" + WHITESPACE@377..378 " " + WORD@378..379 "A" + R_CURLY@379..380 "}" + COMMA@380..381 "," + WHITESPACE@381..386 "\n " + FIELD@386..416 + NAME@386..400 "indexsorttitle" + EQ@400..401 "=" + WHITESPACE@401..402 " " + CURLY_GROUP@402..415 + L_CURLY@402..403 "{" + WORD@403..406 "The" + WHITESPACE@406..407 " " + WORD@407..414 "TeXbook" + R_CURLY@414..415 "}" + COMMA@415..416 "," + WHITESPACE@416..421 "\n " + FIELD@421..461 + NAME@421..431 "indextitle" + WHITESPACE@431..434 " " + EQ@434..435 "=" + WHITESPACE@435..436 " " + CURLY_GROUP@436..460 + L_CURLY@436..437 "{" + COMMAND@437..445 + COMMAND_NAME@437..445 "\\protect" + COMMAND@445..449 + COMMAND_NAME@445..449 "\\TeX" + WHITESPACE@449..450 " " + WORD@450..454 "book" + COMMA@454..455 "," + WHITESPACE@455..456 " " + WORD@456..459 "The" + R_CURLY@459..460 "}" + COMMA@460..461 "," + WHITESPACE@461..466 "\n " + FIELD@466..493 + NAME@466..476 "shorttitle" + WHITESPACE@476..479 " " + EQ@479..480 "=" + WHITESPACE@480..481 " " + CURLY_GROUP@481..492 + L_CURLY@481..482 "{" + COMMAND@482..486 + COMMAND_NAME@482..486 "\\TeX" + WHITESPACE@486..487 " " + WORD@487..491 "book" + R_CURLY@491..492 "}" + COMMA@492..493 "," + WHITESPACE@493..498 "\n " + FIELD@498..991 + NAME@498..508 "annotation" + WHITESPACE@508..511 " " + EQ@511..512 "=" + WHITESPACE@512..513 " " + CURLY_GROUP@513..990 + L_CURLY@513..514 "{" + WORD@514..517 "The" + WHITESPACE@517..518 " " + WORD@518..523 "first" + WHITESPACE@523..524 " " + WORD@524..530 "volume" + WHITESPACE@530..531 " " + WORD@531..533 "of" + WHITESPACE@533..534 " " + WORD@534..535 "a" + WHITESPACE@535..536 " " + WORD@536..547 "five-volume" + WHITESPACE@547..548 " " + WORD@548..553 "book." + WHITESPACE@553..554 " " + WORD@554..558 "Note" + WHITESPACE@558..559 " " + WORD@559..562 "the" + WHITESPACE@562..583 "\n " + COMMAND@583..590 + COMMAND_NAME@583..590 "\\texttt" + CURLY_GROUP@590..601 + L_CURLY@590..591 "{" + WORD@591..600 "sorttitle" + R_CURLY@600..601 "}" + WHITESPACE@601..602 " " + WORD@602..608 "field." + WHITESPACE@608..609 " " + WORD@609..611 "We" + WHITESPACE@611..612 " " + WORD@612..616 "want" + WHITESPACE@616..617 " " + WORD@617..621 "this" + WHITESPACE@621..642 "\n " + WORD@642..648 "volume" + WHITESPACE@648..649 " " + WORD@649..651 "to" + WHITESPACE@651..652 " " + WORD@652..654 "be" + WHITESPACE@654..655 " " + WORD@655..661 "listed" + WHITESPACE@661..662 " " + WORD@662..667 "after" + WHITESPACE@667..668 " " + WORD@668..671 "the" + WHITESPACE@671..672 " " + WORD@672..677 "entry" + WHITESPACE@677..678 " " + WORD@678..687 "referring" + WHITESPACE@687..688 " " + WORD@688..690 "to" + WHITESPACE@690..691 " " + WORD@691..694 "the" + WHITESPACE@694..695 " " + WORD@695..701 "entire" + WHITESPACE@701..722 "\n " + WORD@722..733 "five-volume" + WHITESPACE@733..734 " " + WORD@734..738 "set." + WHITESPACE@738..739 " " + WORD@739..743 "Also" + WHITESPACE@743..744 " " + WORD@744..748 "note" + WHITESPACE@748..749 " " + WORD@749..752 "the" + WHITESPACE@752..753 " " + COMMAND@753..760 + COMMAND_NAME@753..760 "\\texttt" + CURLY_GROUP@760..772 + L_CURLY@760..761 "{" + WORD@761..771 "indextitle" + R_CURLY@771..772 "}" + WHITESPACE@772..773 " " + WORD@773..776 "and" + WHITESPACE@776..797 "\n " + COMMAND@797..804 + COMMAND_NAME@797..804 "\\texttt" + CURLY_GROUP@804..820 + L_CURLY@804..805 "{" + WORD@805..819 "indexsorttitle" + R_CURLY@819..820 "}" + WHITESPACE@820..821 " " + WORD@821..828 "fields." + WHITESPACE@828..829 " " + WORD@829..837 "Indexing" + WHITESPACE@837..838 " " + WORD@838..846 "packages" + WHITESPACE@846..847 " " + WORD@847..851 "that" + WHITESPACE@851..852 " " + WORD@852..857 "don't" + WHITESPACE@857..878 "\n " + WORD@878..886 "generate" + WHITESPACE@886..887 " " + WORD@887..893 "robust" + WHITESPACE@893..894 " " + WORD@894..899 "index" + WHITESPACE@899..900 " " + WORD@900..907 "entries" + WHITESPACE@907..908 " " + WORD@908..915 "require" + WHITESPACE@915..916 " " + WORD@916..920 "some" + WHITESPACE@920..921 " " + WORD@921..928 "control" + WHITESPACE@928..929 " " + WORD@929..938 "sequences" + WHITESPACE@938..959 "\n " + WORD@959..961 "to" + WHITESPACE@961..962 " " + WORD@962..964 "be" + WHITESPACE@964..965 " " + WORD@965..974 "protected" + WHITESPACE@974..975 " " + WORD@975..979 "from" + WHITESPACE@979..980 " " + WORD@980..989 "expansion" + R_CURLY@989..990 "}" + COMMA@990..991 "," + WHITESPACE@991..992 "\n" + R_DELIM@992..993 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap new file mode 100644 index 0000000000..1e2b67f36c --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__matuz_1990.txt.snap @@ -0,0 +1,176 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/matuz_1990.txt +--- +ROOT@0..517 + ENTRY@0..517 + TYPE@0..11 "@collection" + L_DELIM@11..12 "{" + NAME@12..23 "matuz:doody" + COMMA@23..24 "," + WHITESPACE@24..29 "\n " + FIELD@29..59 + NAME@29..35 "editor" + WHITESPACE@35..42 " " + EQ@42..43 "=" + WHITESPACE@43..44 " " + CURLY_GROUP@44..58 + L_CURLY@44..45 "{" + WORD@45..50 "Matuz" + COMMA@50..51 "," + WHITESPACE@51..52 " " + WORD@52..57 "Roger" + R_CURLY@57..58 "}" + COMMA@58..59 "," + WHITESPACE@59..64 "\n " + FIELD@64..113 + NAME@64..69 "title" + WHITESPACE@69..77 " " + EQ@77..78 "=" + WHITESPACE@78..79 " " + CURLY_GROUP@79..112 + L_CURLY@79..80 "{" + WORD@80..92 "Contemporary" + WHITESPACE@92..93 " " + WORD@93..101 "Literary" + WHITESPACE@101..102 " " + WORD@102..111 "Criticism" + R_CURLY@111..112 "}" + COMMA@112..113 "," + WHITESPACE@113..118 "\n " + FIELD@118..138 + NAME@118..122 "year" + WHITESPACE@122..131 " " + EQ@131..132 "=" + WHITESPACE@132..133 " " + LITERAL@133..137 + INTEGER@133..137 "1990" + COMMA@137..138 "," + WHITESPACE@138..143 "\n " + FIELD@143..161 + NAME@143..149 "volume" + WHITESPACE@149..156 " " + EQ@156..157 "=" + WHITESPACE@157..158 " " + LITERAL@158..160 + INTEGER@158..160 "61" + COMMA@160..161 "," + WHITESPACE@161..166 "\n " + FIELD@166..188 + NAME@166..175 "publisher" + WHITESPACE@175..179 " " + EQ@179..180 "=" + WHITESPACE@180..181 " " + CURLY_GROUP@181..187 + L_CURLY@181..182 "{" + WORD@182..186 "Gale" + R_CURLY@186..187 "}" + COMMA@187..188 "," + WHITESPACE@188..193 "\n " + FIELD@193..218 + NAME@193..201 "location" + WHITESPACE@201..206 " " + EQ@206..207 "=" + WHITESPACE@207..208 " " + CURLY_GROUP@208..217 + L_CURLY@208..209 "{" + WORD@209..216 "Detroit" + R_CURLY@216..217 "}" + COMMA@217..218 "," + WHITESPACE@218..223 "\n " + FIELD@223..248 + NAME@223..228 "pages" + WHITESPACE@228..236 " " + EQ@236..237 "=" + WHITESPACE@237..238 " " + CURLY_GROUP@238..247 + L_CURLY@238..239 "{" + WORD@239..246 "204-208" + R_CURLY@246..247 "}" + COMMA@247..248 "," + WHITESPACE@248..253 "\n " + FIELD@253..278 + NAME@253..259 "langid" + WHITESPACE@259..266 " " + EQ@266..267 "=" + WHITESPACE@267..268 " " + CURLY_GROUP@268..277 + L_CURLY@268..269 "{" + WORD@269..276 "english" + R_CURLY@276..277 "}" + COMMA@277..278 "," + WHITESPACE@278..283 "\n " + FIELD@283..317 + NAME@283..293 "langidopts" + WHITESPACE@293..296 " " + EQ@296..297 "=" + WHITESPACE@297..298 " " + CURLY_GROUP@298..316 + L_CURLY@298..299 "{" + WORD@299..315 "variant=american" + R_CURLY@315..316 "}" + COMMA@316..317 "," + WHITESPACE@317..322 "\n " + FIELD@322..515 + NAME@322..332 "annotation" + WHITESPACE@332..335 " " + EQ@335..336 "=" + WHITESPACE@336..337 " " + CURLY_GROUP@337..514 + L_CURLY@337..338 "{" + WORD@338..339 "A" + WHITESPACE@339..340 " " + COMMAND@340..347 + COMMAND_NAME@340..347 "\\texttt" + CURLY_GROUP@347..359 + L_CURLY@347..348 "{" + WORD@348..358 "collection" + R_CURLY@358..359 "}" + WHITESPACE@359..360 " " + WORD@360..365 "entry" + WHITESPACE@365..366 " " + WORD@366..375 "providing" + WHITESPACE@375..376 " " + WORD@376..379 "the" + WHITESPACE@379..380 " " + WORD@380..387 "excerpt" + WHITESPACE@387..388 " " + WORD@388..399 "information" + WHITESPACE@399..420 "\n " + WORD@420..423 "for" + WHITESPACE@423..424 " " + WORD@424..427 "the" + WHITESPACE@427..428 " " + COMMAND@428..435 + COMMAND_NAME@428..435 "\\texttt" + CURLY_GROUP@435..442 + L_CURLY@435..436 "{" + WORD@436..441 "doody" + R_CURLY@441..442 "}" + WHITESPACE@442..443 " " + WORD@443..449 "entry." + WHITESPACE@449..450 " " + WORD@450..454 "Note" + WHITESPACE@454..455 " " + WORD@455..458 "the" + WHITESPACE@458..459 " " + WORD@459..465 "format" + WHITESPACE@465..466 " " + WORD@466..468 "of" + WHITESPACE@468..469 " " + WORD@469..472 "the" + WHITESPACE@472..493 "\n " + COMMAND@493..500 + COMMAND_NAME@493..500 "\\texttt" + CURLY_GROUP@500..507 + L_CURLY@500..501 "{" + WORD@501..506 "pages" + R_CURLY@506..507 "}" + WHITESPACE@507..508 " " + WORD@508..513 "field" + R_CURLY@513..514 "}" + COMMA@514..515 "," + WHITESPACE@515..516 "\n" + R_DELIM@516..517 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap new file mode 100644 index 0000000000..40d1f230af --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap @@ -0,0 +1,368 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/nietzsche_1998.txt +--- +ROOT@0..1112 + STRING@0..49 + TYPE@0..7 "@string" + L_DELIM@7..8 "{" + NAME@8..11 "dtv" + WHITESPACE@11..16 " " + EQ@16..17 "=" + WHITESPACE@17..18 " " + CURLY_GROUP@18..48 + L_CURLY@18..19 "{" + WORD@19..28 "Deutscher" + WHITESPACE@28..29 " " + WORD@29..47 "Taschenbuch-Verlag" + R_CURLY@47..48 "}" + R_DELIM@48..49 "}" + JUNK@49..51 "\n\n" + ENTRY@51..1112 + TYPE@51..58 "@mvbook" + L_DELIM@58..59 "{" + NAME@59..72 "nietzsche:ksa" + COMMA@72..73 "," + WHITESPACE@73..78 "\n " + FIELD@78..116 + NAME@78..84 "author" + WHITESPACE@84..91 " " + EQ@91..92 "=" + WHITESPACE@92..93 " " + CURLY_GROUP@93..115 + L_CURLY@93..94 "{" + WORD@94..103 "Nietzsche" + COMMA@103..104 "," + WHITESPACE@104..105 " " + WORD@105..114 "Friedrich" + R_CURLY@114..115 "}" + COMMA@115..116 "," + WHITESPACE@116..121 "\n " + FIELD@121..158 + NAME@121..126 "title" + WHITESPACE@126..134 " " + EQ@134..135 "=" + WHITESPACE@135..136 " " + CURLY_GROUP@136..157 + L_CURLY@136..137 "{" + WORD@137..138 "S" + CURLY_GROUP@138..143 + L_CURLY@138..139 "{" + ACCENT@139..142 + ACCENT_NAME@139..141 "\\\"" + WORD@141..142 "a" + R_CURLY@142..143 "}" + WORD@143..150 "mtliche" + WHITESPACE@150..151 " " + WORD@151..156 "Werke" + R_CURLY@156..157 "}" + COMMA@157..158 "," + WHITESPACE@158..163 "\n " + FIELD@163..183 + NAME@163..167 "date" + WHITESPACE@167..176 " " + EQ@176..177 "=" + WHITESPACE@177..178 " " + LITERAL@178..182 + INTEGER@178..182 "1988" + COMMA@182..183 "," + WHITESPACE@183..188 "\n " + FIELD@188..243 + NAME@188..194 "editor" + WHITESPACE@194..201 " " + EQ@201..202 "=" + WHITESPACE@202..203 " " + CURLY_GROUP@203..242 + L_CURLY@203..204 "{" + WORD@204..209 "Colli" + COMMA@209..210 "," + WHITESPACE@210..211 " " + WORD@211..218 "Giorgio" + WHITESPACE@218..219 " " + WORD@219..222 "and" + WHITESPACE@222..223 " " + WORD@223..232 "Montinari" + COMMA@232..233 "," + WHITESPACE@233..234 " " + WORD@234..241 "Mazzino" + R_CURLY@241..242 "}" + COMMA@242..243 "," + WHITESPACE@243..248 "\n " + FIELD@248..265 + NAME@248..255 "edition" + WHITESPACE@255..261 " " + EQ@261..262 "=" + WHITESPACE@262..263 " " + LITERAL@263..264 + INTEGER@263..264 "2" + COMMA@264..265 "," + WHITESPACE@265..270 "\n " + FIELD@270..288 + NAME@270..277 "volumes" + WHITESPACE@277..283 " " + EQ@283..284 "=" + WHITESPACE@284..285 " " + LITERAL@285..287 + INTEGER@285..287 "15" + COMMA@287..288 "," + WHITESPACE@288..293 "\n " + FIELD@293..339 + NAME@293..302 "publisher" + WHITESPACE@302..306 " " + EQ@306..307 "=" + WHITESPACE@307..308 " " + JOIN@308..338 + LITERAL@308..311 + NAME@308..311 "dtv" + WHITESPACE@311..312 " " + POUND@312..313 "#" + WHITESPACE@313..314 " " + CURLY_GROUP@314..338 + L_CURLY@314..315 "{" + WHITESPACE@315..316 " " + WORD@316..319 "and" + WHITESPACE@319..320 " " + WORD@320..326 "Walter" + WHITESPACE@326..327 " " + WORD@327..329 "de" + WHITESPACE@329..330 " " + WORD@330..337 "Gruyter" + R_CURLY@337..338 "}" + COMMA@338..339 "," + WHITESPACE@339..344 "\n " + FIELD@344..397 + NAME@344..352 "location" + WHITESPACE@352..357 " " + EQ@357..358 "=" + WHITESPACE@358..359 " " + CURLY_GROUP@359..396 + L_CURLY@359..360 "{" + WORD@360..361 "M" + CURLY_GROUP@361..366 + L_CURLY@361..362 "{" + ACCENT@362..365 + ACCENT_NAME@362..364 "\\\"" + WORD@364..365 "u" + R_CURLY@365..366 "}" + WORD@366..371 "nchen" + WHITESPACE@371..372 " " + WORD@372..375 "and" + WHITESPACE@375..376 " " + WORD@376..382 "Berlin" + WHITESPACE@382..383 " " + WORD@383..386 "and" + WHITESPACE@386..387 " " + WORD@387..390 "New" + WHITESPACE@390..391 " " + WORD@391..395 "York" + R_CURLY@395..396 "}" + COMMA@396..397 "," + WHITESPACE@397..402 "\n " + FIELD@402..426 + NAME@402..408 "langid" + WHITESPACE@408..415 " " + EQ@415..416 "=" + WHITESPACE@416..417 " " + CURLY_GROUP@417..425 + L_CURLY@417..418 "{" + WORD@418..424 "german" + R_CURLY@424..425 "}" + COMMA@425..426 "," + WHITESPACE@426..431 "\n " + FIELD@431..461 + NAME@431..440 "sorttitle" + WHITESPACE@440..444 " " + EQ@444..445 "=" + WHITESPACE@445..446 " " + CURLY_GROUP@446..460 + L_CURLY@446..447 "{" + WORD@447..459 "Werke-00-000" + R_CURLY@459..460 "}" + COMMA@460..461 "," + WHITESPACE@461..466 "\n " + FIELD@466..500 + NAME@466..480 "indexsorttitle" + EQ@480..481 "=" + WHITESPACE@481..482 " " + CURLY_GROUP@482..499 + L_CURLY@482..483 "{" + WORD@483..492 "Samtliche" + WHITESPACE@492..493 " " + WORD@493..498 "Werke" + R_CURLY@498..499 "}" + COMMA@499..500 "," + WHITESPACE@500..505 "\n " + FIELD@505..547 + NAME@505..513 "subtitle" + WHITESPACE@513..518 " " + EQ@518..519 "=" + WHITESPACE@519..520 " " + CURLY_GROUP@520..546 + L_CURLY@520..521 "{" + WORD@521..530 "Kritische" + WHITESPACE@530..531 " " + WORD@531..545 "Studienausgabe" + R_CURLY@545..546 "}" + COMMA@546..547 "," + WHITESPACE@547..552 "\n " + FIELD@552..1110 + NAME@552..562 "annotation" + WHITESPACE@562..565 " " + EQ@565..566 "=" + WHITESPACE@566..567 " " + CURLY_GROUP@567..1109 + L_CURLY@567..568 "{" + WORD@568..571 "The" + WHITESPACE@571..572 " " + WORD@572..580 "critical" + WHITESPACE@580..581 " " + WORD@581..588 "edition" + WHITESPACE@588..589 " " + WORD@589..591 "of" + WHITESPACE@591..592 " " + WORD@592..603 "Nietzsche's" + WHITESPACE@603..604 " " + WORD@604..610 "works." + WHITESPACE@610..611 " " + WORD@611..615 "This" + WHITESPACE@615..616 " " + WORD@616..618 "is" + WHITESPACE@618..619 " " + WORD@619..620 "a" + WHITESPACE@620..641 "\n " + COMMAND@641..648 + COMMAND_NAME@641..648 "\\texttt" + CURLY_GROUP@648..656 + L_CURLY@648..649 "{" + WORD@649..655 "mvbook" + R_CURLY@655..656 "}" + WHITESPACE@656..657 " " + WORD@657..662 "entry" + WHITESPACE@662..663 " " + WORD@663..672 "referring" + WHITESPACE@672..673 " " + WORD@673..675 "to" + WHITESPACE@675..676 " " + WORD@676..677 "a" + WHITESPACE@677..678 " " + WORD@678..687 "15-volume" + WHITESPACE@687..688 " " + WORD@688..692 "work" + WHITESPACE@692..693 " " + WORD@693..695 "as" + WHITESPACE@695..696 " " + WORD@696..697 "a" + WHITESPACE@697..718 "\n " + WORD@718..724 "whole." + WHITESPACE@724..725 " " + WORD@725..729 "Note" + WHITESPACE@729..730 " " + WORD@730..733 "the" + WHITESPACE@733..734 " " + COMMAND@734..741 + COMMAND_NAME@734..741 "\\texttt" + CURLY_GROUP@741..750 + L_CURLY@741..742 "{" + WORD@742..749 "volumes" + R_CURLY@749..750 "}" + WHITESPACE@750..751 " " + WORD@751..756 "field" + WHITESPACE@756..757 " " + WORD@757..760 "and" + WHITESPACE@760..761 " " + WORD@761..764 "the" + WHITESPACE@764..765 " " + WORD@765..771 "format" + WHITESPACE@771..772 " " + WORD@772..774 "of" + WHITESPACE@774..775 " " + WORD@775..778 "the" + WHITESPACE@778..799 "\n " + COMMAND@799..806 + COMMAND_NAME@799..806 "\\texttt" + CURLY_GROUP@806..817 + L_CURLY@806..807 "{" + WORD@807..816 "publisher" + R_CURLY@816..817 "}" + WHITESPACE@817..818 " " + WORD@818..821 "and" + WHITESPACE@821..822 " " + COMMAND@822..829 + COMMAND_NAME@822..829 "\\texttt" + CURLY_GROUP@829..839 + L_CURLY@829..830 "{" + WORD@830..838 "location" + R_CURLY@838..839 "}" + WHITESPACE@839..840 " " + WORD@840..846 "fields" + WHITESPACE@846..847 " " + WORD@847..849 "in" + WHITESPACE@849..850 " " + WORD@850..853 "the" + WHITESPACE@853..874 "\n " + WORD@874..882 "database" + WHITESPACE@882..883 " " + WORD@883..888 "file." + WHITESPACE@888..889 " " + WORD@889..893 "Also" + WHITESPACE@893..894 " " + WORD@894..898 "note" + WHITESPACE@898..899 " " + WORD@899..902 "the" + WHITESPACE@902..903 " " + COMMAND@903..910 + COMMAND_NAME@903..910 "\\texttt" + CURLY_GROUP@910..921 + L_CURLY@910..911 "{" + WORD@911..920 "sorttitle" + R_CURLY@920..921 "}" + WHITESPACE@921..922 " " + WORD@922..925 "and" + WHITESPACE@925..946 "\n " + WORD@946..951 "field" + WHITESPACE@951..952 " " + WORD@952..957 "which" + WHITESPACE@957..958 " " + WORD@958..960 "is" + WHITESPACE@960..961 " " + WORD@961..965 "used" + WHITESPACE@965..966 " " + WORD@966..968 "to" + WHITESPACE@968..969 " " + WORD@969..978 "fine-tune" + WHITESPACE@978..979 " " + WORD@979..982 "the" + WHITESPACE@982..1003 "\n " + WORD@1003..1010 "sorting" + WHITESPACE@1010..1011 " " + WORD@1011..1016 "order" + WHITESPACE@1016..1017 " " + WORD@1017..1019 "of" + WHITESPACE@1019..1020 " " + WORD@1020..1023 "the" + WHITESPACE@1023..1024 " " + WORD@1024..1037 "bibliography." + WHITESPACE@1037..1038 " " + WORD@1038..1040 "We" + WHITESPACE@1040..1041 " " + WORD@1041..1045 "want" + WHITESPACE@1045..1046 " " + WORD@1046..1050 "this" + WHITESPACE@1050..1051 " " + WORD@1051..1055 "item" + WHITESPACE@1055..1056 " " + WORD@1056..1062 "listed" + WHITESPACE@1062..1083 "\n " + WORD@1083..1088 "first" + WHITESPACE@1088..1089 " " + WORD@1089..1091 "in" + WHITESPACE@1091..1092 " " + WORD@1092..1095 "the" + WHITESPACE@1095..1096 " " + WORD@1096..1108 "bibliography" + R_CURLY@1108..1109 "}" + COMMA@1109..1110 "," + WHITESPACE@1110..1111 "\n" + R_DELIM@1111..1112 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap new file mode 100644 index 0000000000..b296d9cd4b --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__bibtex__tests__parse@samples__rivest_1978.txt.snap @@ -0,0 +1,232 @@ +--- +source: src/parser/bibtex.rs +expression: root +input_file: src/parser/test_data/bibtex/samples/rivest_1978.txt +--- +ROOT@0..557 + ENTRY@0..557 + TYPE@0..8 "@article" + L_DELIM@8..9 "{" + NAME@9..30 "10.1145/359340.359342" + COMMA@30..31 "," + WHITESPACE@31..36 "\n " + FIELD@36..92 + NAME@36..42 "author" + WHITESPACE@42..43 " " + EQ@43..44 "=" + WHITESPACE@44..45 " " + CURLY_GROUP@45..91 + L_CURLY@45..46 "{" + WORD@46..52 "Rivest" + COMMA@52..53 "," + WHITESPACE@53..54 " " + WORD@54..56 "R." + WHITESPACE@56..57 " " + WORD@57..59 "L." + WHITESPACE@59..60 " " + WORD@60..63 "and" + WHITESPACE@63..64 " " + WORD@64..70 "Shamir" + COMMA@70..71 "," + WHITESPACE@71..72 " " + WORD@72..74 "A." + WHITESPACE@74..75 " " + WORD@75..78 "and" + WHITESPACE@78..79 " " + WORD@79..86 "Adleman" + COMMA@86..87 "," + WHITESPACE@87..88 " " + WORD@88..90 "L." + R_CURLY@90..91 "}" + COMMA@91..92 "," + WHITESPACE@92..97 "\n " + FIELD@97..178 + NAME@97..102 "title" + WHITESPACE@102..103 " " + EQ@103..104 "=" + WHITESPACE@104..105 " " + CURLY_GROUP@105..177 + L_CURLY@105..106 "{" + WORD@106..107 "A" + WHITESPACE@107..108 " " + WORD@108..114 "Method" + WHITESPACE@114..115 " " + WORD@115..118 "for" + WHITESPACE@118..119 " " + WORD@119..128 "Obtaining" + WHITESPACE@128..129 " " + WORD@129..136 "Digital" + WHITESPACE@136..137 " " + WORD@137..147 "Signatures" + WHITESPACE@147..148 " " + WORD@148..151 "and" + WHITESPACE@151..152 " " + WORD@152..162 "Public-Key" + WHITESPACE@162..163 " " + WORD@163..176 "Cryptosystems" + R_CURLY@176..177 "}" + COMMA@177..178 "," + WHITESPACE@178..183 "\n " + FIELD@183..197 + NAME@183..187 "year" + WHITESPACE@187..188 " " + EQ@188..189 "=" + WHITESPACE@189..190 " " + CURLY_GROUP@190..196 + L_CURLY@190..191 "{" + INTEGER@191..195 "1978" + R_CURLY@195..196 "}" + COMMA@196..197 "," + WHITESPACE@197..202 "\n " + FIELD@202..227 + NAME@202..212 "issue_date" + WHITESPACE@212..213 " " + EQ@213..214 "=" + WHITESPACE@214..215 " " + CURLY_GROUP@215..226 + L_CURLY@215..216 "{" + WORD@216..220 "Feb." + WHITESPACE@220..221 " " + INTEGER@221..225 "1978" + R_CURLY@225..226 "}" + COMMA@226..227 "," + WHITESPACE@227..232 "\n " + FIELD@232..282 + NAME@232..241 "publisher" + WHITESPACE@241..242 " " + EQ@242..243 "=" + WHITESPACE@243..244 " " + CURLY_GROUP@244..281 + L_CURLY@244..245 "{" + WORD@245..256 "Association" + WHITESPACE@256..257 " " + WORD@257..260 "for" + WHITESPACE@260..261 " " + WORD@261..270 "Computing" + WHITESPACE@270..271 " " + WORD@271..280 "Machinery" + R_CURLY@280..281 "}" + COMMA@281..282 "," + WHITESPACE@282..287 "\n " + FIELD@287..317 + NAME@287..294 "address" + WHITESPACE@294..295 " " + EQ@295..296 "=" + WHITESPACE@296..297 " " + CURLY_GROUP@297..316 + L_CURLY@297..298 "{" + WORD@298..301 "New" + WHITESPACE@301..302 " " + WORD@302..306 "York" + COMMA@306..307 "," + WHITESPACE@307..308 " " + WORD@308..310 "NY" + COMMA@310..311 "," + WHITESPACE@311..312 " " + WORD@312..315 "USA" + R_CURLY@315..316 "}" + COMMA@316..317 "," + WHITESPACE@317..322 "\n " + FIELD@322..336 + NAME@322..328 "volume" + WHITESPACE@328..329 " " + EQ@329..330 "=" + WHITESPACE@330..331 " " + CURLY_GROUP@331..335 + L_CURLY@331..332 "{" + INTEGER@332..334 "21" + R_CURLY@334..335 "}" + COMMA@335..336 "," + WHITESPACE@336..341 "\n " + FIELD@341..354 + NAME@341..347 "number" + WHITESPACE@347..348 " " + EQ@348..349 "=" + WHITESPACE@349..350 " " + CURLY_GROUP@350..353 + L_CURLY@350..351 "{" + INTEGER@351..352 "2" + R_CURLY@352..353 "}" + COMMA@353..354 "," + WHITESPACE@354..359 "\n " + FIELD@359..378 + NAME@359..363 "issn" + WHITESPACE@363..364 " " + EQ@364..365 "=" + WHITESPACE@365..366 " " + CURLY_GROUP@366..377 + L_CURLY@366..367 "{" + WORD@367..376 "0001-0782" + R_CURLY@376..377 "}" + COMMA@377..378 "," + WHITESPACE@378..383 "\n " + FIELD@383..429 + NAME@383..386 "url" + WHITESPACE@386..387 " " + EQ@387..388 "=" + WHITESPACE@388..389 " " + CURLY_GROUP@389..428 + L_CURLY@389..390 "{" + WORD@390..427 "https://doi.org/10.11 ..." + R_CURLY@427..428 "}" + COMMA@428..429 "," + WHITESPACE@429..434 "\n " + FIELD@434..464 + NAME@434..437 "doi" + WHITESPACE@437..438 " " + EQ@438..439 "=" + WHITESPACE@439..440 " " + CURLY_GROUP@440..463 + L_CURLY@440..441 "{" + WORD@441..462 "10.1145/359340.359342" + R_CURLY@462..463 "}" + COMMA@463..464 "," + WHITESPACE@464..469 "\n " + FIELD@469..493 + NAME@469..476 "journal" + WHITESPACE@476..477 " " + EQ@477..478 "=" + WHITESPACE@478..479 " " + CURLY_GROUP@479..492 + L_CURLY@479..480 "{" + WORD@480..487 "Commun." + WHITESPACE@487..488 " " + WORD@488..491 "ACM" + R_CURLY@491..492 "}" + COMMA@492..493 "," + WHITESPACE@493..498 "\n " + FIELD@498..512 + NAME@498..503 "month" + WHITESPACE@503..504 " " + EQ@504..505 "=" + WHITESPACE@505..506 " " + CURLY_GROUP@506..511 + L_CURLY@506..507 "{" + WORD@507..510 "feb" + R_CURLY@510..511 "}" + COMMA@511..512 "," + WHITESPACE@512..517 "\n " + FIELD@517..535 + NAME@517..522 "pages" + WHITESPACE@522..523 " " + EQ@523..524 "=" + WHITESPACE@524..525 " " + CURLY_GROUP@525..534 + L_CURLY@525..526 "{" + WORD@526..533 "120-126" + R_CURLY@533..534 "}" + COMMA@534..535 "," + WHITESPACE@535..540 "\n " + FIELD@540..555 + NAME@540..548 "numpages" + WHITESPACE@548..549 " " + EQ@549..550 "=" + WHITESPACE@550..551 " " + CURLY_GROUP@551..554 + L_CURLY@551..552 "{" + INTEGER@552..553 "7" + R_CURLY@553..554 "}" + COMMA@554..555 "," + WHITESPACE@555..556 "\n" + R_DELIM@556..557 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap new file mode 100644 index 0000000000..1d91ff7fff --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@001.txt.snap @@ -0,0 +1,27 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/001.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "Overfull \\hbox (200.00162pt too wide) in paragraph at lines 8--9", + hint: None, + line: Some( + 7, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "Overfull \\vbox (3.19998pt too high) detected at line 23", + hint: None, + line: Some( + 22, + ), + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap new file mode 100644 index 0000000000..91fa71d636 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@002.txt.snap @@ -0,0 +1,20 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/002.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "./child.tex", + level: Error, + message: "Undefined control sequence.", + hint: Some( + "\\foo", + ), + line: Some( + 0, + ), + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap new file mode 100644 index 0000000000..d2024a8cd3 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@003.txt.snap @@ -0,0 +1,23 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/003.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "Citation `foo' on page 1 undefined on input line 6.", + hint: None, + line: None, + }, + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "There were undefined references.", + hint: None, + line: None, + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap new file mode 100644 index 0000000000..83219b5fff --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@004.txt.snap @@ -0,0 +1,31 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/004.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty", + level: Error, + message: "Package babel Error: Unknown option `foo'. Either you misspelled it or the language definition file foo.ldf was not found.", + hint: Some( + "\\ProcessOptions*", + ), + line: Some( + 392, + ), + }, + BuildError { + relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty", + level: Error, + message: "Package babel Error: You haven't specified a language option.", + hint: Some( + "ry to proceed from here, type x to quit.}", + ), + line: Some( + 425, + ), + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap new file mode 100644 index 0000000000..e4857d00d8 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@005.txt.snap @@ -0,0 +1,30 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/005.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "'babel/polyglossia' detected but 'csquotes' missing. Loading 'csquotes' recommended.", + hint: None, + line: None, + }, + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "There were undefined references.", + hint: None, + line: None, + }, + BuildError { + relative_path: "./parent.tex", + level: Warning, + message: "Please (re)run Biber on the file: parent and rerun LaTeX afterwards.", + hint: None, + line: None, + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap new file mode 100644 index 0000000000..837aa9c295 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@006.txt.snap @@ -0,0 +1,69 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +input_file: src/parser/test_data/build_log/006.txt +--- +BuildLog { + errors: [ + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Undefined control sequence.", + hint: Some( + "\\foo", + ), + line: Some( + 6, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Missing $ inserted.", + hint: Some( + "\\bar", + ), + line: Some( + 7, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Undefined control sequence.", + hint: Some( + "\\baz", + ), + line: Some( + 8, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Missing { inserted.", + hint: None, + line: Some( + 9, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Missing $ inserted.", + hint: None, + line: Some( + 9, + ), + }, + BuildError { + relative_path: "./parent.tex", + level: Error, + message: "Missing } inserted.", + hint: None, + line: Some( + 9, + ), + }, + ], +} diff --git a/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap new file mode 100644 index 0000000000..d509a01bd4 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__build_log__tests__parse@007.txt.snap @@ -0,0 +1,19 @@ +--- +source: src/parser/build_log.rs +expression: parse_build_log(&text) +--- +BuildLog { + errors: [ + BuildError { + relative_path: "/some/folder/a.tex", + level: Error, + message: "Undefined control sequence.", + hint: Some( + "\\lsdkfjlskdfj", + ), + line: Some( + 3, + ), + }, + ], +} diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__block_comments.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap index 355a93ebad..14c73e7da5 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__block_comments.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@block_comments.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1814 -expression: "setup(r#\"Foo\n\\iffalse\nTest1\n\\fi\nBar\n\\iffalse\n\\fii\n\\fi\nBaz\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/block_comments.txt --- ROOT@0..48 PREAMBLE@0..48 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap index f598a8f7e9..33e119c524 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\caption[qux]{Foo \\Bar Baz}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/caption/caption_default.txt --- ROOT@0..27 PREAMBLE@0..27 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_error.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap index 13697e882b..a016dcebed 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_error.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_default_error.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\caption[qux]{Foo \\Bar Baz\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/caption/caption_default_error.txt --- ROOT@0..26 PREAMBLE@0..26 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_figure.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap index b3bf7589d8..9303bd3ebe 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_figure.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_figure.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{figure}\\caption{Foo}\\end{figure}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/caption/caption_figure.txt --- ROOT@0..39 PREAMBLE@0..39 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap index bf9e795e18..6af368cc21 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\caption{Foo \\Bar Baz}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/caption/caption_minimal.txt --- ROOT@0..22 PREAMBLE@0..22 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal_error.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap index 6c932ce883..68fc629613 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__caption_minimal_error.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@caption__caption_minimal_error.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\caption{Foo \\Bar Baz\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/caption/caption_minimal_error.txt --- ROOT@0..21 PREAMBLE@0..21 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_empty.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap index faad4c0039..fbf2b5123e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_empty.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_empty.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite{}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_empty.txt --- ROOT@0..7 PREAMBLE@0..7 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_missing_brace.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap index 61cd6d8f0b..72bd618594 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_missing_brace.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_missing_brace.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite{foo\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_missing_brace.txt --- ROOT@0..9 PREAMBLE@0..9 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_multiple_keys.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap index 7195e8992e..81716cf8b1 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_multiple_keys.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite{foo, bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_multiple_keys.txt --- ROOT@0..15 PREAMBLE@0..15 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap index b5d92886aa..f5afdca536 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite[foo]{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_prenote.txt --- ROOT@0..15 PREAMBLE@0..15 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote_postnote.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap index ba99b66e35..feecca0435 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_prenote_postnote.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite[foo][bar]{baz}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_prenote_postnote.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_redundant_comma.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap index 9062479f7a..2a8acd1173 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_redundant_comma.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite{,foo,}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_redundant_comma.txt --- ROOT@0..12 PREAMBLE@0..12 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap index 335b9d461c..faa2e07155 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\cite{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_simple.txt --- ROOT@0..10 PREAMBLE@0..10 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_star.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap index e6d5dad128..3bcd74701c 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__citation_star.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@citation__citation_star.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\nocite{*}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/citation/citation_star.txt --- ROOT@0..10 PREAMBLE@0..10 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap index 64eee4351b..163ea09071 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolor{foo}{rgb}{255,168,0}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_definition_simple.txt --- ROOT@0..33 PREAMBLE@0..33 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_reference_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap index cb0ee151b9..0c68b5eae0 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_reference_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_reference_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\color{black}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_reference_simple.txt --- ROOT@0..13 PREAMBLE@0..13 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error1.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap index 59688f0902..2e3be43ecb 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error1.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error1.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolorset[ty]{rgb,HTML}{foo}{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_set_definition_error1.txt --- ROOT@0..39 PREAMBLE@0..39 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error2.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap index cbbeacb649..ee15174688 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error2.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error2.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolorset{rgb,HTML}{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_set_definition_error2.txt --- ROOT@0..30 PREAMBLE@0..30 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error3.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap index 826bea28b6..3416786dda 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error3.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error3.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolorset{rgb,HTML}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_set_definition_error3.txt --- ROOT@0..25 PREAMBLE@0..25 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error4.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap index 3cafa81bae..5c16d9d7a5 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_error4.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_error4.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolorset\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_set_definition_error4.txt --- ROOT@0..15 PREAMBLE@0..15 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap index 9d32e127ef..a4cff9c7a1 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__color_set_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@color__color_set_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\definecolorset[ty]{rgb,HTML}{foo}{bar}{baz}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/color/color_set_definition_simple.txt --- ROOT@0..44 PREAMBLE@0..44 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_argc.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap index 2ff3896080..a10287b262 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_argc.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newcommand{\\foo}{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_no_argc.txt --- ROOT@0..22 PREAMBLE@0..22 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap index 4602a7a688..ae9b54e0c8 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newcommand{\\foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_no_impl.txt --- ROOT@0..17 PREAMBLE@0..17 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl_error.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap index 4a20be7d7c..2e1f2f2956 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_no_impl_error.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newcommand{\\foo\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt --- ROOT@0..16 PREAMBLE@0..16 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_optional.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap index 66c263e49a..fe1a3ad6ec 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_optional.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap @@ -1,8 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1579 -expression: "setup(r#\"\\newcommand{\\foo}[1][def]{#1}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_optional.txt --- ROOT@0..29 PREAMBLE@0..29 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap index b6b8380155..422fdd0d5b 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newcommand[1]{\\id}{#1}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_simple.txt --- ROOT@0..23 PREAMBLE@0..23 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_with_begin.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap index 6b7724c0aa..9ee38a1796 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__command_definition_with_begin.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1723 -expression: "setup(r#\"\\newcommand{\\CVSubHeadingListStart}{\\begin{itemize}[leftmargin=0.5cm, label={}]}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/command_definition_with_begin.txt --- ROOT@0..80 PREAMBLE@0..80 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_no_impl.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap index 2e39ee899c..371d1272c4 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_no_impl.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\DeclareMathOperator{\\foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/math_operator_no_impl.txt --- ROOT@0..26 PREAMBLE@0..26 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap index bb44005153..004e6918e4 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__math_operator_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\DeclareMathOperator{\\foo}{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/command_definition/math_operator_simple.txt --- ROOT@0..31 PREAMBLE@0..31 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__asymptote.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap index a735d71e73..abbc71e6ed 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__asymptote.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_asymptote.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1829 -expression: "setup(r#\"\\begin{asy}\n printf(\"Hello World\\n\");\n\\end{asy}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_asymptote.txt --- ROOT@0..50 PREAMBLE@0..50 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap index 5d977db814..fb45f5d35b 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1792 -expression: "setup(r#\"\\newenvironment{bar}[1]{\\begin{foo}}{\\end{foo}}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_definition.txt --- ROOT@0..47 PREAMBLE@0..47 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition_optional_arg.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap index 1a064fefe3..10009e851b 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_definition_optional_arg.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1797 -expression: "setup(r#\"\\newenvironment{foo}[1][default]{begin}{end}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_definition_optional_arg.txt --- ROOT@0..44 PREAMBLE@0..44 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap index 3a65af3a2b..e3274ef70e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{foo} \\begin{qux} \\end{baz} \\end{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_nested.txt --- ROOT@0..43 PREAMBLE@0..43 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested_missing_braces.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap index 973e6e9a9f..698be0eae7 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_nested_missing_braces.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{foo \\begin{qux Hello World \\end{baz} \\end{bar\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_nested_missing_braces.txt --- ROOT@0..52 PREAMBLE@0..52 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap index b8b85f1348..db57d39580 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__environment_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@environment__environment_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{foo} Hello World \\end{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/environment/environment_simple.txt --- ROOT@0..33 PREAMBLE@0..33 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap index e146fcaee6..0974c69449 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\[ foo bar \\]\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/equation.txt --- ROOT@0..13 PREAMBLE@0..13 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_begin.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap index 9a2af78417..c649fc6a6a 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_begin.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@equation_missing_begin.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{a} foo bar \\] \\end{b}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/equation_missing_begin.txt --- ROOT@0..28 PREAMBLE@0..28 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_args.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap index b62c8c2559..9fee38a855 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_args.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_args.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\foo{bar}[qux]\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/generic_command_args.txt --- ROOT@0..14 PREAMBLE@0..14 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap new file mode 100644 index 0000000000..dcd2382d02 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_empty.txt.snap @@ -0,0 +1,10 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/generic_command_empty.txt +--- +ROOT@0..4 + PREAMBLE@0..4 + GENERIC_COMMAND@0..4 + GENERIC_COMMAND_NAME@0..4 "\\foo" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap new file mode 100644 index 0000000000..d7d88a32ce --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@generic_command_escape.txt.snap @@ -0,0 +1,10 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/generic_command_escape.txt +--- +ROOT@0..2 + PREAMBLE@0..2 + GENERIC_COMMAND@0..2 + GENERIC_COMMAND_NAME@0..2 "\\#" + diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acronym_declaration.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap index a92180efb3..c1298e50fc 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acronym_declaration.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_declaration.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\DeclareAcronym{eg}{short = e.g,long = for example,tag = abbrev}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_declaration.txt --- ROOT@0..64 PREAMBLE@0..64 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap index 80043c18e7..eac9b6e3ba 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_definition_options.txt --- ROOT@0..76 PREAMBLE@0..76 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap index 74ae2219de..e6bfe2a9d5 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newacronym{fpsLabel}{FPS}{Frame per Second}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_definition_simple.txt --- ROOT@0..44 PREAMBLE@0..44 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap new file mode 100644 index 0000000000..9babc04165 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_package.txt.snap @@ -0,0 +1,30 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_package.txt +--- +ROOT@0..35 + PREAMBLE@0..35 + ACRONYM_DEFINITION@0..35 + ACRONYM_DEFINITION_NAME@0..5 "\\acro" + CURLY_GROUP_WORD@5..10 + L_CURLY@5..6 "{" + KEY@6..9 + WORD@6..9 "fps" + R_CURLY@9..10 "}" + BRACK_GROUP@10..15 + L_BRACK@10..11 "[" + TEXT@11..14 + WORD@11..14 "FPS" + R_BRACK@14..15 "]" + CURLY_GROUP@15..35 + L_CURLY@15..16 "{" + TEXT@16..33 + WORD@16..22 "Frames" + WHITESPACE@22..23 " " + WORD@23..26 "per" + WHITESPACE@26..27 " " + WORD@27..33 "Second" + R_CURLY@33..34 "}" + LINE_BREAK@34..35 "\n" + diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap index 6a1c2cdcbe..99a8fbc562 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\acrshort[foo=bar,baz]{fpsLabel}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_reference_options.txt --- ROOT@0..32 PREAMBLE@0..32 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap index 9924c7175c..08effadf7e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__acroynm_reference_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\acrshort{fpsLabel}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/acronym_reference_simple.txt --- ROOT@0..19 PREAMBLE@0..19 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap index 519abf75e8..4ab51a0db3 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newglossaryentry{foo}{bar = baz, qux,}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt --- ROOT@0..39 PREAMBLE@0..39 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap index 494c0be0a0..d97e984b77 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\gls[foo = bar, qux]{baz}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt --- ROOT@0..25 PREAMBLE@0..25 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap index 94af3796fc..8c8fb0c1e2 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__glossary_entry_reference_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\gls{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt --- ROOT@0..9 PREAMBLE@0..9 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap new file mode 100644 index 0000000000..9067d36c7d --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path.txt.snap @@ -0,0 +1,18 @@ +--- +source: src/parser/latex.rs +assertion_line: 1361 +expression: root +--- +ROOT@0..28 + PREAMBLE@0..28 + GRAPHICS_PATH@0..28 + GRAPHICS_PATH_NAME@0..13 "\\graphicspath" + CURLY_GROUP@13..28 + L_CURLY@13..14 "{" + CURLY_GROUP_WORD@14..27 + L_CURLY@14..15 "{" + KEY@15..26 + WORD@15..26 "../figures/" + R_CURLY@26..27 "}" + R_CURLY@27..28 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap new file mode 100644 index 0000000000..4092b2e8e9 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_command.txt.snap @@ -0,0 +1,23 @@ +--- +source: src/parser/latex.rs +assertion_line: 1348 +expression: root +--- +ROOT@0..32 + PREAMBLE@0..32 + GRAPHICS_PATH@0..32 + GRAPHICS_PATH_NAME@0..13 "\\graphicspath" + CURLY_GROUP@13..32 + L_CURLY@13..14 "{" + CURLY_GROUP_WORD@14..31 + L_CURLY@14..15 "{" + KEY@15..30 + GENERIC_COMMAND_NAME@15..22 "\\subfix" + CURLY_GROUP_WORD@22..30 + L_CURLY@22..23 "{" + KEY@23..29 + WORD@23..29 "./img/" + R_CURLY@29..30 "}" + R_CURLY@30..31 "}" + R_CURLY@31..32 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap new file mode 100644 index 0000000000..0eb034bbb3 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@graphics_path_options.txt.snap @@ -0,0 +1,23 @@ +--- +source: src/parser/latex.rs +assertion_line: 1348 +expression: root +--- +ROOT@0..33 + PREAMBLE@0..33 + GRAPHICS_PATH@0..13 + GRAPHICS_PATH_NAME@0..13 "\\graphicspath" + MIXED_GROUP@13..18 + L_BRACK@13..14 "[" + TEXT@14..17 + WORD@14..17 "foo" + R_BRACK@17..18 "]" + CURLY_GROUP@18..33 + L_CURLY@18..19 "{" + CURLY_GROUP@19..32 + L_CURLY@19..20 "{" + TEXT@20..31 + WORD@20..31 "../figures/" + R_CURLY@31..32 "}" + R_CURLY@32..33 "}" + diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_missing_end.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap index c5fc46ec4d..68969f9c11 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_missing_end.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_missing_end.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"{hello world\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/curly_group_missing_end.txt --- ROOT@0..12 PREAMBLE@0..12 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap index 10ebc4418e..156ec2e0a2 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__brace_group_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__curly_group_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"{hello world}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/curly_group_simple.txt --- ROOT@0..13 PREAMBLE@0..13 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_end.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap index 3085037fac..eae04433d1 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_missing_end.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__equation_missing_end.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{a} \\[ foo bar \\end{b}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/equation_missing_end.txt --- ROOT@0..28 PREAMBLE@0..28 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__escaped_brackets.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap index c595828583..a396d2e984 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__escaped_brackets.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__escaped_brackets.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"{[}{]}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/escaped_brackets.txt --- ROOT@0..6 PREAMBLE@0..6 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_braces.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap index df463f501a..82d7e9db45 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_braces.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_braces.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"}{\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/unmatched_braces.txt --- ROOT@0..2 PREAMBLE@0..2 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap index 578cbf6099..7dd82d48bc 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"][\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/unmatched_brackets.txt --- ROOT@0..2 PREAMBLE@0..2 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets_with_group.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap index d929c98c46..3c45c0c14c 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__unmatched_brackets_with_group.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"{][}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/group/unmatched_brackets_with_group.txt --- ROOT@0..4 PREAMBLE@0..4 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__hello_world.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap index ee25cb5453..7c1ff02b81 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__hello_world.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@hello_world.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"Hello World!\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/hello_world.txt --- ROOT@0..12 PREAMBLE@0..12 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap index 3189cabd46..897d693fd0 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\addbibresource[foo=bar, baz]{foo/bar.bib}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/biblatex_include_options.txt --- ROOT@0..42 PREAMBLE@0..42 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap index 3166d13aff..a4be9c38cb 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__biblatex_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__biblatex_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\addbibresource{foo/bar.bib}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/biblatex_include_simple.txt --- ROOT@0..28 PREAMBLE@0..28 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__bibtex_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap index db58621c75..0a8f9cd3f6 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__bibtex_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__bibtex_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\bibliography{foo/bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/bibtex_include_simple.txt --- ROOT@0..22 PREAMBLE@0..22 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_empty.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap index 7d84653225..37ea745308 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_empty.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_empty.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\documentclass{}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/class_include_empty.txt --- ROOT@0..16 PREAMBLE@0..16 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap index ac20c4b8ac..ff95f8358f 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\documentclass[foo = bar, baz, qux]{article}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/class_include_options.txt --- ROOT@0..44 PREAMBLE@0..44 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap index 07c426101e..670fa2b902 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__class_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__class_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\documentclass{article}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/class_include_simple.txt --- ROOT@0..23 PREAMBLE@0..23 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_command.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap index d279eda7f7..0332499c66 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_command.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_command.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1639 -expression: "setup(r#\"\\includegraphics[width=0.5\\textwidth]{\\foo.\\bar.pdf}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/graphics_include_command.txt --- ROOT@0..52 PREAMBLE@0..52 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_complicated_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap index a79c7f925e..5259eb5072 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_complicated_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap @@ -1,8 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1547 -expression: "setup(r#\"\\includegraphics[width=0.5\\textwidth]{}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/graphics_include_complicated_options.txt --- ROOT@0..39 PREAMBLE@0..39 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap index 14e2413323..5ed7df9cfc 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includegraphics[scale=.5]{foo/bar.pdf}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/graphics_include_options.txt --- ROOT@0..39 PREAMBLE@0..39 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap index f4c640bca8..cabb065d24 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__graphics_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includegraphics{foo/bar.pdf}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/graphics_include_simple.txt --- ROOT@0..29 PREAMBLE@0..29 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_incomplete.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap index c8634d6269..dad78222c2 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_incomplete.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_incomplete.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\import{foo\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/import_incomplete.txt --- ROOT@0..11 PREAMBLE@0..11 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap index c94f34eb3f..9e4fdeb284 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__import_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__import_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\import{foo}{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/import_simple.txt --- ROOT@0..17 PREAMBLE@0..17 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap index 8b95509be6..d0e8321692 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includesvg[scale=.5]{foo/bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/inkscape_include_options.txt --- ROOT@0..30 PREAMBLE@0..30 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap index e3d1f9bdfd..1d1e68f33c 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inkscape_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__inkscape_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includesvg{foo/bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/inkscape_include_simple.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_equality_sign.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap index c6cfb5dda3..abf7865a42 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_equality_sign.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap @@ -1,8 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1504 -expression: "setup(r#\"\\include{foo=bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/latex_include_equality_sign.txt --- ROOT@0..17 PREAMBLE@0..17 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap index dbdeaad2f7..2315a2ad7c 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\include{foo/bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/latex_include_simple.txt --- ROOT@0..17 PREAMBLE@0..17 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_path_with_brackets.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap index cb99f39728..0ba79f0c41 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_path_with_brackets.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1591 -expression: "setup(r#\"\\input{foo[bar].tex}\"#)" +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/latex_input_path_brackets.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_empty.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap index b8851b6e1d..36e2ab5aeb 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_empty.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_empty.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usepackage{}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/package_include_empty.txt --- ROOT@0..13 PREAMBLE@0..13 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_multiple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap index 2df92fd909..876f7313d7 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_multiple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_multiple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usepackage{amsmath, lipsum}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/package_include_multiple.txt --- ROOT@0..28 PREAMBLE@0..28 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap index 0f87570023..32a624f769 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usepackage[foo = bar, baz, qux]{amsmath}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/package_include_options.txt --- ROOT@0..41 PREAMBLE@0..41 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap index a28dd39a13..014ed983dd 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__package_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__package_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usepackage{amsmath}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/package_include_simple.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__pgf_library_import_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap index c36bf857bb..7f5f78415e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__pgf_library_import_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usepgflibrary{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/pgf_library_import_simple.txt --- ROOT@0..19 PREAMBLE@0..19 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_options.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap index 3140282630..2410aeaa5a 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_options.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_options.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includesvg[scale=.5]{foo/bar.svg}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/svg_include_options.txt --- ROOT@0..34 PREAMBLE@0..34 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap index 2cf133b4d0..61dd22f045 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__svg_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__svg_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\includesvg{foo/bar.svg}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/svg_include_simple.txt --- ROOT@0..24 PREAMBLE@0..24 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__tikz_library_import_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap index 4cd63e6728..c68ff02964 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__tikz_library_import_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\usetikzlibrary{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/tikz_library_import_simple.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__verbatim_include_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap index 48d6b816f3..3c35fddf18 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__verbatim_include_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@include__verbatim_include_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\verbatiminput{foo/bar.txt}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/include/verbatim_include_simple.txt --- ROOT@0..27 PREAMBLE@0..27 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap index b430de766e..c055d183bd 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"$x \\in [0, \\infty)$\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/inline.txt --- ROOT@0..19 PREAMBLE@0..19 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline_double_dollar.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap index 8da22f3ecb..7084156fce 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__inline_double_dollar.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@inline_double_dollar.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"$$x \\in [0, \\infty)$$\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/inline_double_dollar.txt --- ROOT@0..21 PREAMBLE@0..21 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap new file mode 100644 index 0000000000..8530953285 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_745.txt.snap @@ -0,0 +1,120 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/issue_745.txt +--- +ROOT@0..271 + PREAMBLE@0..271 + CLASS_INCLUDE@0..24 + CLASS_INCLUDE_NAME@0..14 "\\documentclass" + CURLY_GROUP_WORD_LIST@14..24 + L_CURLY@14..15 "{" + KEY@15..22 + WORD@15..22 "article" + R_CURLY@22..23 "}" + LINE_BREAK@23..24 "\n" + PACKAGE_INCLUDE@24..50 + PACKAGE_INCLUDE_NAME@24..35 "\\usepackage" + CURLY_GROUP_WORD_LIST@35..50 + L_CURLY@35..36 "{" + KEY@36..46 + WORD@36..46 "tabularray" + R_CURLY@46..47 "}" + WHITESPACE@47..50 " \n\n" + GENERIC_COMMAND@50..64 + GENERIC_COMMAND_NAME@50..63 "\\ExplSyntaxOn" + LINE_BREAK@63..64 "\n" + GENERIC_COMMAND@64..223 + GENERIC_COMMAND_NAME@64..87 "\\NewDocumentEnvironment" + CURLY_GROUP@87..96 + L_CURLY@87..88 "{" + TEXT@88..95 + WORD@88..95 "exptblr" + R_CURLY@95..96 "}" + CURLY_GROUP@96..107 + L_CURLY@96..97 "{" + TEXT@97..98 + WORD@97..98 "O" + CURLY_GROUP@98..100 + L_CURLY@98..99 "{" + R_CURLY@99..100 "}" + TEXT@100..101 + WORD@100..101 "m" + R_CURLY@101..102 "}" + WHITESPACE@102..107 "\n " + CURLY_GROUP@107..200 + L_CURLY@107..108 "{" + WHITESPACE@108..113 "\n " + GENERIC_COMMAND@113..194 + GENERIC_COMMAND_NAME@113..119 "\\use:x" + WHITESPACE@119..124 "\n " + CURLY_GROUP@124..194 + L_CURLY@124..125 "{" + WHITESPACE@125..130 "\n " + GENERIC_COMMAND@130..141 + GENERIC_COMMAND_NAME@130..140 "\\exp_not:N" + WHITESPACE@140..141 " " + ENVIRONMENT@141..188 + BEGIN@141..179 + BEGIN_ENVIRONMENT_NAME@141..147 "\\begin" + CURLY_GROUP_WORD@147..158 + L_CURLY@147..148 "{" + KEY@148..152 + WORD@148..152 "tblr" + R_CURLY@152..153 "}" + WHITESPACE@153..158 "\n " + BRACK_GROUP@158..179 + L_BRACK@158..159 "[" + GENERIC_COMMAND@159..173 + GENERIC_COMMAND_NAME@159..169 "\\exp_not:n" + CURLY_GROUP@169..173 + L_CURLY@169..170 "{" + TEXT@170..172 + WORD@170..172 "#1" + R_CURLY@172..173 "}" + R_BRACK@173..174 "]" + WHITESPACE@174..179 "\n " + CURLY_GROUP@179..188 + L_CURLY@179..180 "{" + TEXT@180..182 + WORD@180..182 "#2" + R_CURLY@182..183 "}" + WHITESPACE@183..188 "\n " + MISSING@188..188 "" + R_CURLY@188..189 "}" + WHITESPACE@189..194 "\n " + R_CURLY@194..195 "}" + WHITESPACE@195..200 "\n " + CURLY_GROUP@200..223 + L_CURLY@200..201 "{" + WHITESPACE@201..206 "\n " + GENERIC_COMMAND@206..221 + END_ENVIRONMENT_NAME@206..210 "\\end" + CURLY_GROUP@210..221 + L_CURLY@210..211 "{" + TEXT@211..215 + WORD@211..215 "tblr" + R_CURLY@215..216 "}" + WHITESPACE@216..221 "\n " + R_CURLY@221..222 "}" + LINE_BREAK@222..223 "\n" + GENERIC_COMMAND@223..239 + GENERIC_COMMAND_NAME@223..237 "\\ExplSyntaxOff" + LINE_BREAK@237..239 "\n\n" + ENVIRONMENT@239..271 + BEGIN@239..257 + BEGIN_ENVIRONMENT_NAME@239..245 "\\begin" + CURLY_GROUP_WORD@245..257 + L_CURLY@245..246 "{" + KEY@246..254 + WORD@246..254 "document" + R_CURLY@254..255 "}" + LINE_BREAK@255..257 "\n\n" + END@257..271 + END_ENVIRONMENT_NAME@257..261 "\\end" + CURLY_GROUP_WORD@261..271 + L_CURLY@261..262 "{" + KEY@262..270 + WORD@262..270 "document" + R_CURLY@270..271 "}" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap new file mode 100644 index 0000000000..ff20c01008 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@issue_789.txt.snap @@ -0,0 +1,15 @@ +--- +source: src/parser/latex.rs +assertion_line: 1361 +expression: root +--- +ROOT@0..19 + PREAMBLE@0..19 + GRAPHICS_PATH@0..19 + GRAPHICS_PATH_NAME@0..13 "\\graphicspath" + CURLY_GROUP_WORD@13..19 + L_CURLY@13..14 "{" + KEY@14..18 + WORD@14..18 "test" + R_CURLY@18..19 "}" + diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_line_break.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap index 47187fabcd..7f2ff377b8 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_line_break.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_line_break.txt.snap @@ -1,8 +1,7 @@ --- -source: src/syntax/latex/parser.rs -assertion_line: 1719 -expression: "setup(\"\\\\label{hello\\nworld}\")" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_definition_line_break.txt --- ROOT@0..19 PREAMBLE@0..19 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap index 2d15533f87..a2e8b85b55 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_definition_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_definition_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\label{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_definition_simple.txt --- ROOT@0..11 PREAMBLE@0..11 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_number.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap index a63752d80e..9afdf9e88e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_number.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_number.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newlabel{foo}{{1.1}}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_number.txt --- ROOT@0..21 PREAMBLE@0..21 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_label_reference_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap index 9123fafcf2..93580e846e 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__equation_label_reference_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_equation.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\eqref{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_equation.txt --- ROOT@0..11 PREAMBLE@0..11 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_incomplete.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap index 047eea657d..64e2d9af44 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_incomplete.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_incomplete.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"Equation \\eqref{eq is a \\emph{useful} identity.\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_incomplete.txt --- ROOT@0..47 PREAMBLE@0..47 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_multiple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap index 0176c770e8..27d56c6789 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_multiple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_multiple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\ref{foo, bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_multiple.txt --- ROOT@0..14 PREAMBLE@0..14 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_error.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap index ee65f8a02f..ce5e6a49b5 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_error.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_error.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\crefrange{foo{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_range_error.txt --- ROOT@0..19 PREAMBLE@0..19 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_incomplete.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap index 3dbe4bbab6..b682f40ebc 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_incomplete.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\crefrange{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_range_incomplete.txt --- ROOT@0..15 PREAMBLE@0..15 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap index 094d0e2870..e76708bf43 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_range_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_range_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\crefrange{foo}{bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_range_simple.txt --- ROOT@0..20 PREAMBLE@0..20 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_simple.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap index 9b6e622ef9..398a6c1682 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__label_reference_simple.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@label__label_reference_simple.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\ref{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/label/label_reference_simple.txt --- ROOT@0..9 PREAMBLE@0..9 diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap new file mode 100644 index 0000000000..333db9df78 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter.txt.snap @@ -0,0 +1,10 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/parameter.txt +--- +ROOT@0..2 + PREAMBLE@0..2 + TEXT@0..2 + WORD@0..2 "#1" + diff --git a/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap new file mode 100644 index 0000000000..8e3b45ad67 --- /dev/null +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@parameter_error.txt.snap @@ -0,0 +1,10 @@ +--- +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/parameter_error.txt +--- +ROOT@0..1 + PREAMBLE@0..1 + TEXT@0..1 + WORD@0..1 "#" + diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_enum_item.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap index 0ca7421ac6..4c6222045c 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_enum_item.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_enum_item.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\begin{enumerate} \\item 1 \\item[2] 2 \\item 3 \\end{enumerate}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/structure/structure_enum_item.txt --- ROOT@0..60 PREAMBLE@0..60 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_invalid_nesting.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap index f999a50e9a..c5f7aede51 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_invalid_nesting.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\section{Foo} \\chapter{Bar}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/structure/structure_invalid_nesting.txt --- ROOT@0..27 PREAMBLE@0..27 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_nested.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap index db5602e591..1f93b8c11f 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_nested.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_nested.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\part{1}\\chapter{2}\\section{3}\\subsection{4}\\subsubsection{5}\\paragraph{6}\\subparagraph{7}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/structure/structure_nested.txt --- ROOT@0..90 PREAMBLE@0..90 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_siblings.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap index 94d2ef40bd..03a29cb4bd 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__structure_siblings.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@structure__structure_siblings.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\section{Foo} Foo \\section{Bar} Bar\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/structure/structure_siblings.txt --- ROOT@0..35 PREAMBLE@0..35 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_full.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap index 7f21c0ef52..81b9c92758 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_full.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newtheorem{foo}[bar]{Foo}[baz]\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt --- ROOT@0..31 PREAMBLE@0..31 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_counter.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap index d7bb29bf58..b422a2619f 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_counter.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newtheorem{foo}[bar]\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt --- ROOT@0..21 PREAMBLE@0..21 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap index 7c8b49efa1..0b1a3f3e48 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newtheorem{foo}{Foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt --- ROOT@0..21 PREAMBLE@0..21 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description_and_counter.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap index 3322a9a116..1f84c653bd 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_name_with_description_and_counter.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newtheorem{foo}[bar]{Foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt --- ROOT@0..26 PREAMBLE@0..26 diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_only_name.snap b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap index 0ba62df76c..8c85579665 100644 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__theorem_definition_only_name.snap +++ b/support/texlab/src/parser/snapshots/texlab__parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap @@ -1,7 +1,7 @@ --- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\newtheorem{foo}\"#)" - +source: src/parser/latex.rs +expression: root +input_file: src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt --- ROOT@0..16 PREAMBLE@0..16 diff --git a/support/texlab/src/parser/test_data/bibtex/comment.txt b/support/texlab/src/parser/test_data/bibtex/comment.txt new file mode 100644 index 0000000000..f2ff586ab7 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/comment.txt @@ -0,0 +1,6 @@ +Some junk here + +@comment{foo, + author = {Foo Bar}, + title = {Some Title}, +} diff --git a/support/texlab/src/parser/test_data/bibtex/issue_809.txt b/support/texlab/src/parser/test_data/bibtex/issue_809.txt new file mode 100644 index 0000000000..c94b808fd5 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/issue_809.txt @@ -0,0 +1,3 @@ +@article{issue_809, + title = {foo (" bar) baz}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/preamble.txt b/support/texlab/src/parser/test_data/bibtex/preamble.txt new file mode 100644 index 0000000000..266b5ce228 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/preamble.txt @@ -0,0 +1 @@ +@preamble{"Hello World!"}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt b/support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt new file mode 100644 index 0000000000..ff829b40d1 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/aho_2006.txt @@ -0,0 +1,8 @@ +@book{10.5555/1177220, + author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.}, + title = {Compilers: Principles, Techniques, and Tools (2nd Edition)}, + year = {2006}, + isbn = {0321486811}, + publisher = {Addison-Wesley Longman Publishing Co., Inc.}, + address = {USA} +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt b/support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt new file mode 100644 index 0000000000..88ea701c22 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/aksin_2006.txt @@ -0,0 +1,16 @@ +@string{jomch = {J.~Organomet. Chem.}} + +@article{aksin, + author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent + and {\c{C}}etinkaya, Bekir and Ni, Chaoying and + B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, + title = {Effect of immobilization on catalytic characteristics of + saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck} + reactions}, + journaltitle = jomch, + date = 2006, + volume = 691, + number = 13, + pages = {3027-3036}, + indextitle = {Effect of immobilization on catalytic characteristics}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt b/support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt new file mode 100644 index 0000000000..ed16d33c67 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/almendro_1998.txt @@ -0,0 +1,14 @@ +@patent{almendro, + author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez, + Alberto and Nozal, Fernando}, + title = {Elektromagnetisches Signalhorn}, + number = {EU-29702195U}, + date = 1998, + location = {countryfr and countryuk and countryde}, + langid = {german}, + annotation = {This is a \texttt{patent} entry with a \texttt{location} + field. The number is given in the \texttt{number} field. Note + the format of the \texttt{location} field in the database + file. Compare \texttt{laufenberg}, \texttt{sorace}, and + \texttt{kowalik}}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt b/support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt new file mode 100644 index 0000000000..9f224353cc --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/averroes_1998.txt @@ -0,0 +1,21 @@ +@book{averroes/bland, + author = {Averroes}, + title = {The Epistle on the Possibility of Conjunction with the Active + Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}}, + date = 1982, + editor = {Bland, Kalman P.}, + translator = {Bland, Kalman P.}, + series = {Moreshet: Studies in {Jewish} History, Literature and Thought}, + number = 7, + publisher = {Jewish Theological Seminary of America}, + location = {New York}, + keywords = {primary}, + langid = {english}, + langidopts = {variant=american}, + indextitle = {Epistle on the Possibility of Conjunction, The}, + shorttitle = {Possibility of Conjunction}, + annotation = {A \texttt{book} entry with a \texttt{series} and a + \texttt{number}. Note the concatenation of the \texttt{editor} + and \texttt{translator} fields as well as the + \texttt{indextitle} field}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt b/support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt new file mode 100644 index 0000000000..b2d77e216f --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/betram_1996.txt @@ -0,0 +1,16 @@ +@string{jams = {J.~Amer. Math. Soc.}} + +@article{bertram, + author = {Bertram, Aaron and Wentworth, Richard}, + title = {Gromov invariants for holomorphic maps on {Riemann} surfaces}, + journaltitle = jams, + date = 1996, + volume = 9, + number = 2, + pages = {529-571}, + langid = {english}, + langidopts = {variant=american}, + shorttitle = {Gromov invariants}, + annotation = {An \texttt{article} entry with a \texttt{volume} and a + \texttt{number} field}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt b/support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt new file mode 100644 index 0000000000..a502e53e03 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/blom_2021.txt @@ -0,0 +1,20 @@ +@article{DBLP:journals/corr/abs-2107-11903, + author = {Michelle L. Blom and + Jurlind Budurushi and + Ronald L. Rivest and + Philip B. Stark and + Peter J. Stuckey and + Vanessa Teague and + Damjan Vukcevic}, + title = {Assertion-based Approaches to Auditing Complex Elections, with application + to party-list proportional elections}, + journal = {CoRR}, + volume = {abs/2107.11903}, + year = {2021}, + url = {https://arxiv.org/abs/2107.11903}, + eprinttype = {arXiv}, + eprint = {2107.11903}, + timestamp = {Thu, 29 Jul 2021 16:14:15 +0200}, + biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt b/support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt new file mode 100644 index 0000000000..7d8545577d --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/combi_2004.txt @@ -0,0 +1,16 @@ +@inproceedings{10.1145/967900.968040, + author = {Combi, Carlo and Pozzi, Giuseppe}, + title = {Architectures for a Temporal Workflow Management System}, + year = {2004}, + isbn = {1581138121}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/967900.968040}, + doi = {10.1145/967900.968040}, + booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing}, + pages = {659-666}, + numpages = {8}, + keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system}, + location = {Nicosia, Cyprus}, + series = {SAC '04} +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt b/support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt new file mode 100644 index 0000000000..116f5e7098 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/erwin_2007.txt @@ -0,0 +1,14 @@ +@inproceedings{10.5555/1386993.1386994, + author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.}, + title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets}, + year = {2007}, + isbn = {9781920682651}, + publisher = {Australian Computer Society, Inc.}, + address = {AUS}, + booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84}, + pages = {3-11}, + numpages = {9}, + keywords = {pattern growth, high utility itemset mining}, + location = {Gold Coast, Australia}, + series = {AIDM '07} +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt b/support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt new file mode 100644 index 0000000000..c367ef12ee --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/jain_1999.txt @@ -0,0 +1,18 @@ +@article{10.1145/331499.331504, + author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.}, + title = {Data Clustering: A Review}, + year = {1999}, + issue_date = {Sept. 1999}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {31}, + number = {3}, + issn = {0360-0300}, + url = {https://doi.org/10.1145/331499.331504}, + doi = {10.1145/331499.331504}, + journal = {ACM Comput. Surv.}, + month = {sep}, + pages = {264-323}, + numpages = {60}, + keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning} +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt b/support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt new file mode 100644 index 0000000000..457f871491 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/kastenholz_2006.txt @@ -0,0 +1,20 @@ +@string{jchph = {J.~Chem. Phys.}} + +@article{kastenholz, + author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.}, + title = {Computation of methodology\hyphen independent ionic solvation + free energies from molecular simulations}, + journaltitle = jchph, + date = 2006, + subtitle = {{I}. {The} electrostatic potential in molecular liquids}, + volume = 124, + eid = 124106, + doi = {10.1063/1.2172593}, + langid = {english}, + langidopts = {variant=american}, + indextitle = {Computation of ionic solvation free energies}, + annotation = {An \texttt{article} entry with an \texttt{eid} and a + \texttt{doi} field. Note that the \textsc{doi} is transformed + into a clickable link if \texttt{hyperref} support has been + enabled}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt b/support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt new file mode 100644 index 0000000000..98c595e35c --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/knuth_1984.txt @@ -0,0 +1,22 @@ +@book{knuth:ct:a, + author = {Knuth, Donald E.}, + title = {The {\TeX book}}, + date = 1984, + maintitle = {Computers \& Typesetting}, + volume = {A}, + publisher = {Addison-Wesley}, + location = {Reading, Mass.}, + langid = {english}, + langidopts = {variant=american}, + sorttitle = {Computers & Typesetting A}, + indexsorttitle= {The TeXbook}, + indextitle = {\protect\TeX book, The}, + shorttitle = {\TeX book}, + annotation = {The first volume of a five-volume book. Note the + \texttt{sorttitle} field. We want this + volume to be listed after the entry referring to the entire + five-volume set. Also note the \texttt{indextitle} and + \texttt{indexsorttitle} fields. Indexing packages that don't + generate robust index entries require some control sequences + to be protected from expansion}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt b/support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt new file mode 100644 index 0000000000..cb803aab51 --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/matuz_1990.txt @@ -0,0 +1,14 @@ +@collection{matuz:doody, + editor = {Matuz, Roger}, + title = {Contemporary Literary Criticism}, + year = 1990, + volume = 61, + publisher = {Gale}, + location = {Detroit}, + pages = {204-208}, + langid = {english}, + langidopts = {variant=american}, + annotation = {A \texttt{collection} entry providing the excerpt information + for the \texttt{doody} entry. Note the format of the + \texttt{pages} field}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt b/support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt new file mode 100644 index 0000000000..e245be39bb --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/nietzsche_1998.txt @@ -0,0 +1,24 @@ +@string{dtv = {Deutscher Taschenbuch-Verlag}} + +@mvbook{nietzsche:ksa, + author = {Nietzsche, Friedrich}, + title = {S{\"a}mtliche Werke}, + date = 1988, + editor = {Colli, Giorgio and Montinari, Mazzino}, + edition = 2, + volumes = 15, + publisher = dtv # { and Walter de Gruyter}, + location = {M{\"u}nchen and Berlin and New York}, + langid = {german}, + sorttitle = {Werke-00-000}, + indexsorttitle= {Samtliche Werke}, + subtitle = {Kritische Studienausgabe}, + annotation = {The critical edition of Nietzsche's works. This is a + \texttt{mvbook} entry referring to a 15-volume work as a + whole. Note the \texttt{volumes} field and the format of the + \texttt{publisher} and \texttt{location} fields in the + database file. Also note the \texttt{sorttitle} and + field which is used to fine-tune the + sorting order of the bibliography. We want this item listed + first in the bibliography}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt b/support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt new file mode 100644 index 0000000000..e1076145ea --- /dev/null +++ b/support/texlab/src/parser/test_data/bibtex/samples/rivest_1978.txt @@ -0,0 +1,17 @@ +@article{10.1145/359340.359342, + author = {Rivest, R. L. and Shamir, A. and Adleman, L.}, + title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems}, + year = {1978}, + issue_date = {Feb. 1978}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {21}, + number = {2}, + issn = {0001-0782}, + url = {https://doi.org/10.1145/359340.359342}, + doi = {10.1145/359340.359342}, + journal = {Commun. ACM}, + month = {feb}, + pages = {120-126}, + numpages = {7}, +}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/001.txt b/support/texlab/src/parser/test_data/build_log/001.txt new file mode 100644 index 0000000000..fc9968af0f --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/001.txt @@ -0,0 +1,83 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:50 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/TexLive/texmf-dist/tex/latex/multirow/bigstrut.sty +Package: bigstrut 2016/11/25 v2.2 Provide larger struts in tabulars +\bigstrutjot=\dimen103 +) +(/TexLive/texmf-dist/tex/latex/multirow/multirow.sty +Package: multirow 2016/11/25 v2.2 Span multiple rows of a table +\multirow@colwidth=\skip43 +\multirow@cntb=\count87 +\multirow@dima=\skip44 +) (./parent.aux) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. + +Overfull \hbox (200.00162pt too wide) in paragraph at lines 8--9 +[]\OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +[] + +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 11. + +Overfull \vbox (3.19998pt too high) detected at line 23 +[] + +[1 + +{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) ) +Here is how much of TeX's memory you used: +265 strings out of 492995 +3121 string characters out of 6138727 +55074 words of memory out of 5000000 +3896 multiletter control sequences out of 15000+600000 +3640 words of font info for 14 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +23i,20n,20p,124b,282s stack positions out of 5000i,500n,10000p,200000b,80000s +</ +TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></TexLive/texmf-d +ist/fonts/type1/public/amsfonts/cm/cmr7.pfb> +Output written on parent.pdf (1 page, 17505 bytes). +PDF statistics: +16 PDF objects out of 1000 (max. 8388607) +10 compressed objects within 1 object stream +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/002.txt b/support/texlab/src/parser/test_data/build_log/002.txt new file mode 100644 index 0000000000..8d438d1f12 --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/002.txt @@ -0,0 +1,64 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:52 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) (./parent.aux (./child.aux)) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +(./child.tex +! Undefined control sequence. +l.1 \foo + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +) (./parent.aux) ) +Here is how much of TeX's memory you used: +205 strings out of 492995 +2149 string characters out of 6138727 +54074 words of memory out of 5000000 +3841 multiletter control sequences out of 15000+600000 +3640 words of font info for 14 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s + +No pages of output. +PDF statistics: +0 PDF objects out of 1000 (max. 8388607) +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/003.txt b/support/texlab/src/parser/test_data/build_log/003.txt new file mode 100644 index 0000000000..220614b91c --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/003.txt @@ -0,0 +1,65 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:51 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) (./parent.aux) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. +LaTeX Font Info: ... okay on input line 4. + +LaTeX Warning: Citation `foo' on page 1 undefined on input line 6. + +[1 + +{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) + +LaTeX Warning: There were undefined references. + +) +Here is how much of TeX's memory you used: +204 strings out of 492995 +2142 string characters out of 6138727 +54074 words of memory out of 5000000 +3842 multiletter control sequences out of 15000+600000 +3948 words of font info for 15 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +23i,4n,21p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s +</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></TexLive/ +texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb> +Output written on parent.pdf (1 page, 17339 bytes). +PDF statistics: +16 PDF objects out of 1000 (max. 8388607) +10 compressed objects within 1 object stream +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/004.txt b/support/texlab/src/parser/test_data/build_log/004.txt new file mode 100644 index 0000000000..4ab379cd53 --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/004.txt @@ -0,0 +1,83 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:40 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/TexLive/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2017/05/19 3.10 The Babel package + +! Package babel Error: Unknown option `foo'. Either you misspelled it +(babel) or the language definition file foo.ldf was not found. + +See the babel package documentation for explanation. +Type H <return> for immediate help. +... + +l.393 \ProcessOptions* + +Valid options are: shorthands=, KeepShorthandsActive, +activeacute, activegrave, noconfigs, safe=, main=, math= +headfoot=, strings=, config=, hyphenmap=, or a language name. + +! Package babel Error: You haven't specified a language option. + +See the babel package documentation for explanation. +Type H <return> for immediate help. +... + +l.426 ...ry to proceed from here, type x to quit.} + +You need to specify a language, either as a global option +or as an optional argument to the \usepackage command; +You shouldn't try to proceed from here, type x to quit. + +) (./parent.aux) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +(./parent.aux) ) +Here is how much of TeX's memory you used: +304 strings out of 492995 +3421 string characters out of 6138727 +56035 words of memory out of 5000000 +3938 multiletter control sequences out of 15000+600000 +3640 words of font info for 14 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s + +No pages of output. +PDF statistics: +0 PDF objects out of 1000 (max. 8388607) +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/005.txt b/support/texlab/src/parser/test_data/build_log/005.txt new file mode 100644 index 0000000000..07c95bfc6b --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/005.txt @@ -0,0 +1,385 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:45 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/TexLive/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2017/05/19 3.10 The Babel package + +(/TexLive/texmf-dist/tex/generic/babel-spanish/spanish.ldf +Language: spanish.ldf 2016/03/03 v5.0p Spanish support from the babel system + +(/TexLive/texmf-dist/tex/generic/babel/babel.def +File: babel.def 2017/05/19 3.10 Babel common definitions +\babel@savecnt=\count87 +\U@D=\dimen103 +) +\es@quottoks=\toks14 +\es@quotdepth=\count88 +Package babel Info: Making " an active character on input line 561. +Package babel Info: Making . an active character on input line 662. +Package babel Info: Making < an active character on input line 707. +Package babel Info: Making > an active character on input line 707. +)) +(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.sty +Package: biblatex 2016/12/05 v3.7 programmable bibliographies (PK/JW/AB) + +(/TexLive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2017/03/19 v0.25 Utility functions of pdfTeX for LuaTeX (HO +) + +(/TexLive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO) +) +(/TexLive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +(/TexLive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO) +) +(/TexLive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/TexLive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2017/01/02 v2.4 e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count89 +) +(/TexLive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks15 +) +(/TexLive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO) + +(/TexLive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO) + +(/TexLive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +(/TexLive/texmf-dist/tex/latex/logreq/logreq.sty +Package: logreq 2010/08/04 v1.0 xml request logger +\lrq@indent=\count90 + +(/TexLive/texmf-dist/tex/latex/logreq/logreq.def +File: logreq.def 2010/08/04 v1.0 logreq spec v1.0 +)) +(/TexLive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) +) +(/TexLive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip10 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +(/TexLive/texmf-dist/tex/generic/xstring/xstring.sty +(/TexLive/texmf-dist/tex/generic/xstring/xstring.tex +\@xs@message=\write3 +\integerpart=\count91 +\decimalpart=\count92 +) +Package: xstring 2013/10/13 v1.7c String manipulations (C Tellechea) +) +\c@tabx@nest=\count93 +\c@listtotal=\count94 +\c@listcount=\count95 +\c@liststart=\count96 +\c@liststop=\count97 +\c@citecount=\count98 +\c@citetotal=\count99 +\c@multicitecount=\count100 +\c@multicitetotal=\count101 +\c@instcount=\count102 +\c@maxnames=\count103 +\c@minnames=\count104 +\c@maxitems=\count105 +\c@minitems=\count106 +\c@citecounter=\count107 +\c@savedcitecounter=\count108 +\c@uniquelist=\count109 +\c@uniquename=\count110 +\c@refsection=\count111 +\c@refsegment=\count112 +\c@maxextratitle=\count113 +\c@maxextratitleyear=\count114 +\c@maxextrayear=\count115 +\c@maxextraalpha=\count116 +\c@abbrvpenalty=\count117 +\c@highnamepenalty=\count118 +\c@lownamepenalty=\count119 +\c@maxparens=\count120 +\c@parenlevel=\count121 +\blx@tempcnta=\count122 +\blx@tempcntb=\count123 +\blx@tempcntc=\count124 +\blx@maxsection=\count125 +\blx@maxsegment@0=\count126 +\blx@notetype=\count127 +\blx@parenlevel@text=\count128 +\blx@parenlevel@foot=\count129 +\blx@sectionciteorder@0=\count130 +\labelnumberwidth=\skip43 +\labelalphawidth=\skip44 +\biblabelsep=\skip45 +\bibitemsep=\skip46 +\bibnamesep=\skip47 +\bibinitsep=\skip48 +\bibparsep=\skip49 +\bibhang=\skip50 +\blx@bcfin=\read1 +\blx@bcfout=\write4 +\c@mincomprange=\count131 +\c@maxcomprange=\count132 +\c@mincompwidth=\count133 +Package biblatex Info: Trying to load biblatex default data model... +Package biblatex Info: ... file 'blx-dm.def' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/blx-dm.def) +Package biblatex Info: Trying to load biblatex style data model... +Package biblatex Info: ... file 'ieee.dbx' not found. +Package biblatex Info: Trying to load biblatex custom data model... +Package biblatex Info: ... file 'biblatex-dm.cfg' not found. +\c@afterword=\count134 +\c@savedafterword=\count135 +\c@annotator=\count136 +\c@savedannotator=\count137 +\c@author=\count138 +\c@savedauthor=\count139 +\c@bookauthor=\count140 +\c@savedbookauthor=\count141 +\c@commentator=\count142 +\c@savedcommentator=\count143 +\c@editor=\count144 +\c@savededitor=\count145 +\c@editora=\count146 +\c@savededitora=\count147 +\c@editorb=\count148 +\c@savededitorb=\count149 +\c@editorc=\count150 +\c@savededitorc=\count151 +\c@foreword=\count152 +\c@savedforeword=\count153 +\c@holder=\count154 +\c@savedholder=\count155 +\c@introduction=\count156 +\c@savedintroduction=\count157 +\c@namea=\count158 +\c@savednamea=\count159 +\c@nameb=\count160 +\c@savednameb=\count161 +\c@namec=\count162 +\c@savednamec=\count163 +\c@translator=\count164 +\c@savedtranslator=\count165 +\c@shortauthor=\count166 +\c@savedshortauthor=\count167 +\c@shorteditor=\count168 +\c@savedshorteditor=\count169 +\c@labelname=\count170 +\c@savedlabelname=\count171 +\c@institution=\count172 +\c@savedinstitution=\count173 +\c@lista=\count174 +\c@savedlista=\count175 +\c@listb=\count176 +\c@savedlistb=\count177 +\c@listc=\count178 +\c@savedlistc=\count179 +\c@listd=\count180 +\c@savedlistd=\count181 +\c@liste=\count182 +\c@savedliste=\count183 +\c@listf=\count184 +\c@savedlistf=\count185 +\c@location=\count186 +\c@savedlocation=\count187 +\c@organization=\count188 +\c@savedorganization=\count189 +\c@origlocation=\count190 +\c@savedoriglocation=\count191 +\c@origpublisher=\count192 +\c@savedorigpublisher=\count193 +\c@publisher=\count194 +\c@savedpublisher=\count195 +\c@language=\count196 +\c@savedlanguage=\count197 +\c@pageref=\count198 +\c@savedpageref=\count199 +\shorthandwidth=\skip51 +\shortjournalwidth=\skip52 +\shortserieswidth=\skip53 +\shorttitlewidth=\skip54 +\shortauthorwidth=\skip55 +\shorteditorwidth=\skip56 +Package biblatex Info: Trying to load compatibility code... +Package biblatex Info: ... file 'blx-compat.def' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/blx-compat.def +File: blx-compat.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB) +) +Package biblatex Info: Trying to load generic definitions... +Package biblatex Info: ... file 'biblatex.def' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.def +File: biblatex.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB) +\c@textcitecount=\count266 +\c@textcitetotal=\count267 +\c@textcitemaxnames=\count268 +\c@biburlnumpenalty=\count269 +\c@biburlucpenalty=\count270 +\c@biburllcpenalty=\count271 +\c@smartand=\count272 +) +Package biblatex Info: Trying to load bibliography style 'ieee'... +Package biblatex Info: ... file 'ieee.bbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.bbx +File: ieee.bbx 2017/03/27 v1.2d biblatex bibliography style +Package biblatex Info: Trying to load bibliography style 'numeric-comp'... +Package biblatex Info: ... file 'numeric-comp.bbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric-comp.bbx +File: numeric-comp.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) +Package biblatex Info: Trying to load bibliography style 'numeric'... +Package biblatex Info: ... file 'numeric.bbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx +File: numeric.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) +Package biblatex Info: Trying to load bibliography style 'standard'... +Package biblatex Info: ... file 'standard.bbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/bbx/standard.bbx +File: standard.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) +\c@bbx:relatedcount=\count273 +\c@bbx:relatedtotal=\count274 +)))) +Package biblatex Info: Trying to load citation style 'ieee'... +Package biblatex Info: ... file 'ieee.cbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.cbx +File: ieee.cbx 2017/03/27 v1.2d biblatex citation style +Package biblatex Info: Trying to load citation style 'numeric-comp'... +Package biblatex Info: ... file 'numeric-comp.cbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/cbx/numeric-comp.cbx +File: numeric-comp.cbx 2016/12/05 v3.7 biblatex citation style (PK/JW/AB) +\c@cbx@tempcnta=\count275 +\c@cbx@tempcntb=\count276 +Package biblatex Info: Redefining '\cite'. +Package biblatex Info: Redefining '\parencite'. +Package biblatex Info: Redefining '\footcite'. +Package biblatex Info: Redefining '\footcitetext'. +Package biblatex Info: Redefining '\smartcite'. +Package biblatex Info: Redefining '\supercite'. +Package biblatex Info: Redefining '\textcite'. +Package biblatex Info: Redefining '\textcites'. +Package biblatex Info: Redefining '\cites'. +Package biblatex Info: Redefining '\parencites'. +Package biblatex Info: Redefining '\smartcites'. +) +Package biblatex Info: Redefining '\cite'. +Package biblatex Info: Redefining '\cites'. +) +Package biblatex Info: Trying to load configuration file... +Package biblatex Info: ... file 'biblatex.cfg' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.cfg +File: biblatex.cfg +)) +Package biblatex Info: Trying to load language 'spanish'... +Package biblatex Info: ... file 'spanish.lbx' found. + +(/TexLive/texmf-dist/tex/latex/biblatex/lbx/spanish.lbx +File: spanish.lbx 2016/12/05 v3.7 biblatex localization (PK/JW/AB) +) + +Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing. +(biblatex) Loading 'csquotes' recommended. + +\@quotelevel=\count277 +\@quotereset=\count278 +(./parent.aux) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6. +LaTeX Font Info: ... okay on input line 6. +LaTeX Info: Redefining \sptext on input line 6. +LaTeX Info: Redefining \. on input line 6. +LaTeX Info: Redefining \% on input line 6. +Package biblatex Info: No input encoding detected. +(biblatex) Assuming 'ascii'. +Package biblatex Info: Automatic encoding selection. +(biblatex) Assuming data encoding 'ascii'. +\openout4 = `parent.bcf'. + +Package biblatex Info: Trying to load bibliographic data... +Package biblatex Info: ... file 'parent.bbl' not found. + +No file parent.bbl. +Package biblatex Info: Reference section=0 on input line 6. +Package biblatex Info: Reference segment=0 on input line 6. +(./parent.aux) + +LaTeX Warning: There were undefined references. + +Package biblatex Warning: Please (re)run Biber on the file: +(biblatex) parent +(biblatex) and rerun LaTeX afterwards. + +Package logreq Info: Writing requests to 'parent.run.xml'. +\openout1 = `parent.run.xml'. + +) +Here is how much of TeX's memory you used: +7717 strings out of 492995 +133301 string characters out of 6138727 +557258 words of memory out of 5000000 +11248 multiletter control sequences out of 15000+600000 +3640 words of font info for 14 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +35i,1n,30p,856b,700s stack positions out of 5000i,500n,10000p,200000b,80000s + +No pages of output. +PDF statistics: +0 PDF objects out of 1000 (max. 8388607) +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/006.txt b/support/texlab/src/parser/test_data/build_log/006.txt new file mode 100644 index 0000000000..3edb18b8c7 --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/006.txt @@ -0,0 +1,122 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:33 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**./parent.tex +(./parent.tex +LaTeX2e <2017-04-15> +Babel <3.10> and hyphenation patterns for 84 language(s) loaded. +(/TexLive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/TexLive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) (./parent.aux +(./child.tex.aux)) +\openout1 = `parent.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +\openout2 = `child.aux'. + +(./child.tex) +! Undefined control sequence. +l.7 \foo + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Missing $ inserted. +<inserted text> + $ +l.8 \bar + +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 8. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 8. +! Undefined control sequence. +l.9 \baz + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Missing { inserted. +<to be read again> + \par +l.10 + +A left brace was mandatory here, so I've put one in. +You might want to delete and/or insert some corrections +so that I will find a matching right brace soon. +(If you're confused by all this, try typing `I}' now.) + +! Missing $ inserted. +<inserted text> + $ +l.10 + +I've inserted a begin-math/end-math symbol since I think +you left one out. Proceed, with fingers crossed. + +! Missing } inserted. +<inserted text> + } +l.10 + +I've inserted something that you may have forgotten. +(See the <inserted text> above.) +With luck, this will get me unwedged. But if you +really didn't forget anything, try typing `2' now; then +my insertion and my current dilemma will both disappear. + +[1 + +{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux +(./child.aux)) ) +Here is how much of TeX's memory you used: +212 strings out of 492995 +2238 string characters out of 6138727 +54074 words of memory out of 5000000 +3843 multiletter control sequences out of 15000+600000 +3640 words of font info for 14 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +23i,4n,17p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s +</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb +> +Output written on parent.pdf (1 page, 8329 bytes). +PDF statistics: +12 PDF objects out of 1000 (max. 8388607) +7 compressed objects within 1 object stream +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/build_log/007.txt b/support/texlab/src/parser/test_data/build_log/007.txt new file mode 100644 index 0000000000..4c86405c0d --- /dev/null +++ b/support/texlab/src/parser/test_data/build_log/007.txt @@ -0,0 +1,176 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/W32TeX) (preloaded format=pdflatex 2021.6.19) 5 NOV 2021 19:10 +entering extended mode +restricted \write18 enabled. +%&-line parsing enabled. +**/some/folder/a.tex +(/some/folder/a.tex +LaTeX2e <2021-06-01> patch level 1 +L3 programming layer <2021-06-18> +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrartcl.cls +Document Class: scrartcl 2021/03/17 v3.33 KOMA-Script document class (article) +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrkbase.sty +Package: scrkbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-dependent b +asics and keyval usage) + +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-independent +basics and keyval usage) + +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2021/03/17 v3.33 KOMA-Script package (file load hooks) + +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty +Package: scrlfile-hook 2021/03/17 v3.33 KOMA-Script package (using LaTeX hooks) + + +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlogo.sty +Package: scrlogo 2021/03/17 v3.33 KOMA-Script package (logo) +))) +(/texlive/2021/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +Applying: [2021/05/01] Usage of raw option list on input line 252. +Already applied: [0000/00/00] compatibility for LaTeX before 2021/05/01 on inpu +t line 337. +)) +==> First Aid for scrkbase.sty no longer applied! +(/texlive/2021/texmf-dist/tex/latex/koma-script/tocbasic.sty +Package: tocbasic 2021/03/17 v3.33 KOMA-Script package (handling toc-files) +\scr@dte@tocline@numberwidth=\skip47 +\scr@dte@tocline@numbox=\box50 +) +Package tocbasic Info: babel extension for `toc' omitted +(tocbasic) because of missing \bbl@set@language on input line 135. +Class scrartcl Info: File `scrsize11pt.clo' used instead of +(scrartcl) file `scrsize11.clo' to setup font sizes on input line 223 +9. + +(/texlive/2021/texmf-dist/tex/latex/koma-script/scrsize11pt.clo +File: scrsize11pt.clo 2021/03/17 v3.33 KOMA-Script font size class option (11pt +) +) +(/texlive/2021/texmf-dist/tex/latex/koma-script/typearea.sty +Package: typearea 2021/03/17 v3.33 KOMA-Script package (type area) +\ta@bcor=\skip48 +\ta@div=\count182 +\ta@hblk=\skip49 +\ta@vblk=\skip50 +\ta@temp=\skip51 +\footheight=\skip52 +Package typearea Info: These are the values describing the layout: +(typearea) DIV = 10 +(typearea) BCOR = 0.0pt +(typearea) \paperwidth = 597.50793pt +(typearea) \textwidth = 418.25555pt +(typearea) DIV departure = -6% +(typearea) \evensidemargin = 17.3562pt +(typearea) \oddsidemargin = 17.3562pt +(typearea) \paperheight = 845.04694pt +(typearea) \textheight = 595.80026pt +(typearea) \topmargin = -25.16531pt +(typearea) \headheight = 17.0pt +(typearea) \headsep = 20.40001pt +(typearea) \topskip = 11.0pt +(typearea) \footskip = 47.6pt +(typearea) \baselineskip = 13.6pt +(typearea) on input line 1741. +) +\c@part=\count183 +\c@section=\count184 +\c@subsection=\count185 +\c@subsubsection=\count186 +\c@paragraph=\count187 +\c@subparagraph=\count188 +\scr@dte@section@maxnumwidth=\skip53 +Class scrartcl Info: using compatibility default `runin=bysign' +(scrartcl) for `\section on input line 4846. +Class scrartcl Info: using compatibility default `afterindent=bysign' +(scrartcl) for `\section on input line 4846. +\scr@dte@part@maxnumwidth=\skip54 +Class scrartcl Info: using compatibility default `afterindent=false' +(scrartcl) for `\part on input line 4854. +\scr@dte@subsection@maxnumwidth=\skip55 +Class scrartcl Info: using compatibility default `runin=bysign' +(scrartcl) for `\subsection on input line 4864. +Class scrartcl Info: using compatibility default `afterindent=bysign' +(scrartcl) for `\subsection on input line 4864. +\scr@dte@subsubsection@maxnumwidth=\skip56 +Class scrartcl Info: using compatibility default `runin=bysign' +(scrartcl) for `\subsubsection on input line 4874. +Class scrartcl Info: using compatibility default `afterindent=bysign' +(scrartcl) for `\subsubsection on input line 4874. +\scr@dte@paragraph@maxnumwidth=\skip57 +Class scrartcl Info: using compatibility default `runin=bysign' +(scrartcl) for `\paragraph on input line 4885. +Class scrartcl Info: using compatibility default `afterindent=bysign' +(scrartcl) for `\paragraph on input line 4885. +\scr@dte@subparagraph@maxnumwidth=\skip58 +Class scrartcl Info: using compatibility default `runin=bysign' +(scrartcl) for `\subparagraph on input line 4895. +Class scrartcl Info: using compatibility default `afterindent=bysign' +(scrartcl) for `\subparagraph on input line 4895. +\abovecaptionskip=\skip59 +\belowcaptionskip=\skip60 +\c@pti@nb@sid@b@x=\box51 +Package tocbasic Info: babel extension for `lof' omitted +(tocbasic) because of missing \bbl@set@language on input line 6127. + +\scr@dte@figure@maxnumwidth=\skip61 +\c@figure=\count189 +Package tocbasic Info: babel extension for `lot' omitted +(tocbasic) because of missing \bbl@set@language on input line 6139. + +\scr@dte@table@maxnumwidth=\skip62 +\c@table=\count190 +Class scrartcl Info: Redefining `\numberline' on input line 6303. +\bibindent=\dimen138 +) +(/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2021-05-07 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count191 +\l__pdf_internal_box=\box52 +) (./a.aux) +\openout1 = `a.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3. +LaTeX Font Info: ... okay on input line 3. +Package scrbase Info: activating english \contentsname on input line 3. +Package scrbase Info: activating english \listfigurename on input line 3. +Package scrbase Info: activating english \listtablename on input line 3. +! Undefined control sequence. +l.4 \lsdkfjlskdfj + +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +(./a.aux) ) +Here is how much of TeX's memory you used: +3199 strings out of 478510 +74549 string characters out of 5853586 +510929 words of memory out of 5000000 +21227 multiletter control sequences out of 15000+600000 +403730 words of font info for 28 fonts, out of 8000000 for 9000 +1141 hyphenation exceptions out of 8191 +108i,1n,108p,10625b,270s stack positions out of 5000i,500n,10000p,200000b,80000s + +No pages of output. +PDF statistics: +0 PDF objects out of 1000 (max. 8388607) +0 named destinations out of 1000 (max. 500000) +1 words of extra memory for PDF output out of 10000 (max. 10000000)
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/block_comments.txt b/support/texlab/src/parser/test_data/latex/block_comments.txt new file mode 100644 index 0000000000..d4e63ab1c8 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/block_comments.txt @@ -0,0 +1,9 @@ +Foo +\iffalse +Test1 +\fi +Bar +\iffalse +\fii +\fi +Baz
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_default.txt b/support/texlab/src/parser/test_data/latex/caption/caption_default.txt new file mode 100644 index 0000000000..9084f143bf --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/caption/caption_default.txt @@ -0,0 +1 @@ +\caption[qux]{Foo \Bar Baz}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt b/support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt new file mode 100644 index 0000000000..62e5962816 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/caption/caption_default_error.txt @@ -0,0 +1 @@ +\caption[qux]{Foo \Bar Baz
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_figure.txt b/support/texlab/src/parser/test_data/latex/caption/caption_figure.txt new file mode 100644 index 0000000000..8a1d3067d8 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/caption/caption_figure.txt @@ -0,0 +1 @@ +\begin{figure}\caption{Foo}\end{figure}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt b/support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt new file mode 100644 index 0000000000..07af0af8ca --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/caption/caption_minimal.txt @@ -0,0 +1 @@ +\caption{Foo \Bar Baz}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt b/support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt new file mode 100644 index 0000000000..747db731c1 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/caption/caption_minimal_error.txt @@ -0,0 +1 @@ +\caption{Foo \Bar Baz
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_empty.txt b/support/texlab/src/parser/test_data/latex/citation/citation_empty.txt new file mode 100644 index 0000000000..06704b89a4 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_empty.txt @@ -0,0 +1 @@ +\cite{}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt b/support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt new file mode 100644 index 0000000000..1f8e4c9310 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_missing_brace.txt @@ -0,0 +1 @@ +\cite{foo
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt b/support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt new file mode 100644 index 0000000000..be5da02c62 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_multiple_keys.txt @@ -0,0 +1 @@ +\cite{foo, bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt b/support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt new file mode 100644 index 0000000000..5ae28c28ec --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_prenote.txt @@ -0,0 +1 @@ +\cite[foo]{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt b/support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt new file mode 100644 index 0000000000..23103b2476 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_prenote_postnote.txt @@ -0,0 +1 @@ +\cite[foo][bar]{baz}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt b/support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt new file mode 100644 index 0000000000..68e3c2d36e --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_redundant_comma.txt @@ -0,0 +1 @@ +\cite{,foo,}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_simple.txt b/support/texlab/src/parser/test_data/latex/citation/citation_simple.txt new file mode 100644 index 0000000000..cd5809ef25 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_simple.txt @@ -0,0 +1 @@ +\cite{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/citation/citation_star.txt b/support/texlab/src/parser/test_data/latex/citation/citation_star.txt new file mode 100644 index 0000000000..d1a2677021 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/citation/citation_star.txt @@ -0,0 +1 @@ +\nocite{*}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt b/support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt new file mode 100644 index 0000000000..e8b58c8162 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_definition_simple.txt @@ -0,0 +1 @@ +\definecolor{foo}{rgb}{255,168,0}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt b/support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt new file mode 100644 index 0000000000..4fea2b24ec --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_reference_simple.txt @@ -0,0 +1 @@ +\color{black}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt new file mode 100644 index 0000000000..f377ffcf2f --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error1.txt @@ -0,0 +1 @@ +\definecolorset[ty]{rgb,HTML}{foo}{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt new file mode 100644 index 0000000000..0b5fa35868 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error2.txt @@ -0,0 +1 @@ +\definecolorset{rgb,HTML}{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt new file mode 100644 index 0000000000..fb695b4530 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error3.txt @@ -0,0 +1 @@ +\definecolorset{rgb,HTML}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt new file mode 100644 index 0000000000..7c494133bf --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_set_definition_error4.txt @@ -0,0 +1 @@ +\definecolorset
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt b/support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt new file mode 100644 index 0000000000..c812e61041 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/color/color_set_definition_simple.txt @@ -0,0 +1 @@ +\definecolorset[ty]{rgb,HTML}{foo}{bar}{baz}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt new file mode 100644 index 0000000000..ef63ef62cb --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_argc.txt @@ -0,0 +1 @@ +\newcommand{\foo}{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt new file mode 100644 index 0000000000..5ffc7e97c2 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl.txt @@ -0,0 +1 @@ +\newcommand{\foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt new file mode 100644 index 0000000000..9323f5a313 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_no_impl_error.txt @@ -0,0 +1 @@ +\newcommand{\foo
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt new file mode 100644 index 0000000000..c3fb7225f3 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_optional.txt @@ -0,0 +1 @@ +\newcommand{\foo}[1][def]{#1}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt new file mode 100644 index 0000000000..ffce86f21c --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_simple.txt @@ -0,0 +1 @@ +\newcommand[1]{\id}{#1}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt new file mode 100644 index 0000000000..e7ce7984cb --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/command_definition_with_begin.txt @@ -0,0 +1 @@ +\newcommand{\CVSubHeadingListStart}{\begin{itemize}[leftmargin=0.5cm, label={}]}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt b/support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt new file mode 100644 index 0000000000..685be22ce6 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/math_operator_no_impl.txt @@ -0,0 +1 @@ +\DeclareMathOperator{\foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt b/support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt new file mode 100644 index 0000000000..ffbf671f74 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/command_definition/math_operator_simple.txt @@ -0,0 +1 @@ +\DeclareMathOperator{\foo}{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt b/support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt new file mode 100644 index 0000000000..76646075ea --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_asymptote.txt @@ -0,0 +1,3 @@ +\begin{asy} + printf("Hello World\n"); +\end{asy}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_definition.txt b/support/texlab/src/parser/test_data/latex/environment/environment_definition.txt new file mode 100644 index 0000000000..d3a5291dca --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_definition.txt @@ -0,0 +1 @@ +\newenvironment{bar}[1]{\begin{foo}}{\end{foo}}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt b/support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt new file mode 100644 index 0000000000..bead3228a4 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_definition_optional_arg.txt @@ -0,0 +1 @@ +\newenvironment{foo}[1][default]{begin}{end}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_nested.txt b/support/texlab/src/parser/test_data/latex/environment/environment_nested.txt new file mode 100644 index 0000000000..8d84019ac7 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_nested.txt @@ -0,0 +1 @@ +\begin{foo} \begin{qux} \end{baz} \end{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt b/support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt new file mode 100644 index 0000000000..35ce901a83 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_nested_missing_braces.txt @@ -0,0 +1 @@ +\begin{foo \begin{qux Hello World \end{baz} \end{bar
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/environment/environment_simple.txt b/support/texlab/src/parser/test_data/latex/environment/environment_simple.txt new file mode 100644 index 0000000000..309b559957 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/environment/environment_simple.txt @@ -0,0 +1 @@ +\begin{foo} Hello World \end{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/equation.txt b/support/texlab/src/parser/test_data/latex/equation.txt new file mode 100644 index 0000000000..7f85196961 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/equation.txt @@ -0,0 +1 @@ +\[ foo bar \]
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/equation_missing_begin.txt b/support/texlab/src/parser/test_data/latex/equation_missing_begin.txt new file mode 100644 index 0000000000..9e5707b196 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/equation_missing_begin.txt @@ -0,0 +1 @@ +\begin{a} foo bar \] \end{b}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/generic_command_args.txt b/support/texlab/src/parser/test_data/latex/generic_command_args.txt new file mode 100644 index 0000000000..2d62314c5c --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/generic_command_args.txt @@ -0,0 +1 @@ +\foo{bar}[qux]
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/generic_command_empty.txt b/support/texlab/src/parser/test_data/latex/generic_command_empty.txt new file mode 100644 index 0000000000..eeb4a48255 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/generic_command_empty.txt @@ -0,0 +1 @@ +\foo
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/generic_command_escape.txt b/support/texlab/src/parser/test_data/latex/generic_command_escape.txt new file mode 100644 index 0000000000..133d674d1e --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/generic_command_escape.txt @@ -0,0 +1 @@ +\#
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt new file mode 100644 index 0000000000..abf12b6cae --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_declaration.txt @@ -0,0 +1 @@ +\DeclareAcronym{eg}{short = e.g,long = for example,tag = abbrev}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt new file mode 100644 index 0000000000..47a69067ca --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_options.txt @@ -0,0 +1 @@ +\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt new file mode 100644 index 0000000000..4fbf285927 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_definition_simple.txt @@ -0,0 +1 @@ +\newacronym{fpsLabel}{FPS}{Frame per Second}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt new file mode 100644 index 0000000000..86e60c4584 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_package.txt @@ -0,0 +1 @@ +\acro{fps}[FPS]{Frames per Second} diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt new file mode 100644 index 0000000000..43fd03f12b --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_options.txt @@ -0,0 +1 @@ +\acrshort[foo=bar,baz]{fpsLabel}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt b/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt new file mode 100644 index 0000000000..d9fb5b9a25 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/acronym_reference_simple.txt @@ -0,0 +1 @@ +\acrshort{fpsLabel}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt new file mode 100644 index 0000000000..fb1e12899a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_definition_simple.txt @@ -0,0 +1 @@ +\newglossaryentry{foo}{bar = baz, qux,}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt new file mode 100644 index 0000000000..fbae075e1d --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_options.txt @@ -0,0 +1 @@ +\gls[foo = bar, qux]{baz}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt new file mode 100644 index 0000000000..a603355f0f --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/glossary/glossary_entry_reference_simple.txt @@ -0,0 +1 @@ +\gls{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/graphics_path.txt b/support/texlab/src/parser/test_data/latex/graphics_path.txt new file mode 100644 index 0000000000..0e9f431c36 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/graphics_path.txt @@ -0,0 +1 @@ +\graphicspath{{../figures/}}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/graphics_path_command.txt b/support/texlab/src/parser/test_data/latex/graphics_path_command.txt new file mode 100644 index 0000000000..729ee51690 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/graphics_path_command.txt @@ -0,0 +1 @@ +\graphicspath{{\subfix{./img/}}}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/graphics_path_options.txt b/support/texlab/src/parser/test_data/latex/graphics_path_options.txt new file mode 100644 index 0000000000..ae8aa84d86 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/graphics_path_options.txt @@ -0,0 +1 @@ +\graphicspath[foo]{{../figures/}}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt b/support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt new file mode 100644 index 0000000000..6c7b76c0f8 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/curly_group_missing_end.txt @@ -0,0 +1 @@ +{hello world
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt b/support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt new file mode 100644 index 0000000000..5084aae70a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/curly_group_simple.txt @@ -0,0 +1 @@ +{hello world}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt b/support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt new file mode 100644 index 0000000000..fcb715926a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/equation_missing_end.txt @@ -0,0 +1 @@ +\begin{a} \[ foo bar \end{b}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt b/support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt new file mode 100644 index 0000000000..144a5fdd6d --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/escaped_brackets.txt @@ -0,0 +1 @@ +{[}{]}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt b/support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt new file mode 100644 index 0000000000..8f606b7dbe --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/unmatched_braces.txt @@ -0,0 +1 @@ +}{
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt b/support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt new file mode 100644 index 0000000000..94ea4d5c96 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/unmatched_brackets.txt @@ -0,0 +1 @@ +][
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt b/support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt new file mode 100644 index 0000000000..ebf6229429 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/group/unmatched_brackets_with_group.txt @@ -0,0 +1 @@ +{][}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/hello_world.txt b/support/texlab/src/parser/test_data/latex/hello_world.txt new file mode 100644 index 0000000000..c57eff55eb --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/hello_world.txt @@ -0,0 +1 @@ +Hello World!
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt b/support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt new file mode 100644 index 0000000000..216e7ea165 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/biblatex_include_options.txt @@ -0,0 +1 @@ +\addbibresource[foo=bar, baz]{foo/bar.bib}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt new file mode 100644 index 0000000000..fe10ce257d --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/biblatex_include_simple.txt @@ -0,0 +1 @@ +\addbibresource{foo/bar.bib}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt new file mode 100644 index 0000000000..955353f690 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/bibtex_include_simple.txt @@ -0,0 +1 @@ +\bibliography{foo/bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_empty.txt b/support/texlab/src/parser/test_data/latex/include/class_include_empty.txt new file mode 100644 index 0000000000..144b418175 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/class_include_empty.txt @@ -0,0 +1 @@ +\documentclass{}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_options.txt b/support/texlab/src/parser/test_data/latex/include/class_include_options.txt new file mode 100644 index 0000000000..32dc4279d7 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/class_include_options.txt @@ -0,0 +1 @@ +\documentclass[foo = bar, baz, qux]{article}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/class_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/class_include_simple.txt new file mode 100644 index 0000000000..15f3d6ea0a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/class_include_simple.txt @@ -0,0 +1 @@ +\documentclass{article}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt b/support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt new file mode 100644 index 0000000000..14a4a96216 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/graphics_include_command.txt @@ -0,0 +1 @@ +\includegraphics[width=0.5\textwidth]{\foo.\bar.pdf}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt b/support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt new file mode 100644 index 0000000000..d6b6910c14 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/graphics_include_complicated_options.txt @@ -0,0 +1 @@ +\includegraphics[width=0.5\textwidth]{}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt b/support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt new file mode 100644 index 0000000000..8d3c45f2a5 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/graphics_include_options.txt @@ -0,0 +1 @@ +\includegraphics[scale=.5]{foo/bar.pdf}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt new file mode 100644 index 0000000000..629cf3e8a9 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/graphics_include_simple.txt @@ -0,0 +1 @@ +\includegraphics{foo/bar.pdf}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/import_incomplete.txt b/support/texlab/src/parser/test_data/latex/include/import_incomplete.txt new file mode 100644 index 0000000000..3d6bc5f043 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/import_incomplete.txt @@ -0,0 +1 @@ +\import{foo
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/import_simple.txt b/support/texlab/src/parser/test_data/latex/include/import_simple.txt new file mode 100644 index 0000000000..f38059d6c1 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/import_simple.txt @@ -0,0 +1 @@ +\import{foo}{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt b/support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt new file mode 100644 index 0000000000..e6dd431c7c --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/inkscape_include_options.txt @@ -0,0 +1 @@ +\includesvg[scale=.5]{foo/bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt new file mode 100644 index 0000000000..4e3a4ea9ba --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/inkscape_include_simple.txt @@ -0,0 +1 @@ +\includesvg{foo/bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt b/support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt new file mode 100644 index 0000000000..5a763b4e29 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/latex_include_equality_sign.txt @@ -0,0 +1 @@ +\include{foo=bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt new file mode 100644 index 0000000000..c0d3d390df --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/latex_include_simple.txt @@ -0,0 +1 @@ +\include{foo/bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt b/support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt new file mode 100644 index 0000000000..6585f50d52 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/latex_input_path_brackets.txt @@ -0,0 +1 @@ +\input{foo[bar].tex}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_empty.txt b/support/texlab/src/parser/test_data/latex/include/package_include_empty.txt new file mode 100644 index 0000000000..09e02cc1cc --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/package_include_empty.txt @@ -0,0 +1 @@ +\usepackage{}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt b/support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt new file mode 100644 index 0000000000..c1080aaf66 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/package_include_multiple.txt @@ -0,0 +1 @@ +\usepackage{amsmath, lipsum}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_options.txt b/support/texlab/src/parser/test_data/latex/include/package_include_options.txt new file mode 100644 index 0000000000..83a50c12cf --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/package_include_options.txt @@ -0,0 +1 @@ +\usepackage[foo = bar, baz, qux]{amsmath}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/package_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/package_include_simple.txt new file mode 100644 index 0000000000..3cf1b4edc0 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/package_include_simple.txt @@ -0,0 +1 @@ +\usepackage{amsmath}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt b/support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt new file mode 100644 index 0000000000..25a2b24720 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/pgf_library_import_simple.txt @@ -0,0 +1 @@ +\usepgflibrary{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/svg_include_options.txt b/support/texlab/src/parser/test_data/latex/include/svg_include_options.txt new file mode 100644 index 0000000000..3eb90568ab --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/svg_include_options.txt @@ -0,0 +1 @@ +\includesvg[scale=.5]{foo/bar.svg}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt new file mode 100644 index 0000000000..964a3adcd6 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/svg_include_simple.txt @@ -0,0 +1 @@ +\includesvg{foo/bar.svg}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt b/support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt new file mode 100644 index 0000000000..ff616ebd11 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/tikz_library_import_simple.txt @@ -0,0 +1 @@ +\usetikzlibrary{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt b/support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt new file mode 100644 index 0000000000..a0b3fec843 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/include/verbatim_include_simple.txt @@ -0,0 +1 @@ +\verbatiminput{foo/bar.txt}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/inline.txt b/support/texlab/src/parser/test_data/latex/inline.txt new file mode 100644 index 0000000000..81a429dc26 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/inline.txt @@ -0,0 +1 @@ +$x \in [0, \infty)$
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/inline_double_dollar.txt b/support/texlab/src/parser/test_data/latex/inline_double_dollar.txt new file mode 100644 index 0000000000..c3a7fee9f6 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/inline_double_dollar.txt @@ -0,0 +1 @@ +$$x \in [0, \infty)$$
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/issue_745.txt b/support/texlab/src/parser/test_data/latex/issue_745.txt new file mode 100644 index 0000000000..4cbebeb2d8 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/issue_745.txt @@ -0,0 +1,21 @@ +\documentclass{article} +\usepackage{tabularray} + +\ExplSyntaxOn +\NewDocumentEnvironment{exptblr}{O{}m} + { + \use:x + { + \exp_not:N \begin{tblr} + [\exp_not:n{#1}] + {#2} + } + } + { + \end{tblr} + } +\ExplSyntaxOff + +\begin{document} + +\end{document}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/issue_789.txt b/support/texlab/src/parser/test_data/latex/issue_789.txt new file mode 100644 index 0000000000..612c6de786 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/issue_789.txt @@ -0,0 +1 @@ +\graphicspath{test}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt b/support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt new file mode 100644 index 0000000000..d567c6d25a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_definition_line_break.txt @@ -0,0 +1,2 @@ +\label{hello +world}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt b/support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt new file mode 100644 index 0000000000..43ebaf1cec --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_definition_simple.txt @@ -0,0 +1 @@ +\label{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_number.txt b/support/texlab/src/parser/test_data/latex/label/label_number.txt new file mode 100644 index 0000000000..6e994af500 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_number.txt @@ -0,0 +1 @@ +\newlabel{foo}{{1.1}}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt new file mode 100644 index 0000000000..ab386645df --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_equation.txt @@ -0,0 +1 @@ +\eqref{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt new file mode 100644 index 0000000000..1d0f79ec8e --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_incomplete.txt @@ -0,0 +1 @@ +Equation \eqref{eq is a \emph{useful} identity.
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt new file mode 100644 index 0000000000..e8bb38ee9e --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_multiple.txt @@ -0,0 +1 @@ +\ref{foo, bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt new file mode 100644 index 0000000000..9213da0460 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_range_error.txt @@ -0,0 +1 @@ +\crefrange{foo{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt new file mode 100644 index 0000000000..841133d73a --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_range_incomplete.txt @@ -0,0 +1 @@ +\crefrange{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt new file mode 100644 index 0000000000..a0e985ea88 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_range_simple.txt @@ -0,0 +1 @@ +\crefrange{foo}{bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt b/support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt new file mode 100644 index 0000000000..dde4f444f4 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/label/label_reference_simple.txt @@ -0,0 +1 @@ +\ref{foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/parameter.txt b/support/texlab/src/parser/test_data/latex/parameter.txt new file mode 100644 index 0000000000..d44ac7b947 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/parameter.txt @@ -0,0 +1 @@ +#1
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/parameter_error.txt b/support/texlab/src/parser/test_data/latex/parameter_error.txt new file mode 100644 index 0000000000..4287ca8617 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/parameter_error.txt @@ -0,0 +1 @@ +#
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt b/support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt new file mode 100644 index 0000000000..3288ec259b --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/structure/structure_enum_item.txt @@ -0,0 +1 @@ +\begin{enumerate} \item 1 \item[2] 2 \item 3 \end{enumerate}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt b/support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt new file mode 100644 index 0000000000..7203dd2d24 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/structure/structure_invalid_nesting.txt @@ -0,0 +1 @@ +\section{Foo} \chapter{Bar}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_nested.txt b/support/texlab/src/parser/test_data/latex/structure/structure_nested.txt new file mode 100644 index 0000000000..082f10765b --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/structure/structure_nested.txt @@ -0,0 +1 @@ +\part{1}\chapter{2}\section{3}\subsection{4}\subsubsection{5}\paragraph{6}\subparagraph{7}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt b/support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt new file mode 100644 index 0000000000..d8e347c429 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/structure/structure_siblings.txt @@ -0,0 +1 @@ +\section{Foo} Foo \section{Bar} Bar
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt new file mode 100644 index 0000000000..286d111ad1 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_full.txt @@ -0,0 +1 @@ +\newtheorem{foo}[bar]{Foo}[baz]
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt new file mode 100644 index 0000000000..af1b6903a5 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt @@ -0,0 +1 @@ +\newtheorem{foo}[bar]
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt new file mode 100644 index 0000000000..e5d6551666 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt @@ -0,0 +1 @@ +\newtheorem{foo}{Foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt new file mode 100644 index 0000000000..89c37d9497 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt @@ -0,0 +1 @@ +\newtheorem{foo}[bar]{Foo}
\ No newline at end of file diff --git a/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt new file mode 100644 index 0000000000..62adb2c4b9 --- /dev/null +++ b/support/texlab/src/parser/test_data/latex/theorem_definition/theorem_definition_only_name.txt @@ -0,0 +1 @@ +\newtheorem{foo}
\ No newline at end of file diff --git a/support/texlab/src/range.rs b/support/texlab/src/range.rs deleted file mode 100644 index c70a573f39..0000000000 --- a/support/texlab/src/range.rs +++ /dev/null @@ -1,20 +0,0 @@ -use lsp_types::{Position, Range}; - -pub trait RangeExt { - fn new_simple(start_line: u32, start_character: u32, end_line: u32, end_character: u32) - -> Self; -} - -impl RangeExt for Range { - fn new_simple( - start_line: u32, - start_character: u32, - end_line: u32, - end_character: u32, - ) -> Self { - Self { - start: Position::new(start_line, start_character), - end: Position::new(end_line, end_character), - } - } -} diff --git a/support/texlab/src/req_queue.rs b/support/texlab/src/req_queue.rs deleted file mode 100644 index c1eb7b9594..0000000000 --- a/support/texlab/src/req_queue.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crossbeam_channel::Sender; -use lsp_server::ResponseError; - -pub struct IncomingData; - -pub struct OutgoingData { - pub(crate) sender: Sender<Result<serde_json::Value, ResponseError>>, -} - -pub type ReqQueue = lsp_server::ReqQueue<IncomingData, OutgoingData>; diff --git a/support/texlab/src/server.rs b/support/texlab/src/server.rs index 0d5d1f8fe1..93b35c69c6 100644 --- a/support/texlab/src/server.rs +++ b/support/texlab/src/server.rs @@ -1,83 +1,89 @@ +mod dispatch; +mod query; + use std::{ path::PathBuf, sync::{Arc, Mutex}, - time::Duration, }; use anyhow::Result; use crossbeam_channel::{Receiver, Sender}; -use log::{error, info, warn}; -use lsp_server::{Connection, Message, RequestId}; +use log::{error, info}; +use lsp_server::{Connection, ErrorCode, Message, RequestId}; use lsp_types::{notification::*, request::*, *}; -use serde::Serialize; +use once_cell::sync::Lazy; +use rowan::{ast::AstNode, TextSize}; +use rustc_hash::FxHashSet; +use serde::{Deserialize, Serialize}; +use serde_repr::{Deserialize_repr, Serialize_repr}; use threadpool::ThreadPool; use crate::{ - client::{send_notification, send_request}, - debouncer, - diagnostics::DiagnosticManager, - dispatch::{NotificationDispatcher, RequestDispatcher}, - distro::Distribution, + citation, + client::LspClient, + db::{self, discover_dependencies, Document, Language, Owner, Workspace}, + distro::Distro, features::{ - execute_command, find_all_references, find_document_highlights, find_document_links, - find_document_symbols, find_foldings, find_hover, find_workspace_symbols, - format_source_code, goto_definition, prepare_rename_all, rename_all, BuildEngine, - BuildParams, BuildResult, BuildStatus, FeatureRequest, ForwardSearchResult, - ForwardSearchStatus, + build::{self, BuildParams, BuildResult, BuildStatus}, + completion::{self, builder::CompletionItemData}, + definition, folding, formatting, forward_search, highlight, hover, inlay_hint, link, + reference, rename, symbol, workspace_command, + }, + normalize_uri, + syntax::bibtex, + util::{ + self, capabilities::ClientCapabilitiesExt, components::COMPONENT_DATABASE, + line_index_ext::LineIndexExt, }, - req_queue::{IncomingData, ReqQueue}, - ClientCapabilitiesExt, Document, DocumentData, DocumentLanguage, Environment, LineIndex, - LineIndexExt, Options, Workspace, WorkspaceEvent, + Db, Options, StartupOptions, }; #[derive(Debug)] enum InternalMessage { - SetDistro(Distribution), - SetOptions(Arc<Options>), + SetDistro(Distro), + SetOptions(Options), + FileEvent(notify::Event), + ForwardSearch(Url), + Diagnostics, + ChktexResult(Url, Vec<db::diagnostics::Diagnostic>), } -#[derive(Clone)] pub struct Server { connection: Arc<Connection>, internal_tx: Sender<InternalMessage>, internal_rx: Receiver<InternalMessage>, - req_queue: Arc<Mutex<ReqQueue>>, - workspace: Workspace, - diagnostic_tx: debouncer::Sender<Workspace>, - diagnostic_manager: DiagnosticManager, - pool: Arc<Mutex<ThreadPool>>, - load_resolver: bool, - build_engine: Arc<BuildEngine>, + client: LspClient, + engine: query::Engine, + watcher: FileWatcher, + pool: ThreadPool, } impl Server { - pub fn with_connection( - connection: Connection, - current_dir: PathBuf, - load_resolver: bool, - ) -> Self { - let req_queue = Arc::default(); - let workspace = Workspace::new(Environment::new(Arc::new(current_dir))); + pub fn new(connection: Connection) -> Self { + let client = LspClient::new(connection.sender.clone()); let (internal_tx, internal_rx) = crossbeam_channel::unbounded(); - let diagnostic_manager = DiagnosticManager::default(); - let diagnostic_tx = create_debouncer(connection.sender.clone(), diagnostic_manager.clone()); + let watcher = FileWatcher::new(internal_tx.clone()).expect("init file watcher"); Self { connection: Arc::new(connection), internal_tx, internal_rx, - req_queue, - workspace, - diagnostic_tx, - diagnostic_manager, - pool: Arc::new(Mutex::new(threadpool::Builder::new().build())), - load_resolver, - build_engine: Arc::default(), + client, + engine: query::Engine::default(), + watcher, + pool: threadpool::Builder::new().build(), } } - fn spawn(&self, job: impl FnOnce(Self) + Send + 'static) { - let server = self.clone(); - self.pool.lock().unwrap().execute(move || job(server)); + fn run_with_db<R, Q>(&self, id: RequestId, query: Q) + where + R: Serialize, + Q: FnOnce(&dyn Db) -> R + Send + 'static, + { + let client = self.client.clone(); + self.engine.fork(move |db| { + let response = lsp_server::Response::new_ok(id, query(db)); + client.send_response(response).unwrap(); + }); } fn capabilities(&self) -> ServerCapabilities { @@ -101,7 +107,6 @@ impl Server { definition_provider: Some(OneOf::Left(true)), references_provider: Some(OneOf::Left(true)), hover_provider: Some(HoverProviderCapability::Simple(true)), - #[cfg(feature = "completion")] completion_provider: Some(CompletionOptions { resolve_provider: Some(true), trigger_characters: Some(vec![ @@ -129,6 +134,7 @@ impl Server { ], ..Default::default() }), + inlay_hint_provider: Some(OneOf::Left(true)), ..ServerCapabilities::default() } } @@ -137,8 +143,29 @@ impl Server { let (id, params) = self.connection.initialize_start()?; let params: InitializeParams = serde_json::from_value(params)?; - self.workspace.environment.client_capabilities = Arc::new(params.capabilities); - self.workspace.environment.client_info = params.client_info.map(Arc::new); + let db = self.engine.write(); + let workspace = Workspace::get(db); + workspace + .set_client_capabilities(db) + .with_durability(salsa::Durability::HIGH) + .to(params.capabilities); + + workspace + .set_client_info(db) + .with_durability(salsa::Durability::HIGH) + .to(params.client_info); + + let root_dirs = params + .workspace_folders + .unwrap_or_default() + .into_iter() + .map(|folder| db::Location::new(db, folder.uri)) + .collect(); + + workspace + .set_root_dirs(db) + .with_durability(salsa::Durability::HIGH) + .to(root_dirs); let result = InitializeResult { capabilities: self.capabilities(), @@ -146,132 +173,109 @@ impl Server { name: "TexLab".to_owned(), version: Some(env!("CARGO_PKG_VERSION").to_owned()), }), + offset_encoding: None, }; self.connection .initialize_finish(id, serde_json::to_value(result)?)?; - if self.load_resolver { - self.spawn(move |server| { - let distro = Distribution::detect(); - info!("Detected distribution: {}", distro.kind); + let StartupOptions { skip_distro } = + serde_json::from_value(params.initialization_options.unwrap_or_default()) + .unwrap_or_default(); - server - .internal_tx - .send(InternalMessage::SetDistro(distro)) - .unwrap(); + if !skip_distro { + let sender = self.internal_tx.clone(); + self.pool.execute(move || { + let distro = Distro::detect().unwrap_or_else(|why| { + log::warn!("Unable to load distro files: {}", why); + Distro::default() + }); + + info!("Detected distribution: {:?}", distro.kind); + sender.send(InternalMessage::SetDistro(distro)).unwrap(); }); } - self.register_diagnostics_handler(); - - self.spawn(move |server| { - server.register_config_capability(); - server.register_file_watching(); - let _ = server.pull_config(); - }); - + self.register_configuration(); + self.pull_options(); Ok(()) } - fn register_file_watching(&self) { - if self - .workspace - .environment - .client_capabilities - .has_file_watching_support() - { - let options = DidChangeWatchedFilesRegistrationOptions { - watchers: vec![FileSystemWatcher { - glob_pattern: "**/*.{aux,log}".into(), - kind: Some(WatchKind::Create | WatchKind::Change | WatchKind::Delete), - }], - }; - - let reg = Registration { - id: "build-watch".to_string(), - method: DidChangeWatchedFiles::METHOD.to_string(), - register_options: Some(serde_json::to_value(options).unwrap()), - }; - - let params = RegistrationParams { - registrations: vec![reg], - }; - - if let Err(why) = - send_request::<RegisterCapability>(&self.req_queue, &self.connection.sender, params) - { - error!( - "Failed to register \"{}\" notification: {}", - DidChangeWatchedFiles::METHOD, - why - ); - } - } - } + fn register_configuration(&mut self) { + let db = self.engine.read(); - fn register_config_capability(&self) { - if self - .workspace - .environment - .client_capabilities + if Workspace::get(db) + .client_capabilities(db) .has_push_configuration_support() { - let reg = Registration { + let registration = Registration { id: "pull-config".to_string(), method: DidChangeConfiguration::METHOD.to_string(), register_options: None, }; let params = RegistrationParams { - registrations: vec![reg], + registrations: vec![registration], }; - if let Err(why) = - send_request::<RegisterCapability>(&self.req_queue, &self.connection.sender, params) - { - error!( - "Failed to register \"{}\" notification: {}", - DidChangeConfiguration::METHOD, - why - ); - } + let client = self.client.clone(); + self.pool.execute(move || { + if let Err(why) = client.send_request::<RegisterCapability>(params) { + log::error!( + "Failed to register \"{}\" notification: {}", + DidChangeConfiguration::METHOD, + why + ); + } + }); } } - fn register_diagnostics_handler(&mut self) { - let (event_sender, event_receiver) = crossbeam_channel::unbounded(); - let diagnostic_tx = self.diagnostic_tx.clone(); - let diagnostic_manager = self.diagnostic_manager.clone(); - std::thread::spawn(move || { - for event in event_receiver { - match event { - WorkspaceEvent::Changed(workspace, document) => { - diagnostic_manager.push_syntax(&workspace, &document.uri); - let delay = workspace.environment.options.diagnostics_delay; - diagnostic_tx - .send(workspace, Duration::from_millis(delay)) - .unwrap(); - } - }; - } - }); + fn update_workspace(&mut self) { + let db = self.engine.write(); + discover_dependencies(db); + self.watcher.watch(db); + self.publish_diagnostics_with_delay(); + } + + fn publish_diagnostics(&mut self) -> Result<()> { + let db = self.engine.read(); + + let all_diagnostics = db::diagnostics::collect_filtered(db, Workspace::get(db)); + + for (document, diagnostics) in all_diagnostics { + let uri = document.location(db).uri(db).clone(); + let version = None; + let params = PublishDiagnosticsParams { + uri, + diagnostics, + version, + }; + + self.client + .send_notification::<PublishDiagnostics>(params)?; + } - self.workspace.listeners.push(event_sender); + Ok(()) } - fn register_incoming_request(&self, id: RequestId) { - let mut req_queue = self.req_queue.lock().unwrap(); - req_queue.incoming.register(id, IncomingData); + fn publish_diagnostics_with_delay(&mut self) { + let db = self.engine.read(); + let sender = self.internal_tx.clone(); + let delay = Workspace::get(db).options(db).diagnostics_delay.0; + self.pool.execute(move || { + std::thread::sleep(delay); + sender.send(InternalMessage::Diagnostics).unwrap(); + }); } - fn pull_config(&self) -> Result<()> { - if !self - .workspace - .environment - .client_capabilities + fn pull_options(&mut self) { + let db = self.engine.read(); + let workspace = Workspace::get(db); + if !workspace + .client_capabilities(db) .has_pull_configuration_support() { - return Ok(()); + return; } let params = ConfigurationParams { @@ -281,108 +285,81 @@ impl Server { }], }; - match send_request::<WorkspaceConfiguration>( - &self.req_queue, - &self.connection.sender, - params, - ) { - Ok(mut json) => { - let value = json.pop().expect("invalid configuration request"); - let options = self.parse_options(value)?; - self.internal_tx - .send(InternalMessage::SetOptions(Arc::new(options))) - .unwrap(); - } - Err(why) => { - error!("Retrieving configuration failed: {}", why); - } - }; + let client = self.client.clone(); + let sender = self.internal_tx.clone(); + self.pool.execute(move || { + match client.send_request::<WorkspaceConfiguration>(params) { + Ok(mut json) => { + let options = client + .parse_options(json.pop().expect("invalid configuration request")) + .unwrap(); - Ok(()) + sender.send(InternalMessage::SetOptions(options)).unwrap(); + } + Err(why) => { + error!("Retrieving configuration failed: {}", why); + } + }; + }); } - fn parse_options(&self, value: serde_json::Value) -> Result<Options> { - let options = match serde_json::from_value(value) { - Ok(new_options) => new_options, - Err(why) => { - send_notification::<ShowMessage>( - &self.connection.sender, - ShowMessageParams { - message: format!( - "The texlab configuration is invalid; using the default settings instead.\nDetails: {why}" - ), - typ: MessageType::WARNING, - }, - )?; - - Options::default() - } - }; + fn update_options(&mut self, options: Options) { + let db = self.engine.write(); + let workspace = Workspace::get(db); + workspace + .set_options(db) + .with_durability(salsa::Durability::MEDIUM) + .to(options); - Ok(options) + self.watcher.watch(db); } - fn cancel(&self, params: CancelParams) -> Result<()> { - let id = match params.id { - NumberOrString::Number(id) => RequestId::from(id), - NumberOrString::String(id) => RequestId::from(id), - }; - - let mut req_queue = self.req_queue.lock().unwrap(); - req_queue.incoming.complete(id); - + fn cancel(&self, _params: CancelParams) -> Result<()> { Ok(()) } - fn did_change_watched_files(&mut self, params: DidChangeWatchedFilesParams) -> Result<()> { - for change in params.changes { - if let Ok(path) = change.uri.to_file_path() { - match change.typ { - FileChangeType::CREATED | FileChangeType::CHANGED => { - self.workspace.reload(path)?; - } - FileChangeType::DELETED => { - self.workspace.documents_by_uri.remove(&change.uri); - } - _ => {} - } - } - } - + fn did_change_watched_files(&mut self, _params: DidChangeWatchedFilesParams) -> Result<()> { Ok(()) } fn did_change_configuration(&mut self, params: DidChangeConfigurationParams) -> Result<()> { - if self - .workspace - .environment - .client_capabilities + let db = self.engine.read(); + let workspace = Workspace::get(db); + if workspace + .client_capabilities(db) .has_pull_configuration_support() { - self.spawn(move |server| { - let _ = server.pull_config(); - }); + self.pull_options(); } else { - let options = self.parse_options(params.settings)?; - self.workspace.environment.options = Arc::new(options); - self.reparse_all()?; + let options = self.client.parse_options(params.settings)?; + self.update_options(options); } Ok(()) } - fn did_open(&mut self, params: DidOpenTextDocumentParams) -> Result<()> { + fn did_open(&mut self, mut params: DidOpenTextDocumentParams) -> Result<()> { + normalize_uri(&mut params.text_document.uri); + + let db = self.engine.write(); + let workspace = Workspace::get(db); let language_id = ¶ms.text_document.language_id; - let language = DocumentLanguage::by_language_id(language_id); - let document = self.workspace.open( - Arc::new(params.text_document.uri), - Arc::new(params.text_document.text), - language.unwrap_or(DocumentLanguage::Latex), - )?; + let language = Language::from_id(language_id).unwrap_or(Language::Tex); + let document = workspace.open( + db, + params.text_document.uri, + params.text_document.text, + language, + Owner::Client, + ); - self.workspace.viewport.insert(Arc::clone(&document.uri)); + self.update_workspace(); - if self.workspace.environment.options.chktex.on_open_and_save { + if workspace + .options(self.engine.read()) + .chktex + .on_open_and_save + { self.run_chktex(document); } @@ -390,315 +367,299 @@ impl Server { } fn did_change(&mut self, params: DidChangeTextDocumentParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri); - match self.workspace.documents_by_uri.get(&uri).cloned() { - Some(old_document) => { - let mut text = old_document.text.to_string(); - apply_document_edit(&mut text, params.content_changes); - let language = old_document.data.language(); - let new_document = - self.workspace - .open(Arc::clone(&uri), Arc::new(text), language)?; - self.workspace - .viewport - .insert(Arc::clone(&new_document.uri)); - - self.build_engine.positions_by_uri.insert( - Arc::clone(&uri), - Position::new( - old_document - .text - .lines() - .zip(new_document.text.lines()) - .position(|(a, b)| a != b) - .unwrap_or_default() as u32, - 0, - ), - ); - - if self.workspace.environment.options.chktex.on_edit { - self.run_chktex(new_document); - }; - } - None => match uri.to_file_path() { - Ok(path) => { - self.workspace.load(path)?; - } - Err(_) => return Ok(()), - }, + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let db = self.engine.write(); + let workspace = Workspace::get(db); + let document = match workspace.lookup_uri(db, &uri) { + Some(document) => document, + None => return Ok(()), }; + for change in params.content_changes { + match change.range { + Some(range) => { + let range = document.contents(db).line_index(db).offset_lsp_range(range); + document.edit(db, range, &change.text); + } + None => { + document + .contents(db) + .set_text(db) + .with_durability(salsa::Durability::LOW) + .to(change.text); + + document + .set_cursor(db) + .with_durability(salsa::Durability::LOW) + .to(TextSize::from(0)); + } + }; + } + + self.update_workspace(); + + if workspace.options(self.engine.read()).chktex.on_edit { + self.run_chktex(document); + } + Ok(()) } fn did_save(&mut self, params: DidSaveTextDocumentParams) -> Result<()> { - let uri = params.text_document.uri; - - if let Some(request) = self - .workspace - .documents_by_uri - .get(&uri) - .filter(|_| self.workspace.environment.options.build.on_save) - .map(|document| { - self.feature_request( - Arc::clone(&document.uri), - BuildParams { - text_document: TextDocumentIdentifier::new(uri.clone()), - }, - ) - }) - { - self.spawn(move |server| { - server - .build_engine - .build(request, &server.req_queue, &server.connection.sender) - .unwrap_or_else(|why| { - error!("Build failed: {}", why); - BuildResult { - status: BuildStatus::FAILURE, - } - }); - }); + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let db = self.engine.read(); + let workspace = Workspace::get(db); + if workspace.options(db).build.on_save { + self.build_internal(uri.clone(), |_| ())?; } - if let Some(document) = self - .workspace - .documents_by_uri - .get(&uri) - .filter(|_| self.workspace.environment.options.chktex.on_open_and_save) - .cloned() - { - self.run_chktex(document); + self.publish_diagnostics_with_delay(); + + let db = self.engine.read(); + if let Some(document) = workspace.lookup_uri(db, &uri) { + if workspace.options(db).chktex.on_open_and_save { + self.run_chktex(document); + } } Ok(()) } fn did_close(&mut self, params: DidCloseTextDocumentParams) -> Result<()> { - self.workspace.close(¶ms.text_document.uri); + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let db = self.engine.write(); + if let Some(document) = Workspace::get(db).lookup_uri(db, &uri) { + document + .set_owner(db) + .with_durability(salsa::Durability::LOW) + .to(Owner::Server); + } + + self.publish_diagnostics_with_delay(); Ok(()) } fn run_chktex(&mut self, document: Document) { - self.spawn(move |server| { - server - .diagnostic_manager - .push_chktex(&server.workspace, &document.uri); - - let delay = server.workspace.environment.options.diagnostics_delay; - server - .diagnostic_tx - .send(server.workspace.clone(), Duration::from_millis(delay)) - .unwrap(); - }); - } - - fn feature_request<P>(&self, uri: Arc<Url>, params: P) -> FeatureRequest<P> { - FeatureRequest { - params, - workspace: self.workspace.slice(&uri), - uri, - } - } - - fn handle_feature_request<P, R, H>( - &self, - id: RequestId, - params: P, - uri: Arc<Url>, - handler: H, - ) -> Result<()> - where - P: Send + 'static, - R: Serialize, - H: FnOnce(FeatureRequest<P>) -> R + Send + 'static, - { - self.spawn(move |server| { - let request = server.feature_request(uri, params); - if request.workspace.documents_by_uri.is_empty() { - let code = lsp_server::ErrorCode::InvalidRequest as i32; - let message = "unknown document".to_string(); - let response = lsp_server::Response::new_err(id, code, message); - server.connection.sender.send(response.into()).unwrap(); - } else { - let result = handler(request); - server - .connection - .sender - .send(lsp_server::Response::new_ok(id, result).into()) + let db = self.engine.read(); + if let Some(command) = util::chktex::Command::new(db, document) { + let sender = self.internal_tx.clone(); + let uri = document.location(db).uri(db).clone(); + self.pool.execute(move || { + let diagnostics = command.run().unwrap_or_default(); + sender + .send(InternalMessage::ChktexResult(uri, diagnostics)) .unwrap(); - } - }); - - Ok(()) + }); + } } fn document_link(&self, id: RequestId, params: DocumentLinkParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, find_document_links)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| link::find_all(db, &uri).unwrap_or_default()); Ok(()) } fn document_symbols(&self, id: RequestId, params: DocumentSymbolParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, find_document_symbols)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| symbol::find_document_symbols(db, &uri)); Ok(()) } fn workspace_symbols(&self, id: RequestId, params: WorkspaceSymbolParams) -> Result<()> { - self.spawn(move |server| { - let result = find_workspace_symbols(&server.workspace, ¶ms); - server - .connection - .sender - .send(lsp_server::Response::new_ok(id, result).into()) - .unwrap(); - }); + self.run_with_db(id, move |db| symbol::find_workspace_symbols(db, ¶ms)); Ok(()) } - #[cfg(feature = "completion")] - fn completion(&self, id: RequestId, params: CompletionParams) -> Result<()> { - let uri = Arc::new(params.text_document_position.text_document.uri.clone()); - - self.build_engine - .positions_by_uri - .insert(Arc::clone(&uri), params.text_document_position.position); - - self.handle_feature_request(id, params, uri, crate::features::complete)?; + fn completion(&mut self, id: RequestId, params: CompletionParams) -> Result<()> { + let mut uri = params.text_document_position.text_document.uri; + normalize_uri(&mut uri); + let position = params.text_document_position.position; + self.run_with_db(id, move |db| completion::complete(db, &uri, position)); Ok(()) } - #[cfg(feature = "completion")] fn completion_resolve(&self, id: RequestId, mut item: CompletionItem) -> Result<()> { - use rowan::ast::AstNode; - - use crate::{ - citation, component_db::COMPONENT_DATABASE, features::CompletionItemData, - syntax::bibtex, - }; - - self.spawn(move |server| { - match serde_json::from_value(item.data.clone().unwrap()).unwrap() { - CompletionItemData::Package | CompletionItemData::Class => { + self.run_with_db(id, move |db| { + match item + .data + .clone() + .map(|data| serde_json::from_value(data).unwrap()) + { + Some(CompletionItemData::Package | CompletionItemData::Class) => { item.documentation = COMPONENT_DATABASE .documentation(&item.label) .map(Documentation::MarkupContent); } - CompletionItemData::Citation { uri, key } => { - if let Some(document) = server.workspace.documents_by_uri.get(&uri) { - if let Some(data) = document.data.as_bibtex() { - let root = bibtex::SyntaxNode::new_root(data.green.clone()); - item.documentation = bibtex::Root::cast(root) - .and_then(|root| root.find_entry(&key)) - .and_then(|entry| citation::render(&entry)) - .map(|value| { - Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value, - }) - }); - } + Some(CompletionItemData::Citation { uri, key }) => { + if let Some(root) = Workspace::get(db) + .lookup_uri(db, &uri) + .and_then(|document| document.parse(db).as_bib().map(|data| data.root(db))) + { + item.documentation = bibtex::Root::cast(root) + .and_then(|root| root.find_entry(&key)) + .and_then(|entry| citation::render(&entry)) + .map(|value| { + Documentation::MarkupContent(MarkupContent { + kind: MarkupKind::Markdown, + value, + }) + }); } } - _ => {} + None => {} }; - server - .connection - .sender - .send(lsp_server::Response::new_ok(id, item).into()) - .unwrap(); + item }); + Ok(()) } fn folding_range(&self, id: RequestId, params: FoldingRangeParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, find_foldings)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| { + folding::find_all(db, &uri).unwrap_or_default() + }); Ok(()) } fn references(&self, id: RequestId, params: ReferenceParams) -> Result<()> { - let uri = Arc::new(params.text_document_position.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, find_all_references)?; + let mut uri = params.text_document_position.text_document.uri; + normalize_uri(&mut uri); + let position = params.text_document_position.position; + self.run_with_db(id, move |db| { + reference::find_all(db, &uri, position, ¶ms.context).unwrap_or_default() + }); + Ok(()) } - fn hover(&self, id: RequestId, params: HoverParams) -> Result<()> { - let uri = Arc::new( - params - .text_document_position_params - .text_document - .uri - .clone(), - ); - self.build_engine.positions_by_uri.insert( - Arc::clone(&uri), - params.text_document_position_params.position, - ); + fn hover(&mut self, id: RequestId, params: HoverParams) -> Result<()> { + let mut uri = params.text_document_position_params.text_document.uri; + normalize_uri(&mut uri); - self.handle_feature_request(id, params, uri, find_hover)?; + let db = self.engine.write(); + let workspace = Workspace::get(db); + if let Some(document) = workspace.lookup_uri(db, &uri) { + let position = document + .contents(db) + .line_index(db) + .offset_lsp(params.text_document_position_params.position); + + document + .set_cursor(db) + .with_durability(salsa::Durability::LOW) + .to(position); + } + + let position = params.text_document_position_params.position; + self.run_with_db(id, move |db| hover::find(db, &uri, position)); Ok(()) } fn goto_definition(&self, id: RequestId, params: GotoDefinitionParams) -> Result<()> { - let uri = Arc::new( - params - .text_document_position_params - .text_document - .uri - .clone(), - ); - self.handle_feature_request(id, params, uri, goto_definition)?; + let mut uri = params.text_document_position_params.text_document.uri; + normalize_uri(&mut uri); + let position = params.text_document_position_params.position; + self.run_with_db(id, move |db| { + definition::goto_definition(db, &uri, position) + }); + Ok(()) } fn prepare_rename(&self, id: RequestId, params: TextDocumentPositionParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, prepare_rename_all)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| { + rename::prepare_rename_all(db, &uri, params.position) + }); + Ok(()) } fn rename(&self, id: RequestId, params: RenameParams) -> Result<()> { - let uri = Arc::new(params.text_document_position.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, rename_all)?; + let mut uri = params.text_document_position.text_document.uri; + normalize_uri(&mut uri); + let position = params.text_document_position.position; + self.run_with_db(id, move |db| { + rename::rename_all(db, &uri, position, params.new_name) + }); + Ok(()) } fn document_highlight(&self, id: RequestId, params: DocumentHighlightParams) -> Result<()> { - let uri = Arc::new( - params - .text_document_position_params - .text_document - .uri - .clone(), - ); - self.handle_feature_request(id, params, uri, find_document_highlights)?; + let mut uri = params.text_document_position_params.text_document.uri; + normalize_uri(&mut uri); + let position = params.text_document_position_params.position; + self.run_with_db(id, move |db| { + highlight::find_all(db, &uri, position).unwrap_or_default() + }); Ok(()) } fn formatting(&self, id: RequestId, params: DocumentFormattingParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, format_source_code)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| { + formatting::format_source_code(db, &uri, ¶ms.options) + }); + Ok(()) } - fn execute_command(&self, id: RequestId, params: ExecuteCommandParams) -> Result<()> { - self.spawn(move |server| { - let result = execute_command(&server.workspace, ¶ms.command, params.arguments); - let response = match result { - Ok(()) => lsp_server::Response::new_ok(id, ()), - Err(why) => lsp_server::Response::new_err( - id, - lsp_server::ErrorCode::InternalError as i32, - why.to_string(), - ), - }; + fn execute_command(&mut self, id: RequestId, params: ExecuteCommandParams) -> Result<()> { + let db = self.engine.read(); + match workspace_command::select(db, ¶ms.command, params.arguments) { + Ok(command) => { + let client = self.client.clone(); + self.pool.execute(move || { + match command.run() { + Ok(()) => { + client + .send_response(lsp_server::Response::new_ok(id, ())) + .unwrap(); + } + Err(why) => { + client + .send_error(id, ErrorCode::InternalError, why.to_string()) + .unwrap(); + } + }; + }); + } + Err(why) => { + self.client + .send_error(id, ErrorCode::InvalidParams, why.to_string()) + .unwrap(); + } + }; + + Ok(()) + } - server.connection.sender.send(response.into()).unwrap(); + fn inlay_hints(&self, id: RequestId, params: InlayHintParams) -> Result<()> { + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + self.run_with_db(id, move |db| { + inlay_hint::find_all(db, &uri, params.range).unwrap_or_default() }); + Ok(()) + } + fn inlay_hint_resolve(&self, id: RequestId, hint: InlayHint) -> Result<()> { + let response = lsp_server::Response::new_ok(id, hint); + self.connection.sender.send(response.into()).unwrap(); Ok(()) } @@ -710,52 +671,144 @@ impl Server { Ok(()) } - fn build(&self, id: RequestId, params: BuildParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - let lsp_sender = self.connection.sender.clone(); - let req_queue = Arc::clone(&self.req_queue); - let build_engine = Arc::clone(&self.build_engine); - self.handle_feature_request(id, params, uri, move |request| { - build_engine - .build(request, &req_queue, &lsp_sender) - .unwrap_or_else(|why| { - error!("Build failed: {}", why); - BuildResult { - status: BuildStatus::FAILURE, - } - }) + fn build(&mut self, id: RequestId, params: BuildParams) -> Result<()> { + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let client = self.client.clone(); + self.build_internal(uri, move |status| { + let result = BuildResult { status }; + client + .send_response(lsp_server::Response::new_ok(id, result)) + .unwrap(); })?; + + Ok(()) + } + + fn build_internal( + &mut self, + uri: Url, + callback: impl FnOnce(BuildStatus) + Send + 'static, + ) -> Result<()> { + static LOCK: Lazy<Mutex<()>> = Lazy::new(|| Mutex::new(())); + + let db = self.engine.read(); + let compiler = match build::Command::new(db, uri.clone(), self.client.clone()) { + Some(compiler) => compiler, + None => { + callback(BuildStatus::FAILURE); + return Ok(()); + } + }; + + let forward_search_after = Workspace::get(db).options(db).build.forward_search_after; + + let sender = self.internal_tx.clone(); + self.pool.execute(move || { + let guard = LOCK.lock().unwrap(); + + let status = compiler.run(); + if forward_search_after { + sender.send(InternalMessage::ForwardSearch(uri)).unwrap(); + } + + drop(guard); + callback(status); + }); + Ok(()) } - fn forward_search(&self, id: RequestId, params: TextDocumentPositionParams) -> Result<()> { - let uri = Arc::new(params.text_document.uri.clone()); - self.handle_feature_request(id, params, uri, |req| { - crate::features::execute_forward_search(req).unwrap_or(ForwardSearchResult { - status: ForwardSearchStatus::ERROR, - }) + fn forward_search(&mut self, id: RequestId, params: TextDocumentPositionParams) -> Result<()> { + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let client = self.client.clone(); + self.forward_search_internal(uri, Some(params.position), move |status| { + let result = ForwardSearchResult { status }; + client + .send_response(lsp_server::Response::new_ok(id, result)) + .unwrap(); })?; + Ok(()) } - fn reparse_all(&mut self) -> Result<()> { - for document in self - .workspace - .documents_by_uri - .values() - .cloned() - .collect::<Vec<_>>() - { - self.workspace.open( - Arc::clone(&document.uri), - document.text.clone(), - document.data.language(), - )?; - } + fn forward_search_internal( + &mut self, + uri: Url, + position: Option<Position>, + callback: impl FnOnce(ForwardSearchStatus) + Send + 'static, + ) -> Result<()> { + let db = self.engine.read(); + let command = match forward_search::Command::configure(db, &uri, position) { + Ok(command) => command, + Err(why) => { + log::error!("Forward search failed: {}", why); + callback(why.into()); + return Ok(()); + } + }; + + self.pool.execute(move || { + let status = command + .run() + .map_or_else(ForwardSearchStatus::from, |()| ForwardSearchStatus::SUCCESS); + + callback(status); + }); Ok(()) } + fn handle_file_event(&mut self, event: notify::Event) { + let mut changed = false; + + let db = self.engine.write(); + let workspace = Workspace::get(db); + match event.kind { + notify::EventKind::Create(_) | notify::EventKind::Modify(_) => { + for path in event.paths { + if workspace + .lookup_path(db, &path) + .map_or(true, |document| document.owner(db) == Owner::Server) + { + if let Some(language) = Language::from_path(&path) { + workspace.load(db, &path, language, Owner::Server); + changed = true; + } + } + } + } + notify::EventKind::Remove(_) => { + for path in event.paths { + if let Some(document) = workspace.lookup_path(db, &path) { + if document.owner(db) == Owner::Server { + let mut documents = workspace + .set_documents(db) + .with_durability(salsa::Durability::LOW) + .to(FxHashSet::default()); + + documents.remove(&document); + workspace + .set_documents(db) + .with_durability(salsa::Durability::MEDIUM) + .to(documents); + + changed = true; + } + } + } + } + notify::EventKind::Any | notify::EventKind::Access(_) | notify::EventKind::Other => {} + }; + + if changed { + self.publish_diagnostics_with_delay(); + } + } + fn process_messages(&mut self) -> Result<()> { loop { crossbeam_channel::select! { @@ -766,8 +819,7 @@ impl Server { return Ok(()); } - self.register_incoming_request(request.id.clone()); - if let Some(response) = RequestDispatcher::new(request) + if let Some(response) = dispatch::RequestDispatcher::new(request) .on::<DocumentLinkRequest, _>(|id, params| self.document_link(id, params))? .on::<FoldingRangeRequest, _>(|id, params| self.folding_range(id, params))? .on::<References, _>(|id, params| self.references(id, params))? @@ -777,12 +829,10 @@ impl Server { })? .on::<WorkspaceSymbol, _>(|id, params| self.workspace_symbols(id, params))? .on::<Completion, _>(|id, params| { - #[cfg(feature = "completion")] self.completion(id, params)?; Ok(()) })? .on::<ResolveCompletionItem, _>(|id, params| { - #[cfg(feature = "completion")] self.completion_resolve(id, params)?; Ok(()) })? @@ -803,13 +853,19 @@ impl Server { .on::<SemanticTokensRangeRequest, _>(|id, params| { self.semantic_tokens_range(id, params) })? + .on::<InlayHintRequest, _>(|id,params| { + self.inlay_hints(id, params) + })? + .on::<InlayHintResolveRequest,_>(|id, params| { + self.inlay_hint_resolve(id, params) + })? .default() { self.connection.sender.send(response.into())?; } } Message::Notification(notification) => { - NotificationDispatcher::new(notification) + dispatch::NotificationDispatcher::new(notification) .on::<Cancel, _>(|params| self.cancel(params))? .on::<DidChangeConfiguration, _>(|params| { self.did_change_configuration(params) @@ -824,26 +880,39 @@ impl Server { .default(); } Message::Response(response) => { - let mut req_queue = self.req_queue.lock().unwrap(); - if let Some(data) = req_queue.outgoing.complete(response.id) { - let result = match response.error { - Some(error) => Err(error), - None => Ok(response.result.unwrap_or_default()), - }; - data.sender.send(result)?; - } + self.client.recv_response(response)?; } }; }, recv(&self.internal_rx) -> msg => { match msg? { InternalMessage::SetDistro(distro) => { - self.workspace.environment.resolver = Arc::new(distro.resolver); - self.reparse_all()?; + let db = self.engine.write(); + Workspace::get(db) + .set_file_name_db(db) + .with_durability(salsa::Durability::HIGH) + .to(distro.file_name_db); } InternalMessage::SetOptions(options) => { - self.workspace.environment.options = options; - self.reparse_all()?; + self.update_options(options); + } + InternalMessage::FileEvent(event) => { + self.handle_file_event(event); + } + InternalMessage::ForwardSearch(uri) => { + self.forward_search_internal(uri, None, |_| ())?; + } + InternalMessage::Diagnostics => { + self.publish_diagnostics()?; + } + InternalMessage::ChktexResult(uri, diagnostics) => { + let db = self.engine.write(); + let workspace = Workspace::get(db); + if let Some(document) = workspace.lookup_uri(db, &uri) { + document.linter(db).set_chktex(db).to(diagnostics); + } + + self.publish_diagnostics()?; } }; } @@ -854,63 +923,34 @@ impl Server { pub fn run(mut self) -> Result<()> { self.initialize()?; self.process_messages()?; - self.pool.lock().unwrap().join(); + self.pool.join(); + self.engine.finish(); Ok(()) } } -fn create_debouncer( - lsp_sender: Sender<Message>, - diagnostic_manager: DiagnosticManager, -) -> debouncer::Sender<Workspace> { - let (tx, rx) = debouncer::unbounded(); - std::thread::spawn(move || { - while let Ok(workspace) = rx.recv() { - if let Err(why) = publish_diagnostics(&lsp_sender, &diagnostic_manager, &workspace) { - warn!("Failed to publish diagnostics: {}", why); - } - } - }); - - tx +struct FileWatcher { + watcher: notify::RecommendedWatcher, + watched_dirs: FxHashSet<PathBuf>, } -fn publish_diagnostics( - lsp_sender: &Sender<lsp_server::Message>, - diagnostic_manager: &DiagnosticManager, - workspace: &Workspace, -) -> Result<()> { - for document in workspace.documents_by_uri.values() { - if matches!(document.data, DocumentData::BuildLog(_)) { - continue; - } +impl FileWatcher { + pub fn new(sender: Sender<InternalMessage>) -> Result<Self> { + let handle = move |event| { + if let Ok(event) = event { + sender.send(InternalMessage::FileEvent(event)).unwrap(); + } + }; - let diagnostics = diagnostic_manager.publish(workspace, &document.uri); - send_notification::<PublishDiagnostics>( - lsp_sender, - PublishDiagnosticsParams { - uri: document.uri.as_ref().clone(), - version: None, - diagnostics, - }, - )?; + Ok(Self { + watcher: notify::recommended_watcher(handle)?, + watched_dirs: FxHashSet::default(), + }) } - Ok(()) -} - -fn apply_document_edit(old_text: &mut String, changes: Vec<TextDocumentContentChangeEvent>) { - for change in changes { - let line_index = LineIndex::new(old_text); - match change.range { - Some(range) => { - let range = std::ops::Range::<usize>::from(line_index.offset_lsp_range(range)); - old_text.replace_range(range, &change.text); - } - None => { - *old_text = change.text; - } - }; + pub fn watch(&mut self, db: &dyn Db) { + let workspace = Workspace::get(db); + workspace.watch(db, &mut self.watcher, &mut self.watched_dirs); } } @@ -933,3 +973,29 @@ impl lsp_types::request::Request for ForwardSearchRequest { const METHOD: &'static str = "textDocument/forwardSearch"; } + +#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize_repr, Deserialize_repr)] +#[repr(i32)] +pub enum ForwardSearchStatus { + SUCCESS = 0, + ERROR = 1, + FAILURE = 2, + UNCONFIGURED = 3, +} + +impl From<forward_search::Error> for ForwardSearchStatus { + fn from(err: forward_search::Error) -> Self { + match err { + forward_search::Error::TexNotFound(_) => ForwardSearchStatus::FAILURE, + forward_search::Error::PdfNotFound(_) => ForwardSearchStatus::ERROR, + forward_search::Error::NoLocalFile(_) => ForwardSearchStatus::FAILURE, + forward_search::Error::Unconfigured => ForwardSearchStatus::UNCONFIGURED, + forward_search::Error::Spawn(_) => ForwardSearchStatus::ERROR, + } + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct ForwardSearchResult { + pub status: ForwardSearchStatus, +} diff --git a/support/texlab/src/dispatch.rs b/support/texlab/src/server/dispatch.rs index f5659ee3b4..f5659ee3b4 100644 --- a/support/texlab/src/dispatch.rs +++ b/support/texlab/src/server/dispatch.rs diff --git a/support/texlab/src/server/query.rs b/support/texlab/src/server/query.rs new file mode 100644 index 0000000000..f19d15f85b --- /dev/null +++ b/support/texlab/src/server/query.rs @@ -0,0 +1,32 @@ +use salsa::{DbWithJar, ParallelDatabase}; +use threadpool::ThreadPool; + +use crate::{Database, Db}; + +#[derive(Default)] +pub struct Engine { + db: Database, + pool: ThreadPool, +} + +impl Engine { + pub fn read(&self) -> &dyn Db { + &self.db + } + + pub fn write(&mut self) -> &mut dyn Db { + self.pool.join(); + &mut self.db + } + + pub fn fork<F: FnOnce(&dyn Db) + Send + 'static>(&self, action: F) { + let snapshot = self.db.snapshot(); + self.pool.execute(move || { + action(snapshot.as_jar_db()); + }); + } + + pub fn finish(self) { + self.pool.join(); + } +} diff --git a/support/texlab/src/syntax.rs b/support/texlab/src/syntax.rs index a0ae96089c..dc8761b73d 100644 --- a/support/texlab/src/syntax.rs +++ b/support/texlab/src/syntax.rs @@ -1,3 +1,22 @@ pub mod bibtex; -pub mod build_log; pub mod latex; + +#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Hash)] +pub enum BuildErrorLevel { + Error, + Warning, +} + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +pub struct BuildError { + pub relative_path: std::path::PathBuf, + pub level: BuildErrorLevel, + pub message: String, + pub hint: Option<String>, + pub line: Option<u32>, +} + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +pub struct BuildLog { + pub errors: Vec<BuildError>, +} diff --git a/support/texlab/src/syntax/bibtex.rs b/support/texlab/src/syntax/bibtex.rs index a35399419a..9b4b1ab77e 100644 --- a/support/texlab/src/syntax/bibtex.rs +++ b/support/texlab/src/syntax/bibtex.rs @@ -1,10 +1,4 @@ -mod ast; -mod lexer; -mod parser; -#[cfg(test)] -mod tests; - -pub use self::{ast::*, parser::parse, SyntaxKind::*}; +use rowan::{ast::AstNode, NodeOrToken}; #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] #[allow(non_camel_case_types)] @@ -42,6 +36,8 @@ pub enum SyntaxKind { ROOT, } +pub use SyntaxKind::*; + impl From<SyntaxKind> for rowan::SyntaxKind { fn from(kind: SyntaxKind) -> Self { Self(kind as u16) @@ -69,3 +65,240 @@ pub type SyntaxNode = rowan::SyntaxNode<Lang>; pub type SyntaxToken = rowan::SyntaxToken<Lang>; pub type SyntaxElement = rowan::SyntaxElement<Lang>; + +macro_rules! ast_node { + (name: $name:ident, kinds: [$($kind:pat),+], traits: [$($trait: ident),*]) => { + #[derive(Clone)] + pub struct $name { + node: SyntaxNode, + } + + impl AstNode for $name { + type Language = Lang; + + fn can_cast(kind: SyntaxKind) -> bool { + match kind { + $($kind => true,)+ + _ => false, + } + } + + fn cast(node: SyntaxNode) -> Option<Self> + where + Self: Sized, + { + match node.kind() { + $($kind => Some(Self { node}),)+ + _ => None, + } + } + + fn syntax(&self) -> &SyntaxNode { + &self.node + } + } + + $( + impl $trait for $name { } + )* + }; +} + +macro_rules! ast_node_enum { + (name: $name:ident, variants: [$($variant:ident),+]) => { + #[derive(Clone)] + pub enum $name { + $($variant($variant),)* + } + + impl AstNode for $name { + type Language = Lang; + + fn can_cast(kind: SyntaxKind) -> bool { + false $(|| $variant::can_cast(kind))+ + } + + fn cast(node: SyntaxNode) -> Option<Self> + where + Self: Sized, + { + None $(.or_else(|| $variant::cast(node.clone()).map(Self::$variant)))* + } + + fn syntax(&self) -> &SyntaxNode { + match self { + $(Self::$variant(node) => node.syntax(),)* + } + } + } + + $( + impl From<$variant> for $name { + fn from(node: $variant) -> Self { + Self::$variant(node) + } + } + )* + }; +} + +pub trait HasType: AstNode<Language = Lang> { + fn type_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == TYPE) + } +} + +pub trait HasDelims: AstNode<Language = Lang> { + fn left_delim_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == L_DELIM) + } + + fn right_delim_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == R_DELIM) + } +} + +pub trait HasName: AstNode<Language = Lang> { + fn name_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == NAME) + } +} + +pub trait HasEq: AstNode<Language = Lang> { + fn eq_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == NAME) + } +} + +pub trait HasComma: AstNode<Language = Lang> { + fn comma_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == COMMA) + } +} + +pub trait HasPound: AstNode<Language = Lang> { + fn pound_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == POUND) + } +} + +pub trait HasInteger: AstNode<Language = Lang> { + fn integer_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == INTEGER) + } +} + +pub trait HasCommandName: AstNode<Language = Lang> { + fn command_name_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == COMMAND_NAME) + } +} + +pub trait HasAccentName: AstNode<Language = Lang> { + fn accent_name_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == ACCENT_NAME) + } +} + +pub trait HasWord: AstNode<Language = Lang> { + fn word_token(&self) -> Option<SyntaxToken> { + self.syntax() + .children_with_tokens() + .filter_map(NodeOrToken::into_token) + .find(|token| token.kind() == WORD) + } +} + +pub trait HasValue: AstNode<Language = Lang> { + fn value(&self) -> Option<Value> { + self.syntax().children().find_map(Value::cast) + } +} + +ast_node!(name: Root, kinds: [ROOT], traits: []); + +impl Root { + pub fn strings(&self) -> impl Iterator<Item = StringDef> { + self.syntax().children().filter_map(StringDef::cast) + } + + pub fn entries(&self) -> impl Iterator<Item = Entry> { + self.syntax().children().filter_map(Entry::cast) + } + + pub fn find_entry(&self, name: &str) -> Option<Entry> { + self.entries().find(|entry| { + entry + .name_token() + .map_or(false, |token| token.text() == name) + }) + } +} + +ast_node!(name: Preamble, kinds: [PREAMBLE], traits: [HasType, HasDelims, HasValue]); + +ast_node!(name: StringDef, kinds: [STRING], traits: [HasType, HasDelims, HasName, HasEq, HasValue]); + +ast_node!(name: Entry, kinds: [ENTRY], traits: [HasType, HasDelims, HasName, HasComma]); + +impl Entry { + pub fn fields(&self) -> impl Iterator<Item = Field> { + self.syntax().children().filter_map(Field::cast) + } +} + +ast_node!(name: Field, kinds: [FIELD], traits: [HasName, HasEq, HasValue, HasComma]); + +ast_node_enum!(name: Value, variants: [Literal, CurlyGroup, QuoteGroup, Join, Accent, Command]); + +ast_node!(name: Literal, kinds: [LITERAL], traits: [HasName, HasInteger]); + +ast_node!(name: CurlyGroup, kinds: [CURLY_GROUP], traits: []); + +ast_node!(name: QuoteGroup, kinds: [QUOTE_GROUP], traits: []); + +ast_node!(name: Join, kinds: [JOIN], traits: [HasPound]); + +impl Join { + pub fn left_value(&self) -> Option<Value> { + self.syntax().children().find_map(Value::cast) + } + + pub fn right_value(&self) -> Option<Value> { + self.syntax().children().filter_map(Value::cast).nth(1) + } +} + +ast_node!(name: Accent, kinds: [ACCENT], traits: [HasAccentName, HasWord]); + +ast_node!(name: Command, kinds: [COMMAND], traits: [HasCommandName]); diff --git a/support/texlab/src/syntax/bibtex/ast.rs b/support/texlab/src/syntax/bibtex/ast.rs deleted file mode 100644 index 10ac571dd2..0000000000 --- a/support/texlab/src/syntax/bibtex/ast.rs +++ /dev/null @@ -1,244 +0,0 @@ -use rowan::{ast::AstNode, NodeOrToken}; - -use super::{ - Lang, - SyntaxKind::{self, *}, - SyntaxNode, SyntaxToken, -}; - -macro_rules! ast_node { - (name: $name:ident, kinds: [$($kind:pat),+], traits: [$($trait: ident),*]) => { - #[derive(Clone)] - pub struct $name { - node: SyntaxNode, - } - - impl AstNode for $name { - type Language = Lang; - - fn can_cast(kind: SyntaxKind) -> bool { - match kind { - $($kind => true,)+ - _ => false, - } - } - - fn cast(node: SyntaxNode) -> Option<Self> - where - Self: Sized, - { - match node.kind() { - $($kind => Some(Self { node}),)+ - _ => None, - } - } - - fn syntax(&self) -> &SyntaxNode { - &self.node - } - } - - $( - impl $trait for $name { } - )* - }; -} - -macro_rules! ast_node_enum { - (name: $name:ident, variants: [$($variant:ident),+]) => { - #[derive(Clone)] - pub enum $name { - $($variant($variant),)* - } - - impl AstNode for $name { - type Language = Lang; - - fn can_cast(kind: SyntaxKind) -> bool { - false $(|| $variant::can_cast(kind))+ - } - - fn cast(node: SyntaxNode) -> Option<Self> - where - Self: Sized, - { - None $(.or_else(|| $variant::cast(node.clone()).map(Self::$variant)))* - } - - fn syntax(&self) -> &SyntaxNode { - match self { - $(Self::$variant(node) => node.syntax(),)* - } - } - } - - $( - impl From<$variant> for $name { - fn from(node: $variant) -> Self { - Self::$variant(node) - } - } - )* - }; -} - -pub trait HasType: AstNode<Language = Lang> { - fn type_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == TYPE) - } -} - -pub trait HasDelims: AstNode<Language = Lang> { - fn left_delim_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == L_DELIM) - } - - fn right_delim_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == R_DELIM) - } -} - -pub trait HasName: AstNode<Language = Lang> { - fn name_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == NAME) - } -} - -pub trait HasEq: AstNode<Language = Lang> { - fn eq_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == NAME) - } -} - -pub trait HasComma: AstNode<Language = Lang> { - fn comma_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == COMMA) - } -} - -pub trait HasPound: AstNode<Language = Lang> { - fn pound_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == POUND) - } -} - -pub trait HasInteger: AstNode<Language = Lang> { - fn integer_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == INTEGER) - } -} - -pub trait HasCommandName: AstNode<Language = Lang> { - fn command_name_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == COMMAND_NAME) - } -} - -pub trait HasAccentName: AstNode<Language = Lang> { - fn accent_name_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == ACCENT_NAME) - } -} - -pub trait HasWord: AstNode<Language = Lang> { - fn word_token(&self) -> Option<SyntaxToken> { - self.syntax() - .children_with_tokens() - .filter_map(NodeOrToken::into_token) - .find(|token| token.kind() == WORD) - } -} - -pub trait HasValue: AstNode<Language = Lang> { - fn value(&self) -> Option<Value> { - self.syntax().children().find_map(Value::cast) - } -} - -ast_node!(name: Root, kinds: [ROOT], traits: []); - -impl Root { - pub fn strings(&self) -> impl Iterator<Item = StringDef> { - self.syntax().children().filter_map(StringDef::cast) - } - - pub fn entries(&self) -> impl Iterator<Item = Entry> { - self.syntax().children().filter_map(Entry::cast) - } - - pub fn find_entry(&self, name: &str) -> Option<Entry> { - self.entries().find(|entry| { - entry - .name_token() - .map_or(false, |token| token.text() == name) - }) - } -} - -ast_node!(name: Preamble, kinds: [PREAMBLE], traits: [HasType, HasDelims, HasValue]); - -ast_node!(name: StringDef, kinds: [STRING], traits: [HasType, HasDelims, HasName, HasEq, HasValue]); - -ast_node!(name: Entry, kinds: [ENTRY], traits: [HasType, HasDelims, HasName, HasComma]); - -impl Entry { - pub fn fields(&self) -> impl Iterator<Item = Field> { - self.syntax().children().filter_map(Field::cast) - } -} - -ast_node!(name: Field, kinds: [FIELD], traits: [HasName, HasEq, HasValue, HasComma]); - -ast_node_enum!(name: Value, variants: [Literal, CurlyGroup, QuoteGroup, Join, Accent, Command]); - -ast_node!(name: Literal, kinds: [LITERAL], traits: [HasName, HasInteger]); - -ast_node!(name: CurlyGroup, kinds: [CURLY_GROUP], traits: []); - -ast_node!(name: QuoteGroup, kinds: [QUOTE_GROUP], traits: []); - -ast_node!(name: Join, kinds: [JOIN], traits: [HasPound]); - -impl Join { - pub fn left_value(&self) -> Option<Value> { - self.syntax().children().find_map(Value::cast) - } - - pub fn right_value(&self) -> Option<Value> { - self.syntax().children().filter_map(Value::cast).nth(1) - } -} - -ast_node!(name: Accent, kinds: [ACCENT], traits: [HasAccentName, HasWord]); - -ast_node!(name: Command, kinds: [COMMAND], traits: [HasCommandName]); diff --git a/support/texlab/src/syntax/bibtex/lexer.rs b/support/texlab/src/syntax/bibtex/lexer.rs deleted file mode 100644 index 3ea8e9f8d2..0000000000 --- a/support/texlab/src/syntax/bibtex/lexer.rs +++ /dev/null @@ -1,180 +0,0 @@ -use logos::Logos; - -use super::SyntaxKind::{self, *}; - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] -pub enum RootToken { - #[token(r"@preamble", ignore(ascii_case))] - Preamble, - - #[token(r"@string", ignore(ascii_case))] - String, - - #[token(r"@comment", ignore(ascii_case))] - Comment, - - #[regex(r"@[a-zA-Z]*")] - Entry, - - #[regex(r"[^@]+")] - #[error] - Junk, -} - -impl From<RootToken> for SyntaxKind { - fn from(token: RootToken) -> Self { - match token { - RootToken::Preamble | RootToken::String | RootToken::Comment | RootToken::Entry => TYPE, - RootToken::Junk => JUNK, - } - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] -pub enum BodyToken { - #[regex(r"\s+")] - Whitespace, - - #[token("{")] - #[token("(")] - LDelim, - - #[token("}")] - #[token(")")] - RDelim, - - #[token(",")] - Comma, - - #[token("=")] - Eq, - - #[regex(r"[^\s\(\)\{\}@,=]+")] - Name, - - #[error] - Error, -} - -impl From<BodyToken> for SyntaxKind { - fn from(token: BodyToken) -> Self { - match token { - BodyToken::Whitespace => WHITESPACE, - BodyToken::LDelim => L_DELIM, - BodyToken::RDelim => R_DELIM, - BodyToken::Comma => COMMA, - BodyToken::Eq => EQ, - BodyToken::Name => NAME, - BodyToken::Error => unreachable!(), - } - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] -pub enum ValueToken { - #[regex(r"\s+")] - Whitespace, - - #[token("#")] - Pound, - - #[token(",")] - Comma, - - #[token("{")] - LCurly, - - #[token("}")] - RCurly, - - #[token("\"")] - Quote, - - #[regex(r"\d+", priority = 2)] - Integer, - - #[regex(r#"[^\s"\{\},]+"#)] - #[error] - Name, -} - -impl From<ValueToken> for SyntaxKind { - fn from(token: ValueToken) -> Self { - match token { - ValueToken::Whitespace => WHITESPACE, - ValueToken::Pound => POUND, - ValueToken::Comma => COMMA, - ValueToken::LCurly => L_CURLY, - ValueToken::RCurly => R_CURLY, - ValueToken::Quote => QUOTE, - ValueToken::Integer => INTEGER, - ValueToken::Name => NAME, - } - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, Logos)] -pub enum ContentToken { - #[regex(r"\s+")] - Whitespace, - - #[token(",")] - Comma, - - #[token("{")] - LCurly, - - #[token("}")] - RCurly, - - #[token("\"")] - Quote, - - #[regex(r"\d+", priority = 2)] - Integer, - - #[token(r#"~"#)] - Nbsp, - - #[token(r#"\`"#)] - #[token(r#"\'"#)] - #[token(r#"\^"#)] - #[token(r#"\""#)] - #[token(r#"\H"#)] - #[token(r#"\~"#)] - #[token(r#"\c"#)] - #[token(r#"\k"#)] - #[token(r#"\="#)] - #[token(r#"\b"#)] - #[token(r#"\."#)] - #[token(r#"\d"#)] - #[token(r#"\r"#)] - #[token(r#"\u"#)] - #[token(r#"\v"#)] - #[token(r#"\t"#)] - AccentName, - - #[regex(r"\\([^\r\n]|[@a-zA-Z:_]+\*?)?")] - CommandName, - - #[regex(r#"[^\s"\{\}\\~,]+"#)] - #[error] - Word, -} - -impl From<ContentToken> for SyntaxKind { - fn from(token: ContentToken) -> Self { - match token { - ContentToken::Whitespace => WHITESPACE, - ContentToken::Comma => COMMA, - ContentToken::LCurly => L_CURLY, - ContentToken::RCurly => R_CURLY, - ContentToken::Quote => QUOTE, - ContentToken::Integer => INTEGER, - ContentToken::Nbsp => NBSP, - ContentToken::AccentName => ACCENT_NAME, - ContentToken::CommandName => COMMAND_NAME, - ContentToken::Word => WORD, - } - } -} diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_001.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_001.snap deleted file mode 100644 index 4fbec161d2..0000000000 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_001.snap +++ /dev/null @@ -1,430 +0,0 @@ ---- -source: src/syntax/bibtex/tests.rs -assertion_line: 47 -expression: "setup(r#\"@incollection{westfahl:space,\n author = {Westfahl, Gary},\n title = {The True Frontier},\n subtitle = {Confronting and Avoiding the Realities of Space in {American}\n Science Fiction Films},\n pages = {55-65},\n crossref = {westfahl:frontier},\n langid = {english},\n langidopts = {variant=american},\n indextitle = {True Frontier, The},\n annotation = {A cross-referenced article from a \\texttt{collection}. This is\n an \\texttt{incollection} entry with a \\texttt{crossref}\n field. Note the \\texttt{subtitle} and \\texttt{indextitle}\n fields},\n}\n\n% booktitle and booksubtitle are only needed for BibTeX's less sophisticated\n% inheritance set-up to make sure westfahl:space shows correctly.\n% With Biber they are not needed.\n@collection{westfahl:frontier,\n editor = {Westfahl, Gary},\n title = {Space and Beyond},\n date = 2000,\n subtitle = {The Frontier Theme in Science Fiction},\n publisher = {Greenwood},\n location = {Westport, Conn. and London},\n langid = {english},\n langidopts = {variant=american},\n booktitle = {Space and Beyond},\n booksubtitle = {The Frontier Theme in Science Fiction},\n annotation = {This is a \\texttt{collection} entry. Note the format of the\n \\texttt{location} field as well as the \\texttt{subtitle}\n field},\n}\"#)" ---- -ROOT@0..1484 - ENTRY@0..678 - TYPE@0..13 "@incollection" - L_DELIM@13..14 "{" - NAME@14..28 "westfahl:space" - COMMA@28..29 "," - WHITESPACE@29..34 "\n " - FIELD@34..66 - NAME@34..40 "author" - WHITESPACE@40..47 " " - EQ@47..48 "=" - WHITESPACE@48..49 " " - CURLY_GROUP@49..65 - L_CURLY@49..50 "{" - WORD@50..58 "Westfahl" - COMMA@58..59 "," - WHITESPACE@59..60 " " - WORD@60..64 "Gary" - R_CURLY@64..65 "}" - COMMA@65..66 "," - WHITESPACE@66..71 "\n " - FIELD@71..106 - NAME@71..76 "title" - WHITESPACE@76..84 " " - EQ@84..85 "=" - WHITESPACE@85..86 " " - CURLY_GROUP@86..105 - L_CURLY@86..87 "{" - WORD@87..90 "The" - WHITESPACE@90..91 " " - WORD@91..95 "True" - WHITESPACE@95..96 " " - WORD@96..104 "Frontier" - R_CURLY@104..105 "}" - COMMA@105..106 "," - WHITESPACE@106..111 "\n " - FIELD@111..232 - NAME@111..119 "subtitle" - WHITESPACE@119..124 " " - EQ@124..125 "=" - WHITESPACE@125..126 " " - CURLY_GROUP@126..231 - L_CURLY@126..127 "{" - WORD@127..138 "Confronting" - WHITESPACE@138..139 " " - WORD@139..142 "and" - WHITESPACE@142..143 " " - WORD@143..151 "Avoiding" - WHITESPACE@151..152 " " - WORD@152..155 "the" - WHITESPACE@155..156 " " - WORD@156..165 "Realities" - WHITESPACE@165..166 " " - WORD@166..168 "of" - WHITESPACE@168..169 " " - WORD@169..174 "Space" - WHITESPACE@174..175 " " - WORD@175..177 "in" - WHITESPACE@177..178 " " - CURLY_GROUP@178..188 - L_CURLY@178..179 "{" - WORD@179..187 "American" - R_CURLY@187..188 "}" - WHITESPACE@188..209 "\n " - WORD@209..216 "Science" - WHITESPACE@216..217 " " - WORD@217..224 "Fiction" - WHITESPACE@224..225 " " - WORD@225..230 "Films" - R_CURLY@230..231 "}" - COMMA@231..232 "," - WHITESPACE@232..237 "\n " - FIELD@237..260 - NAME@237..242 "pages" - WHITESPACE@242..250 " " - EQ@250..251 "=" - WHITESPACE@251..252 " " - CURLY_GROUP@252..259 - L_CURLY@252..253 "{" - WORD@253..258 "55-65" - R_CURLY@258..259 "}" - COMMA@259..260 "," - WHITESPACE@260..265 "\n " - FIELD@265..300 - NAME@265..273 "crossref" - WHITESPACE@273..278 " " - EQ@278..279 "=" - WHITESPACE@279..280 " " - CURLY_GROUP@280..299 - L_CURLY@280..281 "{" - WORD@281..298 "westfahl:frontier" - R_CURLY@298..299 "}" - COMMA@299..300 "," - WHITESPACE@300..305 "\n " - FIELD@305..330 - NAME@305..311 "langid" - WHITESPACE@311..318 " " - EQ@318..319 "=" - WHITESPACE@319..320 " " - CURLY_GROUP@320..329 - L_CURLY@320..321 "{" - WORD@321..328 "english" - R_CURLY@328..329 "}" - COMMA@329..330 "," - WHITESPACE@330..335 "\n " - FIELD@335..369 - NAME@335..345 "langidopts" - WHITESPACE@345..348 " " - EQ@348..349 "=" - WHITESPACE@349..350 " " - CURLY_GROUP@350..368 - L_CURLY@350..351 "{" - WORD@351..367 "variant=american" - R_CURLY@367..368 "}" - COMMA@368..369 "," - WHITESPACE@369..374 "\n " - FIELD@374..410 - NAME@374..384 "indextitle" - WHITESPACE@384..387 " " - EQ@387..388 "=" - WHITESPACE@388..389 " " - CURLY_GROUP@389..409 - L_CURLY@389..390 "{" - WORD@390..394 "True" - WHITESPACE@394..395 " " - WORD@395..403 "Frontier" - COMMA@403..404 "," - WHITESPACE@404..405 " " - WORD@405..408 "The" - R_CURLY@408..409 "}" - COMMA@409..410 "," - WHITESPACE@410..415 "\n " - FIELD@415..676 - NAME@415..425 "annotation" - WHITESPACE@425..428 " " - EQ@428..429 "=" - WHITESPACE@429..430 " " - CURLY_GROUP@430..675 - L_CURLY@430..431 "{" - WORD@431..432 "A" - WHITESPACE@432..433 " " - WORD@433..449 "cross-referenced" - WHITESPACE@449..450 " " - WORD@450..457 "article" - WHITESPACE@457..458 " " - WORD@458..462 "from" - WHITESPACE@462..463 " " - WORD@463..464 "a" - WHITESPACE@464..465 " " - COMMAND@465..472 - COMMAND_NAME@465..472 "\\texttt" - CURLY_GROUP@472..484 - L_CURLY@472..473 "{" - WORD@473..483 "collection" - R_CURLY@483..484 "}" - WORD@484..485 "." - WHITESPACE@485..486 " " - WORD@486..490 "This" - WHITESPACE@490..491 " " - WORD@491..493 "is" - WHITESPACE@493..514 "\n " - WORD@514..516 "an" - WHITESPACE@516..517 " " - COMMAND@517..524 - COMMAND_NAME@517..524 "\\texttt" - CURLY_GROUP@524..538 - L_CURLY@524..525 "{" - WORD@525..537 "incollection" - R_CURLY@537..538 "}" - WHITESPACE@538..539 " " - WORD@539..544 "entry" - WHITESPACE@544..545 " " - WORD@545..549 "with" - WHITESPACE@549..550 " " - WORD@550..551 "a" - WHITESPACE@551..552 " " - COMMAND@552..559 - COMMAND_NAME@552..559 "\\texttt" - CURLY_GROUP@559..569 - L_CURLY@559..560 "{" - WORD@560..568 "crossref" - R_CURLY@568..569 "}" - WHITESPACE@569..590 "\n " - WORD@590..596 "field." - WHITESPACE@596..597 " " - WORD@597..601 "Note" - WHITESPACE@601..602 " " - WORD@602..605 "the" - WHITESPACE@605..606 " " - COMMAND@606..613 - COMMAND_NAME@606..613 "\\texttt" - CURLY_GROUP@613..623 - L_CURLY@613..614 "{" - WORD@614..622 "subtitle" - R_CURLY@622..623 "}" - WHITESPACE@623..624 " " - WORD@624..627 "and" - WHITESPACE@627..628 " " - COMMAND@628..635 - COMMAND_NAME@628..635 "\\texttt" - CURLY_GROUP@635..647 - L_CURLY@635..636 "{" - WORD@636..646 "indextitle" - R_CURLY@646..647 "}" - WHITESPACE@647..668 "\n " - WORD@668..674 "fields" - R_CURLY@674..675 "}" - COMMA@675..676 "," - WHITESPACE@676..677 "\n" - R_DELIM@677..678 "}" - JUNK@678..857 "\n\n% booktitle and boo ..." - ENTRY@857..1484 - TYPE@857..868 "@collection" - L_DELIM@868..869 "{" - NAME@869..886 "westfahl:frontier" - COMMA@886..887 "," - WHITESPACE@887..892 "\n " - FIELD@892..924 - NAME@892..898 "editor" - WHITESPACE@898..905 " " - EQ@905..906 "=" - WHITESPACE@906..907 " " - CURLY_GROUP@907..923 - L_CURLY@907..908 "{" - WORD@908..916 "Westfahl" - COMMA@916..917 "," - WHITESPACE@917..918 " " - WORD@918..922 "Gary" - R_CURLY@922..923 "}" - COMMA@923..924 "," - WHITESPACE@924..929 "\n " - FIELD@929..963 - NAME@929..934 "title" - WHITESPACE@934..942 " " - EQ@942..943 "=" - WHITESPACE@943..944 " " - CURLY_GROUP@944..962 - L_CURLY@944..945 "{" - WORD@945..950 "Space" - WHITESPACE@950..951 " " - WORD@951..954 "and" - WHITESPACE@954..955 " " - WORD@955..961 "Beyond" - R_CURLY@961..962 "}" - COMMA@962..963 "," - WHITESPACE@963..968 "\n " - FIELD@968..988 - NAME@968..972 "date" - WHITESPACE@972..981 " " - EQ@981..982 "=" - WHITESPACE@982..983 " " - LITERAL@983..987 - INTEGER@983..987 "2000" - COMMA@987..988 "," - WHITESPACE@988..993 "\n " - FIELD@993..1048 - NAME@993..1001 "subtitle" - WHITESPACE@1001..1006 " " - EQ@1006..1007 "=" - WHITESPACE@1007..1008 " " - CURLY_GROUP@1008..1047 - L_CURLY@1008..1009 "{" - WORD@1009..1012 "The" - WHITESPACE@1012..1013 " " - WORD@1013..1021 "Frontier" - WHITESPACE@1021..1022 " " - WORD@1022..1027 "Theme" - WHITESPACE@1027..1028 " " - WORD@1028..1030 "in" - WHITESPACE@1030..1031 " " - WORD@1031..1038 "Science" - WHITESPACE@1038..1039 " " - WORD@1039..1046 "Fiction" - R_CURLY@1046..1047 "}" - COMMA@1047..1048 "," - WHITESPACE@1048..1053 "\n " - FIELD@1053..1080 - NAME@1053..1062 "publisher" - WHITESPACE@1062..1066 " " - EQ@1066..1067 "=" - WHITESPACE@1067..1068 " " - CURLY_GROUP@1068..1079 - L_CURLY@1068..1069 "{" - WORD@1069..1078 "Greenwood" - R_CURLY@1078..1079 "}" - COMMA@1079..1080 "," - WHITESPACE@1080..1085 "\n " - FIELD@1085..1129 - NAME@1085..1093 "location" - WHITESPACE@1093..1098 " " - EQ@1098..1099 "=" - WHITESPACE@1099..1100 " " - CURLY_GROUP@1100..1128 - L_CURLY@1100..1101 "{" - WORD@1101..1109 "Westport" - COMMA@1109..1110 "," - WHITESPACE@1110..1111 " " - WORD@1111..1116 "Conn." - WHITESPACE@1116..1117 " " - WORD@1117..1120 "and" - WHITESPACE@1120..1121 " " - WORD@1121..1127 "London" - R_CURLY@1127..1128 "}" - COMMA@1128..1129 "," - WHITESPACE@1129..1134 "\n " - FIELD@1134..1159 - NAME@1134..1140 "langid" - WHITESPACE@1140..1147 " " - EQ@1147..1148 "=" - WHITESPACE@1148..1149 " " - CURLY_GROUP@1149..1158 - L_CURLY@1149..1150 "{" - WORD@1150..1157 "english" - R_CURLY@1157..1158 "}" - COMMA@1158..1159 "," - WHITESPACE@1159..1164 "\n " - FIELD@1164..1198 - NAME@1164..1174 "langidopts" - WHITESPACE@1174..1177 " " - EQ@1177..1178 "=" - WHITESPACE@1178..1179 " " - CURLY_GROUP@1179..1197 - L_CURLY@1179..1180 "{" - WORD@1180..1196 "variant=american" - R_CURLY@1196..1197 "}" - COMMA@1197..1198 "," - WHITESPACE@1198..1203 "\n " - FIELD@1203..1237 - NAME@1203..1212 "booktitle" - WHITESPACE@1212..1216 " " - EQ@1216..1217 "=" - WHITESPACE@1217..1218 " " - CURLY_GROUP@1218..1236 - L_CURLY@1218..1219 "{" - WORD@1219..1224 "Space" - WHITESPACE@1224..1225 " " - WORD@1225..1228 "and" - WHITESPACE@1228..1229 " " - WORD@1229..1235 "Beyond" - R_CURLY@1235..1236 "}" - COMMA@1236..1237 "," - WHITESPACE@1237..1242 "\n " - FIELD@1242..1297 - NAME@1242..1254 "booksubtitle" - WHITESPACE@1254..1255 " " - EQ@1255..1256 "=" - WHITESPACE@1256..1257 " " - CURLY_GROUP@1257..1296 - L_CURLY@1257..1258 "{" - WORD@1258..1261 "The" - WHITESPACE@1261..1262 " " - WORD@1262..1270 "Frontier" - WHITESPACE@1270..1271 " " - WORD@1271..1276 "Theme" - WHITESPACE@1276..1277 " " - WORD@1277..1279 "in" - WHITESPACE@1279..1280 " " - WORD@1280..1287 "Science" - WHITESPACE@1287..1288 " " - WORD@1288..1295 "Fiction" - R_CURLY@1295..1296 "}" - COMMA@1296..1297 "," - WHITESPACE@1297..1302 "\n " - FIELD@1302..1482 - NAME@1302..1312 "annotation" - WHITESPACE@1312..1315 " " - EQ@1315..1316 "=" - WHITESPACE@1316..1317 " " - CURLY_GROUP@1317..1481 - L_CURLY@1317..1318 "{" - WORD@1318..1322 "This" - WHITESPACE@1322..1323 " " - WORD@1323..1325 "is" - WHITESPACE@1325..1326 " " - WORD@1326..1327 "a" - WHITESPACE@1327..1328 " " - COMMAND@1328..1335 - COMMAND_NAME@1328..1335 "\\texttt" - CURLY_GROUP@1335..1347 - L_CURLY@1335..1336 "{" - WORD@1336..1346 "collection" - R_CURLY@1346..1347 "}" - WHITESPACE@1347..1348 " " - WORD@1348..1354 "entry." - WHITESPACE@1354..1355 " " - WORD@1355..1359 "Note" - WHITESPACE@1359..1360 " " - WORD@1360..1363 "the" - WHITESPACE@1363..1364 " " - WORD@1364..1370 "format" - WHITESPACE@1370..1371 " " - WORD@1371..1373 "of" - WHITESPACE@1373..1374 " " - WORD@1374..1377 "the" - WHITESPACE@1377..1398 "\n " - COMMAND@1398..1405 - COMMAND_NAME@1398..1405 "\\texttt" - CURLY_GROUP@1405..1415 - L_CURLY@1405..1406 "{" - WORD@1406..1414 "location" - R_CURLY@1414..1415 "}" - WHITESPACE@1415..1416 " " - WORD@1416..1421 "field" - WHITESPACE@1421..1422 " " - WORD@1422..1424 "as" - WHITESPACE@1424..1425 " " - WORD@1425..1429 "well" - WHITESPACE@1429..1430 " " - WORD@1430..1432 "as" - WHITESPACE@1432..1433 " " - WORD@1433..1436 "the" - WHITESPACE@1436..1437 " " - COMMAND@1437..1444 - COMMAND_NAME@1437..1444 "\\texttt" - CURLY_GROUP@1444..1454 - L_CURLY@1444..1445 "{" - WORD@1445..1453 "subtitle" - R_CURLY@1453..1454 "}" - WHITESPACE@1454..1475 "\n " - WORD@1475..1480 "field" - R_CURLY@1480..1481 "}" - COMMA@1481..1482 "," - WHITESPACE@1482..1483 "\n" - R_DELIM@1483..1484 "}" - diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_003.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_003.snap deleted file mode 100644 index 360b133a8e..0000000000 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__biblatex_examples_003.snap +++ /dev/null @@ -1,208 +0,0 @@ ---- -source: src/syntax/bibtex/tests.rs -assertion_line: 109 -expression: "setup(r#\"@article{angenendt,\n author = {Angenendt, Arnold},\n title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der\n Patrozinienkunde},\n journaltitle = {Revue d'Histoire Eccl{\\'e}siastique},\n date = 2002,\n volume = 97,\n pages = {431--456, 791--823},\n langid = {german},\n indextitle = {In Honore Salvatoris},\n shorttitle = {In Honore Salvatoris},\n annotation = {A German article in a French journal. Apart from that, a\n typical \\texttt{article} entry. Note the \\texttt{indextitle}\n field},\n}\"#)" ---- -ROOT@0..616 - ENTRY@0..616 - TYPE@0..8 "@article" - L_DELIM@8..9 "{" - NAME@9..18 "angenendt" - COMMA@18..19 "," - WHITESPACE@19..24 "\n " - FIELD@24..59 - NAME@24..30 "author" - WHITESPACE@30..37 " " - EQ@37..38 "=" - WHITESPACE@38..39 " " - CURLY_GROUP@39..58 - L_CURLY@39..40 "{" - WORD@40..49 "Angenendt" - COMMA@49..50 "," - WHITESPACE@50..51 " " - WORD@51..57 "Arnold" - R_CURLY@57..58 "}" - COMMA@58..59 "," - WHITESPACE@59..64 "\n " - FIELD@64..166 - NAME@64..69 "title" - WHITESPACE@69..77 " " - EQ@77..78 "=" - WHITESPACE@78..79 " " - CURLY_GROUP@79..165 - L_CURLY@79..80 "{" - WORD@80..82 "In" - WHITESPACE@82..83 " " - WORD@83..89 "Honore" - WHITESPACE@89..90 " " - WORD@90..100 "Salvatoris" - NBSP@100..101 "~" - WORD@101..103 "--" - WHITESPACE@103..104 " " - WORD@104..107 "Vom" - WHITESPACE@107..108 " " - WORD@108..112 "Sinn" - WHITESPACE@112..113 " " - WORD@113..116 "und" - WHITESPACE@116..117 " " - WORD@117..123 "Unsinn" - WHITESPACE@123..124 " " - WORD@124..127 "der" - WHITESPACE@127..148 "\n " - WORD@148..164 "Patrozinienkunde" - R_CURLY@164..165 "}" - COMMA@165..166 "," - WHITESPACE@166..171 "\n " - FIELD@171..224 - NAME@171..183 "journaltitle" - WHITESPACE@183..184 " " - EQ@184..185 "=" - WHITESPACE@185..186 " " - CURLY_GROUP@186..223 - L_CURLY@186..187 "{" - WORD@187..192 "Revue" - WHITESPACE@192..193 " " - WORD@193..203 "d'Histoire" - WHITESPACE@203..204 " " - WORD@204..208 "Eccl" - CURLY_GROUP@208..213 - L_CURLY@208..209 "{" - ACCENT@209..212 - ACCENT_NAME@209..211 "\\'" - WORD@211..212 "e" - R_CURLY@212..213 "}" - WORD@213..222 "siastique" - R_CURLY@222..223 "}" - COMMA@223..224 "," - WHITESPACE@224..229 "\n " - FIELD@229..249 - NAME@229..233 "date" - WHITESPACE@233..242 " " - EQ@242..243 "=" - WHITESPACE@243..244 " " - LITERAL@244..248 - INTEGER@244..248 "2002" - COMMA@248..249 "," - WHITESPACE@249..254 "\n " - FIELD@254..272 - NAME@254..260 "volume" - WHITESPACE@260..267 " " - EQ@267..268 "=" - WHITESPACE@268..269 " " - LITERAL@269..271 - INTEGER@269..271 "97" - COMMA@271..272 "," - WHITESPACE@272..277 "\n " - FIELD@277..313 - NAME@277..282 "pages" - WHITESPACE@282..290 " " - EQ@290..291 "=" - WHITESPACE@291..292 " " - CURLY_GROUP@292..312 - L_CURLY@292..293 "{" - WORD@293..301 "431--456" - COMMA@301..302 "," - WHITESPACE@302..303 " " - WORD@303..311 "791--823" - R_CURLY@311..312 "}" - COMMA@312..313 "," - WHITESPACE@313..318 "\n " - FIELD@318..342 - NAME@318..324 "langid" - WHITESPACE@324..331 " " - EQ@331..332 "=" - WHITESPACE@332..333 " " - CURLY_GROUP@333..341 - L_CURLY@333..334 "{" - WORD@334..340 "german" - R_CURLY@340..341 "}" - COMMA@341..342 "," - WHITESPACE@342..347 "\n " - FIELD@347..385 - NAME@347..357 "indextitle" - WHITESPACE@357..360 " " - EQ@360..361 "=" - WHITESPACE@361..362 " " - CURLY_GROUP@362..384 - L_CURLY@362..363 "{" - WORD@363..365 "In" - WHITESPACE@365..366 " " - WORD@366..372 "Honore" - WHITESPACE@372..373 " " - WORD@373..383 "Salvatoris" - R_CURLY@383..384 "}" - COMMA@384..385 "," - WHITESPACE@385..390 "\n " - FIELD@390..428 - NAME@390..400 "shorttitle" - WHITESPACE@400..403 " " - EQ@403..404 "=" - WHITESPACE@404..405 " " - CURLY_GROUP@405..427 - L_CURLY@405..406 "{" - WORD@406..408 "In" - WHITESPACE@408..409 " " - WORD@409..415 "Honore" - WHITESPACE@415..416 " " - WORD@416..426 "Salvatoris" - R_CURLY@426..427 "}" - COMMA@427..428 "," - WHITESPACE@428..433 "\n " - FIELD@433..614 - NAME@433..443 "annotation" - WHITESPACE@443..446 " " - EQ@446..447 "=" - WHITESPACE@447..448 " " - CURLY_GROUP@448..613 - L_CURLY@448..449 "{" - WORD@449..450 "A" - WHITESPACE@450..451 " " - WORD@451..457 "German" - WHITESPACE@457..458 " " - WORD@458..465 "article" - WHITESPACE@465..466 " " - WORD@466..468 "in" - WHITESPACE@468..469 " " - WORD@469..470 "a" - WHITESPACE@470..471 " " - WORD@471..477 "French" - WHITESPACE@477..478 " " - WORD@478..486 "journal." - WHITESPACE@486..487 " " - WORD@487..492 "Apart" - WHITESPACE@492..493 " " - WORD@493..497 "from" - WHITESPACE@497..498 " " - WORD@498..502 "that" - COMMA@502..503 "," - WHITESPACE@503..504 " " - WORD@504..505 "a" - WHITESPACE@505..526 "\n " - WORD@526..533 "typical" - WHITESPACE@533..534 " " - COMMAND@534..541 - COMMAND_NAME@534..541 "\\texttt" - CURLY_GROUP@541..550 - L_CURLY@541..542 "{" - WORD@542..549 "article" - R_CURLY@549..550 "}" - WHITESPACE@550..551 " " - WORD@551..557 "entry." - WHITESPACE@557..558 " " - WORD@558..562 "Note" - WHITESPACE@562..563 " " - WORD@563..566 "the" - WHITESPACE@566..567 " " - COMMAND@567..574 - COMMAND_NAME@567..574 "\\texttt" - CURLY_GROUP@574..586 - L_CURLY@574..575 "{" - WORD@575..585 "indextitle" - R_CURLY@585..586 "}" - WHITESPACE@586..607 "\n " - WORD@607..612 "field" - R_CURLY@612..613 "}" - COMMA@613..614 "," - WHITESPACE@614..615 "\n" - R_DELIM@615..616 "}" - diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__comment.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__comment.snap deleted file mode 100644 index 3267517c49..0000000000 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__comment.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: src/syntax/bibtex/tests.rs -assertion_line: 16 -expression: "setup(r#\"@comment{aksin,\n author = {Aks{\\i}n, {\\\"O}zge and T{\\\"u}rkmen, Hayati and Artok, Levent\n and {\\c{C}}etinkaya, Bekir and Ni, Chaoying and\n B{\\\"u}y{\\\"u}kg{\\\"u}ng{\\\"o}r, Orhan and {\\\"O}zkal, Erhan},\n title = {Effect of immobilization on catalytic characteristics of\n saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}\n reactions},\n journaltitle = jomch,\n date = 2006,\n volume = 691,\n number = 13,\n pages = {3027-3036},\n indextitle = {Effect of immobilization on catalytic characteristics},\n}\"#)" ---- -ROOT@0..637 - TYPE@0..8 "@comment" - JUNK@8..637 "{aksin,\n author ..." - diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__entry_colon.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__entry_colon.snap deleted file mode 100644 index bff11a8d5a..0000000000 --- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__tests__entry_colon.snap +++ /dev/null @@ -1,51 +0,0 @@ ---- -source: src/syntax/bibtex/tests.rs -assertion_line: 36 -expression: "setup(r#\"@article{foo:2019,\n author = {Foo Bar},\n title = {Baz Qux},\n year = {2019},\n}\"#)" ---- -ROOT@0..86 - ENTRY@0..86 - TYPE@0..8 "@article" - L_DELIM@8..9 "{" - NAME@9..17 "foo:2019" - COMMA@17..18 "," - WHITESPACE@18..23 "\n " - FIELD@23..42 - NAME@23..29 "author" - WHITESPACE@29..30 " " - EQ@30..31 "=" - WHITESPACE@31..32 " " - CURLY_GROUP@32..41 - L_CURLY@32..33 "{" - WORD@33..36 "Foo" - WHITESPACE@36..37 " " - WORD@37..40 "Bar" - R_CURLY@40..41 "}" - COMMA@41..42 "," - WHITESPACE@42..47 "\n " - FIELD@47..65 - NAME@47..52 "title" - WHITESPACE@52..53 " " - EQ@53..54 "=" - WHITESPACE@54..55 " " - CURLY_GROUP@55..64 - L_CURLY@55..56 "{" - WORD@56..59 "Baz" - WHITESPACE@59..60 " " - WORD@60..63 "Qux" - R_CURLY@63..64 "}" - COMMA@64..65 "," - WHITESPACE@65..70 "\n " - FIELD@70..84 - NAME@70..74 "year" - WHITESPACE@74..75 " " - EQ@75..76 "=" - WHITESPACE@76..77 " " - CURLY_GROUP@77..83 - L_CURLY@77..78 "{" - INTEGER@78..82 "2019" - R_CURLY@82..83 "}" - COMMA@83..84 "," - WHITESPACE@84..85 "\n" - R_DELIM@85..86 "}" - diff --git a/support/texlab/src/syntax/bibtex/tests.rs b/support/texlab/src/syntax/bibtex/tests.rs deleted file mode 100644 index 8dce0e2df9..0000000000 --- a/support/texlab/src/syntax/bibtex/tests.rs +++ /dev/null @@ -1,126 +0,0 @@ -use insta::assert_debug_snapshot; - -use super::{parse, SyntaxNode}; - -fn setup(input: &str) -> SyntaxNode { - SyntaxNode::new_root(parse(input)) -} - -#[test] -fn test_preamble() { - assert_debug_snapshot!(setup(r#"@preamble{"Hello World!"}"#)); -} - -#[test] -fn test_comment() { - assert_debug_snapshot!(setup( - r#"@comment{aksin, - author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent - and {\c{C}}etinkaya, Bekir and Ni, Chaoying and - B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, - title = {Effect of immobilization on catalytic characteristics of - saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck} - reactions}, - journaltitle = jomch, - date = 2006, - volume = 691, - number = 13, - pages = {3027-3036}, - indextitle = {Effect of immobilization on catalytic characteristics}, -}"# - )); -} - -#[test] -fn test_entry_colon() { - assert_debug_snapshot!(setup( - r#"@article{foo:2019, - author = {Foo Bar}, - title = {Baz Qux}, - year = {2019}, -}"# - )); -} - -#[test] -fn test_biblatex_examples_001() { - assert_debug_snapshot!(setup( - r#"@incollection{westfahl:space, - author = {Westfahl, Gary}, - title = {The True Frontier}, - subtitle = {Confronting and Avoiding the Realities of Space in {American} - Science Fiction Films}, - pages = {55-65}, - crossref = {westfahl:frontier}, - langid = {english}, - langidopts = {variant=american}, - indextitle = {True Frontier, The}, - annotation = {A cross-referenced article from a \texttt{collection}. This is - an \texttt{incollection} entry with a \texttt{crossref} - field. Note the \texttt{subtitle} and \texttt{indextitle} - fields}, -} - -% booktitle and booksubtitle are only needed for BibTeX's less sophisticated -% inheritance set-up to make sure westfahl:space shows correctly. -% With Biber they are not needed. -@collection{westfahl:frontier, - editor = {Westfahl, Gary}, - title = {Space and Beyond}, - date = 2000, - subtitle = {The Frontier Theme in Science Fiction}, - publisher = {Greenwood}, - location = {Westport, Conn. and London}, - langid = {english}, - langidopts = {variant=american}, - booktitle = {Space and Beyond}, - booksubtitle = {The Frontier Theme in Science Fiction}, - annotation = {This is a \texttt{collection} entry. Note the format of the - \texttt{location} field as well as the \texttt{subtitle} - field}, -}"# - )); -} - -#[test] -fn test_biblatex_examples_002() { - assert_debug_snapshot!(setup( - r#"@string{jomch = {J.~Organomet. Chem.}} - -@article{aksin, - author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent - and {\c{C}}etinkaya, Bekir and Ni, Chaoying and - B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, - title = {Effect of immobilization on catalytic characteristics of - saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck} - reactions}, - journaltitle = jomch, - date = 2006, - volume = 691, - number = 13, - pages = {3027-3036}, - indextitle = {Effect of immobilization on catalytic characteristics}, -}"# - )); -} - -#[test] -fn test_biblatex_examples_003() { - assert_debug_snapshot!(setup( - r#"@article{angenendt, - author = {Angenendt, Arnold}, - title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der - Patrozinienkunde}, - journaltitle = {Revue d'Histoire Eccl{\'e}siastique}, - date = 2002, - volume = 97, - pages = {431--456, 791--823}, - langid = {german}, - indextitle = {In Honore Salvatoris}, - shorttitle = {In Honore Salvatoris}, - annotation = {A German article in a French journal. Apart from that, a - typical \texttt{article} entry. Note the \texttt{indextitle} - field}, -}"# - )); -} diff --git a/support/texlab/src/syntax/build_log.rs b/support/texlab/src/syntax/build_log.rs deleted file mode 100644 index af03e51d11..0000000000 --- a/support/texlab/src/syntax/build_log.rs +++ /dev/null @@ -1,1332 +0,0 @@ -use std::{cmp::Ordering, path::PathBuf}; - -use once_cell::sync::Lazy; -use regex::{Match, Regex}; - -#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Hash)] -pub enum BuildErrorLevel { - Error, - Warning, -} - -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub struct BuildError { - pub relative_path: PathBuf, - pub level: BuildErrorLevel, - pub message: String, - pub line: Option<u32>, -} - -const MAX_LINE_LENGTH: usize = 79; - -pub static PACKAGE_MESSAGE_REGEX: Lazy<Regex> = - Lazy::new(|| Regex::new("^\\([a-zA-Z_\\-]+\\)\\s*(?P<msg>.*)$").unwrap()); - -pub static FILE_REGEX: Lazy<Regex> = - Lazy::new(|| Regex::new("\\((?P<file>[^\r\n()]+\\.(tex|sty|cls))").unwrap()); - -pub static TEX_ERROR_REGEX: Lazy<Regex> = Lazy::new(|| { - Regex::new("(?m)^! ((?P<msg1>(.|\r|\n)*?)\r?\nl\\.(?P<line>\\d+)|(?P<msg2>[^\r\n]*))").unwrap() -}); - -pub static WARNING_REGEX: Lazy<Regex> = - Lazy::new(|| Regex::new("(LaTeX|Package [a-zA-Z_\\-]+) Warning: (?P<msg>[^\r\n]*)").unwrap()); - -pub static BAD_BOX_REGEX: Lazy<Regex> = Lazy::new(|| { - Regex::new("(?P<msg>(Ov|Und)erfull \\\\[hv]box[^\r\n]*lines? (?P<line>\\d+)[^\r\n]*)").unwrap() -}); - -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub struct Parse { - pub errors: Vec<BuildError>, -} - -pub fn parse(log: &str) -> Parse { - let log = prepare_log(log); - let mut ranges: Vec<FileRange> = FILE_REGEX - .find_iter(&log) - .map(|result| FileRange::create(&log, result)) - .collect(); - ranges.sort(); - - let tex_errors = extract_matches(&log, &ranges, &TEX_ERROR_REGEX, BuildErrorLevel::Error); - let warnings = extract_matches(&log, &ranges, &WARNING_REGEX, BuildErrorLevel::Warning); - let bad_boxes = extract_matches(&log, &ranges, &BAD_BOX_REGEX, BuildErrorLevel::Warning); - - Parse { - errors: vec![tex_errors, warnings, bad_boxes].concat(), - } -} - -fn extract_matches( - log: &str, - ranges: &[FileRange], - regex: &Regex, - level: BuildErrorLevel, -) -> Vec<BuildError> { - let mut errors = Vec::new(); - for result in regex.find_iter(log) { - let captures = regex.captures(&log[result.start()..result.end()]).unwrap(); - let message = captures - .name("msg") - .or_else(|| captures.name("msg1")) - .or_else(|| captures.name("msg2")) - .unwrap() - .as_str() - .lines() - .next() - .unwrap_or_default() - .to_owned(); - - if let Some(range) = ranges.iter().find(|range| range.contains(result.start())) { - let line = captures - .name("line") - .map(|result| result.as_str().parse::<u32>().unwrap() - 1); - - errors.push(BuildError { - relative_path: range.path.clone(), - level, - message, - line, - }); - } - } - errors -} - -fn prepare_log(log: &str) -> String { - let mut old_lines = log.lines(); - let mut new_lines: Vec<String> = Vec::new(); - while let Some(line) = old_lines.next() { - if PACKAGE_MESSAGE_REGEX.is_match(line) { - let captures = PACKAGE_MESSAGE_REGEX.captures(line).unwrap(); - if let Some(last_line) = new_lines.last_mut() { - last_line.push(' '); - last_line.push_str(captures.name("msg").unwrap().as_str()); - } - } else if line.ends_with("...") { - let mut new_line = line[line.len() - 3..].to_owned(); - if let Some(old_line) = old_lines.next() { - new_line.push_str(old_line); - } - new_lines.push(new_line); - } else if line.chars().count() == MAX_LINE_LENGTH { - let mut new_line = String::new(); - new_line.push_str(line); - if let Some(old_line) = old_lines.next() { - new_line.push_str(old_line); - } - new_lines.push(new_line); - } else { - new_lines.push(line.to_owned()); - } - } - new_lines.join("\n") -} - -#[derive(Debug, PartialEq, Eq, Clone)] -struct FileRange { - pub path: PathBuf, - pub start: usize, - pub end: usize, -} - -impl FileRange { - fn create(log: &str, result: Match) -> Self { - let mut balance = 1; - let mut end = result.start() + 1; - let chars = (&log[result.start() + 1..]).chars(); - for c in chars { - if balance <= 0 { - break; - } - - if c == '(' { - balance += 1; - } else if c == ')' { - balance -= 1; - } - end += c.len_utf8(); - } - - let captures = FILE_REGEX.captures(result.as_str()).unwrap(); - let path = PathBuf::from(captures.name("file").unwrap().as_str()); - Self { - path, - start: result.start(), - end, - } - } - - fn len(&self) -> usize { - self.end - self.start + 1 - } - - fn contains(&self, index: usize) -> bool { - index >= self.start && index <= self.end - } -} - -impl Ord for FileRange { - fn cmp(&self, other: &Self) -> Ordering { - self.len().cmp(&other.len()) - } -} - -impl PartialOrd for FileRange { - fn partial_cmp(&self, other: &Self) -> Option<Ordering> { - Some(self.cmp(other)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use insta::assert_debug_snapshot; - - #[test] - fn parse_001() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:50 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -(/TexLive/texmf-dist/tex/latex/multirow/bigstrut.sty -Package: bigstrut 2016/11/25 v2.2 Provide larger struts in tabulars -\bigstrutjot=\dimen103 -) -(/TexLive/texmf-dist/tex/latex/multirow/multirow.sty -Package: multirow 2016/11/25 v2.2 Span multiple rows of a table -\multirow@colwidth=\skip43 -\multirow@cntb=\count87 -\multirow@dima=\skip44 -) (./parent.aux) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. - -Overfull \hbox (200.00162pt too wide) in paragraph at lines 8--9 -[]\OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -[] - -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <7> on input line 11. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <5> on input line 11. - -Overfull \vbox (3.19998pt too high) detected at line 23 -[] - -[1 - -{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) ) -Here is how much of TeX's memory you used: -265 strings out of 492995 -3121 string characters out of 6138727 -55074 words of memory out of 5000000 -3896 multiletter control sequences out of 15000+600000 -3640 words of font info for 14 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -23i,20n,20p,124b,282s stack positions out of 5000i,500n,10000p,200000b,80000s -</ -TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></TexLive/texmf-d -ist/fonts/type1/public/amsfonts/cm/cmr7.pfb> -Output written on parent.pdf (1 page, 17505 bytes). -PDF statistics: -16 PDF objects out of 1000 (max. 8388607) -10 compressed objects within 1 object stream -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![ - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "Overfull \\hbox (200.00162pt too wide) in paragraph at lines 8--9" - .into(), - line: Some(7), - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "Overfull \\vbox (3.19998pt too high) detected at line 23".into(), - line: Some(22), - } - ] - ); - } - - #[test] - fn parse_002() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:52 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) (./parent.aux (./child.aux)) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -(./child.tex -! Undefined control sequence. -l.1 \foo - -The control sequence at the end of the top line -of your error message was never \def'ed. If you have -misspelled it (e.g., `\hobx'), type `I' and the correct -spelling (e.g., `I\hbox'). Otherwise just continue, -and I'll forget about whatever was undefined. - -) (./parent.aux) ) -Here is how much of TeX's memory you used: -205 strings out of 492995 -2149 string characters out of 6138727 -54074 words of memory out of 5000000 -3841 multiletter control sequences out of 15000+600000 -3640 words of font info for 14 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s - -No pages of output. -PDF statistics: -0 PDF objects out of 1000 (max. 8388607) -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![BuildError { - relative_path: "./child.tex".into(), - level: BuildErrorLevel::Error, - message: "Undefined control sequence.".into(), - line: Some(0) - }] - ); - } - - #[test] - fn parse_003() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:51 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) (./parent.aux) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. -LaTeX Font Info: ... okay on input line 4. - -LaTeX Warning: Citation `foo' on page 1 undefined on input line 6. - -[1 - -{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) - -LaTeX Warning: There were undefined references. - -) -Here is how much of TeX's memory you used: -204 strings out of 492995 -2142 string characters out of 6138727 -54074 words of memory out of 5000000 -3842 multiletter control sequences out of 15000+600000 -3948 words of font info for 15 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -23i,4n,21p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s -</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></TexLive/ -texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb> -Output written on parent.pdf (1 page, 17339 bytes). -PDF statistics: -16 PDF objects out of 1000 (max. 8388607) -10 compressed objects within 1 object stream -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![ - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "Citation `foo' on page 1 undefined on input line 6.".into(), - line: None - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "There were undefined references.".into(), - line: None, - } - ] - ); - } - - #[test] - fn parse_004() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:40 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -(/TexLive/texmf-dist/tex/generic/babel/babel.sty -Package: babel 2017/05/19 3.10 The Babel package - -! Package babel Error: Unknown option `foo'. Either you misspelled it -(babel) or the language definition file foo.ldf was not found. - -See the babel package documentation for explanation. -Type H <return> for immediate help. -... - -l.393 \ProcessOptions* - -Valid options are: shorthands=, KeepShorthandsActive, -activeacute, activegrave, noconfigs, safe=, main=, math= -headfoot=, strings=, config=, hyphenmap=, or a language name. - -! Package babel Error: You haven't specified a language option. - -See the babel package documentation for explanation. -Type H <return> for immediate help. -... - -l.426 ...ry to proceed from here, type x to quit.} - -You need to specify a language, either as a global option -or as an optional argument to the \usepackage command; -You shouldn't try to proceed from here, type x to quit. - -) (./parent.aux) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. -LaTeX Font Info: ... okay on input line 5. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. -LaTeX Font Info: ... okay on input line 5. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. -LaTeX Font Info: ... okay on input line 5. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. -LaTeX Font Info: ... okay on input line 5. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. -LaTeX Font Info: ... okay on input line 5. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. -LaTeX Font Info: ... okay on input line 5. -(./parent.aux) ) -Here is how much of TeX's memory you used: -304 strings out of 492995 -3421 string characters out of 6138727 -56035 words of memory out of 5000000 -3938 multiletter control sequences out of 15000+600000 -3640 words of font info for 14 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s - -No pages of output. -PDF statistics: -0 PDF objects out of 1000 (max. 8388607) -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![ - BuildError { - relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty".into(), - level: BuildErrorLevel::Error, - message: "Package babel Error: Unknown option `foo'. Either you misspelled it or the language definition file foo.ldf was not found.".into(), - line: Some(392) - }, - BuildError { - relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty".into(), - level: BuildErrorLevel::Error, - message: "Package babel Error: You haven't specified a language option.".into(), - line: Some(425) - } - ] - ); - } - - #[test] - fn parse_005() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:45 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -(/TexLive/texmf-dist/tex/generic/babel/babel.sty -Package: babel 2017/05/19 3.10 The Babel package - -(/TexLive/texmf-dist/tex/generic/babel-spanish/spanish.ldf -Language: spanish.ldf 2016/03/03 v5.0p Spanish support from the babel system - -(/TexLive/texmf-dist/tex/generic/babel/babel.def -File: babel.def 2017/05/19 3.10 Babel common definitions -\babel@savecnt=\count87 -\U@D=\dimen103 -) -\es@quottoks=\toks14 -\es@quotdepth=\count88 -Package babel Info: Making " an active character on input line 561. -Package babel Info: Making . an active character on input line 662. -Package babel Info: Making < an active character on input line 707. -Package babel Info: Making > an active character on input line 707. -)) -(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.sty -Package: biblatex 2016/12/05 v3.7 programmable bibliographies (PK/JW/AB) - -(/TexLive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty -Package: pdftexcmds 2017/03/19 v0.25 Utility functions of pdfTeX for LuaTeX (HO -) - -(/TexLive/texmf-dist/tex/generic/oberdiek/infwarerr.sty -Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO) -) -(/TexLive/texmf-dist/tex/generic/oberdiek/ifluatex.sty -Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO) -Package ifluatex Info: LuaTeX not detected. -) -(/TexLive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty -Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO) -) -(/TexLive/texmf-dist/tex/generic/oberdiek/ifpdf.sty -Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch -) -Package pdftexcmds Info: LuaTeX not detected. -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -) -(/TexLive/texmf-dist/tex/latex/etoolbox/etoolbox.sty -Package: etoolbox 2017/01/02 v2.4 e-TeX tools for LaTeX (JAW) -\etb@tempcnta=\count89 -) -(/TexLive/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 2014/10/28 v1.15 key=value parser (DPC) -\KV@toks@=\toks15 -) -(/TexLive/texmf-dist/tex/latex/oberdiek/kvoptions.sty -Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO) - -(/TexLive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty -Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO) - -(/TexLive/texmf-dist/tex/generic/oberdiek/etexcmds.sty -Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO) -Package etexcmds Info: Could not find \expanded. -(etexcmds) That can mean that you are not using pdfTeX 1.50 or -(etexcmds) that some package has redefined \expanded. -(etexcmds) In the latter case, load this package earlier. -))) -(/TexLive/texmf-dist/tex/latex/logreq/logreq.sty -Package: logreq 2010/08/04 v1.0 xml request logger -\lrq@indent=\count90 - -(/TexLive/texmf-dist/tex/latex/logreq/logreq.def -File: logreq.def 2010/08/04 v1.0 logreq spec v1.0 -)) -(/TexLive/texmf-dist/tex/latex/base/ifthen.sty -Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) -) -(/TexLive/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip10 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -(/TexLive/texmf-dist/tex/generic/xstring/xstring.sty -(/TexLive/texmf-dist/tex/generic/xstring/xstring.tex -\@xs@message=\write3 -\integerpart=\count91 -\decimalpart=\count92 -) -Package: xstring 2013/10/13 v1.7c String manipulations (C Tellechea) -) -\c@tabx@nest=\count93 -\c@listtotal=\count94 -\c@listcount=\count95 -\c@liststart=\count96 -\c@liststop=\count97 -\c@citecount=\count98 -\c@citetotal=\count99 -\c@multicitecount=\count100 -\c@multicitetotal=\count101 -\c@instcount=\count102 -\c@maxnames=\count103 -\c@minnames=\count104 -\c@maxitems=\count105 -\c@minitems=\count106 -\c@citecounter=\count107 -\c@savedcitecounter=\count108 -\c@uniquelist=\count109 -\c@uniquename=\count110 -\c@refsection=\count111 -\c@refsegment=\count112 -\c@maxextratitle=\count113 -\c@maxextratitleyear=\count114 -\c@maxextrayear=\count115 -\c@maxextraalpha=\count116 -\c@abbrvpenalty=\count117 -\c@highnamepenalty=\count118 -\c@lownamepenalty=\count119 -\c@maxparens=\count120 -\c@parenlevel=\count121 -\blx@tempcnta=\count122 -\blx@tempcntb=\count123 -\blx@tempcntc=\count124 -\blx@maxsection=\count125 -\blx@maxsegment@0=\count126 -\blx@notetype=\count127 -\blx@parenlevel@text=\count128 -\blx@parenlevel@foot=\count129 -\blx@sectionciteorder@0=\count130 -\labelnumberwidth=\skip43 -\labelalphawidth=\skip44 -\biblabelsep=\skip45 -\bibitemsep=\skip46 -\bibnamesep=\skip47 -\bibinitsep=\skip48 -\bibparsep=\skip49 -\bibhang=\skip50 -\blx@bcfin=\read1 -\blx@bcfout=\write4 -\c@mincomprange=\count131 -\c@maxcomprange=\count132 -\c@mincompwidth=\count133 -Package biblatex Info: Trying to load biblatex default data model... -Package biblatex Info: ... file 'blx-dm.def' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/blx-dm.def) -Package biblatex Info: Trying to load biblatex style data model... -Package biblatex Info: ... file 'ieee.dbx' not found. -Package biblatex Info: Trying to load biblatex custom data model... -Package biblatex Info: ... file 'biblatex-dm.cfg' not found. -\c@afterword=\count134 -\c@savedafterword=\count135 -\c@annotator=\count136 -\c@savedannotator=\count137 -\c@author=\count138 -\c@savedauthor=\count139 -\c@bookauthor=\count140 -\c@savedbookauthor=\count141 -\c@commentator=\count142 -\c@savedcommentator=\count143 -\c@editor=\count144 -\c@savededitor=\count145 -\c@editora=\count146 -\c@savededitora=\count147 -\c@editorb=\count148 -\c@savededitorb=\count149 -\c@editorc=\count150 -\c@savededitorc=\count151 -\c@foreword=\count152 -\c@savedforeword=\count153 -\c@holder=\count154 -\c@savedholder=\count155 -\c@introduction=\count156 -\c@savedintroduction=\count157 -\c@namea=\count158 -\c@savednamea=\count159 -\c@nameb=\count160 -\c@savednameb=\count161 -\c@namec=\count162 -\c@savednamec=\count163 -\c@translator=\count164 -\c@savedtranslator=\count165 -\c@shortauthor=\count166 -\c@savedshortauthor=\count167 -\c@shorteditor=\count168 -\c@savedshorteditor=\count169 -\c@labelname=\count170 -\c@savedlabelname=\count171 -\c@institution=\count172 -\c@savedinstitution=\count173 -\c@lista=\count174 -\c@savedlista=\count175 -\c@listb=\count176 -\c@savedlistb=\count177 -\c@listc=\count178 -\c@savedlistc=\count179 -\c@listd=\count180 -\c@savedlistd=\count181 -\c@liste=\count182 -\c@savedliste=\count183 -\c@listf=\count184 -\c@savedlistf=\count185 -\c@location=\count186 -\c@savedlocation=\count187 -\c@organization=\count188 -\c@savedorganization=\count189 -\c@origlocation=\count190 -\c@savedoriglocation=\count191 -\c@origpublisher=\count192 -\c@savedorigpublisher=\count193 -\c@publisher=\count194 -\c@savedpublisher=\count195 -\c@language=\count196 -\c@savedlanguage=\count197 -\c@pageref=\count198 -\c@savedpageref=\count199 -\shorthandwidth=\skip51 -\shortjournalwidth=\skip52 -\shortserieswidth=\skip53 -\shorttitlewidth=\skip54 -\shortauthorwidth=\skip55 -\shorteditorwidth=\skip56 -Package biblatex Info: Trying to load compatibility code... -Package biblatex Info: ... file 'blx-compat.def' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/blx-compat.def -File: blx-compat.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB) -) -Package biblatex Info: Trying to load generic definitions... -Package biblatex Info: ... file 'biblatex.def' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.def -File: biblatex.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB) -\c@textcitecount=\count266 -\c@textcitetotal=\count267 -\c@textcitemaxnames=\count268 -\c@biburlnumpenalty=\count269 -\c@biburlucpenalty=\count270 -\c@biburllcpenalty=\count271 -\c@smartand=\count272 -) -Package biblatex Info: Trying to load bibliography style 'ieee'... -Package biblatex Info: ... file 'ieee.bbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.bbx -File: ieee.bbx 2017/03/27 v1.2d biblatex bibliography style -Package biblatex Info: Trying to load bibliography style 'numeric-comp'... -Package biblatex Info: ... file 'numeric-comp.bbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric-comp.bbx -File: numeric-comp.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) -Package biblatex Info: Trying to load bibliography style 'numeric'... -Package biblatex Info: ... file 'numeric.bbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx -File: numeric.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) -Package biblatex Info: Trying to load bibliography style 'standard'... -Package biblatex Info: ... file 'standard.bbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/bbx/standard.bbx -File: standard.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB) -\c@bbx:relatedcount=\count273 -\c@bbx:relatedtotal=\count274 -)))) -Package biblatex Info: Trying to load citation style 'ieee'... -Package biblatex Info: ... file 'ieee.cbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.cbx -File: ieee.cbx 2017/03/27 v1.2d biblatex citation style -Package biblatex Info: Trying to load citation style 'numeric-comp'... -Package biblatex Info: ... file 'numeric-comp.cbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/cbx/numeric-comp.cbx -File: numeric-comp.cbx 2016/12/05 v3.7 biblatex citation style (PK/JW/AB) -\c@cbx@tempcnta=\count275 -\c@cbx@tempcntb=\count276 -Package biblatex Info: Redefining '\cite'. -Package biblatex Info: Redefining '\parencite'. -Package biblatex Info: Redefining '\footcite'. -Package biblatex Info: Redefining '\footcitetext'. -Package biblatex Info: Redefining '\smartcite'. -Package biblatex Info: Redefining '\supercite'. -Package biblatex Info: Redefining '\textcite'. -Package biblatex Info: Redefining '\textcites'. -Package biblatex Info: Redefining '\cites'. -Package biblatex Info: Redefining '\parencites'. -Package biblatex Info: Redefining '\smartcites'. -) -Package biblatex Info: Redefining '\cite'. -Package biblatex Info: Redefining '\cites'. -) -Package biblatex Info: Trying to load configuration file... -Package biblatex Info: ... file 'biblatex.cfg' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.cfg -File: biblatex.cfg -)) -Package biblatex Info: Trying to load language 'spanish'... -Package biblatex Info: ... file 'spanish.lbx' found. - -(/TexLive/texmf-dist/tex/latex/biblatex/lbx/spanish.lbx -File: spanish.lbx 2016/12/05 v3.7 biblatex localization (PK/JW/AB) -) - -Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing. -(biblatex) Loading 'csquotes' recommended. - -\@quotelevel=\count277 -\@quotereset=\count278 -(./parent.aux) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6. -LaTeX Font Info: ... okay on input line 6. -LaTeX Info: Redefining \sptext on input line 6. -LaTeX Info: Redefining \. on input line 6. -LaTeX Info: Redefining \% on input line 6. -Package biblatex Info: No input encoding detected. -(biblatex) Assuming 'ascii'. -Package biblatex Info: Automatic encoding selection. -(biblatex) Assuming data encoding 'ascii'. -\openout4 = `parent.bcf'. - -Package biblatex Info: Trying to load bibliographic data... -Package biblatex Info: ... file 'parent.bbl' not found. - -No file parent.bbl. -Package biblatex Info: Reference section=0 on input line 6. -Package biblatex Info: Reference segment=0 on input line 6. -(./parent.aux) - -LaTeX Warning: There were undefined references. - -Package biblatex Warning: Please (re)run Biber on the file: -(biblatex) parent -(biblatex) and rerun LaTeX afterwards. - -Package logreq Info: Writing requests to 'parent.run.xml'. -\openout1 = `parent.run.xml'. - -) -Here is how much of TeX's memory you used: -7717 strings out of 492995 -133301 string characters out of 6138727 -557258 words of memory out of 5000000 -11248 multiletter control sequences out of 15000+600000 -3640 words of font info for 14 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -35i,1n,30p,856b,700s stack positions out of 5000i,500n,10000p,200000b,80000s - -No pages of output. -PDF statistics: -0 PDF objects out of 1000 (max. 8388607) -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![ - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "'babel/polyglossia' detected but 'csquotes' missing. Loading 'csquotes' recommended.".into(), - line: None - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "There were undefined references.".into(), - line: None, - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Warning, - message: "Please (re)run Biber on the file: parent and rerun LaTeX afterwards.".into(), - line: None - } - ] - ); - } - - #[test] - fn parse_006() { - let log = r#" -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:33 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**./parent.tex -(./parent.tex -LaTeX2e <2017-04-15> -Babel <3.10> and hyphenation patterns for 84 language(s) loaded. -(/TexLive/texmf-dist/tex/latex/base/article.cls -Document Class: article 2014/09/29 v1.4h Standard LaTeX document class -(/TexLive/texmf-dist/tex/latex/base/size10.clo -File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@section=\count80 -\c@subsection=\count81 -\c@subsubsection=\count82 -\c@paragraph=\count83 -\c@subparagraph=\count84 -\c@figure=\count85 -\c@table=\count86 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) (./parent.aux -(./child.tex.aux)) -\openout1 = `parent.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -\openout2 = `child.aux'. - -(./child.tex) -! Undefined control sequence. -l.7 \foo - -The control sequence at the end of the top line -of your error message was never \def'ed. If you have -misspelled it (e.g., `\hobx'), type `I' and the correct -spelling (e.g., `I\hbox'). Otherwise just continue, -and I'll forget about whatever was undefined. - -! Missing $ inserted. -<inserted text> - $ -l.8 \bar - -I've inserted a begin-math/end-math symbol since I think -you left one out. Proceed, with fingers crossed. - -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <7> on input line 8. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <5> on input line 8. -! Undefined control sequence. -l.9 \baz - -The control sequence at the end of the top line -of your error message was never \def'ed. If you have -misspelled it (e.g., `\hobx'), type `I' and the correct -spelling (e.g., `I\hbox'). Otherwise just continue, -and I'll forget about whatever was undefined. - -! Missing { inserted. -<to be read again> - \par -l.10 - -A left brace was mandatory here, so I've put one in. -You might want to delete and/or insert some corrections -so that I will find a matching right brace soon. -(If you're confused by all this, try typing `I}' now.) - -! Missing $ inserted. -<inserted text> - $ -l.10 - -I've inserted a begin-math/end-math symbol since I think -you left one out. Proceed, with fingers crossed. - -! Missing } inserted. -<inserted text> - } -l.10 - -I've inserted something that you may have forgotten. -(See the <inserted text> above.) -With luck, this will get me unwedged. But if you -really didn't forget anything, try typing `2' now; then -my insertion and my current dilemma will both disappear. - -[1 - -{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux -(./child.aux)) ) -Here is how much of TeX's memory you used: -212 strings out of 492995 -2238 string characters out of 6138727 -54074 words of memory out of 5000000 -3843 multiletter control sequences out of 15000+600000 -3640 words of font info for 14 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -23i,4n,17p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s -</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb -> -Output written on parent.pdf (1 page, 8329 bytes). -PDF statistics: -12 PDF objects out of 1000 (max. 8388607) -7 compressed objects within 1 object stream -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_eq!( - parse(log).errors, - vec![ - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Undefined control sequence.".into(), - line: Some(6) - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Missing $ inserted.".into(), - line: Some(7) - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Undefined control sequence.".into(), - line: Some(8) - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Missing { inserted.".into(), - line: Some(9) - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Missing $ inserted.".into(), - line: Some(9) - }, - BuildError { - relative_path: "./parent.tex".into(), - level: BuildErrorLevel::Error, - message: "Missing } inserted.".into(), - line: Some(9) - }, - ] - ); - } - - #[test] - fn parse_007() { - let log = r#" -This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/W32TeX) (preloaded format=pdflatex 2021.6.19) 5 NOV 2021 19:10 -entering extended mode -restricted \write18 enabled. -%&-line parsing enabled. -**/some/folder/a.tex -(/some/folder/a.tex -LaTeX2e <2021-06-01> patch level 1 -L3 programming layer <2021-06-18> -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrartcl.cls -Document Class: scrartcl 2021/03/17 v3.33 KOMA-Script document class (article) -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrkbase.sty -Package: scrkbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-dependent b -asics and keyval usage) - -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrbase.sty -Package: scrbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-independent -basics and keyval usage) - -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile.sty -Package: scrlfile 2021/03/17 v3.33 KOMA-Script package (file load hooks) - -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty -Package: scrlfile-hook 2021/03/17 v3.33 KOMA-Script package (using LaTeX hooks) - - -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlogo.sty -Package: scrlogo 2021/03/17 v3.33 KOMA-Script package (logo) -))) -(/texlive/2021/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 2014/10/28 v1.15 key=value parser (DPC) -\KV@toks@=\toks16 -) -Applying: [2021/05/01] Usage of raw option list on input line 252. -Already applied: [0000/00/00] compatibility for LaTeX before 2021/05/01 on inpu -t line 337. -)) -==> First Aid for scrkbase.sty no longer applied! -(/texlive/2021/texmf-dist/tex/latex/koma-script/tocbasic.sty -Package: tocbasic 2021/03/17 v3.33 KOMA-Script package (handling toc-files) -\scr@dte@tocline@numberwidth=\skip47 -\scr@dte@tocline@numbox=\box50 -) -Package tocbasic Info: babel extension for `toc' omitted -(tocbasic) because of missing \bbl@set@language on input line 135. -Class scrartcl Info: File `scrsize11pt.clo' used instead of -(scrartcl) file `scrsize11.clo' to setup font sizes on input line 223 -9. - -(/texlive/2021/texmf-dist/tex/latex/koma-script/scrsize11pt.clo -File: scrsize11pt.clo 2021/03/17 v3.33 KOMA-Script font size class option (11pt -) -) -(/texlive/2021/texmf-dist/tex/latex/koma-script/typearea.sty -Package: typearea 2021/03/17 v3.33 KOMA-Script package (type area) -\ta@bcor=\skip48 -\ta@div=\count182 -\ta@hblk=\skip49 -\ta@vblk=\skip50 -\ta@temp=\skip51 -\footheight=\skip52 -Package typearea Info: These are the values describing the layout: -(typearea) DIV = 10 -(typearea) BCOR = 0.0pt -(typearea) \paperwidth = 597.50793pt -(typearea) \textwidth = 418.25555pt -(typearea) DIV departure = -6% -(typearea) \evensidemargin = 17.3562pt -(typearea) \oddsidemargin = 17.3562pt -(typearea) \paperheight = 845.04694pt -(typearea) \textheight = 595.80026pt -(typearea) \topmargin = -25.16531pt -(typearea) \headheight = 17.0pt -(typearea) \headsep = 20.40001pt -(typearea) \topskip = 11.0pt -(typearea) \footskip = 47.6pt -(typearea) \baselineskip = 13.6pt -(typearea) on input line 1741. -) -\c@part=\count183 -\c@section=\count184 -\c@subsection=\count185 -\c@subsubsection=\count186 -\c@paragraph=\count187 -\c@subparagraph=\count188 -\scr@dte@section@maxnumwidth=\skip53 -Class scrartcl Info: using compatibility default `runin=bysign' -(scrartcl) for `\section on input line 4846. -Class scrartcl Info: using compatibility default `afterindent=bysign' -(scrartcl) for `\section on input line 4846. -\scr@dte@part@maxnumwidth=\skip54 -Class scrartcl Info: using compatibility default `afterindent=false' -(scrartcl) for `\part on input line 4854. -\scr@dte@subsection@maxnumwidth=\skip55 -Class scrartcl Info: using compatibility default `runin=bysign' -(scrartcl) for `\subsection on input line 4864. -Class scrartcl Info: using compatibility default `afterindent=bysign' -(scrartcl) for `\subsection on input line 4864. -\scr@dte@subsubsection@maxnumwidth=\skip56 -Class scrartcl Info: using compatibility default `runin=bysign' -(scrartcl) for `\subsubsection on input line 4874. -Class scrartcl Info: using compatibility default `afterindent=bysign' -(scrartcl) for `\subsubsection on input line 4874. -\scr@dte@paragraph@maxnumwidth=\skip57 -Class scrartcl Info: using compatibility default `runin=bysign' -(scrartcl) for `\paragraph on input line 4885. -Class scrartcl Info: using compatibility default `afterindent=bysign' -(scrartcl) for `\paragraph on input line 4885. -\scr@dte@subparagraph@maxnumwidth=\skip58 -Class scrartcl Info: using compatibility default `runin=bysign' -(scrartcl) for `\subparagraph on input line 4895. -Class scrartcl Info: using compatibility default `afterindent=bysign' -(scrartcl) for `\subparagraph on input line 4895. -\abovecaptionskip=\skip59 -\belowcaptionskip=\skip60 -\c@pti@nb@sid@b@x=\box51 -Package tocbasic Info: babel extension for `lof' omitted -(tocbasic) because of missing \bbl@set@language on input line 6127. - -\scr@dte@figure@maxnumwidth=\skip61 -\c@figure=\count189 -Package tocbasic Info: babel extension for `lot' omitted -(tocbasic) because of missing \bbl@set@language on input line 6139. - -\scr@dte@table@maxnumwidth=\skip62 -\c@table=\count190 -Class scrartcl Info: Redefining `\numberline' on input line 6303. -\bibindent=\dimen138 -) -(/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def -File: l3backend-pdftex.def 2021-05-07 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count191 -\l__pdf_internal_box=\box52 -) (./a.aux) -\openout1 = `a.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3. -LaTeX Font Info: ... okay on input line 3. -Package scrbase Info: activating english \contentsname on input line 3. -Package scrbase Info: activating english \listfigurename on input line 3. -Package scrbase Info: activating english \listtablename on input line 3. -! Undefined control sequence. -l.4 \lsdkfjlskdfj - -The control sequence at the end of the top line -of your error message was never \def'ed. If you have -misspelled it (e.g., `\hobx'), type `I' and the correct -spelling (e.g., `I\hbox'). Otherwise just continue, -and I'll forget about whatever was undefined. - -(./a.aux) ) -Here is how much of TeX's memory you used: -3199 strings out of 478510 -74549 string characters out of 5853586 -510929 words of memory out of 5000000 -21227 multiletter control sequences out of 15000+600000 -403730 words of font info for 28 fonts, out of 8000000 for 9000 -1141 hyphenation exceptions out of 8191 -108i,1n,108p,10625b,270s stack positions out of 5000i,500n,10000p,200000b,80000s - -No pages of output. -PDF statistics: -0 PDF objects out of 1000 (max. 8388607) -0 named destinations out of 1000 (max. 500000) -1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - - assert_debug_snapshot!(parse(log).errors); - } -} diff --git a/support/texlab/src/syntax/latex.rs b/support/texlab/src/syntax/latex.rs index 2d8918e49e..ce1ca125fd 100644 --- a/support/texlab/src/syntax/latex.rs +++ b/support/texlab/src/syntax/latex.rs @@ -1,14 +1,9 @@ -mod analysis; mod cst; mod kind; -mod lexer; -mod parser; pub use self::{ - analysis::*, cst::*, kind::SyntaxKind::{self, *}, - parser::{parse, Parse}, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] diff --git a/support/texlab/src/syntax/latex/analysis.rs b/support/texlab/src/syntax/latex/analysis.rs deleted file mode 100644 index 02d9b315ba..0000000000 --- a/support/texlab/src/syntax/latex/analysis.rs +++ /dev/null @@ -1,40 +0,0 @@ -mod command; -mod distro_file; -mod environment; -mod explicit_link; -mod graphics_path; -mod implicit_link; -mod label_name; -mod label_number; -mod theorem; -mod types; - -use crate::syntax::latex; - -pub use self::types::*; -use self::{ - command::{analyze_command, analyze_command_definition}, - environment::analyze_begin, - explicit_link::{analyze_import, analyze_include}, - graphics_path::analyze_graphics_path, - implicit_link::analyze_implicit_links, - label_name::analyze_label_name, - label_number::analyze_label_number, - theorem::analyze_theorem_definition, -}; - -pub fn analyze(context: &mut LatexAnalyzerContext, root: &latex::SyntaxNode) { - analyze_implicit_links(context); - for node in root.descendants() { - analyze_command(context, node.clone()) - .or_else(|| analyze_command_definition(context, node.clone())) - .or_else(|| analyze_begin(context, node.clone())) - .or_else(|| analyze_include(context, node.clone())) - .or_else(|| analyze_import(context, node.clone())) - .or_else(|| analyze_label_name(context, node.clone())) - .or_else(|| analyze_label_number(context, node.clone())) - .or_else(|| analyze_theorem_definition(context, node.clone())) - .or_else(|| analyze_graphics_path(context, node)); - } - context.extras.has_document_environment = context.extras.environment_names.contains("document"); -} diff --git a/support/texlab/src/syntax/latex/analysis/command.rs b/support/texlab/src/syntax/latex/analysis/command.rs deleted file mode 100644 index 60aceef725..0000000000 --- a/support/texlab/src/syntax/latex/analysis/command.rs +++ /dev/null @@ -1,26 +0,0 @@ -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::LatexAnalyzerContext; - -pub fn analyze_command(context: &mut LatexAnalyzerContext, node: latex::SyntaxNode) -> Option<()> { - let command = latex::GenericCommand::cast(node)?; - context - .extras - .command_names - .insert(command.name()?.text().into()); - Some(()) -} - -pub fn analyze_command_definition( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let definition = latex::CommandDefinition::cast(node)?; - context - .extras - .command_names - .insert(definition.name()?.command()?.text().into()); - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/distro_file.rs b/support/texlab/src/syntax/latex/analysis/distro_file.rs deleted file mode 100644 index f278c33627..0000000000 --- a/support/texlab/src/syntax/latex/analysis/distro_file.rs +++ /dev/null @@ -1,73 +0,0 @@ -use lsp_types::Url; - -use crate::distro::Resolver; - -pub fn resolve_distro_file(resolver: &Resolver, stem: &str, extensions: &[&str]) -> Option<Url> { - let mut document = resolver.files_by_name.get(stem); - for extension in extensions { - document = document.or_else(|| { - let full_name = format!("{}.{}", stem, extension); - resolver.files_by_name.get(full_name.as_str()) - }); - } - document.and_then(|path| Url::from_file_path(path).ok()) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - #[cfg(windows)] - fn test() { - let mut resolver = Resolver::default(); - resolver - .files_by_name - .insert("foo.tex".into(), "C:/distro/foo.tex".into()); - resolver - .files_by_name - .insert("foo.sty".into(), "C:/distro/foo.sty".into()); - resolver - .files_by_name - .insert("bar.tex".into(), "C:/distro/bar.tex".into()); - - assert_eq!( - resolve_distro_file(&resolver, "foo", &["tex"]), - Some(Url::from_file_path("C:/distro/foo.tex").unwrap()) - ); - - assert_eq!( - resolve_distro_file(&resolver, "foo", &["sty"]), - Some(Url::from_file_path("C:/distro/foo.sty").unwrap()) - ); - - assert_eq!(resolve_distro_file(&resolver, "foo", &["cls"]), None); - } - - #[test] - #[cfg(unix)] - fn test() { - let mut resolver = Resolver::default(); - resolver - .files_by_name - .insert("foo.tex".into(), "/distro/foo.tex".into()); - resolver - .files_by_name - .insert("foo.sty".into(), "/distro/foo.sty".into()); - resolver - .files_by_name - .insert("bar.tex".into(), "/distro/bar.tex".into()); - - assert_eq!( - resolve_distro_file(&resolver, "foo", &["tex"]), - Some(Url::from_file_path("/distro/foo.tex").unwrap()) - ); - - assert_eq!( - resolve_distro_file(&resolver, "foo", &["sty"]), - Some(Url::from_file_path("/distro/foo.sty").unwrap()) - ); - - assert_eq!(resolve_distro_file(&resolver, "foo", &["cls"]), None); - } -} diff --git a/support/texlab/src/syntax/latex/analysis/environment.rs b/support/texlab/src/syntax/latex/analysis/environment.rs deleted file mode 100644 index e99483f706..0000000000 --- a/support/texlab/src/syntax/latex/analysis/environment.rs +++ /dev/null @@ -1,13 +0,0 @@ -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::LatexAnalyzerContext; - -pub fn analyze_begin(context: &mut LatexAnalyzerContext, node: latex::SyntaxNode) -> Option<()> { - let begin = latex::Begin::cast(node)?; - let name = begin.name()?.key()?.to_string(); - let extras = &mut context.extras; - extras.environment_names.insert(name); - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/explicit_link.rs b/support/texlab/src/syntax/latex/analysis/explicit_link.rs deleted file mode 100644 index 77e2cfb696..0000000000 --- a/support/texlab/src/syntax/latex/analysis/explicit_link.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::sync::Arc; - -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::{ - distro_file::resolve_distro_file, ExplicitLink, ExplicitLinkKind, LatexAnalyzerContext, -}; - -pub fn analyze_include(context: &mut LatexAnalyzerContext, node: latex::SyntaxNode) -> Option<()> { - let include = latex::Include::cast(node)?; - let kind = match include.syntax().kind() { - latex::LATEX_INCLUDE => ExplicitLinkKind::Latex, - latex::BIBLATEX_INCLUDE | latex::BIBTEX_INCLUDE => ExplicitLinkKind::Bibtex, - latex::PACKAGE_INCLUDE => ExplicitLinkKind::Package, - latex::CLASS_INCLUDE => ExplicitLinkKind::Class, - _ => return None, - }; - - let extensions = match kind { - ExplicitLinkKind::Latex => &["tex"], - ExplicitLinkKind::Bibtex => &["bib"], - ExplicitLinkKind::Package => &["sty"], - ExplicitLinkKind::Class => &["cls"], - }; - - for path in include.path_list()?.keys() { - let stem = path.to_string(); - let mut targets = vec![Arc::new(context.base_uri.join(&stem).ok()?)]; - for extension in extensions { - let path = format!("{}.{}", stem, extension); - targets.push(Arc::new(context.base_uri.join(&path).ok()?)); - } - - resolve_distro_file(&context.environment.resolver, &stem, extensions) - .into_iter() - .for_each(|target| targets.push(Arc::new(target))); - - context.extras.explicit_links.push(ExplicitLink { - kind, - stem: stem.into(), - stem_range: latex::small_range(&path), - targets, - }); - } - - Some(()) -} - -pub fn analyze_import(context: &mut LatexAnalyzerContext, node: latex::SyntaxNode) -> Option<()> { - let import = latex::Import::cast(node)?; - - let mut targets = Vec::new(); - let directory = match import.directory().and_then(|dir| dir.key()) { - Some(dir) => Arc::new(context.base_uri.join(&dir.to_string()).ok()?), - None => Arc::clone(&context.base_uri), - }; - - let file = import.file()?.key()?; - let stem = file.to_string(); - targets.push(Arc::new(directory.join(&stem).ok()?)); - targets.push(Arc::new(directory.join(&format!("{}.tex", stem)).ok()?)); - - context.extras.explicit_links.push(ExplicitLink { - stem: stem.into(), - stem_range: latex::small_range(&file), - targets, - kind: ExplicitLinkKind::Latex, - }); - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/graphics_path.rs b/support/texlab/src/syntax/latex/analysis/graphics_path.rs deleted file mode 100644 index 477094b841..0000000000 --- a/support/texlab/src/syntax/latex/analysis/graphics_path.rs +++ /dev/null @@ -1,21 +0,0 @@ -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::LatexAnalyzerContext; - -pub fn analyze_graphics_path( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let definition = latex::GraphicsPath::cast(node)?; - for path in definition - .path_list() - .filter_map(|group| group.key()) - .map(|path| path.to_string()) - { - context.extras.graphics_paths.insert(path); - } - - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/implicit_link.rs b/support/texlab/src/syntax/latex/analysis/implicit_link.rs deleted file mode 100644 index 60524c623e..0000000000 --- a/support/texlab/src/syntax/latex/analysis/implicit_link.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::{path::Path, sync::Arc}; - -use lsp_types::Url; - -use super::LatexAnalyzerContext; - -pub fn analyze_implicit_links(context: &mut LatexAnalyzerContext) { - context.extras.implicit_links.aux = find_by_extension(context, "aux").unwrap_or_default(); - context.extras.implicit_links.log = find_by_extension(context, "log").unwrap_or_default(); - context.extras.implicit_links.pdf = find_by_extension(context, "pdf").unwrap_or_default(); -} - -fn find_by_extension(context: &LatexAnalyzerContext, extension: &str) -> Option<Vec<Arc<Url>>> { - let mut targets = vec![Arc::new(with_extension(&context.document_uri, extension)?)]; - if context.document_uri.scheme() == "file" { - let file_path = context.document_uri.to_file_path().ok()?; - let file_stem = file_path.file_stem()?; - let aux_name = format!("{}.{}", file_stem.to_str()?, extension); - - let options = &context.environment.options; - if let Some(root_dir) = options.root_directory.as_ref() { - find_inside_directory(context, root_dir, &aux_name, &mut targets)?; - } - - if let Some(build_dir) = options.aux_directory.as_ref() { - find_inside_directory(context, build_dir, &aux_name, &mut targets)?; - } - } - Some(targets) -} - -fn find_inside_directory( - context: &LatexAnalyzerContext, - dir: &Path, - aux_name: &str, - targets: &mut Vec<Arc<Url>>, -) -> Option<()> { - let path = context - .environment - .current_directory - .join(dir) - .join(aux_name); - - targets.push(Arc::new(Url::from_file_path(path).ok()?)); - - targets.push(Arc::new( - context - .base_uri - .join(&dir.join(aux_name).to_string_lossy()) - .ok()?, - )); - - Some(()) -} - -fn with_extension(uri: &Url, extension: &str) -> Option<Url> { - let file_name = uri.path_segments()?.last()?; - let file_stem = file_name - .rfind('.') - .map(|i| &file_name[..i]) - .unwrap_or(file_name); - - uri.join(&format!("{}.{}", file_stem, extension)).ok() -} diff --git a/support/texlab/src/syntax/latex/analysis/label_name.rs b/support/texlab/src/syntax/latex/analysis/label_name.rs deleted file mode 100644 index 1e3339db5e..0000000000 --- a/support/texlab/src/syntax/latex/analysis/label_name.rs +++ /dev/null @@ -1,67 +0,0 @@ -use latex::LabelReferenceRange; -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::{LabelName, LatexAnalyzerContext}; - -pub fn analyze_label_name( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - analyze_label_definition_name(context, node.clone()) - .or_else(|| analyze_label_reference_name(context, node.clone())) - .or_else(|| analyze_label_reference_range_name(context, node)) -} - -fn analyze_label_definition_name( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let label = latex::LabelDefinition::cast(node)?; - let name = label.name()?.key()?; - context.extras.label_names.push(LabelName { - text: name.to_string().into(), - range: latex::small_range(&name), - is_definition: true, - }); - Some(()) -} - -fn analyze_label_reference_name( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let label = latex::LabelReference::cast(node)?; - for name in label.name_list()?.keys() { - context.extras.label_names.push(LabelName { - text: name.to_string().into(), - range: latex::small_range(&name), - is_definition: false, - }); - } - Some(()) -} - -fn analyze_label_reference_range_name( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let label = LabelReferenceRange::cast(node)?; - if let Some(name1) = label.from().and_then(|name| name.key()) { - context.extras.label_names.push(LabelName { - text: name1.to_string().into(), - range: latex::small_range(&name1), - is_definition: false, - }); - } - - if let Some(name2) = label.to().and_then(|name| name.key()) { - context.extras.label_names.push(LabelName { - text: name2.to_string().into(), - range: latex::small_range(&name2), - is_definition: false, - }); - } - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/label_number.rs b/support/texlab/src/syntax/latex/analysis/label_number.rs deleted file mode 100644 index 61ad348680..0000000000 --- a/support/texlab/src/syntax/latex/analysis/label_number.rs +++ /dev/null @@ -1,24 +0,0 @@ -use rowan::ast::AstNode; - -use crate::syntax::latex; - -use super::LatexAnalyzerContext; - -pub fn analyze_label_number( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let number = latex::LabelNumber::cast(node)?; - let name = number.name()?.key()?.to_string(); - let text = number - .text()? - .syntax() - .descendants_with_tokens() - .filter_map(|element| element.into_node()) - .find(|node| node.kind() == latex::TEXT || node.kind() == latex::MIXED_GROUP)? - .text() - .to_string(); - - context.extras.label_numbers_by_name.insert(name, text); - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/theorem.rs b/support/texlab/src/syntax/latex/analysis/theorem.rs deleted file mode 100644 index 70047362d1..0000000000 --- a/support/texlab/src/syntax/latex/analysis/theorem.rs +++ /dev/null @@ -1,22 +0,0 @@ -use rowan::ast::AstNode; - -use crate::syntax::latex::{self, HasCurly}; - -use super::{LatexAnalyzerContext, TheoremEnvironment}; - -pub fn analyze_theorem_definition( - context: &mut LatexAnalyzerContext, - node: latex::SyntaxNode, -) -> Option<()> { - let theorem = latex::TheoremDefinition::cast(node)?; - let name = theorem.name()?.key()?.to_string(); - let description = theorem.description()?; - let description = description.content_text()?; - - context - .extras - .theorem_environments - .push(TheoremEnvironment { name, description }); - - Some(()) -} diff --git a/support/texlab/src/syntax/latex/analysis/types.rs b/support/texlab/src/syntax/latex/analysis/types.rs deleted file mode 100644 index 7fb938e3d2..0000000000 --- a/support/texlab/src/syntax/latex/analysis/types.rs +++ /dev/null @@ -1,75 +0,0 @@ -use std::sync::Arc; - -use lsp_types::Url; -use rowan::TextRange; -use rustc_hash::{FxHashMap, FxHashSet}; -use smol_str::SmolStr; - -use crate::Environment; - -#[derive(Debug)] -pub struct LatexAnalyzerContext<'a> { - pub environment: &'a Environment, - pub document_uri: Arc<Url>, - pub base_uri: Arc<Url>, - pub extras: Extras, -} - -#[derive(Debug, Clone, Default)] -pub struct Extras { - pub implicit_links: ImplicitLinks, - pub explicit_links: Vec<ExplicitLink>, - pub has_document_environment: bool, - pub command_names: FxHashSet<SmolStr>, - pub environment_names: FxHashSet<String>, - pub label_names: Vec<LabelName>, - pub label_numbers_by_name: FxHashMap<String, String>, - pub theorem_environments: Vec<TheoremEnvironment>, - pub graphics_paths: FxHashSet<String>, -} - -#[derive(Debug, PartialEq, Eq, Clone, Default, Hash)] -pub struct ImplicitLinks { - pub aux: Vec<Arc<Url>>, - pub log: Vec<Arc<Url>>, - pub pdf: Vec<Arc<Url>>, -} - -#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Hash)] -pub enum ExplicitLinkKind { - Package, - Class, - Latex, - Bibtex, -} - -#[derive(Debug, Clone)] -pub struct ExplicitLink { - pub stem: SmolStr, - pub stem_range: TextRange, - pub targets: Vec<Arc<Url>>, - pub kind: ExplicitLinkKind, -} - -impl ExplicitLink { - pub fn as_component_name(&self) -> Option<String> { - match self.kind { - ExplicitLinkKind::Package => Some(format!("{}.sty", self.stem)), - ExplicitLinkKind::Class => Some(format!("{}.cls", self.stem)), - ExplicitLinkKind::Latex | ExplicitLinkKind::Bibtex => None, - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Default, Hash)] -pub struct TheoremEnvironment { - pub name: String, - pub description: String, -} - -#[derive(Debug, PartialEq, Eq, Clone, Default, Hash)] -pub struct LabelName { - pub text: SmolStr, - pub range: TextRange, - pub is_definition: bool, -} diff --git a/support/texlab/src/syntax/latex/cst.rs b/support/texlab/src/syntax/latex/cst.rs index a83246571d..d7c9ec9bc7 100644 --- a/support/texlab/src/syntax/latex/cst.rs +++ b/support/texlab/src/syntax/latex/cst.rs @@ -683,6 +683,6 @@ impl GraphicsPath { } pub fn path_list(&self) -> impl Iterator<Item = CurlyGroupWord> { - self.syntax().children().filter_map(CurlyGroupWord::cast) + self.syntax().descendants().filter_map(CurlyGroupWord::cast) } } diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__asymptote.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__asymptote.snap deleted file mode 100644 index 12f0f3ca63..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__asymptote.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -assertion_line: 664 -expression: "verify(r#\"\\begin{asy}\n printf(\"Hello World\\n\");\n\\end{asy}\"#)" ---- -[ - ( - BEGIN_ENVIRONMENT_NAME, - "\\begin", - ), - ( - L_CURLY, - "{", - ), - ( - WORD, - "asy", - ), - ( - R_CURLY, - "}", - ), - ( - VERBATIM, - "\n printf(\"Hello World\\n\");\n", - ), - ( - END_ENVIRONMENT_NAME, - "\\end", - ), - ( - L_CURLY, - "{", - ), - ( - WORD, - "asy", - ), - ( - R_CURLY, - "}", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__block_comment.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__block_comment.snap deleted file mode 100644 index 5ced043aaf..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__block_comment.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -assertion_line: 601 -expression: "verify(\"Foo\\\\iffalse\\n\\\\Bar{Baz}\\n\\\\fi\\\\Qux\")" ---- -[ - ( - WORD, - "Foo", - ), - ( - BEGIN_BLOCK_COMMENT_NAME, - "\\iffalse", - ), - ( - VERBATIM, - "\n\\Bar{Baz}\n", - ), - ( - END_BLOCK_COMMENT_NAME, - "\\fi", - ), - ( - GENERIC_COMMAND_NAME, - "\\Qux", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_parameter.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_parameter.snap deleted file mode 100644 index a9a0e11ad7..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_parameter.snap +++ /dev/null @@ -1,47 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"\\newcommand{\\id}[1]{#1}\"#)" - ---- -[ - ( - COMMAND_DEFINITION_NAME, - "\\newcommand", - ), - ( - L_CURLY, - "{", - ), - ( - GENERIC_COMMAND_NAME, - "\\id", - ), - ( - R_CURLY, - "}", - ), - ( - L_BRACK, - "[", - ), - ( - WORD, - "1", - ), - ( - R_BRACK, - "]", - ), - ( - L_CURLY, - "{", - ), - ( - WORD, - "#1", - ), - ( - R_CURLY, - "}", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_star.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_star.snap deleted file mode 100644 index 41310edaa1..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__command_with_star.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"\\section*{Foo}\"#)" - ---- -[ - ( - SECTION_NAME, - "\\section*", - ), - ( - L_CURLY, - "{", - ), - ( - WORD, - "Foo", - ), - ( - R_CURLY, - "}", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__comment.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__comment.snap deleted file mode 100644 index 19db458200..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__comment.snap +++ /dev/null @@ -1,36 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -assertion_line: 248 -expression: "verify(\"hello %world\\r\\ntest %test\")" - ---- -[ - ( - WORD, - "hello", - ), - ( - WHITESPACE, - " ", - ), - ( - COMMENT, - "%world", - ), - ( - LINE_BREAK, - "\r\n", - ), - ( - WORD, - "test", - ), - ( - WHITESPACE, - " ", - ), - ( - COMMENT, - "%test", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__delimiters.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__delimiters.snap deleted file mode 100644 index 36bec0a276..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__delimiters.snap +++ /dev/null @@ -1,79 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"{foo} (bar) [baz, qux = foo-bar]\"#)" - ---- -[ - ( - L_CURLY, - "{", - ), - ( - WORD, - "foo", - ), - ( - R_CURLY, - "}", - ), - ( - WHITESPACE, - " ", - ), - ( - L_PAREN, - "(", - ), - ( - WORD, - "bar", - ), - ( - R_PAREN, - ")", - ), - ( - WHITESPACE, - " ", - ), - ( - L_BRACK, - "[", - ), - ( - WORD, - "baz", - ), - ( - COMMA, - ",", - ), - ( - WHITESPACE, - " ", - ), - ( - WORD, - "qux", - ), - ( - WHITESPACE, - " ", - ), - ( - EQUALITY_SIGN, - "=", - ), - ( - WHITESPACE, - " ", - ), - ( - WORD, - "foo-bar", - ), - ( - R_BRACK, - "]", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__empty.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__empty.snap deleted file mode 100644 index 61735b5087..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__empty.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"\"#)" - ---- -[] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__escape_sequence.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__escape_sequence.snap deleted file mode 100644 index 4dbc1bb8f5..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__escape_sequence.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"\\% hello\"#)" - ---- -[ - ( - GENERIC_COMMAND_NAME, - "\\%", - ), - ( - WHITESPACE, - " ", - ), - ( - WORD, - "hello", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__formula.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__formula.snap deleted file mode 100644 index 3fb7079384..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__formula.snap +++ /dev/null @@ -1,55 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"$ f(x) = y $$\"#)" - ---- -[ - ( - DOLLAR, - "$", - ), - ( - WHITESPACE, - " ", - ), - ( - WORD, - "f", - ), - ( - L_PAREN, - "(", - ), - ( - WORD, - "x", - ), - ( - R_PAREN, - ")", - ), - ( - WHITESPACE, - " ", - ), - ( - EQUALITY_SIGN, - "=", - ), - ( - WHITESPACE, - " ", - ), - ( - WORD, - "y", - ), - ( - WHITESPACE, - " ", - ), - ( - DOLLAR, - "$$", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__invalid_parameter.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__invalid_parameter.snap deleted file mode 100644 index e947ec3fb6..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__invalid_parameter.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -expression: "verify(r#\"#\"#)" - ---- -[ - ( - WORD, - "#", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__line_break.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__line_break.snap deleted file mode 100644 index a8a392370e..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__lexer__tests__line_break.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: src/syntax/latex/lexer.rs -assertion_line: 258 -expression: "verify(\"hello\\nworld\")" - ---- -[ - ( - WORD, - "hello", - ), - ( - LINE_BREAK, - "\n", - ), - ( - WORD, - "world", - ), -] diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__empty.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__empty.snap deleted file mode 100644 index f01f7f9092..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__empty.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\"#)" - ---- -ROOT@0..0 - PREAMBLE@0..0 - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_empty.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_empty.snap deleted file mode 100644 index 84e62ea81d..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_empty.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\foo\"#)" - ---- -ROOT@0..4 - PREAMBLE@0..4 - GENERIC_COMMAND@0..4 - GENERIC_COMMAND_NAME@0..4 "\\foo" - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_escape.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_escape.snap deleted file mode 100644 index a0d5d2e29b..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__generic_command_escape.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\#\"#)" - ---- -ROOT@0..2 - PREAMBLE@0..2 - GENERIC_COMMAND@0..2 - GENERIC_COMMAND_NAME@0..2 "\\#" - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_path.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_path.snap deleted file mode 100644 index 622a0fc869..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__graphics_path.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -assertion_line: 1871 -expression: "setup(r#\"\\graphicspath{{../figures/}}\"#)" ---- -ROOT@0..28 - PREAMBLE@0..28 - GRAPHICS_PATH@0..28 - GRAPHICS_PATH_NAME@0..13 "\\graphicspath" - L_CURLY@13..14 "{" - CURLY_GROUP_WORD@14..27 - L_CURLY@14..15 "{" - KEY@15..26 - WORD@15..26 "../figures/" - R_CURLY@26..27 "}" - R_CURLY@27..28 "}" - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_simple.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_simple.snap deleted file mode 100644 index efa0d9b675..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__latex_input_simple.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"\\input{foo/bar.tex}\"#)" - ---- -ROOT@0..19 - PREAMBLE@0..19 - LATEX_INCLUDE@0..19 - LATEX_INCLUDE_NAME@0..6 "\\input" - CURLY_GROUP_WORD_LIST@6..19 - L_CURLY@6..7 "{" - KEY@7..18 - WORD@7..18 "foo/bar.tex" - R_CURLY@18..19 "}" - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter.snap deleted file mode 100644 index 4888672c31..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"#1\"#)" - ---- -ROOT@0..2 - PREAMBLE@0..2 - TEXT@0..2 - WORD@0..2 "#1" - diff --git a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter_error.snap b/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter_error.snap deleted file mode 100644 index 843327ab80..0000000000 --- a/support/texlab/src/syntax/latex/snapshots/texlab__syntax__latex__parser__tests__parameter_error.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/syntax/latex/parser.rs -expression: "setup(r#\"#\"#)" - ---- -ROOT@0..1 - PREAMBLE@0..1 - TEXT@0..1 - WORD@0..1 "#" - diff --git a/support/texlab/src/syntax/snapshots/texlab__syntax__build_log__tests__parse_007.snap b/support/texlab/src/syntax/snapshots/texlab__syntax__build_log__tests__parse_007.snap deleted file mode 100644 index 09d99c4f21..0000000000 --- a/support/texlab/src/syntax/snapshots/texlab__syntax__build_log__tests__parse_007.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: src/syntax/build_log.rs -expression: parse(&log).errors - ---- -[ - BuildError { - relative_path: "/some/folder/a.tex", - level: Error, - message: "Undefined control sequence.", - line: Some( - 3, - ), - }, -] diff --git a/support/texlab/tests/integration/lsp.rs b/support/texlab/src/tests.rs index 9ef1a4f2b4..c6afcfc20c 100644 --- a/support/texlab/tests/integration/lsp.rs +++ b/support/texlab/src/tests.rs @@ -1,4 +1,5 @@ mod client; mod fixture; +mod issues; mod text_document; mod workspace; diff --git a/support/texlab/tests/integration/lsp/client.rs b/support/texlab/src/tests/client.rs index 004422813a..ff6b23469b 100644 --- a/support/texlab/tests/integration/lsp/client.rs +++ b/support/texlab/src/tests/client.rs @@ -1,3 +1,5 @@ +use std::sync::Once; + use anyhow::{bail, Result}; use crossbeam_channel::{Receiver, Sender}; use lsp_server::{Connection, Message, Notification, Request, Response}; @@ -5,10 +7,13 @@ use lsp_types::{ notification::{Exit, Initialized}, request::{Initialize, Shutdown}, ClientCapabilities, ClientInfo, DidOpenTextDocumentParams, InitializeParams, InitializeResult, - InitializedParams, Url, + InitializedParams, Url, WorkspaceFolder, }; use tempfile::{tempdir, TempDir}; -use texlab::Server; + +use crate::Server; + +static INIT_LOGGER: Once = Once::new(); pub struct IncomingHandler { _handle: jod_thread::JoinHandle<Result<()>>, @@ -18,7 +23,7 @@ pub struct IncomingHandler { } impl IncomingHandler { - pub fn spawn(receiver: Receiver<Message>) -> Result<Self> { + pub fn spawn(receiver: Receiver<Message>) -> Self { let (req_sender, req_receiver) = crossbeam_channel::unbounded(); let (not_sender, not_receiver) = crossbeam_channel::unbounded(); let (res_sender, res_receiver) = crossbeam_channel::unbounded(); @@ -35,12 +40,12 @@ impl IncomingHandler { Ok(()) }); - Ok(Self { + Self { _handle, requests: req_receiver, notifications: not_receiver, responses: res_receiver, - }) + } } } @@ -58,45 +63,47 @@ pub struct Client { } impl Client { - pub fn spawn() -> Result<Self> { - let directory = tempdir()?; + pub fn spawn() -> Self { + INIT_LOGGER.call_once(|| env_logger::init()); + + let directory = tempdir().unwrap(); let (client, server) = Connection::memory(); - let incoming = IncomingHandler::spawn(client.receiver)?; + let incoming = IncomingHandler::spawn(client.receiver); let outgoing = client.sender; - let server = Server::with_connection(server, directory.path().to_path_buf(), false); + let server = Server::new(server); let _handle = jod_thread::spawn(move || { server.run().expect("server failed to run"); }); - Ok(Self { + Self { outgoing, incoming, directory, request_id: 0, _handle, - }) + } } - #[allow(deprecated)] pub fn initialize( &mut self, client_capabilities: ClientCapabilities, client_info: Option<ClientInfo>, - ) -> Result<InitializeResult> { - let result = self.request::<Initialize>(InitializeParams { - process_id: None, - root_path: None, - root_uri: None, - initialization_options: None, - capabilities: client_capabilities, - trace: None, - workspace_folders: None, - client_info, - locale: None, - })?; - - self.notify::<Initialized>(InitializedParams {})?; - Ok(result) + ) -> InitializeResult { + let result = self + .request::<Initialize>(InitializeParams { + initialization_options: Some(serde_json::json!({ "skipDistro": true })), + capabilities: client_capabilities, + workspace_folders: Some(vec![WorkspaceFolder { + name: "Test".into(), + uri: Url::from_directory_path(self.directory.path()).unwrap(), + }]), + client_info, + ..InitializeParams::default() + }) + .unwrap(); + + self.notify::<Initialized>(InitializedParams {}); + result } pub fn request<R: lsp_types::request::Request>( @@ -106,9 +113,10 @@ impl Client { self.request_id += 1; self.outgoing - .send(Request::new(self.request_id.into(), R::METHOD.into(), params).into())?; + .send(Request::new(self.request_id.into(), R::METHOD.into(), params).into()) + .unwrap(); - let response = self.incoming.responses.recv()?; + let response = self.incoming.responses.recv().unwrap(); assert_eq!(response.id, self.request_id.into()); let result = match response.result { @@ -119,47 +127,33 @@ impl Client { Ok(serde_json::from_value(result)?) } - pub fn notify<N: lsp_types::notification::Notification>( - &mut self, - params: N::Params, - ) -> Result<()> { + pub fn notify<N: lsp_types::notification::Notification>(&mut self, params: N::Params) { self.outgoing - .send(Notification::new(N::METHOD.into(), serde_json::to_value(params)?).into())?; - - Ok(()) + .send(Notification::new(N::METHOD.into(), serde_json::to_value(params).unwrap()).into()) + .unwrap(); } - pub fn open(&mut self, name: &str, language_id: &str, text: String) -> Result<()> { + pub fn open(&mut self, name: &str, language_id: &str, text: String) { self.notify::<lsp_types::notification::DidOpenTextDocument>(DidOpenTextDocumentParams { text_document: lsp_types::TextDocumentItem { - uri: self.uri(name)?, + uri: self.uri(name), language_id: language_id.to_string(), version: 0, text, }, - })?; - - Ok(()) - } - - pub fn store_on_disk(&mut self, name: &str, text: &str) -> Result<()> { - let path = self.directory.path().join(name); - std::fs::create_dir_all(path.parent().unwrap())?; - std::fs::write(path, text)?; - Ok(()) + }); } - pub fn shutdown(mut self) -> Result<ClientResult> { - self.request::<Shutdown>(())?; - self.notify::<Exit>(())?; - Ok(ClientResult { + pub fn shutdown(mut self) -> ClientResult { + self.request::<Shutdown>(()).unwrap(); + self.notify::<Exit>(()); + ClientResult { directory: self.directory, incoming: self.incoming, - }) + } } - pub fn uri(&self, name: &str) -> Result<Url> { - Url::from_file_path(self.directory.path().join(name)) - .map_err(|()| anyhow::anyhow!("failed to create uri")) + pub fn uri(&self, name: &str) -> Url { + Url::from_file_path(self.directory.path().join(name)).unwrap() } } diff --git a/support/texlab/tests/integration/lsp/fixture.rs b/support/texlab/src/tests/fixture.rs index 83d63cce60..b837a9f5b0 100644 --- a/support/texlab/tests/integration/lsp/fixture.rs +++ b/support/texlab/src/tests/fixture.rs @@ -1,10 +1,9 @@ use std::collections::BTreeMap; -use anyhow::Result; use lsp_types::{Position, Range, TextDocumentIdentifier, TextDocumentPositionParams}; use rustc_hash::FxHashMap; -use crate::lsp::client::Client; +use super::client::Client; #[derive(Debug, PartialEq, Eq, Clone, Hash)] enum Line<'a> { @@ -60,12 +59,12 @@ pub struct FileCursor<'a> { } impl<'a> FileCursor<'a> { - pub fn into_params(self, server: &Client) -> Result<TextDocumentPositionParams> { - let text_document = TextDocumentIdentifier::new(server.uri(self.name)?); - Ok(TextDocumentPositionParams { + pub fn into_params(self, server: &Client) -> TextDocumentPositionParams { + let text_document = TextDocumentIdentifier::new(server.uri(self.name)); + TextDocumentPositionParams { text_document, position: self.position, - }) + } } } diff --git a/support/texlab/src/tests/issues.rs b/support/texlab/src/tests/issues.rs new file mode 100644 index 0000000000..8f578f5ada --- /dev/null +++ b/support/texlab/src/tests/issues.rs @@ -0,0 +1,12 @@ +use insta::assert_debug_snapshot; + +use crate::Options; + +#[test] +fn issue_707() { + assert_debug_snapshot!( + serde_json::from_value::<Option<Options>>(serde_json::json!({})) + .unwrap() + .unwrap_or_default() + ); +} diff --git a/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap b/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap new file mode 100644 index 0000000000..1397a08fc0 --- /dev/null +++ b/support/texlab/src/tests/snapshots/texlab__tests__issues__issue_707.snap @@ -0,0 +1,45 @@ +--- +source: src/tests/issues.rs +expression: "serde_json::from_value::<Option<Options>>(serde_json::json!({}))?.unwrap_or_default()" +--- +Options { + root_directory: None, + aux_directory: None, + bibtex_formatter: Texlab, + latex_formatter: Latexindent, + formatter_line_length: None, + diagnostics: DiagnosticsOptions { + allowed_patterns: [], + ignored_patterns: [], + }, + diagnostics_delay: DiagnosticsDelay( + 300ms, + ), + build: BuildOptions { + executable: BuildExecutable( + "latexmk", + ), + args: BuildArgs( + [ + "-pdf", + "-interaction=nonstopmode", + "-synctex=1", + "%f", + ], + ), + on_save: false, + forward_search_after: false, + }, + chktex: ChktexOptions { + on_open_and_save: false, + on_edit: false, + }, + latexindent: LatexindentOptions { + local: None, + modify_line_breaks: false, + }, + forward_search: ForwardSearchOptions { + executable: None, + args: None, + }, +} diff --git a/support/texlab/tests/integration/lsp/text_document.rs b/support/texlab/src/tests/text_document.rs index 283132d3c4..aac0553ec4 100644 --- a/support/texlab/tests/integration/lsp/text_document.rs +++ b/support/texlab/src/tests/text_document.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "completion")] mod completion; mod definition; mod did_change_configuration; @@ -8,6 +7,6 @@ mod document_symbol; mod folding_range; mod formatting; mod hover; -mod publish_diagnostics; +mod inlay_hint; mod references; mod rename; diff --git a/support/texlab/tests/integration/lsp/text_document/completion.rs b/support/texlab/src/tests/text_document/completion.rs index 5e160904fe..d4f256cdfb 100644 --- a/support/texlab/tests/integration/lsp/text_document/completion.rs +++ b/support/texlab/src/tests/text_document/completion.rs @@ -1,19 +1,31 @@ -use anyhow::Result; use insta::assert_json_snapshot; use lsp_types::{ request::{Completion, ResolveCompletionItem}, - ClientCapabilities, CompletionItem, CompletionList, CompletionParams, CompletionResponse, - CompletionTextEdit, Range, + CompletionItem, CompletionList, CompletionParams, CompletionResponse, CompletionTextEdit, + Range, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; + +fn complete(fixture: &str) -> Vec<CompletionItem> { + let mut client = Client::spawn(); + client.initialize( + serde_json::from_value(serde_json::json!({ + "textDocument": { + "completion": { + "completionItem": { + "documentationFormat": ["plaintext", "markdown"] + } + } + } + })) + .unwrap(), + None, + ); -fn complete(fixture: &str) -> Result<Vec<CompletionItem>, anyhow::Error> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let range = fixture @@ -31,11 +43,12 @@ fn complete(fixture: &str) -> Result<Vec<CompletionItem>, anyhow::Error> { let actual_list = client .request::<Completion>(CompletionParams { - text_document_position: fixture.cursor.unwrap().into_params(&client)?, + text_document_position: fixture.cursor.unwrap().into_params(&client), partial_result_params: Default::default(), work_done_progress_params: Default::default(), context: None, - })? + }) + .unwrap() .map_or(CompletionList::default(), |actual| match actual { CompletionResponse::List(list) => list, CompletionResponse::Array(_) => unreachable!(), @@ -51,11 +64,11 @@ fn complete(fixture: &str) -> Result<Vec<CompletionItem>, anyhow::Error> { .items .into_iter() .take(5) - .map(|item| client.request::<ResolveCompletionItem>(item)) - .collect::<Result<Vec<_>>>()?; + .map(|item| client.request::<ResolveCompletionItem>(item).unwrap()) + .collect(); - client.shutdown()?; - Ok(actual_items) + client.shutdown(); + actual_items } macro_rules! assert_items { @@ -71,7 +84,7 @@ macro_rules! assert_items { } #[test] -fn acronym_ref_simple() -> Result<()> { +fn acronym_ref_simple() { assert_items!(complete( r#" %TEX main.tex @@ -79,26 +92,22 @@ fn acronym_ref_simple() -> Result<()> { %SRC \acrshort{f} %CUR ^ %1.1 ^"# - )?); - - Ok(()) + )); } #[test] -fn acronym_ref_empty() -> Result<()> { +fn acronym_ref_empty() { assert_items!(complete( r#" %TEX main.tex %SRC \newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second} %SRC \acrshort{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn acronym_ref_after_group() -> Result<()> { +fn acronym_ref_after_group() { let actual_items = complete( r#" %TEX main.tex @@ -106,14 +115,13 @@ fn acronym_ref_after_group() -> Result<()> { %SRC \acrshort{} %CUR ^ %1.1 ^"#, - )?; + ); assert_eq!(actual_items, Vec::new()); - Ok(()) } #[test] -fn acronym_ref_open_brace() -> Result<()> { +fn acronym_ref_open_brace() { assert_items!(complete( r#" %TEX main.tex @@ -121,13 +129,23 @@ fn acronym_ref_open_brace() -> Result<()> { %SRC \acrshort{f %CUR ^ %1.1 ^"# - )?); + )); +} - Ok(()) +#[test] +fn acronym_package_ref() { + assert_items!(complete( + r#" +%TEX main.tex +%SRC \acrodef{fpsLabel}[FPS]{Frames per Second} +%SRC \ac{f +%CUR ^ +%1.1 ^"# + )); } #[test] -fn glossary_ref_simple() -> Result<()> { +fn glossary_ref_simple() { assert_items!(complete( r#" %TEX main.tex @@ -135,13 +153,11 @@ fn glossary_ref_simple() -> Result<()> { %SRC \gls{f} %CUR ^ %1.1 ^"# - )?); - - Ok(()) + )); } #[test] -fn glossary_ref_open_brace() -> Result<()> { +fn glossary_ref_open_brace() { assert_items!(complete( r#" %TEX main.tex @@ -149,26 +165,22 @@ fn glossary_ref_open_brace() -> Result<()> { %SRC \gls{f %CUR ^ %1.1 ^"# - )?); - - Ok(()) + )); } #[test] -fn argument_empty() -> Result<()> { +fn argument_empty() { assert_items!(complete( r#" %TEX main.tex %SRC \usepackage{amsfonts} %SRC \mathbb{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn argument_word() -> Result<()> { +fn argument_word() { assert_items!(complete( r#" %TEX main.tex @@ -176,13 +188,11 @@ fn argument_word() -> Result<()> { %SRC \mathbb{A} %CUR ^ %1.1 ^"# - )?); - - Ok(()) + )); } #[test] -fn argument_open_brace() -> Result<()> { +fn argument_open_brace() { assert_items!(complete( r#" %TEX main.tex @@ -190,13 +200,11 @@ fn argument_open_brace() -> Result<()> { %SRC \mathbb{ %CUR ^ %SRC Test"# - )?); - - Ok(()) + )); } #[test] -fn argument_open_brace_unrelated() -> Result<()> { +fn argument_open_brace_unrelated() { let actual_items = complete( r#" %TEX main.tex @@ -204,27 +212,24 @@ fn argument_open_brace_unrelated() -> Result<()> { %SRC \mathbb{}{ %CUR ^ %SRC Test"#, - )?; + ); assert_eq!(actual_items, Vec::new()); - Ok(()) } #[test] -fn begin_environment_without_snippet_support() -> Result<()> { +fn begin_environment_without_snippet_support() { assert_items!(complete( r#" %TEX main.tex %SRC \beg %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn citation() -> Result<()> { +fn citation() { assert_items!(complete( r#" %TEX main.tex @@ -243,13 +248,11 @@ fn citation() -> Result<()> { %SRC } %SRC %SRC @article{bar:2005,}"# - )?); - - Ok(()) + )); } #[test] -fn citation_open_brace() -> Result<()> { +fn citation_open_brace() { assert_items!(complete( r#" %TEX main.tex @@ -259,13 +262,11 @@ fn citation_open_brace() -> Result<()> { %BIB main.bib %SRC @article{foo,}"# - )?); - - Ok(()) + )); } #[test] -fn citation_open_brace_multiple() -> Result<()> { +fn citation_open_brace_multiple() { assert_items!(complete( r#" %TEX main.tex @@ -276,13 +277,11 @@ fn citation_open_brace_multiple() -> Result<()> { %BIB main.bib %SRC @article{foo,}"# - )?); - - Ok(()) + )); } #[test] -fn citation_acronym() -> Result<()> { +fn citation_acronym() { assert_items!(complete( r#" %TEX main.tex @@ -292,13 +291,11 @@ fn citation_acronym() -> Result<()> { %BIB main.bib %SRC @article{foo,}"# - )?); - - Ok(()) + )); } #[test] -fn citation_after_brace() -> Result<()> { +fn citation_after_brace() { let actual_items = complete( r#" %TEX main.tex @@ -311,124 +308,106 @@ fn citation_after_brace() -> Result<()> { %BIB main.bib %SRC @article{foo,}"#, - )?; + ); assert_eq!(actual_items, Vec::new()); - Ok(()) } #[test] -fn color_model_definition_simple() -> Result<()> { +fn color_model_definition_simple() { assert_items!(complete( r#" %TEX main.tex %SRC \definecolor{foo}{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn color_model_definition_open_brace() -> Result<()> { +fn color_model_definition_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \definecolor{foo}{ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn color_model_definition_set_simple() -> Result<()> { +fn color_model_definition_set_simple() { assert_items!(complete( r#" %TEX main.tex %SRC \definecolorset{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn color_model_definition_set_open_brace() -> Result<()> { +fn color_model_definition_set_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \definecolorset{ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn color_simple() -> Result<()> { +fn color_simple() { assert_items!(complete( r#" %TEX main.tex %SRC \color{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn color_word() -> Result<()> { +fn color_word() { assert_items!(complete( r#" %TEX main.tex %SRC \color{re} %CUR ^ %1.1 ^^"# - )?); - - Ok(()) + )); } #[test] -fn color_open_brace() -> Result<()> { +fn color_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \color{ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn component_command_simple() -> Result<()> { +fn component_command_simple() { assert_items!(complete( r#" %TEX main.tex %SRC \ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn component_command_simple_before() -> Result<()> { +fn component_command_simple_before() { let actual_items = complete( r#" %TEX main.tex %SRC \ %CUR ^"#, - )?; + ); assert_eq!(actual_items, Vec::new()); - Ok(()) } #[test] -fn component_command_simple_package() -> Result<()> { +fn component_command_simple_package() { assert_items!(complete( r#" %TEX main.tex @@ -436,13 +415,11 @@ fn component_command_simple_package() -> Result<()> { %SRC \lips %CUR ^ %1.1 ^^^^"# - )?); - - Ok(()) + )); } #[test] -fn component_command_bibtex() -> Result<()> { +fn component_command_bibtex() { assert_items!(complete( r#" %BIB main.bib @@ -451,39 +428,33 @@ fn component_command_bibtex() -> Result<()> { %CUR ^ %1.1 ^^^ %SRC }"# - )?); - - Ok(()) + )); } #[test] -fn component_environment_simple() -> Result<()> { +fn component_environment_simple() { assert_items!(complete( r#" %TEX main.tex %SRC \begin{doc %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn component_environment_simple_end() -> Result<()> { +fn component_environment_simple_end() { assert_items!(complete( r#" %TEX main.tex %SRC \begin{document} %SRC \end{ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn component_environment_class() -> Result<()> { +fn component_environment_class() { assert_items!(complete( r#" %TEX main.tex @@ -491,231 +462,195 @@ fn component_environment_class() -> Result<()> { %SRC \begin{thein} %CUR ^ %1.1 ^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn component_environment_command_definition() -> Result<()> { +fn component_environment_command_definition() { assert_items!(complete( r#" %TEX main.tex %SRC \newcommand{\foo}{\begin{doc} %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_at_empty() -> Result<()> { +fn entry_type_at_empty() { assert_items!(complete( r#" %BIB main.bib %SRC @ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_before_preamble() -> Result<()> { +fn entry_type_before_preamble() { assert_items!(complete( r#" %BIB main.bib %SRC @preamble %CUR ^ %1.1 ^^^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_before_string() -> Result<()> { +fn entry_type_before_string() { assert_items!(complete( r#" %BIB main.bib %SRC @string %CUR ^ %1.1 ^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_before_article() -> Result<()> { +fn entry_type_before_article() { assert_items!(complete( r#" %BIB main.bib %SRC @article %CUR ^ %1.1 ^^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_after_preamble() -> Result<()> { +fn entry_type_after_preamble() { assert_items!(complete( r#" %BIB main.bib %SRC @preamble{ %CUR ^ %1.1 ^^^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_after_string() -> Result<()> { +fn entry_type_after_string() { assert_items!(complete( r#" %BIB main.bib %SRC @string{ %CUR ^ %1.1 ^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn entry_type_complete_entry() -> Result<()> { +fn entry_type_complete_entry() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo, author = {foo}} %CUR ^ %1.1 ^^^^^^^"# - )?); - - Ok(()) + )); } #[test] -fn field_empty_entry_open() -> Result<()> { +fn field_empty_entry_open() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo, %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn field_empty_entry_closed() -> Result<()> { +fn field_empty_entry_closed() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo,} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn field_entry_field_name() -> Result<()> { +fn field_entry_field_name() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo, a %CUR ^ %1.1 ^"# - )?); - - Ok(()) + )); } #[test] -fn field_entry_two_fields_name_open() -> Result<()> { +fn field_entry_two_fields_name_open() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo, author = bar, edit %CUR ^ %1.1 ^^^^"# - )?); - - Ok(()) + )); } #[test] -fn field_entry_two_fields_name_closed() -> Result<()> { +fn field_entry_two_fields_name_closed() { assert_items!(complete( r#" %BIB main.bib %SRC @article{foo, author = bar, edit} %CUR ^ %1.1 ^^^^"# - )?); - - Ok(()) + )); } #[test] -fn import_package_open_brace() -> Result<()> { +fn import_package_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \usepackage{lips %CUR ^ %1.1 ^^^^"# - )?); - - Ok(()) + )); } #[test] -fn import_package_closed_brace() -> Result<()> { +fn import_package_closed_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \usepackage{lips} %CUR ^ %1.1 ^^^^"# - )?); - - Ok(()) + )); } #[test] -fn import_class_open_brace() -> Result<()> { +fn import_class_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \documentclass{art \foo %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn import_class_closed_brace() -> Result<()> { +fn import_class_closed_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \documentclass{art} %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn label() -> Result<()> { +fn label() { assert_items!(complete( r#" %TEX foo.tex @@ -775,13 +710,11 @@ fn label() -> Result<()> { %SRC \newlabel{eq:bar}{{2}{1}} %SRC \newlabel{thm:foo}{{1}{1}} %SRC \@input{bar.aux}"# - )?); - - Ok(()) + )); } #[test] -fn theorem_begin() -> Result<()> { +fn theorem_begin() { assert_items!(complete( r#" %TEX main.tex @@ -789,13 +722,11 @@ fn theorem_begin() -> Result<()> { %SRC \begin{lem %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn theorem_end() -> Result<()> { +fn theorem_end() { assert_items!(complete( r#" %TEX main.tex @@ -804,37 +735,31 @@ fn theorem_end() -> Result<()> { %SRC \end{lem %CUR ^ %1.1 ^^^"# - )?); - - Ok(()) + )); } #[test] -fn tikz_library_open_brace() -> Result<()> { +fn tikz_library_open_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \usepgflibrary{ %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn tikz_library_closed_brace() -> Result<()> { +fn tikz_library_closed_brace() { assert_items!(complete( r#" %TEX main.tex %SRC \usepgflibrary{} %CUR ^"# - )?); - - Ok(()) + )); } #[test] -fn test_user_command() -> Result<()> { +fn test_user_command() { assert_items!(complete( r#" %TEX main.tex @@ -846,13 +771,11 @@ fn test_user_command() -> Result<()> { %SRC \end{foo} %SRC \begin{fo} "# - )?); - - Ok(()) + )); } #[test] -fn test_user_environment() -> Result<()> { +fn test_user_environment() { assert_items!(complete( r#" %TEX main.tex @@ -864,7 +787,26 @@ fn test_user_environment() -> Result<()> { %CUR ^ %1.1 ^^ "# - )?); + )); +} + +#[test] +fn test_project_resolution() { + assert_items!(complete( + r#" +%TEX main.tex +%SRC \documentclass{article} +%SRC \import{sub}{sub/sub.tex} +%SRC \lipsu +%CUR ^ +%1.1 ^^^^^ - Ok(()) +%TEX sub/sub.tex +%SRC \input{child.tex} + +%TEX sub/child.tex +%SRC \usepackage{lipsum} + +"# + )); } diff --git a/support/texlab/tests/integration/lsp/text_document/definition.rs b/support/texlab/src/tests/text_document/definition.rs index 203c350464..b1b915c6c9 100644 --- a/support/texlab/tests/integration/lsp/text_document/definition.rs +++ b/support/texlab/src/tests/text_document/definition.rs @@ -1,26 +1,25 @@ -use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::GotoDefinition, ClientCapabilities, GotoDefinitionParams, GotoDefinitionResponse, LocationLink, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let mut expected_links = Vec::new(); for ranges in fixture.ranges.values() { expected_links.push(LocationLink { origin_selection_range: Some(ranges[&1].range), - target_uri: client.uri(ranges[&2].name)?, + target_uri: client.uri(ranges[&2].name), target_range: ranges[&2].range, target_selection_range: ranges[&3].range, }); @@ -28,23 +27,22 @@ fn check(fixture: &str) -> Result<()> { let actual_links = client .request::<GotoDefinition>(GotoDefinitionParams { - text_document_position_params: fixture.cursor.unwrap().into_params(&client)?, + text_document_position_params: fixture.cursor.unwrap().into_params(&client), partial_result_params: Default::default(), work_done_progress_params: Default::default(), - })? + }) + .unwrap() .map_or(Vec::new(), |actual| match actual { GotoDefinitionResponse::Link(links) => links, GotoDefinitionResponse::Array(_) | GotoDefinitionResponse::Scalar(_) => unreachable!(), }); - client.shutdown()?; - + client.shutdown(); assert_eq_unordered!(actual_links, expected_links); - Ok(()) } #[test] -fn command_definition() -> Result<()> { +fn command_definition() { check( r#" %TEX main.tex @@ -59,7 +57,7 @@ fn command_definition() -> Result<()> { } #[test] -fn document() -> Result<()> { +fn document() { check( r#" %TEX foo.tex @@ -79,7 +77,7 @@ fn document() -> Result<()> { } #[test] -fn entry() -> Result<()> { +fn entry() { check( r#" %TEX foo.tex @@ -100,7 +98,7 @@ fn entry() -> Result<()> { } #[test] -fn string_simple() -> Result<()> { +fn string_simple() { check( r#" %BIB main.bib @@ -115,7 +113,7 @@ fn string_simple() -> Result<()> { } #[test] -fn string_join() -> Result<()> { +fn string_join() { check( r#" %BIB main.bib @@ -130,7 +128,7 @@ fn string_join() -> Result<()> { } #[test] -fn string_field() -> Result<()> { +fn string_field() { check( r#" %BIB main.bib diff --git a/support/texlab/tests/integration/lsp/text_document/did_change_configuration.rs b/support/texlab/src/tests/text_document/did_change_configuration.rs index c45dca094b..15aae0ee4b 100644 --- a/support/texlab/tests/integration/lsp/text_document/did_change_configuration.rs +++ b/support/texlab/src/tests/text_document/did_change_configuration.rs @@ -1,16 +1,15 @@ -use anyhow::Result; use insta::assert_snapshot; use lsp_types::{ notification::{DidChangeConfiguration, Notification, ShowMessage}, ClientCapabilities, DidChangeConfigurationParams, ShowMessageParams, }; -use crate::lsp::client::Client; +use crate::tests::client::Client; #[test] -fn invalid_configuration() -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn invalid_configuration() { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); client.notify::<DidChangeConfiguration>(DidChangeConfigurationParams { settings: serde_json::json!({ @@ -18,9 +17,9 @@ fn invalid_configuration() -> Result<()> { "allowedPatterns": ["\\"] } }), - })?; + }); - let result = client.shutdown()?; + let result = client.shutdown(); let message = result .incoming .notifications @@ -35,5 +34,4 @@ fn invalid_configuration() -> Result<()> { .message; assert_snapshot!(message); - Ok(()) } diff --git a/support/texlab/tests/integration/lsp/text_document/document_highlight.rs b/support/texlab/src/tests/text_document/document_highlight.rs index 92102ce0ca..01945ce342 100644 --- a/support/texlab/tests/integration/lsp/text_document/document_highlight.rs +++ b/support/texlab/src/tests/text_document/document_highlight.rs @@ -1,19 +1,18 @@ -use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::DocumentHighlightRequest, ClientCapabilities, DocumentHighlight, DocumentHighlightKind, DocumentHighlightParams, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let mut expected_highlights = Vec::new(); @@ -34,20 +33,19 @@ fn check(fixture: &str) -> Result<()> { let actual_highlights = client .request::<DocumentHighlightRequest>(DocumentHighlightParams { - text_document_position_params: fixture.cursor.unwrap().into_params(&client)?, + text_document_position_params: fixture.cursor.unwrap().into_params(&client), partial_result_params: Default::default(), work_done_progress_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; - + client.shutdown(); assert_eq_unordered!(actual_highlights, expected_highlights); - Ok(()) } #[test] -fn test_label() -> Result<()> { +fn test_label() { check( r#" %TEX main.tex diff --git a/support/texlab/tests/integration/lsp/text_document/document_link.rs b/support/texlab/src/tests/text_document/document_link.rs index 1a773fd478..8b4a30ceeb 100644 --- a/support/texlab/tests/integration/lsp/text_document/document_link.rs +++ b/support/texlab/src/tests/text_document/document_link.rs @@ -1,26 +1,25 @@ -use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::DocumentLinkRequest, ClientCapabilities, DocumentLink, DocumentLinkParams, TextDocumentIdentifier, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let mut expected_links = Vec::new(); for ranges in fixture.ranges.values() { expected_links.push(DocumentLink { range: ranges[&1].range, - target: Some(client.uri(ranges[&2].name)?), + target: Some(client.uri(ranges[&2].name)), tooltip: None, data: None, }); @@ -28,20 +27,19 @@ fn check(fixture: &str) -> Result<()> { let actual_links = client .request::<DocumentLinkRequest>(DocumentLinkParams { - text_document: TextDocumentIdentifier::new(client.uri(fixture.cursor.unwrap().name)?), + text_document: TextDocumentIdentifier::new(client.uri(fixture.cursor.unwrap().name)), work_done_progress_params: Default::default(), partial_result_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; - + client.shutdown(); assert_eq_unordered!(actual_links, expected_links); - Ok(()) } #[test] -fn document_include() -> Result<()> { +fn document_include() { check( r#" %TEX foo.tex @@ -57,12 +55,12 @@ fn document_include() -> Result<()> { } #[test] -fn document_import() -> Result<()> { +fn document_import() { check( r#" %TEX foo.tex -%SRC \import{bar/}{baz} -%1.1 ^^^ +%SRC \import{.}{bar/baz} +%1.1 ^^^^^^^ %CUR ^ %TEX bar/baz.tex diff --git a/support/texlab/tests/integration/lsp/text_document/document_symbol.rs b/support/texlab/src/tests/text_document/document_symbol.rs index 50bb9db3fe..2eab81631e 100644 --- a/support/texlab/tests/integration/lsp/text_document/document_symbol.rs +++ b/support/texlab/src/tests/text_document/document_symbol.rs @@ -1,42 +1,43 @@ -use anyhow::Result; use insta::{assert_json_snapshot, internals::Redaction}; use lsp_types::{ request::DocumentSymbolRequest, DocumentSymbolParams, DocumentSymbolResponse, TextDocumentIdentifier, Url, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; struct SymbolResult { response: Option<DocumentSymbolResponse>, uri_redaction: Redaction, } -fn find_symbols(fixture: &str, client_capabilities: serde_json::Value) -> Result<SymbolResult> { - let mut client = Client::spawn()?; - client.initialize(serde_json::from_value(client_capabilities)?, None)?; +fn find_symbols(fixture: &str, client_capabilities: serde_json::Value) -> SymbolResult { + let mut client = Client::spawn(); + client.initialize(serde_json::from_value(client_capabilities).unwrap(), None); let fixture = fixture::parse(fixture); let file = fixture.files.into_iter().next().unwrap(); - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); - let response = client.request::<DocumentSymbolRequest>(DocumentSymbolParams { - text_document: TextDocumentIdentifier::new(client.uri(file.name)?), - work_done_progress_params: Default::default(), - partial_result_params: Default::default(), - })?; + let response = client + .request::<DocumentSymbolRequest>(DocumentSymbolParams { + text_document: TextDocumentIdentifier::new(client.uri(file.name)), + work_done_progress_params: Default::default(), + partial_result_params: Default::default(), + }) + .unwrap(); - let result = client.shutdown()?; + let result = client.shutdown(); let uri = Url::from_directory_path(result.directory.path()).unwrap(); let uri_redaction = insta::dynamic_redaction(move |content, _path| { content.as_str().unwrap().replace(uri.as_str(), "[tmp]/") }); - Ok(SymbolResult { + SymbolResult { response, uri_redaction, - }) + } } macro_rules! assert_symbols { @@ -49,7 +50,7 @@ macro_rules! assert_symbols { } #[test] -fn enumerate_nested() -> Result<()> { +fn enumerate_nested() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -78,13 +79,11 @@ fn enumerate_nested() -> Result<()> { }, }, }), - )?); - - Ok(()) + )); } #[test] -fn enumerate_flat() -> Result<()> { +fn enumerate_flat() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -107,13 +106,11 @@ fn enumerate_flat() -> Result<()> { %SRC \newlabel{it:qux}{{2}{1}} "#, serde_json::json!({}), - )?); - - Ok(()) + )); } #[test] -fn equation_nested() -> Result<()> { +fn equation_nested() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -146,13 +143,11 @@ fn equation_nested() -> Result<()> { }, }, }), - )?); - - Ok(()) + )); } #[test] -fn equation_flat() -> Result<()> { +fn equation_flat() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -179,13 +174,11 @@ fn equation_flat() -> Result<()> { %SRC \newlabel{eq:foo}{{1}{1}} "#, serde_json::json!({}), - )?); - - Ok(()) + )); } #[test] -fn float_nested() -> Result<()> { +fn float_nested() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -228,13 +221,11 @@ fn float_nested() -> Result<()> { }, }, }), - )?); - - Ok(()) + )); } #[test] -fn float_flat() -> Result<()> { +fn float_flat() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -271,13 +262,11 @@ fn float_flat() -> Result<()> { %SRC \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Baz}}{1}\protected@file@percent } "#, serde_json::json!({}), - )?); - - Ok(()) + )); } #[test] -fn section_nested() -> Result<()> { +fn section_nested() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -306,13 +295,11 @@ fn section_nested() -> Result<()> { }, }, }), - )?); - - Ok(()) + )); } #[test] -fn section_flat() -> Result<()> { +fn section_flat() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -335,13 +322,11 @@ fn section_flat() -> Result<()> { %SRC \newlabel{sec:bar}{{2}{1}} "#, serde_json::json!({}), - )?); - - Ok(()) + )); } #[test] -fn theorem_nested() -> Result<()> { +fn theorem_nested() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -381,13 +366,11 @@ fn theorem_nested() -> Result<()> { }, }, }), - )?); - - Ok(()) + )); } #[test] -fn theorem_flat() -> Result<()> { +fn theorem_flat() { assert_symbols!(find_symbols( r#" %TEX main.tex @@ -421,7 +404,5 @@ fn theorem_flat() -> Result<()> { %SRC \newlabel{thm:bar}{{2}{1}} "#, serde_json::json!({}), - )?); - - Ok(()) + )); } diff --git a/support/texlab/tests/integration/lsp/text_document/folding_range.rs b/support/texlab/src/tests/text_document/folding_range.rs index 1d75ba3e0e..4b589222b1 100644 --- a/support/texlab/tests/integration/lsp/text_document/folding_range.rs +++ b/support/texlab/src/tests/text_document/folding_range.rs @@ -1,30 +1,30 @@ -use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::FoldingRangeRequest, ClientCapabilities, FoldingRange, FoldingRangeKind, FoldingRangeParams, TextDocumentIdentifier, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str, expected_ranges: Vec<(u32, u32, u32, u32)>) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str, expected_ranges: Vec<(u32, u32, u32, u32)>) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let actual_foldings = client .request::<FoldingRangeRequest>(FoldingRangeParams { - text_document: TextDocumentIdentifier::new(client.uri(fixture.cursor.unwrap().name)?), + text_document: TextDocumentIdentifier::new(client.uri(fixture.cursor.unwrap().name)), work_done_progress_params: Default::default(), partial_result_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; + client.shutdown(); let expected_foldings = expected_ranges .into_iter() @@ -40,11 +40,10 @@ fn check(fixture: &str, expected_ranges: Vec<(u32, u32, u32, u32)>) -> Result<() .collect(); assert_eq_unordered!(actual_foldings, expected_foldings); - Ok(()) } #[test] -fn latex() -> Result<()> { +fn latex() { check( r#" %TEX main.tex @@ -70,7 +69,7 @@ fn latex() -> Result<()> { } #[test] -fn bibtex() -> Result<()> { +fn bibtex() { check( r#" %BIB main.bib diff --git a/support/texlab/tests/integration/lsp/text_document/formatting.rs b/support/texlab/src/tests/text_document/formatting.rs index a0c02bf4b1..eb6804ca66 100644 --- a/support/texlab/tests/integration/lsp/text_document/formatting.rs +++ b/support/texlab/src/tests/text_document/formatting.rs @@ -1,35 +1,37 @@ -use anyhow::Result; use insta::assert_snapshot; use lsp_types::{ request::Formatting, ClientCapabilities, DocumentFormattingParams, FormattingOptions, TextDocumentIdentifier, }; -use texlab::{LineIndex, LineIndexExt}; -use crate::lsp::{client::Client, fixture}; +use crate::{ + tests::{client::Client, fixture}, + util::{line_index::LineIndex, line_index_ext::LineIndexExt}, +}; -fn format(fixture: &str) -> Result<String> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn format(fixture: &str) -> String { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); let file = fixture.files.into_iter().next().unwrap(); let old_text = file.text.clone(); - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); let actual_edits = client .request::<Formatting>(DocumentFormattingParams { - text_document: TextDocumentIdentifier::new(client.uri(file.name)?), + text_document: TextDocumentIdentifier::new(client.uri(file.name)), work_done_progress_params: Default::default(), options: FormattingOptions { insert_spaces: true, tab_size: 4, ..Default::default() }, - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; + client.shutdown(); let line_index = LineIndex::new(&old_text); let mut actual_text = old_text; @@ -38,24 +40,22 @@ fn format(fixture: &str) -> Result<String> { actual_text.replace_range::<std::ops::Range<usize>>(range.into(), &edit.new_text); } - Ok(actual_text) + actual_text } #[test] -fn bibtex_internal_wrap_long_lines() -> Result<()> { +fn bibtex_internal_wrap_long_lines() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. %SRC Lorem ipsum dolor sit amet, %SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_multiple_entries() -> Result<()> { +fn bibtex_internal_multiple_entries() { assert_snapshot!(format( r#" %BIB main.bib @@ -64,85 +64,69 @@ fn bibtex_internal_multiple_entries() -> Result<()> { %SRC %SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, %SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}""#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_trailing_comma() -> Result<()> { +fn bibtex_internal_trailing_comma() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article{foo, bar = baz}"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_insert_braces() -> Result<()> { +fn bibtex_internal_insert_braces() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article{foo, bar = baz,"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_command() -> Result<()> { +fn bibtex_internal_command() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article{foo, bar = "\baz",}"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_join_strings() -> Result<()> { +fn bibtex_internal_join_strings() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article{foo, bar = "baz" # "qux"}"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_parens() -> Result<()> { +fn bibtex_internal_parens() { assert_snapshot!(format( r#" %BIB main.bib %SRC @article(foo,)"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_string() -> Result<()> { +fn bibtex_internal_string() { assert_snapshot!(format( r#" %BIB main.bib %SRC @string{foo="bar"}"#, - )?); - - Ok(()) + )); } #[test] -fn bibtex_internal_preamble() -> Result<()> { +fn bibtex_internal_preamble() { assert_snapshot!(format( r#" %BIB main.bib %SRC @preamble{ %SRC "foo bar baz" }"#, - )?); - - Ok(()) + )); } diff --git a/support/texlab/tests/integration/lsp/text_document/hover.rs b/support/texlab/src/tests/text_document/hover.rs index 2a9e8c271f..302be82ca3 100644 --- a/support/texlab/tests/integration/lsp/text_document/hover.rs +++ b/support/texlab/src/tests/text_document/hover.rs @@ -1,19 +1,20 @@ -use anyhow::Result; use lsp_types::{ request::HoverRequest, ClientCapabilities, Hover, HoverContents, HoverParams, MarkupContent, MarkupKind, }; -use texlab::{component_db::COMPONENT_DATABASE, LANGUAGE_DATA}; -use crate::lsp::{client::Client, fixture}; +use crate::{ + tests::{client::Client, fixture}, + util::{components::COMPONENT_DATABASE, lang_data::LANGUAGE_DATA}, +}; -fn check(fixture: &str, contents: Option<HoverContents>) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str, contents: Option<HoverContents>) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let range = fixture @@ -23,21 +24,21 @@ fn check(fixture: &str, contents: Option<HoverContents>) -> Result<()> { .and_then(|map| map.values().next()) .map(|file_range| file_range.range); - let actual_hover = client.request::<HoverRequest>(HoverParams { - text_document_position_params: fixture.cursor.unwrap().into_params(&client)?, - work_done_progress_params: Default::default(), - })?; + let actual_hover = client + .request::<HoverRequest>(HoverParams { + text_document_position_params: fixture.cursor.unwrap().into_params(&client), + work_done_progress_params: Default::default(), + }) + .unwrap(); - client.shutdown()?; + client.shutdown(); let expected_hover = contents.map(|contents| Hover { range, contents }); - assert_eq!(actual_hover, expected_hover); - Ok(()) } #[test] -fn empty_latex_document() -> Result<()> { +fn empty_latex_document() { check( r#" %TEX main.tex @@ -49,7 +50,7 @@ fn empty_latex_document() -> Result<()> { } #[test] -fn empty_bibtex_document() -> Result<()> { +fn empty_bibtex_document() { check( r#" %BIB main.bib @@ -61,7 +62,7 @@ fn empty_bibtex_document() -> Result<()> { } #[test] -fn citation_inside_cite() -> Result<()> { +fn citation_inside_cite() { check( r#" %BIB main.bib @@ -81,7 +82,7 @@ fn citation_inside_cite() -> Result<()> { } #[test] -fn citation_inside_entry() -> Result<()> { +fn citation_inside_entry() { check( r#" %BIB main.bib @@ -101,7 +102,7 @@ fn citation_inside_entry() -> Result<()> { } #[test] -fn component_known_package() -> Result<()> { +fn component_known_package() { check( r#" %TEX main.tex @@ -116,7 +117,7 @@ fn component_known_package() -> Result<()> { } #[test] -fn component_unknown_class() -> Result<()> { +fn component_unknown_class() { check( r#" %TEX main.tex @@ -128,7 +129,7 @@ fn component_unknown_class() -> Result<()> { } #[test] -fn entry_type_known_type() -> Result<()> { +fn entry_type_known_type() { check( r#" %BIB main.bib @@ -147,7 +148,7 @@ fn entry_type_known_type() -> Result<()> { } #[test] -fn entry_type_unknown_field() -> Result<()> { +fn entry_type_unknown_field() { check( r#" %BIB main.bib @@ -159,7 +160,7 @@ fn entry_type_unknown_field() -> Result<()> { } #[test] -fn entry_type_key() -> Result<()> { +fn entry_type_key() { check( r#" %BIB main.bib @@ -171,7 +172,7 @@ fn entry_type_key() -> Result<()> { } #[test] -fn field_known() -> Result<()> { +fn field_known() { check( r#" %BIB main.bib @@ -190,7 +191,7 @@ fn field_known() -> Result<()> { } #[test] -fn field_unknown() -> Result<()> { +fn field_unknown() { check( r#" %BIB main.bib @@ -202,7 +203,7 @@ fn field_unknown() -> Result<()> { } #[test] -fn section() -> Result<()> { +fn section() { check( r#" %TEX main.tex @@ -219,7 +220,7 @@ fn section() -> Result<()> { } #[test] -fn string_inside_reference() -> Result<()> { +fn string_inside_reference() { check( r#" %BIB main.bib @@ -237,7 +238,7 @@ fn string_inside_reference() -> Result<()> { } #[test] -fn string_inside_field() -> Result<()> { +fn string_inside_field() { check( r#" %BIB main.bib @@ -251,7 +252,7 @@ fn string_inside_field() -> Result<()> { } #[test] -fn label_theorem_child_file() -> Result<()> { +fn label_theorem_child_file() { check( r#" %TEX main.tex @@ -275,7 +276,7 @@ fn label_theorem_child_file() -> Result<()> { } #[test] -fn label_theorem_child_file_mumber() -> Result<()> { +fn label_theorem_child_file_mumber() { check( r#" %TEX main.tex diff --git a/support/texlab/src/tests/text_document/inlay_hint.rs b/support/texlab/src/tests/text_document/inlay_hint.rs new file mode 100644 index 0000000000..acf5c3e132 --- /dev/null +++ b/support/texlab/src/tests/text_document/inlay_hint.rs @@ -0,0 +1,65 @@ +use insta::assert_json_snapshot; +use lsp_types::{ + request::InlayHintRequest, ClientCapabilities, InlayHint, InlayHintParams, Position, Range, + TextDocumentIdentifier, +}; + +use crate::tests::{client::Client, fixture}; + +fn check(fixture: &str) -> Vec<InlayHint> { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); + + let fixture = fixture::parse(fixture); + let uri = client.uri(fixture.files[0].name); + + for file in fixture.files { + client.open(file.name, file.lang, file.text); + } + + let actual_hints = client + .request::<InlayHintRequest>(InlayHintParams { + text_document: TextDocumentIdentifier::new(uri), + range: Range::new(Position::new(0, 0), Position::new(12, 0)), + work_done_progress_params: Default::default(), + }) + .unwrap() + .unwrap_or_default(); + + client.shutdown(); + actual_hints +} + +#[test] +fn label_definition() { + assert_json_snapshot!(check( + r#" +%TEX main.tex +%SRC \documentclass{article} +%SRC \usepackage{caption} +%SRC \begin{document} +%SRC \section{Foo}\label{sec:foo} +%SRC \section{Bar}\label{sec:bar} +%SRC \subsection{Baz}\label{sec:baz} +%SRC \begin{figure} +%SRC Test +%SRC \label{fig:qux} +%SRC \caption{Qux} +%SRC \end{figure} +%SRC \end{document} + +%TEX main.aux +%SRC \relax +%SRC \providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} +%SRC \newlabel{fig:qux}{{\caption@xref {fig:qux}{ on input line 15}}{1}} +%SRC \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Qux\relax }}{1}{}\protected@file@percent } +%SRC \@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}{}\protected@file@percent } +%SRC \newlabel{sec:foo}{{1}{1}} +%SRC \@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}{}\protected@file@percent } +%SRC \newlabel{sec:bar}{{2}{1}} +%SRC \@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Baz}{1}{}\protected@file@percent } +%SRC \newlabel{sec:baz}{{2.1}{1}} +%SRC \gdef \@abspage@last{1} +"#, + )); +} diff --git a/support/texlab/tests/integration/lsp/text_document/references.rs b/support/texlab/src/tests/text_document/references.rs index ff272673dd..a0ebed1fb4 100644 --- a/support/texlab/tests/integration/lsp/text_document/references.rs +++ b/support/texlab/src/tests/text_document/references.rs @@ -1,45 +1,41 @@ -use anyhow::Result; use assert_unordered::assert_eq_unordered; use lsp_types::{ request::References, ClientCapabilities, Location, ReferenceContext, ReferenceParams, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str, context: ReferenceContext) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str, context: ReferenceContext) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let mut expected_locations = Vec::new(); for ranges in fixture.ranges.values() { - expected_locations.push(Location::new( - client.uri(ranges[&1].name)?, - ranges[&1].range, - )); + expected_locations.push(Location::new(client.uri(ranges[&1].name), ranges[&1].range)); } let actual_locations = client .request::<References>(ReferenceParams { - text_document_position: fixture.cursor.unwrap().into_params(&client)?, + text_document_position: fixture.cursor.unwrap().into_params(&client), context, partial_result_params: Default::default(), work_done_progress_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; + client.shutdown(); assert_eq_unordered!(actual_locations, expected_locations); - Ok(()) } #[test] -fn entry_definition() -> Result<()> { +fn entry_definition() { check( r#" %BIB foo.bib @@ -58,7 +54,7 @@ fn entry_definition() -> Result<()> { } #[test] -fn entry_definition_include_decl() -> Result<()> { +fn entry_definition_include_decl() { check( r#" %BIB foo.bib @@ -78,7 +74,7 @@ fn entry_definition_include_decl() -> Result<()> { } #[test] -fn entry_reference() -> Result<()> { +fn entry_reference() { check( r#" %BIB foo.bib @@ -97,7 +93,7 @@ fn entry_reference() -> Result<()> { } #[test] -fn entry_reference_include_decl() -> Result<()> { +fn entry_reference_include_decl() { check( r#" %BIB foo.bib @@ -117,7 +113,7 @@ fn entry_reference_include_decl() -> Result<()> { } #[test] -fn label_definition() -> Result<()> { +fn label_definition() { check( r#" %TEX foo.tex @@ -136,7 +132,7 @@ fn label_definition() -> Result<()> { } #[test] -fn label_definition_include_decl() -> Result<()> { +fn label_definition_include_decl() { check( r#" %TEX foo.tex @@ -156,7 +152,7 @@ fn label_definition_include_decl() -> Result<()> { } #[test] -fn label_reference() -> Result<()> { +fn label_reference() { check( r#" %TEX foo.tex @@ -180,7 +176,7 @@ fn label_reference() -> Result<()> { } #[test] -fn label_reference_include_decl() -> Result<()> { +fn label_reference_include_decl() { check( r#" %TEX foo.tex @@ -205,7 +201,7 @@ fn label_reference_include_decl() -> Result<()> { } #[test] -fn string_reference() -> Result<()> { +fn string_reference() { check( r#" %BIB main.bib @@ -222,7 +218,7 @@ fn string_reference() -> Result<()> { } #[test] -fn string_reference_include_decl() -> Result<()> { +fn string_reference_include_decl() { check( r#" %BIB main.bib @@ -240,7 +236,7 @@ fn string_reference_include_decl() -> Result<()> { } #[test] -fn string_definition() -> Result<()> { +fn string_definition() { check( r#" %BIB main.bib @@ -257,7 +253,7 @@ fn string_definition() -> Result<()> { } #[test] -fn string_definition_include_decl() -> Result<()> { +fn string_definition_include_decl() { check( r#" %BIB main.bib diff --git a/support/texlab/tests/integration/lsp/text_document/rename.rs b/support/texlab/src/tests/text_document/rename.rs index 6b5a7e4978..2bbdfb1513 100644 --- a/support/texlab/tests/integration/lsp/text_document/rename.rs +++ b/support/texlab/src/tests/text_document/rename.rs @@ -1,43 +1,42 @@ use std::collections::HashMap; -use anyhow::Result; use lsp_types::{request::Rename, ClientCapabilities, RenameParams, TextEdit, Url, WorkspaceEdit}; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; -fn check(fixture: &str, new_name: &str) -> Result<()> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn check(fixture: &str, new_name: &str) { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let mut expected_changes: HashMap<Url, Vec<TextEdit>> = HashMap::new(); for ranges in fixture.ranges.values() { expected_changes - .entry(client.uri(ranges[&1].name)?) + .entry(client.uri(ranges[&1].name)) .or_default() .push(TextEdit::new(ranges[&1].range, new_name.to_string())); } let actual_edit = client .request::<Rename>(RenameParams { - text_document_position: fixture.cursor.unwrap().into_params(&client)?, + text_document_position: fixture.cursor.unwrap().into_params(&client), new_name: new_name.to_string(), work_done_progress_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - client.shutdown()?; + client.shutdown(); assert_eq!(actual_edit, WorkspaceEdit::new(expected_changes)); - Ok(()) } #[test] -fn command() -> Result<()> { +fn command() { check( r#" %TEX foo.tex @@ -55,7 +54,7 @@ fn command() -> Result<()> { } #[test] -fn entry() -> Result<()> { +fn entry() { check( r#" %BIB main.bib @@ -73,7 +72,7 @@ fn entry() -> Result<()> { } #[test] -fn citation() -> Result<()> { +fn citation() { check( r#" %BIB main.bib @@ -91,7 +90,7 @@ fn citation() -> Result<()> { } #[test] -fn label() -> Result<()> { +fn label() { check( r#" %TEX foo.tex diff --git a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_package_ref.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_package_ref.snap new file mode 100644 index 0000000000..88ba06e91c --- /dev/null +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_package_ref.snap @@ -0,0 +1,16 @@ +--- +source: src/tests/text_document/completion.rs +expression: "complete(r#\"\n%TEX main.tex\n%SRC \\acrodef{fpsLabel}[FPS]{Frames per Second}\n%SRC \\ac{f\n%CUR ^\n%1.1 ^\"#)?" +--- +[ + { + "kind": 1, + "label": "fpsLabel", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "fpsLabel" + } + } +] diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_empty.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_empty.snap index 33c5b459e1..65259d44a7 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_empty.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_empty.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 89 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n%SRC \\acrshort{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "fpsLabel", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_open_brace.snap index 41a71b7951..f326640993 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 117 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n%SRC \\acrshort{f\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "fpsLabel", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_simple.snap index 3d31151a72..db7adf0259 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__acronym_ref_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__acronym_ref_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 75 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n%SRC \\acrshort{f}\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "fpsLabel", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_empty.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_empty.snap index 41c438baf6..75a73c5e32 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_empty.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_empty.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 159 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\mathbb{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "A", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "B", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "C", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "D", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "E", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_open_brace.snap index 7009557720..dd33c0eac3 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 186 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\mathbb{\n%CUR ^\n%SRC Test\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "A", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "B", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "C", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "D", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\m } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "E", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_word.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_word.snap index 2ea7a4649d..cf88ba4b2b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__argument_word.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__argument_word.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 172 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{amsfonts}\n%SRC \\mathbb{A}\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "A", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__begin_environment_without_snippet_support.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__begin_environment_without_snippet_support.snap index 468ea3ea5f..167e764aef 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__begin_environment_without_snippet_support.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__begin_environment_without_snippet_support.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 215 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\beg\n%CUR ^\n%1.1 ^^^\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "begin", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\beg\n%CUR ^\n%1.1 ^^^\"#) } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "begingroup", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\beg\n%CUR ^\n%1.1 ^^^\"#) } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "AtBeginDocument", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\beg\n%CUR ^\n%1.1 ^^^\"#) } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "AtBeginDvi", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\beg\n%CUR ^\n%1.1 ^^^\"#) } }, { - "data": "[data]", "detail": "â‹€, built-in", "documentation": "[documentation]", "kind": 1, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation.snap index 517df0a0df..70453476d5 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 228 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\documentclass{article}\n%SRC \\bibliography{main}\n%SRC \\begin{document}\n%SRC \\cite{\n%CUR ^\n%SRC \\end{document}\n\n%BIB main.bib\n%SRC @article{foo:2019,\n%SRC author = {Foo Bar},\n%SRC title = {Baz Qux},\n%SRC year = {2019},\n%SRC }\n%SRC \n%SRC @article{bar:2005,}\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_acronym.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_acronym.snap index a679c4c42b..5cf8260317 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_acronym.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_acronym.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 286 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\addbibresource{main.bib}\n%SRC \\DeclareAcronym{foo}{cite={}}\n%CUR ^\n\n%BIB main.bib\n%SRC @article{foo,}\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace.snap index cf2056b7e7..3143481442 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 253 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\addbibresource{main.bib}\n%SRC \\cite{\n%CUR ^\n\n%BIB main.bib\n%SRC @article{foo,}\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace_multiple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace_multiple.snap index 7619c22002..21faa28ecc 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__citation_open_brace_multiple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__citation_open_brace_multiple.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 269 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\addbibresource{main.bib}\n%SRC \\cite{foo,a\n%CUR ^\n%1.1 ^\n\n%BIB main.bib\n%SRC @article{foo,}\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_open_brace.snap index 651c6e4f36..825d607885 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 334 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "HTML", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "RGB", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "cmyk", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "gray", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "rgb", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_open_brace.snap index 4fb23233c9..27dac7d130 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 358 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "HTML", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "RGB", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "cmyk", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "gray", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "rgb", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_simple.snap index 4b7f137e4f..c2a2640786 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_set_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_set_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 346 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "HTML", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "RGB", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "cmyk", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "gray", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolorset{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "rgb", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_simple.snap index a160c859c3..da3431986d 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_model_definition_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_model_definition_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 322 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "HTML", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "RGB", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "cmyk", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "gray", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\definecolor{foo}{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "rgb", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_open_brace.snap index df57a6e6ef..f2ae7d8db0 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 395 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "Apricot", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Aquamarine", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Bittersweet", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Black", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Blue", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_simple.snap index fb4e2bee73..fc3db2911b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 370 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "Apricot", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{}\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Aquamarine", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{}\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Bittersweet", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{}\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Black", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{}\n%CUR ^\"#)?" } }, { - "data": "[data]", "kind": 1, "label": "Blue", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_word.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_word.snap index b730f14a42..cd671de9b9 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__color_word.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__color_word.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 382 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{re}\n%CUR ^\n%1.1 ^^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "red", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{re}\n%CUR ^\n%1. } }, { - "data": "[data]", "kind": 1, "label": "Red", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{re}\n%CUR ^\n%1. } }, { - "data": "[data]", "kind": 1, "label": "RedOrange", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{re}\n%CUR ^\n%1. } }, { - "data": "[data]", "kind": 1, "label": "RedViolet", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\color{re}\n%CUR ^\n%1. } }, { - "data": "[data]", "kind": 1, "label": "BrickRed", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_bibtex.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_bibtex.snap index 545a13af3c..76dd1d07f8 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_bibtex.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_bibtex.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 446 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{b, \n%SRC c = {\\LaT }\n%CUR ^\n%1.1 ^^^\n%SRC }\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "LaTeX", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{b, \n%SRC c = {\\La } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "LaTeXe", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{b, \n%SRC c = {\\La } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "latexreleaseversion", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{b, \n%SRC c = {\\La } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "LastDeclaredEncoding", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{b, \n%SRC c = {\\La } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "last", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple.snap index 8414866ca1..c974de42b7 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 407 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\\n%CUR ^\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "!", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\\n%CUR ^\"#)?" } }, { - "data": "[data]", "detail": "built-in", "documentation": "[documentation]", "kind": 1, @@ -30,7 +27,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\\n%CUR ^\"#)?" } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "#", @@ -42,7 +38,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\\n%CUR ^\"#)?" } }, { - "data": "[data]", "detail": "$, built-in", "documentation": "[documentation]", "kind": 1, @@ -55,7 +50,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\\n%CUR ^\"#)?" } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "%", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple_package.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple_package.snap index c08f480f7e..ada70e293a 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_command_simple_package.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_command_simple_package.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 432 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lipsum}\n%SRC \\lips\n%CUR ^\n%1.1 ^^^^\"#)?" --- [ { - "data": "[data]", "detail": "lipsum.sty", "kind": 1, "label": "lipsum", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lipsum}\n%SRC \\lip } }, { - "data": "[data]", "detail": "lipsum.sty", "kind": 1, "label": "lipsumexp", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lipsum}\n%SRC \\lip } }, { - "data": "[data]", "detail": "lipsum.sty", "kind": 1, "label": "LipsumPar", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lipsum}\n%SRC \\lip } }, { - "data": "[data]", "detail": "lipsum.sty", "kind": 1, "label": "LipsumProtect", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lipsum}\n%SRC \\lip } }, { - "data": "[data]", "detail": "lipsum.sty", "kind": 1, "label": "LipsumRestoreAll", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_class.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_class.snap index ff16b8e7b6..bb409a442b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_class.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_class.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 487 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\documentclass{article}\n%SRC \\begin{thein}\n%CUR ^\n%1.1 ^^^^^\"#)?" --- [ { - "data": "[data]", "detail": "article.cls", "kind": 1, "label": "theindex", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_command_definition.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_command_definition.snap index e07204dd14..d319eeb734 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_command_definition.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_command_definition.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 501 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newcommand{\\foo}{\\begin{doc}\n%CUR ^\n%1.1 ^^^\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "document", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple.snap index 6c3be2426e..f6b8710db3 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 461 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{doc\n%CUR ^\n%1.1 ^^^\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "document", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple_end.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple_end.snap index af0e4ca762..e3ffa551d3 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__component_environment_simple_end.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__component_environment_simple_end.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 474 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{document}\n%SRC \\end{\n%CUR ^\"#)?" --- [ { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "document", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{document}\n%SRC \\end{\n } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "abstract", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{document}\n%SRC \\end{\n } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "array", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{document}\n%SRC \\end{\n } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "center", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\begin{document}\n%SRC \\end{\n } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "csname", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_preamble.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_preamble.snap index 281254f2b8..5f29c307a7 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_preamble.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_preamble.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 565 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @preamble{\n%CUR ^\n%1.1 ^^^^^^^^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "preamble", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_string.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_string.snap index 706bd78d07..5b18f17cfe 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_after_string.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_after_string.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 578 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @string{\n%CUR ^\n%1.1 ^^^^^^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "string", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_at_empty.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_at_empty.snap index 19d2a451af..7928676b92 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_at_empty.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_at_empty.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 514 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @\n%CUR ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "article", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @\n%CUR ^\"#)?" } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "artwork", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @\n%CUR ^\"#)?" } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "audio", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @\n%CUR ^\"#)?" } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "bibnote", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @\n%CUR ^\"#)?" } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "book", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_article.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_article.snap index 654258a594..1522a7594a 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_article.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_article.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 552 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article\n%CUR ^\n%1.1 ^^^^^^^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "article", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_preamble.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_preamble.snap index 6a4a79f14d..50e7a2162d 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_preamble.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_preamble.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 526 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @preamble\n%CUR ^\n%1.1 ^^^^^^^^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "preamble", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_string.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_string.snap index b3b6f2928b..0c00ddd5fc 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_before_string.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_before_string.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 539 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @string\n%CUR ^\n%1.1 ^^^^^^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "string", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_complete_entry.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_complete_entry.snap index 2a18a34789..6afb028f95 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__entry_type_complete_entry.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__entry_type_complete_entry.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 591 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = {foo}}\n%CUR ^\n%1.1 ^^^^^^^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "article", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_closed.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_closed.snap index 10f3b1d89a..86a6e06c89 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_closed.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_closed.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 616 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "abstract", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,}\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "addendum", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,}\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "address", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,}\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "afterword", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,}\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "annotation", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_open.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_open.snap index bb8b03efda..75a242d25d 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_empty_entry_open.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_empty_entry_open.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 604 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,\n%CUR ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "abstract", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "addendum", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "address", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "afterword", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo,\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "annotation", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_field_name.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_field_name.snap index 32f1df6369..3178da8d07 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_field_name.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_field_name.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 628 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, a\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "abstract", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, a\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "addendum", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, a\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "address", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, a\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "afterword", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, a\n%CUR } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "annotation", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_closed.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_closed.snap index e1c61bab4c..80595edf98 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_closed.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_closed.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 654 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit}\n%CUR ^\n%1.1 ^^^^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "edition", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editor", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editora", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editoratype", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editorb", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_open.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_open.snap index b86d4e96b0..8de75313e8 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__field_entry_two_fields_name_open.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__field_entry_two_fields_name_open.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 641 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit\n%CUR ^\n%1.1 ^^^^\"#)?" --- [ { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "edition", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editor", @@ -29,7 +26,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editora", @@ -41,7 +37,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editoratype", @@ -53,7 +48,6 @@ expression: "complete(r#\"\n%BIB main.bib\n%SRC @article{foo, author = bar, edit } }, { - "data": "[data]", "documentation": "[documentation]", "kind": 1, "label": "editorb", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_open_brace.snap index 25c90c0a4e..36a77e92e5 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 145 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n%SRC \\gls{f\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "fpsLabel", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_simple.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_simple.snap index a9c8bc5478..7a4d9a584b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__glossary_ref_simple.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__glossary_ref_simple.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 131 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n%SRC \\gls{f}\n%CUR ^\n%1.1 ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "fpsLabel", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_closed_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_closed_brace.snap index 1b15dff00b..f346f67f41 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_closed_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_closed_brace.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 706 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\documentclass{art}\n%CUR ^\n%1.1 ^^^\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_open_brace.snap index 4118d60707..0d236ae496 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_class_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_class_open_brace.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 693 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\documentclass{art \\foo\n%CUR ^\n%1.1 ^^^\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_closed_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_closed_brace.snap index 141441047f..2952c5d401 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_closed_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_closed_brace.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 680 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lips}\n%CUR ^\n%1.1 ^^^^\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_open_brace.snap index c188633107..349830d5f2 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__import_package_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__import_package_open_brace.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 667 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepackage{lips\n%CUR ^\n%1.1 ^^^^\"#)?" --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__label.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__label.snap index e30dd28ab9..a4b26aa41d 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__label.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__label.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 719 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX foo.tex\n%SRC \\documentclass{article}\n%SRC \n%SRC \\usepackage{amsmath}\n%SRC \\usepackage{caption}\n%SRC \\usepackage{amsthm}\n%SRC \\newtheorem{lemma}{Lemma}\n%SRC \n%SRC \\begin{document}\n%SRC \n%SRC \\section{Foo}%\n%SRC \\label{sec:foo}\n%SRC \n%SRC \\begin{equation}%\n%SRC \\label{eq:foo}\n%SRC 1 + 1 = 2\n%SRC \\end{equation}\n%SRC \n%SRC \\begin{equation}%\n%SRC \\label{eq:bar}\n%SRC 1 + 1 = 2\n%SRC \\end{equation}\n%SRC \n%SRC \\begin{figure}%\n%SRC \\LaTeX{}\n%SRC \\caption{Baz}%\n%SRC \\label{fig:baz}\n%SRC \\end{figure}\n%SRC \n%SRC \\begin{lemma}%\n%SRC \\label{thm:foo}\n%SRC 1 + 1 = 2\n%SRC \\end{lemma}\n%SRC \n%SRC \\include{bar}\n%SRC \n%SRC \\end{document}\n\n%TEX bar.tex\n%SRC \\section{Bar}%\n%SRC \\label{sec:bar}\n%SRC \n%SRC Lorem ipsum dolor sit amet.\n%SRC \\ref{}\n%CUR ^\n\n%TEX foo.aux\n%SRC \\relax\n%SRC \\@writefile{lof}{\\contentsline {figure}{\\numberline {1}{\\ignorespaces Baz\\relax }}{1}\\protected@file@percent }\n%SRC \\providecommand*\\caption@xref[2]{\\@setref\\relax\\@undefined{#1}}\n%SRC \\newlabel{fig:baz}{{1}{1}}\n%SRC \\@writefile{toc}{\\contentsline {section}{\\numberline {1}Foo}{1}\\protected@file@percent }\n%SRC \\newlabel{sec:foo}{{1}{1}}\n%SRC \\newlabel{eq:foo}{{1}{1}}\n%SRC \\newlabel{eq:bar}{{2}{1}}\n%SRC \\newlabel{thm:foo}{{1}{1}}\n%SRC \\@input{bar.aux}\"#)?" --- [ { - "data": "[data]", "detail": "Equation (2)", "filterText": "eq:bar Equation (2)", "kind": 1, @@ -18,7 +16,6 @@ expression: "complete(r#\"\n%TEX foo.tex\n%SRC \\documentclass{article}\n%SRC \n } }, { - "data": "[data]", "detail": "Equation (1)", "filterText": "eq:foo Equation (1)", "kind": 1, @@ -31,7 +28,6 @@ expression: "complete(r#\"\n%TEX foo.tex\n%SRC \\documentclass{article}\n%SRC \n } }, { - "data": "[data]", "detail": "Figure 1", "documentation": "[documentation]", "filterText": "fig:baz Figure 1: Baz", @@ -45,7 +41,6 @@ expression: "complete(r#\"\n%TEX foo.tex\n%SRC \\documentclass{article}\n%SRC \n } }, { - "data": "[data]", "detail": "Section (Bar)", "filterText": "sec:bar Section (Bar)", "kind": 1, @@ -58,7 +53,6 @@ expression: "complete(r#\"\n%TEX foo.tex\n%SRC \\documentclass{article}\n%SRC \n } }, { - "data": "[data]", "detail": "Section 1 (Foo)", "filterText": "sec:foo Section 1 (Foo)", "kind": 1, diff --git a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap new file mode 100644 index 0000000000..5ee9c3c207 --- /dev/null +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__project_resolution.snap @@ -0,0 +1,61 @@ +--- +source: src/tests/text_document/completion.rs +expression: "complete(r#\"\n%TEX main.tex\n%SRC \\documentclass{article}\n%SRC \\import{sub}{sub/sub.tex}\n%SRC \\lipsu\n%CUR ^\n%1.1 ^^^^^\n\n%TEX sub/sub.tex\n%SRC \\input{child.tex}\n\n%TEX sub/child.tex\n%SRC \\usepackage{lipsum}\n\n\"#)" +--- +[ + { + "detail": "lipsum.sty", + "kind": 1, + "label": "lipsum", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "lipsum" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "lipsumexp", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "lipsumexp" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumPar", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumPar" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumProtect", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumProtect" + } + }, + { + "detail": "lipsum.sty", + "kind": 1, + "label": "LipsumRestoreAll", + "preselect": false, + "sortText": "[sortText]", + "textEdit": { + "range": "[range]", + "newText": "LipsumRestoreAll" + } + } +] diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_begin.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_begin.snap index b6964fe89c..a4de708b1b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_begin.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_begin.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 785 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newtheorem{lemma}{Lemma}\n%SRC \\begin{lem \n%CUR ^\n%1.1 ^^^\"#)?" --- [ { - "data": "[data]", "detail": "user-defined", "kind": 1, "label": "lemma", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_end.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_end.snap index 60fdc37edb..0c2c20083e 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__theorem_end.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__theorem_end.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 799 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\newtheorem{lemma}{Lemma}\n%SRC \\begin{}\n%SRC \\end{lem\n%CUR ^\n%1.1 ^^^\"#)?" --- [ { - "data": "[data]", "detail": "user-defined", "kind": 1, "label": "lemma", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_closed_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_closed_brace.snap index a1d7354f8f..f2a00d22bb 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_closed_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_closed_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 826 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{}\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "arrows", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "arrows.meta", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "arrows.spaced", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "curvilinear", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{}\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "datavisualization.barcharts", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_open_brace.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_open_brace.snap index 3c8a7a4b79..62bb3729b7 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__tikz_library_open_brace.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__tikz_library_open_brace.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 814 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{\n%CUR ^\"#)?" --- [ { - "data": "[data]", "kind": 1, "label": "arrows", "preselect": false, @@ -16,7 +14,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "arrows.meta", "preselect": false, @@ -27,7 +24,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "arrows.spaced", "preselect": false, @@ -38,7 +34,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "curvilinear", "preselect": false, @@ -49,7 +44,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\usepgflibrary{\n%CUR } }, { - "data": "[data]", "kind": 1, "label": "datavisualization.barcharts", "preselect": false, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_command.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_command.snap index c5c6b741f3..fe0a397706 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_command.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_command.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 838 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\foobar\n%SRC \\fooba\n%CUR ^\n%1.1 ^^^^^\n%SRC \\begin{foo}\n%SRC \\end{foo}\n%SRC \\begin{fo}\n\"#)?" --- [ { - "data": "[data]", "detail": "user-defined", "kind": 1, "label": "foobar", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_environment.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_environment.snap index d760617880..7230e9a951 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__completion__user_environment.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__completion__user_environment.snap @@ -1,11 +1,9 @@ --- -source: tests/integration/lsp/text_document/completion.rs -assertion_line: 856 +source: src/tests/text_document/completion.rs expression: "complete(r#\"\n%TEX main.tex\n%SRC \\foobar\n%SRC \\fooba\n%SRC \\begin{foo}\n%SRC \\end{foo}\n%SRC \\begin{fo}\n%CUR ^\n%1.1 ^^\n\"#)?" --- [ { - "data": "[data]", "detail": "user-defined", "kind": 1, "label": "foo", @@ -17,7 +15,6 @@ expression: "complete(r#\"\n%TEX main.tex\n%SRC \\foobar\n%SRC \\fooba\n%SRC \\b } }, { - "data": "[data]", "detail": "built-in", "kind": 1, "label": "filecontents", diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__did_change_configuration__invalid_configuration.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__did_change_configuration__invalid_configuration.snap index 4f41cfbeb2..1400d80167 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__did_change_configuration__invalid_configuration.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__did_change_configuration__invalid_configuration.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/did_change_configuration.rs -assertion_line: 37 +source: src/tests/text_document/did_change_configuration.rs expression: message --- The texlab configuration is invalid; using the default settings instead. diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_flat.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_flat.snap index 3293d55600..4c5a17fb98 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_flat.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_flat.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 88 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_nested.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_nested.snap index b2753ba69f..630311f32e 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__enumerate_nested.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__enumerate_nested.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 53 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_flat.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_flat.snap index b1a4630dab..24ab44c772 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_flat.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_flat.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 156 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_nested.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_nested.snap index fc707bd031..2efe7a4796 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__equation_nested.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__equation_nested.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 117 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_flat.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_flat.snap index da456f914e..3d2537d85b 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_flat.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_flat.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 238 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_nested.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_nested.snap index 4f60c21c92..18c5f3ca93 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__float_nested.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__float_nested.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 189 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_flat.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_flat.snap index 85e72e90e1..87ff442db1 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_flat.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_flat.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 316 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_nested.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_nested.snap index 97ae75eac4..bf4fea547e 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__section_nested.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__section_nested.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 281 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_flat.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_flat.snap index 9af601da0d..d033c3ca62 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_flat.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_flat.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 391 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_nested.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_nested.snap index 6a81f96fa6..22844dd700 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__document_symbol__theorem_nested.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__document_symbol__theorem_nested.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/document_symbol.rs -assertion_line: 345 +source: src/tests/text_document/document_symbol.rs expression: result.response --- [ diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_command.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_command.snap index 1add9efc6a..c7d1491245 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_command.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_command.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 96 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = \"\\baz\",}\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_insert_braces.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_insert_braces.snap index ee9be8c822..d05b077188 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_insert_braces.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_insert_braces.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 85 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = baz,\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_join_strings.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_join_strings.snap index 8c2a21f579..8fb3765129 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_join_strings.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_join_strings.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 107 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = \"baz\" # \"qux\"}\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_multiple_entries.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_multiple_entries.snap index cf228db867..2496f9b5e5 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_multiple_entries.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_multiple_entries.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 59 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, \n%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\n%SRC \n%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, \n%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\"\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_parens.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_parens.snap index 58e98f7ba5..883b97b375 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_parens.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_parens.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 118 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article(foo,)\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_preamble.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_preamble.snap index a82706dbf6..fdac219c35 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_preamble.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_preamble.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 140 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @preamble{\n%SRC \"foo bar baz\" }\"#)?" --- @preamble{"foo bar baz"} diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_string.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_string.snap index 3234fca52c..8f9589773e 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_string.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_string.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 129 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @string{foo=\"bar\"}\"#)?" --- @string{foo = "bar"} diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_trailing_comma.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_trailing_comma.snap index 1231f1795f..1051e00cf3 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_trailing_comma.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_trailing_comma.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 74 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = baz}\"#)?" --- @article{foo, diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_wrap_long_lines.snap index fd9355025c..e7e1f39386 100644 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__formatting__bibtex_internal_wrap_long_lines.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/text_document/formatting.rs -assertion_line: 46 +source: src/tests/text_document/formatting.rs expression: "format(r#\"\n%BIB main.bib\n%SRC @article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n%SRC Lorem ipsum dolor sit amet,\n%SRC consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\"#)?" --- @article{foo, diff --git a/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__inlay_hint__label_definition.snap b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__inlay_hint__label_definition.snap new file mode 100644 index 0000000000..ff04d65efb --- /dev/null +++ b/support/texlab/src/tests/text_document/snapshots/texlab__tests__text_document__inlay_hint__label_definition.snap @@ -0,0 +1,38 @@ +--- +source: src/tests/text_document/inlay_hint.rs +expression: "check(r#\"\n%TEX main.tex\n%SRC \\documentclass{article}\n%SRC \\usepackage{caption}\n%SRC \\begin{document}\n%SRC \\section{Foo}\\label{sec:foo}\n%SRC \\section{Bar}\\label{sec:bar}\n%SRC \\subsection{Baz}\\label{sec:baz}\n%SRC \\begin{figure}\n%SRC Test\n%SRC \\label{fig:qux}\n%SRC \\caption{Qux}\n%SRC \\end{figure}\n%SRC \\end{document}\n\n%TEX main.aux\n%SRC \\relax \n%SRC \\providecommand*\\caption@xref[2]{\\@setref\\relax\\@undefined{#1}}\n%SRC \\newlabel{fig:qux}{{\\caption@xref {fig:qux}{ on input line 15}}{1}}\n%SRC \\@writefile{lof}{\\contentsline {figure}{\\numberline {1}{\\ignorespaces Qux\\relax }}{1}{}\\protected@file@percent }\n%SRC \\@writefile{toc}{\\contentsline {section}{\\numberline {1}Foo}{1}{}\\protected@file@percent }\n%SRC \\newlabel{sec:foo}{{1}{1}}\n%SRC \\@writefile{toc}{\\contentsline {section}{\\numberline {2}Bar}{1}{}\\protected@file@percent }\n%SRC \\newlabel{sec:bar}{{2}{1}}\n%SRC \\@writefile{toc}{\\contentsline {subsection}{\\numberline {2.1}Baz}{1}{}\\protected@file@percent }\n%SRC \\newlabel{sec:baz}{{2.1}{1}}\n%SRC \\gdef \\@abspage@last{1}\n\"#)?" +--- +[ + { + "position": { + "line": 3, + "character": 27 + }, + "label": "Section 1 (Foo)", + "paddingLeft": true + }, + { + "position": { + "line": 4, + "character": 27 + }, + "label": "Section 2 (Bar)", + "paddingLeft": true + }, + { + "position": { + "line": 5, + "character": 30 + }, + "label": "Subsection 2.1 (Baz)", + "paddingLeft": true + }, + { + "position": { + "line": 8, + "character": 18 + }, + "label": "Figure fig:qux: Qux", + "paddingLeft": true + } +] diff --git a/support/texlab/tests/integration/lsp/workspace.rs b/support/texlab/src/tests/workspace.rs index 15e0679dea..15e0679dea 100644 --- a/support/texlab/tests/integration/lsp/workspace.rs +++ b/support/texlab/src/tests/workspace.rs diff --git a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_bibtex.snap b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_bibtex.snap index 8b71b0519e..16963641bf 100644 --- a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_bibtex.snap +++ b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_bibtex.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/workspace/symbol.rs -assertion_line: 145 +source: src/tests/workspace/symbol.rs expression: result.actual_symbols --- [ diff --git a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_figure.snap b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_figure.snap index a2343d994b..1b1d2371a4 100644 --- a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_figure.snap +++ b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_figure.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/workspace/symbol.rs -assertion_line: 127 +source: src/tests/workspace/symbol.rs expression: result.actual_symbols --- [ diff --git a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_item.snap b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_item.snap index 37dad570c9..ed45c13cf1 100644 --- a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_item.snap +++ b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_item.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/workspace/symbol.rs -assertion_line: 133 +source: src/tests/workspace/symbol.rs expression: result.actual_symbols --- [ diff --git a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_math.snap b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_math.snap index 8b98b614a3..d4cea99cc5 100644 --- a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_math.snap +++ b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_math.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/workspace/symbol.rs -assertion_line: 139 +source: src/tests/workspace/symbol.rs expression: result.actual_symbols --- [ diff --git a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_section.snap b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_section.snap index b4974c9d7f..3a3ef78ab2 100644 --- a/support/texlab/tests/integration/lsp/workspace/snapshots/integration__lsp__workspace__symbol__filter_type_section.snap +++ b/support/texlab/src/tests/workspace/snapshots/texlab__tests__workspace__symbol__filter_type_section.snap @@ -1,6 +1,5 @@ --- -source: tests/integration/lsp/workspace/symbol.rs -assertion_line: 121 +source: src/tests/workspace/symbol.rs expression: result.actual_symbols --- [ diff --git a/support/texlab/tests/integration/lsp/workspace/symbol.rs b/support/texlab/src/tests/workspace/symbol.rs index 0af7534af3..626cce3c0b 100644 --- a/support/texlab/tests/integration/lsp/workspace/symbol.rs +++ b/support/texlab/src/tests/workspace/symbol.rs @@ -1,23 +1,22 @@ -use anyhow::Result; use insta::{assert_json_snapshot, internals::Redaction}; use lsp_types::{ request::WorkspaceSymbol, ClientCapabilities, SymbolInformation, Url, WorkspaceSymbolParams, }; -use crate::lsp::{client::Client, fixture}; +use crate::tests::{client::Client, fixture}; struct SymbolResult { actual_symbols: Vec<SymbolInformation>, uri_redaction: Redaction, } -fn find_symbols(fixture: &str, query: &str) -> Result<SymbolResult> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; +fn find_symbols(fixture: &str, query: &str) -> SymbolResult { + let mut client = Client::spawn(); + client.initialize(ClientCapabilities::default(), None); let fixture = fixture::parse(fixture); for file in fixture.files { - client.open(file.name, file.lang, file.text)?; + client.open(file.name, file.lang, file.text); } let actual_symbols = client @@ -25,20 +24,21 @@ fn find_symbols(fixture: &str, query: &str) -> Result<SymbolResult> { query: query.to_string(), work_done_progress_params: Default::default(), partial_result_params: Default::default(), - })? + }) + .unwrap() .unwrap_or_default(); - let result = client.shutdown()?; + let result = client.shutdown(); let uri = Url::from_directory_path(result.directory.path()).unwrap(); let uri_redaction = insta::dynamic_redaction(move |content, _path| { content.as_str().unwrap().replace(uri.as_str(), "[tmp]/") }); - Ok(SymbolResult { + SymbolResult { actual_symbols, uri_redaction, - }) + } } macro_rules! assert_symbols { @@ -117,31 +117,26 @@ const FIXTURE: &str = r#" %SRC @string{bar = "bar"}"#; #[test] -fn filter_type_section() -> Result<()> { - assert_symbols!(find_symbols(FIXTURE, "section")?); - Ok(()) +fn filter_type_section() { + assert_symbols!(find_symbols(FIXTURE, "section")); } #[test] -fn filter_type_figure() -> Result<()> { - assert_symbols!(find_symbols(FIXTURE, "figure")?); - Ok(()) +fn filter_type_figure() { + assert_symbols!(find_symbols(FIXTURE, "figure")); } #[test] -fn filter_type_item() -> Result<()> { - assert_symbols!(find_symbols(FIXTURE, "item")?); - Ok(()) +fn filter_type_item() { + assert_symbols!(find_symbols(FIXTURE, "item")); } #[test] -fn filter_type_math() -> Result<()> { - assert_symbols!(find_symbols(FIXTURE, "math")?); - Ok(()) +fn filter_type_math() { + assert_symbols!(find_symbols(FIXTURE, "math")); } #[test] -fn filter_bibtex() -> Result<()> { - assert_symbols!(find_symbols(FIXTURE, "bibtex")?); - Ok(()) +fn filter_bibtex() { + assert_symbols!(find_symbols(FIXTURE, "bibtex")); } diff --git a/support/texlab/src/util.rs b/support/texlab/src/util.rs new file mode 100644 index 0000000000..1c4d55a19d --- /dev/null +++ b/support/texlab/src/util.rs @@ -0,0 +1,15 @@ +pub mod capabilities; +pub mod chktex; +pub mod components; +pub mod cursor; +pub mod label; +pub mod lang_data; +pub mod line_index; +pub mod line_index_ext; +pub mod lsp_enums; + +use std::path::PathBuf; + +use once_cell::sync::Lazy; + +pub static HOME_DIR: Lazy<Option<PathBuf>> = Lazy::new(|| dirs::home_dir()); diff --git a/support/texlab/src/capabilities.rs b/support/texlab/src/util/capabilities.rs index bcb5bbba8b..987c0b48dd 100644 --- a/support/texlab/src/capabilities.rs +++ b/support/texlab/src/util/capabilities.rs @@ -7,6 +7,8 @@ pub trait ClientCapabilitiesExt { fn has_work_done_progress_support(&self) -> bool; + fn has_completion_markdown_support(&self) -> bool; + fn has_hover_markdown_support(&self) -> bool; fn has_pull_configuration_support(&self) -> bool; @@ -14,6 +16,8 @@ pub trait ClientCapabilitiesExt { fn has_push_configuration_support(&self) -> bool; fn has_file_watching_support(&self) -> bool; + + fn has_snippet_support(&self) -> bool; } impl ClientCapabilitiesExt for ClientCapabilities { @@ -37,13 +41,21 @@ impl ClientCapabilitiesExt for ClientCapabilities { self.window.as_ref().and_then(|cap| cap.work_done_progress) == Some(true) } + fn has_completion_markdown_support(&self) -> bool { + self.text_document + .as_ref() + .and_then(|cap| cap.completion.as_ref()) + .and_then(|cap| cap.completion_item.as_ref()) + .and_then(|cap| cap.documentation_format.as_ref()) + .map_or(false, |formats| formats.contains(&MarkupKind::Markdown)) + } + fn has_hover_markdown_support(&self) -> bool { self.text_document .as_ref() .and_then(|cap| cap.hover.as_ref()) .and_then(|cap| cap.content_format.as_ref()) - .filter(|formats| formats.contains(&MarkupKind::Markdown)) - .is_some() + .map_or(false, |formats| formats.contains(&MarkupKind::Markdown)) } fn has_pull_configuration_support(&self) -> bool { @@ -65,6 +77,15 @@ impl ClientCapabilitiesExt for ClientCapabilities { .and_then(|cap| cap.dynamic_registration) == Some(true) } + + fn has_snippet_support(&self) -> bool { + self.text_document + .as_ref() + .and_then(|cap| cap.completion.as_ref()) + .and_then(|cap| cap.completion_item.as_ref()) + .and_then(|cap| cap.snippet_support) + == Some(true) + } } #[cfg(test)] diff --git a/support/texlab/src/util/chktex.rs b/support/texlab/src/util/chktex.rs new file mode 100644 index 0000000000..29a7ac5630 --- /dev/null +++ b/support/texlab/src/util/chktex.rs @@ -0,0 +1,112 @@ +use std::{ + io::{BufRead, BufReader, Write}, + path::PathBuf, + process::Stdio, +}; + +use encoding_rs_io::DecodeReaderBytesBuilder; +use lsp_types::{DiagnosticSeverity, Position, Range}; +use once_cell::sync::Lazy; +use regex::Regex; + +use crate::{ + db::{ + diagnostics::{Diagnostic, DiagnosticCode}, + Document, Workspace, + }, + Db, +}; + +#[derive(Debug)] +pub struct Command { + text: String, + working_dir: PathBuf, +} + +impl Command { + pub fn new(db: &dyn Db, document: Document) -> Option<Self> { + document.parse(db).as_tex()?; + + let workspace = Workspace::get(db); + let parent = workspace + .parents(db, document) + .iter() + .next() + .map_or(document, Clone::clone); + + let working_dir = workspace + .working_dir(db, parent.directory(db)) + .path(db) + .as_deref()? + .to_owned(); + + log::debug!("Calling ChkTeX from directory: {}", working_dir.display()); + + let text = document.contents(db).text(db).clone(); + + Some(Self { text, working_dir }) + } + + pub fn run(self) -> std::io::Result<Vec<Diagnostic>> { + let mut child = std::process::Command::new("chktex") + .args(&["-I0", "-f%l:%c:%d:%k:%n:%m\n"]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .current_dir(self.working_dir) + .spawn()?; + + let stdout = child.stdout.take().unwrap(); + let reader = std::thread::spawn(move || { + let mut diagnostics = Vec::new(); + let reader = BufReader::new( + DecodeReaderBytesBuilder::new() + .encoding(Some(encoding_rs::UTF_8)) + .utf8_passthru(true) + .strip_bom(true) + .build(stdout), + ); + + for line in reader.lines().flatten() { + let captures = LINE_REGEX.captures(&line).unwrap(); + let line = captures[1].parse::<u32>().unwrap() - 1; + let character = captures[2].parse::<u32>().unwrap() - 1; + let digit = captures[3].parse::<u32>().unwrap(); + let kind = &captures[4]; + let code = &captures[5]; + let message = captures[6].into(); + let range = Range::new( + Position::new(line, character), + Position::new(line, character + digit), + ); + + let severity = match kind { + "Message" => DiagnosticSeverity::INFORMATION, + "Warning" => DiagnosticSeverity::WARNING, + _ => DiagnosticSeverity::ERROR, + }; + + diagnostics.push(Diagnostic { + range, + severity, + code: DiagnosticCode::Chktex(code.into()), + message, + }); + } + + diagnostics + }); + + let mut stdin = child.stdin.take().unwrap(); + let bytes = self.text.into_bytes(); + let writer = std::thread::spawn(move || stdin.write_all(&bytes)); + + child.wait()?; + writer.join().unwrap()?; + let diagnostics = reader.join().unwrap(); + Ok(diagnostics) + } +} + +static LINE_REGEX: Lazy<Regex> = + Lazy::new(|| Regex::new("(\\d+):(\\d+):(\\d+):(\\w+):(\\w+):(.*)").unwrap()); diff --git a/support/texlab/src/util/components.rs b/support/texlab/src/util/components.rs new file mode 100644 index 0000000000..022e7efbc8 --- /dev/null +++ b/support/texlab/src/util/components.rs @@ -0,0 +1,120 @@ +use std::io::Read; + +use flate2::read::GzDecoder; +use itertools::Itertools; +use lsp_types::{MarkupContent, MarkupKind}; +use once_cell::sync::Lazy; +use serde::Deserialize; +use smol_str::SmolStr; + +use crate::{ + db::{analysis::TexLinkKind, Document, Workspace}, + Db, +}; + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ComponentDatabase { + pub components: Vec<Component>, + pub metadata: Vec<ComponentMetadata>, +} + +impl ComponentDatabase { + pub fn find(&self, name: &str) -> Option<&Component> { + self.components.iter().find(|component| { + component + .file_names + .iter() + .any(|file_name| file_name == name) + }) + } + + pub fn linked_components(&self, db: &dyn Db, child: Document) -> Vec<&Component> { + Workspace::get(db) + .related(db, child) + .iter() + .filter_map(|document| document.parse(db).as_tex()) + .flat_map(|data| data.analyze(db).links(db)) + .filter_map(|link| match link.kind(db) { + TexLinkKind::Sty => Some(format!("{}.sty", link.path(db).text(db))), + TexLinkKind::Cls => Some(format!("{}.cls", link.path(db).text(db))), + _ => None, + }) + .filter_map(|name| self.find(&name)) + .chain(std::iter::once(self.kernel())) + .flat_map(|comp| { + comp.references + .iter() + .filter_map(|name| self.find(name)) + .chain(std::iter::once(comp)) + }) + .unique_by(|comp| &comp.file_names) + .collect() + } + + pub fn kernel(&self) -> &Component { + self.components + .iter() + .find(|component| component.file_names.is_empty()) + .unwrap() + } + + pub fn documentation(&self, name: &str) -> Option<MarkupContent> { + let metadata = self + .metadata + .iter() + .find(|metadata| metadata.name == name)?; + + let desc = metadata.description.clone()?; + Some(MarkupContent { + kind: MarkupKind::PlainText, + value: desc, + }) + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Component { + pub file_names: Vec<SmolStr>, + pub references: Vec<SmolStr>, + pub commands: Vec<ComponentCommand>, + pub environments: Vec<SmolStr>, +} + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ComponentCommand { + pub name: SmolStr, + pub image: Option<String>, + pub glyph: Option<SmolStr>, + pub parameters: Vec<ComponentParameter>, +} + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ComponentParameter(pub Vec<ComponentArgument>); + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ComponentArgument { + pub name: SmolStr, + pub image: Option<String>, +} + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ComponentMetadata { + pub name: String, + pub caption: Option<String>, + pub description: Option<String>, +} + +const JSON_GZ: &[u8] = include_bytes!("../../data/components.json.gz"); + +pub static COMPONENT_DATABASE: Lazy<ComponentDatabase> = Lazy::new(|| { + let mut decoder = GzDecoder::new(JSON_GZ); + let mut buf = String::new(); + decoder.read_to_string(&mut buf).unwrap(); + serde_json::from_str(&buf).unwrap() +}); diff --git a/support/texlab/src/features/cursor.rs b/support/texlab/src/util/cursor.rs index 84ee6e98c4..5c3758ef46 100644 --- a/support/texlab/src/features/cursor.rs +++ b/support/texlab/src/util/cursor.rs @@ -1,25 +1,23 @@ -use lsp_types::{ - CompletionParams, DocumentHighlightParams, GotoDefinitionParams, HoverParams, Position, - ReferenceParams, RenameParams, TextDocumentPositionParams, -}; +use lsp_types::{Position, Url}; use rowan::{ast::AstNode, TextRange, TextSize}; use crate::{ + db::{parse::DocumentData, Document, Workspace}, syntax::{bibtex, latex}, - DocumentData, LineIndexExt, + Db, }; -use super::FeatureRequest; +use super::{line_index::LineIndex, line_index_ext::LineIndexExt}; #[derive(Debug)] pub enum Cursor { - Latex(latex::SyntaxToken), - Bibtex(bibtex::SyntaxToken), + Tex(latex::SyntaxToken), + Bib(bibtex::SyntaxToken), Nothing, } impl Cursor { - pub fn new_latex( + pub fn new_tex( left: Option<latex::SyntaxToken>, right: Option<latex::SyntaxToken>, ) -> Option<Self> { @@ -27,35 +25,35 @@ impl Cursor { let right = right?; if left.kind().is_command_name() { - return Some(Self::Latex(left)); + return Some(Self::Tex(left)); } if right.kind() == latex::WORD { - return Some(Self::Latex(right)); + return Some(Self::Tex(right)); } if left.kind() == latex::WORD { - return Some(Self::Latex(left)); + return Some(Self::Tex(left)); } if right.kind().is_command_name() { - return Some(Self::Latex(right)); + return Some(Self::Tex(right)); } if left.kind() == latex::WHITESPACE && left.parent()?.kind() == latex::KEY { - return Some(Self::Latex(left)); + return Some(Self::Tex(left)); } if matches!(right.kind(), latex::WHITESPACE | latex::LINE_BREAK) && right.parent()?.kind() == latex::KEY { - return Some(Self::Latex(right)); + return Some(Self::Tex(right)); } - Some(Self::Latex(right)) + Some(Self::Tex(right)) } - pub fn new_bibtex( + pub fn new_bib( left: Option<bibtex::SyntaxToken>, right: Option<bibtex::SyntaxToken>, ) -> Option<Self> { @@ -63,42 +61,42 @@ impl Cursor { let right = right?; if right.kind() == bibtex::TYPE { - return Some(Self::Bibtex(right)); + return Some(Self::Bib(right)); } if left.kind() == bibtex::TYPE { - return Some(Self::Bibtex(left)); + return Some(Self::Bib(left)); } if matches!(left.kind(), bibtex::COMMAND_NAME | bibtex::ACCENT_NAME) { - return Some(Self::Bibtex(left)); + return Some(Self::Bib(left)); } if matches!(right.kind(), bibtex::WORD | bibtex::NAME) { - return Some(Self::Bibtex(right)); + return Some(Self::Bib(right)); } if matches!(left.kind(), bibtex::WORD | bibtex::NAME) { - return Some(Self::Bibtex(left)); + return Some(Self::Bib(left)); } if matches!(right.kind(), bibtex::COMMAND_NAME | bibtex::ACCENT_NAME) { - return Some(Self::Bibtex(right)); + return Some(Self::Bib(right)); } - Some(Self::Bibtex(right)) + Some(Self::Bib(right)) } - pub fn as_latex(&self) -> Option<&latex::SyntaxToken> { - if let Self::Latex(v) = self { + pub fn as_tex(&self) -> Option<&latex::SyntaxToken> { + if let Self::Tex(v) = self { Some(v) } else { None } } - pub fn as_bibtex(&self) -> Option<&bibtex::SyntaxToken> { - if let Self::Bibtex(v) = self { + pub fn as_bib(&self) -> Option<&bibtex::SyntaxToken> { + if let Self::Bib(v) = self { Some(v) } else { None @@ -106,13 +104,13 @@ impl Cursor { } pub fn command_range(&self, offset: TextSize) -> Option<TextRange> { - self.as_latex() + self.as_tex() .filter(|token| token.kind().is_command_name()) .filter(|token| token.text_range().start() != offset) .map(|token| token.text_range()) .map(|range| TextRange::new(range.start() + TextSize::from(1), range.end())) .or_else(|| { - self.as_bibtex() + self.as_bib() .filter(|token| { matches!(token.kind(), bibtex::COMMAND_NAME | bibtex::ACCENT_NAME) }) @@ -123,40 +121,55 @@ impl Cursor { } } -pub struct CursorContext<P> { - pub request: FeatureRequest<P>, +pub struct CursorContext<'db, T = ()> { + pub db: &'db dyn Db, + pub document: Document, + pub line_index: &'db LineIndex, + pub workspace: Workspace, pub cursor: Cursor, pub offset: TextSize, + pub params: T, } -impl<P: HasPosition> CursorContext<P> { - pub fn new(request: FeatureRequest<P>) -> Self { - let main_document = request.main_document(); - let offset = main_document - .line_index - .offset_lsp(request.params.position()); +impl<'db, T> CursorContext<'db, T> { + pub fn new(db: &'db dyn Db, uri: &Url, position: Position, params: T) -> Option<Self> { + let workspace = Workspace::get(db); + let document = workspace.lookup_uri(db, uri)?; + let line_index = document.contents(db).line_index(db); + let offset = line_index.offset_lsp(position); - let cursor = match &main_document.data { - DocumentData::Latex(data) => { - let root = latex::SyntaxNode::new_root(data.green.clone()); + let cursor = match document.parse(db) { + DocumentData::Tex(data) => { + let root = data.root(db); let left = root.token_at_offset(offset).left_biased(); let right = root.token_at_offset(offset).right_biased(); - Cursor::new_latex(left, right) + Cursor::new_tex(left, right) } - DocumentData::Bibtex(data) => { - let root = bibtex::SyntaxNode::new_root(data.green.clone()); + DocumentData::Bib(data) => { + let root = data.root(db); let left = root.token_at_offset(offset).left_biased(); let right = root.token_at_offset(offset).right_biased(); - Cursor::new_bibtex(left, right) + Cursor::new_bib(left, right) } - DocumentData::BuildLog(_) => None, + DocumentData::Log(_) => None, }; - Self { - request, + Some(Self { + db, + document, + line_index, + workspace, cursor: cursor.unwrap_or(Cursor::Nothing), offset, - } + params, + }) + } + + pub fn related(&self) -> impl Iterator<Item = Document> + '_ { + self.workspace + .related(self.db, self.document) + .iter() + .copied() } pub fn is_inside_latex_curly(&self, group: &impl latex::HasCurly) -> bool { @@ -166,7 +179,7 @@ impl<P: HasPosition> CursorContext<P> { pub fn find_citation_key_word(&self) -> Option<(String, TextRange)> { let word = self .cursor - .as_latex() + .as_tex() .filter(|token| token.kind() == latex::WORD)?; let key = latex::Key::cast(word.parent()?)?; @@ -177,7 +190,7 @@ impl<P: HasPosition> CursorContext<P> { } pub fn find_citation_key_command(&self) -> Option<(String, TextRange)> { - let command = self.cursor.as_latex()?; + let command = self.cursor.as_tex()?; let citation = latex::Citation::cast(command.parent()?)?; let key = citation.key_list()?.keys().next()?; @@ -187,7 +200,7 @@ impl<P: HasPosition> CursorContext<P> { pub fn find_entry_key(&self) -> Option<(String, TextRange)> { let key = self .cursor - .as_bibtex() + .as_bib() .filter(|token| token.kind() == bibtex::NAME)?; bibtex::Entry::cast(key.parent()?)?; @@ -197,7 +210,7 @@ impl<P: HasPosition> CursorContext<P> { pub fn find_label_name_key(&self) -> Option<(String, TextRange)> { let name = self .cursor - .as_latex() + .as_tex() .filter(|token| token.kind() == latex::WORD)?; let key = latex::Key::cast(name.parent()?)?; @@ -213,7 +226,7 @@ impl<P: HasPosition> CursorContext<P> { } pub fn find_label_name_command(&self) -> Option<(String, TextRange)> { - let node = self.cursor.as_latex()?.parent()?; + let node = self.cursor.as_tex()?.parent()?; if let Some(label) = latex::LabelDefinition::cast(node.clone()) { let name = label.name()?.key()?; Some((name.to_string(), latex::small_range(&name))) @@ -239,7 +252,7 @@ impl<P: HasPosition> CursorContext<P> { } pub fn find_curly_group_word(&self) -> Option<(String, TextRange, latex::CurlyGroupWord)> { - let token = self.cursor.as_latex()?; + let token = self.cursor.as_tex()?; let key = latex::Key::cast(token.parent()?); let group = key @@ -257,7 +270,7 @@ impl<P: HasPosition> CursorContext<P> { pub fn find_curly_group_word_list( &self, ) -> Option<(String, TextRange, latex::CurlyGroupWordList)> { - let token = self.cursor.as_latex()?; + let token = self.cursor.as_tex()?; let key = latex::Key::cast(token.parent()?); let group = key @@ -285,49 +298,3 @@ impl<P: HasPosition> CursorContext<P> { .or_else(|| Some((String::new(), TextRange::empty(self.offset), group))) } } - -pub trait HasPosition { - fn position(&self) -> Position; -} - -impl HasPosition for CompletionParams { - fn position(&self) -> Position { - self.text_document_position.position - } -} - -impl HasPosition for TextDocumentPositionParams { - fn position(&self) -> Position { - self.position - } -} - -impl HasPosition for RenameParams { - fn position(&self) -> Position { - self.text_document_position.position - } -} - -impl HasPosition for ReferenceParams { - fn position(&self) -> Position { - self.text_document_position.position - } -} - -impl HasPosition for HoverParams { - fn position(&self) -> Position { - self.text_document_position_params.position - } -} - -impl HasPosition for GotoDefinitionParams { - fn position(&self) -> Position { - self.text_document_position_params.position - } -} - -impl HasPosition for DocumentHighlightParams { - fn position(&self) -> Position { - self.text_document_position_params.position - } -} diff --git a/support/texlab/src/label.rs b/support/texlab/src/util/label.rs index b66db836f2..f0fae34337 100644 --- a/support/texlab/src/label.rs +++ b/support/texlab/src/util/label.rs @@ -1,24 +1,26 @@ use std::str::FromStr; -use lsp_types::{MarkupContent, MarkupKind}; use rowan::{ast::AstNode, TextRange}; use crate::{ + db::{analysis::label, Document, Word, Workspace}, syntax::latex::{self, HasBrack, HasCurly}, - Workspace, LANGUAGE_DATA, + Db, }; -use self::LabelledObject::*; +use self::LabeledObject::*; + +use super::lang_data::LANGUAGE_DATA; #[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum LabelledFloatKind { +pub enum LabeledFloatKind { Figure, Table, Listing, Algorithm, } -impl LabelledFloatKind { +impl LabeledFloatKind { pub fn as_str(self) -> &'static str { match self { Self::Figure => "Figure", @@ -29,7 +31,7 @@ impl LabelledFloatKind { } } -impl FromStr for LabelledFloatKind { +impl FromStr for LabeledFloatKind { type Err = (); fn from_str(s: &str) -> Result<Self, Self::Err> { @@ -44,17 +46,17 @@ impl FromStr for LabelledFloatKind { } #[derive(Debug, PartialEq, Eq, Clone)] -pub enum LabelledObject { +pub enum LabeledObject { Section { prefix: &'static str, text: String, }, Float { - kind: LabelledFloatKind, + kind: LabeledFloatKind, caption: String, }, Theorem { - kind: String, + kind: Word, description: Option<String>, }, Equation, @@ -64,27 +66,28 @@ pub enum LabelledObject { #[derive(Debug, PartialEq, Eq, Clone)] pub struct RenderedLabel { pub range: TextRange, - pub number: Option<String>, - pub object: LabelledObject, + pub number: Option<Word>, + pub object: LabeledObject, } impl RenderedLabel { - #[must_use] - pub fn reference(&self) -> String { + pub fn reference(&self, db: &dyn Db) -> String { match &self.number { Some(number) => match &self.object { - Section { prefix, text } => format!("{} {} ({})", prefix, number, text), - Float { kind, caption } => format!("{} {}: {}", kind.as_str(), number, caption), + Section { prefix, text } => format!("{} {} ({})", prefix, number.text(db), text), + Float { kind, caption } => { + format!("{} {}: {}", kind.as_str(), number.text(db), caption) + } Theorem { kind, description: None, - } => format!("{} {}", kind, number), + } => format!("{} {}", kind.text(db), number.text(db)), Theorem { kind, description: Some(description), - } => format!("{} {} ({})", kind, number, description), - Equation => format!("Equation ({})", number), - EnumItem => format!("Item {}", number), + } => format!("{} {} ({})", kind.text(db), number.text(db), description), + Equation => format!("Equation ({})", number.text(db)), + EnumItem => format!("Item {}", number.text(db)), }, None => match &self.object { Section { prefix, text } => format!("{} ({})", prefix, text), @@ -92,117 +95,93 @@ impl RenderedLabel { Theorem { kind, description: None, - } => kind.into(), + } => kind.text(db).into(), Theorem { kind, description: Some(description), - } => format!("{} ({})", kind, description), + } => format!("{} ({})", kind.text(db), description), Equation => "Equation".into(), EnumItem => "Item".into(), }, } } - #[must_use] - pub fn detail(&self) -> Option<String> { + pub fn detail(&self, db: &dyn Db) -> Option<String> { match &self.object { - Section { .. } | Theorem { .. } | Equation | EnumItem => Some(self.reference()), + Section { .. } | Theorem { .. } | Equation | EnumItem => Some(self.reference(db)), Float { kind, .. } => { let result = match &self.number { - Some(number) => format!("{} {}", kind.as_str(), number), + Some(number) => format!("{} {}", kind.as_str(), number.text(db)), None => kind.as_str().to_owned(), }; Some(result) } } } - - #[must_use] - pub fn documentation(&self) -> MarkupContent { - MarkupContent { - kind: MarkupKind::PlainText, - value: self.reference(), - } - } } -pub fn render_label( - workspace: &Workspace, - label_name: &str, - mut label: Option<latex::LabelDefinition>, -) -> Option<RenderedLabel> { - let mut number = find_label_number(workspace, label_name).map(ToString::to_string); +pub fn render(db: &dyn Db, document: Document, label_def: label::Name) -> Option<RenderedLabel> { + let workspace = Workspace::get(db); + let label_num = workspace.number_of_label(db, document, label_def.name(db)); + let root = document.parse(db).as_tex()?.root(db); - for document in workspace.documents_by_uri.values() { - if let Some(data) = document.data.as_latex() { - label = label.or_else(|| { - find_label_definition(&latex::SyntaxNode::new_root(data.green.clone()), label_name) - }); - } - } - - label?.syntax().ancestors().find_map(|parent| { - render_label_float(parent.clone(), &mut number) - .or_else(|| render_label_section(parent.clone(), &mut number)) - .or_else(|| render_label_enum_item(parent.clone(), &mut number)) - .or_else(|| render_label_equation(parent.clone(), &mut number)) - .or_else(|| render_label_theorem(workspace, parent, &mut number)) - }) + label_def + .origin(db) + .as_definition()? + .to_node(&root) + .syntax() + .ancestors() + .find_map(|parent| { + render_label_float(parent.clone(), label_num) + .or_else(|| render_label_section(parent.clone(), label_num)) + .or_else(|| render_label_enum_item(db, parent.clone(), label_num)) + .or_else(|| render_label_equation(parent.clone(), label_num)) + .or_else(|| render_label_theorem(db, document, parent, label_num)) + }) } pub fn find_label_definition( - root: &latex::SyntaxNode, - label_name: &str, -) -> Option<latex::LabelDefinition> { - root.descendants() - .filter_map(latex::LabelDefinition::cast) - .find(|label| { - label - .name() - .and_then(|name| name.key()) - .map(|name| name.to_string()) - .as_deref() - == Some(label_name) - }) -} + db: &dyn Db, + child: Document, + name: Word, +) -> Option<(Document, label::Name)> { + Workspace::get(db) + .related(db, child) + .iter() + .find_map(|document| { + let data = document.parse(db).as_tex()?; + let label = data + .analyze(db) + .labels(db) + .iter() + .filter(|label| label.origin(db).as_definition().is_some()) + .find(|label| label.name(db) == name)?; -pub fn find_label_number<'a>(workspace: &'a Workspace, label_name: &str) -> Option<&'a str> { - workspace.documents_by_uri.values().find_map(|document| { - document - .data - .as_latex() - .and_then(|data| data.extras.label_numbers_by_name.get(label_name)) - .map(|number| number.as_str()) - }) + Some((*document, *label)) + }) } -fn render_label_float( - parent: latex::SyntaxNode, - number: &mut Option<String>, -) -> Option<RenderedLabel> { +fn render_label_float(parent: latex::SyntaxNode, number: Option<Word>) -> Option<RenderedLabel> { let environment = latex::Environment::cast(parent.clone())?; let environment_name = environment.begin()?.name()?.key()?.to_string(); - let kind = LabelledFloatKind::from_str(&environment_name).ok()?; + let kind = LabeledFloatKind::from_str(&environment_name).ok()?; let caption = find_caption_by_parent(&parent)?; Some(RenderedLabel { range: latex::small_range(&environment), - number: number.take(), - object: LabelledObject::Float { caption, kind }, + number, + object: LabeledObject::Float { caption, kind }, }) } -fn render_label_section( - parent: latex::SyntaxNode, - number: &mut Option<String>, -) -> Option<RenderedLabel> { +fn render_label_section(parent: latex::SyntaxNode, number: Option<Word>) -> Option<RenderedLabel> { let section = latex::Section::cast(parent)?; let text_group = section.name()?; let text = text_group.content_text()?; Some(RenderedLabel { range: latex::small_range(§ion), - number: number.take(), - object: LabelledObject::Section { + number, + object: LabeledObject::Section { prefix: match section.syntax().kind() { latex::PART => "Part", latex::CHAPTER => "Chapter", @@ -219,24 +198,23 @@ fn render_label_section( } fn render_label_enum_item( + db: &dyn Db, parent: latex::SyntaxNode, - number: &mut Option<String>, + number: Option<Word>, ) -> Option<RenderedLabel> { let enum_item = latex::EnumItem::cast(parent)?; Some(RenderedLabel { range: latex::small_range(&enum_item), number: enum_item .label() - .and_then(|number| number.content_text()) - .or_else(|| number.take()), - object: LabelledObject::EnumItem, + .and_then(|label| label.content_text()) + .map(|text| Word::new(db, text)) + .or_else(|| number), + object: LabeledObject::EnumItem, }) } -fn render_label_equation( - parent: latex::SyntaxNode, - number: &mut Option<String>, -) -> Option<RenderedLabel> { +fn render_label_equation(parent: latex::SyntaxNode, number: Option<Word>) -> Option<RenderedLabel> { let environment = latex::Environment::cast(parent)?; let environment_name = environment.begin()?.name()?.key()?.to_string(); @@ -250,15 +228,16 @@ fn render_label_equation( Some(RenderedLabel { range: latex::small_range(&environment), - number: number.take(), - object: LabelledObject::Equation, + number, + object: LabeledObject::Equation, }) } fn render_label_theorem( - workspace: &Workspace, + db: &dyn Db, + document: Document, parent: latex::SyntaxNode, - number: &mut Option<String>, + number: Option<Word>, ) -> Option<RenderedLabel> { let environment = latex::Environment::cast(parent)?; let begin = environment.begin()?; @@ -266,22 +245,18 @@ fn render_label_theorem( let environment_name = begin.name()?.key()?.to_string(); - let theorem = workspace.documents_by_uri.values().find_map(|document| { - document.data.as_latex().and_then(|data| { - data.extras - .theorem_environments - .iter() - .find(|theorem| theorem.name.as_str() == environment_name) - }) - })?; + let kind = Workspace::get(db) + .related(db, document) + .iter() + .filter_map(|document| document.parse(db).as_tex()) + .flat_map(|data| data.analyze(db).theorem_environments(db)) + .find(|env| env.name(db).text(db) == &environment_name) + .map(|env| env.description(db))?; Some(RenderedLabel { range: latex::small_range(&environment), - number: number.take(), - object: LabelledObject::Theorem { - kind: theorem.description.clone(), - description, - }, + number, + object: LabeledObject::Theorem { kind, description }, }) } diff --git a/support/texlab/src/lang_data.rs b/support/texlab/src/util/lang_data.rs index 28e6a540e0..f270c3f65e 100644 --- a/support/texlab/src/lang_data.rs +++ b/support/texlab/src/util/lang_data.rs @@ -65,6 +65,6 @@ impl LanguageData { } pub static LANGUAGE_DATA: Lazy<LanguageData> = Lazy::new(|| { - const JSON: &str = include_str!("../data/lang_data.json"); + const JSON: &str = include_str!("../../data/lang_data.json"); serde_json::from_str(JSON).expect("Failed to deserialize language.json") }); diff --git a/support/texlab/src/line_index.rs b/support/texlab/src/util/line_index.rs index 70e8f8128b..70e8f8128b 100644 --- a/support/texlab/src/line_index.rs +++ b/support/texlab/src/util/line_index.rs diff --git a/support/texlab/src/line_index_ext.rs b/support/texlab/src/util/line_index_ext.rs index 9faccf1c86..becbb8bde7 100644 --- a/support/texlab/src/line_index_ext.rs +++ b/support/texlab/src/util/line_index_ext.rs @@ -1,7 +1,7 @@ use lsp_types::{Position, Range}; use rowan::{TextRange, TextSize}; -use crate::{LineColUtf16, LineIndex}; +use super::line_index::{LineColUtf16, LineIndex}; pub trait LineIndexExt { fn offset_lsp(&self, line_col: Position) -> TextSize; diff --git a/support/texlab/src/features/lsp_kinds.rs b/support/texlab/src/util/lsp_enums.rs index 82706b5aee..75b97097c5 100644 --- a/support/texlab/src/features/lsp_kinds.rs +++ b/support/texlab/src/util/lsp_enums.rs @@ -1,6 +1,6 @@ use lsp_types::{CompletionItemKind, SymbolKind}; -use crate::BibtexEntryTypeCategory; +use super::lang_data::BibtexEntryTypeCategory; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum Structure { diff --git a/support/texlab/src/workspace.rs b/support/texlab/src/workspace.rs deleted file mode 100644 index e01a2fede4..0000000000 --- a/support/texlab/src/workspace.rs +++ /dev/null @@ -1,225 +0,0 @@ -use std::{ - fs::{self, FileType}, - path::PathBuf, - sync::Arc, -}; - -use anyhow::Result; -use crossbeam_channel::Sender; -use lsp_types::Url; -use petgraph::{graphmap::UnGraphMap, visit::Dfs}; -use rustc_hash::{FxHashMap, FxHashSet}; - -use crate::{ - component_db::COMPONENT_DATABASE, syntax::latex::ExplicitLink, Document, DocumentLanguage, - Environment, -}; - -#[derive(Debug, Clone)] -pub enum WorkspaceEvent { - Changed(Workspace, Document), -} - -#[derive(Debug, Clone, Default)] -pub struct Workspace { - pub documents_by_uri: FxHashMap<Arc<Url>, Document>, - pub viewport: FxHashSet<Arc<Url>>, - pub listeners: Vec<Sender<WorkspaceEvent>>, - pub environment: Environment, -} - -impl Workspace { - #[must_use] - pub fn new(environment: Environment) -> Self { - Self { - environment, - ..Self::default() - } - } - - pub fn open( - &mut self, - uri: Arc<Url>, - text: Arc<String>, - language: DocumentLanguage, - ) -> Result<Document> { - log::debug!("(Re)Loading document: {}", uri); - let document = Document::parse(&self.environment, Arc::clone(&uri), text, language); - - self.documents_by_uri - .insert(Arc::clone(&uri), document.clone()); - - for listener in &self.listeners { - listener.send(WorkspaceEvent::Changed(self.clone(), document.clone()))?; - } - - self.expand_parent(&document); - self.expand_children(&document); - Ok(document) - } - - pub fn reload(&mut self, path: PathBuf) -> Result<Option<Document>> { - let uri = Arc::new(Url::from_file_path(path.clone()).unwrap()); - - if self.is_open(&uri) && !uri.as_str().ends_with(".log") { - return Ok(self.documents_by_uri.get(&uri).cloned()); - } - - if let Some(language) = DocumentLanguage::by_path(&path) { - let data = fs::read(&path)?; - let text = Arc::new(String::from_utf8_lossy(&data).into_owned()); - Ok(Some(self.open(uri, text, language)?)) - } else { - Ok(None) - } - } - - pub fn load(&mut self, path: PathBuf) -> Result<Option<Document>> { - let uri = Arc::new(Url::from_file_path(path.clone()).unwrap()); - - if let Some(document) = self.documents_by_uri.get(&uri).cloned() { - return Ok(Some(document)); - } - - let data = fs::read(&path)?; - let text = Arc::new(String::from_utf8_lossy(&data).into_owned()); - if let Some(language) = DocumentLanguage::by_path(&path) { - Ok(Some(self.open(uri, text, language)?)) - } else { - Ok(None) - } - } - - pub fn close(&mut self, uri: &Url) { - self.viewport.remove(uri); - } - - pub fn is_open(&self, uri: &Url) -> bool { - self.viewport.contains(uri) - } - - pub fn slice(&self, uri: &Url) -> Self { - let all_uris: Vec<_> = self.documents_by_uri.keys().cloned().collect(); - - all_uris - .iter() - .position(|u| u.as_ref() == uri) - .map(|start| { - let mut edges = Vec::new(); - for (i, uri) in all_uris.iter().enumerate() { - let document = self.documents_by_uri.get(uri); - if let Some(data) = document - .as_ref() - .and_then(|document| document.data.as_latex()) - { - let extras = &data.extras; - let mut all_targets = - vec![&extras.implicit_links.aux, &extras.implicit_links.log]; - for link in &extras.explicit_links { - all_targets.push(&link.targets); - } - - for targets in all_targets { - for target in targets { - if let Some(j) = all_uris.iter().position(|uri| uri == target) { - edges.push((i, j, ())); - break; - } - } - } - } - } - - let mut slice = self.clone(); - slice.documents_by_uri = FxHashMap::default(); - let graph = UnGraphMap::from_edges(edges); - let mut dfs = Dfs::new(&graph, start); - while let Some(i) = dfs.next(&graph) { - let uri = &all_uris[i]; - let doc = self.documents_by_uri[uri].clone(); - slice.documents_by_uri.insert(Arc::clone(uri), doc); - } - - slice - }) - .unwrap_or_default() - } - - #[must_use] - pub fn find_parent(&self, uri: &Url) -> Option<Document> { - self.slice(uri) - .documents_by_uri - .values() - .find(|document| { - document.data.as_latex().map_or(false, |data| { - data.extras.has_document_environment - && !data - .extras - .explicit_links - .iter() - .filter_map(ExplicitLink::as_component_name) - .any(|name| name == "subfiles.cls") - }) - }) - .cloned() - } - - fn expand_parent(&mut self, document: &Document) { - let all_current_paths = self - .documents_by_uri - .values() - .filter_map(|doc| doc.uri.to_file_path().ok()) - .collect::<FxHashSet<_>>(); - - if document.uri.scheme() == "file" { - if let Ok(mut path) = document.uri.to_file_path() { - while path.pop() && self.find_parent(&document.uri).is_none() { - std::fs::read_dir(&path) - .into_iter() - .flatten() - .filter_map(Result::ok) - .filter(|entry| entry.file_type().ok().filter(FileType::is_file).is_some()) - .map(|entry| entry.path()) - .filter(|path| { - matches!( - DocumentLanguage::by_path(path), - Some(DocumentLanguage::Latex) - ) - }) - .filter(|path| !all_current_paths.contains(path)) - .for_each(|path| { - let _ = self.load(path); - }); - } - } - } - } - - fn expand_children(&mut self, document: &Document) { - if let Some(data) = document.data.as_latex() { - let extras = &data.extras; - let mut all_targets = vec![&extras.implicit_links.aux, &extras.implicit_links.log]; - for link in &extras.explicit_links { - if link - .as_component_name() - .and_then(|name| COMPONENT_DATABASE.find(&name)) - .is_none() - { - all_targets.push(&link.targets); - } - } - - for targets in all_targets { - for path in targets - .iter() - .filter(|uri| uri.scheme() == "file" && uri.fragment().is_none()) - .filter_map(|uri| uri.to_file_path().ok()) - { - if self.load(path).is_ok() { - break; - } - } - } - } - } -} diff --git a/support/texlab/tests/integration/lsp/text_document/publish_diagnostics.rs b/support/texlab/tests/integration/lsp/text_document/publish_diagnostics.rs deleted file mode 100644 index 7e406b5319..0000000000 --- a/support/texlab/tests/integration/lsp/text_document/publish_diagnostics.rs +++ /dev/null @@ -1,264 +0,0 @@ -use anyhow::Result; -use insta::{assert_json_snapshot, internals::Redaction}; -use lsp_types::{ - notification::{ - DidChangeConfiguration, DidChangeWatchedFiles, Notification, PublishDiagnostics, - }, - ClientCapabilities, Diagnostic, DidChangeConfigurationParams, DidChangeWatchedFilesParams, - FileChangeType, FileEvent, PublishDiagnosticsParams, Url, -}; -use rustc_hash::FxHashMap; - -use crate::lsp::{client::Client, fixture}; - -struct DiagnosticResult { - all_diagnostics: FxHashMap<Url, Vec<Diagnostic>>, - uri_redaction: Redaction, -} - -fn find_diagnostics(fixture: &str, settings: serde_json::Value) -> Result<DiagnosticResult> { - let mut client = Client::spawn()?; - client.initialize(ClientCapabilities::default(), None)?; - - let mut disk_files = Vec::new(); - let fixture = fixture::parse(fixture); - for file in fixture.files { - if file.lang == "log" { - client.store_on_disk(file.name, &file.text)?; - disk_files.push(client.uri(file.name)?); - } else { - client.open(file.name, file.lang, file.text)?; - } - } - - client.notify::<DidChangeWatchedFiles>(DidChangeWatchedFilesParams { - changes: disk_files - .into_iter() - .map(|uri| FileEvent::new(uri, FileChangeType::CHANGED)) - .collect(), - })?; - - client.notify::<DidChangeConfiguration>(DidChangeConfigurationParams { settings })?; - - let result = client.shutdown()?; - - let uri = Url::from_directory_path(result.directory.path()).unwrap(); - let uri_redaction = insta::dynamic_redaction(move |content, _path| { - content.as_str().unwrap().replace(uri.as_str(), "[tmp]/") - }); - - let all_diagnostics = result - .incoming - .notifications - .into_iter() - .filter_map(|notification| { - notification - .extract::<PublishDiagnosticsParams>(PublishDiagnostics::METHOD) - .ok() - }) - .map(|params| (params.uri, params.diagnostics)) - .collect(); - - Ok(DiagnosticResult { - all_diagnostics, - uri_redaction, - }) -} - -macro_rules! assert_symbols { - ($result:expr) => { - let result = $result; - assert_json_snapshot!(result.all_diagnostics, { - ".$key" => result.uri_redaction - }); - }; -} - -static BUILD_LOG_FIXTURE: &str = r#" -%TEX main.tex -%SRC \documentclass{article} -%SRC -%SRC \usepackage{amsmath} -%SRC -%SRC \begin{document} -%SRC -%SRC \foo{} -%SRC aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -%SRC -%SRC \end{document} - -%LOG main.log -%SRC This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/W32TeX) (preloaded format=pdflatex 2022.1.23) 16 JUN 2022 11:04 -%SRC entering extended mode -%SRC restricted \write18 enabled. -%SRC %&-line parsing enabled. -%SRC **main.tex -%SRC (./main.tex -%SRC LaTeX2e <2020-10-01> patch level 4 -%SRC L3 programming layer <2021-02-18> -%SRC (c:/texlive/2021/texmf-dist/tex/latex/base/article.cls -%SRC Document Class: article 2020/04/10 v1.4m Standard LaTeX document class -%SRC (c:/texlive/2021/texmf-dist/tex/latex/base/size10.clo -%SRC File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) -%SRC ) -%SRC \c@part=\count179 -%SRC \c@section=\count180 -%SRC \c@subsection=\count181 -%SRC \c@subsubsection=\count182 -%SRC \c@paragraph=\count183 -%SRC \c@subparagraph=\count184 -%SRC \c@figure=\count185 -%SRC \c@table=\count186 -%SRC \abovecaptionskip=\skip47 -%SRC \belowcaptionskip=\skip48 -%SRC \bibindent=\dimen138 -%SRC ) -%SRC (c:/texlive/2021/texmf-dist/tex/latex/amsmath/amsmath.sty -%SRC Package: amsmath 2020/09/23 v2.17i AMS math features -%SRC \@mathmargin=\skip49 -%SRC -%SRC For additional information on amsmath, use the `?' option. -%SRC (c:/texlive/2021/texmf-dist/tex/latex/amsmath/amstext.sty -%SRC Package: amstext 2000/06/29 v2.01 AMS text -%SRC -%SRC (c:/texlive/2021/texmf-dist/tex/latex/amsmath/amsgen.sty -%SRC File: amsgen.sty 1999/11/30 v2.0 generic functions -%SRC \@emptytoks=\toks15 -%SRC \ex@=\dimen139 -%SRC )) -%SRC (c:/texlive/2021/texmf-dist/tex/latex/amsmath/amsbsy.sty -%SRC Package: amsbsy 1999/11/29 v1.2d Bold Symbols -%SRC \pmbraise@=\dimen140 -%SRC ) -%SRC (c:/texlive/2021/texmf-dist/tex/latex/amsmath/amsopn.sty -%SRC Package: amsopn 2016/03/08 v2.02 operator names -%SRC ) -%SRC \inf@bad=\count187 -%SRC LaTeX Info: Redefining \frac on input line 234. -%SRC \uproot@=\count188 -%SRC \leftroot@=\count189 -%SRC LaTeX Info: Redefining \overline on input line 399. -%SRC \classnum@=\count190 -%SRC \DOTSCASE@=\count191 -%SRC LaTeX Info: Redefining \ldots on input line 496. -%SRC LaTeX Info: Redefining \dots on input line 499. -%SRC LaTeX Info: Redefining \cdots on input line 620. -%SRC \Mathstrutbox@=\box47 -%SRC \strutbox@=\box48 -%SRC \big@size=\dimen141 -%SRC LaTeX Font Info: Redeclaring font encoding OML on input line 743. -%SRC LaTeX Font Info: Redeclaring font encoding OMS on input line 744. -%SRC \macc@depth=\count192 -%SRC \c@MaxMatrixCols=\count193 -%SRC \dotsspace@=\muskip16 -%SRC \c@parentequation=\count194 -%SRC \dspbrk@lvl=\count195 -%SRC \tag@help=\toks16 -%SRC \row@=\count196 -%SRC \column@=\count197 -%SRC \maxfields@=\count198 -%SRC \andhelp@=\toks17 -%SRC \eqnshift@=\dimen142 -%SRC \alignsep@=\dimen143 -%SRC \tagshift@=\dimen144 -%SRC \tagwidth@=\dimen145 -%SRC \totwidth@=\dimen146 -%SRC \lineht@=\dimen147 -%SRC \@envbody=\toks18 -%SRC \multlinegap=\skip50 -%SRC \multlinetaggap=\skip51 -%SRC \mathdisplay@stack=\toks19 -%SRC LaTeX Info: Redefining \[ on input line 2923. -%SRC LaTeX Info: Redefining \] on input line 2924. -%SRC ) -%SRC (c:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def -%SRC File: l3backend-pdftex.def 2021-03-18 L3 backend support: PDF output (pdfTeX) -%SRC \l__color_backend_stack_int=\count199 -%SRC \l__pdf_internal_box=\box49 -%SRC ) -%SRC (./main.aux) -%SRC \openout1 = `main.aux'. -%SRC -%SRC LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. -%SRC LaTeX Font Info: ... okay on input line 5. -%SRC -%SRC ! Undefined control sequence. -%SRC l.7 \foo -%SRC {} -%SRC The control sequence at the end of the top line -%SRC of your error message was never \def'ed. If you have -%SRC misspelled it (e.g., `\hobx'), type `I' and the correct -%SRC spelling (e.g., `I\hbox'). Otherwise just continue, -%SRC and I'll forget about whatever was undefined. -%SRC -%SRC -%SRC Overfull \hbox (80.00125pt too wide) in paragraph at lines 8--9 -%SRC []\OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -%SRC aaaaaaaaaaaaaaaaaaaaa -%SRC [] -%SRC -%SRC [1 -%SRC -%SRC {c:/texlive/2021/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./main.aux) ) -%SRC Here is how much of TeX's memory you used: -%SRC 1014 strings out of 478994 -%SRC 13996 string characters out of 5862207 -%SRC 300924 words of memory out of 5000000 -%SRC 18565 multiletter control sequences out of 15000+600000 -%SRC 403430 words of font info for 27 fonts, out of 8000000 for 9000 -%SRC 1141 hyphenation exceptions out of 8191 -%SRC 67i,4n,74p,200b,104s stack positions out of 5000i,500n,10000p,200000b,80000s -%SRC < -%SRC c:/texlive/2021/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb> -%SRC Output written on main.pdf (1 page, 9741 bytes). -%SRC PDF statistics: -%SRC 12 PDF objects out of 1000 (max. 8388607) -%SRC 7 compressed objects within 1 object stream -%SRC 0 named destinations out of 1000 (max. 500000) -%SRC 1 words of extra memory for PDF output out of 10000 (max. 10000000)"#; - -#[test] -fn build_log_filter_none() -> Result<()> { - assert_symbols!(find_diagnostics(BUILD_LOG_FIXTURE, serde_json::json!({}))?); - Ok(()) -} - -#[test] -fn build_log_filter_allowed() -> Result<()> { - assert_symbols!(find_diagnostics( - BUILD_LOG_FIXTURE, - serde_json::json!({ - "diagnostics": { - "allowedPatterns": ["Overfull \\\\[hv]box"] - } - }) - )?); - - Ok(()) -} - -#[test] -fn build_log_filter_ignored() -> Result<()> { - assert_symbols!(find_diagnostics( - BUILD_LOG_FIXTURE, - serde_json::json!({ - "diagnostics": { - "ignoredPatterns": ["Overfull \\\\[hv]box"] - } - }) - )?); - - Ok(()) -} diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_allowed.snap b/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_allowed.snap deleted file mode 100644 index 9fc11d295b..0000000000 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_allowed.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: tests/integration/lsp/text_document/publish_diagnostics.rs -assertion_line: 240 -expression: result.all_diagnostics ---- -{ - "[tmp]/main.tex": [ - { - "range": { - "start": { - "line": 7, - "character": 0 - }, - "end": { - "line": 7, - "character": 0 - } - }, - "severity": 2, - "source": "latex-build", - "message": "Overfull \\hbox (80.00125pt too wide) in paragraph at lines 8--9" - } - ] -} diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_ignored.snap b/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_ignored.snap deleted file mode 100644 index 28e0308a72..0000000000 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_ignored.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: tests/integration/lsp/text_document/publish_diagnostics.rs -assertion_line: 254 -expression: result.all_diagnostics ---- -{ - "[tmp]/main.tex": [ - { - "range": { - "start": { - "line": 6, - "character": 0 - }, - "end": { - "line": 6, - "character": 0 - } - }, - "severity": 1, - "source": "latex-build", - "message": "Undefined control sequence." - } - ] -} diff --git a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_none.snap b/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_none.snap deleted file mode 100644 index b16238381b..0000000000 --- a/support/texlab/tests/integration/lsp/text_document/snapshots/integration__lsp__text_document__publish_diagnostics__build_log_filter_none.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: tests/integration/lsp/text_document/publish_diagnostics.rs -assertion_line: 234 -expression: result.all_diagnostics ---- -{ - "[tmp]/main.tex": [ - { - "range": { - "start": { - "line": 6, - "character": 0 - }, - "end": { - "line": 6, - "character": 0 - } - }, - "severity": 1, - "source": "latex-build", - "message": "Undefined control sequence." - }, - { - "range": { - "start": { - "line": 7, - "character": 0 - }, - "end": { - "line": 7, - "character": 0 - } - }, - "severity": 2, - "source": "latex-build", - "message": "Overfull \\hbox (80.00125pt too wide) in paragraph at lines 8--9" - } - ] -} diff --git a/support/texlab/tests/integration/main.rs b/support/texlab/tests/integration/main.rs deleted file mode 100644 index 44e0d3635a..0000000000 --- a/support/texlab/tests/integration/main.rs +++ /dev/null @@ -1 +0,0 @@ -mod lsp; diff --git a/support/texlab/texlab.1 b/support/texlab/texlab.1 index 8dd6b664a4..25dd817248 100644 --- a/support/texlab/texlab.1 +++ b/support/texlab/texlab.1 @@ -1,26 +1,25 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.15. -.TH TEXLAB "1" "May 2020" "texlab " "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. +.TH TEXLAB "1" "December 2022" "texlab 5.0.0" "User Commands" .SH NAME -texlab \- manual page for texlab +texlab \- manual page for texlab 5.0.0 +.SH SYNOPSIS +.B texlab +[\fI\,OPTIONS\/\fR] .SH DESCRIPTION An implementation of the Language Server Protocol for LaTeX -.SS "USAGE:" -.IP -texlab [FLAGS] [OPTIONS] -.SS "FLAGS:" +.SH OPTIONS .TP -\fB\-h\fR, \fB\-\-help\fR -Prints help information +\fB\-v\fR, \fB\-\-verbosity\fR... +Increase message verbosity (\fB\-vvvv\fR for max verbosity) .TP \fB\-q\fR, \fB\-\-quiet\fR No output printed to stderr .TP -\fB\-V\fR, \fB\-\-version\fR -Prints version information -.TP -\fB\-v\fR, \fB\-\-verbosity\fR -Increase message verbosity (\fB\-vvvv\fR for max verbosity) -.SS "OPTIONS:" -.TP \fB\-\-log\-file\fR <FILE> Write the logging output to FILE +.TP +\fB\-h\fR, \fB\-\-help\fR +Print help information +.TP +\fB\-V\fR, \fB\-\-version\fR +Print version information diff --git a/support/texlab/texlab.pdf b/support/texlab/texlab.pdf Binary files differindex 68e68c312d..b4749920ec 100644 --- a/support/texlab/texlab.pdf +++ b/support/texlab/texlab.pdf diff --git a/support/texshop/README.txt b/support/texshop/README.txt index 153afadffa..0a71877e3a 100644 --- a/support/texshop/README.txt +++ b/support/texshop/README.txt @@ -7,4 +7,4 @@ The main author is Richard Koch, koch@uoregon.edu, with supporting contributions Consult the program web site, https://pages.uoregon.edu/koch/texshop/texshop.html, for full source code, an extensive Changes document, and other information. -The current version, 5.09, was released on December 27, 2022.
\ No newline at end of file +The current version, 5.10, was released on December 28, 2022.
\ No newline at end of file diff --git a/support/texshop/texshop509.html b/support/texshop/texshop510.html index f1da483fa9..cd15081d9e 100644 --- a/support/texshop/texshop509.html +++ b/support/texshop/texshop510.html @@ -9,7 +9,9 @@ <body> -TeXShop 5.09 has one addition and one bug fix. +TeXShop 5.10 fixes one bug in version 5.09. The preference items to set the document and console fonts were broken in the English localization. Now they are fixed. + +<p> TeXShop 5.09 had one addition and one bug fix. <p><ul> <li> Marco Santi wanted a preference to set the font and size of text in the Macro Editor. There is already a preference to change the default font in the console. To avoid cluttering the Preference Dialog, version 5.09 allows users to also use this console font in the Macro Editor. Just check the box "Use Also for Macro Editor" under the Console Tab. <p><li> Kurt Richard Todoroff reported an important bug that I could never reproduce. Just before typesettting concluded, his console would stop reporting output and the program would become unresponsive. Luckily, Todoroff knew exactly when this bug was introduced. Although he was using version 5.08, he told me that versions 5.00 and 5.01 typeset without problems but version 5.02 often failed. diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl index f45126f0c3..b8eadd82e1 100644 --- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl @@ -71,7 +71,6 @@ $mirrors = { 'https://mirror.datacenter.by/pub/mirrors/CTAN/' => 1, }, 'Czech Republic' => { - 'http://ftp.cvut.cz/tex-archive/' => 1, 'https://mirrors.nic.cz/tex-archive/' => 1, }, 'Denmark' => { @@ -190,6 +189,7 @@ $mirrors = { 'http://mirrors.ibiblio.org/pub/mirrors/CTAN/' => 1, 'https://ctan.math.illinois.edu/' => 1, 'https://ctan.math.utah.edu/ctan/tex-archive/' => 1, + 'https://ctan.math.washington.edu/tex-archive/' => 1, 'https://ctan.mirrors.hoobly.com/' => 1, 'https://mirror.las.iastate.edu/tex-archive/' => 1, 'https://mirror.math.princeton.edu/pub/CTAN/' => 1, diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb index 461936c65e..c1ecbdd809 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/65377 +depend revision/65389 name 00texlive.image category TLCore -revision 65376 +revision 65388 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 @@ -2699,6 +2699,7 @@ runfiles size=12956 tlpkg/tlpsrc/luacensor.tlpsrc tlpkg/tlpsrc/luacode.tlpsrc tlpkg/tlpsrc/luacolor.tlpsrc + tlpkg/tlpsrc/luacomplex.tlpsrc tlpkg/tlpsrc/luafindfont.tlpsrc tlpkg/tlpsrc/luahbtex.tlpsrc tlpkg/tlpsrc/luahyphenrules.tlpsrc @@ -4688,7 +4689,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd name 00texlive.installer category TLCore -revision 65361 +revision 65379 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 @@ -71997,7 +71998,7 @@ containerchecksum 4e445e9830476058f6b878f306516de2fdf1b174011dd79e6a7d875adf104f name collection-luatex category Collection -revision 65376 +revision 65388 shortdesc LuaTeX packages relocated 1 longdesc Packages for LuaTeX, a TeX engine using Lua as an embedded @@ -72038,6 +72039,7 @@ depend luacas depend luacensor depend luacode depend luacolor +depend luacomplex depend luahyphenrules depend luaimageembed depend luaindex @@ -72094,8 +72096,8 @@ depend tsvtemplate depend typewriter depend uninormalize depend yamlvars -containersize 948 -containerchecksum ce0385e7fc384fab64d6974c3383184da714f6a6b8f56841a8e327337ff4924bad6dee88930fdf3b4fe4423059cc780ecc52b800934ec0ad097d6fbc97e713e0 +containersize 952 +containerchecksum 1aecfb7ca48618c83ceae4cf1647cfae90b94f8d0f3ab96c86f707fc1797591daa68615c0ae574cb62147f6f390e826fe060d54224dd0a4d2470550808e8c63a name collection-mathscience category Collection @@ -147919,7 +147921,7 @@ catalogue-topics font font-body font-proportional font-serif font-type1 font-otf name ibrackets category Package -revision 65312 +revision 65383 shortdesc Intelligent brackets relocated 1 longdesc This small package provides a new definition of brackets [ and @@ -147927,14 +147929,14 @@ longdesc ] as active characters to get correct blank spaces in longdesc mathematical mode when using for open intervals. Instead of longdesc parenthesis: ]-\infty, 0[ is equivalent to (-\infty, 0). containersize 1120 -containerchecksum 3e107787249780a3526b6e021fff386356be4000ed552267533a160632b7e28197a79f82d1f262ad2489949d4d937656333f5aaaf8015a41f83ce72aa53bd1b3 -doccontainersize 82268 -doccontainerchecksum 36ef26523eae1b539babc3ed2f9409296645efd9581208f80045f92653f59383e4749c200087920b6e36649807f6f5819ae21e691da9cf4c535fe7b42a15bcc0 -docfiles size=25 +containerchecksum 96f5a6ee84810035bdba234e23a6b87dafbff602cde6d1f435be1c291e741779133e335d7a8ea7e1a16288348357b16200a7a98751a7a4bed9de2c4fb28dcdee +doccontainersize 80632 +doccontainerchecksum 06ae490ac0d5f49c7a2c9f7f2c4a52922717b2f0375162c8a83750cf7f5525eca3e69b1e89a41204b971a85ceed0779ff27ed557192464d0763ce9c0892ece2d +docfiles size=24 RELOC/doc/latex/ibrackets/README.md details="Readme" RELOC/doc/latex/ibrackets/ibrackets.pdf details="Package documentation" -srccontainersize 3808 -srccontainerchecksum b60860a99e88432893e716819050fbf4e7af47f0ad43637af3bf46994f617d7044a32e91ca4b26f3647905146d519747598655ebf2d339687103132a7103819b +srccontainersize 3836 +srccontainerchecksum 2ab5897bfbd438ddfc8dbcd32b13e57f32617617529590b5089494bc5533376eef99e68e23a7f695ae5c1cd86c9c654ab40477f104ee64b63ee92c5dd24331fc srcfiles size=3 RELOC/source/latex/ibrackets/ibrackets.dtx RELOC/source/latex/ibrackets/ibrackets.ins @@ -147943,7 +147945,7 @@ runfiles size=1 catalogue-ctan /macros/latex/contrib/ibrackets catalogue-license lppl1.3 catalogue-topics french maths paren-mgmt -catalogue-version 1.0 +catalogue-version 1.1 name ibycus-babel category Package @@ -160345,22 +160347,21 @@ catalogue-version 1.30 name jeuxcartes category Package -revision 65373 +revision 65384 shortdesc Macros to insert playing cards relocated 1 longdesc This package provides macros to insert playing cards, single, longdesc or hand, or random-hand, Poker or French Tarot or Uno, from png longdesc files. -containersize 4563944 -containerchecksum 52f574928bfa7839e908e82fcb9ac3eb88f8d493bad94aa88979b7adccecb207d6505916b6ee7dbdfa4823cccd931801f520a87bdf8285b39ad6b504a1019869 -doccontainersize 5791284 -doccontainerchecksum 0f5819f3e92a79c0e47612da499898dd2ea2117dab433ad8338e2f000773cdfc02271bc6bfb6ef80e6a124deceaae154f965f1484c26b93f8fad742a7cd31632 +containersize 4563876 +containerchecksum fcb485d2c10b1d64ae7e8d31fb68993e144d1222053e590d43d0e3a674510243fc67ea32af1e8e1ef3461f3b3322adb3cc77883e963b63bdef12b4455e4b5d41 +doccontainersize 5792460 +doccontainerchecksum 7ab7146fb81b30b42e6fbef1d84f5a2443ad388d1aee64396da9136f7fac00befecc3edd0274c5b26f2cf5ca3af89d34d87890cc091d4e0da6cc571256dbbc1d docfiles size=1490 RELOC/doc/latex/jeuxcartes/JeuxCartes-doc.pdf details="Package documentation" language="fr" RELOC/doc/latex/jeuxcartes/JeuxCartes-doc.tex RELOC/doc/latex/jeuxcartes/README.md details="Readme" runfiles size=1362 - RELOC/tex/latex/jeuxcartes/CaJ-PoKeRv1-8T.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-10C.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-10K.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-10P.pdf @@ -160392,6 +160393,7 @@ runfiles size=1362 RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-8C.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-8K.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-8P.pdf + RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-8T.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-9C.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-9K.pdf RELOC/tex/latex/jeuxcartes/CaJ-PokeRv1-9P.pdf @@ -160670,7 +160672,7 @@ catalogue-contact-repository https://github.com/cpierquet/JeuxCartes catalogue-ctan /macros/latex/contrib/jeuxcartes catalogue-license lppl1.3c lgpl2.1 pd mit catalogue-topics games pgf-tikz -catalogue-version 0.2.1 +catalogue-version 0.2.1a name jfmutil category Package @@ -194192,6 +194194,35 @@ catalogue-license lppl1.3 catalogue-topics colour luatex catalogue-version 1.17 +name luacomplex +category Package +revision 65388 +shortdesc Operations on complex numbers inside LaTeX documents using Lua +relocated 1 +longdesc The luacomplex package is developed to define complex numbers +longdesc and perform basic arithmetic on complex numbers in LaTeX. It +longdesc also loads the luamathspackage. It provides an easy way to +longdesc define complex numbers and perform operations on complex +longdesc numbers. There is no particular environment for performing +longdesc operations on complex numbers. The package commands can be used +longdesc in any environment (including the mathematics environment). It +longdesc is written in Lua, and the .tex file is to be compiled with the +longdesc LuaLaTeX engine. +containersize 1620 +containerchecksum bafc391663fe141d9ea851de5f31eb1ce8b6449bb48ffd55552eaa5d81d42d89a6b9da20879e948ca15add4bc2256bbd8c46d873b8ff3dd19488e1a12fb75634 +doccontainersize 114736 +doccontainerchecksum 7390f4233447765778634b6b912b9e39ee712333f3cbfc90180ee03d4350e56151aff28972819151ea922e03119f6fceefeda96f83f106845729d36cfa66e70e +docfiles size=36 + RELOC/doc/lualatex/luacomplex/README.txt details="Readme" + RELOC/doc/lualatex/luacomplex/luacomplex.pdf details="Package documentation" + RELOC/doc/lualatex/luacomplex/luacomplex.tex +runfiles size=1 + RELOC/tex/lualatex/luacomplex/luacomplex.sty +catalogue-ctan /macros/luatex/latex/luacomplex +catalogue-license lppl1.3c +catalogue-topics luatex maths +catalogue-version 1.0 + name luafindfont category Package revision 64936 @@ -255391,7 +255422,7 @@ catalogue-version 1.1 name postnotes category Package -revision 65007 +revision 65385 shortdesc Endnotes for LaTeX relocated 1 longdesc This is an endnotes package for LaTeX. Its user interface @@ -255404,10 +255435,10 @@ longdesc up contextual running headers for printed notes. The default is longdesc a simple but useful one, in the form "Notes to pages N-M", but longdesc more elaborate ones can be built. When hyperref is loaded, longdesc postnotes provides hyperlinked notes, including back links. -containersize 7156 -containerchecksum f1d4b783c1e434505d6704df585867f1408b166c932ca0c7ee569f8f052bccf11e5d373883e6be6b33d21b3f733d1f17dba2f40dbc53606bae88b1e7c561e604 -doccontainersize 972316 -doccontainerchecksum ac6a2a9da1b26fe0c22cc983e960a206f910804e8f42b817890523561ea76a79e9ea3f7d6be933fb6d4a26f99c17be853ea08c94ecc5a4321270c22ecbe8d5f5 +containersize 7192 +containerchecksum fabb59ec07bab7c9db717fc2c3a16f28f9451f76c1e3e93ca8a849b61c0d5f4a8801869cca0e743f01a0a7006db4cb50dcd3df18a2774c7cd5b23a9ee9236a31 +doccontainersize 973012 +doccontainerchecksum 06a89405ebe758178714d2c8f13ab96bda24c87901c3cb12e0f6981d7cd5b1c228a3dde1be8c353dfcdd3c502865276d5059c25a9a9a91217b658bd8daae6291 docfiles size=258 RELOC/doc/latex/postnotes/CHANGELOG.md RELOC/doc/latex/postnotes/DEPENDS.txt @@ -255416,18 +255447,18 @@ docfiles size=258 RELOC/doc/latex/postnotes/postnotes-code.tex RELOC/doc/latex/postnotes/postnotes.pdf details="User manual" RELOC/doc/latex/postnotes/postnotes.tex -srccontainersize 21168 -srccontainerchecksum 78c1cf9bf3385bd01003a20f93a102ea2254c55c8c0cb239d2237369dbc6ba3b4593df6c530f38194f3e330e5643b8e2e6523e4c0a101d85b894397889f25506 +srccontainersize 21580 +srccontainerchecksum a56fddfa5bd20634d56e3c5c36bf2cdef721f71a9887b56189045ca14bd4c51c7853f14de89b27aaa7d599a74df30263217cc5e10e2e859ccd452b46616e2406 srcfiles size=25 RELOC/source/latex/postnotes/postnotes.dtx RELOC/source/latex/postnotes/postnotes.ins -runfiles size=12 +runfiles size=11 RELOC/tex/latex/postnotes/postnotes.sty catalogue-contact-repository https://github.com/gusbrs/postnotes catalogue-ctan /macros/latex/contrib/postnotes catalogue-license lppl1.3c catalogue-topics endnote expl3 -catalogue-version 0.1.7 +catalogue-version 0.2.0 name powerdot category Package @@ -256579,7 +256610,7 @@ catalogue-version 1.0 name proflycee category Package -revision 65313 +revision 65386 shortdesc A LaTeX package for French maths teachers in high school relocated 1 longdesc This package provides some commands to help French mathematics @@ -256588,11 +256619,11 @@ longdesc create splines with "derivative control"; longdesc \CalculFormelParametres and \CalculFormelLigne in order to longdesc create an xcas-windows-like; \CodePythonLstFichier to create longdesc code presentation and code execution with pythontex. -containersize 25924 -containerchecksum 396442231cf95e99fb768938a61541dc580cc1b7fa74d2b165d89f812b319a7b0327e148c06fe2a9929f125ebe2660d0965bd397718b906f963da188946f185a -doccontainersize 1478748 -doccontainerchecksum c2ce91567fd11089d9338c832b61755ef76407dc1f57498c945e9167a294d255273df58b8c3e0a945c8646cb7c2994000dc2fba81d81e16c92157de8f967c237 -docfiles size=501 +containersize 25988 +containerchecksum 0585915905a48af781a3413d87a83c58b0709c0b1cd304de62f324f5258294c65c471165fee53508d33876a1f5f7791eacb9dc466273ae56a611e07e4161a54f +doccontainersize 1509640 +doccontainerchecksum 9585c0d7baa2ffbabfe3c097048b98ccaf77da8eaa065abc34a8f0464de3153d079a77ec3ba2c86bb24ff613f284a1fae383290f470fc67c2f90591cf13a716d +docfiles size=513 RELOC/doc/latex/proflycee/ProfLycee-doc.pdf details="Package documentation" language="fr" RELOC/doc/latex/proflycee/ProfLycee-doc.tex RELOC/doc/latex/proflycee/ProfLycee-old-doc.pdf @@ -256623,7 +256654,7 @@ catalogue-contact-repository https://github.com/cpierquet/ProfLycee catalogue-ctan /macros/latex/contrib/proflycee catalogue-license lppl1.3c catalogue-topics maths french teaching expl3 pgf-tikz -catalogue-version 2.1.0 +catalogue-version 2.1.1 name program category Package @@ -311698,7 +311729,7 @@ docfiles size=376 name texlive-scripts category TLCore -revision 65371 +revision 65379 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. @@ -311706,10 +311737,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 113700 -containerchecksum d053f0b240fc18330136b5f7b413bfae1df321ac2e2c2a4674d1e52c8b3121b8ab18851545e5c262a680db755a4d5f625f418fdb12dda0d1eff25b3f63f5f453 -doccontainersize 423964 -doccontainerchecksum 1f94874581f3f916e146ab111100a19139671d8518b8dc5ef1abef8ccf3965426c3b26c61f5be30b9f1c3e0ab749a47a600c9e34b2d5da87018f8bcd4549cda7 +containersize 113692 +containerchecksum 5a30215ebfc9bf3ff5e21b3556186dbc01ad94fe387098294d14471fecf7c1b42ca3740636a4b6fa18db6f2131256653a403e973f444414ab7ed0163cf5fe0c1 +doccontainersize 424184 +doccontainerchecksum a4dbcd71da668998d497461e5dad4b5cd802d2d091c9bc2d14f92fadaaa02951a113f86a0ebfbc91961d39e4648a815712d5cd0fc520e91c5690343f162137d3 docfiles size=533 doc.html texmf-dist/doc/man/man1/fmtutil-sys.1 @@ -360612,7 +360643,7 @@ catalogue-version 0.3.2 name zref-clever category Package -revision 63428 +revision 65387 shortdesc Clever LaTeX cross-references based on zref relocated 1 longdesc This package provides a user interface for making LaTeX @@ -360624,11 +360655,11 @@ longdesc multiple labels can be automatically sorted and compressed into longdesc ranges when due. The reference format is highly and easily longdesc customizable, both globally and locally. The package is based longdesc on zref's extensible referencing system. -containersize 23168 -containerchecksum ce32153feecc4cdc5134c9100b5a643353e2c36d32bd1226a90efe14ac51e831de7e3b3d75c43a48cade9ca529657ce3dc6f09815ed554b857c1b870ca651981 -doccontainersize 1524120 -doccontainerchecksum f9ff97db6e1418f125769e4abd74322b6d3b4a41bc4394f3c58d4a554e4533659a716f37ae77867756dfff9297d28e876cf4cdff43075975be0271279c907307 -docfiles size=421 +containersize 23640 +containerchecksum 08713b4c652e6b872550995af356ee8e8be0cfc4f4d7d9fe4842a821a724474aa89679f9d4d9a0672baf0f2e17f76ed6bf8d4dc277034d35a73a515734334d86 +doccontainersize 1554160 +doccontainerchecksum f18877dab21387786e5481f572efa0f33f22dafc9f6e5483eb97d5a6fa686fa013cefb103d0c7ef6294f186a77094d35f441de8de98f339243fe8477dd26b708 +docfiles size=429 RELOC/doc/latex/zref-clever/CHANGELOG.md RELOC/doc/latex/zref-clever/DEPENDS.txt RELOC/doc/latex/zref-clever/README.md details="Readme" @@ -360636,16 +360667,17 @@ docfiles size=421 RELOC/doc/latex/zref-clever/zref-clever-code.tex RELOC/doc/latex/zref-clever/zref-clever.pdf details="User manual" RELOC/doc/latex/zref-clever/zref-clever.tex -srccontainersize 50684 -srccontainerchecksum e3e3468d5f01578c543325b4c9fc475ab996ebfa32f49525ec8717a8eb15a3f2ea2e3fdda8ce2cb705e0ed63a871688f9b10a02694c0365cd37b73ebaf3a32ea -srcfiles size=84 +srccontainersize 54652 +srccontainerchecksum 1444bc6c225c148ce6693d5276f5a7cb8b60028fac674881d484f243c9ff478ada1fa8e24867d073e059ff8570d1a0d5c0fcddc6ab8d5f505dc4359af799bc01 +srcfiles size=88 RELOC/source/latex/zref-clever/zref-clever.dtx RELOC/source/latex/zref-clever/zref-clever.ins -runfiles size=66 +runfiles size=68 RELOC/tex/latex/zref-clever/zref-clever-dutch.lang RELOC/tex/latex/zref-clever/zref-clever-english.lang RELOC/tex/latex/zref-clever/zref-clever-french.lang RELOC/tex/latex/zref-clever/zref-clever-german.lang + RELOC/tex/latex/zref-clever/zref-clever-italian.lang RELOC/tex/latex/zref-clever/zref-clever-portuguese.lang RELOC/tex/latex/zref-clever/zref-clever-spanish.lang RELOC/tex/latex/zref-clever/zref-clever.sty @@ -360653,7 +360685,7 @@ catalogue-contact-repository https://github.com/gusbrs/zref-clever catalogue-ctan /macros/latex/contrib/zref-clever catalogue-license lppl1.3c catalogue-topics label-ref expl3 -catalogue-version 0.3.1 +catalogue-version 0.3.2 name zref-vario category Package diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 index 3ba15b6536..f8702fa83f 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 @@ -1 +1 @@ -d7fac24a54d98e07904c78138a0f4d3f texlive.tlpdb +e88abc3209b97384b7dabd9e82f2018b texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 index 3c151fb7bb..480f308f78 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 @@ -1 +1 @@ -773402c13f78177c22405cb82029458f7dcaf5bb4636b9db74f58f2adb1bac2d3324d583d4331db5c28f95c674423d48d2469456af0e449c3f682ad801f82d96 texlive.tlpdb +0119d51a8248593fc97cb21dd4ffac7ba4b568a86bb9086c65f452e73d992cd33f05d4ca7dfc20471c43eca21dd020fd755dbdb7d1cfa20046096baa60e99269 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc index d8c266cf7f..d366fe915b 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----- -iQEcBAEBCgAGBQJjq5QVAAoJEEzhh34ZQ4xwbssIALmZE1p47LnMrs+fiFG+jLQ9 -cCJEm5E4oJQb6Z91FB9lNwWxJM0g3419hxSXNfh10TLY9+ZGIg0eqNJbZAk4+41t -KQNyeUp/egxnX9O6ZEts3XBxZfX6s4a9mtJhaxtvZdUgymoYk1pIQkJllDlZq894 -FgdGaswJAA1us/XWK7bdJXEc32l9xKbovSQQ0jQhPJN99r3PqW/aP1CCV72IMEHW -z68kmNGLy1II0tydMDaaeGOAcPS3SA+P+6ixDHhKj1l7Rm3zPG1hG30JWgRamtd2 -2MegVUUEtI4XGa1Sex3+Xws2uJOqpHR5IP59Ncvx6V78CYXoY5vhOXKHQ/JUMmc= -=hS8I +iQEcBAEBCgAGBQJjrOUgAAoJEEzhh34ZQ4xwdswIAJ+U6Os+3sOBGXVX/Qq9dv3T +K03UytNw2LVv5FWVzGTZ5yD16GbSIR6iSa/isaRDAicyDUqKhYtVSPVSNcXLr61b +h9Z+LIZkASUZu8uQbSk4Kn01k9rBQM65hRx0lWlkRT/3JTqDWYjXWR90NynuxYnU +/sUk/6CSrDi//6D4fjxlvn+2iuRKCucMfL9Kch3WeZkp2+YwPe29MyK2BULnGZpG +I1jZl3/MmvUca5Akq+jUrKLByP6/NPn+wZj7IlHbH2E5Y8IvGEGLAZtwJdc0VrGx +iuLPA8IC5vCr0O0SMd2vZ58B/oID4wqCn8L4Aan6NSUg6dAvKivhkH7jjuN93Gs= +=+5ln -----END PGP SIGNATURE----- diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz Binary files differindex 3c8ad48f00..5815c15af1 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz @@ -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-12-29-02-02 +2022-12-30-02-02 |