diff --git a/.travis.yml b/.travis.yml index a905db1..baca8aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,6 @@ - TL_MAKE_FLAGS="-j 2" # disable direct build, we don't need to build x86=64-linux two times -# # - os: linux # addons: # apt: @@ -86,17 +85,17 @@ -v ${TRAVIS_BUILD_DIR}:/texlive -w /texlive \ -it --rm i386/debian:jessie sh -c \ "apt-get update; apt-get install -y --no-install-recommends bash gcc g++ make perl libfontconfig-dev libx11-dev libxmu-dev libxaw7-dev build-essential ; ./Build -C" -# - os: linux -# services: docker -# env: -# - tldir=x86_64-linuxmusl -# - package=texlive-bin-x86_64-musl.tar.gz -# script: | -# docker run \ -# -e TL_MAKE_FLAGS="${TL_MAKE_FLAGS}" \ -# -v ${TRAVIS_BUILD_DIR}:/texlive -w /texlive \ -# -it --rm alpine:3.2 sh -c \ -# "apk update; apk add --no-progress bash gcc g++ make perl fontconfig-dev libx11-dev libxmu-dev libxaw-dev; ./Build -C" + - os: linux + services: docker + env: + - tldir=x86_64-linuxmusl + - package=texlive-bin-x86_64-musl.tar.gz + script: | + docker run \ + -e TL_MAKE_FLAGS="${TL_MAKE_FLAGS}" \ + -v ${TRAVIS_BUILD_DIR}:/texlive -w /texlive \ + -it --rm alpine:3.2 sh -c \ + "apk update; apk add --no-progress bash gcc g++ make perl fontconfig-dev libx11-dev libxmu-dev libxaw-dev; ./Build -C" # - os: osx # osx_image: xcode7.3 # env: @@ -105,9 +104,9 @@ # before_script: # script: ./Build -C -# somehow all binaries are always put into x86_64-pc-linux-gnu, probably because -# this is the architecture travis-ci is running on. -# Rename to the currently built architecture +# somehow all binaries are always put into x86_64-pc-linux-gnu, probably +# because this is the architecture travis-ci is running on. +# Rename to the currently built architecture. before_deploy: - if [ -n "$package" ]; then sudo mv inst/bin/* inst/bin/$tldir ; tar czvf ${package} -C inst/bin .; fi - if [ -r inst/bin/*/luahbtex ] ; then cp inst/bin/*/luahbtex luahbtex.$tldir ; fi diff --git a/ChangeLog b/ChangeLog index 38df40c..0e93d0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2020-03-06 Karl Berry + + * .travis.yml: attempt to reenable musl build on github. + 2020-01-31 Karl Berry * Makefile.am (texlinks_dir): now texk/texlive/tl_support diff --git a/README b/README index 6efe9fd..c5f5704 100644 --- a/README +++ b/README @@ -39,11 +39,16 @@ CFLAGS=-D_NETBSD_SOURCE \ CXXFLAGS='-D_NETBSD_SOURCE -std=c++11' \ LDFLAGS='-L/usr/X11R7/lib -Wl,-rpath,/usr/X11R7/lib' \ - ./Build --enable-xindy CLISP=/usr/local/bin/clisp --disable-dvisvgm + ./Build --enable-xindy CLISP=/usr/local/bin/clisp + Except that we take Nelson's asy build. i386-freebsd, amd64-freebsd: http://anthesphoria.net/FreeBSD/TeXLive-2018/ has details for 2018. - 2019 built on contextgarden, see below. + 2019 and forward built on contextgarden (see below). + In 2020: FreeBSD 12.1-RELEASE-p1 + (e.g., +https://build.contextgarden.net/#/builders/56/builds/141/steps/2/logs/build _info + ) Except that we take Nelson's asy build. i386-linux: see travis below. diff --git a/configure b/configure index b968022..6999967 100755 --- a/configure +++ b/configure @@ -4157,7 +4157,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajittex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajittex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajittex'" ;; #( @@ -4170,7 +4170,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajithbtex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajithbtex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajithbtex'" ;; #( @@ -4183,7 +4183,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit'" ;; #( @@ -4196,7 +4196,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit-nowin'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit-nowin'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit-nowin'" ;; #( diff --git a/libs/configure b/libs/configure index 2d94327..4f499d8 100755 --- a/libs/configure +++ b/libs/configure @@ -3337,7 +3337,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajittex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajittex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajittex'" ;; #( @@ -3350,7 +3350,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajithbtex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajithbtex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajithbtex'" ;; #( @@ -3363,7 +3363,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit'" ;; #( @@ -3376,7 +3376,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit-nowin'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit-nowin'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit-nowin'" ;; #( diff --git a/libs/lua53/configure b/libs/lua53/configure index eaddad0..75bf53a 100755 --- a/libs/lua53/configure +++ b/libs/lua53/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for lua53 (TeX Live) 5.3.4. +# Generated by GNU Autoconf 2.69 for lua53 (TeX Live) 5.3.5. # # Report bugs to . # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='lua53 (TeX Live)' PACKAGE_TARNAME='lua53--tex-live-' -PACKAGE_VERSION='5.3.4' -PACKAGE_STRING='lua53 (TeX Live) 5.3.4' +PACKAGE_VERSION='5.3.5' +PACKAGE_STRING='lua53 (TeX Live) 5.3.5' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1327,7 +1327,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures lua53 (TeX Live) 5.3.4 to adapt to many kinds of systems. +\`configure' configures lua53 (TeX Live) 5.3.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1398,7 +1398,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of lua53 (TeX Live) 5.3.4:";; + short | recursive ) echo "Configuration of lua53 (TeX Live) 5.3.5:";; esac cat <<\_ACEOF @@ -1515,7 +1515,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -lua53 (TeX Live) configure 5.3.4 +lua53 (TeX Live) configure 5.3.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1976,7 +1976,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by lua53 (TeX Live) $as_me 5.3.4, which was +It was created by lua53 (TeX Live) $as_me 5.3.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3900,7 +3900,7 @@ # Define the identity of the package. PACKAGE='lua53--tex-live-' - VERSION='5.3.4' + VERSION='5.3.5' cat >>confdefs.h <<_ACEOF @@ -5108,10 +5108,10 @@ fi -LUA53VERSION=5.3.4 - - -LUA53_LT_VERSINFO=8:4:3 +LUA53VERSION=5.3.5 + + +LUA53_LT_VERSINFO=8:5:3 case `pwd` in @@ -14545,7 +14545,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by lua53 (TeX Live) $as_me 5.3.4, which was +This file was extended by lua53 (TeX Live) $as_me 5.3.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -14611,7 +14611,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -lua53 (TeX Live) config.status 5.3.4 +lua53 (TeX Live) config.status 5.3.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/libs/lua53/version.ac b/libs/lua53/version.ac index 2292805..28471aa 100644 --- a/libs/lua53/version.ac +++ b/libs/lua53/version.ac @@ -8,4 +8,4 @@ dnl -------------------------------------------------------- dnl dnl m4-include this file to define the current lua53 version -m4_define([lua53_version], [5.3.4]) +m4_define([lua53_version], [5.3.5]) diff --git a/m4/ChangeLog b/m4/ChangeLog index 6ac07da..33f5ac0 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,13 @@ +2020-03-12 Karl Berry + + * kpse-setup.m4 (KPSE_SETUP): disable jit programs on any + powerpc-*, not just powerpc-darwin, since jit is also unavailable + on powerpc-linux (specifically powerpc64le-unknown-linux-gnu), + per Johannes Hielscher. Although apparently there are patches to + "floating around" to make jit work on powerpc, they are not in TL, + and let's await anyone who actually needs them before refining. + https://tug.org/pipermail/tlbuild/2020q1/004627.html (item 1). + 2020-01-13 Karl Berry * kpse-setup.m4 (KPSE_SETUP): use AS_TR_SH on the argument when diff --git a/m4/kpse-setup.m4 b/m4/kpse-setup.m4 index 8530200..77d1610 100644 --- a/m4/kpse-setup.m4 +++ b/m4/kpse-setup.m4 @@ -88,7 +88,7 @@ AS_CASE([$enable_[]AS_TR_SH([Kpse_Pkg])], [yes | no], [:], [AS_CASE([$host], - [alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ], + [alpha* | sparc* | x86_64-*-solaris* | powerpc-* ], [AC_MSG_NOTICE([$host -> `--disable-]Kpse_Pkg[']) ac_configure_args="$ac_configure_args '--disable-]Kpse_Pkg['"])]) ]) diff --git a/texk/configure b/texk/configure index 6e36da6..af72dbe 100755 --- a/texk/configure +++ b/texk/configure @@ -3337,7 +3337,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajittex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajittex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajittex'" ;; #( @@ -3350,7 +3350,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajithbtex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajithbtex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajithbtex'" ;; #( @@ -3363,7 +3363,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit'" ;; #( @@ -3376,7 +3376,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit-nowin'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit-nowin'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit-nowin'" ;; #( diff --git a/texk/tests/TeXLive/TLConfig.pm b/texk/tests/TeXLive/TLConfig.pm index 86552e6..ae5806c 100644 --- a/texk/tests/TeXLive/TLConfig.pm +++ b/texk/tests/TeXLive/TLConfig.pm @@ -1,11 +1,11 @@ # TeXLive::TLConfig.pm - module exporting configuration values -# Copyright 2007-2019 Norbert Preining +# Copyright 2007-2020 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. package TeXLive::TLConfig; -my $svnrev = '$Revision: 53076 $'; +my $svnrev = '$Revision: 54123 $'; my $_modulerevision = ($svnrev =~ m/: ([0-9]+) /) ? $1 : "unknown"; sub module_revision { return $_modulerevision; } @@ -45,6 +45,8 @@ %TLPDBSettings %TLPDBConfigs $NetworkTimeout + $MaxLWPErrors + $MaxLWPReinitCount $PartialEngineSupport $F_OK $F_WARNING $F_ERROR $F_NOPOSTACTION $ChecksumLength @@ -56,11 +58,11 @@ # the year of our release, will be used in the location of the # network packages, and in menu names, and other places. -$ReleaseYear = 2019; +$ReleaseYear = 2020; # users can upgrade from this year to the current year; might be the # same as the release year, or any number of releases earlier. -# Generally not tested. +# Generally not tested, but should be. $MinRelease = 2016; # Meta Categories do not ship files, but only call for other packages. @@ -92,6 +94,10 @@ # timeout for network connections (wget, LWP) in seconds our $NetworkTimeout = 30; +# number of errors during an LWP session until it is marked as disabled +our $MaxLWPErrors = 5; +# max number of times we reenable LWP after it was disabled +our $MaxLWPReinitCount = 10; our $Archive = "archive"; our $TeXLiveServerURL = "http://mirror.ctan.org"; @@ -189,7 +195,7 @@ "Directory for backups" ], "create_formats" => [ "b", 1, "formats", - "Create formats on installation" ], + "Generate formats at installation or update" ], "desktop_integration" => [ "b", 1, "desktop_integration", "Create Start menu shortcuts (w32)" ], @@ -235,7 +241,7 @@ our $WindowsMainMenuName = "TeX Live $ReleaseYear"; # Comma-separated list of engines which do not exist on all platforms. -our $PartialEngineSupport = "luahbtex,luajittex,mfluajit"; +our $PartialEngineSupport = "luajithbtex,luajittex,mfluajit"; # Flags for error handling across the scripts and modules # all fine diff --git a/texk/tests/TeXLive/TLUtils.pm b/texk/tests/TeXLive/TLUtils.pm index 61ed174..086f5da 100644 --- a/texk/tests/TeXLive/TLUtils.pm +++ b/texk/tests/TeXLive/TLUtils.pm @@ -5,7 +5,7 @@ package TeXLive::TLUtils; -my $svnrev = '$Revision: 53343 $'; +my $svnrev = '$Revision: 54143 $'; my $_modulerevision = ($svnrev =~ m/: ([0-9]+) /) ? $1 : "unknown"; sub module_revision { return $_modulerevision; } @@ -273,16 +273,16 @@ =item C -Convert a canonical host names as returned by C into -TeX Live platform names. +Convert ORIG_PLATFORM, a canonical host name as returned by +C, into a TeX Live platform name. CPU type is determined by a regexp, and any C name is replaced by C. -For OS we need a list because what's returned is not likely to match our -historical names, e.g., C returns C but we need -C. This list might/should contain OSs which are not currently -supported. +For the OS value we need a list because what's returned is not likely to +match our historical names, e.g., C returns C +but we need C. This list contains old OSs which are not currently +supported, just in case. If a particular platform is not found in this list we use the regexp C as a last resort and hope it provides something useful. @@ -290,12 +290,15 @@ =cut sub platform_name { - my ($guessed_platform) = @_; - + my ($orig_platform) = @_; + my $guessed_platform = $orig_platform; + + # try to parse out some bsd variants that use amd64. $guessed_platform =~ s/^x86_64-(.*-k?)(free|net)bsd/amd64-$1$2bsd/; my $CPU; # CPU type as reported by config.guess. my $OS; # O/S type as reported by config.guess. ($CPU = $guessed_platform) =~ s/(.*?)-.*/$1/; + $CPU =~ s/^alpha(.*)/alpha/; # alphaev whatever $CPU =~ s/mips64el/mipsel/; # don't distinguish mips64 and 32 el $CPU =~ s/powerpc64/powerpc/; # don't distinguish ppc64 @@ -307,7 +310,7 @@ $CPU = $guessed_platform =~ /hf$/ ? "armhf" : "armel"; } - my @OSs = qw(aix cygwin darwin freebsd hpux irix + my @OSs = qw(aix cygwin darwin dragonfly freebsd hpux irix kfreebsd linux netbsd openbsd solaris); for my $os (@OSs) { # Match word boundary at the beginning of the os name so that @@ -316,7 +319,12 @@ # solaris2 is matched. $OS = $os if $guessed_platform =~ /\b$os/; } - + + if (! $OS) { + warn "$0: could not guess OS from config.guess string: $orig_platform"; + $OS = "unknownOS"; + } + if ($OS eq "linux") { # deal with the special case of musl based distributions # config.guess returns @@ -336,7 +344,7 @@ # We don't use uname numbers here.) # # this changes each year, per above: - my $mactex_darwin = 12; # lowest minor rev supported by x86_64-darwin. + my $mactex_darwin = 13; # lowest minor rev supported by x86_64-darwin. # # Most robust approach is apparently to check sw_vers (os version, # returns "10.x" values), and sysctl (processor hardware). @@ -345,7 +353,7 @@ if ($os_major != 10) { warn "$0: only MacOSX is supported, not $OS $os_major.$os_minor " . " (from sw_vers -productVersion: $sw_vers)\n"; - return "unknown-unknown"; + return "unknownmac-unknownmac"; } if ($os_minor >= $mactex_darwin) { ; # current version, default is ok (x86_64-darwin). @@ -412,8 +420,9 @@ 'universal-darwin' => 'MacOSX universal binaries', 'win32' => 'Windows', 'x86_64-cygwin' => 'Cygwin on x86_64', - 'x86_64-darwin' => 'MacOSX current (10.12-) on x86_64', + 'x86_64-darwin' => 'MacOSX current (10.13-) on x86_64', 'x86_64-darwinlegacy' => 'MacOSX legacy (10.6-) on x86_64', + 'x86_64-dragonfly' => 'DragonFlyBSD on x86_64', 'x86_64-linux' => 'GNU/Linux on x86_64', 'x86_64-linuxmusl' => 'GNU/Linux on x86_64 with musl', 'x86_64-solaris' => 'Solaris on x86_64', @@ -2789,30 +2798,41 @@ } } + sub _download_file_lwp { my ($url, $dest) = @_; - if (defined($::tldownload_server) && $::tldownload_server->enabled) { - debug("persistent connection set up, trying to get $url (for $dest)\n"); - my $ret = $::tldownload_server->get_file($url, $dest); - if ($ret) { - ddebug("downloading file via persistent connection succeeded\n"); - return $ret; - } else { - debug("TLUtils::download_file: persistent connection ok," - . " but download failed: $url\n"); - debug("TLUtils::download_file: retrying with wget.\n"); - } + if (!defined($::tldownload_server)) { + ddebug("::tldownload_server not defined\n"); + return(0); + } + if (!$::tldownload_server->enabled) { + # try to reinitialize a disabled connection + # disabling happens after 6 failed download trials + # we just re-initialize the connection + if (!setup_persistent_downloads()) { + # setup failed, give up + debug("reinitialization of LWP download failed\n"); + return(0); + } + # we don't need to check for ->enabled, because + # setup_persistent_downloads calls TLDownload->new() + # which, if it succeeds, automatically set enabled to 1 + } + # we are still here, so try to download + debug("persistent connection set up, trying to get $url (for $dest)\n"); + my $ret = $::tldownload_server->get_file($url, $dest); + if ($ret) { + ddebug("downloading file via persistent connection succeeded\n"); + return $ret; } else { - if (!defined($::tldownload_server)) { - ddebug("::tldownload_server not defined\n"); - } else { - ddebug("::tldownload_server->enabled is not set\n"); - } - debug("persistent connection not set up\n"); + debug("TLUtils::download_file: persistent connection ok," + . " but download failed: $url\n"); + debug("TLUtils::download_file: retrying with other downloaders.\n"); } # if we are still here, download with LWP didn't succeed. return(0); } + sub _download_file_program { my ($url, $dest, $type) = @_; @@ -3418,9 +3438,11 @@ If the log file (see L) is defined, it also writes there. -This third level debugging message reports messages about processing -each line of any tlpdb files read, in addition to the first and second -levels. +In addition to the first and second levels, this third level debugging +message reports messages about processing each line of any tlpdb files +read, and messages about files tested or matched against tlpsrc +patterns. This output is extremely voluminous, so unless you're +debugging those parts of the code, it just gets in the way. =cut @@ -3839,7 +3861,16 @@ sub setup_persistent_downloads { if ($TeXLive::TLDownload::net_lib_avail) { ddebug("setup_persistent_downloads has net_lib_avail set\n"); - $::tldownload_server = TeXLive::TLDownload->new; + if ($::tldownload_server) { + if ($::tldownload_server->initcount() > $TeXLive::TLConfig::MaxLWPReinitCount) { + debug("stop retrying to initialize LWP after 10 failures\n"); + return 0; + } else { + $::tldownload_server->reinit(); + } + } else { + $::tldownload_server = TeXLive::TLDownload->new; + } if (!defined($::tldownload_server)) { ddebug("TLUtils:setup_persistent_downloads: failed to get ::tldownload_server\n"); } else { diff --git a/texk/texlive/linked_scripts/cjk-gs-integrate/cjk-gs-integrate.pl b/texk/texlive/linked_scripts/cjk-gs-integrate/cjk-gs-integrate.pl index 2dbfdd4..270600e 100755 --- a/texk/texlive/linked_scripts/cjk-gs-integrate/cjk-gs-integrate.pl +++ b/texk/texlive/linked_scripts/cjk-gs-integrate/cjk-gs-integrate.pl @@ -39,7 +39,7 @@ use strict; (my $prg = basename($0)) =~ s/\.pl$//; -my $version = '20200115.0'; +my $version = '20200307.0'; if (win32()) { # conversion between internal (utf-8) and console (cp932): @@ -574,6 +574,7 @@ } print_info(($opt_remove ? "removing" : "generating") . " snippets and cidfmap.aliases for font aliases ...\n"); do_aliases(); + do_cmaps(); write_akotfps_datafile() if $opt_akotfps; if ($opt_texmflink && !$dry_run) { print_info("running mktexlsr ...\n"); @@ -727,7 +728,7 @@ # $outp .= "\n\n% Aliases\n"; # - my (@jal, @kal, @tal, @sal); + my (@jal, @kal, @tal, @sal, @ai0al); # for my $al (sort keys %aliases) { my $target; @@ -766,6 +767,8 @@ push @sal, "/$al /$target ;"; } elsif ($class eq 'CNS') { push @tal, "/$al /$target ;"; + } elsif ($class eq 'AI0') { + push @ai0al, "/$al /$target ;"; } else { print STDERR "unknown class $class for $al\n"; } @@ -779,6 +782,7 @@ $outp .= "\n% Korean fonts\n" . join("\n", @kal) . "\n" if @kal; $outp .= "\n% Traditional Chinese fonts\n" . join("\n", @tal) . "\n" if @tal; $outp .= "\n% Simplified Chinese fonts\n" . join("\n", @sal) . "\n" if @sal; + $outp .= "\n% Adobe-Identity-0 fonts\n" . join("\n", @ai0al) . "\n" if @ai0al; # return if $dry_run; if ($outp && !$opt_remove) { @@ -796,6 +800,67 @@ if (-f "$opt_output/$cidfmap_aliases_pathpart") { unlink "$opt_output/$cidfmap_aliases_pathpart" if $opt_cleanup; } +} + +sub do_cmaps { + # add symlinking CMaps + # for which we generate snippets but gs does not provide + my $cmapdest = "$opt_output/CMap"; + return if $dry_run; + if ($opt_remove) { + # we remove only if both of the following conditions are met: + # (1) it is a link + # (2) the link target is the same as kpsewhich result + # otherwise it's unsafe to remove, as it may have been added + # by others or distributed by gs itself + for my $class (%encode_list) { + for my $enc (@{$encode_list{$class}}) { + if (-l "$cmapdest/$enc") { + my $linkt = readlink("$cmapdest/$enc"); + if ($linkt) { + if ($linkt eq search_cmap($enc)) { + unlink("$cmapdest/$enc"); + } + } + } + } + } + return; + } + # add mode + if (! -d "$cmapdest") { + print_debug("Creating directory $cmapdest ...\n"); + make_dir("$cmapdest", "cannot create CMap directory"); + } + for my $class (%encode_list) { + if ($class =~ m/^AI0-(.*)$/) { + # skip AI0 font-specific CMap when the real font is unavailable + next if (!$fontdb{$1}{'available'}); + } + for my $enc (@{$encode_list{$class}}) { + if (! -f "$cmapdest/$enc") { + print_debug("CMap $enc is not found in gs resource directory\n"); + my $dest = search_cmap($enc); + if ($dest) { + print_debug("Symlinking CMap $dest ...\n"); + link_font($dest, "$cmapdest", $enc); + } else { + print_debug("CMap $enc is not found by kpsewhich\n"); + } + } + } + } +} + +my %cmap_cache; + +sub search_cmap { + my ($cmap) = @_; + # search CMap with kpsewhich and cache + if (! exists $cmap_cache{$cmap}) { + chomp($cmap_cache{$cmap} = `kpsewhich -format=cmap $cmap`); + } + return $cmap_cache{$cmap}; } sub update_master_cidfmap { @@ -899,6 +964,9 @@ $s .= "1) 5]"; } elsif ($c eq "Korea") { $s .= "1) 2]"; + } elsif ($c eq "AI0") { + print_warning("cannot use class AI0 for non-OTF $n, skipping.\n"); + return ''; } else { print_warning("unknown class $c for $n, skipping.\n"); return ''; @@ -913,6 +981,9 @@ if ($opt_akotfps) { add_akotfps_data($n); return; + } + if ($c eq "AI0") { + $c = "AI0-$n"; } for my $enc (@{$encode_list{$c}}) { if ($opt_remove) { @@ -1205,7 +1276,7 @@ # dump aliases sub info_list_aliases { print "List of ", ($opt_listallaliases ? "all" : "available"), " aliases and their options (in decreasing priority):\n" unless $opt_machine; - my (@jal, @kal, @tal, @sal); + my (@jal, @kal, @tal, @sal, @ai0al); for my $al (sort keys %aliases) { my $cl; my @ks = sort { $a <=> $b} keys(%{$aliases{$al}}); @@ -1237,6 +1308,8 @@ push @sal, $foo; } elsif ($cl eq 'CNS') { push @tal, $foo; + } elsif ($cl eq 'AI0') { + push @ai0al, $foo; } else { print STDERR "unknown class $cl for $al\n"; } @@ -1246,11 +1319,13 @@ print @kal if @kal; print @sal if @sal; print @tal if @tal; + print @ai0al if @ai0al; } else { print "Aliases for Japanese fonts:\n", @jal, "\n" if @jal; print "Aliases for Korean fonts:\n", @kal, "\n" if @kal; print "Aliases for Simplified Chinese fonts:\n", @sal, "\n" if @sal; print "Aliases for Traditional Chinese fonts:\n", @tal, "\n" if @tal; + print "Aliases for Adobe-Identity-0 fonts:\n", @ai0al, "\n" if @ai0al; } } @@ -1429,11 +1504,13 @@ my $actualpsname; my $bname; for my $b (sort keys %{$bntofn{$realfile}}) { - $fontdb{$k}{'doublecheck'} = "debug" if $opt_strictpsname; - if ($fontdb{$k}{'doublecheck'} && $zrlistttc_available) { + if ($opt_strictpsname && !$fontdb{$k}{'doublecheck'}) { + $fontdb{$k}{'doublecheck'} = "debug"; # stub + } + if ($fontdb{$k}{'doublecheck'} && $fontdb{$k}{'doublecheck'} ne "false" && $zrlistttc_available) { print_debug("We need to test whether\n"); - print_debug(" $b\n"); - print_debug("is the correct one. Invoking zrlistttc ...\n"); + print_debug(" $b:$index\n"); + print_debug("is the correct one ($k). Invoking zrlistttc ...\n"); chomp($actualpsname = `texlua $zrlistttc -i $index "$b"`); if ($?) { # something is wrong with the font file, or zrlistttc does not support it; @@ -1448,7 +1525,12 @@ if ($actualpsname ne $k) { print_debug("... PSName returned by zrlistttc ($actualpsname) is\n"); print_debug("different from our database ($k), discarding!\n"); - print_warning("zrlistttc check failed for $b\n") if $opt_strictpsname; + if ($opt_strictpsname && $fontdb{$k}{'doublecheck'} eq "debug") { + # in our database, we've set $fontdb{$k}{'doublecheck'} to "true" intentionally + # when we *know* doublecheck is actually required; + # if the stub "debug" detects a difference, our database should contain a bug! + print_warning("zrlistttc check failed for $b: please report to the author!\n"); + } } else { print_debug("... test passed.\n"); $bname = $b; @@ -1633,6 +1715,7 @@ my (@curdbl) = @_; my $fontname = ""; my $fontclass = ""; + my @fontcmaps = (); my %fontprovides = (); my $fontdoublecheck = ""; my %fontfiles; @@ -1658,12 +1741,18 @@ $fontdb{$realfontname}{'doublecheck'} = $fontdoublecheck; $fontdb{$realfontname}{'files'} = { %fontfiles }; $fontdb{$realfontname}{'provides'} = { %fontprovides }; + if ($fontclass eq "AI0") { + $encode_list{"AI0-$realfontname"} = [ @fontcmaps ]; + } elsif (@fontcmaps) { + print_warning("CMap entry for $realfontname (Class: $fontclass) ignored!\n"); + } if ($opt_debug >= 3) { print_dddebug("Dumping fontfiles for $realfontname: " . Data::Dumper::Dumper(\%fontfiles)); } # reset to start $fontname = $fontclass = $psname = ""; $fontdoublecheck = ""; + @fontcmaps = (); %fontfiles = (); %fontprovides = (); } else { @@ -1671,6 +1760,7 @@ # reset to start $fontname = $fontclass = $psname = ""; $fontdoublecheck = ""; + @fontcmaps = (); %fontfiles = (); %fontprovides = (); } @@ -1709,6 +1799,7 @@ if ($l =~ m/^Name:\s*(.*)$/) { $fontname = $1; next; } if ($l =~ m/^PSName:\s*(.*)$/) { $psname = $1; next; } if ($l =~ m/^Class:\s*(.*)$/) { $fontclass = $1 ; next ; } + if ($l =~ m/^CMap:\s*(.*)$/) { push(@fontcmaps, $1); next ; } if ($l =~ m/^Provides\((\d+)\):\s*(.*)$/) { $fontprovides{$2} = $1; next; } if ($l =~ m/^Doublecheck:\s*(.*)$/) { $fontdoublecheck = $1 ; next ; } if ($l =~ m/^Casefold:\s*(.*)$/) { $fontdoublecheck = $1 ; next ; } # no longer used @@ -1820,7 +1911,13 @@ for my $k (sort keys %fontdb) { print FOO "Name: $fontdb{$k}{'origname'}\n"; print FOO "PSName: $k\n" if ($fontdb{$k}{'origname'} ne $k); - print FOO "Class: $fontdb{$k}{'class'}\n"; + my $class = $fontdb{$k}{'class'}; + print FOO "Class: $class\n"; + if ($class eq "AI0") { + for my $cmap (@{$encode_list{"AI0-$k"}}) { + print FOO "CMap: $cmap\n"; + } + } for my $p (sort keys %{$fontdb{$k}{'provides'}}) { print FOO "Provides($fontdb{$k}{'provides'}{$p}): $p\n"; } @@ -2148,6 +2245,7 @@ For the Japanese fonts: Morisawa Pr6N, Morisawa, Hiragino ProN, Hiragino, Kozuka Pr6N, Kozuka ProVI, Kozuka Pro, Kozuka Std, + HaranoAji, Yu OS X, Yu Win, MS, Moga-Mobo-ex, Moga-Mobo, IPAex, IPA, Ume @@ -2328,7 +2426,7 @@ # Sazanami (free) INCLUDE cjkgs-sazanami.dat -# Harano Aji Fonts (free) +# Harano Aji Fonts (free) -- Provides J70, J71 INCLUDE cjkgs-haranoaji.dat # Osaka (Apple) @@ -2536,8 +2634,18 @@ Class: Korea TTCname(20): batang.ttc(3) +# for Windows 10 +# and Office for Mac 2016 (at least Ver.16.11.0, 2018-03) +Name: MalgunGothic +Class: Korea +Doublecheck: true +TTFname: malgun.ttf + +# for Windows 7 +# and Office for Mac 2016 (Ver.15.32.0, 2017-03) Name: MalgunGothicRegular Class: Korea +Doublecheck: true TTFname: malgun.ttf Name: MalgunGothicBold diff --git a/texk/texlive/linked_scripts/l3build/l3build.lua b/texk/texlive/linked_scripts/l3build/l3build.lua index ccb05ee..60b6ac5 100644 --- a/texk/texlive/linked_scripts/l3build/l3build.lua +++ b/texk/texlive/linked_scripts/l3build/l3build.lua @@ -25,7 +25,7 @@ --]] -- Version information -release_date = "2020-02-21" +release_date = "2020-03-12" -- File operations are aided by the LuaFileSystem module local lfs = require("lfs") diff --git a/texk/texlive/linked_scripts/ptex2pdf/ptex2pdf.lua b/texk/texlive/linked_scripts/ptex2pdf/ptex2pdf.lua index 4f60143..d2668d6 100755 --- a/texk/texlive/linked_scripts/ptex2pdf/ptex2pdf.lua +++ b/texk/texlive/linked_scripts/ptex2pdf/ptex2pdf.lua @@ -1,7 +1,7 @@ #!/usr/bin/env texlua NAME = "ptex2pdf[.lua]" -VERSION = "20200119.0" +VERSION = "20200307.0" AUTHOR = "Norbert Preining" AUTHOREMAIL = "norbert@preining.info" SHORTDESC = "Convert Japanese TeX documents to pdf" @@ -14,24 +14,25 @@ ]] USAGE = [[ [texlua] ptex2pdf[.lua] { option | basename[.tex] } ... -options: -v version - -h help - -help print full help (installation, TeXworks setup) - -e use eptex class of programs - -u use uptex class of programs - -l use latex based formats - -s stop at dvi - -i retain intermediate files - -ot '' extra options for TeX - -od '' extra options for dvipdfmx - -output-directory '' directory for created files]] +options: -v version + -h help + -help print full help (installation, TeXworks setup) + -e use eptex class of programs + -u use uptex class of programs + -l use latex based formats + -ld use latex-dev based formats + -s stop at dvi + -i retain intermediate files + -ot '' extra options for TeX + -od '' extra options for dvipdfmx + -output-directory '' directory for created files]] LICENSECOPYRIGHT = [[ Originally based on musixtex.lua from Bob Tennent. -(c) Copyright 2016-2020 Japanese TeX Development Community -(c) Copyright 2013-2020 Norbert Preining norbert@preining.info -(c) Copyright 2012 Bob Tennent rdt@cs.queensu.ca +(c) Copyright 2016-2020 Japanese TeX Development Community +(c) Copyright 2013-2020 Norbert Preining norbert@preining.info +(c) Copyright 2012 Bob Tennent rdt@cs.queensu.ca This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -181,6 +182,8 @@ support directories containing dots (thanks kn1cht) - version 20200119.0 check invalid PATH string beforehand on windows +- version 20200307.0 + add -ld option to run (u)platex-dev ]] @@ -278,6 +281,7 @@ use_eptex = 0 use_uptex = 0 use_latex = 0 +use_latexdev = 0 outputdir = "." prefilename = "" filename = "" @@ -315,6 +319,9 @@ use_uptex = 1 elseif this_arg == "-l" then use_latex = 1 + elseif this_arg == "-ld" then + use_latex = 1 + use_latexdev = 1 elseif this_arg == "-s" then dvipdf = "" elseif this_arg == "-i" then @@ -344,30 +351,30 @@ whoami() -if use_eptex == 1 then +if use_latex == 1 then if use_uptex == 1 then - if use_latex == 1 then + if use_latexdev == 1 then + tex = "uplatex-dev" + else tex = "uplatex" -- uplatex already as etex extension - else + end + else + if use_latexdev == 1 then + tex = "platex-dev" + else + tex = "platex" -- latex needs etex anyway + end + end +else + if use_eptex == 1 then + if use_uptex == 1 then tex = "euptex" + else + tex = "eptex" end else - if use_latex == 1 then - tex = "platex" -- latex needs etex anyway - else - tex = "eptex" - end - end -else - if use_uptex == 1 then - if use_latex == 1 then - tex = "uplatex" - else + if use_uptex == 1 then tex = "uptex" - end - else - if use_latex == 1 then - tex = "platex" else tex = "ptex" end diff --git a/texk/texlive/linked_scripts/texfot/texfot.pl b/texk/texlive/linked_scripts/texfot/texfot.pl index 3915539..e49d5f1 100755 --- a/texk/texlive/linked_scripts/texfot/texfot.pl +++ b/texk/texlive/linked_scripts/texfot/texfot.pl @@ -1,5 +1,5 @@ #!/usr/bin/env perl -# $Id: texfot,v 1.38 2019/06/30 22:59:39 karl Exp $ +# $Id: texfot,v 1.40 2020/03/10 22:35:15 karl Exp $ # Invoke a TeX command, filtering all but interesting terminal output; # do not look at the log or check any output files. # Exit status is that of the subprogram. @@ -8,7 +8,7 @@ # # Public domain. Originally written 2014 by Karl Berry. -my $ident = '$Id: texfot,v 1.38 2019/06/30 22:59:39 karl Exp $'; +my $ident = '$Id: texfot,v 1.40 2020/03/10 22:35:15 karl Exp $'; (my $prg = $0) =~ s,^.*/,,; select STDERR; $| = 1; # no buffering select STDOUT; $| = 1; @@ -83,7 +83,7 @@ # It's not ideal to read all of stdout and then all of stderr; it would # be better to intermix them in the original order of child output. - # this is simpler than other ways of avoiding possible deadlock (such + # But this is simpler than other ways of avoiding possible deadlock (such # as select, sysread, etc.). &debug ("processing stdout from child"); &process_output (\*TEXOUT, ""); @@ -104,9 +104,10 @@ -# Read filehandle $FH; print lines that we want to stdout, prefixed by -# $PREFIX. If $PREFIX is null, omit lines by default; if $PREFIX is -# non-null, print lines by default. +# Read filehandle $FH, printing lines that we want to stdout, +# prefixed by $PREFIX. +# If $PREFIX is null (happens for processing stdout), omit lines by default; +# if $PREFIX is non-null (processing stderr), print lines by default. # sub process_output { my ($fh,$prefix) = @_; @@ -118,7 +119,8 @@ warn "\n" if $opt_debug; # get blank line without texfot: prefix &debug ("looking at line: $_"); - &debug ("checking if have print_next (is $print_next)\n"); + + &debug ("checking if have print_next (= $print_next)\n"); if ($print_next) { &debug (" printing next ($print_next)\n"); print $prefix; @@ -132,8 +134,9 @@ LaTeX\ Warning:\ You\ have\ requested\ package |LaTeX\ Font\ Warning:\ Some\ font\ shapes |LaTeX\ Font\ Warning:\ Size\ substitutions - |Package\ caption\ Warning:\ Unsupported\ document\ class + |Package\ caption\ Warning:\ Un(supported|known)\ document\ class |Package\ fixltx2e\ Warning:\ fixltx2e\ is\ not\ required + |Package\ layouts\ Warning:\ Layout\ scale |Package\ frenchb?\.ldf\ Warning:\ (Figures|The\ definition) |\*\*\*\ Reloading\ Xunicode\ for\ encoding # spurious *** |This\ is\ `?(epsf\.tex|.*\.sty|TAP) # so what diff --git a/texk/texlive/linked_scripts/texlive/tlmgr.pl b/texk/texlive/linked_scripts/texlive/tlmgr.pl index bbb89c0..6379616 100755 --- a/texk/texlive/linked_scripts/texlive/tlmgr.pl +++ b/texk/texlive/linked_scripts/texlive/tlmgr.pl @@ -1,12 +1,12 @@ #!/usr/bin/env perl -# $Id: tlmgr.pl 54087 2020-03-05 00:48:55Z preining $ +# $Id: tlmgr.pl 54118 2020-03-05 22:27:22Z karl $ # # Copyright 2008-2020 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. -my $svnrev = '$Revision: 54087 $'; -my $datrev = '$Date: 2020-03-05 01:48:55 +0100 (Thu, 05 Mar 2020) $'; +my $svnrev = '$Revision: 54118 $'; +my $datrev = '$Date: 2020-03-05 23:27:22 +0100 (Thu, 05 Mar 2020) $'; my $tlmgrrevision; my $tlmgrversion; my $prg; @@ -5529,6 +5529,7 @@ |README.* |a_.*\.enc |cid2code\.txt + |context\.json |etex\.src |fithesis.* |u?kinsoku\.tex @@ -5716,7 +5717,6 @@ if (",$TeXLive::TLConfig::PartialEngineSupport," =~ /,$engine,/) { # luajit[hb]tex is special since it is not available on all architectures # due to inherent reasons (machine code); - # luahbtex is special until we build it everywhere for TL'20. # # We do not want to have error messages here, so we do the following: # * if tlpkg/tlpsrc/luajittex.tlpsrc is available, then load it @@ -5728,8 +5728,6 @@ my $pkg; if ($engine =~ /luajit(hb)?tex/) { $pkg = "luajittex"; - } elsif ($engine eq "luahbtex") { - $pkg = "luahbtex"; } elsif ($engine eq "mfluajit") { $pkg = "mflua"; } else { @@ -10011,7 +10009,7 @@ distribution (L) and both are licensed under the GNU General Public License Version 2 or later. -$Id: tlmgr.pl 54087 2020-03-05 00:48:55Z preining $ +$Id: tlmgr.pl 54118 2020-03-05 22:27:22Z karl $ =cut # test HTML version: pod2html --cachedir=/tmp tlmgr.pl >/tmp/tlmgr.html diff --git a/texk/web2c/ChangeLog b/texk/web2c/ChangeLog index ca9b6b2..80fb8df 100644 --- a/texk/web2c/ChangeLog +++ b/texk/web2c/ChangeLog @@ -1,3 +1,9 @@ +2020-03-12 Karl Berry + + * doc/web2c.texi (\input quoted filename), + (\input braced filename), + (\input filename caveats): new subnodes of "\input filenames". + 2020-02-09 Phelype Oleinik * tex.ch (29.256, scan_file_name): new procedure to implement diff --git a/texk/web2c/Makefile.in b/texk/web2c/Makefile.in index 3e4e534..adbd36a 100644 --- a/texk/web2c/Makefile.in +++ b/texk/web2c/Makefile.in @@ -229,7 +229,8 @@ @LUAHBTEX_TRUE@@WIN32_TRUE@am__append_90 = call_luahbtex @LUAHBTEX_TRUE@@WIN32_TRUE@am__append_91 = install-luahbtex-links @LUAHBTEX_TRUE@@WIN32_TRUE@am__append_92 = uninstall-luahbtex-links -@LUAHBTEX_TRUE@@WIN32_FALSE@am__append_93 = luahbtex$(EXEEXT):texlua luahbtex$(EXEEXT):texluac +# keep texlua[c] as links to luatex unless luatex is not installed. +@LUAHBTEX_TRUE@@LUATEX_FALSE@@WIN32_FALSE@am__append_93 = luahbtex$(EXEEXT):texlua luahbtex$(EXEEXT):texluac @LUAJITTEX_TRUE@am__append_94 = luajittex @LUAJITTEX_TRUE@@WIN32_TRUE@am__append_95 = call_luajittex @LUAJITTEX_TRUE@@WIN32_TRUE@am__append_96 = install-luajittex-links @@ -239,7 +240,8 @@ @LUAJITHBTEX_TRUE@@WIN32_TRUE@am__append_100 = call_luajithbtex @LUAJITHBTEX_TRUE@@WIN32_TRUE@am__append_101 = install-luajithbtex-links @LUAJITHBTEX_TRUE@@WIN32_TRUE@am__append_102 = uninstall-luajithbtex-links -@LUAJITHBTEX_TRUE@@WIN32_FALSE@am__append_103 = luajithbtex$(EXEEXT):texluajit luajithbtex$(EXEEXT):texluajitc +# keep texluajit[c] as links to luajittex unless luajittex is not installed. +@LUAJITHBTEX_TRUE@@LUAJITTEX_FALSE@@WIN32_FALSE@am__append_103 = luajithbtex$(EXEEXT):texluajit luajithbtex$(EXEEXT):texluajitc @LUATEX_TRUE@am__append_104 = $(luatex_tests) @LUAHBTEX_TRUE@am__append_105 = $(luahbtex_tests) @LUAJITTEX_TRUE@am__append_106 = $(luajittex_tests) diff --git a/texk/web2c/doc/web2c.info b/texk/web2c/doc/web2c.info index e7745a4..19bf29f 100644 --- a/texk/web2c/doc/web2c.info +++ b/texk/web2c/doc/web2c.info @@ -1,10 +1,10 @@ -This is web2c.info, produced by makeinfo version 5.1 from web2c.texi. +This is web2c.info, produced by makeinfo version 6.7 from web2c.texi. This file documents the installation and use of the programs in Web2c, an implementation of Donald Knuth's TeX system. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -2005, 2007, 2008, 2009 Karl Berry & Olaf Weber. +2005, 2007, 2008, 2009, 2010-2020 Karl Berry & Olaf Weber. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -58,7 +58,7 @@ This document describes how to install and use the programs in the Web2c implementation of the TeX system, especially for Unix systems. It -corresponds to Web2c version 2020, released in January 2020. +corresponds to Web2c version 2020, released in March 2020. * Menu: @@ -82,7 +82,7 @@ 1 Introduction ************** -This manual corresponds to version 2020 of Web2c, released in January +This manual corresponds to version 2020 of Web2c, released in March 2020. "Web2c" is the name of a TeX implementation, originally for Unix, but @@ -634,7 +634,7 @@ * Initial and virgin:: Making memory dumps vs. production runs. * Memory dumps:: .fmt/.base files for fast startup. * Editor invocation:: The 'e' response at errors. -* \input filenames:: ~ and $ expansion in TeX/MF/MP. +* \input filenames:: Filename delimiters and Kpathsea expansion.  File: web2c.info, Node: Initial and virgin, Next: Memory dumps, Up: Three programs @@ -835,8 +835,35 @@ macro packages provide other interfaces to '\input' that allow different notation; here we are concerned only with the primitive operation.) - As of Web2c version 7.5.3, double-quote characters can be used to -include spaces or other special cases. In typical use, the '"' + As (allowed) extensions to standard TeX, Web2c also supports +specifying the filename in double quotes ('"some name"') and in braces +('{"some name"}'), which is convenient for filenames containing spaces +or other special characters, as described in the sections below. + + In all cases, space tokens are ignored after the filename is read. + + Also, double quote ('"') characters are ignored within the filename; +there is no way to read files whose names contain a '"'. + + However, for maximal portability of your document across systems, use +only the characters 'a'-'z', '0'-'9', and '.'. Do not use anything but +simple filenames, since directory separators vary among systems; +instead, add the necessary directories to the appropriate search path. + +* Menu: + +* Quotes: \input quoted filename. \input "some name" +* Braces: \input braced filename. \input {some name} +* Caveats: \input filename caveats. Tokenization, nulls, Kpathsea expansion. + + +File: web2c.info, Node: \input quoted filename, Next: \input braced filename, Up: \input filenames + +3.5.4.1 '\input' quoted filename: '\input "some name"' +...................................................... + +As of Web2c version 7.5.3 (2004), double-quote characters can be used to +include spaces or other special characters. In typical use, the '"' characters surround the entire filename: \input "filename with spaces" @@ -844,46 +871,69 @@ can enclose any characters, as in: \input filename" "with" "spaces - One more point. In LaTeX, the quotes are needed inside the braces, -thus + One more point. In LaTeX, the quotes are needed inside the braces of +its '\input' macro, thus: \input{a b} % fails \input{"a b"} % ok - This quoting mechanism comes into play _after_ TeX has tokenized and -expanded the input. So, multiple spaces and tabs may be seen as a -single space, active characters such as '~' are expanded first, and so -on. (See below.) + There is no way to quote the quote character. + + +File: web2c.info, Node: \input braced filename, Next: \input filename caveats, Prev: \input quoted filename, Up: \input filenames + +3.5.4.2 '\input' braced filename: '\input{some name}' +..................................................... + +As of Web2c 2020, '\input' filenames in TeX engines (this does not apply +in Metafont and MetaPost) can also be specified within a TeX group, +typically curly braces. For example: + \input{filename with spaces} + + As always with TeX, the brace characters are not hardwired; what +counts is the category code: the first token after the '\input' must be +of catcode 1 (begin group), and it is matched with the next character of +catcode 2 (end group). + + Within the group-delimited filename, braces are treated as normal +characters. + + As with all forms of filenames, following spaces are ignored (after +the end group), and double quote ('"') characters are ignored within the +filename. + + +File: web2c.info, Node: \input filename caveats, Prev: \input braced filename, Up: \input filenames + +3.5.4.3 '\input' filename caveats +................................. + +The quoting mechanisms just described come into play _after_ TeX has +tokenized and expanded the input. So, multiple spaces and tabs will +generally be seen as a single space, active characters such as '~' are +expanded first (generally causing an error), and so on. More examples +below. On the other hand, various C library routines and Unix itself use the null byte (character code zero, ASCII NUL) to terminate strings. So filenames in Web2c cannot contain nulls, even though TeX itself does not -treat NUL specially. In addition, some older Unix variants do not allow -eight-bit characters (codes 128-255) in filenames. - - For maximal portability of your document across systems, use only the -characters 'a'-'z', '0'-'9', and '.', and restrict your filenames to at -most eight characters (not including the extension), and at most a -three-character extension. Do not use anything but simple filenames, -since directory separators vary among systems; instead, add the -necessary directories to the appropriate search path. +treat NUL specially. Finally, the present Web2c implementation does '~' and '$' expansion -on NAME, unlike Knuth's original implementation and older versions of -Web2c. Thus: +on NAME, unlike Knuth's original implementation. Thus: \input ~jsmith/$foo.bar will dereference the environment variable or Kpathsea config file -value 'foo' and read that file extended with '.bar' in user 'jsmith''s -home directory. You can also use braces, as in '${foo}bar', if you want -to follow the variable name with a letter, numeral, or '_'. +value 'foo' and read that file, extended with '.bar', in user 'jsmith''s +home directory. You can also use braces in the variable expansion, as +in '${foo}bar', if you want to follow the variable name with a letter, +numeral, or '_'. (So another way to get a program to read a filename containing whitespace is to define an environment variable and dereference it.) - In all the common TeX formats (plain TeX, LaTeX, AMSTeX), the -characters '~' and '$' have special category codes, so to actually use -these in a document you have to change their catcodes or use '\string'. -(The result is unportable anyway, see the suggestions above.) The place -where they are most likely to be useful is when typing interactively. + In all the common TeX formats (plain TeX, LaTeX, ConTeXt, AMSTeX, +...), the characters '~' and '$' have special category codes, so to +actually use these in a document you have to change their catcodes or +use '\string'.  File: web2c.info, Node: TeX, Next: Metafont, Prev: Commonalities, Up: Top @@ -2323,9 +2373,9 @@ * Menu: -* tangle invocation:: -* weave invocation:: -* pooltype invocation:: +* tangle invocation:: +* weave invocation:: +* pooltype invocation::  File: web2c.info, Node: tangle invocation, Next: weave invocation, Up: WEB @@ -2564,7 +2614,7 @@ * Menu: -* dvitype output example:: +* dvitype output example::  File: web2c.info, Node: dvitype output example, Up: dvitype invocation @@ -3425,9 +3475,11 @@ [index] * Menu: -* '#define' options: Compile-time options. - (line 6) -* $ expansion in filenames: \input filenames. (line 47) +* " character, ignored in filenames: \input filenames. (line 22) +* #define options: Compile-time options. + (line 6) +* $ expansion in filenames: \input filename caveats. + (line 17) * %& magic number: Determining the memory dump to use. (line 19) * - starting a filename: Option conventions. (line 19) @@ -3466,7 +3518,7 @@ * -base=BASE: Determining the memory dump to use. (line 15) * -base=DUMPNAME: Common options. (line 34) -* -change=CHFILE: mft invocation. (line 62) +* -change=CHFILE: mft invocation. (line 63) * -charcode-format=TYPE: tftopl invocation. (line 27) * -charcode-format=TYPE <1>: vftovp invocation. (line 30) * -D compiler options: Compile-time options. @@ -3527,7 +3579,7 @@ * -shell-restricted: tex invocation. (line 121) * -show-opcodes: dvitype invocation. (line 52) * -strict: tangle invocation. (line 46) -* -style=MFTFILE: mft invocation. (line 66) +* -style=MFTFILE: mft invocation. (line 67) * -T: mpost invocation. (line 115) * -terse: bibtex invocation. (line 28) * -tex=TEXPROGRAM: mpost invocation. (line 118) @@ -3547,7 +3599,7 @@ * .fmt: Initial TeX. (line 6) * .mf: mf invocation. (line 24) * .mp: mpost invocation. (line 30) -* '.mps' files and PDF: mpost invocation. (line 86) +* .mps files and PDF: mpost invocation. (line 86) * .NNN PostScript figures: mpost invocation. (line 35) * .NNNgf generic fonts: mf invocation. (line 34) * .tcx character translation files: Common options. (line 98) @@ -3571,21 +3623,29 @@ * \font and dynamic generation: tex invocation. (line 41) * \fontdimen: tftopl invocation. (line 99) * \immediate\write18: Shell escapes. (line 6) +* \input braced (grouped) filename: \input braced filename. + (line 6) +* \input filename caveats: \input filename caveats. + (line 6) * \input filenames: \input filenames. (line 6) +* \input quoted filename: \input quoted filename. + (line 6) * \input, and pipes: Shell escapes. (line 64) * \mag: dvicopy invocation. (line 20) * \mag <1>: dvitype invocation. (line 28) * \openin, and pipes: Shell escapes. (line 64) * \openout and security: tex invocation. (line 48) * \openout, and pipes: Shell escapes. (line 64) -* \output routine, and '\write': Shell escapes. (line 28) +* \output routine, and \write: Shell escapes. (line 28) * \pdfshellescape: Shell escapes. (line 64) -* \string: \input filenames. (line 59) +* \string, and \input filenames: \input filename caveats. + (line 29) * \tracingcharsubdef and MLTeX: \tracingcharsubdef. (line 6) * \tracinglostchars and MLTeX: \tracingcharsubdef. (line 11) * \write18 shell escape extension: Shell escapes. (line 6) * ^^ notation, avoiding: TCX files. (line 87) -* ~ expansion in filenames: \input filenames. (line 47) +* ~ expansion in filenames: \input filename caveats. + (line 17) * abbrv.bst: Basic BibTeX style files. (line 16) * accented character: TCX files. (line 6) @@ -3648,6 +3708,8 @@ * binaries, linking: Common options. (line 77) * blank lines, in TCX files: TCX files. (line 66) * boxes, memory for: Runtime options. (line 20) +* braced filename for \input: \input braced filename. + (line 6) * breakpoints, memory for: Runtime options. (line 20) * Breitenlohner, Peter: Introduction. (line 9) * BSTINPUTS, search path for bst files: bibtex invocation. (line 18) @@ -3660,7 +3722,9 @@ * byte swapping: Hardware and memory dumps. (line 13) * c-sources Makefile target: Additional targets. (line 12) -* change files, and MFT: mft invocation. (line 62) +* caveats for \input filenames: \input filename caveats. + (line 6) +* change files, and MFT: mft invocation. (line 63) * change files, and Tangle: tangle invocation. (line 11) * change files, and Weave: weave invocation. (line 14) * changing error messages style: Common options. (line 26) @@ -3680,7 +3744,7 @@ (line 69) * cm.base: Initial Metafont. (line 26) * cmbase.mf: Initial Metafont. (line 26) -* cmbase.mft: mft invocation. (line 72) +* cmbase.mft: mft invocation. (line 73) * cmmf.base not recommended: Initial Metafont. (line 26) * color, in DVItoMP: dvitomp invocation. (line 15) * comments, in TCX files: TCX files. (line 70) @@ -3693,7 +3757,7 @@ (line 6) * Computer Modern fonts, and Troff: mpost invocation. (line 65) * Computer Modern macros: Initial Metafont. (line 26) -* 'Computer Modern Typefaces', production of: mft invocation. (line 72) +* Computer Modern Typefaces, production of: mft invocation. (line 73) * configuration: Installation. (line 6) * configuration file reading: Path searching. (line 6) * configuration file values: Runtime options. (line 6) @@ -3737,6 +3801,8 @@ * DISPLAY: Online Metafont graphics. (line 76) * dot files, written by TeX programs: tex invocation. (line 48) +* double quote character, ignored in filenames: \input filenames. + (line 22) * downloading of fonts for MetaPost labels: mpost invocation. (line 70) * DrawingServant: Online Metafont graphics. (line 35) @@ -3758,18 +3824,19 @@ * dx horizontal escapement <1>: gftype invocation. (line 106) * dy vertical escapement: gftype invocation. (line 106) * dynamic array allocation: Runtime options. (line 35) -* dynamic Metafont mode definitions with 'smode': Modes. (line 28) +* dynamic Metafont mode definitions with smode: Modes. (line 28) * dynamic packing variable: pktype invocation. (line 44) * e response at error prompt: Editor invocation. (line 6) * e-circumflex: \charsubdef. (line 20) * e-TeX: TeX extensions. (line 10) -* e.mft: mft invocation. (line 72) +* e.mft: mft invocation. (line 73) * EC fonts: tex invocation. (line 41) * EC fonts <1>: mf invocation. (line 24) * editing of bitmap fonts: Font utilities available elsewhere. (line 23) * editor invoked at error: Editor invocation. (line 6) -* eight-bit characters in filenames: \input filenames. (line 34) +* eight-bit characters in filenames: \input filename caveats. + (line 12) * empty.tcx: TCX files. (line 48) * endian dependencies: Hardware and memory dumps. (line 6) @@ -3785,6 +3852,8 @@ * executables, shared initial and virgin: Initial and virgin. (line 6) * exit status, of shell escape: Shell escapes. (line 34) * expanded plain format: Formats. (line 54) +* expansion, and \input filenames: \input filename caveats. + (line 6) * extensions to TeX: TeX extensions. (line 6) * extra_mem_bot: Runtime options. (line 19) * FACE property: tftopl invocation. (line 95) @@ -3794,7 +3863,7 @@ * file formats for fonts: Font file formats. (line 6) * file recorder: Common options. (line 84) * filename conventions, in input files: \input filenames. (line 6) -* filenames starting with '-': Option conventions. (line 19) +* filenames starting with -: Option conventions. (line 19) * first line of the main input file: Common options. (line 98) * fixed-point arithmetic: Compile-time options. (line 21) @@ -3859,6 +3928,8 @@ * glue, memory for: Runtime options. (line 20) * glyph substitutions: MLTeX. (line 6) * gray font: gftodvi invocation. (line 29) +* group-delimited filename for \input: \input braced filename. + (line 6) * Gruff, Billy Goat: Triptrap. (line 6) * gsftopk: Font utilities available elsewhere. (line 35) @@ -3914,7 +3985,7 @@ * install-formats Make target: Additional targets. (line 17) * install-mems Make target: Additional targets. (line 34) * installation: Installation. (line 6) -* interaction between TCX files and '-8bit'.: TCX files. (line 104) +* interaction between TCX files and -8bit.: TCX files. (line 104) * interaction mode: Common options. (line 50) * international characters: TCX files. (line 6) * introduction: Introduction. (line 6) @@ -3984,7 +4055,8 @@ * memory dumps, creating: Creating memory dumps. (line 6) * mems Make target: Additional targets. (line 34) -* meta characters in filenames: \input filenames. (line 34) +* meta characters in filenames: \input filename caveats. + (line 12) * Metafont: Metafont. (line 6) * Metafont geometry: Online Metafont graphics. (line 69) @@ -4004,7 +4076,7 @@ (line 15) * MetaPost input files: mpost invocation. (line 30) * MetaPost invocation: mpost invocation. (line 6) -* MetaPost source, prettyprinting: mft invocation. (line 78) +* MetaPost source, prettyprinting: mft invocation. (line 79) * MetaPost, initial: Initial MetaPost. (line 6) * MetaPost, TeX, and Metafont: Three programs. (line 6) * metatype1: Font utilities available elsewhere. @@ -4044,6 +4116,8 @@ * mptrap.readme: Triptrap. (line 6) * MPX files, converting from DVI files: dvitomp invocation. (line 6) * Multi-lingual TeX: MLTeX. (line 6) +* multiple spaces, and \input filenames: \input filename caveats. + (line 6) * N tilde: \charsubdef. (line 36) * new graphics support for Metafont: Online Metafont graphics. (line 79) @@ -4055,7 +4129,8 @@ (line 65) * NO_X11WIN: Online Metafont graphics. (line 56) -* NUL, not allowed in filenames: \input filenames. (line 34) +* NUL, not allowed in filenames: \input filename caveats. + (line 12) * octal character codes, in TCX files: TCX files. (line 77) * offset for overflow labels: gftodvi invocation. (line 59) * online Metafont graphics: Online Metafont graphics. @@ -4081,7 +4156,7 @@ * path searching: Path searching. (line 6) * path searching debugging: Common options. (line 59) * PDF: TeX extensions. (line 20) -* PDF, and '.mps' files: mpost invocation. (line 86) +* PDF, and .mps files: mpost invocation. (line 86) * pdfTeX: TeX extensions. (line 20) * permissions, legal: Legalisms. (line 6) * PFA and PFB conversion: Font utilities available elsewhere. @@ -4114,13 +4189,13 @@ * plain.bst: Basic BibTeX style files. (line 11) * plain.fmt: Initial TeX. (line 13) -* plain.mft: mft invocation. (line 66) +* plain.mft: mft invocation. (line 67) * pltotf: pltotf invocation. (line 6) * pool file, writing: tangle invocation. (line 16) * Poole, Simon: Online Metafont graphics. (line 50) * pooltype: pooltype invocation. (line 6) -* portable filenames: \input filenames. (line 40) +* portable filenames: \input filenames. (line 25) * PostScript fonts, and Troff: mpost invocation. (line 65) * PostScript meets Metafont: MetaPost. (line 6) * PostScript output: mpost invocation. (line 35) @@ -4156,6 +4231,8 @@ * PXL files, explained: Font file formats. (line 39) * pxtoch: Font utilities available elsewhere. (line 23) +* quoted filename for \input: \input quoted filename. + (line 6) * Raichle, Bernd: MLTeX. (line 6) * reading, additional: Introduction. (line 60) * readonly directory, running TeX in: Output file location. @@ -4187,8 +4264,8 @@ (line 42) * security, and output files: tex invocation. (line 48) * security, and shell escapes: Shell escapes. (line 6) -* security, and 'write': mpost invocation. (line 92) -* security, and '\openout': tex invocation. (line 48) +* security, and write: mpost invocation. (line 92) +* security, and \openout: tex invocation. (line 48) * shapes: Metafont. (line 6) * sharing memory dumps: Hardware and memory dumps. (line 6) @@ -4218,7 +4295,7 @@ * string pool, writing: tangle invocation. (line 16) * string representation: pooltype invocation. (line 30) * style design, for BibTeX: bibtex invocation. (line 49) -* style files: mft invocation. (line 66) +* style files: mft invocation. (line 67) * substitutions of font glyphs: MLTeX. (line 6) * sun: Online Metafont graphics. (line 42) @@ -4235,6 +4312,8 @@ * system C library function: Shell escapes. (line 6) * system command: Shell escapes. (line 6) * T1 encoding and ISO input: TCX files. (line 48) +* tabs, and \input filenames: \input filename caveats. + (line 6) * Tachikawa, Elizabeth: Font file formats. (line 62) * tangle: tangle invocation. (line 6) * targets, additional Make: Additional targets. (line 6) @@ -4271,7 +4350,7 @@ (line 79) * TEXMFOUTPUT, used for reading: Output file location. (line 25) -* TEXMFOUTPUT, used if '.' unwritable: Output file location. +* TEXMFOUTPUT, used if . unwritable: Output file location. (line 19) * texput: tex invocation. (line 33) * TFM files, converting property lists to: pltotf invocation. (line 6) @@ -4286,6 +4365,8 @@ * time and date, in memory dumps: Hardware and memory dumps. (line 30) * title font: gftodvi invocation. (line 33) +* tokenization, and \input filenames: \input filename caveats. + (line 6) * toolkits, X: Online Metafont graphics. (line 59) * torture tests: Triptrap. (line 6) @@ -4390,75 +4471,83 @@  Tag Table: -Node: Top2754 -Node: Introduction3751 -Node: Installation6911 -Node: configure options9013 -Node: Compile-time options11035 -Node: Additional targets12137 -Node: Triptrap13414 -Node: Runtime options14941 -Node: Commonalities16699 -Node: Option conventions17300 -Node: Common options18523 -Node: Path searching22903 -Node: Output file location23875 -Node: Three programs25200 -Node: Initial and virgin25954 -Node: Memory dumps26883 -Node: Creating memory dumps27339 -Node: Determining the memory dump to use28550 -Node: Hardware and memory dumps30131 -Node: Editor invocation32581 -Node: \input filenames33448 -Node: TeX36441 -Node: tex invocation37592 -Node: Initial TeX44495 -Node: Formats45859 -Node: Languages and hyphenation48785 -Node: MLTeX49215 -Node: \charsubdef50703 -Node: \tracingcharsubdef53026 -Node: TCX files53601 -Node: patgen invocation59041 -Node: Shell escapes59747 -Node: IPC and TeX63327 -Node: TeX extensions63897 -Node: Metafont65028 -Node: mf invocation66316 -Node: Initial Metafont70153 -Node: Modes71783 -Node: Online Metafont graphics74033 -Node: gftodvi invocation77458 -Node: mft invocation80278 -Node: MetaPost84276 -Node: mpost invocation85038 -Node: Initial MetaPost90214 -Node: dvitomp invocation91136 -Node: BibTeX91801 -Node: bibtex invocation92162 -Node: Basic BibTeX style files94636 -Node: WEB95966 -Node: tangle invocation97207 -Node: weave invocation99330 -Node: pooltype invocation100737 -Node: DVI utilities101867 -Node: dvicopy invocation102799 -Node: dvitype invocation104082 -Node: dvitype output example106417 -Node: Font utilities109468 -Node: Font file formats110648 -Node: gftopk invocation113917 -Node: pktogf invocation115108 -Node: pktype invocation116274 -Node: gftype invocation119097 -Node: tftopl invocation123600 -Node: pltotf invocation128193 -Node: vftovp invocation129244 -Node: vptovf invocation131479 -Node: Font utilities available elsewhere132506 -Node: Legalisms134886 -Node: References137040 -Node: Index141607 +Node: Top2765 +Node: Introduction3760 +Node: Installation6918 +Node: configure options9020 +Node: Compile-time options11042 +Node: Additional targets12144 +Node: Triptrap13421 +Node: Runtime options14948 +Node: Commonalities16706 +Node: Option conventions17307 +Node: Common options18530 +Node: Path searching22910 +Node: Output file location23882 +Node: Three programs25207 +Node: Initial and virgin25973 +Node: Memory dumps26902 +Node: Creating memory dumps27358 +Node: Determining the memory dump to use28569 +Node: Hardware and memory dumps30150 +Node: Editor invocation32600 +Node: \input filenames33467 +Node: \input quoted filename35012 +Node: \input braced filename35793 +Node: \input filename caveats36727 +Node: TeX38245 +Node: tex invocation39396 +Node: Initial TeX46299 +Node: Formats47663 +Node: Languages and hyphenation50589 +Node: MLTeX51019 +Node: \charsubdef52507 +Node: \tracingcharsubdef54830 +Node: TCX files55405 +Node: patgen invocation60845 +Node: Shell escapes61551 +Node: IPC and TeX65131 +Node: TeX extensions65701 +Node: Metafont66832 +Node: mf invocation68120 +Node: Initial Metafont71957 +Node: Modes73587 +Node: Online Metafont graphics75837 +Node: gftodvi invocation79262 +Node: mft invocation82082 +Node: MetaPost86080 +Node: mpost invocation86842 +Node: Initial MetaPost92018 +Node: dvitomp invocation92940 +Node: BibTeX93605 +Node: bibtex invocation93966 +Node: Basic BibTeX style files96440 +Node: WEB97770 +Node: tangle invocation98979 +Node: weave invocation101102 +Node: pooltype invocation102509 +Node: DVI utilities103639 +Node: dvicopy invocation104571 +Node: dvitype invocation105854 +Node: dvitype output example108183 +Node: Font utilities111234 +Node: Font file formats112414 +Node: gftopk invocation115683 +Node: pktogf invocation116874 +Node: pktype invocation118040 +Node: gftype invocation120863 +Node: tftopl invocation125366 +Node: pltotf invocation129959 +Node: vftovp invocation131010 +Node: vptovf invocation133245 +Node: Font utilities available elsewhere134272 +Node: Legalisms136652 +Node: References138806 +Node: Index143373  End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/texk/web2c/doc/web2c.texi b/texk/web2c/doc/web2c.texi index 0460866..d44a2e4 100644 --- a/texk/web2c/doc/web2c.texi +++ b/texk/web2c/doc/web2c.texi @@ -12,7 +12,7 @@ @end tex @set version 2020 -@set month-year January 2020 +@set month-year March 2020 @c Define new indices for commands in auxiliary files, filenames, and options. @defcodeindex cm @@ -63,7 +63,7 @@ an implementation of Donald Knuth's TeX system. Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -2004, 2005, 2007, 2008, 2009 Karl Berry & Olaf Weber. +2004, 2005, 2007, 2008, 2009, 2010-2020 Karl Berry & Olaf Weber. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are @@ -88,7 +88,6 @@ @titlepage - @title Web2c @subtitle for version @value{version} @subtitle @value{month-year} @@ -525,7 +524,7 @@ * Initial and virgin:: Making memory dumps vs. production runs. * Memory dumps:: .fmt/.base files for fast startup. * Editor invocation:: The `e' response at errors. -* \input filenames:: ~ and $ expansion in TeX/MF/MP. +* \input filenames:: Filename delimiters and Kpathsea expansion. @end menu @@ -808,9 +807,42 @@ @code{\input} that allow different notation; here we are concerned only with the primitive operation.) -As of Web2c version 7.5.3, double-quote characters can be used to -include spaces or other special cases. In typical use, the @samp{"} -characters surround the entire filename: +As (allowed) extensions to standard @TeX{}, Web2c also supports +specifying the filename in double quotes (@code{"some name"}) and in +braces (@code{@{"some name"@}}), which is convenient for filenames +containing spaces or other special characters, as described in the +sections below. + +In all cases, space tokens are ignored after the filename is read. + +@cindex @code{"} character, ignored in filenames +@cindex double quote character, ignored in filenames +Also, double quote (@code{"}) characters are ignored within the +filename; there is no way to read files whose names contain a @code{"}. + +@cindex portable filenames +However, for maximal portability of your document across systems, use +only the characters @samp{a}--@samp{z}, @samp{0}--@samp{9}, and +@samp{.}. Do not use anything but simple filenames, since directory +separators vary among systems; instead, add the necessary directories +to the appropriate search path. + +@menu +* Quotes: \input quoted filename. \input "some name" +* Braces: \input braced filename. \input @{some name@} +* Caveats: \input filename caveats. Tokenization, nulls, Kpathsea expansion. +@end menu + + +@node \input quoted filename +@subsubsection @code{\input} quoted filename: @code{\input "some name"} + +@cindex @code{\input} quoted filename +@cindex quoted filename for @code{\input} + +As of Web2c version 7.5.3 (2004), double-quote characters can be used +to include spaces or other special characters. In typical use, the +@samp{"} characters surround the entire filename: @example \input "filename with spaces" @end example @@ -821,16 +853,57 @@ \input filename" "with" "spaces @end example -One more point. In @LaTeX{}, the quotes are needed inside the braces, thus +One more point. In @LaTeX{}, the quotes are needed inside the braces +of its @code{\input} macro, thus: @example \input@{a b@} % fails \input@{"a b"@} % ok @end example -This quoting mechanism comes into play @emph{after} @TeX{} has -tokenized and expanded the input. So, multiple spaces and tabs may be -seen as a single space, active characters such as @samp{~} are -expanded first, and so on. (See below.) +There is no way to quote the quote character. + + +@node \input braced filename +@subsubsection @code{\input} braced filename: @code{\input@{some name@}} + +@cindex @code{\input} braced (grouped) filename +@cindex braced filename for @code{\input} +@cindex group-delimited filename for @code{\input} + +As of Web2c 2020, @code{\input} filenames in @TeX{} engines (this does +not apply in Metafont and MetaPost) can also be specified within a +@TeX{} group, typically curly braces. For example: +@example +\input@{filename with spaces@} +@end example + +As always with @TeX{}, the brace characters are not hardwired; what +counts is the category code: the first token after the @code{\input} +must be of catcode@tie{}1 (begin group), and it is matched with the +next character of catcode@tie{}2 (end group). + +Within the group-delimited filename, braces are treated as normal +characters. + +As with all forms of filenames, following spaces are ignored (after +the end group), and double quote (@code{"}) characters are ignored +within the filename. + + +@node \input filename caveats +@subsubsection @code{\input} filename caveats + +@cindex @code{\input} filename caveats +@cindex caveats for @code{\input} filenames +@cindex tokenization, and @code{\input} filenames +@cindex expansion, and @code{\input} filenames +@cindex multiple spaces, and @code{\input} filenames +@cindex tabs, and @code{\input} filenames +The quoting mechanisms just described come into play @emph{after} +@TeX{} has tokenized and expanded the input. So, multiple spaces and +tabs will generally be seen as a single space, active characters such +as @samp{~} are expanded first (generally causing an error), and so +on. More examples below. @cindex NUL, not allowed in filenames @cindex eight-bit characters in filenames @@ -839,42 +912,29 @@ byte (character code zero, ASCII NUL) to terminate strings. So filenames in Web2c cannot contain nulls, even though @TeX{} itself does not treat NUL specially. -In addition, some older Unix variants do not allow eight-bit characters -(codes 128--255) in filenames. - -@cindex portable filenames -For maximal portability of your document across systems, use only the -characters @samp{a}--@samp{z}, @samp{0}--@samp{9}, and @samp{.}, and -restrict your filenames to at most eight characters (not including the -extension), and at most a three-character extension. Do not use -anything but simple filenames, since directory separators vary among -systems; instead, add the necessary directories to the appropriate -search path. @kindex ~ @r{expansion in filenames} @kindex $ @r{expansion in filenames} Finally, the present Web2c implementation does @samp{~} and @samp{$} -expansion on @var{name}, unlike Knuth's original implementation and -older versions of Web2c. Thus: +expansion on @var{name}, unlike Knuth's original implementation. +Thus: @example \input ~jsmith/$foo.bar @end example -will dereference the environment variable or Kpathsea config file value -@samp{foo} and read that file extended with @samp{.bar} in user -@samp{jsmith}'s home directory. You can also use braces, as in -@samp{$@{foo@}bar}, if you want to follow the variable name with a letter, -numeral, or @samp{_}. +will dereference the environment variable or Kpathsea config file +value @samp{foo} and read that file, extended with @samp{.bar}, in +user @samp{jsmith}'s home directory. You can also use braces in the +variable expansion, as in @samp{$@{foo@}bar}, if you want to follow +the variable name with a letter, numeral, or @samp{_}. (So another way to get a program to read a filename containing whitespace is to define an environment variable and dereference it.) -@findex \string -In all the common @TeX{} formats (plain @TeX{}, @LaTeX{}, AMS@TeX{}), -the characters @samp{~} and @samp{$} have special category codes, so to -actually use these in a document you have to change their catcodes or -use @code{\string}. (The result is unportable anyway, see the -suggestions above.) The place where they are most likely to be useful -is when typing interactively. +@findex \string@r{, and @code{\input filenames}} +In all the common @TeX{} formats (plain @TeX{}, @LaTeX{}, Con@TeX{}t, +AMS@TeX{}, @dots{}), the characters @samp{~} and @samp{$} have special +category codes, so to actually use these in a document you have to +change their catcodes or use @code{\string}. @node TeX diff --git a/texk/web2c/luatexdir/ChangeLog b/texk/web2c/luatexdir/ChangeLog index 33b8710..8a1f767 100644 --- a/texk/web2c/luatexdir/ChangeLog +++ b/texk/web2c/luatexdir/ChangeLog @@ -1,6 +1,28 @@ +2020-03-09 Luigi Scarso + * texluahb / texluahbjit for luahbtex / luajithbtex + +2020-03-09 Luigi Scarso + * --shell-restricted now forbids loading of dso (dll/so object) + +2020-03-09 Luigi Scarso + * append_vlist : node|nil [prevdepth] (fix + extension/warning) (HH) + +2020-03-01 Luigi Scarso + * fixed lua stack overflow in run_put_next (M. Kruger) + +2020-02-29 Luigi Scarso + * luahbtex: add (single codepoint) "add" method to buffer (M.Kruger) + +2020-03-06 Karl Berry + + * am/luatex.am (texlua[jit][c]) [LUA[JIT]HBTEX && !LUA[JIT]TEX]: + keep these as links to base lua[jit]tex, not overwriting + with links to luahb[jit]tex, unless the base luatex is not installed. + https://tug.org/pipermail/tex-live/2020-March/044948.html + (and preceding) + 2020-02-12 Luigi Scarso * restore state for \input delimited with {} - 2020-02-11 Luigi Scarso * patches for -fno-common (thanks to D. Seifert of Gentoo team) diff --git a/texk/web2c/luatexdir/am/luatex.am b/texk/web2c/luatexdir/am/luatex.am index ab48c04..31210a4 100644 --- a/texk/web2c/luatexdir/am/luatex.am +++ b/texk/web2c/luatexdir/am/luatex.am @@ -24,7 +24,10 @@ install_exe_links += install-luahbtex-links uninstall_exe_links += uninstall-luahbtex-links else !WIN32 +if !LUATEX +# keep texlua[c] as links to luatex unless luatex is not installed. bin_links += luahbtex$(EXEEXT):texlua luahbtex$(EXEEXT):texluac +endif !LUATEX endif !WIN32 endif LUAHBTEX @@ -46,7 +49,10 @@ install_exe_links += install-luajithbtex-links uninstall_exe_links += uninstall-luajithbtex-links else !WIN32 +if !LUAJITTEX +# keep texluajit[c] as links to luajittex unless luajittex is not installed. bin_links += luajithbtex$(EXEEXT):texluajit luajithbtex$(EXEEXT):texluajitc +endif !LUAJITTEX endif !WIN32 endif LUAJITHBTEX diff --git a/texk/web2c/luatexdir/font/luafont.c b/texk/web2c/luatexdir/font/luafont.c index dd0c685..6806863 100644 --- a/texk/web2c/luatexdir/font/luafont.c +++ b/texk/web2c/luatexdir/font/luafont.c @@ -947,8 +947,11 @@ int pc = count_char_packet_bytes(L); if (pc <= 0) return; - while (l_fonts[(max_f + 1)] != 0) - max_f++; + if (l_fonts != NULL) { + while (l_fonts[(max_f + 1)] != 0) { + max_f++; + } + } cp = cpackets = xmalloc((unsigned) (pc + 1)); for (i = 1; i <= (int) lua_rawlen(L, -1); i++) { lua_rawgeti(L, -1, i); @@ -959,8 +962,14 @@ s = lua_tostring(L, -1); cmd = 0; if (lua_key_eq(s, font)) { + if (l_fonts == NULL) { + normal_error("vf command","no font table found"); + } cmd = packet_font_code; } else if (lua_key_eq(s, char)) { + if (l_fonts == NULL) { + normal_error("vf command","no font table found"); + } cmd = packet_char_code; if (ff == 0) { append_packet(packet_font_code); @@ -968,6 +977,9 @@ do_store_four(ff); } } else if (lua_key_eq(s, slot)) { + if (l_fonts == NULL) { + normal_error("vf command","no font table found"); + } /*tex we could be sparse but no real reason */ cmd = packet_nop_code; lua_rawgeti(L, -2, 2); @@ -2600,13 +2612,12 @@ /*tex The ligaturing and kerning \LUA\ interface: */ -static halfword run_lua_ligkern_callback(halfword head, halfword tail, int callback_id) +static void run_lua_ligkern_callback(halfword head, halfword tail, int callback_id) { int i; int top = lua_gettop(Luas); if (!get_callback(Luas, callback_id)) { lua_settop(Luas, top); - return tail; } nodelist_to_lua(Luas, head); nodelist_to_lua(Luas, tail); @@ -2614,34 +2625,40 @@ formatted_warning("ligkern","error: %s",lua_tostring(Luas, -1)); lua_settop(Luas, top); luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); - return tail; } if (fix_node_lists) { fix_node_list(head); } lua_settop(Luas, top); - return tail; } halfword new_ligkern(halfword head, halfword tail) { int callback_id = 0; + if (! head) + return null; if (vlink(head) == null) return tail; callback_id = callback_defined(ligaturing_callback); if (callback_id > 0) { - tail = run_lua_ligkern_callback(head, tail, callback_id); - if (tail == null) - tail = tail_of_list(head); + halfword save_tail = null; + if (tail) { + save_tail = vlink(tail); + vlink(tail) = null; + } + run_lua_ligkern_callback(head, tail, callback_id); + tail = tail_of_list(head); + if (save_tail) { + try_couple_nodes(tail, save_tail); + } + tail = tail_of_list(head); } else if (callback_id == 0) { tail = handle_ligaturing(head, tail); } callback_id = callback_defined(kerning_callback); if (callback_id > 0) { - tail = run_lua_ligkern_callback(head, tail, callback_id); - if (tail == null) { - tail = tail_of_list(head); - } + run_lua_ligkern_callback(head, tail, callback_id); + tail = tail_of_list(head); } else if (callback_id == 0) { halfword nest1 = new_node(nesting_node, 1); halfword cur = vlink(head); diff --git a/texk/web2c/luatexdir/lua/lnewtokenlib.c b/texk/web2c/luatexdir/lua/lnewtokenlib.c index d1ef55a..6af006a 100644 --- a/texk/web2c/luatexdir/lua/lnewtokenlib.c +++ b/texk/web2c/luatexdir/lua/lnewtokenlib.c @@ -264,6 +264,7 @@ token_link(t) = x; } t = x; + lua_pop(L, 1); } lua_pop(L, 1); } diff --git a/texk/web2c/luatexdir/lua/luainit.c b/texk/web2c/luatexdir/lua/luainit.c index d32a7fd..11cfc25 100644 --- a/texk/web2c/luatexdir/lua/luainit.c +++ b/texk/web2c/luatexdir/lua/luainit.c @@ -323,10 +323,12 @@ opterr = 0; #ifdef LuajitTeX if ((strstr(argv[0], "luajittexlua") != NULL) || - (strstr(argv[0], "texluajit") != NULL)) { + (strstr(argv[0], "texluajit") != NULL) || + (strstr(argv[0], "texluahbjit") != NULL) ) { #else if ((strstr(argv[0], "luatexlua") != NULL) || - (strstr(argv[0], "texlua") != NULL)) { + (strstr(argv[0], "texlua") != NULL) || + (strstr(argv[0], "texluahb") != NULL)) { #endif lua_only = 1; luainit = 1; diff --git a/texk/web2c/luatexdir/lua/luanode.c b/texk/web2c/luatexdir/lua/luanode.c index a0c97e3..502c407 100644 --- a/texk/web2c/luatexdir/lua/luanode.c +++ b/texk/web2c/luatexdir/lua/luanode.c @@ -180,16 +180,17 @@ luatex_error(Luas, (i == LUA_ERRRUN ? 0 : 1)); return 0; } - if (lua_type(Luas,-1) == LUA_TNUMBER) { - *next_depth = lua_roundnumber(Luas,-1); - *prev_set = true; - if (lua_type(Luas, -2) != LUA_TNIL) { - p = check_isnode(Luas, -2); - *result = *p; - } - } else if (lua_type(Luas, -1) != LUA_TNIL) { - p = check_isnode(Luas, -1); + if (lua_type(Luas, -2) == LUA_TUSERDATA) { + p = check_isnode(Luas, -2); *result = *p; + } else if (lua_type(Luas, -2) == LUA_TNIL) { + *result = null; + } else { + normal_warning("append to vlist","error: node or nil expected"); + } + if (lua_type(Luas, -1) == LUA_TNUMBER) { + *next_depth = lua_roundnumber(Luas, -1); + *prev_set = 1; } return 1; } diff --git a/texk/web2c/luatexdir/lua/luatex-core.c b/texk/web2c/luatexdir/lua/luatex-core.c index 3fb4c0f..9539676 100644 --- a/texk/web2c/luatexdir/lua/luatex-core.c +++ b/texk/web2c/luatexdir/lua/luatex-core.c @@ -27,7 +27,7 @@ 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x27, 0x2c, 0x0a, 0x2d, 0x2d, 0x20, 0x7d, 0x0a, 0x0a, 0x4c, 0x55, 0x41, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x31, 0x2e, - 0x31, 0x31, 0x32, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, + 0x31, 0x32, 0x30, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x78, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, @@ -350,318 +350,327 @@ 0x20, 0x73, 0x61, 0x66, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, - 0x66, 0x69, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, - 0x76, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x7e, - 0x3d, 0x20, 0x27, 0x67, 0x63, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, - 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, - 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, - 0x6d, 0x64, 0x35, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64, 0x35, - 0x2e, 0x73, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, - 0x73, 0x75, 0x62, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, - 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, - 0x79, 0x74, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, - 0x79, 0x74, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, - 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, - 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x48, 0x45, 0x58, 0x41, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x48, 0x45, 0x58, 0x41, - 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, - 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x58, 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, - 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, - 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x67, 0x6f, 0x20, - 0x61, 0x77, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, - 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x0a, 0x65, 0x6e, - 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x73, 0x74, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, - 0x35, 0x2e, 0x32, 0x3a, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6f, 0x6b, 0x61, 0x79, 0x0a, - 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, 0x74, 0x66, 0x38, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, - 0x33, 0x3a, 0x20, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x6c, 0x75, 0x61, 0x2c, - 0x20, 0x76, 0x20, 0x31, 0x2e, 0x32, 0x34, 0x20, 0x32, 0x30, 0x31, 0x34, 0x2f, 0x31, 0x32, 0x2f, - 0x32, 0x36, 0x20, 0x31, 0x37, 0x3a, 0x32, 0x30, 0x3a, 0x35, 0x33, 0x20, 0x72, 0x6f, 0x62, 0x65, - 0x72, 0x74, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, 0x5b, 0x5b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x3a, 0x20, - 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x0a, 0x62, - 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7e, 0x61, 0x20, 0x26, 0x20, 0x30, - 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, - 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x6c, 0x69, 0x62, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x66, 0x69, 0x27, 0x29, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x66, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x66, 0x66, 0x69, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, + 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x67, 0x63, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, + 0x69, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x66, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6d, 0x64, 0x35, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x20, + 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x73, 0x75, 0x62, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, 0x68, 0x65, + 0x78, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, 0x6d, + 0x68, 0x65, 0x78, 0x61, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x78, 0x22, 0x2c, 0x62, + 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x64, 0x35, 0x2e, 0x73, 0x75, + 0x6d, 0x48, 0x45, 0x58, 0x41, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x64, 0x35, 0x2e, + 0x73, 0x75, 0x6d, 0x48, 0x45, 0x58, 0x41, 0x28, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x75, 0x6d, 0x28, 0x6b, 0x29, 0x2c, 0x20, 0x22, 0x2e, 0x22, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x22, 0x25, 0x30, 0x32, 0x58, + 0x22, 0x2c, 0x62, 0x79, 0x74, 0x65, 0x28, 0x63, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x67, 0x6f, 0x20, 0x61, 0x77, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x72, 0x73, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x73, 0x74, 0x61, 0x79, 0x0a, 0x0a, 0x69, 0x66, 0x20, + 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x32, 0x3a, 0x20, 0x77, 0x65, 0x27, 0x72, + 0x65, 0x20, 0x6f, 0x6b, 0x61, 0x79, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x75, + 0x74, 0x66, 0x38, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x6c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x3a, 0x20, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, + 0x73, 0x65, 0x2e, 0x6c, 0x75, 0x61, 0x2c, 0x20, 0x76, 0x20, 0x31, 0x2e, 0x32, 0x34, 0x20, 0x32, + 0x30, 0x31, 0x34, 0x2f, 0x31, 0x32, 0x2f, 0x32, 0x36, 0x20, 0x31, 0x37, 0x3a, 0x32, 0x30, 0x3a, + 0x35, 0x33, 0x20, 0x72, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, 0x5b, + 0x5b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x20, 0x6f, 0x66, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2e, + 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7e, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, + 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, + 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x20, + 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, + 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, + 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, + 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, + 0x72, 0x20, 0x30, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, + 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x20, 0x7c, + 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, + 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x7c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, + 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, + 0x78, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, + 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x7e, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, + 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7e, 0x20, 0x79, + 0x20, 0x7e, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, + 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x7e, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, - 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, - 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, 0x2c, 0x20, - 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, 0x7c, 0x20, - 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, - 0x3d, 0x20, 0x78, 0x20, 0x7c, 0x20, 0x79, 0x20, 0x7c, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x7c, - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x78, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x7a, - 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x20, - 0x7e, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, - 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x7e, 0x20, 0x79, 0x20, 0x7e, 0x20, 0x7a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, - 0x20, 0x7e, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x20, 0x79, - 0x2c, 0x20, 0x7a, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x28, 0x78, 0x20, 0x6f, 0x72, - 0x20, 0x2d, 0x31, 0x29, 0x20, 0x26, 0x20, 0x28, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x2d, 0x31, 0x29, - 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, - 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, - 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, 0x7a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, - 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, - 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, - 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, - 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, - 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, - 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x3c, 0x3d, 0x20, - 0x30, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, - 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, - 0x62, 0x29, 0x20, 0x7c, 0x20, 0x7e, 0x28, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, - 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x2c, 0x62, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, - 0x61, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, - 0x28, 0x33, 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x2d, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x26, 0x20, 0x79, 0x20, 0x26, 0x20, 0x7a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x73, 0x20, 0x26, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, + 0x2c, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x72, 0x65, + 0x73, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, + 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, + 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x62, + 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, + 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x29, 0x20, 0x3e, 0x3e, + 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, + 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, + 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x62, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x26, 0x20, 0x30, + 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x7e, 0x28, 0x30, 0x78, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x20, 0x3e, 0x3e, 0x20, 0x62, 0x29, 0x29, 0x20, + 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x61, 0x20, 0x2c, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x33, 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, - 0x2c, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3e, - 0x3e, 0x20, 0x66, 0x29, 0x20, 0x26, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, - 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x76, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x73, 0x6b, - 0x20, 0x3d, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, - 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x7e, 0x28, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3c, 0x3c, 0x20, - 0x66, 0x29, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x28, 0x76, 0x20, 0x26, 0x20, 0x6d, 0x61, 0x73, 0x6b, - 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, 0x0a, 0x0a, 0x65, 0x6c, 0x73, - 0x65, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, - 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x20, 0x5b, 0x5b, 0x0a, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x72, - 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, - 0x62, 0x69, 0x74, 0x2e, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6e, - 0x6f, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, - 0x62, 0x69, 0x74, 0x2e, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, - 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, - 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x61, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, - 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, - 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x6e, 0x6f, - 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, - 0x69, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x78, 0x6f, 0x72, 0x20, 0x20, - 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x78, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, - 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x7e, 0x3d, 0x20, - 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, - 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x62, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x61, 0x2c, 0x66, 0x29, - 0x2c, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x2d, 0x31, 0x29, 0x0a, 0x20, - 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, - 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, - 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, - 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x76, 0x2c, 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x32, 0x5e, - 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x61, 0x2c, 0x62, 0x6e, 0x6f, - 0x74, 0x28, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x66, 0x29, - 0x29, 0x29, 0x2b, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x76, - 0x2c, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x2c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, - 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, - 0x2e, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, - 0x3d, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, - 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x62, 0x69, 0x74, 0x33, 0x32, 0x22, 0x29, 0x0a, 0x0a, - 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, - 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x22, 0x29, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x0a, 0x64, 0x6f, 0x0a, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, - 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, - 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, - 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, - 0x65, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, - 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, - 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x2e, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x79, 0x6d, - 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x63, 0x61, 0x6e, - 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x75, 0x73, 0x69, - 0x6e, 0x67, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x28, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x61, 0x64, - 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, - 0x73, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, - 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, - 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6d, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, - 0x73, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, - 0x73, 0x64, 0x69, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, - 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, - 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, - 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, - 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x72, 0x6f, 0x70, - 0x70, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6b, 0x70, 0x73, 0x65, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, - 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, - 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, - 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, - 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x29, 0x20, - 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, - 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, - 0x0a, 0x00 + 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x2d, 0x62, 0x20, 0x26, 0x20, 0x33, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x20, + 0x3c, 0x3c, 0x20, 0x62, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x33, + 0x32, 0x20, 0x2d, 0x20, 0x62, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x61, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, + 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, 0x66, 0x29, 0x20, 0x26, 0x20, 0x7e, 0x28, + 0x2d, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61, 0x2c, 0x20, + 0x76, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x7e, 0x28, 0x2d, 0x31, 0x20, 0x3c, + 0x3c, 0x20, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x61, 0x20, 0x26, 0x20, 0x7e, 0x28, 0x6d, + 0x61, 0x73, 0x6b, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x28, 0x76, + 0x20, 0x26, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x66, 0x29, 0x29, 0x20, + 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, + 0x20, 0x29, 0x0a, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x62, 0x69, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, + 0x20, 0x5b, 0x5b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x20, + 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x6c, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x61, 0x6e, 0x64, 0x2c, + 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x6c, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x0a, 0x0a, 0x62, 0x69, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x61, + 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x61, 0x72, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, + 0x3d, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x20, 0x20, + 0x20, 0x20, 0x3d, 0x20, 0x62, 0x6e, 0x6f, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x2c, 0x0a, 0x20, + 0x20, 0x62, 0x78, 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x62, + 0x78, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x62, 0x74, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x66, 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x72, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x28, 0x61, 0x2c, 0x66, 0x29, 0x2c, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, + 0x31, 0x29, 0x2d, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x6c, + 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x6c, + 0x2c, 0x0a, 0x20, 0x20, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x76, 0x2c, 0x66, + 0x2c, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, + 0x73, 0x6b, 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x28, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x2d, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x6e, + 0x64, 0x28, 0x61, 0x2c, 0x62, 0x6e, 0x6f, 0x74, 0x28, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, 0x28, + 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x66, 0x29, 0x29, 0x29, 0x2b, 0x6c, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x28, 0x62, 0x61, 0x6e, 0x64, 0x28, 0x76, 0x2c, 0x6d, 0x61, 0x73, 0x6b, 0x29, 0x2c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x72, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x74, 0x2e, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x72, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2c, + 0x0a, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x5d, 0x20, 0x29, 0x0a, + 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x6f, + 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x74, + 0x33, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x62, 0x69, + 0x74, 0x33, 0x32, 0x22, 0x29, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x20, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x0a, 0x0a, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x5d, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x22, 0x5d, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2e, 0x6c, 0x66, 0x73, + 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x6c, + 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, + 0x65, 0x73, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x20, 0x64, + 0x6f, 0x6e, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x66, 0x73, 0x20, 0x28, 0x77, + 0x61, 0x73, 0x20, 0x64, 0x65, 0x61, 0x64, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, + 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x69, 0x6c, + 0x65, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x6e, 0x6b, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x69, 0x73, 0x64, 0x69, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x6b, 0x70, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x77, + 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x2e, 0x2e, 0x2e, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x66, 0x73, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x6b, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x22, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x00 }; return luaL_dostring(L, (const char*) luatex_core_lua); }diff --git a/texk/web2c/luatexdir/lua/luatex-core.lua b/texk/web2c/luatexdir/lua/luatex-core.lua index a0f46dd..538d8f9 100644 --- a/texk/web2c/luatexdir/lua/luatex-core.lua +++ b/texk/web2c/luatexdir/lua/luatex-core.lua @@ -7,7 +7,7 @@ -- copyright = 'LuaTeX Development Team', -- } -LUATEXCOREVERSION = 1.112 -- we reflect the luatex version where changes happened +LUATEXCOREVERSION = 1.120 -- we reflect the luatex version where changes happened -- This file overloads some Lua functions. The readline variants provide the same -- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the @@ -194,12 +194,20 @@ if saferoption == 1 or shellescape ~= 1 then + package.loadlib = function() end + package.searchers[4] = nil + package.searchers[3] = nil + ffi = require('ffi') - for k, v in next, ffi do - if k ~= 'gc' then - ffi[k] = nil - end - end + + if ffi then + for k, v in next, ffi do + if k ~= 'gc' then + ffi[k] = nil + end + end + end + ffi = nil end diff --git a/texk/web2c/luatexdir/luaharfbuzz/spec/buffer_spec.lua b/texk/web2c/luatexdir/luaharfbuzz/spec/buffer_spec.lua index d0a7757..503b902 100644 --- a/texk/web2c/luatexdir/luaharfbuzz/spec/buffer_spec.lua +++ b/texk/web2c/luatexdir/luaharfbuzz/spec/buffer_spec.lua @@ -3,6 +3,15 @@ describe("harfbuzz.Buffer", function() it("can be created", function() harfbuzz.Buffer.new() + end) + + it("can add a single codepoints with explicit cluster value", function() + local b = harfbuzz.Buffer.new() + b:add(0x06CC, 42) + local glyphs = b:get_glyphs() + assert.are_equal(#glyphs, 1) + assert.are_equal(glyphs[1].cluster, 42) + assert.are_equal(glyphs[1].codepoint, 0x06CC) end) it("can add a UTF8 string", function() diff --git a/texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/buffer.c b/texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/buffer.c index 4eb78ec..67921ba 100644 --- a/texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/buffer.c +++ b/texk/web2c/luatexdir/luaharfbuzz/src/luaharfbuzz/buffer.c @@ -135,6 +135,17 @@ hb_codepoint_t cp = (hb_codepoint_t) luaL_checkinteger(L, 2); hb_buffer_set_replacement_codepoint(*b, cp); + return 0; +} + +static int buffer_add(lua_State *L) { + Buffer *b = (Buffer *)luaL_checkudata(L, 1, "harfbuzz.Buffer"); + + hb_codepoint_t c = (hb_codepoint_t) luaL_checkinteger(L, 2); + unsigned int cluster = luaL_checkinteger(L, 3); + + hb_buffer_add(*b, c, cluster); + return 0; } @@ -290,6 +301,7 @@ static const struct luaL_Reg buffer_methods[] = { { "__gc", buffer_destroy }, + { "add", buffer_add }, { "add_utf8", buffer_add_utf8 }, { "add_codepoints", buffer_add_codepoints }, { "clear_contents", buffer_clear_contents }, diff --git a/texk/web2c/luatexdir/luapplib/src/ppheap.h b/texk/web2c/luatexdir/luapplib/src/ppheap.h index 1d6559d..85a59ee 100644 --- a/texk/web2c/luatexdir/luapplib/src/ppheap.h +++ b/texk/web2c/luatexdir/luapplib/src/ppheap.h @@ -22,7 +22,7 @@ #define ppbytes_take(heap, size) _heap16_take(&(heap)->bytesheap, size) #define ppbytes_buffer_init(heap) heap16_buffer_init(&(heap)->bytesheap, &(heap)->bytesbuffer) -#define ppbytes_buffer(heap, atleast) heap16_buffer_some(&(heap)->bytesheap, &(heap)->bytesbuffer, atleast) +#define ppbytes_buffer(heap, atleast) _heap16_buffer_some(&(heap)->bytesheap, &(heap)->bytesbuffer, atleast) #define ppstruct_heap heap64 #define ppstruct_heap_init(heap, space, large, flags) (heap64_init(&(heap)->structheap, space, large, flags), heap64_head(&(heap)->structheap)) diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c b/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c index 1c65b1e..cfe1488 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c +++ b/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c @@ -37,7 +37,7 @@ #define basexx_nl '\x0A' //#define put_nl(O, line, maxline, n) ((void)((line += n) > maxline && ((line = n), iof_set(O, basexx_nl)))) // assignment in conditional warning -#define put_nl(O, line, maxline, n) do { line += n; if (line > maxline) line = n; iof_set(O, basexx_nl); } while (0) +#define put_nl(O, line, maxline, n) do { line += n; if (line > maxline) { line = n; iof_set(O, basexx_nl); }} while (0) /* tail macros */ diff --git a/texk/web2c/luatexdir/luapplib/src/util/utiliof.c b/texk/web2c/luatexdir/luapplib/src/util/utiliof.c index a7141bf..41d6fba 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utiliof.c +++ b/texk/web2c/luatexdir/luapplib/src/util/utiliof.c @@ -946,10 +946,10 @@ } static uint8_t iof_stdout_buffer[BUFSIZ]; -iof iof_stdout = IOF_WRITER_STRUCT(stdout_writer, NULL, iof_stdout_buffer, BUFSIZ, 0); +iof iof_stdout = IOF_WRITER_INIT(stdout_writer, NULL, iof_stdout_buffer, BUFSIZ, 0); static uint8_t iof_stderr_buffer[BUFSIZ]; -iof iof_stderr = IOF_WRITER_STRUCT(stderr_writer, NULL, iof_stderr_buffer, BUFSIZ, 0); +iof iof_stderr = IOF_WRITER_INIT(stderr_writer, NULL, iof_stderr_buffer, BUFSIZ, 0); /* read from somewhere */ diff --git a/texk/web2c/luatexdir/luapplib/src/util/utiliof.h b/texk/web2c/luatexdir/luapplib/src/util/utiliof.h index afd9c55..bad43a7 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utiliof.h +++ b/texk/web2c/luatexdir/luapplib/src/util/utiliof.h @@ -64,7 +64,7 @@ }; \ size_t space; \ iof_handler more; \ - union { iof *next; FILE *file; iof_file *iofile; void *link; }; \ + union { void *link; iof *next; FILE *file; iof_file *iofile; }; \ int flags; \ int refcount @@ -135,16 +135,16 @@ /* initializers */ -#define IOF_READER_STRUCT(handler, file, buffer, size, flags) \ - { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) }}, size, handler, { file }, flags|IOF_READER, 0 } - -#define IOF_WRITER_STRUCT(handler, file, buffer, size, flags) \ - { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) + size }}, size, handler, { file }, flags|IOF_WRITER, 0 } - -#define IOF_STRING_STRUCT(buffer, size) \ +#define IOF_READER_INIT(handler, file, buffer, size, flags) \ + { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) }}, size, handler, { file }, (flags)|IOF_READER, 0 } + +#define IOF_WRITER_INIT(handler, file, buffer, size, flags) \ + { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) + size }}, size, handler, { file }, (flags)|IOF_WRITER, 0 } + +#define IOF_STRING_INIT(buffer, size) \ { {{ (uint8_t *)(buffer), (uint8_t *)(buffer), (uint8_t *)(buffer) + size }}, size, NULL, { NULL }, 0|IOF_READER|IOF_DATA, 0 } -#define IOF_STRING() IOF_STRING_STRUCT(0, 0) +#define IOF_STRING() IOF_STRING_INIT(0, 0) /* refcount */ diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemallc.h b/texk/web2c/luatexdir/luapplib/src/util/utilmemallc.h index 57d268c..5471f4a 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemallc.h +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemallc.h @@ -114,45 +114,38 @@ iof interface ============= -iof is an independent interface for buffers written/read byte-by-byte. If used together with allocators, the provides a convenient -way to write byte data to the heap or stock, without a need for intermediate buffers. The idea is to have iof buffer always ready -for writing into the heap or stock. The buffer is setup just once, with - - iof *output = buffer_init(heap, iof) // calls some(heap, 0) - -Then one can write to iof with - - iof_put(output, char); - iof_write(output, string); - iof_ensure(output, bytes); - .... - -iof keeps pointers to the beginning of buffer, end of buffer, and current position. Once the position reaches the end, the iof -internal handler updates the buffer providing more space to write. In that case, updating the buffer means settings buf/pos/end -pointers according to a data pointer and space returned by more(). From the user perspective, this pretends a countinuous space -for writing, without bothering about buffer boundaries. +iof is an independent interface for buffers written/read byte-by-byte. When used together with allocators, it provides +a convenient way to write byte data to the heap or stock, without a need for intermediate buffers. The buffer is setup with + + iof output, *O + O = buffer_init(heap, &output); // doesn't allocate anything + +or + + output = BUFFER_INIT(heap); // doesn't allocate anything + O = &output; + +iof keeps pointers to the beginning of the buffer, end of buffer, and current position. Once the position reaches the end, +the iof internal handler updates the buffer providing more space to write. When used in conjunction with heap or stock, +the space to write is the space provided by the heap or stock. To start the buffer session: + + O = buffer_some(heap, O, atleast) // ensure iof *O to have atleast bytes to be written Once you are done with writing some chunk - iof_flush() // calls done() and some() again + buffer_done(heap, O) + +instead of buffer_done(), one may also use + + iof_flush(O) // calls buffer_done() and buffer_some() again -updates the underlying heap or stock, and makes the iof ready for a new chunk. iof it self does not allocate a memory, so it -doesn't need finalizer, iof_close(output) does nothing. So the cycle looks as follows: - - buffer_init(heap, iof) - ... iof_flush(iof) - ... iof_flush(iof) - ... +which updates the underlying heap or stock, and makes the iof ready for a new chunk. iof itself does not allocate a memory, +so it doesn't need finalizer. iof_close(output) does nothing. To drop the buffer use: + + buffer_giveup(heap, O) // restore the from before buffer_some() More often then not, we need to specify a minimal space for buffer each time, eg. for memcpy() or so. The actual space left -can be checked with iof_left(iof), the space for recent chunk is iof->space. - -We can also work as follows: - - buffer_init(heap, iof) - buffer_some(heap, iof) ... ... data = iof_writer_result(iof, &size) - buffer_some(heap, iof) ... ... data = iof_writer_result(iof, &size) - ... +can be checked with iof_left(O). The entire space of recent chunk is O->space (eq. O->end - O->buf). Identical interface for heap and stock. @@ -328,6 +321,17 @@ to 4 bytes, heap64_take() returns a pointer aligned to 8 bytes. You can ask for any data length, but in practise you'll always obtain 1N, 2N, 4N or 8N. Alignment implies data padding unless the user requests for "aligned" sizes. In statistics the padding is not considered a waste. + +Zeroing +======= + +All heap, stock and pool may return zeroed memory chunks, depending on initial flags: + + HEAP_ZERO + STOCK_ZERO + POOL_ZERO + +There are also take0() variants that simply return memset(take(), 0, size), regardless the flag. */ #ifndef UTIL_MEM_ALLC_C @@ -346,18 +350,18 @@ #include // printf() #include "utilmem.h" -//#include "utilmemallh.h" - -#if 0 // for a while + +//#if defined(DEBUG) && debug != 0 +#if 1 +# define ASSERT8(cond) ((void)((cond) || (printf("8bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) +# define ASSERT16(cond) ((void)((cond) || (printf("16bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) +# define ASSERT32(cond) ((void)((cond) || (printf("32bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) +# define ASSERT64(cond) ((void)((cond) || (printf("64bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) +#else # define ASSERT8(cond) (void)0 # define ASSERT16(cond) (void)0 # define ASSERT32(cond) (void)0 # define ASSERT64(cond) (void)0 -#else -# define ASSERT8(cond) ((void)((cond) || (printf("8bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) -# define ASSERT16(cond) ((void)((cond) || (printf("16bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) -# define ASSERT32(cond) ((void)((cond) || (printf("32bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) -# define ASSERT64(cond) ((void)((cond) || (printf("64bit allocator assertion, %s:%d: %s\n", __FILE__, __LINE__, #cond), 0))) #endif #if defined(UTIL_MEM_STOCK_H) || defined(UTIL_MEM_POOL_H) @@ -474,9 +478,9 @@ /* align requested size to keep ream->data / pyre->data always aligned. size is always size_t, no insane overflow checks */ #define align_size8(size) ((void)size) -#define align_size16(size) ((void)((size & 1) ? (size += 1) : 0)) -#define align_size32(size) ((void)((size & 3) ? (size += 4 - (size & 3)) : 0)) -#define align_size64(size) ((void)((size & 7) ? (size += 8 - (size & 7)) : 0)) +#define align_size16(size) (size = aligned_size16(size)) +#define align_size32(size) (size = aligned_size32(size)) +#define align_size64(size) (size = aligned_size64(size)) /* done() and pop() operations decrements block->left space by an aligned size; block->left -= alignedwritten. Lets have 8-bytes aligned @@ -486,9 +490,9 @@ */ #define align_space8(space) ((void)space) -#define align_space16(space) ((void)((space & 1) ? (space < 0xFFFF ? (space += 1) : (space -= 1)) : 0)) -#define align_space32(space) ((void)((space & 3) ? (space < 0xFFFFFFFD ? (space += 4 - (space & 3)) : (space -= (space & 3))) : 0)) -#define align_space64(space) ((void)((space & 7) ? (space < 0xFFFFFFFFFFFFFFF8ULL ? (space += 8 - (space & 7)) : (space -= (space & 7))) : 0)) +#define align_space16(space) (space = aligned_space16(space)) +#define align_space32(space) (space = aligned_space32(space)) +#define align_space64(space) (space = aligned_space64(space)) /* handling ghost structure (stock and pool) */ diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemallh.h b/texk/web2c/luatexdir/luapplib/src/util/utilmemallh.h index de448ec..a543d1a 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemallh.h +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemallh.h @@ -12,6 +12,16 @@ typedef struct ghost32 ghost32; typedef struct ghost64 ghost64; +#define aligned_size8(size) (size) +#define aligned_size16(size) ((((size) + 1) >> 1) << 1) +#define aligned_size32(size) ((((size) + 3) >> 2) << 2) +#define aligned_size64(size) ((((size) + 7) >> 3) << 3) + +#define aligned_space8(size) (size) +#define aligned_space16(size) (((size) & 1) ? ((size) < 0xFFFF ? ((size) + 1) : ((size) - 1)) : (size)) +#define aligned_space32(size) (((size) & 3) ? ((size) < 0xFFFFFFFD ? ((size) - ((size) & 3) + 4) : (size) - ((size) & 3)) : (size)) +#define aligned_space64(size) (((size) & 7) ? ((size) < 0xFFFFFFFFFFFFFFF8ULL ? ((size) - ((size) & 7) + 8) : (size) - ((size) & 7)) : (size)) + /* info stub */ typedef struct { diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.c b/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.c index 9392f69..cce28e0 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.c +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.c @@ -437,6 +437,26 @@ return data; } +void * _heap8_take0 (heap8 *heap, size_t size) +{ + return memset(_heap8_take(heap, size), 0, size); +} + +void * _heap16_take0 (heap16 *heap, size_t size) +{ + return memset(_heap16_take(heap, size), 0, size); +} + +void * _heap32_take0 (heap32 *heap, size_t size) +{ + return memset(_heap32_take(heap, size), 0, size); +} + +void * _heap64_take0 (heap64 *heap, size_t size) +{ + return memset(_heap64_take(heap, size), 0, size); +} + /* pop last heap chunk */ #define taken_from_head(taken, head) (byte_data(taken) == head->data) @@ -462,6 +482,10 @@ head->prev = pyre->prev; pyre_free(pyre); } + else + { + ASSERT8(0); + } } void heap16_pop (heap16 *heap, void *taken, size_t size) @@ -481,6 +505,10 @@ head->prev = pyre->prev; pyre_free(pyre); } + else + { + ASSERT16(0); + } } void heap32_pop (heap32 *heap, void *taken, size_t size) @@ -500,6 +528,10 @@ head->prev = pyre->prev; pyre_free(pyre); } + else + { + ASSERT32(0); + } } void heap64_pop (heap64 *heap, void *taken, size_t size) @@ -519,6 +551,10 @@ head->prev = pyre->prev; pyre_free(pyre); } + else + { + ASSERT64(0); + } } /* heap buffer */ @@ -611,7 +647,7 @@ return void_data(pyre->data); } -void * heap8_more (heap8 *heap, void *taken, size_t written, size_t size) +void * heap8_more (heap8 *heap, void *taken, size_t written, size_t size, size_t *pspace) { pyre8 *pyre, *prev; pyre = heap->head; @@ -619,32 +655,40 @@ if (taken_from_head(taken, pyre)) { if (size <= pyre->left) - { // unlikely + { + *pspace = pyre->left; } else if (take_new_block8(heap, pyre8, pyre, size)) { pyre = heap8_new(heap); memcpy(pyre->data, taken, written); + *pspace = pyre->left; } else { pyre = heap8_sole(heap, size); memcpy(pyre->data, taken, written); + *pspace = size; } } else if (taken_from_sole(taken, pyre, prev)) { pyre = heap8_sole(heap, size); + memcpy(pyre->data, taken, written); + *pspace = size; pyre->prev = prev->prev; - memcpy(pyre->data, taken, written); pyre_free(prev); } else + { + ASSERT8(0); + *pspace = 0; return NULL; + } return void_data(pyre->data); } -void * heap16_more (heap16 *heap, void *taken, size_t written, size_t size) +void * heap16_more (heap16 *heap, void *taken, size_t written, size_t size, size_t *pspace) { pyre16 *pyre, *prev; pyre = heap->head; @@ -653,31 +697,39 @@ { if (size <= pyre->left) { + *pspace = pyre->left; } else if (take_new_block16(heap, pyre16, pyre, size)) { pyre = heap16_new(heap); memcpy(pyre->data, taken, written); + *pspace = pyre->left; } else { pyre = heap16_sole(heap, size); memcpy(pyre->data, taken, written); + *pspace = size; } } else if (taken_from_sole(taken, pyre, prev)) { pyre = heap16_sole(heap, size); + memcpy(pyre->data, taken, written); + *pspace = size; pyre->prev = prev->prev; - memcpy(pyre->data, taken, written); pyre_free(prev); } else + { + ASSERT16(0); + *pspace = 0; return NULL; + } return void_data(pyre->data); } -void * heap32_more (heap32 *heap, void *taken, size_t written, size_t size) +void * heap32_more (heap32 *heap, void *taken, size_t written, size_t size, size_t *pspace) { pyre32 *pyre, *prev; pyre = heap->head; @@ -686,31 +738,39 @@ { if (size <= pyre->left) { + *pspace = pyre->left; } else if (take_new_block32(heap, pyre32, pyre, size)) { pyre = heap32_new(heap); memcpy(pyre->data, taken, written); + *pspace = pyre->left; } else { pyre = heap32_sole(heap, size); memcpy(pyre->data, taken, written); + *pspace = size; } } else if (taken_from_sole(taken, pyre, prev)) { pyre = heap32_sole(heap, size); + memcpy(pyre->data, taken, written); + *pspace = size; pyre->prev = prev->prev; - memcpy(pyre->data, taken, written); pyre_free(prev); } else + { + ASSERT32(0); + *pspace = 0; return NULL; + } return void_data(pyre->data); } -void * heap64_more (heap64 *heap, void *taken, size_t written, size_t size) +void * heap64_more (heap64 *heap, void *taken, size_t written, size_t size, size_t *pspace) { pyre64 *pyre, *prev; pyre = heap->head; @@ -719,27 +779,35 @@ { if (size <= pyre->left) { + *pspace = pyre->left; } else if (take_new_block64(heap, pyre64, pyre, size)) { pyre = heap64_new(heap); memcpy(pyre->data, taken, written); + *pspace = pyre->left; } else { pyre = heap64_sole(heap, size); memcpy(pyre->data, taken, written); + *pspace = size; } } else if (taken_from_sole(taken, pyre, prev)) { pyre = heap64_sole(heap, size); + memcpy(pyre->data, taken, written); + *pspace = size; pyre->prev = prev->prev; - memcpy(pyre->data, taken, written); pyre_free(prev); } else + { + ASSERT64(0); + *pspace = 0; return NULL; + } return void_data(pyre->data); } @@ -759,6 +827,10 @@ pyre->data += written; pyre->chunks = 1; } + else + { + ASSERT8(0); + } } void heap16_done (heap16 *heap, void *taken, size_t written) @@ -777,6 +849,10 @@ pyre->data += written; pyre->chunks = 1; } + else + { + ASSERT16(0); + } } void heap32_done (heap32 *heap, void *taken, size_t written) @@ -795,6 +871,10 @@ pyre->data += written; pyre->chunks = 1; } + else + { + ASSERT32(0); + } } void heap64_done (heap64 *heap, void *taken, size_t written) @@ -812,6 +892,10 @@ { pyre->data += written; pyre->chunks = 1; + } + else + { + ASSERT64(0); } } diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.h b/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.h index 08f1ce2..8776419 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.h +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemheap.h @@ -93,13 +93,12 @@ }; #define HEAP_ZERO (1 << 0) -//#define HEAP_KEEP (1 << 1) #define HEAP_DEFAULTS 0 -#define HEAP8_INIT(space, large, flags) { NULL, space, large, flags } -#define HEAP16_INIT(space, large, flags) { NULL, space, large, flags } -#define HEAP32_INIT(space, large, flags) { NULL, space, large, flags } -#define HEAP64_INIT(space, large, flags) { NULL, space, large, flags } +#define HEAP8_INIT(space, large, flags) { NULL, aligned_space8(space), large, flags } +#define HEAP16_INIT(space, large, flags) { NULL, aligned_space16(space), large, flags } +#define HEAP32_INIT(space, large, flags) { NULL, aligned_space32(space), large, flags } +#define HEAP64_INIT(space, large, flags) { NULL, aligned_space64(space), large, flags } UTILAPI heap8 * heap8_init (heap8 *heap, uint8_t space, uint8_t large, uint8_t flags); UTILAPI heap16 * heap16_init (heap16 *heap, uint16_t space, uint16_t large, uint8_t flags); @@ -131,10 +130,20 @@ UTILAPI void * _heap32_take (heap32 *heap, size_t size); UTILAPI void * _heap64_take (heap64 *heap, size_t size); +UTILAPI void * _heap8_take0 (heap8 *heap, size_t size); +UTILAPI void * _heap16_take0 (heap16 *heap, size_t size); +UTILAPI void * _heap32_take0 (heap32 *heap, size_t size); +UTILAPI void * _heap64_take0 (heap64 *heap, size_t size); + #define heap8_take(heap, size) (heap8_ensure_head(heap), _heap8_take(heap, size)) #define heap16_take(heap, size) (heap16_ensure_head(heap), _heap16_take(heap, size)) #define heap32_take(heap, size) (heap32_ensure_head(heap), _heap32_take(heap, size)) #define heap64_take(heap, size) (heap64_ensure_head(heap), _heap64_take(heap, size)) + +#define heap8_take0(heap, size) (heap8_ensure_head(heap), _heap8_take0(heap, size)) +#define heap16_take0(heap, size) (heap16_ensure_head(heap), _heap16_take0(heap, size)) +#define heap32_take0(heap, size) (heap32_ensure_head(heap), _heap32_take0(heap, size)) +#define heap64_take0(heap, size) (heap64_ensure_head(heap), _heap64_take0(heap, size)) UTILAPI void heap8_pop (heap8 *heap, void *taken, size_t size); UTILAPI void heap16_pop (heap16 *heap, void *taken, size_t size); @@ -151,10 +160,10 @@ #define heap32_some(heap, size, pspace) (heap32_ensure_head(heap), _heap32_some(heap, size, pspace)) #define heap64_some(heap, size, pspace) (heap64_ensure_head(heap), _heap64_some(heap, size, pspace)) -UTILAPI void * heap8_more (heap8 *heap, void *taken, size_t written, size_t size); -UTILAPI void * heap16_more (heap16 *heap, void *taken, size_t written, size_t size); -UTILAPI void * heap32_more (heap32 *heap, void *taken, size_t written, size_t size); -UTILAPI void * heap64_more (heap64 *heap, void *taken, size_t written, size_t size); +UTILAPI void * heap8_more (heap8 *heap, void *taken, size_t written, size_t size, size_t *pspace); +UTILAPI void * heap16_more (heap16 *heap, void *taken, size_t written, size_t size, size_t *pspace); +UTILAPI void * heap32_more (heap32 *heap, void *taken, size_t written, size_t size, size_t *pspace); +UTILAPI void * heap64_more (heap64 *heap, void *taken, size_t written, size_t size, size_t *pspace); UTILAPI void heap8_done (heap8 *heap, void *taken, size_t written); UTILAPI void heap16_done (heap16 *heap, void *taken, size_t written); diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.c b/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.c index f459780..cd9609d 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.c +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.c @@ -3,7 +3,7 @@ // this is identical to stock iof suite, keep in sync -static size_t heap8_writer (iof *O, iof_mode mode) +size_t heap8_writer (iof *O, iof_mode mode) { heap8 *heap; size_t written; @@ -11,19 +11,17 @@ switch (mode) { case IOFFLUSH: - written = (size_t)iof_size(O); - heap8_done(heap, O->buf, written); + heap8_buffer_done(heap, O); O->buf = _heap8_some(heap, 0, &O->space); O->pos = O->buf; O->end = O->buf + O->space; break; case IOFWRITE: written = (size_t)iof_size(O); - O->space = written << 1; - O->buf = heap8_more(heap, O->buf, written, O->space); + O->buf = heap8_more(heap, O->buf, written, written << 1, &O->space); O->pos = O->buf + written; O->end = O->buf + O->space; - return written; // eq (space - written) + return O->space - written; case IOFCLOSE: default: break; @@ -31,7 +29,7 @@ return 0; } -static size_t heap16_writer (iof *O, iof_mode mode) +size_t heap16_writer (iof *O, iof_mode mode) { heap16 *heap; size_t written; @@ -39,19 +37,17 @@ switch (mode) { case IOFFLUSH: - written = (size_t)iof_size(O); - heap16_done(heap, O->buf, written); + heap16_buffer_done(heap, O); O->buf = _heap16_some(heap, 0, &O->space); O->pos = O->buf; O->end = O->buf + O->space; break; case IOFWRITE: written = (size_t)iof_size(O); - O->space = written << 1; - O->buf = heap16_more(heap, O->buf, written, O->space); + O->buf = heap16_more(heap, O->buf, written, written << 1, &O->space); O->pos = O->buf + written; O->end = O->buf + O->space; - return written; // eq (space - written) + return O->space - written; case IOFCLOSE: default: break; @@ -59,7 +55,7 @@ return 0; } -static size_t heap32_writer (iof *O, iof_mode mode) +size_t heap32_writer (iof *O, iof_mode mode) { heap32 *heap; size_t written; @@ -67,19 +63,17 @@ switch (mode) { case IOFFLUSH: - written = (size_t)iof_size(O); - heap32_done(heap, O->buf, written); + heap32_buffer_done(heap, O); O->buf = _heap32_some(heap, 0, &O->space); O->pos = O->buf; O->end = O->buf + O->space; break; case IOFWRITE: written = (size_t)iof_size(O); - O->space = written << 1; - O->buf = heap32_more(heap, O->buf, written, O->space); + O->buf = heap32_more(heap, O->buf, written, written << 1, &O->space); O->pos = O->buf + written; O->end = O->buf + O->space; - return written; // eq (space - written) + return O->space - written; case IOFCLOSE: default: break; @@ -87,7 +81,7 @@ return 0; } -static size_t heap64_writer (iof *O, iof_mode mode) +size_t heap64_writer (iof *O, iof_mode mode) { heap64 *heap; size_t written; @@ -95,19 +89,17 @@ switch (mode) { case IOFFLUSH: - written = (size_t)iof_size(O); - heap64_done(heap, O->buf, written); + heap64_buffer_done(heap, O); O->buf = _heap64_some(heap, 0, &O->space); O->pos = O->buf; O->end = O->buf + O->space; break; case IOFWRITE: written = (size_t)iof_size(O); - O->space = written << 1; - O->buf = heap64_more(heap, O->buf, written, O->space); + O->buf = heap64_more(heap, O->buf, written, written << 1, &O->space); O->pos = O->buf + written; O->end = O->buf + O->space; - return written; // eq (space - written) + return O->space - written; case IOFCLOSE: default: break; @@ -115,51 +107,9 @@ return 0; } -/* buffer init (made once) */ - -iof * heap8_buffer_init (heap8 *heap, iof *O) -{ - void *data; - size_t space; - data = heap8_some(heap, 0, &space); - if (iof_writer(O, (void *)heap, heap8_writer, data, space) == NULL) // sanity - return NULL; - return O; -} - -iof * heap16_buffer_init (heap16 *heap, iof *O) -{ - void *data; - size_t space; - data = heap16_some(heap, 0, &space); - if (iof_writer(O, (void *)heap, heap16_writer, data, space) == NULL) - return NULL; - return O; -} - -iof * heap32_buffer_init (heap32 *heap, iof *O) -{ - void *data; - size_t space; - data = heap32_some(heap, 0, &space); - if (iof_writer(O, (void *)heap, heap32_writer, data, space) == NULL) - return NULL; - return O; -} - -iof * heap64_buffer_init (heap64 *heap, iof *O) -{ - void *data; - size_t space; - data = heap64_some(heap, 0, &space); - if (iof_writer(O, (void *)heap, heap64_writer, data, space) == NULL) - return NULL; - return O; -} - /* buffer for some */ -iof * heap8_buffer_some (heap8 *heap, iof *O, size_t atleast) +iof * _heap8_buffer_some (heap8 *heap, iof *O, size_t atleast) { O->buf = _heap8_some(heap, atleast, &O->space); O->pos = O->buf; @@ -167,7 +117,7 @@ return O; } -iof * heap16_buffer_some (heap16 *heap, iof *O, size_t atleast) +iof * _heap16_buffer_some (heap16 *heap, iof *O, size_t atleast) { O->buf = _heap16_some(heap, atleast, &O->space); O->pos = O->buf; @@ -175,7 +125,7 @@ return O; } -iof * heap32_buffer_some (heap32 *heap, iof *O, size_t atleast) +iof * _heap32_buffer_some (heap32 *heap, iof *O, size_t atleast) { O->buf = _heap32_some(heap, atleast, &O->space); O->pos = O->buf; @@ -183,7 +133,7 @@ return O; } -iof * heap64_buffer_some (heap64 *heap, iof *O, size_t atleast) +iof * _heap64_buffer_some (heap64 *heap, iof *O, size_t atleast) { O->buf = _heap64_some(heap, atleast, &O->space); O->pos = O->buf; diff --git a/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.h b/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.h index 8384eda..1f3da7e 100644 --- a/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.h +++ b/texk/web2c/luatexdir/luapplib/src/util/utilmemheapiof.h @@ -5,14 +5,39 @@ #include "utilmemheap.h" #include "utiliof.h" -UTILAPI iof * heap8_buffer_init (heap8 *heap, iof *O); -UTILAPI iof * heap16_buffer_init (heap16 *heap, iof *O); -UTILAPI iof * heap32_buffer_init (heap32 *heap, iof *O); -UTILAPI iof * heap64_buffer_init (heap64 *heap, iof *O); +UTILAPI size_t heap8_writer (iof *O, iof_mode mode); +UTILAPI size_t heap16_writer (iof *O, iof_mode mode); +UTILAPI size_t heap32_writer (iof *O, iof_mode mode); +UTILAPI size_t heap64_writer (iof *O, iof_mode mode); -UTILAPI iof * heap8_buffer_some (heap8 *heap, iof *O, size_t atleast); -UTILAPI iof * heap16_buffer_some (heap16 *heap, iof *O, size_t atleast); -UTILAPI iof * heap32_buffer_some (heap32 *heap, iof *O, size_t atleast); -UTILAPI iof * heap64_buffer_some (heap64 *heap, iof *O, size_t atleast); +#define HEAP8_BUFFER_INIT(heap) IOF_WRITER_INIT(heap8_writer, (void *)(heap), NULL, 0, 0) +#define HEAP16_BUFFER_INIT(heap) IOF_WRITER_INIT(heap16_writer, (void *)(heap), NULL, 0, 0) +#define HEAP32_BUFFER_INIT(heap) IOF_WRITER_INIT(heap32_writer, (void *)(heap), NULL, 0, 0) +#define HEAP64_BUFFER_INIT(heap) IOF_WRITER_INIT(heap64_writer, (void *)(heap), NULL, 0, 0) + +#define heap8_buffer_init(heap, O) iof_writer(O, (void *)(heap), heap8_writer, NULL, 0) +#define heap16_buffer_init(heap, O) iof_writer(O, (void *)(heap), heap16_writer, NULL, 0) +#define heap32_buffer_init(heap, O) iof_writer(O, (void *)(heap), heap32_writer, NULL, 0) +#define heap64_buffer_init(heap, O) iof_writer(O, (void *)(heap), heap64_writer, NULL, 0) + +UTILAPI iof * _heap8_buffer_some (heap8 *heap, iof *O, size_t atleast); +UTILAPI iof * _heap16_buffer_some (heap16 *heap, iof *O, size_t atleast); +UTILAPI iof * _heap32_buffer_some (heap32 *heap, iof *O, size_t atleast); +UTILAPI iof * _heap64_buffer_some (heap64 *heap, iof *O, size_t atleast); + +#define heap8_buffer_some(heap, O, atleast) (heap8_ensure_head(heap), _heap8_buffer_some(heap, O, atleast)) +#define heap16_buffer_some(heap, O, atleast) (heap16_ensure_head(heap), _heap16_buffer_some(heap, O, atleast)) +#define heap32_buffer_some(heap, O, atleast) (heap32_ensure_head(heap), _heap32_buffer_some(heap, O, atleast)) +#define heap64_buffer_some(heap, O, atleast) (heap64_ensure_head(heap), _heap64_buffer_some(heap, O, atleast)) + +#define heap8_buffer_done(heap, O) heap8_done(heap, (O)->buf, (size_t)iof_size(O)) +#define heap16_buffer_done(heap, O) heap16_done(heap, (O)->buf, (size_t)iof_size(O)) +#define heap32_buffer_done(heap, O) heap32_done(heap, (O)->buf, (size_t)iof_size(O)) +#define heap64_buffer_done(heap, O) heap64_done(heap, (O)->buf, (size_t)iof_size(O)) + +#define heap8_buffer_giveup(heap, O) heap8_giveup(heap, (O)->buf) +#define heap16_buffer_giveup(heap, O) heap16_giveup(heap, (O)->buf) +#define heap32_buffer_giveup(heap, O) heap32_giveup(heap, (O)->buf) +#define heap64_buffer_giveup(heap, O) heap64_giveup(heap, (O)->buf) #endifdiff --git a/texk/web2c/luatexdir/luatex_svnversion.h b/texk/web2c/luatexdir/luatex_svnversion.h index 3ca997f..3cce7d0 100644 --- a/texk/web2c/luatexdir/luatex_svnversion.h +++ b/texk/web2c/luatexdir/luatex_svnversion.h @@ -1 +1 @@ -#define luatex_svn_revision 7289 +#define luatex_svn_revision 7306 diff --git a/texk/web2c/mplibdir/ChangeLog b/texk/web2c/mplibdir/ChangeLog index b6f1945..a03ed1a 100644 --- a/texk/web2c/mplibdir/ChangeLog +++ b/texk/web2c/mplibdir/ChangeLog @@ -1,6 +1,9 @@ +2020-02-18 Luigi Scarso + * better mp_snprintf macro + + 2019-03-06 Luigi Scarso * Code clean-up. - 2019-02-06: Taco Hoekwater * New primitive void: convert a suffix to a boolean. Work in progress. diff --git a/texk/web2c/mplibdir/mp.w b/texk/web2c/mplibdir/mp.w index 279739f..69eeb57 100644 --- a/texk/web2c/mplibdir/mp.w +++ b/texk/web2c/mplibdir/mp.w @@ -2960,15 +2960,8 @@ } @ @= -/*int mp_snprintf_res ;*/ -/* Some compilers (i.e. gcc 8.2.0 ) complained with the old */ -/* #define mp_snprintf (void)snprintf */ -/* about truncation. For the moment we store the result. */ -/*# define mp_snprintf mp_snprintf_res=snprintf */ -/* Now gcc 10 does't like common symbols, so we switch back */ -/* to the old define. */ -#define mp_snprintf (void)snprintf - +/* Avoid warning on format truncation */ +#define mp_snprintf(...) (snprintf(__VA_ARGS__) < 0 ? abort() : (void)0) @* Dynamic memory allocation. diff --git a/utils/autosp/TLpatches/ChangeLog b/utils/autosp/TLpatches/ChangeLog index 8a5398e..7633baa 100644 --- a/utils/autosp/TLpatches/ChangeLog +++ b/utils/autosp/TLpatches/ChangeLog @@ -1,3 +1,8 @@ +2020-03-11 Karl Berry + + Import autosp-2020-03-11. + * patch-01-binary-write: Remove, now upstream + 2020-02-07 Akira Kakuto Import autosp-2020-02-06. diff --git a/utils/autosp/TLpatches/patch-01-binary-write b/utils/autosp/TLpatches/patch-01-binary-write deleted file mode 100644 index b5a2d57..0000000 --- a/utils/autosp/TLpatches/patch-01-binary-write +++ /dev/null @@ -1,75 +0,0 @@ -diff -ur autosp-2020-02-06/autosp.c autosp-src/autosp.c ---- autosp-2020-02-06/autosp.c Thu Feb 06 23:00:34 2020 -+++ autosp-src/autosp.c Fri Feb 07 07:43:38 2020 -@@ -221,7 +221,7 @@ - } - else - { -- outfile = fopen (outfilename, "w"); -+ outfile = fopen (outfilename, "wb"); - if (outfile == NULL) - { printf ("Can't open %s\n", outfilename); - exit (EXIT_FAILURE); -@@ -239,7 +239,7 @@ - *logfilename_n = '\0'; - append (logfilename, &logfilename_n, "alog", sizeof (logfilename)); - if (debug) -- { logfile = fopen (logfilename, "w"); -+ { logfile = fopen (logfilename, "wb"); - if (logfile == NULL) - { printf ("Can't open %s\n", logfilename); - exit (EXIT_FAILURE); -diff -ur autosp-2020-02-06/rebar.c autosp-src/rebar.c ---- autosp-2020-02-06/rebar.c Thu Feb 06 16:22:35 2020 -+++ autosp-src/rebar.c Fri Feb 07 07:44:13 2020 -@@ -264,7 +264,7 @@ - else - append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename)); - } -- outfile = fopen (outfilename, "w"); -+ outfile = fopen (outfilename, "wb"); - if (outfile == NULL) - { fprintf (stderr,"Can't open %s\n", outfilename); - exit (EXIT_FAILURE); -diff -ur autosp-2020-02-06/spacing_note.c autosp-src/spacing_note.c ---- autosp-2020-02-06/spacing_note.c Thu Feb 06 16:22:35 2020 -+++ autosp-src/spacing_note.c Fri Feb 07 07:47:00 2020 -@@ -30,7 +30,7 @@ - update_global_skip (n); - /* commas will be discarded by filter_output (i) */ - if (*s == '.' && new_beaming == 0 && !dottedbeamnotes) -- spacing = spacing * 1.50; -+ spacing = (int)(spacing * 1.50); - else if ( (*s == '^' || *s == '_' || *s == '=' || *s == '>') - && !vspacing_active[i] /* is additional spacing needed? */ - ) -@@ -532,7 +532,7 @@ - || prefix ("\\qbpp", s) - || prefix ("\\dspp", s) - || doubledotted ) -- { spacing *= 1.75; doubledotted = false;} -+ { spacing = (int)(spacing * 1.75); doubledotted = false;} - else - if (prefix ("\\whp", s) - || prefix ("\\hup", s) -@@ -556,7 +556,7 @@ - || prefix ("\\qbp", s) - || prefix ("\\dsp", s) - || dotted ) -- { spacing *= 1.5; dotted = false; } -+ { spacing = (int)(spacing * 1.5); dotted = false; } - - t = strpbrk (s+1, "{\\&|$"); /* collective coding? */ - if (*t == '{') /* {...} */ -diff -ur autosp-2020-02-06/tex2aspc.c autosp-src/tex2aspc.c ---- autosp-2020-02-06/tex2aspc.c Thu Feb 06 16:22:35 2020 -+++ autosp-src/tex2aspc.c Fri Feb 07 07:47:30 2020 -@@ -342,7 +342,7 @@ - append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename)); - } - -- outfile = fopen (outfilename, "w"); -+ outfile = fopen (outfilename, "wb"); - if (outfile == NULL) - { printf ("Can't open %s\n", outfilename); - exit (EXIT_FAILURE); diff --git a/utils/autosp/autosp-src/ChangeLog b/utils/autosp/autosp-src/ChangeLog index 6c6367c..722b274 100644 --- a/utils/autosp/autosp-src/ChangeLog +++ b/utils/autosp/autosp-src/ChangeLog @@ -1,4 +1,8 @@ AUTOSP + +2020-02-09 + + correct \Cpause handling at \alaligne when \TransformNotes is used 2019-12-22 diff --git a/utils/autosp/autosp-src/README b/utils/autosp/autosp-src/README index 779d7a9..c71416b 100644 --- a/utils/autosp/autosp-src/README +++ b/utils/autosp/autosp-src/README @@ -1,5 +1,5 @@ This is the README for the autosp package, -version 2019-12-22. +version 2020-02-06. autosp is a preprocessor that generates note-spacing commands for MusiXTeX scores. It simplifies the creation diff --git a/utils/autosp/autosp-src/autosp.c b/utils/autosp/autosp-src/autosp.c index 77add3b..c260692 100644 --- a/utils/autosp/autosp-src/autosp.c +++ b/utils/autosp/autosp-src/autosp.c @@ -1,4 +1,4 @@ -char version[12] = "2020-02-06"; +char version[12] = "2020-03-11"; /* Copyright (C) 2014-20 R. D. Tennent School of Computing, * Queen's University, rdt@cs.queensu.ca @@ -221,7 +221,7 @@ } else { - outfile = fopen (outfilename, "wb"); + outfile = fopen (outfilename, "w"); if (outfile == NULL) { printf ("Can't open %s\n", outfilename); exit (EXIT_FAILURE); @@ -239,7 +239,7 @@ *logfilename_n = '\0'; append (logfilename, &logfilename_n, "alog", sizeof (logfilename)); if (debug) - { logfile = fopen (logfilename, "wb"); + { logfile = fopen (logfilename, "w"); if (logfile == NULL) { printf ("Can't open %s\n", logfilename); exit (EXIT_FAILURE); diff --git a/utils/autosp/autosp-src/configure b/utils/autosp/autosp-src/configure index 470284c..678659f 100755 --- a/utils/autosp/autosp-src/configure +++ b/utils/autosp/autosp-src/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for autosp 2020-02-06. +# Generated by GNU Autoconf 2.69 for autosp 2020-03-11. # # Report bugs to . # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='autosp' PACKAGE_TARNAME='autosp' -PACKAGE_VERSION='2020-02-06' -PACKAGE_STRING='autosp 2020-02-06' +PACKAGE_VERSION='2020-03-11' +PACKAGE_STRING='autosp 2020-03-11' PACKAGE_BUGREPORT='rdt@cs.queensu.ca' PACKAGE_URL='' @@ -1265,7 +1265,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures autosp 2020-02-06 to adapt to many kinds of systems. +\`configure' configures autosp 2020-03-11 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1331,7 +1331,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of autosp 2020-02-06:";; + short | recursive ) echo "Configuration of autosp 2020-03-11:";; esac cat <<\_ACEOF @@ -1422,7 +1422,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -autosp configure 2020-02-06 +autosp configure 2020-03-11 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1845,7 +1845,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by autosp $as_me 2020-02-06, which was +It was created by autosp $as_me 2020-03-11, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2708,7 +2708,7 @@ # Define the identity of the package. PACKAGE='autosp' - VERSION='2020-02-06' + VERSION='2020-03-11' cat >>confdefs.h <<_ACEOF @@ -4974,7 +4974,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by autosp $as_me 2020-02-06, which was +This file was extended by autosp $as_me 2020-03-11, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5040,7 +5040,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -autosp config.status 2020-02-06 +autosp config.status 2020-03-11 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/utils/autosp/autosp-src/configure.ac b/utils/autosp/autosp-src/configure.ac index ae531df..bee28d2 100644 --- a/utils/autosp/autosp-src/configure.ac +++ b/utils/autosp/autosp-src/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.63) -AC_INIT([autosp],[2020-02-06],[rdt@cs.queensu.ca]) +AC_INIT([autosp],[2020-03-11],[rdt@cs.queensu.ca]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE AC_CONFIG_HEADERS([config.h]) diff --git a/utils/autosp/autosp-src/process_command.c b/utils/autosp/autosp-src/process_command.c index 154ac17..29af63c 100644 --- a/utils/autosp/autosp-src/process_command.c +++ b/utils/autosp/autosp-src/process_command.c @@ -1009,15 +1009,24 @@ else if (atnextbar) { fprintf (outfile, "\\def\\atnextbar{\\znotes"); - for (i=1; i <= nstaffs; i++) + t = TransformNotes2; + while (true) { + s = strchr (t, '#'); + if (s == NULL) + break; + while (t < s) /* output any initial \transpose etc. */ + { putc (*t, outfile); t++; } + t++; /* skip # */ + i = atoi (t) -1; t++; if (active[i]) { if (bar_rest[i]) fprintf (outfile, "\\centerpause"); bar_rest[i] = false; } - if ( terminator[i] != '$') putc (terminator[i], outfile); + if (*t != '\0') + { putc (*t, outfile); t++; } /* terminator */ } fprintf (outfile, "\\en}%%\n"); if (Changeclefs) /* \Changeclefs has to be output after \def\atnextbar... */ diff --git a/utils/autosp/autosp-src/rebar.c b/utils/autosp/autosp-src/rebar.c index cd1f785..2e62557 100644 --- a/utils/autosp/autosp-src/rebar.c +++ b/utils/autosp/autosp-src/rebar.c @@ -264,7 +264,7 @@ else append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename)); } - outfile = fopen (outfilename, "wb"); + outfile = fopen (outfilename, "w"); if (outfile == NULL) { fprintf (stderr,"Can't open %s\n", outfilename); exit (EXIT_FAILURE); diff --git a/utils/autosp/autosp-src/spacing_note.c b/utils/autosp/autosp-src/spacing_note.c index 631ff1b..eaa3775 100644 --- a/utils/autosp/autosp-src/spacing_note.c +++ b/utils/autosp/autosp-src/spacing_note.c @@ -30,7 +30,7 @@ update_global_skip (n); /* commas will be discarded by filter_output (i) */ if (*s == '.' && new_beaming == 0 && !dottedbeamnotes) - spacing = (int)(spacing * 1.50); + spacing = spacing * 1.50; else if ( (*s == '^' || *s == '_' || *s == '=' || *s == '>') && !vspacing_active[i] /* is additional spacing needed? */ ) @@ -532,7 +532,7 @@ || prefix ("\\qbpp", s) || prefix ("\\dspp", s) || doubledotted ) - { spacing = (int)(spacing * 1.75); doubledotted = false;} + { spacing *= 1.75; doubledotted = false;} else if (prefix ("\\whp", s) || prefix ("\\hup", s) @@ -556,7 +556,7 @@ || prefix ("\\qbp", s) || prefix ("\\dsp", s) || dotted ) - { spacing = (int)(spacing * 1.5); dotted = false; } + { spacing *= 1.5; dotted = false; } t = strpbrk (s+1, "{\\&|$"); /* collective coding? */ if (*t == '{') /* {...} */ diff --git a/utils/autosp/autosp-src/tests/quod2.tex b/utils/autosp/autosp-src/tests/quod2.tex index 0bd05c0..e3006d5 100644 --- a/utils/autosp/autosp-src/tests/quod2.tex +++ b/utils/autosp/autosp-src/tests/quod2.tex @@ -1,4 +1,4 @@ -% Generated by autosp (2020-02-06). +% Generated by autosp (2020-03-11). \input musixtex \input musixplt \input soul.sty diff --git a/utils/autosp/autosp-src/tex2aspc.c b/utils/autosp/autosp-src/tex2aspc.c index 23fd090..d5ba3ff 100644 --- a/utils/autosp/autosp-src/tex2aspc.c +++ b/utils/autosp/autosp-src/tex2aspc.c @@ -342,7 +342,7 @@ append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename)); } - outfile = fopen (outfilename, "wb"); + outfile = fopen (outfilename, "w"); if (outfile == NULL) { printf ("Can't open %s\n", outfilename); exit (EXIT_FAILURE); diff --git a/utils/autosp/configure b/utils/autosp/configure index 4dae76d..2018c6a 100755 --- a/utils/autosp/configure +++ b/utils/autosp/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for autosp (TeX Live) 2020-02-06. +# Generated by GNU Autoconf 2.69 for autosp (TeX Live) 2020-03-11. # # Report bugs to . # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='autosp (TeX Live)' PACKAGE_TARNAME='autosp--tex-live-' -PACKAGE_VERSION='2020-02-06' -PACKAGE_STRING='autosp (TeX Live) 2020-02-06' +PACKAGE_VERSION='2020-03-11' +PACKAGE_STRING='autosp (TeX Live) 2020-03-11' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1278,7 +1278,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures autosp (TeX Live) 2020-02-06 to adapt to many kinds of systems. +\`configure' configures autosp (TeX Live) 2020-03-11 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1345,7 +1345,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of autosp (TeX Live) 2020-02-06:";; + short | recursive ) echo "Configuration of autosp (TeX Live) 2020-03-11:";; esac cat <<\_ACEOF @@ -1442,7 +1442,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -autosp (TeX Live) configure 2020-02-06 +autosp (TeX Live) configure 2020-03-11 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1865,7 +1865,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by autosp (TeX Live) $as_me 2020-02-06, which was +It was created by autosp (TeX Live) $as_me 2020-03-11, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3789,7 +3789,7 @@ # Define the identity of the package. PACKAGE='autosp--tex-live-' - VERSION='2020-02-06' + VERSION='2020-03-11' cat >>confdefs.h <<_ACEOF @@ -5973,7 +5973,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by autosp (TeX Live) $as_me 2020-02-06, which was +This file was extended by autosp (TeX Live) $as_me 2020-03-11, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6030,7 +6030,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -autosp (TeX Live) config.status 2020-02-06 +autosp (TeX Live) config.status 2020-03-11 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/utils/autosp/configure.ac b/utils/autosp/configure.ac index 9dc68c7..17252e2 100644 --- a/utils/autosp/configure.ac +++ b/utils/autosp/configure.ac @@ -1,13 +1,13 @@ dnl $Id$ dnl Process this file with autoconf to produce a configure script. dnl -dnl Copyright 2016-2018 Karl Berry +dnl Copyright 2016-2020 Karl Berry dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl -m4_define([autosp_version], [2020-02-06])[]dnl using unmodified autosp source +m4_define([autosp_version], [2020-03-11])[]dnl using unmodified autosp source AC_INIT([autosp (TeX Live)], autosp_version, [tex-k@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([autosp-src/autosp.c]) diff --git a/utils/configure b/utils/configure index e81248b..0b98db1 100755 --- a/utils/configure +++ b/utils/configure @@ -3337,7 +3337,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajittex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajittex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajittex'" ;; #( @@ -3350,7 +3350,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-luajithbtex'" >&5 $as_echo "$as_me: $host -> \`--disable-luajithbtex'" >&6;} ac_configure_args="$ac_configure_args '--disable-luajithbtex'" ;; #( @@ -3363,7 +3363,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit'" ;; #( @@ -3376,7 +3376,7 @@ : ;; #( *) : case $host in #( - alpha* | sparc* | x86_64-*-solaris* | powerpc-*-darwin* ) : + alpha* | sparc* | x86_64-*-solaris* | powerpc-* ) : { $as_echo "$as_me:${as_lineno-$LINENO}: $host -> \`--disable-mfluajit-nowin'" >&5 $as_echo "$as_me: $host -> \`--disable-mfluajit-nowin'" >&6;} ac_configure_args="$ac_configure_args '--disable-mfluajit-nowin'" ;; #(