summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/texlive/tlmgr.pl106
-rw-r--r--Master/texmf-dist/doc/support/expltools/CHANGES.md35
-rw-r--r--Master/texmf-dist/doc/support/expltools/README.md50
-rw-r--r--Master/texmf-dist/doc/support/expltools/project-proposal.pdfbin67243 -> 67243 bytes
-rw-r--r--Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdfbin2780784 -> 2780950 bytes
-rwxr-xr-xMaster/texmf-dist/scripts/expltools/explcheck-cli.lua4
-rwxr-xr-xMaster/texmf-dist/scripts/expltools/explcheck-config.lua31
-rwxr-xr-xMaster/texmf-dist/scripts/expltools/explcheck-obsolete.lua4
-rwxr-xr-xMaster/texmf-dist/scripts/expltools/explcheck-toml.lua645
9 files changed, 823 insertions, 52 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
index 9110fc14ede..d7e54ca9276 100755
--- a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
+++ b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
@@ -1,5 +1,5 @@
#!/usr/bin/env perl
-# $Id: tlmgr.pl 72848 2024-11-14 15:14:04Z karl $
+# $Id: tlmgr.pl 73459 2025-01-15 04:24:52Z preining $
# Copyright 2008-2024 Norbert Preining
# This file is licensed under the GNU General Public License version 2
# or any later version.
@@ -8,8 +8,8 @@
use strict; use warnings;
-my $svnrev = '$Revision: 72848 $';
-my $datrev = '$Date: 2024-11-14 16:14:04 +0100 (Thu, 14 Nov 2024) $';
+my $svnrev = '$Revision: 73459 $';
+my $datrev = '$Date: 2025-01-15 05:24:52 +0100 (Wed, 15 Jan 2025) $';
my $tlmgrrevision;
my $tlmgrversion;
my $prg;
@@ -213,6 +213,7 @@ my %action_specification = (
"list" => 1,
"only-installed" => 1,
"only-remote" => 1,
+ "only-files" => 1,
"json" => 1
},
"run-post" => 0,
@@ -4368,6 +4369,17 @@ sub show_one_package_detail {
}
}
}
+ if ($opts{"only-files"}) {
+ print "$pkg\n";
+ return show_one_package_detail3($tlpdb, $pkg, $tlp, $source_found, $installed, 1, @colls);
+ } else {
+ return show_one_package_detail2($tlpdb, $pkg, $tlp, $source_found, $installed, 0, @colls);
+ }
+}
+
+sub show_one_package_detail2 {
+ my ($tlpdb, $pkg, $tlp, $source_found, $installed, @colls) = @_;
+ my $ret = $F_OK;
# {
# require Data::Dumper;
# print Data::Dumper->Dump([\$tlp], [qw(tlp)]);
@@ -4464,48 +4476,55 @@ sub show_one_package_detail {
}
}
print "Included files, by type:\n";
- # if the package has a .ARCH dependency we also list the files for
- # those packages
- my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
- for my $d (sort @todo) {
- my $foo = $tlpdb->get_package($d);
- if (!$foo) {
- tlwarn ("$prg: Should not happen, no dependent package $d\n");
- return($F_WARNING);
- }
- if ($d ne $pkg) {
- print "depending package $d:\n";
- }
- if ($foo->runfiles) {
- print "run files:\n";
- for my $f (sort $foo->runfiles) { print " $f\n"; }
- }
- if ($foo->srcfiles) {
- print "source files:\n";
- for my $f (sort $foo->srcfiles) { print " $f\n"; }
- }
- if ($foo->docfiles) {
- print "doc files:\n";
- for my $f (sort $foo->docfiles) {
- print " $f";
- my $dfd = $foo->docfiledata;
- if (defined($dfd->{$f})) {
- for my $k (keys %{$dfd->{$f}}) {
- print " $k=\"", $dfd->{$f}->{$k}, '"';
- }
+ $ret |= show_one_package_detail3($tlpdb, $pkg, $tlp, $source_found, $installed, 0, @colls);
+ }
+ print "\n";
+ return($ret);
+}
+
+sub show_one_package_detail3 {
+ my ($tlpdb, $pkg, $tlp, $source_found, $installed, $silent, @colls) = @_;
+ my $ret = $F_OK;
+ # if the package has a .ARCH dependency we also list the files for
+ # those packages
+ my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
+ for my $d (sort @todo) {
+ my $foo = $tlpdb->get_package($d);
+ if (!$foo) {
+ tlwarn ("$prg: Should not happen, no dependent package $d\n");
+ return($F_WARNING);
+ }
+ if ($d ne $pkg && !$silent) {
+ print "depending package $d:\n";
+ }
+ if ($foo->runfiles) {
+ print "run files:\n" if (!$silent);
+ for my $f (sort $foo->runfiles) { print " $f\n"; }
+ }
+ if ($foo->srcfiles) {
+ print "source files:\n" if (!$silent);
+ for my $f (sort $foo->srcfiles) { print " $f\n"; }
+ }
+ if ($foo->docfiles) {
+ print "doc files:\n" if (!$silent);
+ for my $f (sort $foo->docfiles) {
+ print " $f";
+ my $dfd = $foo->docfiledata;
+ if (defined($dfd->{$f})) {
+ for my $k (keys %{$dfd->{$f}}) {
+ print " $k=\"", $dfd->{$f}->{$k}, '"';
}
- print "\n";
}
- }
- # in case we have them
- if ($foo->allbinfiles) {
- print "bin files (all platforms):\n";
- for my $f (sort $foo->allbinfiles) { print " $f\n"; }
+ print "\n";
}
}
+ # in case we have them
+ if ($foo->allbinfiles) {
+ print "bin files (all platforms):\n" if (!$silent);
+ for my $f (sort $foo->allbinfiles) { print " $f\n"; }
+ }
}
- print "\n";
- return($ret);
+ return $ret;
}
# PINNING
@@ -8818,6 +8837,11 @@ files is also shown, including those for platform-specific dependencies.
When given with schemes and collections, C<--list> outputs their
dependencies in a similar way.
+=item B<--only-files>
+
+If this option is given, only the files for a given package are listed,
+no further information.
+
=item B<--only-installed>
If this option is given, the installation source will not be used; only
@@ -10591,7 +10615,7 @@ This script and its documentation were written for the TeX Live
distribution (L<https://tug.org/texlive>) and both are licensed under the
GNU General Public License Version 2 or later.
-$Id: tlmgr.pl 72848 2024-11-14 15:14:04Z karl $
+$Id: tlmgr.pl 73459 2025-01-15 04:24:52Z preining $
=cut
# test HTML version: pod2html --cachedir=/tmp tlmgr.pl >/tmp/tlmgr.html
diff --git a/Master/texmf-dist/doc/support/expltools/CHANGES.md b/Master/texmf-dist/doc/support/expltools/CHANGES.md
index 135f8dce324..d4ef90457ca 100644
--- a/Master/texmf-dist/doc/support/expltools/CHANGES.md
+++ b/Master/texmf-dist/doc/support/expltools/CHANGES.md
@@ -1,5 +1,40 @@
# Changes
+## expltools 2025-01-16
+
+### explcheck v0.6.0
+
+#### Development
+
+- Add support for TOML configuration files. (#24)
+
+ You may configure the tool by placing a configuration file named
+ `.explcheckrc` in the current working directory.
+
+ For example, the following configuration file would increase the maximum line
+ length before the warning S103 (Line too long) is produced from 80 to 120
+ characters and also disable the warnings W100 (No standard delimiters) and
+ S206 (Missing stylistic whitespaces):
+
+ ``` toml
+ [options]
+ max_line_length = 120
+ ignored_issues = ["w100", "s206"]
+ ```
+
+#### Fixes
+
+- Do not require lower-case identifiers in the command-line option
+ `--ignored-issues`. (f394d38c)
+
+#### Distribution
+
+- Add Lua library `lfs` to Docker image `ghcr.io/witiko/expltools/explcheck`.
+ (4f9f26f)
+
+ This enables additional functionality, such as suggesting which `.ins` file
+ the user should process with TeX to extract expl3 code from a `.dtx` archive.
+
## expltools 2025-01-15
### explcheck v0.5.0
diff --git a/Master/texmf-dist/doc/support/expltools/README.md b/Master/texmf-dist/doc/support/expltools/README.md
index 96ddfc22eba..42abd833567 100644
--- a/Master/texmf-dist/doc/support/expltools/README.md
+++ b/Master/texmf-dist/doc/support/expltools/README.md
@@ -29,13 +29,13 @@ In the future, this repository may also contain the code of other useful develop
## Usage
-You can use the tool from the command line as follows:
+You may use the tool from the command line as follows:
```
$ explcheck [options] [.tex, .cls, and .sty files]
```
-You can also use the tool from your own Lua code by importing the corresponding files `explcheck-*.lua`.
+You may also use the tool from your own Lua code by importing the corresponding files `explcheck-*.lua`.
For example, here is Lua code that applies the preprocessing step to the code from a file named `code.tex`:
``` lua
@@ -67,15 +67,15 @@ print(
)
```
-You can also use the tool from continuous integration workflows using the Docker image `ghcr.io/witiko/expltools/explcheck`.
-For example, here is a GitHub Actions workflow file that applies the tool to all .tex file in a Git repository:
+You may also use the tool from continuous integration workflows using the Docker image `ghcr.io/witiko/expltools/explcheck`.
+For example, here is a GitHub Actions workflow file that applies the tool to all .tex files in a Git repository:
``` yaml
name: Check expl3 code
on:
push:
jobs:
- typeset:
+ check-code:
runs-on: ubuntu-latest
container:
image: ghcr.io/witiko/expltools/explcheck
@@ -84,6 +84,46 @@ jobs:
- run: explcheck *.tex
```
+## Configuration
+
+You may configure the tool using command-line options.
+
+For example, the following command-line options would increase the maximum line length before the warning S103 (Line too long) is produced from 80 to 120 characters and also disable the warnings W100 (No standard delimiters) and S206 (Missing stylistic whitespaces).
+
+``` sh
+$ explcheck --max-line-length=120 --ignored-issues=w100,s206 *.tex
+```
+
+Use the command `explcheck --help` to list the available options.
+
+You may also configure the tool by placing a configuration file named `.explcheckrc` in the current working directory.
+For example, here is a configuration file that applies the same configuration as the above command-line options:
+
+``` toml
+[options]
+max_line_length = 120
+ignored_issues = ["w100", "s206"]
+```
+
+You may also configure the tool from within your Lua code.
+For example, here is how you would apply the same configuration in the Lua example from the previous section:
+
+``` lua
+local options = { max_line_length = 120 }
+
+issues:ignore("w100")
+issues:ignore("s206")
+
+local _, expl_ranges = preprocessing(issues, content, options)
+lexical_analysis(issues, content, expl_ranges, options)
+```
+
+Command-line options, configuration files, and Lua code allow you to ignore certain warnings and errors everywhere.
+To ignore them in just some of your expl3 code, you may use TeX comments.
+
+For example, a comment `% noqa` will ignore any issues on the current line.
+As another example, a comment `% noqa: w100, s206` will ignore the file-wide warning W100 and also the warning S206 on the current line.
+
## Notes to distributors
You can prepare the expltools bundle for distribution with the following two commands:
diff --git a/Master/texmf-dist/doc/support/expltools/project-proposal.pdf b/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
index dab1d058fb8..016bd296bbc 100644
--- a/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
+++ b/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf b/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
index 3d90203727f..9fac58c8cd8 100644
--- a/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
+++ b/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
Binary files differ
diff --git a/Master/texmf-dist/scripts/expltools/explcheck-cli.lua b/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
index edac7b2216a..134a2ba5c0b 100755
--- a/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
+++ b/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
@@ -159,7 +159,7 @@ local function print_usage()
end
local function print_version()
- print("explcheck (expltools 2025-01-15) v0.5.0")
+ print("explcheck (expltools 2025-01-16) v0.6.0")
print("Copyright (c) 2024-2025 Vít Starý Novotný")
print("Licenses: LPPL 1.3 or later, GNU GPL v2 or later")
end
@@ -188,7 +188,7 @@ else
elseif argument:sub(1, 17) == "--ignored-issues=" then
options.ignored_issues = {}
for issue_identifier in argument:sub(18):gmatch('[^,]+') do
- table.insert(options.ignored_issues, issue_identifier)
+ table.insert(options.ignored_issues, issue_identifier:lower())
end
elseif argument:sub(1, 18) == "--max-line-length=" then
options.max_line_length = tonumber(argument:sub(19))
diff --git a/Master/texmf-dist/scripts/expltools/explcheck-config.lua b/Master/texmf-dist/scripts/expltools/explcheck-config.lua
index 36e7905f92a..696c4cab523 100755
--- a/Master/texmf-dist/scripts/expltools/explcheck-config.lua
+++ b/Master/texmf-dist/scripts/expltools/explcheck-config.lua
@@ -1,9 +1,36 @@
--- The default configuration for the static analyzer explcheck.
+-- The configuration for the static analyzer explcheck.
-return {
+local toml = require("explcheck-toml")
+
+-- The default options
+local default_options = {
expect_expl3_everywhere = false,
max_line_length = 80,
porcelain = false,
warnings_are_errors = false,
ignored_issues = {},
}
+
+-- Read a TOML file with a user-defined configuration.
+local function read_config_file(pathname)
+ local file = io.open(pathname, "r")
+ if file == nil then
+ return {}
+ end
+ local content = assert(file:read("*a"))
+ assert(file:close())
+ return toml.parse(content)
+end
+
+-- The user-defined configuration
+local config_file = read_config_file(".explcheckrc")
+
+-- The user-defined options, falling back on the default options
+local options = {}
+for _, template_options in ipairs({default_options, config_file.options or {}}) do
+ for key, value in pairs(template_options) do
+ options[key] = value
+ end
+end
+
+return options
diff --git a/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua b/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
index a5457a7c8ea..dbd7b23e270 100755
--- a/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
+++ b/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
@@ -9,8 +9,8 @@ local wildcard = regular_character^0
-- luacheck: push no max line length
local obsolete = {}
-obsolete.deprecated_csname = (P("p") * (P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("new:nn") + P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))))))))) + P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("N") * (P("n") + P("x")) + P("c") * (P("n") + P("x")))))))))))))))) + P("t") * (P("l") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("g") * (P("et:NN") + P("clear:N")) + P("clear:N"))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("N") * (P("n") * (P("TF") + P("F") + P("T")) + P("n")) + P("c") * (P("n") * (P("TF") + P("F") + P("T")) + P("n"))))))))) + P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("declare_eight_bit_encoding:nnn") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V")))))) + P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n"))))))))))))))) + P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("function:NN") + P("inline:Nn"))))))))))))) + P("set_map_x:NNn") + P("gset_map_x:NNn")))) + P("ys_load_deprecation:")) + P("l") * (P("_") * (P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("letterlike_tl") + P("accents_tl")))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("path_tl") + P("key_tl")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("nn") + P("n")))))))))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("n") * (P("nN") + P("N")) + P("v") * (P("nN") + P("N")) + P("V") * (P("nN") + P("N")) + P("o") * (P("nN") + P("N")) + P("n") + P("V") + P("v") + P("o"))))))))))))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("t") * (P("o") * (P("_") * (P("nfd:N") + P("utfviii_bytes:n"))) + P("itlecase:N")) + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("titlecase:N") + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))))))))))) + P("s_argument_spec:N"))) * eof
-obsolete.removed_csname = (P("h") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))))))))) + P("i") * (P("f_num:w") + P("n") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("hexadecimal:n") + P("binary:n") + P("octal:n")))))) + P("t") * (P("o") * (P("_") * (P("hexadecimal:n") + P("symbol:n") + P("binary:n") + P("octal:n")))) + P("e") * (P("v") * (P("a") * (P("l") * (P(":w") + P("_end:"))))) + P("value:w") + P("c") * (P("o") * (P("n") * (P("v") * (P("e") * (P("r") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("base_ten:nn") + P("symbols:nn")))))) + P("to_base_ten:nn")))))))) + P("ase:nnn"))))) + P("o") * (P("r") * (P("_") * (P("g") * (P("to:NN") + P("et_str:NN")) + P("l") * (P("og_streams:") + P("ist_streams:")) + P("to:NN") + P("open_streams:") + P("s") * (P("t") * (P("r") * (P("_") * (P("to:NN") + P("gto:NN"))))))) + P("w") * (P("_") * (P("l") * (P("og_streams:") + P("ist_streams:")) + P("wrap:xnnnN") + P("n") * (P("o") * (P("w") * (P("_") * (P("b") * (P("u") * (P("f") * (P("f") * (P("e") * (P("r") * (P("_") * (P("s") * (P("a") * (P("f") * (P("e") * (P(":") * (P("N") * (P("n") + P("x")))))))))))))) + P("w") * (P("h") * (P("e") * (P("n") * (P("_") * (P("a") * (P("v") * (P("a") * (P("i") * (P("l") * (P(":") * (P("N") * (P("n") + P("x"))))))))))))))))) + P("open_streams:"))))) + P("f") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("z") * (P("e") * (P("r") * (P("o") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))) + P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P("d") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))))) + P("g") * (P("l") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("m") * (P("u") * (P("l") * (P(":") * (P("Nn") + P("cn"))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("Nn") + P("cn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("Nn") + P("cn"))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("Nn") + P("cn"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn")))))))))))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("Nn") + P("cn")))))) + P("l") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("m") * (P("u") * (P("l") * (P(":") * (P("Nn") + P("cn"))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("Nn") + P("cn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("Nn") + P("cn"))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("Nn") + P("cn"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn")))))))))))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("Nn") + P("cn"))) + P("m") * (P("p") * (P("a") * (P("r") * (P("e") * (P(":") * (P("N") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")))))))))))))) + P("i") * (P("l") * (P("e") * (P("_") * (P("list:") + P("add_path:nN") + P("p") * (P("a") * (P("t") * (P("h") * (P("_") * (P("remove:n") + P("include:n")))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("x") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("n") * (P("p") * (P("u") * (P("t") * (P(":") * (P("n") * (P("TF") + P("T")))))))))))))))))))))) + P("g") * (P("roup_execute_after:N") + P("_") * (P("file_current_name_tl") + P("t") * (P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c_toks")))))) + P("l") * (P("u") * (P("a") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))) + P("_") * (P("escape_x:n") + P("now_x:n") + P("shipout_x:n")))) + P("_") * (P("last_box") + P("iow_line_length_int") + P("t") * (P("l_replace_toks") + P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c") * (P("_") * (P("toks") + P("int")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("i") * (P("n") * (P("t") * (P("e") * (P("r") * (P("r") * (P("u") * (P("p") * (P("t") * (P(":") * (P("nn") + P("xxx"))))))))))) + P("newline:") + P("g") * (P("e") * (P("n") * (P("e") * (P("r") * (P("i") * (P("c") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("n") * (P("nn") + P("n")))))) + P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("nn") + P("n")))))))))))))) + P("d") * (P("i") * (P("r") * (P("e") * (P("c") * (P("t") * (P("_") * (P("log:xx") + P("interrupt:xxxxx") + P("term:xx")))))))) + P("t") * (P("e") * (P("r") * (P("m") * (P(":") * (P("n") + P("x"))))) + P("r") * (P("a") * (P("c") * (P("e") * (P(":") * (P("n") * (P("n") * (P("x") * (P("x") * (P("xx") + P("x")) + P("x")) + P("x")) + P("n"))))))) + P("wo_newlines:")) + P("l") * (P("o") * (P("g") * (P(":") * (P("n") + P("x"))))) + P("c") * (P("l") * (P("a") * (P("s") * (P("s") * (P("_") * (P("new:nn") + P("set:nn"))))))))))) + P("K") * (P("V") * (P("_") * (P("p") * (P("r") * (P("o") * (P("c") * (P("e") * (P("s") * (P("s") * (P("_") * (P("no_space_removal_no_sanitize:NNn") + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_") * (P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("a") * (P("l") * (P("_") * (P("no_sanitize:NNn") + P("sanitize:NNn")))))))))))))))))))))))))) + P("d") * (P("i") * (P("m") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("x") * (P(":") * (P("Nn") + P("cn"))))))))) + P("e") * (P("v") * (P("a") * (P("l") * (P(":w") + P("_end:"))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("x") * (P(":") * (P("Nn") + P("cn")))))))))) + P("case:nnn"))))) + P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(".:D")))))) + P("b") * (P("o") * (P("x") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))))))))) + P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("r") * (P("e") * (P("s") * (P("i") * (P("z") * (P("e") * (P(":") * (P("Nnn") + P("cnn")))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))))))))))))))))) + P("c") * (P("h") * (P("k_if_free_cs:N") + P("a") * (P("r") * (P("_") * (P("m") * (P("a") * (P("k") * (P("e") * (P("_") * (P("i") * (P("n") * (P("v") * (P("a") * (P("l") * (P("i") * (P("d") * (P(":") * (P("N") + P("n")))))))) + P("g") * (P("n") * (P("o") * (P("r") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("l") * (P("e") * (P("t") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n")))))))) + P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") + P("n")))))) + P("u") * (P("b") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n"))))))))) + P("p") * (P("e") * (P("r") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n")))))))))))))))))) + P("p") * (P("a") * (P("r") * (P("a") * (P("m") * (P("e") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))))))) + P("a") * (P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") + P("n")))))))))))))) + P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))) + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("e") * (P("n") * (P("d") * (P("_") * (P("l") * (P("i") * (P("n") * (P("e") * (P(":") * (P("N") + P("n")))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n")))))))))) + P("s") * (P("c") * (P("a") * (P("p") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))))))))) + P("c") * (P("o") * (P("m") * (P("m") * (P("e") * (P("n") * (P("t") * (P(":") * (P("N") + P("n")))))))))))))) + P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))) + P("s") * (P("h") * (P("o") * (P("w") * (P("_") * (P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))))))) + P("e") * (P("t") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))))) + P("s") * (P("_") * (P("set_eq:NwN") + P("g") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x")))) + P("_") * (P("p") * (P("r") * (P("o") * (P("t") * (P("e") * (P("c") * (P("t") * (P("e") * (P("d") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x")))) + P("_") * (P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x"))))))))))))))))))) + P("e") * (P("q") * (P(":") * (P("Nc") + P("c") * (P("c") + P("N"))))) + P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x"))))))))))))) + P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P(":") * (P("c") + P("N"))))))))))))) + P("l") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("Nc") + P("c") * (P("c") + P("N")))))))))) + P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N")))))))))))) + P("op:cN")) + P("g") * (P("remove_element:Nn") + P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N")))))))))))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N") + P("n")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("remove_element:Nn") + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))))))))) + P("_") * (P("xetex_is_engine_bool") + P("zero") + P("f") * (P("o") * (P("u") * (P("rteen") + P("r"))) + P("i") * (P("fteen") + P("ve"))) + P("undefined_fp") + P("l") * (P("uatex_is_engine_bool") + P("etter_token")) + P("m") * (P("inus_one") + P("ath_shift_token")) + P("job_name_tl") + P("keys_code_root_tl") + P("pdftex_is_engine_bool") + P("a") * (P("lignment_tab_token") + P("ctive_char_token")) + P("nine") + P("o") * (P("n") * (P("e") * (P("_") * (P("hundred") + P("thousand"))) + P("e")) + P("ther_char_token")) + P("t") * (P("h") * (P("ree") + P("i") * (P("r") * (P("t") * (P("y_two") + P("een"))))) + P("e") * (P("rm_ior") + P("n_thousand") + P("n")) + P("w") * (P("o") * (P("_") * (P("h") * (P("u") * (P("n") * (P("d") * (P("r") * (P("e") * (P("d") * (P("_") * (P("f") * (P("i") * (P("f") * (P("t") * (P("y") * (P("_") * (P("five") + P("six"))))))))))))))))) + P("elve") + P("o"))) + P("e") * (P("leven") + P("ight") + P("mpty_toks")) + P("s") * (P("tring_cctab") + P("even") + P("i") * (P("xteen") + P("x"))) + P("catcode_active_tl"))) + P("x") * (P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))))) + P("v") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))))))))) + P("p") * (P("d") * (P("f") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("gafter:NN") + P("after:NN"))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))) + P("e") * (P("l") * (P(":") * (P("N") * (P("n") + P("V")) + P("c") * (P("n") + P("V")))))) + P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T")))))) + P("e") * (P("q") * (P(":") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))))))) + P("g") * (P("d") * (P("e") * (P("l") * (P(":") * (P("N") * (P("n") + P("V")) + P("c") * (P("n") + P("V")))))) + P("e") * (P("t") * (P(":") * (P("Nn") + P("cn")) + P("_gdel:NnN"))) + P("put:ccx") + P("g") * (P("e") * (P("t") * (P(":") * (P("N") * (P("nN") + P("VN")) + P("c") * (P("nN") + P("VN")))))))))) + P("g") * (P("_") * (P("s") * (P("t") * (P("e") * (P("p") * (P("w") * (P("i") * (P("s") * (P("e") * (P("_") * (P("inline:nnnn") + P("function:nnnN") + P("variable:nnnNn"))))))))) + P("et_map_functions:Nn")) + P("new_map_functions:Nn") + P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("dim:nnn") + P("int:nnn") + P("t") * (P("l") * (P(":") * (P("Nnn") + P("cnn")))) + P("s") * (P("t") * (P("r") * (P(":") * (P("xxn") + P("nnn") + P("onn"))))))))))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("q") * (P("u") * (P("a") * (P("r") * (P("k") * (P("_") * (P("i") * (P("f") * (P("_") * (P("r") * (P("e") * (P("c") * (P("u") * (P("r") * (P("s") * (P("i") * (P("o") * (P("n") * (P("_") * (P("t") * (P("a") * (P("i") * (P("l") * (P("_") * (P("b") * (P("r") * (P("e") * (P("a") * (P("k") * (P(":") * (P("N") + P("n"))))))))))))))))))))))))))))))) + P("t") * (P("l") * (P("_") * (P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("i") * (P(":") * (P("n") + P("w")) + P("i") * (P("i") * (P(":") * (P("f") + P("n") + P("w")))))))))) + P("i") * (P("f") * (P("_") * (P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n")))))) + P("N") * (P("_") * (P("t") * (P("y") * (P("p") * (P("e") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))))))) + P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("x") * (P("TF") + P("F") + P("T"))))))))))) + P("g") * (P("r") * (P("e") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))))))))))))) + P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))))))))))))) + P("s") * (P("e") * (P("t") * (P(":Nc") + P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P(":") * (P("Nnn") + P("cnn")) + P("_") * (P("x") * (P(":") * (P("Nnn") + P("cnn")))))))))))))))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V")))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") + P("x")) + P("cn"))))) + P("s") * (P("h") * (P("o") * (P("w") * (P("_") * (P("a") * (P("n") * (P("a") * (P("l") * (P("y") * (P("s") * (P("i") * (P("s") * (P(":") * (P("N") + P("n")))))))))))))) + P("e") * (P("t") * (P(":Nc") + P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P(":") * (P("Nnn") + P("cnn")) + P("_") * (P("x") * (P(":") * (P("Nnn") + P("cnn"))))))))))))))))) + P("t") * (P("o") * (P("_") * (P("lowercase:n") + P("uppercase:n"))) + P("ail:w")) + P("e") * (P("l") * (P("t") * (P("_") * (P("c") * (P("o") * (P("u") * (P("n") * (P("t") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V"))))))))))) + P("r") * (P("e") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))))))))))))) + P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))))))))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("Nnn") + P("cnn")))))))) + P("o") * (P("k") * (P("s") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V"))))))) + P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("N") * (P("f") + P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V")))))))))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))) + P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("_") * (P("p") * (P(":") * (P("c") + P("N")))))))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("c") + P("N"))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V"))))))) + P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V")))))))))))) + P("s") * (P("e") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V") + P("x"))) + P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N")) + P("_") * (P("g") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("s") * (P("h") * (P("o") * (P("w") * (P(":") * (P("c") + P("N"))))) + P("e") * (P("t") * (P(":") * (P("N") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x")) + P("c") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x"))) + P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))) + P("e") * (P("n") * (P("_") * (P("i") * (P("f") * (P("_") * (P("a") * (P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))))) + P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N")))))))))))) + P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N")))))))))))))) + P("new:Nn") + P("g") * (P("e") * (P("t") * (P("_") * (P("prefix_spec:N") + P("arg_spec:N") + P("replacement_spec:N"))))))))))) + P("u") * (P("p") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))) + P("s") * (P("e") * (P("_") * (P("i") * (P("_") * (P("a") * (P("f") * (P("t") * (P("e") * (P("r") * (P("_") * (P("else:nw") + P("fi:nw") + P("o") * (P("r") * (P(":nw") + P("else:nw"))))))))))))))) + P("E") * (P("x") * (P("p") * (P("l") * (P("S") * (P("y") * (P("n") * (P("t") * (P("a") * (P("x") * (P("N") * (P("a") * (P("m") * (P("e") * (P("s") * (P("O") * (P("ff") + P("n"))))))))))))))))) + P("s") * (P("o") * (P("r") * (P("t") * (P("_") * (P("reversed:") + P("ordered:"))))) + P("t") * (P("r") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("x") * (P("x") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p:xx") + P("x") * (P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("T")))) + P("_p:nn")))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nnn") + P("onn")) + P("_") * (P("x") * (P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("n") + P("T")) + P("n")))))))))))) + P("e") * (P("q") * (P("_") * (P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("t") * (P("o") * (P("p") * (P(":") * (P("NN") + P("cN"))))) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))))))) + P("k") * (P("i") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P("f") * (P("i") * (P("n") * (P("i") * (P("t") * (P("e") * (P("_") * (P("g") * (P("l") * (P("u") * (P("e") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))))))))))))))))) + P("can_align_safe_stop:"))) * eof
+obsolete.removed_csname = (P("u") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))) + P("s") * (P("e") * (P("_") * (P("i") * (P("_") * (P("a") * (P("f") * (P("t") * (P("e") * (P("r") * (P("_") * (P("else:nw") + P("fi:nw") + P("o") * (P("r") * (P("else:nw") + P(":nw")))))))))))))) + P("p") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))))) + P("v") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))))))))) + P("s") * (P("e") * (P("q") * (P("_") * (P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("t") * (P("o") * (P("p") * (P(":") * (P("cN") + P("NN"))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N")))))))) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))))))) + P("k") * (P("i") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P("f") * (P("i") * (P("n") * (P("i") * (P("t") * (P("e") * (P("_") * (P("g") * (P("l") * (P("u") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("TF") + P("F") + P("T"))))))))))))))))))))))) + P("t") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("x") * (P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("n") + P("T")) + P("n"))))) + P(":") * (P("onn") + P("nnn")))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("x") * (P("_p:nn") + P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("T"))))) + P("p:xx")) + P(":") * (P("x") * (P("x") * (P("TF") + P("F") + P("T")))))))))))) + P("o") * (P("r") * (P("t") * (P("_") * (P("ordered:") + P("reversed:"))))) + P("can_align_safe_stop:")) + P("t") * (P("o") * (P("k") * (P("e") * (P("n") * (P("_") * (P("i") * (P("f") * (P("_") * (P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T"))))))))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T"))))))))))))) + P("a") * (P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T"))))))))))))) + P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T"))))))))))))))))))) + P("new:Nn") + P("g") * (P("e") * (P("t") * (P("_") * (P("arg_spec:N") + P("replacement_spec:N") + P("prefix_spec:N")))))))) + P("s") * (P("_") * (P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("g") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))) + P(":") * (P("c") + P("N"))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("c") + P("N"))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P("_") * (P("p") * (P(":") * (P("c") + P("N")))) + P(":") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T"))))))) + P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))) + P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T"))) + P("N") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T"))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))) + P(":") * (P("c") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x")) + P("N") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x"))))) + P("h") * (P("o") * (P("w") * (P(":") * (P("c") + P("N")))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))) + P(":") * (P("c") * (P("n") + P("o") + P("V") + P("x")) + P("N") * (P("n") + P("o") + P("V") + P("x")))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("p") * (P("u") * (P("t") * (P("_") * (P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x")))))))) + P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x")))))))))))) + P("p") * (P("u") * (P("t") * (P("_") * (P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("f") + P("n") + P("o") + P("V") + P("x")))))))) + P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x"))))))))))))))) + P("l") * (P("_") * (P("e") * (P("l") * (P("t") * (P("_") * (P("c") * (P("o") * (P("u") * (P("n") * (P("t") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V"))))))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("cnn") + P("Nnn")))))) + P("t") * (P("ail:w") + P("o") * (P("_") * (P("uppercase:n") + P("lowercase:n")))) + P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))) + P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("cn") + P("N") * (P("n") + P("x")))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V")))))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("x") * (P("TF") + P("F") + P("T")))))))) + P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("N") * (P("_") * (P("t") * (P("y") * (P("p") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("TF") + P("F") + P("T"))))))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P("_p:n") + P(":") * (P("n") * (P("TF") + P("F") + P("T")))))))) + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("TF") + P("F") + P("T")))))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("x") * (P(":") * (P("cnn") + P("Nnn")))) + P(":") * (P("cnn") + P("Nnn")))))))))))) + P(":Nc"))) + P("h") * (P("o") * (P("w") * (P("_") * (P("a") * (P("n") * (P("a") * (P("l") * (P("y") * (P("s") * (P("i") * (P("s") * (P(":") * (P("N") + P("n"))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("x") * (P(":") * (P("cnn") + P("Nnn")))) + P(":") * (P("cnn") + P("Nnn")))))))))))) + P(":Nc")))) + P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))) + P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn"))))))))))))) + P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("i") * (P("i") * (P("i") * (P(":") * (P("f") + P("n") + P("w")))) + P(":") * (P("n") + P("w"))))))))))) + P("q") * (P("u") * (P("a") * (P("r") * (P("k") * (P("_") * (P("i") * (P("f") * (P("_") * (P("r") * (P("e") * (P("c") * (P("u") * (P("r") * (P("s") * (P("i") * (P("o") * (P("n") * (P("_") * (P("t") * (P("a") * (P("i") * (P("l") * (P("_") * (P("b") * (P("r") * (P("e") * (P("a") * (P("k") * (P(":") * (P("N") + P("n"))))))))))))))))))))))))))))))) + P("p") * (P("e") * (P("e") * (P("k") * (P("_") * (P("after:NN") + P("gafter:NN"))))) + P("r") * (P("g") * (P("_") * (P("new_map_functions:Nn") + P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("int:nnn") + P("t") * (P("l") * (P(":") * (P("cnn") + P("Nnn")))) + P("s") * (P("t") * (P("r") * (P(":") * (P("nnn") + P("onn") + P("xxn"))))) + P("dim:nnn")))))) + P("s") * (P("et_map_functions:Nn") + P("t") * (P("e") * (P("p") * (P("w") * (P("i") * (P("s") * (P("e") * (P("_") * (P("inline:nnnn") + P("function:nnnN") + P("variable:nnnNn")))))))))))) + P("o") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))) + P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T"))) + P("N") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T")))))) + P("i") * (P("n") * (P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T"))))))))) + P("g") * (P("e") * (P("t") * (P("_gdel:NnN") + P(":") * (P("cn") + P("Nn")))) + P("put:ccx") + P("g") * (P("e") * (P("t") * (P(":") * (P("c") * (P("VN") + P("nN")) + P("N") * (P("VN") + P("nN")))))) + P("d") * (P("e") * (P("l") * (P(":") * (P("c") * (P("n") + P("V")) + P("N") * (P("n") + P("V"))))))) + P("d") * (P("e") * (P("l") * (P(":") * (P("c") * (P("n") + P("V")) + P("N") * (P("n") + P("V"))))) + P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N"))))))))))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))) + P("d") * (P("f") * (P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("TF") + P("F") + P("T"))))))))))) + wildcard * P(":D")))))))) + P("x") * (P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("TF") + P("F") + P("T"))))))))))) + wildcard * P(":D"))))))) + P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(".:D")))))) + P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("x") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("n") * (P("p") * (P("u") * (P("t") * (P(":") * (P("n") * (P("TF") + P("T"))))))))))))))))) + P("p") * (P("a") * (P("t") * (P("h") * (P("_") * (P("include:n") + P("remove:n")))))) + P("add_path:nN") + P("list:"))))) + P("p") * (P("_") * (P("e") * (P("x") * (P("p") * (P(":") * (P("cn") + P("Nn"))))) + P("c") * (P("o") * (P("m") * (P("p") * (P("a") * (P("r") * (P("e") * (P(":") * (P("N") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")))))))))) + P("s") * (P(":") * (P("cn") + P("Nn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("cn") + P("Nn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn")))))))) + P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn"))))))))))))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("cn") + P("Nn"))))) + P("m") * (P("u") * (P("l") * (P(":") * (P("cn") + P("Nn"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("l") * (P("n") * (P(":") * (P("cn") + P("Nn")))) + P("i") * (P("f") * (P("_") * (P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P("d") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T")))))))))))) + P("z") * (P("e") * (P("r") * (P("o") * (P("_p:N") + P(":") * (P("N") * (P("TF") + P("F") + P("T")))))))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("cn") + P("Nn"))))) + P("g") * (P("e") * (P("x") * (P("p") * (P(":") * (P("cn") + P("Nn"))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("cn") + P("Nn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("cn") + P("Nn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn")))))))) + P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn"))))))))))))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("cn") + P("Nn"))))) + P("m") * (P("u") * (P("l") * (P(":") * (P("cn") + P("Nn"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("l") * (P("n") * (P(":") * (P("cn") + P("Nn")))) + P("t") * (P("a") * (P("n") * (P(":") * (P("cn") + P("Nn"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("c") * (P("s") * (P("_") * (P("g") * (P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P(":") * (P("c") + P("N")))))))))) + P("n") * (P("e") * (P("w") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("Nc")))) + P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x"))))))))) + P("p") * (P("r") * (P("o") * (P("t") * (P("e") * (P("c") * (P("t") * (P("e") * (P("d") * (P("_") * (P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))))) + P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))))))))) + P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))) + P("set_eq:NwN"))) + P("l") * (P("i") * (P("s") * (P("t") * (P("_") * (P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("t") * (P("op:cN") + P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N"))))))))))))) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N"))))))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("Nc")))) + P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T")) + P("N") * (P("TF") + P("F") + P("T"))) + P("N") * (P("c") * (P("TF") + P("F") + P("T"))))))))) + P("remove_element:Nn") + P("g") * (P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N"))))))))))))) + P("remove_element:Nn")) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N") + P("n"))))))))))))) + P("_") * (P("e") * (P("ight") + P("mpty_toks") + P("leven")) + P("f") * (P("i") * (P("ve") + P("fteen")) + P("o") * (P("u") * (P("rteen") + P("r")))) + P("catcode_active_tl") + P("t") * (P("e") * (P("n_thousand") + P("rm_ior") + P("n")) + P("w") * (P("elve") + P("o") * (P("_") * (P("h") * (P("u") * (P("n") * (P("d") * (P("r") * (P("e") * (P("d") * (P("_") * (P("f") * (P("i") * (P("f") * (P("t") * (P("y") * (P("_") * (P("six") + P("five"))))))))))))))))) + P("o")) + P("h") * (P("i") * (P("r") * (P("t") * (P("een") + P("y_two")))) + P("ree"))) + P("a") * (P("ctive_char_token") + P("lignment_tab_token")) + P("zero") + P("o") * (P("ther_char_token") + P("n") * (P("e") * (P("_") * (P("thousand") + P("hundred"))) + P("e"))) + P("pdftex_is_engine_bool") + P("m") * (P("ath_shift_token") + P("inus_one")) + P("nine") + P("keys_code_root_tl") + P("l") * (P("etter_token") + P("uatex_is_engine_bool")) + P("s") * (P("i") * (P("xteen") + P("x")) + P("even") + P("tring_cctab")) + P("job_name_tl") + P("undefined_fp") + P("xetex_is_engine_bool")) + P("h") * (P("a") * (P("r") * (P("_") * (P("m") * (P("a") * (P("k") * (P("e") * (P("_") * (P("e") * (P("s") * (P("c") * (P("a") * (P("p") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("n") * (P("d") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))) + P("l") * (P("i") * (P("n") * (P("e") * (P(":") * (P("N") + P("n")))))))))) + P("c") * (P("o") * (P("m") * (P("m") * (P("e") * (P("n") * (P("t") * (P(":") * (P("N") + P("n"))))))))) + P("a") * (P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") + P("n"))))))))))))))) + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))) + P("p") * (P("a") * (P("r") * (P("a") * (P("m") * (P("e") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))))))) + P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("u") * (P("p") * (P("e") * (P("r") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n"))))))))))) + P("b") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n")))))))))) + P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") + P("n")))))))))))) + P("l") * (P("e") * (P("t") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n")))))))) + P("i") * (P("g") * (P("n") * (P("o") * (P("r") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("n") * (P("v") * (P("a") * (P("l") * (P("i") * (P("d") * (P(":") * (P("N") + P("n"))))))))) + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P(":") * (P("N") + P("n")))))))))))) + P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("mathcode:w") + P("catcode:w") + P("lccode:w") + P("uccode:w") + P("sfcode:w"))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("mathcode:w") + P("catcode:w") + P("lccode:w") + P("uccode:w") + P("sfcode:w")))) + P("h") * (P("o") * (P("w") * (P("_") * (P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("mathcode:w") + P("catcode:w") + P("lccode:w") + P("uccode:w") + P("sfcode:w"))))))))))))))) + P("k_if_free_cs:N"))) + P("d") * (P("i") * (P("m") * (P("_") * (P("e") * (P("v") * (P("a") * (P("l") * (P("_end:") + P(":w"))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("a") * (P("x") * (P(":") * (P("cn") + P("Nn")))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("case:nnn") + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("a") * (P("x") * (P(":") * (P("cn") + P("Nn")))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))))))))) + P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("r") * (P("e") * (P("s") * (P("i") * (P("z") * (P("e") * (P(":") * (P("cnn") + P("Nnn")))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))))))))))))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("newline:") + P("c") * (P("l") * (P("a") * (P("s") * (P("s") * (P("_") * (P("set:nn") + P("new:nn"))))))) + P("d") * (P("i") * (P("r") * (P("e") * (P("c") * (P("t") * (P("_") * (P("interrupt:xxxxx") + P("term:xx") + P("log:xx")))))))) + P("i") * (P("n") * (P("t") * (P("e") * (P("r") * (P("r") * (P("u") * (P("p") * (P("t") * (P(":") * (P("xxx") + P("nn"))))))))))) + P("t") * (P("e") * (P("r") * (P("m") * (P(":") * (P("n") + P("x"))))) + P("r") * (P("a") * (P("c") * (P("e") * (P(":") * (P("n") * (P("n") * (P("x") * (P("x") * (P("xx") + P("x")) + P("x")) + P("x")) + P("n"))))))) + P("wo_newlines:")) + P("g") * (P("e") * (P("n") * (P("e") * (P("r") * (P("i") * (P("c") * (P("_") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("nn") + P("n")))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("n") * (P("nn") + P("n")))))))))))))) + P("l") * (P("o") * (P("g") * (P(":") * (P("n") + P("x"))))))))) + P("K") * (P("V") * (P("_") * (P("p") * (P("r") * (P("o") * (P("c") * (P("e") * (P("s") * (P("s") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_") * (P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("a") * (P("l") * (P("_") * (P("sanitize:NNn") + P("no_sanitize:NNn"))))))))))))))) + P("no_space_removal_no_sanitize:NNn")))))))))))) + P("l") * (P("_") * (P("iow_line_length_int") + P("t") * (P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c") * (P("_") * (P("int") + P("toks"))))) + P("l_replace_toks")) + P("last_box")) + P("u") * (P("a") * (P("_") * (P("escape_x:n") + P("now_x:n") + P("shipout_x:n")) + P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("TF") + P("F") + P("T"))))))))))) + wildcard * P(":D")))))))) + P("i") * (P("f_num:w") + P("o") * (P("w") * (P("_") * (P("wrap:xnnnN") + P("n") * (P("o") * (P("w") * (P("_") * (P("w") * (P("h") * (P("e") * (P("n") * (P("_") * (P("a") * (P("v") * (P("a") * (P("i") * (P("l") * (P(":") * (P("N") * (P("n") + P("x"))))))))))))) + P("b") * (P("u") * (P("f") * (P("f") * (P("e") * (P("r") * (P("_") * (P("s") * (P("a") * (P("f") * (P("e") * (P(":") * (P("N") * (P("n") + P("x")))))))))))))))))) + P("open_streams:") + P("l") * (P("ist_streams:") + P("og_streams:")))) + P("r") * (P("_") * (P("s") * (P("t") * (P("r") * (P("_") * (P("gto:NN") + P("to:NN"))))) + P("l") * (P("ist_streams:") + P("og_streams:")) + P("to:NN") + P("g") * (P("et_str:NN") + P("to:NN")) + P("open_streams:")))) + P("n") * (P("t") * (P("_") * (P("e") * (P("v") * (P("a") * (P("l") * (P("_end:") + P(":w"))))) + P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("binary:n") + P("octal:n") + P("hexadecimal:n")))))) + P("c") * (P("ase:nnn") + P("o") * (P("n") * (P("v") * (P("e") * (P("r") * (P("t") * (P("_") * (P("to_base_ten:nn") + P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("symbols:nn") + P("base_ten:nn")))))))))))))) + P("t") * (P("o") * (P("_") * (P("symbol:n") + P("binary:n") + P("octal:n") + P("hexadecimal:n")))) + P("value:w"))))) + P("E") * (P("x") * (P("p") * (P("l") * (P("S") * (P("y") * (P("n") * (P("t") * (P("a") * (P("x") * (P("N") * (P("a") * (P("m") * (P("e") * (P("s") * (P("O") * (P("ff") + P("n"))))))))))))))))) + P("g") * (P("_") * (P("t") * (P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c_toks")))) + P("file_current_name_tl")) + P("roup_execute_after:N")) + P("h") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))))))))))))))))))))) * eof
+obsolete.deprecated_csname = (P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("nn") + P("n")))))))))))) + P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n"))))))))))))))) + P("l") * (P("_") * (P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("c") * (P("n") * (P("TF") + P("F") + P("T")) + P("n")) + P("N") * (P("n") * (P("TF") + P("F") + P("T")) + P("n"))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("clear:N") + P("g") * (P("clear:N") + P("et:NN")))))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n"))))))))))))))) + P("c") * (P("s_argument_spec:N") + P("h") * (P("a") * (P("r") * (P("_") * (P("mixed_case:N") + P("f") * (P("o") * (P("l") * (P("d") * (P("_case:N") + P("case:N"))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("mixed_case:N") + P("f") * (P("o") * (P("l") * (P("d") * (P("_case:N") + P("case:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("titlecase:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("t") * (P("itlecase:N") + P("o") * (P("_") * (P("utfviii_bytes:n") + P("nfd:N"))))))))) + P("l") * (P("_") * (P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("key_tl") + P("path_tl")))))) + P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("accents_tl") + P("letterlike_tl")))))))) + P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("c") * (P("n") + P("x")) + P("N") * (P("n") + P("x")))))))))))))))) + P("s") * (P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("inline:Nn") + P("function:NN"))))))))))))) + P("gset_map_x:NNn") + P("set_map_x:NNn")))) + P("ys_load_deprecation:") + P("t") * (P("r") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V")))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("declare_eight_bit_encoding:nnn"))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("v") * (P("nN") + P("N")) + P("n") * (P("nN") + P("N")) + P("o") * (P("nN") + P("N")) + P("V") * (P("nN") + P("N")) + P("n") + P("V") + P("v") + P("o"))))))))))))))))))) + P("p") * (P("e") * (P("e") * (P("k") * (P("_") * (P("c") * (P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N")))))))) + P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N")))))))))) + P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N"))))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("c") * (P("Vn") + P("n") * (P("n") + P("V"))) + P("N") * (P("Vn") + P("n") * (P("n") + P("V"))))))))))))))) + P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("c") * (P("Vn") + P("n") * (P("n") + P("V"))) + P("N") * (P("Vn") + P("n") * (P("n") + P("V")))))))))))))))))) + P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))) + P("new:nn"))))))))))))) * eof
-- luacheck: pop
return obsolete
diff --git a/Master/texmf-dist/scripts/expltools/explcheck-toml.lua b/Master/texmf-dist/scripts/expltools/explcheck-toml.lua
new file mode 100755
index 00000000000..30ebc35ef5c
--- /dev/null
+++ b/Master/texmf-dist/scripts/expltools/explcheck-toml.lua
@@ -0,0 +1,645 @@
+local TOML = {
+ -- denotes the current supported TOML version
+ version = 0.40,
+
+ -- sets whether the parser should follow the TOML spec strictly
+ -- currently, no errors are thrown for the following rules if strictness is turned off:
+ -- tables having mixed keys
+ -- redefining a table
+ -- redefining a key within a table
+ strict = true,
+}
+
+-- converts TOML data into a lua table
+TOML.parse = function(toml, options)
+ options = options or {}
+ local strict = (options.strict ~= nil and options.strict or TOML.strict)
+
+ -- the official TOML definition of whitespace
+ local ws = "[\009\032]"
+
+ -- the official TOML definition of newline
+ local nl = "[\10"
+ do
+ local crlf = "\13\10"
+ nl = nl .. crlf
+ end
+ nl = nl .. "]"
+
+ -- stores text data
+ local buffer = ""
+
+ -- the current location within the string to parse
+ local cursor = 1
+
+ -- the output table
+ local out = {}
+
+ -- the current table to write to
+ local obj = out
+
+ -- returns the next n characters from the current position
+ local function char(n)
+ n = n or 0
+ return toml:sub(cursor + n, cursor + n)
+ end
+
+ -- moves the current position forward n (default: 1) characters
+ local function step(n)
+ n = n or 1
+ cursor = cursor + n
+ end
+
+ -- move forward until the next non-whitespace character
+ local function skipWhitespace()
+ while(char():match(ws)) do
+ step()
+ end
+ end
+
+ -- remove the (Lua) whitespace at the beginning and end of a string
+ local function trim(str)
+ return str:gsub("^%s*(.-)%s*$", "%1")
+ end
+
+ -- divide a string into a table around a delimiter
+ local function split(str, delim)
+ if str == "" then return {} end
+ local result = {}
+ local append = delim
+ if delim:match("%%") then
+ append = delim:gsub("%%", "")
+ end
+ for match in (str .. append):gmatch("(.-)" .. delim) do
+ table.insert(result, match)
+ end
+ return result
+ end
+
+ -- produce a parsing error message
+ -- the error contains the line number of the current position
+ local function err(message, strictOnly)
+ if not strictOnly or (strictOnly and strict) then
+ local line = 1
+ local c = 0
+ for l in toml:gmatch("(.-)" .. nl) do
+ c = c + l:len()
+ if c >= cursor then
+ break
+ end
+ line = line + 1
+ end
+ error("TOML: " .. message .. " on line " .. line .. ".", 4)
+ end
+ end
+
+ -- prevent infinite loops by checking whether the cursor is
+ -- at the end of the document or not
+ local function bounds()
+ return cursor <= toml:len()
+ end
+
+ local function parseString()
+ local quoteType = char() -- should be single or double quote
+
+ -- this is a multiline string if the next 2 characters match
+ local multiline = (char(1) == char(2) and char(1) == char())
+
+ -- buffer to hold the string
+ local str = ""
+
+ -- skip the quotes
+ step(multiline and 3 or 1)
+
+ while(bounds()) do
+ if multiline and char():match(nl) and str == "" then
+ -- skip line break line at the beginning of multiline string
+ step()
+ end
+
+ -- keep going until we encounter the quote character again
+ if char() == quoteType then
+ if multiline then
+ if char(1) == char(2) and char(1) == quoteType then
+ step(3)
+ break
+ end
+ else
+ step()
+ break
+ end
+ end
+
+ if char():match(nl) and not multiline then
+ err("Single-line string cannot contain line break")
+ end
+
+ -- if we're in a double-quoted string, watch for escape characters!
+ if quoteType == '"' and char() == "\\" then
+ if multiline and char(1):match(nl) then
+ -- skip until first non-whitespace character
+ step(1) -- go past the line break
+ while(bounds()) do
+ if not char():match(ws) and not char():match(nl) then
+ break
+ end
+ step()
+ end
+ else
+ -- all available escape characters
+ local escape = {
+ b = "\b",
+ t = "\t",
+ n = "\n",
+ f = "\f",
+ r = "\r",
+ ['"'] = '"',
+ ["\\"] = "\\",
+ }
+ -- utf function from http://stackoverflow.com/a/26071044
+ -- converts \uXXX into actual unicode
+ local function utf(char)
+ local bytemarkers = {{0x7ff, 192}, {0xffff, 224}, {0x1fffff, 240}}
+ if char < 128 then return string.char(char) end
+ local charbytes = {}
+ for bytes, vals in pairs(bytemarkers) do
+ if char <= vals[1] then
+ for b = bytes + 1, 2, -1 do
+ local mod = char % 64
+ char = (char - mod) / 64
+ charbytes[b] = string.char(128 + mod)
+ end
+ charbytes[1] = string.char(vals[2] + char)
+ break
+ end
+ end
+ return table.concat(charbytes)
+ end
+
+ if escape[char(1)] then
+ -- normal escape
+ str = str .. escape[char(1)]
+ step(2) -- go past backslash and the character
+ elseif char(1) == "u" then
+ -- utf-16
+ step()
+ local uni = char(1) .. char(2) .. char(3) .. char(4)
+ step(5)
+ uni = tonumber(uni, 16)
+ if (uni >= 0 and uni <= 0xd7ff) and not (uni >= 0xe000 and uni <= 0x10ffff) then
+ str = str .. utf(uni)
+ else
+ err("Unicode escape is not a Unicode scalar")
+ end
+ elseif char(1) == "U" then
+ -- utf-32
+ step()
+ local uni = char(1) .. char(2) .. char(3) .. char(4) .. char(5) .. char(6) .. char(7) .. char(8)
+ step(9)
+ uni = tonumber(uni, 16)
+ if (uni >= 0 and uni <= 0xd7ff) and not (uni >= 0xe000 and uni <= 0x10ffff) then
+ str = str .. utf(uni)
+ else
+ err("Unicode escape is not a Unicode scalar")
+ end
+ else
+ err("Invalid escape")
+ end
+ end
+ else
+ -- if we're not in a double-quoted string, just append it to our buffer raw and keep going
+ str = str .. char()
+ step()
+ end
+ end
+
+ return {value = str, type = "string"}
+ end
+
+ local function parseNumber()
+ local num = ""
+ local exp
+ local date = false
+ while(bounds()) do
+ if char():match("[%+%-%.eE_0-9]") then
+ if not exp then
+ if char():lower() == "e" then
+ -- as soon as we reach e or E, start appending to exponent buffer instead of
+ -- number buffer
+ exp = ""
+ elseif char() ~= "_" then
+ num = num .. char()
+ end
+ elseif char():match("[%+%-0-9]") then
+ exp = exp .. char()
+ else
+ err("Invalid exponent")
+ end
+ elseif char():match(ws) or char() == "#" or char():match(nl) or char() == "," or char() == "]" or char() == "}" then
+ break
+ elseif char() == "T" or char() == "Z" then
+ -- parse the date (as a string, since lua has no date object)
+ date = true
+ while(bounds()) do
+ if char() == "," or char() == "]" or char() == "#" or char():match(nl) or char():match(ws) then
+ break
+ end
+ num = num .. char()
+ step()
+ end
+ else
+ err("Invalid number")
+ end
+ step()
+ end
+
+ if date then
+ return {value = num, type = "date"}
+ end
+
+ local float = false
+ if num:match("%.") then float = true end
+
+ exp = exp and tonumber(exp) or 0
+ num = tonumber(num)
+
+ if not float then
+ return {
+ -- lua will automatically convert the result
+ -- of a power operation to a float, so we have
+ -- to convert it back to an int with math.floor
+ value = math.floor(num * 10^exp),
+ type = "int",
+ }
+ end
+
+ return {value = num * 10^exp, type = "float"}
+ end
+
+ local parseArray, getValue
+
+ function parseArray()
+ step() -- skip [
+ skipWhitespace()
+
+ local arrayType
+ local array = {}
+
+ while(bounds()) do
+ if char() == "]" then
+ break
+ elseif char():match(nl) then
+ -- skip
+ step()
+ skipWhitespace()
+ elseif char() == "#" then
+ while(bounds() and not char():match(nl)) do
+ step()
+ end
+ else
+ -- get the next object in the array
+ local v = getValue()
+ if not v then break end
+
+ -- set the type if it hasn't been set before
+ if arrayType == nil then
+ arrayType = v.type
+ elseif arrayType ~= v.type then
+ err("Mixed types in array", true)
+ end
+
+ array = array or {}
+ table.insert(array, v.value)
+
+ if char() == "," then
+ step()
+ end
+ skipWhitespace()
+ end
+ end
+ step()
+
+ return {value = array, type = "array"}
+ end
+
+ local function parseInlineTable()
+ step() -- skip opening brace
+
+ local buffer = ""
+ local quoted = false
+ local tbl = {}
+
+ while bounds() do
+ if char() == "}" then
+ break
+ elseif char() == "'" or char() == '"' then
+ buffer = parseString().value
+ quoted = true
+ elseif char() == "=" then
+ if not quoted then
+ buffer = trim(buffer)
+ end
+
+ step() -- skip =
+ skipWhitespace()
+
+ if char():match(nl) then
+ err("Newline in inline table")
+ end
+
+ local v = getValue().value
+ tbl[buffer] = v
+
+ skipWhitespace()
+
+ if char() == "," then
+ step()
+ elseif char():match(nl) then
+ err("Newline in inline table")
+ end
+
+ quoted = false
+ buffer = ""
+ else
+ buffer = buffer .. char()
+ step()
+ end
+ end
+ step() -- skip closing brace
+
+ return {value = tbl, type = "array"}
+ end
+
+ local function parseBoolean()
+ local v
+ if toml:sub(cursor, cursor + 3) == "true" then
+ step(4)
+ v = {value = true, type = "boolean"}
+ elseif toml:sub(cursor, cursor + 4) == "false" then
+ step(5)
+ v = {value = false, type = "boolean"}
+ else
+ err("Invalid primitive")
+ end
+
+ skipWhitespace()
+ if char() == "#" then
+ while(not char():match(nl)) do
+ step()
+ end
+ end
+
+ return v
+ end
+
+ -- figure out the type and get the next value in the document
+ function getValue()
+ if char() == '"' or char() == "'" then
+ return parseString()
+ elseif char():match("[%+%-0-9]") then
+ return parseNumber()
+ elseif char() == "[" then
+ return parseArray()
+ elseif char() == "{" then
+ return parseInlineTable()
+ else
+ return parseBoolean()
+ end
+ -- date regex (for possible future support):
+ -- %d%d%d%d%-[0-1][0-9]%-[0-3][0-9]T[0-2][0-9]%:[0-6][0-9]%:[0-6][0-9][Z%:%+%-%.0-9]*
+ end
+
+ -- track whether the current key was quoted or not
+ local quotedKey = false
+
+ -- parse the document!
+ while(cursor <= toml:len()) do
+
+ -- skip comments and whitespace
+ if char() == "#" then
+ while(not char():match(nl)) do
+ step()
+ end
+ end
+
+ if char():match(nl) then
+ -- skip
+ end
+
+ if char() == "=" then
+ step()
+ skipWhitespace()
+
+ -- trim key name
+ buffer = trim(buffer)
+
+ if buffer:match("^[0-9]*$") and not quotedKey then
+ buffer = tonumber(buffer)
+ end
+
+ if buffer == "" and not quotedKey then
+ err("Empty key name")
+ end
+
+ local v = getValue()
+ if v then
+ -- if the key already exists in the current object, throw an error
+ if obj[buffer] then
+ err('Cannot redefine key "' .. buffer .. '"', true)
+ end
+ obj[buffer] = v.value
+ end
+
+ -- clear the buffer
+ buffer = ""
+ quotedKey = false
+
+ -- skip whitespace and comments
+ skipWhitespace()
+ if char() == "#" then
+ while(bounds() and not char():match(nl)) do
+ step()
+ end
+ end
+
+ -- if there is anything left on this line after parsing a key and its value,
+ -- throw an error
+ if not char():match(nl) and cursor < toml:len() then
+ err("Invalid primitive")
+ end
+ elseif char() == "[" then
+ buffer = ""
+ step()
+ local tableArray = false
+
+ -- if there are two brackets in a row, it's a table array!
+ if char() == "[" then
+ tableArray = true
+ step()
+ end
+
+ obj = out
+
+ local function processKey(isLast)
+ isLast = isLast or false
+ buffer = trim(buffer)
+
+ if not quotedKey and buffer == "" then
+ err("Empty table name")
+ end
+
+ if isLast and obj[buffer] and not tableArray and #obj[buffer] > 0 then
+ err("Cannot redefine table", true)
+ end
+
+ -- set obj to the appropriate table so we can start
+ -- filling it with values!
+ if tableArray then
+ -- push onto cache
+ if obj[buffer] then
+ obj = obj[buffer]
+ if isLast then
+ table.insert(obj, {})
+ end
+ obj = obj[#obj]
+ else
+ obj[buffer] = {}
+ obj = obj[buffer]
+ if isLast then
+ table.insert(obj, {})
+ obj = obj[1]
+ end
+ end
+ else
+ obj[buffer] = obj[buffer] or {}
+ obj = obj[buffer]
+ end
+ end
+
+ while(bounds()) do
+ if char() == "]" then
+ if tableArray then
+ if char(1) ~= "]" then
+ err("Mismatching brackets")
+ else
+ step() -- skip inside bracket
+ end
+ end
+ step() -- skip outside bracket
+
+ processKey(true)
+ buffer = ""
+ break
+ elseif char() == '"' or char() == "'" then
+ buffer = parseString().value
+ quotedKey = true
+ elseif char() == "." then
+ step() -- skip period
+ processKey()
+ buffer = ""
+ else
+ buffer = buffer .. char()
+ step()
+ end
+ end
+
+ buffer = ""
+ quotedKey = false
+ elseif (char() == '"' or char() == "'") then
+ -- quoted key
+ buffer = parseString().value
+ quotedKey = true
+ end
+
+ buffer = buffer .. (char():match(nl) and "" or char())
+ step()
+ end
+
+ return out
+end
+
+TOML.encode = function(tbl)
+ local toml = ""
+
+ local cache = {}
+
+ local function parse(tbl)
+ for k, v in pairs(tbl) do
+ if type(v) == "boolean" then
+ toml = toml .. k .. " = " .. tostring(v) .. "\n"
+ elseif type(v) == "number" then
+ toml = toml .. k .. " = " .. tostring(v) .. "\n"
+ elseif type(v) == "string" then
+ local quote = '"'
+ v = v:gsub("\\", "\\\\")
+
+ -- if the string has any line breaks, make it multiline
+ if v:match("^\n(.*)$") then
+ quote = quote:rep(3)
+ v = "\\n" .. v
+ elseif v:match("\n") then
+ quote = quote:rep(3)
+ end
+
+ v = v:gsub("\b", "\\b")
+ v = v:gsub("\t", "\\t")
+ v = v:gsub("\f", "\\f")
+ v = v:gsub("\r", "\\r")
+ v = v:gsub('"', '\\"')
+ v = v:gsub("/", "\\/")
+ toml = toml .. k .. " = " .. quote .. v .. quote .. "\n"
+ elseif type(v) == "table" then
+ local array, arrayTable = true, true
+ local first = {}
+ for kk, vv in pairs(v) do
+ if type(kk) ~= "number" then array = false end
+ if type(vv) ~= "table" then
+ v[kk] = nil
+ first[kk] = vv
+ arrayTable = false
+ end
+ end
+
+ if array then
+ if arrayTable then
+ -- double bracket syntax go!
+ table.insert(cache, k)
+ for kk, vv in pairs(v) do
+ toml = toml .. "[[" .. table.concat(cache, ".") .. "]]\n"
+ for k3, v3 in pairs(vv) do
+ if type(v3) ~= "table" then
+ vv[k3] = nil
+ first[k3] = v3
+ end
+ end
+ parse(first)
+ parse(vv)
+ end
+ table.remove(cache)
+ else
+ -- plain ol boring array
+ toml = toml .. k .. " = [\n"
+ for kk, vv in pairs(first) do
+ toml = toml .. tostring(vv) .. ",\n"
+ end
+ toml = toml .. "]\n"
+ end
+ else
+ -- just a key/value table, folks
+ table.insert(cache, k)
+ toml = toml .. "[" .. table.concat(cache, ".") .. "]\n"
+ parse(first)
+ parse(v)
+ table.remove(cache)
+ end
+ end
+ end
+ end
+
+ parse(tbl)
+
+ return toml:sub(1, -2)
+end
+
+return TOML
+