diff options
author | davidovski <david@davidovski.xyz> | 2022-05-04 23:52:30 +0100 |
---|---|---|
committer | davidovski <david@davidovski.xyz> | 2022-05-04 23:52:30 +0100 |
commit | 739c65c54cb0e957df5e9b76f93fb02554e5cac3 (patch) | |
tree | 09ddfa0a342f3ea9de136cb50abdd79821bf1b53 /repo | |
parent | 4c585ad54388285500fd18a6aaa516894e0f2c16 (diff) |
moved everything to new file formatting
Diffstat (limited to 'repo')
-rw-r--r-- | repo/apps/arandr/arandr.xibuild (renamed from repo/apps/arandr.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/chromium/chromium-VirtualCursor-standard-layout.patch | 216 | ||||
-rw-r--r-- | repo/apps/chromium/chromium-launcher.sh | 41 | ||||
-rw-r--r-- | repo/apps/chromium/chromium-revert-drop-of-system-java.patch | 15 | ||||
-rw-r--r-- | repo/apps/chromium/chromium-use-alpine-target.patch | 24 | ||||
-rw-r--r-- | repo/apps/chromium/chromium.conf | 5 | ||||
-rw-r--r-- | repo/apps/chromium/chromium.desktop | 10 | ||||
-rw-r--r-- | repo/apps/chromium/chromium.xibuild (renamed from repo/apps/chromium.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/chromium/credentials-header.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/default-pthread-stacksize.patch | 45 | ||||
-rw-r--r-- | repo/apps/chromium/elf-arm.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/enable-GlobalMediaControlsCastStartStop.patch | 32 | ||||
-rw-r--r-- | repo/apps/chromium/fix-narrowing-cast.patch | 53 | ||||
-rw-r--r-- | repo/apps/chromium/fix-unittests-sandbox.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/gcc-arm.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/gdbinit.patch | 21 | ||||
-rw-r--r-- | repo/apps/chromium/google-api.keys | 10 | ||||
-rw-r--r-- | repo/apps/chromium/media-base.patch | 10 | ||||
-rw-r--r-- | repo/apps/chromium/memory-tagging-arm64.patch | 18 | ||||
-rw-r--r-- | repo/apps/chromium/musl-crashpad.patch | 25 | ||||
-rw-r--r-- | repo/apps/chromium/musl-fixes.patch | 221 | ||||
-rw-r--r-- | repo/apps/chromium/musl-hacks.patch | 98 | ||||
-rw-r--r-- | repo/apps/chromium/musl-libc++.patch | 51 | ||||
-rw-r--r-- | repo/apps/chromium/musl-sandbox.patch | 176 | ||||
-rw-r--r-- | repo/apps/chromium/musl-stat.patch | 12 | ||||
-rw-r--r-- | repo/apps/chromium/musl-tid-caching.patch | 81 | ||||
-rw-r--r-- | repo/apps/chromium/musl-v8-monotonic-pthread-cont_timedwait.patch | 22 | ||||
-rw-r--r-- | repo/apps/chromium/nasm.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/no-execinfo.patch | 75 | ||||
-rw-r--r-- | repo/apps/chromium/no-getcontext.patch | 26 | ||||
-rw-r--r-- | repo/apps/chromium/no-mallinfo.patch | 83 | ||||
-rw-r--r-- | repo/apps/chromium/quiche-arena-size.patch | 11 | ||||
-rw-r--r-- | repo/apps/chromium/remove-strip_binary.patch | 32 | ||||
-rw-r--r-- | repo/apps/chromium/resolver.patch | 36 | ||||
-rw-r--r-- | repo/apps/chromium/revert-use-ffile-compilation-dir.patch | 48 | ||||
-rw-r--r-- | repo/apps/chromium/scoped-file.patch | 31 | ||||
-rw-r--r-- | repo/apps/chromium/sql-make-VirtualCursor-standard-layout-type.patch | 238 | ||||
-rw-r--r-- | repo/apps/chromium/system-opus.patch | 52 | ||||
-rw-r--r-- | repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch | 12 | ||||
-rw-r--r-- | repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch.1 | 12 | ||||
-rw-r--r-- | repo/apps/chromium/use-deprecated-ffmpeg-api.patch | 36 | ||||
-rw-r--r-- | repo/apps/chromium/use-deprecated-ffmpeg-api.patch.1 | 36 | ||||
-rw-r--r-- | repo/apps/chromium/use-oauth2-client-switches-as-default.patch | 17 | ||||
-rw-r--r-- | repo/apps/chromium/wayland-egl.patch | 22 | ||||
-rw-r--r-- | repo/apps/chromium/webcodecs-stop-using-AudioOpusEncoder.patch | 49 | ||||
-rw-r--r-- | repo/apps/chromium/webrtc-check-existence-of-cursor-metadata.patch | 31 | ||||
-rw-r--r-- | repo/apps/feh/feh.xibuild (renamed from repo/apps/feh.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/links/links.xibuild (renamed from repo/apps/links.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/lynx/lynx.xibuild (renamed from repo/apps/lynx.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/mpv/mpv.xibuild (renamed from repo/apps/mpv.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/ncmpcpp/ncmpcpp.xibuild (renamed from repo/apps/ncmpcpp.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/neovim/neovim.xibuild (renamed from repo/apps/neovim.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/pcmanfm/pcmanfm.xibuild (renamed from repo/apps/pcmanfm.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/polybar/fix-version.patch | 11 | ||||
-rw-r--r-- | repo/apps/polybar/polybar.xibuild (renamed from repo/apps/polybar.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/rxvt-unicode/rxvt-unicode.xibuild (renamed from repo/apps/rxvt-unicode.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/vim/vim.xibuild (renamed from repo/apps/vim.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/xclock-cat/xclock-cat.xibuild (renamed from repo/apps/xclock-cat.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/xlinks/links.desktop | 8 | ||||
-rw-r--r-- | repo/apps/xlinks/xlinks.xibuild (renamed from repo/apps/xlinks.xibuild) | 0 | ||||
-rw-r--r-- | repo/apps/xterm/posix-ptys.patch | 21 | ||||
-rw-r--r-- | repo/apps/xterm/xterm.xibuild (renamed from repo/apps/xterm.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/asciidoc/asciidoc.xibuild (renamed from repo/devel/asciidoc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/autoconf-archive/autoconf-archive.xibuild (renamed from repo/devel/autoconf-archive.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/autoconf/autoconf.xibuild (renamed from repo/devel/autoconf.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/autoconf2-13/autoconf2-13.xibuild (renamed from repo/devel/autoconf2-13.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/automake/automake.xibuild (renamed from repo/devel/automake.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/bc/bc.xibuild (renamed from repo/devel/bc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/bison/bison.xibuild (renamed from repo/devel/bison.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/boost/0001-revert-cease-dependence-on-range.patch | 1 | ||||
-rw-r--r-- | repo/devel/boost/boost-1.57.0-python-abi_letters.patch | 62 | ||||
-rw-r--r-- | repo/devel/boost/boost-1.57.0-python-libpython_dep.patch | 13 | ||||
-rw-r--r-- | repo/devel/boost/boost.xibuild (renamed from repo/devel/boost.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/boost/python-3.10.patch | 49 | ||||
-rw-r--r-- | repo/devel/cbindgen/cbindgen.xibuild (renamed from repo/devel/cbindgen.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/check/check.xibuild (renamed from repo/devel/check.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/clang/clang.xibuild (renamed from repo/devel/clang.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/clang/patches/10-add-musl-triples.patch | 35 | ||||
-rw-r--r-- | repo/devel/clang/patches/30-Enable-stack-protector-by-default-for-Alpine-Linux.patch | 81 | ||||
-rw-r--r-- | repo/devel/cmake-extra/cmake-extra.xibuild (renamed from repo/devel/cmake-extra.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/cmake-modules/cmake-modules.xibuild (renamed from repo/devel/cmake-modules.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/cmake/cmake.xibuild (renamed from repo/devel/cmake.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/compiler-rt/compiler-rt.xibuild (renamed from repo/devel/compiler-rt.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/compiler-rt/link-execinfo.patch | 11 | ||||
-rw-r--r-- | repo/devel/dejagnu/dejagnu.xibuild (renamed from repo/devel/dejagnu.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/distcc/dcc_gcc_rewrite_fqn-avoid-heap-corruption.patch | 65 | ||||
-rw-r--r-- | repo/devel/distcc/distcc-hardened.patch | 24 | ||||
-rw-r--r-- | repo/devel/distcc/distcc.xibuild (renamed from repo/devel/distcc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/distcc/gcc-10.patch | 15 | ||||
-rw-r--r-- | repo/devel/docbook-dtd/docbook-dtd.xibuild (renamed from repo/devel/docbook-dtd.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/docbook-xml/docbook-xml.xibuild (renamed from repo/devel/docbook-xml.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/docbook-xsl/docbook-xsl.xibuild (renamed from repo/devel/docbook-xsl.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/docbook4-xml/docbook4-xml.xibuild (renamed from repo/devel/docbook4-xml.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/expect/expect.xibuild (renamed from repo/devel/expect.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/flex/flex.xibuild (renamed from repo/devel/flex.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/gcc/gcc.xibuild (renamed from repo/devel/gcc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/gdb/gdb.xibuild (renamed from repo/devel/gdb.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/git/git.xibuild (renamed from repo/devel/git.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/go/go.xibuild (renamed from repo/devel/go.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/gtk-doc/gtk-doc.xibuild (renamed from repo/devel/gtk-doc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/help2man/help2man.xibuild (renamed from repo/devel/help2man.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/icecream/icecream.xibuild (renamed from repo/devel/icecream.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/imake/imake.xibuild (renamed from repo/devel/imake.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/itstool/itstool.xibuild (renamed from repo/devel/itstool.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/libexecinfo/10-execinfo.patch | 64 | ||||
-rw-r--r-- | repo/devel/libexecinfo/20-define-gnu-source.patch | 24 | ||||
-rw-r--r-- | repo/devel/libexecinfo/30-linux-makefile.patch | 44 | ||||
-rw-r--r-- | repo/devel/libexecinfo/libexecinfo.xibuild (renamed from repo/devel/libexecinfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/lld/lld.xibuild (renamed from repo/devel/lld.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/llvm-libunwind/libcxx-musl.patch | 28 | ||||
-rw-r--r-- | repo/devel/llvm-libunwind/libunwind-link-libssp.patch | 20 | ||||
-rw-r--r-- | repo/devel/llvm-libunwind/llvm-libunwind.xibuild (renamed from repo/devel/llvm-libunwind.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/llvm/llvm.xibuild (renamed from repo/devel/llvm.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/m4/m4.xibuild (renamed from repo/devel/m4.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/make/make.xibuild (renamed from repo/devel/make.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/meson/meson.xibuild (renamed from repo/devel/meson.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/mpc/mpc.xibuild (renamed from repo/devel/mpc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/nasm/nasm.xibuild (renamed from repo/devel/nasm.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/ninja/ninja.xibuild (renamed from repo/devel/ninja.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/patch/patch.xibuild (renamed from repo/devel/patch.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/pkg-config/pkg-config.xibuild (renamed from repo/devel/pkg-config.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/rustc/files/check-rustc | 109 | ||||
-rw-r--r-- | repo/devel/rustc/patches/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch | 24 | ||||
-rw-r--r-- | repo/devel/rustc/patches/0007-do-not-install-libunwind-source.patch | 19 | ||||
-rw-r--r-- | repo/devel/rustc/patches/alpine-move-py-scripts-to-share.patch | 23 | ||||
-rw-r--r-- | repo/devel/rustc/patches/alpine-target.patch | 191 | ||||
-rw-r--r-- | repo/devel/rustc/patches/install-template-shebang.patch | 10 | ||||
-rw-r--r-- | repo/devel/rustc/patches/link-musl-dynamically.patch | 17 | ||||
-rw-r--r-- | repo/devel/rustc/patches/musl-fix-linux_musl_base.patch | 23 | ||||
-rw-r--r-- | repo/devel/rustc/patches/need-rpath.patch | 62 | ||||
-rw-r--r-- | repo/devel/rustc/patches/need-ssp_nonshared.patch | 13 | ||||
-rw-r--r-- | repo/devel/rustc/rustc.xibuild (renamed from repo/devel/rustc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/scdoc/scdoc.xibuild (renamed from repo/devel/scdoc.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/sgml-common/sgml-common.xibuild (renamed from repo/devel/sgml-common.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/strace/disable-fortify.patch | 39 | ||||
-rw-r--r-- | repo/devel/strace/nlattr-fix.patch | 21 | ||||
-rw-r--r-- | repo/devel/strace/strace.xibuild (renamed from repo/devel/strace.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/swig/swig.xibuild (renamed from repo/devel/swig.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/texinfo/texinfo.xibuild (renamed from repo/devel/texinfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/uthash/uthash.xibuild (renamed from repo/devel/uthash.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/vala/vala.xibuild (renamed from repo/devel/vala.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/waf/waf.xibuild (renamed from repo/devel/waf.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/xmlto/xmlto.xibuild (renamed from repo/devel/xmlto.xibuild) | 0 | ||||
-rw-r--r-- | repo/devel/xorg-cf-files/xorg-cf-files.xibuild (renamed from repo/devel/xorg-cf-files.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/encodings/encodings.xibuild (renamed from repo/font/encodings.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-adobe-utopia-type1/font-adobe-utopia-type1.xibuild (renamed from repo/font/font-adobe-utopia-type1.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-alias/font-alias.xibuild (renamed from repo/font/font-alias.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-bh-ttf/font-bh-ttf.xibuild (renamed from repo/font/font-bh-ttf.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-bh-type1/font-bh-type1.xibuild (renamed from repo/font/font-bh-type1.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-ibm-type1/font-ibm-type1.xibuild (renamed from repo/font/font-ibm-type1.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-misc-ethiopic/font-misc-ethiopic.xibuild (renamed from repo/font/font-misc-ethiopic.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-opensans/font-opensans.xibuild (renamed from repo/font/font-opensans.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-util/font-util.xibuild (renamed from repo/font/font-util.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/font-xfree86-type1/font-xfree86-type1.xibuild (renamed from repo/font/font-xfree86-type1.xibuild) | 0 | ||||
-rw-r--r-- | repo/font/fontconfig/fontconfig.xibuild (renamed from repo/font/fontconfig.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/b43-firmware/b43-firmware.xibuild (renamed from repo/linux/b43-firmware.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/b43-fwcutter/b43-fwcutter.xibuild (renamed from repo/linux/b43-fwcutter.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/linux-firmware/linux-firmware.xibuild (renamed from repo/linux/linux-firmware.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/linux-headers/linux-headers.xibuild (renamed from repo/linux/linux-headers.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/linux-src/config | 10572 | ||||
-rw-r--r-- | repo/linux/linux-src/fix-sbase-coreutils.patch | 137 | ||||
-rw-r--r-- | repo/linux/linux-src/linux-src.xibuild (renamed from repo/linux/linux-src.xibuild) | 0 | ||||
-rw-r--r-- | repo/linux/linux/linux.xibuild (renamed from repo/linux/linux.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/alsa-firmware/alsa-firmware.xibuild (renamed from repo/media/alsa-firmware.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/alsa-firmware/use-uint32_t-instead-u_int32_t.patch | 52 | ||||
-rw-r--r-- | repo/media/alsa-lib/alsa-lib.xibuild (renamed from repo/media/alsa-lib.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/alsa-plugins/alsa-plugins.xibuild (renamed from repo/media/alsa-plugins.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/alsa-tools/alsa-tools.xibuild (renamed from repo/media/alsa-tools.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/alsa-utils/alsa-utils.xibuild (renamed from repo/media/alsa-utils.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/aom/aom.xibuild (renamed from repo/media/aom.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/aom/fix-stack-size-e53da0b.patch | 78 | ||||
-rw-r--r-- | repo/media/audiofile/audiofile.xibuild (renamed from repo/media/audiofile.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/babl/babl.xibuild (renamed from repo/media/babl.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/babl/meson-0.60.patch | 12 | ||||
-rw-r--r-- | repo/media/dav1d/dav1d.xibuild (renamed from repo/media/dav1d.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/dav1d/fix-asmcheck.patch | 63 | ||||
-rw-r--r-- | repo/media/exiv2/exiv2.xibuild (renamed from repo/media/exiv2.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/faac/faac.xibuild (renamed from repo/media/faac.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/faad2/faad2.xibuild (renamed from repo/media/faad2.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/fdk-aac/fdk-aac.xibuild (renamed from repo/media/fdk-aac.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/ffmpeg/0001-ffbuild-libversion.sh-add-shebang.patch | 24 | ||||
-rw-r--r-- | repo/media/ffmpeg/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch | 55 | ||||
-rw-r--r-- | repo/media/ffmpeg/add-av_stream_get_first_dts-for-chromium.patch | 45 | ||||
-rw-r--r-- | repo/media/ffmpeg/ffmpeg.xibuild (renamed from repo/media/ffmpeg.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/ffmpeg4/0001-ffbuild-libversion.sh-add-shebang.patch | 24 | ||||
-rw-r--r-- | repo/media/ffmpeg4/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch | 55 | ||||
-rw-r--r-- | repo/media/ffmpeg4/ffmpeg4.xibuild (renamed from repo/media/ffmpeg4.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/flac/flac.xibuild (renamed from repo/media/flac.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/gexiv2/gexiv2.xibuild (renamed from repo/media/gexiv2.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/lame/lame.xibuild (renamed from repo/media/lame.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libass/libass.xibuild (renamed from repo/media/libass.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libjpeg-turbo/libjpeg-turbo.xibuild (renamed from repo/media/libjpeg-turbo.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libmpdclient/libmpdclient.xibuild (renamed from repo/media/libmpdclient.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libmypaint/libmypaint.xibuild (renamed from repo/media/libmypaint.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libogg/libogg.xibuild (renamed from repo/media/libogg.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libraw/libraw.xibuild (renamed from repo/media/libraw.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/librist/librist.xibuild (renamed from repo/media/librist.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libsamplerate/libsamplerate.xibuild (renamed from repo/media/libsamplerate.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libsndfile/libsndfile.xibuild (renamed from repo/media/libsndfile.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libsrt/fix-cmake.patch | 39 | ||||
-rw-r--r-- | repo/media/libsrt/libsrt.xibuild (renamed from repo/media/libsrt.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libtheora/libtheora.xibuild (renamed from repo/media/libtheora.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libvorbis/libvorbis.xibuild (renamed from repo/media/libvorbis.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libvpx/libvpx.xibuild (renamed from repo/media/libvpx.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/libwebp/libwebp.xibuild (renamed from repo/media/libwebp.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/mpc-mpd/mpc-mpd.xibuild (renamed from repo/media/mpc-mpd.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/mpd/libcdio-paa-version.patch | 266 | ||||
-rw-r--r-- | repo/media/mpd/libcdio-paranoia-version.patch | 13 | ||||
-rw-r--r-- | repo/media/mpd/mpd.confd | 7 | ||||
-rw-r--r-- | repo/media/mpd/mpd.initd | 25 | ||||
-rw-r--r-- | repo/media/mpd/mpd.xibuild (renamed from repo/media/mpd.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/openjpeg/b4700bc09d55ac17ff6bef9b0a867f6de527be17.patch | 77 | ||||
-rw-r--r-- | repo/media/openjpeg/fix-cmakelists.patch | 11 | ||||
-rw-r--r-- | repo/media/openjpeg/openjpeg.xibuild (renamed from repo/media/openjpeg.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/opus/opus.xibuild (renamed from repo/media/opus.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/pipewire/pipewire.xibuild (renamed from repo/media/pipewire.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/poppler/dont-enforce-build-type.patch | 26 | ||||
-rw-r--r-- | repo/media/poppler/poppler.xibuild (renamed from repo/media/poppler.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/pulseaudio/pulseaudio.xibuild (renamed from repo/media/pulseaudio.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/pulsemixer/pulsemixer.xibuild (renamed from repo/media/pulsemixer.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/soxr/soxr.xibuild (renamed from repo/media/soxr.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/tiff/CVE-2018-12900.patch | 29 | ||||
-rw-r--r-- | repo/media/tiff/tiff.xibuild (renamed from repo/media/tiff.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/v4l-utils/fix_parse_next_subopt.patch | 36 | ||||
-rw-r--r-- | repo/media/v4l-utils/types.patch | 26 | ||||
-rw-r--r-- | repo/media/v4l-utils/v4l-utils.xibuild (renamed from repo/media/v4l-utils.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/vidstab/vidstab.xibuild (renamed from repo/media/vidstab.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/wavpack/wavpack.xibuild (renamed from repo/media/wavpack.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/x264/oclobj.h | 4684 | ||||
-rw-r--r-- | repo/media/x264/x264.xibuild (renamed from repo/media/x264.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/x265/x265.xibuild (renamed from repo/media/x265.xibuild) | 0 | ||||
-rw-r--r-- | repo/media/xvidcore/xvidcore.xibuild (renamed from repo/media/xvidcore.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/all/all.xibuild (renamed from repo/meta/all.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/base-build/base-build.xibuild (renamed from repo/meta/base-build.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/base-fonts/base-fonts.xibuild (renamed from repo/meta/base-fonts.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/base-xorg/base-xorg.xibuild (renamed from repo/meta/base-xorg.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/base/base.xibuild (renamed from repo/meta/base.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-apps/repo-apps.xibuild (renamed from repo/meta/repo-apps.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-devel/repo-devel.xibuild (renamed from repo/meta/repo-devel.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-font/repo-font.xibuild (renamed from repo/meta/repo-font.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-linux/repo-linux.xibuild (renamed from repo/meta/repo-linux.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-media/repo-media.xibuild (renamed from repo/meta/repo-media.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-python/repo-python.xibuild (renamed from repo/meta/repo-python.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-system/repo-system.xibuild (renamed from repo/meta/repo-system.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-util/repo-util.xibuild (renamed from repo/meta/repo-util.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-x11/repo-x11.xibuild (renamed from repo/meta/repo-x11.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/repo-xi/repo-xi.xibuild (renamed from repo/meta/repo-xi.xibuild) | 0 | ||||
-rw-r--r-- | repo/meta/skip/skip.xibuild (renamed from repo/meta/skip.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-Jinja2/python-Jinja2.xibuild (renamed from repo/python/python-Jinja2.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-alabaster/python-alabaster.xibuild (renamed from repo/python/python-alabaster.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-appdirs/python-appdirs.xibuild (renamed from repo/python/python-appdirs.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-babel/python-babel.xibuild (renamed from repo/python/python-babel.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-certifi/python-certifi.xibuild (renamed from repo/python/python-certifi.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-chardet/python-chardet.xibuild (renamed from repo/python/python-chardet.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-docutils/python-docutils.xibuild (renamed from repo/python/python-docutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-gobject/python-gobject.xibuild (renamed from repo/python/python-gobject.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-html5lib/python-html5lib.xibuild (renamed from repo/python/python-html5lib.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-idna/python-idna.xibuild (renamed from repo/python/python-idna.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-imagesize/python-imagesize.xibuild (renamed from repo/python/python-imagesize.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-jinja/python-jinja.xibuild (renamed from repo/python/python-jinja.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-lxml/python-lxml.xibuild (renamed from repo/python/python-lxml.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-mach/python-mach.xibuild (renamed from repo/python/python-mach.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-mako/python-mako.xibuild (renamed from repo/python/python-mako.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-markupsafe/python-markupsafe.xibuild (renamed from repo/python/python-markupsafe.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-packaging/python-packaging.xibuild (renamed from repo/python/python-packaging.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-pip/python-pip.xibuild (renamed from repo/python/python-pip.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-pygments/python-pygments.xibuild (renamed from repo/python/python-pygments.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-pyparsing/python-pyparsing.xibuild (renamed from repo/python/python-pyparsing.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-pytz/python-pytz.xibuild (renamed from repo/python/python-pytz.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-requests/python-requests.xibuild (renamed from repo/python/python-requests.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-six/python-six.xibuild (renamed from repo/python/python-six.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-snowballstemmer/python-snowballstemmer.xibuild (renamed from repo/python/python-snowballstemmer.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinx-alabaster-theme/python-sphinx-alabaster-theme.xibuild (renamed from repo/python/python-sphinx-alabaster-theme.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinx/python-sphinx.xibuild (renamed from repo/python/python-sphinx.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-applehelp/python-sphinxcontrib-applehelp.xibuild (renamed from repo/python/python-sphinxcontrib-applehelp.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-devhelp/python-sphinxcontrib-devhelp.xibuild (renamed from repo/python/python-sphinxcontrib-devhelp.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-htmlhelp/python-sphinxcontrib-htmlhelp.xibuild (renamed from repo/python/python-sphinxcontrib-htmlhelp.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-jsmath/python-sphinxcontrib-jsmath.xibuild (renamed from repo/python/python-sphinxcontrib-jsmath.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-qthelp/python-sphinxcontrib-qthelp.xibuild (renamed from repo/python/python-sphinxcontrib-qthelp.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-sphinxcontrib-serializinghtml/python-sphinxcontrib-serializinghtml.xibuild (renamed from repo/python/python-sphinxcontrib-serializinghtml.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-urllib3/python-urllib3.xibuild (renamed from repo/python/python-urllib3.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python-webencodings/python-webencodings.xibuild (renamed from repo/python/python-webencodings.xibuild) | 0 | ||||
-rw-r--r-- | repo/python/python/python.xibuild (renamed from repo/python/python.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/acl/acl.xibuild (renamed from repo/system/acl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/acpid/acpid.confd | 7 | ||||
-rw-r--r-- | repo/system/acpid/acpid.initd | 28 | ||||
-rw-r--r-- | repo/system/acpid/acpid.xibuild (renamed from repo/system/acpid.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/acpid/anything | 3 | ||||
-rw-r--r-- | repo/system/acpid/handler.sh | 36 | ||||
-rw-r--r-- | repo/system/acpid/lid-closed | 21 | ||||
-rw-r--r-- | repo/system/acpid/power-supply-ac | 25 | ||||
-rw-r--r-- | repo/system/argp-standalone/argp-standalone.xibuild (renamed from repo/system/argp-standalone.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/at-spi2-atk/at-spi2-atk.xibuild (renamed from repo/system/at-spi2-atk.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/at-spi2-core/at-spi2-core.xibuild (renamed from repo/system/at-spi2-core.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/atk/atk.xibuild (renamed from repo/system/atk.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/attr/attr.xibuild (renamed from repo/system/attr.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/binutils/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch | 55 | ||||
-rw-r--r-- | repo/system/binutils/bfd-close-file-desriptor-if-there-is-no-archive-fd.patch | 234 | ||||
-rw-r--r-- | repo/system/binutils/binutils-ld-fix-static-linking.patch | 46 | ||||
-rw-r--r-- | repo/system/binutils/binutils.xibuild (renamed from repo/system/binutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/binutils/defang-no-split.patch | 38 | ||||
-rw-r--r-- | repo/system/binutils/gold-mips.patch | 39 | ||||
-rw-r--r-- | repo/system/binutils/ld-bfd-mips.patch | 19 | ||||
-rw-r--r-- | repo/system/brotli/brotli.xibuild (renamed from repo/system/brotli.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/bzip2/bzip2.xibuild (renamed from repo/system/bzip2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/c-ares/c-ares.xibuild (renamed from repo/system/c-ares.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/cacerts/cacerts.xibuild (renamed from repo/system/cacerts.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/cacerts/fix-sbase-coreutils.patch | 12 | ||||
-rw-r--r-- | repo/system/cairo/cairo.xibuild (renamed from repo/system/cairo.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/cairo/fix-mask-usage-in-image-compositor.patch | 172 | ||||
-rw-r--r-- | repo/system/cairo/musl-stacksize.patch | 23 | ||||
-rw-r--r-- | repo/system/cairo/pdf-font-subset-Generate-valid-font-names.patch | 58 | ||||
-rw-r--r-- | repo/system/dbus/dbus.confd | 7 | ||||
-rw-r--r-- | repo/system/dbus/dbus.initd | 33 | ||||
-rw-r--r-- | repo/system/dbus/dbus.trigger | 4 | ||||
-rw-r--r-- | repo/system/dbus/dbus.xibuild (renamed from repo/system/dbus.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/dhcp/01-dhclient-script-fix-bare-ip.patch | 13 | ||||
-rw-r--r-- | repo/system/dhcp/02-dhclient-script-remove-bashisms.patch | 28 | ||||
-rw-r--r-- | repo/system/dhcp/03-fix-unwind-import.patch | 16 | ||||
-rw-r--r-- | repo/system/dhcp/dhcp.xibuild (renamed from repo/system/dhcp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/dhcp/dhcpd.confd | 28 | ||||
-rw-r--r-- | repo/system/dhcp/dhcpd.initd | 115 | ||||
-rw-r--r-- | repo/system/efibootmgr/efibootmgr.xibuild (renamed from repo/system/efibootmgr.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/efivar/efivar.xibuild (renamed from repo/system/efivar.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/efivar/patches/efivar-fix-format_guid.patch | 56 | ||||
-rw-r--r-- | repo/system/efivar/patches/efivar-fix-packed.patch | 168 | ||||
-rw-r--r-- | repo/system/efivar/patches/efivar-fix-ucs2.patch | 59 | ||||
-rw-r--r-- | repo/system/efivar/patches/musl-bswap.patch | 33 | ||||
-rw-r--r-- | repo/system/elfutils/elfutils.xibuild (renamed from repo/system/elfutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/elfutils/files/error.h | 27 | ||||
-rw-r--r-- | repo/system/elfutils/patches/fix-aarch64_fregs.patch | 14 | ||||
-rw-r--r-- | repo/system/elfutils/patches/fix-uninitialized.patch | 17 | ||||
-rw-r--r-- | repo/system/elfutils/patches/musl-asm-ptrace-h.patch | 10 | ||||
-rw-r--r-- | repo/system/elfutils/patches/musl-macros.patch | 87 | ||||
-rw-r--r-- | repo/system/elfutils/patches/musl-strndupa.patch | 18 | ||||
-rw-r--r-- | repo/system/elogind/elogind.initd | 23 | ||||
-rw-r--r-- | repo/system/elogind/elogind.xibuild (renamed from repo/system/elogind.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/elogind/id-nobody.patch | 13 | ||||
-rw-r--r-- | repo/system/elogind/mips.patch | 11 | ||||
-rw-r--r-- | repo/system/elogind/ppc64-bad-tuple.patch | 25 | ||||
-rw-r--r-- | repo/system/elogind/ppcle.patch | 25 | ||||
-rw-r--r-- | repo/system/eudev/default-rules.patch | 9 | ||||
-rw-r--r-- | repo/system/eudev/eudev.xibuild (renamed from repo/system/eudev.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/eudev/load-fbcon.patch | 10 | ||||
-rw-r--r-- | repo/system/eudev/udev.initd | 22 | ||||
-rw-r--r-- | repo/system/eudev/udev_retry.initd | 31 | ||||
-rw-r--r-- | repo/system/execline/execline.xibuild (renamed from repo/system/execline.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/expat/expat.xibuild (renamed from repo/system/expat.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/findutils/findutils.xibuild (renamed from repo/system/findutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/freetype2/freetype2.xibuild (renamed from repo/system/freetype2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/fribidi/fribidi.xibuild (renamed from repo/system/fribidi.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gc/gc.xibuild (renamed from repo/system/gc.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gdbm/gdbm.xibuild (renamed from repo/system/gdbm.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gettext/gettext.xibuild (renamed from repo/system/gettext.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/glew/glew.patch | 34 | ||||
-rw-r--r-- | repo/system/glew/glew.xibuild (renamed from repo/system/glew.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/glib/0001-gquark-fix-initialization-with-c-constructors.patch | 47 | ||||
-rw-r--r-- | repo/system/glib/deprecated-no-warn.patch | 23 | ||||
-rw-r--r-- | repo/system/glib/glib.xibuild (renamed from repo/system/glib.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/glib/musl-libintl.patch | 22 | ||||
-rw-r--r-- | repo/system/glm/fix-endian-test.patch | 30 | ||||
-rw-r--r-- | repo/system/glm/glm.pc | 7 | ||||
-rw-r--r-- | repo/system/glm/glm.xibuild (renamed from repo/system/glm.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/glu/glu.xibuild (renamed from repo/system/glu.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gmp/gmp.xibuild (renamed from repo/system/gmp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gnutls/gnutls.xibuild (renamed from repo/system/gnutls.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gobject-introspection/gobject-introspection.xibuild (renamed from repo/system/gobject-introspection.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gobject-introspection/musl-time64.patch | 37 | ||||
-rw-r--r-- | repo/system/gperf/gperf.xibuild (renamed from repo/system/gperf.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/grub/grub.xibuild (renamed from repo/system/grub.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/guile/guile.xibuild (renamed from repo/system/guile.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/gzip/gzip.xibuild (renamed from repo/system/gzip.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/hwids/hwids.xibuild (renamed from repo/system/hwids.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/iana-etc/iana-etc.xibuild (renamed from repo/system/iana-etc.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/icu/fix-ucptrietest-golden-diff.patch | 33 | ||||
-rw-r--r-- | repo/system/icu/icu.xibuild (renamed from repo/system/icu.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/imlib2/imlib2.xibuild (renamed from repo/system/imlib2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/intltool/intltool.xibuild (renamed from repo/system/intltool.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/jansson/jansson.xibuild (renamed from repo/system/jansson.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/js78/js78.xibuild (renamed from repo/system/js78.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/js78/patches/disable-jslint.patch | 17 | ||||
-rw-r--r-- | repo/system/js78/patches/fd6847c9416f9eebde636e21d794d25d1be8791d.patch | 37 | ||||
-rw-r--r-- | repo/system/js78/patches/fix-musl-build.patch | 16 | ||||
-rw-r--r-- | repo/system/js78/patches/fix-python3.10-compilation.patch | 312 | ||||
-rw-r--r-- | repo/system/js78/patches/fix-rust-target.patch | 15 | ||||
-rw-r--r-- | repo/system/json-c/json-c.xibuild (renamed from repo/system/json-c.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/json-glib/json-glib.xibuild (renamed from repo/system/json-glib.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/jsoncpp/jsoncpp.xibuild (renamed from repo/system/jsoncpp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/kbd/kbd.xibuild (renamed from repo/system/kbd.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/kmod/kmod.xibuild (renamed from repo/system/kmod.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/krb5/krb5.xibuild (renamed from repo/system/krb5.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lcms2/lcms2.xibuild (renamed from repo/system/lcms2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/ldns/ldns.xibuild (renamed from repo/system/ldns.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libarchive/libarchive.xibuild (renamed from repo/system/libarchive.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libcap-ng/libcap-ng.xibuild (renamed from repo/system/libcap-ng.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libcap/libcap.xibuild (renamed from repo/system/libcap.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libconfig/libconfig.xibuild (renamed from repo/system/libconfig.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libdwarf/libdwarf.xibuild (renamed from repo/system/libdwarf.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libedit/libedit.xibuild (renamed from repo/system/libedit.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libelf/libelf.xibuild (renamed from repo/system/libelf.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libev/libev-4.11-Add-pkgconfig-support.patch | 58 | ||||
-rw-r--r-- | repo/system/libev/libev.xibuild (renamed from repo/system/libev.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libevent/libevent.xibuild (renamed from repo/system/libevent.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libexif/libexif.xibuild (renamed from repo/system/libexif.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libffi/libffi.xibuild (renamed from repo/system/libffi.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libfm-extra/libfm-extra.xibuild (renamed from repo/system/libfm-extra.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libfm/libfm.xibuild (renamed from repo/system/libfm.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libgcrypt/libgcrypt.xibuild (renamed from repo/system/libgcrypt.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libgpg-error/libgpg-error.xibuild (renamed from repo/system/libgpg-error.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libgudev/libgudev.xibuild (renamed from repo/system/libgudev.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libidn/libidn.xibuild (renamed from repo/system/libidn.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libldap/libldap.xibuild (renamed from repo/system/libldap.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/liblinear/liblinear.xibuild (renamed from repo/system/liblinear.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libluv/libluv.xibuild (renamed from repo/system/libluv.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libmbim/libmbim.xibuild (renamed from repo/system/libmbim.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libmpack/libmpack.xibuild (renamed from repo/system/libmpack.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libndp/libndp.xibuild (renamed from repo/system/libndp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libnghttp/libnghttp.xibuild (renamed from repo/system/libnghttp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libnl/libnl.xibuild (renamed from repo/system/libnl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libnsl/libnsl.xibuild (renamed from repo/system/libnsl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libp11-kit/libp11-kit.xibuild (renamed from repo/system/libp11-kit.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libpcap/libpcap.xibuild (renamed from repo/system/libpcap.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libpipeline/libpipeline.xibuild (renamed from repo/system/libpipeline.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libpng/libpng-1.6.37-apng.patch | 1728 | ||||
-rw-r--r-- | repo/system/libpng/libpng.xibuild (renamed from repo/system/libpng.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libpsl/libpsl.xibuild (renamed from repo/system/libpsl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libptytty/libptytty.xibuild (renamed from repo/system/libptytty.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libqmi/libqmi.xibuild (renamed from repo/system/libqmi.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libqrtr/libqrtr.xibuild (renamed from repo/system/libqrtr.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libretls/libretls.xibuild (renamed from repo/system/libretls.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libretls/test_program.c | 11 | ||||
-rw-r--r-- | repo/system/libsasl/libsasl.xibuild (renamed from repo/system/libsasl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libseccomp/libseccomp.xibuild (renamed from repo/system/libseccomp.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libsigsegv/libsigsegv.xibuild (renamed from repo/system/libsigsegv.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libssh2/libssh2.xibuild (renamed from repo/system/libssh2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libtasn1/libtasn1.xibuild (renamed from repo/system/libtasn1.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libtermkey/libtermkey.xibuild (renamed from repo/system/libtermkey.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libtirpc/libtirpc.xibuild (renamed from repo/system/libtirpc.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libtool/libtool.xibuild (renamed from repo/system/libtool.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libunistring/libunistring.xibuild (renamed from repo/system/libunistring.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libusb/libusb.xibuild (renamed from repo/system/libusb.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libuv/libuv.xibuild (renamed from repo/system/libuv.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libvterm/libvterm.xibuild (renamed from repo/system/libvterm.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libxcrypt/libxcrypt.xibuild (renamed from repo/system/libxcrypt.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libxml2/libxml2.xibuild (renamed from repo/system/libxml2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/libxslt/libxslt.xibuild (renamed from repo/system/libxslt.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/ljx/ljx.xibuild (renamed from repo/system/ljx.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lua-lpeg/build-static-lib.patch | 29 | ||||
-rw-r--r-- | repo/system/lua-lpeg/lua-lpeg.xibuild (renamed from repo/system/lua-lpeg.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lua-lpeg/test-fix-setlocale.patch | 20 | ||||
-rw-r--r-- | repo/system/lua-mpack/dont-install-busted.patch | 13 | ||||
-rw-r--r-- | repo/system/lua-mpack/lua-mpack.xibuild (renamed from repo/system/lua-mpack.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lua-mpack/skip-memleak-test.patch | 20 | ||||
-rw-r--r-- | repo/system/lua/lua.xibuild (renamed from repo/system/lua.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lua/lua5.4.pc | 24 | ||||
-rw-r--r-- | repo/system/lua5-1/lua-5.1-make.patch | 71 | ||||
-rw-r--r-- | repo/system/lua5-1/lua-5.1-module_paths.patch | 24 | ||||
-rw-r--r-- | repo/system/lua5-1/lua-5.1-readline.patch | 10 | ||||
-rw-r--r-- | repo/system/lua5-1/lua.pc | 32 | ||||
-rw-r--r-- | repo/system/lua5-1/lua5-1.xibuild (renamed from repo/system/lua5-1.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/luajit/luajit.xibuild (renamed from repo/system/luajit.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/luajit/module-paths.patch | 25 | ||||
-rw-r--r-- | repo/system/lz4/lz4.xibuild (renamed from repo/system/lz4.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/lzo/lzo.xibuild (renamed from repo/system/lzo.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/menu-cache/menu-cache-1.1.0-0001-Support-gcc10-compilation.patch | 108 | ||||
-rw-r--r-- | repo/system/menu-cache/menu-cache.xibuild (renamed from repo/system/menu-cache.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/mobile-broadband-provider-info/mobile-broadband-provider-info.xibuild (renamed from repo/system/mobile-broadband-provider-info.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/modemmanager/modemmanager.initd | 11 | ||||
-rw-r--r-- | repo/system/modemmanager/modemmanager.rules | 296 | ||||
-rw-r--r-- | repo/system/modemmanager/modemmanager.xibuild (renamed from repo/system/modemmanager.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/mpfr/mpfr.xibuild (renamed from repo/system/mpfr.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/msgpack-c/msgpack-c.xibuild (renamed from repo/system/msgpack-c.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/mtdev/mtdev.xibuild (renamed from repo/system/mtdev.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/musl-fts/musl-fts.xibuild (renamed from repo/system/musl-fts.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/musl-legacy-compat/musl-legacy-compat.xibuild (renamed from repo/system/musl-legacy-compat.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/musl-obstack/musl-obstack.xibuild (renamed from repo/system/musl-obstack.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/musl/0001-riscv64-define-ELF_NFPREG.patch | 24 | ||||
-rw-r--r-- | repo/system/musl/change-scheduler-functions-Linux-compatib.patch | 52 | ||||
-rw-r--r-- | repo/system/musl/fix-utmp-wtmp-paths.patch | 29 | ||||
-rw-r--r-- | repo/system/musl/handle-aux-at_base.patch | 46 | ||||
-rw-r--r-- | repo/system/musl/musl.xibuild (renamed from repo/system/musl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/musl/qsort_r.patch | 213 | ||||
-rw-r--r-- | repo/system/musl/syscall-cp-epoll.patch | 16 | ||||
-rw-r--r-- | repo/system/ncurses/ncurses.xibuild (renamed from repo/system/ncurses.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/nettle/nettle.xibuild (renamed from repo/system/nettle.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/networkmanager/networkmanager-dispatcher.initd | 12 | ||||
-rw-r--r-- | repo/system/networkmanager/networkmanager.conf | 2 | ||||
-rw-r--r-- | repo/system/networkmanager/networkmanager.initd | 17 | ||||
-rw-r--r-- | repo/system/networkmanager/networkmanager.rules | 9 | ||||
-rw-r--r-- | repo/system/networkmanager/networkmanager.xibuild (renamed from repo/system/networkmanager.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/newt/newt.xibuild (renamed from repo/system/newt.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/nodejs/disable-running-gyp-on-shared-deps.patch | 20 | ||||
-rw-r--r-- | repo/system/nodejs/fix-build-with-system-c-ares.patch | 535 | ||||
-rw-r--r-- | repo/system/nodejs/nodejs.xibuild (renamed from repo/system/nodejs.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/nspr/nspr.xibuild (renamed from repo/system/nspr.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/nss/nss-config.in | 145 | ||||
-rw-r--r-- | repo/system/nss/nss-softokn.pc.in | 11 | ||||
-rw-r--r-- | repo/system/nss/nss-util.pc.in | 11 | ||||
-rw-r--r-- | repo/system/nss/nss.pc.in | 11 | ||||
-rw-r--r-- | repo/system/nss/nss.xibuild (renamed from repo/system/nss.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/nsss/nsss.xibuild (renamed from repo/system/nsss.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/openntpd/libtls-standalone.patch | 20 | ||||
-rw-r--r-- | repo/system/openntpd/ntp-user.patch | 13 | ||||
-rw-r--r-- | repo/system/openntpd/openntpd.confd | 3 | ||||
-rw-r--r-- | repo/system/openntpd/openntpd.initd | 14 | ||||
-rw-r--r-- | repo/system/openntpd/openntpd.xibuild (renamed from repo/system/openntpd.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/openrc/0001-call-sbin-mkmntdirs-in-localmount-OpenRC-service.patch | 25 | ||||
-rw-r--r-- | repo/system/openrc/0002-fsck-don-t-add-C0-to-busybox-fsck.patch | 35 | ||||
-rw-r--r-- | repo/system/openrc/0003-rc-pull-in-sysinit-and-boot-as-stacked-levels-when-n.patch | 70 | ||||
-rw-r--r-- | repo/system/openrc/0004-make-consolefont-service-compatible-with-busyboxs-se.patch | 70 | ||||
-rw-r--r-- | repo/system/openrc/0005-Support-early-loading-of-keymap-if-kbd-is-installed.patch | 31 | ||||
-rw-r--r-- | repo/system/openrc/0006-Add-support-for-starting-services-in-a-specified-VRF.patch | 101 | ||||
-rw-r--r-- | repo/system/openrc/0007-Clean-up-staticroute-config-remove-irrelevant-parts-.patch | 47 | ||||
-rw-r--r-- | repo/system/openrc/0008-bootmisc-switch-wipe_tmp-setting-to-no-by-default.patch | 44 | ||||
-rw-r--r-- | repo/system/openrc/0009-fix-bootmisc-mv-error.patch | 27 | ||||
-rw-r--r-- | repo/system/openrc/0010-noexec-devfs.patch | 14 | ||||
-rw-r--r-- | repo/system/openrc/firstboot.initd | 34 | ||||
-rw-r--r-- | repo/system/openrc/hostname.initd | 18 | ||||
-rw-r--r-- | repo/system/openrc/hwdrivers.initd | 32 | ||||
-rw-r--r-- | repo/system/openrc/machine-id.initd | 17 | ||||
-rw-r--r-- | repo/system/openrc/modloop.confd | 6 | ||||
-rwxr-xr-x | repo/system/openrc/modloop.initd | 153 | ||||
-rw-r--r-- | repo/system/openrc/modules.initd | 80 | ||||
-rw-r--r-- | repo/system/openrc/networking.initd | 88 | ||||
-rw-r--r-- | repo/system/openrc/openrc.logrotate | 4 | ||||
-rw-r--r-- | repo/system/openrc/openrc.post-install | 38 | ||||
-rw-r--r-- | repo/system/openrc/openrc.post-upgrade | 35 | ||||
-rw-r--r-- | repo/system/openrc/openrc.xibuild (renamed from repo/system/openrc.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/openrc/rc.conf | 313 | ||||
-rw-r--r-- | repo/system/openrc/seedrng.patch | 640 | ||||
-rw-r--r-- | repo/system/openrc/sysctl.initd | 87 | ||||
-rw-r--r-- | repo/system/openrc/sysfsconf.initd | 66 | ||||
-rw-r--r-- | repo/system/openrc/test-networking.sh | 65 | ||||
-rw-r--r-- | repo/system/openssl/openssl.xibuild (renamed from repo/system/openssl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/pahole/pahole.xibuild (renamed from repo/system/pahole.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/pam/other.pamd | 11 | ||||
-rw-r--r-- | repo/system/pam/pam.xibuild (renamed from repo/system/pam.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/pam/system-account.pamd | 1 | ||||
-rw-r--r-- | repo/system/pam/system-auth.pamd | 2 | ||||
-rw-r--r-- | repo/system/pam/system-password.pamd | 3 | ||||
-rw-r--r-- | repo/system/pam/system-session.pamd | 3 | ||||
-rw-r--r-- | repo/system/pcre/pcre.xibuild (renamed from repo/system/pcre.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/pcre2/pcre2.xibuild (renamed from repo/system/pcre2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/pcsc-lite/pcsc-lite.xibuild (renamed from repo/system/pcsc-lite.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/perl-xml-parser/perl-xml-parser.xibuild (renamed from repo/system/perl-xml-parser.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/perl/musl-locale.patch | 37 | ||||
-rw-r--r-- | repo/system/perl/musl-skip-dst-test.patch | 13 | ||||
-rw-r--r-- | repo/system/perl/musl-stack-size.patch | 16 | ||||
-rw-r--r-- | repo/system/perl/perl.xibuild (renamed from repo/system/perl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/perl/skip-test-due-to-busybox-ps.patch | 13 | ||||
-rw-r--r-- | repo/system/perl/zlib-test.patch | 80 | ||||
-rw-r--r-- | repo/system/polkit/files/polkit-1 | 9 | ||||
-rw-r--r-- | repo/system/polkit/patches/CVE-2021-4034.patch | 79 | ||||
-rw-r--r-- | repo/system/polkit/patches/make-innetgr-optional.patch | 239 | ||||
-rw-r--r-- | repo/system/polkit/polkit.xibuild (renamed from repo/system/polkit.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/popt/popt.xibuild (renamed from repo/system/popt.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/psmisc/psmisc.xibuild (renamed from repo/system/psmisc.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/queue-standalone/queue-standalone.xibuild (renamed from repo/system/queue-standalone.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/re2/re2.xibuild (renamed from repo/system/re2.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/readline/readline.xibuild (renamed from repo/system/readline.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/rtmpdump/rtmpdump.xibuild (renamed from repo/system/rtmpdump.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/sbase/sbase.xibuild (renamed from repo/system/sbase.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/sed/sed.xibuild (renamed from repo/system/sed.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/sh/sh.xibuild (renamed from repo/system/sh.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/shadow/chage.pamd | 11 | ||||
-rw-r--r-- | repo/system/shadow/chpasswd.pamd | 12 | ||||
-rw-r--r-- | repo/system/shadow/login.pamd | 46 | ||||
-rw-r--r-- | repo/system/shadow/newusers.pamd | 12 | ||||
-rw-r--r-- | repo/system/shadow/passwd.pamd | 6 | ||||
-rw-r--r-- | repo/system/shadow/shadow.xibuild (renamed from repo/system/shadow.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/shadow/su.pamd | 27 | ||||
-rw-r--r-- | repo/system/shared-mime-info/shared-mime-info.xibuild (renamed from repo/system/shared-mime-info.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/skalibs/skalibs.xibuild (renamed from repo/system/skalibs.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/slang/slang.xibuild (renamed from repo/system/slang.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/snappy/cmakelists.patch | 76 | ||||
-rw-r--r-- | repo/system/snappy/fix-inline.patch | 13 | ||||
-rw-r--r-- | repo/system/snappy/rtti.patch | 56 | ||||
-rw-r--r-- | repo/system/snappy/snappy.xibuild (renamed from repo/system/snappy.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/sqlite3/sqlite3.xibuild (renamed from repo/system/sqlite3.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/startup-notification/startup-notification.xibuild (renamed from repo/system/startup-notification.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/sysklogd/sysklogd.initd | 3 | ||||
-rw-r--r-- | repo/system/sysklogd/sysklogd.xibuild (renamed from repo/system/sysklogd.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/syslinux/0018-prevent-pow-optimization.patch | 36 | ||||
-rw-r--r-- | repo/system/syslinux/fix-sysmacros.patch | 12 | ||||
-rw-r--r-- | repo/system/syslinux/gcc-10.patch | 109 | ||||
-rw-r--r-- | repo/system/syslinux/syslinux.post-upgrade | 61 | ||||
-rw-r--r-- | repo/system/syslinux/syslinux.trigger | 3 | ||||
-rw-r--r-- | repo/system/syslinux/syslinux.xibuild (renamed from repo/system/syslinux.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/syslinux/update-extlinux | 284 | ||||
-rw-r--r-- | repo/system/syslinux/update-extlinux.conf | 74 | ||||
-rw-r--r-- | repo/system/tar/tar.xibuild (renamed from repo/system/tar.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/tcl/tcl.xibuild (renamed from repo/system/tcl.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/tomlc99/tomlc99.xibuild (renamed from repo/system/tomlc99.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/tree-sitter/tree-sitter.xibuild (renamed from repo/system/tree-sitter.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/tzdata/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch | 27 | ||||
-rw-r--r-- | repo/system/tzdata/0002-fix-implicit-declaration-warnings-by-including-strin.patch | 28 | ||||
-rw-r--r-- | repo/system/tzdata/tzdata.xibuild (renamed from repo/system/tzdata.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/ubase/ubase.xibuild (renamed from repo/system/ubase.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/udev-rules/udev-rules.xibuild (renamed from repo/system/udev-rules.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/unibilium/unibilium.xibuild (renamed from repo/system/unibilium.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/utmps/btmpd.initd | 24 | ||||
-rw-r--r-- | repo/system/utmps/btmpd.logrotate | 6 | ||||
-rw-r--r-- | repo/system/utmps/utmp-init.initd | 21 | ||||
-rw-r--r-- | repo/system/utmps/utmp-prepare.initd | 25 | ||||
-rw-r--r-- | repo/system/utmps/utmpd.initd | 23 | ||||
-rw-r--r-- | repo/system/utmps/utmps.xibuild (renamed from repo/system/utmps.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/utmps/wtmpd.initd | 24 | ||||
-rw-r--r-- | repo/system/utmps/wtmpd.logrotate | 6 | ||||
-rw-r--r-- | repo/system/xxhash/xxhash.xibuild (renamed from repo/system/xxhash.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/xz/xz.xibuild (renamed from repo/system/xz.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/zip/zip.xibuild (renamed from repo/system/zip.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/zlib/zlib.xibuild (renamed from repo/system/zlib.xibuild) | 0 | ||||
-rw-r--r-- | repo/system/zstd/zstd.xibuild (renamed from repo/system/zstd.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/acpi/acpi.xibuild (renamed from repo/util/acpi.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/base64/base64.xibuild (renamed from repo/util/base64.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/bash/bash.xibuild (renamed from repo/util/bash.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/cpio/cpio.xibuild (renamed from repo/util/cpio.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/curl/curl.xibuild (renamed from repo/util/curl.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/dash/dash.xibuild (renamed from repo/util/dash.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/diffutils/diffutils.xibuild (renamed from repo/util/diffutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/dosfstools/dosfstools.xibuild (renamed from repo/util/dosfstools.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/dracut/dracut.xibuild (renamed from repo/util/dracut.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/dracut/fix-sbase-coreutils.patch | 41 | ||||
-rw-r--r-- | repo/util/e2fsprogs/e2fsprogs.xibuild (renamed from repo/util/e2fsprogs.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/file/file.xibuild (renamed from repo/util/file.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/fzf/fzf.xibuild (renamed from repo/util/fzf.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/gawk/gawk.xibuild (renamed from repo/util/gawk.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/genfstab/genfstab.xibuild (renamed from repo/util/genfstab.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/genfstab/remove-extra-flags.patch | 13 | ||||
-rw-r--r-- | repo/util/graphviz/graphviz.xibuild (renamed from repo/util/graphviz.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/grep/grep.xibuild (renamed from repo/util/grep.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/groff/groff.xibuild (renamed from repo/util/groff.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/htop/htop.xibuild (renamed from repo/util/htop.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/iftop/iftop.xibuild (renamed from repo/util/iftop.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/ifupdown-ng/ifupdown-ng.xibuild (renamed from repo/util/ifupdown-ng.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/inetutils/inetutils.xibuild (renamed from repo/util/inetutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/iproute2/iproute2.xibuild (renamed from repo/util/iproute2.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/iw/iw.xibuild (renamed from repo/util/iw.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/iwd/iwd.confd | 24 | ||||
-rw-r--r-- | repo/util/iwd/iwd.initd | 25 | ||||
-rw-r--r-- | repo/util/iwd/iwd.xibuild (renamed from repo/util/iwd.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/iwd/main.conf | 7 | ||||
-rw-r--r-- | repo/util/keyutils/keyutils.xibuild (renamed from repo/util/keyutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/less/less.xibuild (renamed from repo/util/less.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/lm-sensors/lm-sensors.xibuild (renamed from repo/util/lm-sensors.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/man-db/man-db.xibuild (renamed from repo/util/man-db.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/mandoc/mandoc.xibuild (renamed from repo/util/mandoc.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/mksh/mksh.xibuild (renamed from repo/util/mksh.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/mpd-mpc/mpd-mpc.xibuild (renamed from repo/util/mpd-mpc.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/neofetch/neofetch.xibuild (renamed from repo/util/neofetch.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/net-tools/git.patch | 26170 | ||||
-rw-r--r-- | repo/util/net-tools/musl-fixes.patch | 94 | ||||
-rw-r--r-- | repo/util/net-tools/net-tools.xibuild (renamed from repo/util/net-tools.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/nmap/nmap.xibuild (renamed from repo/util/nmap.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/openssh/openssh.xibuild (renamed from repo/util/openssh.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/openssh/sshd.confd | 26 | ||||
-rw-r--r-- | repo/util/openssh/sshd.initd | 162 | ||||
-rw-r--r-- | repo/util/pciutils/pciutils.xibuild (renamed from repo/util/pciutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/pm-utils/pm-utils.xibuild (renamed from repo/util/pm-utils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/procps-ng/procps-3.3.17-musl-fix.patch | 78 | ||||
-rw-r--r-- | repo/util/procps-ng/procps-ng.xibuild (renamed from repo/util/procps-ng.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/procps-ng/use_utmpx.patch | 38 | ||||
-rw-r--r-- | repo/util/rhash/rhash.xibuild (renamed from repo/util/rhash.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/rsync/rsync.xibuild (renamed from repo/util/rsync.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/sort/sort.xibuild (renamed from repo/util/sort.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/sudo/sudo.xibuild (renamed from repo/util/sudo.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/tmux/tmux.xibuild (renamed from repo/util/tmux.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/unzip/unzip.xibuild (renamed from repo/util/unzip.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/usbutils/usbutils.xibuild (renamed from repo/util/usbutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/util-linux/util-linux.xibuild (renamed from repo/util/util-linux.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/webfs/webfs.xibuild (renamed from repo/util/webfs.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/wget/wget.xibuild (renamed from repo/util/wget.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/which/which.xibuild (renamed from repo/util/which.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/wireless-tools/wireless-tools.xibuild (renamed from repo/util/wireless-tools.xibuild) | 0 | ||||
-rw-r--r-- | repo/util/wpa_supplicant/wpa_cli.confd | 1 | ||||
-rw-r--r-- | repo/util/wpa_supplicant/wpa_cli.initd | 22 | ||||
-rw-r--r-- | repo/util/wpa_supplicant/wpa_supplicant.confd | 10 | ||||
-rw-r--r-- | repo/util/wpa_supplicant/wpa_supplicant.initd | 79 | ||||
-rw-r--r-- | repo/util/wpa_supplicant/wpa_supplicant.xibuild (renamed from repo/util/wpa_supplicant.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/adwaita-icon-theme/adwaita-icon-theme.xibuild (renamed from repo/x11/adwaita-icon-theme.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/berry/berry.xibuild (renamed from repo/x11/berry.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/bspwm/bspwm.xibuild (renamed from repo/x11/bspwm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/dmenu/dmenu.xibuild (renamed from repo/x11/dmenu.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/gdk-pixbuf/disable-tests.patch | 13 | ||||
-rw-r--r-- | repo/x11/gdk-pixbuf/gdk-pixbuf.xibuild (renamed from repo/x11/gdk-pixbuf.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/graphite/cmake.patch | 23 | ||||
-rw-r--r-- | repo/x11/graphite/graphite.xibuild (renamed from repo/x11/graphite.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/gsettings-desktop-schemas/gsettings-desktop-schemas.xibuild (renamed from repo/x11/gsettings-desktop-schemas.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/gtk2/gtk2.xibuild (renamed from repo/x11/gtk2.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/gtk3/gtk3.xibuild (renamed from repo/x11/gtk3.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/harfbuzz/harfbuzz.xibuild (renamed from repo/x11/harfbuzz.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/hicolor-icon-theme/hicolor-icon-theme.xibuild (renamed from repo/x11/hicolor-icon-theme.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/iceauth/iceauth.xibuild (renamed from repo/x11/iceauth.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/intel-vaapi-driver/intel-vaapi-driver.xibuild (renamed from repo/x11/intel-vaapi-driver.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libdmx/libdmx.xibuild (renamed from repo/x11/libdmx.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libdrm/libdrm.xibuild (renamed from repo/x11/libdrm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libepoxy/libepoxy.xibuild (renamed from repo/x11/libepoxy.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libevdev/libevdev.xibuild (renamed from repo/x11/libevdev.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libfontenc/libfontenc.xibuild (renamed from repo/x11/libfontenc.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libfs/libfs.xibuild (renamed from repo/x11/libfs.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libice/libice.xibuild (renamed from repo/x11/libice.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libinput/libinput.xibuild (renamed from repo/x11/libinput.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libpciaccess/libpciaccess.xibuild (renamed from repo/x11/libpciaccess.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libsm/libsm.xibuild (renamed from repo/x11/libsm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libva/libva.xibuild (renamed from repo/x11/libva.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libvdpau-va-gl/libvdpau-va-gl.xibuild (renamed from repo/x11/libvdpau-va-gl.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libvdpau/libvdpau.xibuild (renamed from repo/x11/libvdpau.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libwacom/libwacom.xibuild (renamed from repo/x11/libwacom.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libx11/libx11.xibuild (renamed from repo/x11/libx11.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxau/libxau.xibuild (renamed from repo/x11/libxau.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxaw/libxaw.xibuild (renamed from repo/x11/libxaw.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxcb/libxcb.xibuild (renamed from repo/x11/libxcb.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxcomposite/libxcomposite.xibuild (renamed from repo/x11/libxcomposite.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxcursor/libxcursor.xibuild (renamed from repo/x11/libxcursor.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxcvt/libxcvt.xibuild (renamed from repo/x11/libxcvt.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxdamage/libxdamage.xibuild (renamed from repo/x11/libxdamage.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxdmcp/libxdmcp.xibuild (renamed from repo/x11/libxdmcp.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxext/libxext.xibuild (renamed from repo/x11/libxext.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxfixes/libxfixes.xibuild (renamed from repo/x11/libxfixes.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxfont2/libxfont2.xibuild (renamed from repo/x11/libxfont2.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxft/libxft.xibuild (renamed from repo/x11/libxft.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxi/libxi.xibuild (renamed from repo/x11/libxi.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxinerama/libxinerama.xibuild (renamed from repo/x11/libxinerama.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxkbcommon/libxkbcommon.xibuild (renamed from repo/x11/libxkbcommon.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxkbfile/libxkbfile.xibuild (renamed from repo/x11/libxkbfile.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxmu/libxmu.xibuild (renamed from repo/x11/libxmu.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxpm/libxpm.xibuild (renamed from repo/x11/libxpm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxrandr/libxrandr.xibuild (renamed from repo/x11/libxrandr.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxrender/libxrender.xibuild (renamed from repo/x11/libxrender.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxres/libxres.xibuild (renamed from repo/x11/libxres.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxscrnsaver/libxscrnsaver.xibuild (renamed from repo/x11/libxscrnsaver.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxshmfence/libxshmfence.xibuild (renamed from repo/x11/libxshmfence.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxt/libxt.xibuild (renamed from repo/x11/libxt.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxtst/libxtst.xibuild (renamed from repo/x11/libxtst.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxv/libxv.xibuild (renamed from repo/x11/libxv.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxvmc/libxvmc.xibuild (renamed from repo/x11/libxvmc.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxxf86dga/libxxf86dga.xibuild (renamed from repo/x11/libxxf86dga.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/libxxf86vm/libxxf86vm.xibuild (renamed from repo/x11/libxxf86vm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/luit/luit.xibuild (renamed from repo/x11/luit.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/maim/maim.xibuild (renamed from repo/x11/maim.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/mesa/0001-radeonsi-On-Aarch64-force-persistent-buffers-to-GTT.patch | 38 | ||||
-rw-r--r-- | repo/x11/mesa/add-use-elf-tls.patch | 29 | ||||
-rw-r--r-- | repo/x11/mesa/disable-rgb10-by-default.patch | 25 | ||||
-rw-r--r-- | repo/x11/mesa/mesa-21.3.7-add_xdemos-1.patch | 3197 | ||||
-rw-r--r-- | repo/x11/mesa/mesa-21.3.7-nouveau_fixes-1.patch | 2878 | ||||
-rw-r--r-- | repo/x11/mesa/mesa.xibuild (renamed from repo/x11/mesa.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/mesa/musl-fix-includes.patch | 13 | ||||
-rw-r--r-- | repo/x11/mkfontscale/mkfontscale.xibuild (renamed from repo/x11/mkfontscale.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/motif/02-fix-format-security.patch | 607 | ||||
-rw-r--r-- | repo/x11/motif/03-no-demos.patch | 53 | ||||
-rw-r--r-- | repo/x11/motif/06-cast-size_t-to-int.patch | 17 | ||||
-rw-r--r-- | repo/x11/motif/07-fix_lintian_reported_manpage_typos.patch | 118 | ||||
-rw-r--r-- | repo/x11/motif/08-fix_hyphen_in_man_pages.patch | 156 | ||||
-rw-r--r-- | repo/x11/motif/09-fix_typo_in_libxm.patch | 25 | ||||
-rw-r--r-- | repo/x11/motif/10-fix_manpage-has-bad-whatis-entry.patch | 49 | ||||
-rw-r--r-- | repo/x11/motif/11-fix_underlinking.patch | 564 | ||||
-rw-r--r-- | repo/x11/motif/13-fix_hardcoded_x11rgb_path.patch | 54 | ||||
-rw-r--r-- | repo/x11/motif/15-link_uil_against_libuil.patch | 29 | ||||
-rw-r--r-- | repo/x11/motif/16-fix-undefined-use-of-sprintf.patch | 17 | ||||
-rw-r--r-- | repo/x11/motif/17-switch-to-system-iswspace.patch | 384 | ||||
-rw-r--r-- | repo/x11/motif/18-option-main.patch | 9 | ||||
-rw-r--r-- | repo/x11/motif/motif.xibuild (renamed from repo/x11/motif.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/pango/disable-broken-test.patch | 15 | ||||
-rw-r--r-- | repo/x11/pango/pango.xibuild (renamed from repo/x11/pango.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/picom/picom.xibuild (renamed from repo/x11/picom.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/pixman/pixman.xibuild (renamed from repo/x11/pixman.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/rofi/rofi-sensible-terminal-use-sh.patch | 23 | ||||
-rw-r--r-- | repo/x11/rofi/rofi.xibuild (renamed from repo/x11/rofi.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/rofi/scrollbar-test.patch | 31 | ||||
-rw-r--r-- | repo/x11/sdl2/directfb-cflags.patch | 10 | ||||
-rw-r--r-- | repo/x11/sdl2/sdl2.xibuild (renamed from repo/x11/sdl2.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/sessreg/sessreg.xibuild (renamed from repo/x11/sessreg.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/setxkbmap/setxkbmap.xibuild (renamed from repo/x11/setxkbmap.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/slock/slock.xibuild (renamed from repo/x11/slock.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/slop/slop.xibuild (renamed from repo/x11/slop.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/smproxy/smproxy.xibuild (renamed from repo/x11/smproxy.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/spice-protocol/spice-protocol.xibuild (renamed from repo/x11/spice-protocol.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/sxhkd/sxhkd.xibuild (renamed from repo/x11/sxhkd.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/wayland-protocols/wayland-protocols.xibuild (renamed from repo/x11/wayland-protocols.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/wayland/wayland.xibuild (renamed from repo/x11/wayland.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/x11perf/x11perf.xibuild (renamed from repo/x11/x11perf.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xauth/xauth.xibuild (renamed from repo/x11/xauth.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xautolock/processwait.patch | 33 | ||||
-rw-r--r-- | repo/x11/xautolock/xautolock.xibuild (renamed from repo/x11/xautolock.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xbacklight/xbacklight.xibuild (renamed from repo/x11/xbacklight.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xbitmaps/xbitmaps.xibuild (renamed from repo/x11/xbitmaps.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-proto/xcb-proto.xibuild (renamed from repo/x11/xcb-proto.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util-cursor/xcb-util-cursor.xibuild (renamed from repo/x11/xcb-util-cursor.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util-image/xcb-util-image.xibuild (renamed from repo/x11/xcb-util-image.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util-keysyms/xcb-util-keysyms.xibuild (renamed from repo/x11/xcb-util-keysyms.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util-renderutil/xcb-util-renderutil.xibuild (renamed from repo/x11/xcb-util-renderutil.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util-wm/xcb-util-wm.xibuild (renamed from repo/x11/xcb-util-wm.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcb-util/xcb-util.xibuild (renamed from repo/x11/xcb-util.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xclip/xclip.xibuild (renamed from repo/x11/xclip.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xclock/xclock.xibuild (renamed from repo/x11/xclock.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcmsdb/xcmsdb.xibuild (renamed from repo/x11/xcmsdb.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcursor-themes/xcursor-themes.xibuild (renamed from repo/x11/xcursor-themes.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xcursorgen/xcursorgen.xibuild (renamed from repo/x11/xcursorgen.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xdg-utils/xdg-screensaver-mv-T.patch | 25 | ||||
-rw-r--r-- | repo/x11/xdg-utils/xdg-utils.xibuild (renamed from repo/x11/xdg-utils.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xdpyinfo/xdpyinfo.xibuild (renamed from repo/x11/xdpyinfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xdriinfo/xdriinfo.xibuild (renamed from repo/x11/xdriinfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xev/xev.xibuild (renamed from repo/x11/xev.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xeyes/xeyes.xibuild (renamed from repo/x11/xeyes.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-input-evdev/xf86-input-evdev.xibuild (renamed from repo/x11/xf86-input-evdev.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-input-libinput/xf86-input-libinput.xibuild (renamed from repo/x11/xf86-input-libinput.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-input-synaptics/xf86-input-synaptics.xibuild (renamed from repo/x11/xf86-input-synaptics.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-input-wacom/xf86-input-wacom.xibuild (renamed from repo/x11/xf86-input-wacom.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-amdgpu/xf86-video-amdgpu.xibuild (renamed from repo/x11/xf86-video-amdgpu.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-ati/xf86-video-ati.xibuild (renamed from repo/x11/xf86-video-ati.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-fbdev/xf86-video-fbdev.xibuild (renamed from repo/x11/xf86-video-fbdev.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-intel/xf86-video-intel.xibuild (renamed from repo/x11/xf86-video-intel.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-nouveau/xf86-video-nouveau.xibuild (renamed from repo/x11/xf86-video-nouveau.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-nouveau/xorg-server-21.1.patch | 50 | ||||
-rw-r--r-- | repo/x11/xf86-video-qxl/buildfix.patch | 101 | ||||
-rw-r--r-- | repo/x11/xf86-video-qxl/convert-xspice-python3.patch | 154 | ||||
-rw-r--r-- | repo/x11/xf86-video-qxl/xf86-video-qxl.xibuild (renamed from repo/x11/xf86-video-qxl.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xf86-video-vmware/xf86-video-vmware.xibuild (renamed from repo/x11/xf86-video-vmware.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xgamma/xgamma.xibuild (renamed from repo/x11/xgamma.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xhost/xhost.xibuild (renamed from repo/x11/xhost.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xinput/xinput.xibuild (renamed from repo/x11/xinput.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xkbcomp/xkbcomp.xibuild (renamed from repo/x11/xkbcomp.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xkbevd/xkbevd.xibuild (renamed from repo/x11/xkbevd.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xkbutils/xkbutils.xibuild (renamed from repo/x11/xkbutils.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xkeyboardconfig/xkeyboardconfig.xibuild (renamed from repo/x11/xkeyboardconfig.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xkill/xkill.xibuild (renamed from repo/x11/xkill.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xlsatoms/xlsatoms.xibuild (renamed from repo/x11/xlsatoms.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xlsclients/xlsclients.xibuild (renamed from repo/x11/xlsclients.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xmessage/xmessage.xibuild (renamed from repo/x11/xmessage.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xmodmap/xmodmap.xibuild (renamed from repo/x11/xmodmap.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xorg-libs/xorg-libs.xibuild (renamed from repo/x11/xorg-libs.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xorg-server/xorg-server.xibuild (renamed from repo/x11/xorg-server.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xorg-util-macros/xorg-util-macros.xibuild (renamed from repo/x11/xorg-util-macros.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xorg-xinit/xorg-xinit.xibuild (renamed from repo/x11/xorg-xinit.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xorgproto/xorgproto.xibuild (renamed from repo/x11/xorgproto.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xpr/xpr.xibuild (renamed from repo/x11/xpr.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xprop/xprop.xibuild (renamed from repo/x11/xprop.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xrandr/xrandr.xibuild (renamed from repo/x11/xrandr.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xrdb/xrdb.xibuild (renamed from repo/x11/xrdb.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xrefresh/xrefresh.xibuild (renamed from repo/x11/xrefresh.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xsel/xsel.xibuild (renamed from repo/x11/xsel.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xset/xset.xibuild (renamed from repo/x11/xset.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xsetroot/xsetroot.xibuild (renamed from repo/x11/xsetroot.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xtrans/xtrans.xibuild (renamed from repo/x11/xtrans.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xvinfo/xvinfo.xibuild (renamed from repo/x11/xvinfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xwd/xwd.xibuild (renamed from repo/x11/xwd.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xwininfo/xwininfo.xibuild (renamed from repo/x11/xwininfo.xibuild) | 0 | ||||
-rw-r--r-- | repo/x11/xwud/xwud.xibuild (renamed from repo/x11/xwud.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/mkinitramfs/mkinitramfs.xibuild (renamed from repo/xi/mkinitramfs.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/sysconfigs/sysconfigs.xibuild (renamed from repo/xi/sysconfigs.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/xib/xib.xibuild (renamed from repo/xi/xib.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/xichroot/xichroot.xibuild (renamed from repo/xi/xichroot.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/xipkg/xipkg.xibuild (renamed from repo/xi/xipkg.xibuild) | 0 | ||||
-rw-r--r-- | repo/xi/xiutils/xiutils.xibuild (renamed from repo/xi/xiutils.xibuild) | 0 |
854 files changed, 64803 insertions, 0 deletions
diff --git a/repo/apps/arandr.xibuild b/repo/apps/arandr/arandr.xibuild index 7b926ff..7b926ff 100644 --- a/repo/apps/arandr.xibuild +++ b/repo/apps/arandr/arandr.xibuild diff --git a/repo/apps/chromium/chromium-VirtualCursor-standard-layout.patch b/repo/apps/chromium/chromium-VirtualCursor-standard-layout.patch new file mode 100644 index 0000000..721e194 --- /dev/null +++ b/repo/apps/chromium/chromium-VirtualCursor-standard-layout.patch @@ -0,0 +1,216 @@ +diff --git a/sql/recover_module/btree.cc b/sql/recover_module/btree.cc +index 9ecaafe..839318a 100644 +--- a/sql/recover_module/btree.cc ++++ b/sql/recover_module/btree.cc +@@ -135,16 +135,25 @@ + "Move the destructor to the .cc file if it's non-trival"); + #endif // !DCHECK_IS_ON() + +-LeafPageDecoder::LeafPageDecoder(DatabasePageReader* db_reader) noexcept +- : page_id_(db_reader->page_id()), +- db_reader_(db_reader), +- cell_count_(ComputeCellCount(db_reader)), +- next_read_index_(0), +- last_record_size_(0) { ++void LeafPageDecoder::Initialize(DatabasePageReader* db_reader) { ++ DCHECK(db_reader); + DCHECK(IsOnValidPage(db_reader)); ++ page_id_ = db_reader->page_id(); ++ db_reader_ = db_reader; ++ cell_count_ = ComputeCellCount(db_reader); ++ next_read_index_ = 0; ++ last_record_size_ = 0; + DCHECK(DatabasePageReader::IsValidPageId(page_id_)); + } + ++void LeafPageDecoder::Reset() { ++ db_reader_ = nullptr; ++ page_id_ = 0; ++ cell_count_ = 0; ++ next_read_index_ = 0; ++ last_record_size_ = 0; ++} ++ + bool LeafPageDecoder::TryAdvance() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(CanAdvance()); +diff --git a/sql/recover_module/btree.h b/sql/recover_module/btree.h +index d76d076..33114b0 100644 +--- a/sql/recover_module/btree.h ++++ b/sql/recover_module/btree.h +@@ -102,7 +102,7 @@ + // + // |db_reader| must have been used to read an inner page of a table B-tree. + // |db_reader| must outlive this instance. +- explicit LeafPageDecoder(DatabasePageReader* db_reader) noexcept; ++ explicit LeafPageDecoder() noexcept = default; + ~LeafPageDecoder() noexcept = default; + + LeafPageDecoder(const LeafPageDecoder&) = delete; +@@ -150,6 +150,15 @@ + // read as long as CanAdvance() returns true. + bool TryAdvance(); + ++ // Initialize with DatabasePageReader ++ void Initialize(DatabasePageReader* db_reader); ++ ++ // Reset internal DatabasePageReader ++ void Reset(); ++ ++ // True if DatabasePageReader is valid ++ bool IsValid() { return (db_reader_ != nullptr); } ++ + // True if the given reader may point to an inner page in a table B-tree. + // + // The last ReadPage() call on |db_reader| must have succeeded. +@@ -163,14 +172,14 @@ + static int ComputeCellCount(DatabasePageReader* db_reader); + + // The number of the B-tree page this reader is reading. +- const int64_t page_id_; ++ int64_t page_id_; + // Used to read the tree page. + // + // Raw pointer usage is acceptable because this instance's owner is expected + // to ensure that the DatabasePageReader outlives this. +- DatabasePageReader* const db_reader_; ++ DatabasePageReader* db_reader_; + // Caches the ComputeCellCount() value for this reader's page. +- const int cell_count_ = ComputeCellCount(db_reader_); ++ int cell_count_; + + // The reader's cursor state. + // +diff --git a/sql/recover_module/cursor.cc b/sql/recover_module/cursor.cc +index 0029ff9..42548bc 100644 +--- a/sql/recover_module/cursor.cc ++++ b/sql/recover_module/cursor.cc +@@ -26,7 +26,7 @@ + int VirtualCursor::First() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + inner_decoders_.clear(); +- leaf_decoder_ = nullptr; ++ leaf_decoder_.Reset(); + + AppendPageDecoder(table_->root_page_id()); + return Next(); +@@ -36,18 +36,18 @@ + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + record_reader_.Reset(); + +- while (!inner_decoders_.empty() || leaf_decoder_.get()) { +- if (leaf_decoder_.get()) { +- if (!leaf_decoder_->CanAdvance()) { ++ while (!inner_decoders_.empty() || leaf_decoder_.IsValid()) { ++ if (leaf_decoder_.IsValid()) { ++ if (!leaf_decoder_.CanAdvance()) { + // The leaf has been exhausted. Remove it from the DFS stack. +- leaf_decoder_ = nullptr; ++ leaf_decoder_.Reset(); + continue; + } +- if (!leaf_decoder_->TryAdvance()) ++ if (!leaf_decoder_.TryAdvance()) + continue; + +- if (!payload_reader_.Initialize(leaf_decoder_->last_record_size(), +- leaf_decoder_->last_record_offset())) { ++ if (!payload_reader_.Initialize(leaf_decoder_.last_record_size(), ++ leaf_decoder_.last_record_offset())) { + continue; + } + if (!record_reader_.Initialize()) +@@ -99,13 +99,13 @@ + int64_t VirtualCursor::RowId() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(record_reader_.IsInitialized()); +- DCHECK(leaf_decoder_.get()); +- return leaf_decoder_->last_record_rowid(); ++ DCHECK(leaf_decoder_.IsValid()); ++ return leaf_decoder_.last_record_rowid(); + } + + void VirtualCursor::AppendPageDecoder(int page_id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +- DCHECK(leaf_decoder_.get() == nullptr) ++ DCHECK(!leaf_decoder_.IsValid()) + << __func__ + << " must only be called when the current path has no leaf decoder"; + +@@ -113,7 +113,7 @@ + return; + + if (LeafPageDecoder::IsOnValidPage(&db_reader_)) { +- leaf_decoder_ = std::make_unique<LeafPageDecoder>(&db_reader_); ++ leaf_decoder_.Initialize(&db_reader_); + return; + } + +diff --git a/sql/recover_module/cursor.h b/sql/recover_module/cursor.h +index afcd690..b15c31d 100644 +--- a/sql/recover_module/cursor.h ++++ b/sql/recover_module/cursor.h +@@ -129,7 +129,7 @@ + std::vector<std::unique_ptr<InnerPageDecoder>> inner_decoders_; + + // Decodes the leaf page containing records. +- std::unique_ptr<LeafPageDecoder> leaf_decoder_; ++ LeafPageDecoder leaf_decoder_; + + SEQUENCE_CHECKER(sequence_checker_); + }; +diff --git a/sql/recover_module/pager.cc b/sql/recover_module/pager.cc +index 58e75de..5fe9620 100644 +--- a/sql/recover_module/pager.cc ++++ b/sql/recover_module/pager.cc +@@ -23,8 +23,7 @@ + "ints are not appropriate for representing page IDs"); + + DatabasePageReader::DatabasePageReader(VirtualTable* table) +- : page_data_(std::make_unique<uint8_t[]>(table->page_size())), +- table_(table) { ++ : page_data_(), table_(table) { + DCHECK(table != nullptr); + DCHECK(IsValidPageSize(table->page_size())); + } +@@ -57,8 +56,8 @@ + std::numeric_limits<int64_t>::max(), + "The |read_offset| computation above may overflow"); + +- int sqlite_status = +- RawRead(sqlite_file, read_size, read_offset, page_data_.get()); ++ int sqlite_status = RawRead(sqlite_file, read_size, read_offset, ++ const_cast<uint8_t*>(page_data_.data())); + + // |page_id_| needs to be set to kInvalidPageId if the read failed. + // Otherwise, future ReadPage() calls with the previous |page_id_| value +diff --git a/sql/recover_module/pager.h b/sql/recover_module/pager.h +index 0e388ddc..99314e3 100644 +--- a/sql/recover_module/pager.h ++++ b/sql/recover_module/pager.h +@@ -5,6 +5,7 @@ + #ifndef SQL_RECOVER_MODULE_PAGER_H_ + #define SQL_RECOVER_MODULE_PAGER_H_ + ++#include <array> + #include <cstdint> + #include <memory> + +@@ -70,7 +71,7 @@ + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_NE(page_id_, kInvalidPageId) + << "Successful ReadPage() required before accessing pager state"; +- return page_data_.get(); ++ return page_data_.data(); + } + + // The number of bytes in the page read by the last ReadPage() call. +@@ -137,7 +138,7 @@ + int page_id_ = kInvalidPageId; + // Stores the bytes of the last page successfully read by ReadPage(). + // The content is undefined if the last call to ReadPage() did not succeed. +- const std::unique_ptr<uint8_t[]> page_data_; ++ const std::array<uint8_t, kMaxPageSize> page_data_; + // Raw pointer usage is acceptable because this instance's owner is expected + // to ensure that the VirtualTable outlives this. + VirtualTable* const table_; diff --git a/repo/apps/chromium/chromium-launcher.sh b/repo/apps/chromium/chromium-launcher.sh new file mode 100644 index 0000000..ceba3f2 --- /dev/null +++ b/repo/apps/chromium/chromium-launcher.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +export DBUS_SESSION_BUS_ADDRES=unix:path=/run/dbus/system_bus_socket + +# Allow the user to override command-line flags, bug #357629. +# This is based on Debian's chromium-browser package, and is intended +# to be consistent with Debian. +for f in /etc/chromium/*.conf; do + [ -f ${f} ] && . "${f}" +done + +# Prefer user defined CHROMIUM_USER_FLAGS (from env) over system +# default CHROMIUM_FLAGS (from /etc/chromium/default). +CHROMIUM_FLAGS=${CHROMIUM_USER_FLAGS:-"$CHROMIUM_FLAGS"} + +# Let the wrapped binary know that it has been run through the wrapper +export CHROME_WRAPPER=$(readlink -f "$0") + +PROGDIR=${CHROME_WRAPPER%/*} + +case ":$PATH:" in + *:$PROGDIR:*) + # $PATH already contains $PROGDIR + ;; + *) + # Append $PROGDIR to $PATH + export PATH="$PATH:$PROGDIR" + ;; +esac + +if [ $(id -u) -eq 0 ] && [ $(stat -t -L ${XDG_CONFIG_HOME:-${HOME}} | cut -d' ' -f5) -eq 0 ]; then + # Running as root with HOME owned by root. + # Pass --user-data-dir to work around upstream failsafe. + CHROMIUM_FLAGS="--user-data-dir=${XDG_CONFIG_HOME:-${HOME}/.config}/chromium + ${CHROMIUM_FLAGS}" +fi + +# Set the .desktop file name +export CHROME_DESKTOP="chromium.desktop" + +exec "$PROGDIR/chromium" --extra-plugin-dir=/usr/lib/nsbrowser/plugins ${CHROMIUM_FLAGS} "$@" diff --git a/repo/apps/chromium/chromium-revert-drop-of-system-java.patch b/repo/apps/chromium/chromium-revert-drop-of-system-java.patch new file mode 100644 index 0000000..117a50f --- /dev/null +++ b/repo/apps/chromium/chromium-revert-drop-of-system-java.patch @@ -0,0 +1,15 @@ +This was dropped for some reason in 6951c37cecd05979b232a39e5c10e6346a0f74ef +--- a/third_party/closure_compiler/compiler.py 2021-05-20 04:17:53.000000000 +0200 ++++ b/third_party/closure_compiler/compiler.py 2021-05-20 04:17:53.000000000 +0200 +@@ -13,8 +13,9 @@ + + + _CURRENT_DIR = os.path.join(os.path.dirname(__file__)) +-_JAVA_PATH = os.path.join(_CURRENT_DIR, "..", "jdk", "current", "bin", "java") +-assert os.path.isfile(_JAVA_PATH), "java only allowed in android builds" ++_JAVA_BIN = "java" ++_JDK_PATH = os.path.join(_CURRENT_DIR, "..", "jdk", "current", "bin", "java") ++_JAVA_PATH = _JDK_PATH if os.path.isfile(_JDK_PATH) else _JAVA_BIN + + class Compiler(object): + """Runs the Closure compiler on given source files to typecheck them diff --git a/repo/apps/chromium/chromium-use-alpine-target.patch b/repo/apps/chromium/chromium-use-alpine-target.patch new file mode 100644 index 0000000..8282aca --- /dev/null +++ b/repo/apps/chromium/chromium-use-alpine-target.patch @@ -0,0 +1,24 @@ +--- ./build/config/compiler/BUILD.gn ++++ ./build/config/compiler/BUILD.gn +@@ -752,8 +752,8 @@ + } + } else if (current_cpu == "arm") { + if (is_clang && !is_android && !is_nacl) { +- cflags += [ "--target=arm-linux-gnueabihf" ] +- ldflags += [ "--target=arm-linux-gnueabihf" ] ++ cflags += [ "--target=armv7-alpine-linux-musleabihf" ] ++ ldflags += [ "--target=armv7-alpine-linux-musleabihf" ] + } + if (!is_nacl) { + cflags += [ +@@ -766,8 +766,8 @@ + } + } else if (current_cpu == "arm64") { + if (is_clang && !is_android && !is_nacl && !is_fuchsia) { +- cflags += [ "--target=aarch64-linux-gnu" ] +- ldflags += [ "--target=aarch64-linux-gnu" ] ++ cflags += [ "--target=aarch64-alpine-linux-musl" ] ++ ldflags += [ "--target=aarch64-alpine-linux-musl" ] + } + } else if (current_cpu == "mipsel" && !is_nacl) { + ldflags += [ "-Wl,--hash-style=sysv" ] diff --git a/repo/apps/chromium/chromium.conf b/repo/apps/chromium/chromium.conf new file mode 100644 index 0000000..a8b8db3 --- /dev/null +++ b/repo/apps/chromium/chromium.conf @@ -0,0 +1,5 @@ +# Default settings for chromium. This file is sourced by /bin/sh from +# the chromium launcher. + +# Options to pass to chromium. +#CHROMIUM_FLAGS="" diff --git a/repo/apps/chromium/chromium.desktop b/repo/apps/chromium/chromium.desktop new file mode 100644 index 0000000..e5f549b --- /dev/null +++ b/repo/apps/chromium/chromium.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Chromium +GenericName=Web Browser +Comment=Access the Internet +Exec=chromium-browser %U +Terminal=false +Icon=chromium +Type=Application +Categories=GTK;Network;WebBrowser; +MimeType=text/html;text/xml;application/xhtml+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https; diff --git a/repo/apps/chromium.xibuild b/repo/apps/chromium/chromium.xibuild index 2edfbd3..2edfbd3 100644 --- a/repo/apps/chromium.xibuild +++ b/repo/apps/chromium/chromium.xibuild diff --git a/repo/apps/chromium/credentials-header.patch b/repo/apps/chromium/credentials-header.patch new file mode 100644 index 0000000..840bd2a --- /dev/null +++ b/repo/apps/chromium/credentials-header.patch @@ -0,0 +1,11 @@ +--- ./sandbox/linux/services/credentials.h.orig ++++ ./sandbox/linux/services/credentials.h +@@ -14,6 +14,8 @@ + #include <string> + #include <vector> + ++#include <sys/types.h> ++ + #include "sandbox/linux/system_headers/capability.h" + #include "sandbox/sandbox_export.h" + diff --git a/repo/apps/chromium/default-pthread-stacksize.patch b/repo/apps/chromium/default-pthread-stacksize.patch new file mode 100644 index 0000000..74ebc76 --- /dev/null +++ b/repo/apps/chromium/default-pthread-stacksize.patch @@ -0,0 +1,45 @@ +--- ./base/threading/platform_thread_linux.cc ++++ ./base/threading/platform_thread_linux.cc +@@ -186,7 +186,8 @@ + + size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { + #if !defined(THREAD_SANITIZER) +- return 0; ++ // use 2mb to avoid running out of space. This is what android uses ++ return 2 * (1 << 20); + #else + // ThreadSanitizer bloats the stack heavily. Evidence has been that the + // default stack size isn't enough for some browser tests. +--- ./base/threading/platform_thread_unittest.cc.orig ++++ ./base/threading/platform_thread_unittest.cc +@@ -420,7 +420,7 @@ + ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && \ + !defined(THREAD_SANITIZER)) || \ + (BUILDFLAG(IS_ANDROID) && !defined(ADDRESS_SANITIZER)) +- EXPECT_EQ(0u, stack_size); ++ EXPECT_EQ(2u << 20, stack_size); + #else + EXPECT_GT(stack_size, 0u); + EXPECT_LT(stack_size, 20u * (1 << 20)); +--- ./chrome/browser/shutdown_signal_handlers_posix.cc ++++ ./chrome/browser/shutdown_signal_handlers_posix.cc +@@ -187,11 +187,19 @@ + g_shutdown_pipe_read_fd = pipefd[0]; + g_shutdown_pipe_write_fd = pipefd[1]; + #if !defined(ADDRESS_SANITIZER) ++# if defined(__GLIBC__) + const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2; ++# else ++ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2 * 8; // match up musls 2k PTHREAD_STACK_MIN with glibcs 16k ++# endif + #else ++# if defined(__GLIBC__) + // ASan instrumentation bloats the stack frames, so we need to increase the + // stack size to avoid hitting the guard page. + const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4; ++# else ++ const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4 * 8; // match up musls 2k PTHREAD_STACK_MIN with glibcs 16k ++# endif + #endif + ShutdownDetector* detector = new ShutdownDetector( + g_shutdown_pipe_read_fd, std::move(shutdown_callback), task_runner); diff --git a/repo/apps/chromium/elf-arm.patch b/repo/apps/chromium/elf-arm.patch new file mode 100644 index 0000000..3799dc9 --- /dev/null +++ b/repo/apps/chromium/elf-arm.patch @@ -0,0 +1,11 @@ +--- ./v8/src/base/cpu.cc.orig ++++ ./v8/src/base/cpu.cc +@@ -16,7 +16,7 @@ + #if V8_OS_QNX + #include <sys/syspage.h> // cpuinfo + #endif +-#if V8_OS_LINUX && (V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) ++#if V8_OS_LINUX && (V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64 || V8_HOST_ARCH_ARM) + #include <elf.h> + #endif + #if V8_OS_AIX diff --git a/repo/apps/chromium/enable-GlobalMediaControlsCastStartStop.patch b/repo/apps/chromium/enable-GlobalMediaControlsCastStartStop.patch new file mode 100644 index 0000000..e0d4544 --- /dev/null +++ b/repo/apps/chromium/enable-GlobalMediaControlsCastStartStop.patch @@ -0,0 +1,32 @@ +From b58f0f2725a8c1a8a131f9984b5fd53b54119dba Mon Sep 17 00:00:00 2001 +From: Muyao Xu <muyaoxu@google.com> +Date: Thu, 20 Jan 2022 23:46:21 +0000 +Subject: [PATCH] [Zenith] Enable GlobalMediaControlsCastStartStop flag by + default + +The feature is rolled out to 100% stable through finch for M96+. +This CL enables it by default and fixes some unit tests failures. + +Bug: 1287242, 1287305 +Change-Id: I7e5c9625b77379fef253c41ef292a0dd6fc366fb +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3388416 +Reviewed-by: Takumi Fujimoto <takumif@chromium.org> +Commit-Queue: Muyao Xu <muyaoxu@google.com> +Cr-Commit-Position: refs/heads/main@{#961658} +--- + chrome/browser/media/router/media_router_feature.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc +index f28f9b0b802..a8d544f7d6d 100644 +--- a/chrome/browser/media/router/media_router_feature.cc ++++ b/chrome/browser/media/router/media_router_feature.cc +@@ -33,7 +33,7 @@ const base::Feature kMediaRouter{"MediaRouter", + const base::Feature kCastAllowAllIPsFeature{"CastAllowAllIPs", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kGlobalMediaControlsCastStartStop{ +- "GlobalMediaControlsCastStartStop", base::FEATURE_DISABLED_BY_DEFAULT}; ++ "GlobalMediaControlsCastStartStop", base::FEATURE_ENABLED_BY_DEFAULT}; + const base::Feature kAllowAllSitesToInitiateMirroring{ + "AllowAllSitesToInitiateMirroring", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kDialMediaRouteProvider{"DialMediaRouteProvider", diff --git a/repo/apps/chromium/fix-narrowing-cast.patch b/repo/apps/chromium/fix-narrowing-cast.patch new file mode 100644 index 0000000..afd42a1 --- /dev/null +++ b/repo/apps/chromium/fix-narrowing-cast.patch @@ -0,0 +1,53 @@ +--- a/base/files/file_util_linux.cc ++++ b/base/files/file_util_linux.cc +@@ -23,14 +23,14 @@ + + // Not all possible |statfs_buf.f_type| values are in linux/magic.h. + // Missing values are copied from the statfs man page. +- switch (statfs_buf.f_type) { ++ switch (static_cast<uintmax_t>(statfs_buf.f_type)) { + case 0: + *type = FILE_SYSTEM_0; + break; + case EXT2_SUPER_MAGIC: // Also ext3 and ext4 + case MSDOS_SUPER_MAGIC: + case REISERFS_SUPER_MAGIC: +- case static_cast<int>(BTRFS_SUPER_MAGIC): ++ case BTRFS_SUPER_MAGIC: + case 0x5346544E: // NTFS + case 0x58465342: // XFS + case 0x3153464A: // JFS +@@ -40,14 +40,14 @@ + *type = FILE_SYSTEM_NFS; + break; + case SMB_SUPER_MAGIC: +- case static_cast<int>(0xFF534D42): // CIFS ++ case 0xFF534D42: // CIFS + *type = FILE_SYSTEM_SMB; + break; + case CODA_SUPER_MAGIC: + *type = FILE_SYSTEM_CODA; + break; +- case static_cast<int>(HUGETLBFS_MAGIC): +- case static_cast<int>(RAMFS_MAGIC): ++ case HUGETLBFS_MAGIC: ++ case RAMFS_MAGIC: + case TMPFS_MAGIC: + *type = FILE_SYSTEM_MEMORY; + break; +--- a/base/system/sys_info_posix.cc ++++ b/base/system/sys_info_posix.cc +@@ -100,10 +100,10 @@ + if (HANDLE_EINTR(statfs(path.value().c_str(), &stats)) != 0) + return false; + +- switch (stats.f_type) { ++ switch (static_cast<uintmax_t>(stats.f_type)) { + case TMPFS_MAGIC: +- case static_cast<int>(HUGETLBFS_MAGIC): +- case static_cast<int>(RAMFS_MAGIC): ++ case HUGETLBFS_MAGIC: ++ case RAMFS_MAGIC: + return true; + } + return false; diff --git a/repo/apps/chromium/fix-unittests-sandbox.patch b/repo/apps/chromium/fix-unittests-sandbox.patch new file mode 100644 index 0000000..e11face --- /dev/null +++ b/repo/apps/chromium/fix-unittests-sandbox.patch @@ -0,0 +1,11 @@ +--- ./sandbox/linux/syscall_broker/broker_file_permission_unittest.cc.orig ++++ ./sandbox/linux/syscall_broker/broker_file_permission_unittest.cc +@@ -134,7 +134,7 @@ + #endif + + const int kNumberOfBitsInOAccMode = 2; +- static_assert(O_ACCMODE == ((1 << kNumberOfBitsInOAccMode) - 1), ++ static_assert(O_ACCMODE == (((1 << kNumberOfBitsInOAccMode) - 1) | O_PATH), + "incorrect number of bits"); + // check every possible flag and act accordingly. + // Skipping AccMode bits as they are present in every case. diff --git a/repo/apps/chromium/gcc-arm.patch b/repo/apps/chromium/gcc-arm.patch new file mode 100644 index 0000000..9eaa240 --- /dev/null +++ b/repo/apps/chromium/gcc-arm.patch @@ -0,0 +1,11 @@ +--- ./third_party/zlib/BUILD.gn.orig ++++ ./third_party/zlib/BUILD.gn +@@ -21,7 +21,7 @@ + !(is_win && !is_clang)) { + # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for + # Windows on Arm MSVC builds, see http://crbug.com/v8/10012. +- if (arm_use_neon) { ++ if (arm_use_neon && is_clang) { + use_arm_neon_optimizations = true + } + } diff --git a/repo/apps/chromium/gdbinit.patch b/repo/apps/chromium/gdbinit.patch new file mode 100644 index 0000000..39d3464 --- /dev/null +++ b/repo/apps/chromium/gdbinit.patch @@ -0,0 +1,21 @@ +--- ./tools/gdb/gdbinit.orig ++++ ./tools/gdb/gdbinit +@@ -50,17 +50,7 @@ + + def set_src_dir(compile_dir): + global src_dir +- git = subprocess.Popen( +- ['git', '-C', compile_dir, 'rev-parse', '--show-toplevel'], +- stdout=subprocess.PIPE, +- stderr=subprocess.PIPE) +- src_dir, _ = git.communicate() +- if git.returncode: +- return +- if isinstance(src_dir, str): +- src_dir = src_dir.rstrip() +- else: +- src_dir = src_dir.decode('utf-8').rstrip() ++ src_dir = os.path.abspath(os.getcwd()) + + load_libcxx_pretty_printers(src_dir) + diff --git a/repo/apps/chromium/google-api.keys b/repo/apps/chromium/google-api.keys new file mode 100644 index 0000000..8cd0f0a --- /dev/null +++ b/repo/apps/chromium/google-api.keys @@ -0,0 +1,10 @@ +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMKIyBQbGVhc2UgZG9udCB1c2UgdGhlc2Uga2V5cyBvdXRzaWRlIG9mIEFscGluZSBMaW51 +eCBwcm9qZWN0ICMKIyBZb3UgY2FuIGNyZWF0ZSB5b3VyIG93biBhdDogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICMKIyBodHRwOi8vd3d3LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2hv +dy10b3MvYXBpLWtleXMgICAgICAgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKX2dvb2dsZV9hcGlfa2V5PSJBSXphU3lDUkk0 +RUdwRHVfQUFISThFMnllbmpWaFdRZHA0RzhpZ2MiCl9nb29nbGVfZGVmYXVsdF9jbGllbnRfaWQ9 +IjQ5NzU1MDYyMjM2Ny11YnRrbWQzYjJwcDVndWxiYTVuNmhhNnNxNG4zNWVoai5hcHBzLmdvb2ds +ZXVzZXJjb250ZW50LmNvbSIKX2dvb2dsZV9kZWZhdWx0X2NsaWVudF9zZWNyZXQ9Ik5hQ1g4dElJ +QXBocmpzNTZuM1RwSHhfZSIKCg== diff --git a/repo/apps/chromium/media-base.patch b/repo/apps/chromium/media-base.patch new file mode 100644 index 0000000..99b881f --- /dev/null +++ b/repo/apps/chromium/media-base.patch @@ -0,0 +1,10 @@ +--- ./media/base/subsample_entry.h ++++ ./media/base/subsample_entry.h +@@ -9,6 +9,7 @@ + #include <stdint.h> + + #include <vector> ++#include <cstddef> + + #include "media/base/media_export.h" + diff --git a/repo/apps/chromium/memory-tagging-arm64.patch b/repo/apps/chromium/memory-tagging-arm64.patch new file mode 100644 index 0000000..6072698 --- /dev/null +++ b/repo/apps/chromium/memory-tagging-arm64.patch @@ -0,0 +1,18 @@ +--- ./base/allocator/partition_allocator/tagging.cc.orig ++++ ./base/allocator/partition_allocator/tagging.cc +@@ -19,15 +19,6 @@ + #define PR_GET_TAGGED_ADDR_CTRL 56 + #define PR_TAGGED_ADDR_ENABLE (1UL << 0) + +-#if BUILDFLAG(IS_LINUX) +-#include <linux/version.h> +- +-// Linux headers already provide these since v5.10. +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) +-#define HAS_PR_MTE_MACROS +-#endif +-#endif +- + #ifndef HAS_PR_MTE_MACROS + #define PR_MTE_TCF_SHIFT 1 + #define PR_MTE_TCF_NONE (0UL << PR_MTE_TCF_SHIFT) diff --git a/repo/apps/chromium/musl-crashpad.patch b/repo/apps/chromium/musl-crashpad.patch new file mode 100644 index 0000000..387deea --- /dev/null +++ b/repo/apps/chromium/musl-crashpad.patch @@ -0,0 +1,25 @@ +diff --git a/third_party/crashpad/crashpad/util/linux/ptracer.cc b/third_party/crashpad/crashpad/util/linux/ptracer.cc +index c6c9229..a5336b6 100644 +--- ./third_party/crashpad/crashpad/util/linux/ptracer.cc ++++ ./third_party/crashpad/crashpad/util/linux/ptracer.cc +@@ -26,6 +26,7 @@ + + #if defined(ARCH_CPU_X86_FAMILY) + #include <asm/ldt.h> ++#include <asm/ptrace-abi.h> + #endif + + namespace crashpad { +diff --git a/third_party/crashpad/crashpad/util/linux/thread_info.h b/third_party/crashpad/crashpad/util/linux/thread_info.h +index 5b55c24..08cec52 100644 +--- ./third_party/crashpad/crashpad/util/linux/thread_info.h ++++ ./third_party/crashpad/crashpad/util/linux/thread_info.h +@@ -273,7 +273,7 @@ union FloatContext { + "Size mismatch"); + #elif defined(ARCH_CPU_ARMEL) + static_assert(sizeof(f32_t::fpregs) == sizeof(user_fpregs), "Size mismatch"); +-#if !defined(__GLIBC__) ++#if defined(OS_ANDROID) + static_assert(sizeof(f32_t::vfp) == sizeof(user_vfp), "Size mismatch"); + #endif + #elif defined(ARCH_CPU_ARM64) diff --git a/repo/apps/chromium/musl-fixes.patch b/repo/apps/chromium/musl-fixes.patch new file mode 100644 index 0000000..da2c115 --- /dev/null +++ b/repo/apps/chromium/musl-fixes.patch @@ -0,0 +1,221 @@ +--- ./third_party/lss/linux_syscall_support.h.orig ++++ ./third_party/lss/linux_syscall_support.h +@@ -1127,6 +1127,12 @@ + #ifndef __NR_fallocate + #define __NR_fallocate 285 + #endif ++ ++#undef __NR_pread ++#define __NR_pread __NR_pread64 ++#undef __NR_pwrite ++#define __NR_pwrite __NR_pwrite64 ++ + /* End of x86-64 definitions */ + #elif defined(__mips__) + #if _MIPS_SIM == _MIPS_SIM_ABI32 +--- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig ++++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h +@@ -37,6 +37,10 @@ + #include "common/memory.h" + #include "google_breakpad/common/minidump_format.h" + ++#if !defined(__GLIBC__) ++ #define _libc_fpstate _fpstate ++#endif ++ + namespace google_breakpad { + + // Wraps platform-dependent implementations of accessors to ucontext_t structs. +--- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig ++++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h +@@ -36,6 +36,7 @@ + #include <elf.h> + #include <link.h> + #include <stddef.h> ++#include <limits.h> + + #include "common/memory_range.h" + +--- ./sandbox/linux/suid/process_util.h.orig ++++ ./sandbox/linux/suid/process_util.h +@@ -11,6 +11,14 @@ + #include <stdbool.h> + #include <sys/types.h> + ++// Some additional functions ++# define TEMP_FAILURE_RETRY(expression) \ ++ (__extension__ \ ++ ({ long int __result; \ ++ do __result = (long int) (expression); \ ++ while (__result == -1L && errno == EINTR); \ ++ __result; })) ++ + // This adjusts /proc/process/oom_score_adj so the Linux OOM killer + // will prefer certain process types over others. The range for the + // adjustment is [-1000, 1000], with [0, 1000] being user accessible. +--- ./sandbox/linux/seccomp-bpf/trap.cc.orig 2020-04-12 08:26:40.184159217 -0400 ++++ ./sandbox/linux/seccomp-bpf/trap.cc 2020-04-12 08:46:16.737191222 -0400 +@@ -174,7 +174,7 @@ + // If the version of glibc doesn't include this information in + // siginfo_t (older than 2.17), we need to explicitly copy it + // into an arch_sigsys structure. +- memcpy(&sigsys, &info->_sifields, sizeof(sigsys)); ++ memcpy(&sigsys, &info->__sifields, sizeof(sigsys)); + #endif + + #if defined(__mips__) +diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +--- ./chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig ++++ ./chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +@@ -59,7 +59,9 @@ + // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch + // of lacros-chrome is complete. + #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) ++#if defined(__GLIBC__) + #include <gnu/libc-version.h> ++#endif + + #include "base/linux_util.h" + #include "base/strings/string_split.h" +@@ -321,7 +323,7 @@ + void RecordLinuxGlibcVersion() { + // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch + // of lacros-chrome is complete. +-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) ++#if defined(__GLIBC__) || BUILDFLAG(IS_CHROMEOS_LACROS) + base::Version version(gnu_get_libc_version()); + + UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE; +--- ./services/device/serial/serial_io_handler_posix.cc.orig 2019-07-03 10:57:32.568171835 -0400 ++++ ./services/device/serial/serial_io_handler_posix.cc 2019-07-03 10:57:16.867983031 -0400 +@@ -6,6 +6,7 @@ + + #include <sys/ioctl.h> + #include <termios.h> ++#include <asm-generic/ioctls.h> + + #include <algorithm> + #include <utility> +diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/include/opentype-sanitiser.h +--- ./third_party/ots/src/include/opentype-sanitiser.h ++++ ./third_party/ots/src/include/opentype-sanitiser.h +@@ -20,6 +20,7 @@ typedef unsigned __int64 uint64_t; + #define htonl(x) _byteswap_ulong (x) + #define htons(x) _byteswap_ushort (x) + #else ++#include <sys/types.h> + #include <arpa/inet.h> + #include <stdint.h> + #endif +--- ./base/logging.cc.orig ++++ ./base/logging.cc +@@ -592,8 +592,7 @@ + + LogMessage::~LogMessage() { + size_t stack_start = stream_.tellp(); +-#if !defined(OFFICIAL_BUILD) && !BUILDFLAG(IS_NACL) && !defined(__UCLIBC__) && \ +- !BUILDFLAG(IS_AIX) ++#if !defined(OFFICIAL_BUILD) && !defined(OS_NACL) && defined(__GLIBC__) + if (severity_ == LOGGING_FATAL && !base::debug::BeingDebugged()) { + // Include a stack trace on a fatal, unless a debugger is attached. + base::debug::StackTrace stack_trace; +--- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig ++++ ./third_party/blink/renderer/platform/wtf/stack_util.cc +@@ -28,7 +28,7 @@ + // FIXME: On Mac OSX and Linux, this method cannot estimate stack size + // correctly for the main thread. + +-#elif defined(__GLIBC__) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FREEBSD) || \ ++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FREEBSD) || \ + BUILDFLAG(IS_FUCHSIA) + // pthread_getattr_np() can fail if the thread is not invoked by + // pthread_create() (e.g., the main thread of blink_unittests). +@@ -96,7 +96,7 @@ + } + + void* GetStackStart() { +-#if defined(__GLIBC__) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FREEBSD) || \ ++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FREEBSD) || \ + BUILDFLAG(IS_FUCHSIA) + pthread_attr_t attr; + int error; +--- ./third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Signals.inc.orig 2019-06-18 11:51:17.000000000 -0400 ++++ ./third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Signals.inc 2019-07-03 12:32:50.938758186 -0400 +@@ -25,7 +25,7 @@ + #include "llvm/Support/raw_ostream.h" + #include <algorithm> + #include <string> +-#if HAVE_EXECINFO_H ++#if HAVE_EXECINFO_H && defined(__GLIBC__) + # include <execinfo.h> // For backtrace(). + #endif + #if HAVE_SIGNAL_H +@@ -52,6 +52,7 @@ + #include <unwind.h> + #else + #undef HAVE__UNWIND_BACKTRACE ++#undef HAVE_BACKTRACE + #endif + #endif + +--- ./third_party/nasm/nasmlib/realpath.c.orig 2019-07-03 12:23:05.021949895 -0400 ++++ ./third_party/nasm/nasmlib/realpath.c 2019-07-03 12:24:24.246862665 -0400 +@@ -49,7 +49,7 @@ + + #include "nasmlib.h" + +-#ifdef HAVE_CANONICALIZE_FILE_NAME ++#if defined(__GLIBC__) + + /* + * GNU-specific, but avoids the realpath(..., NULL) +--- ./third_party/perfetto/include/perfetto/ext/base/thread_utils.h ++++ ./third_party/perfetto/include/perfetto/ext/base/thread_utils.h +@@ -29,7 +29,7 @@ + #include <algorithm> + #endif + +-#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) ++#if 1 + #include <sys/prctl.h> + #endif + +@@ -58,7 +58,7 @@ inline bool MaybeSetThreadName(const std::string& name) { + + inline bool GetThreadName(std::string& out_result) { + char buf[16] = {}; +-#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) ++#if 1 + if (prctl(PR_GET_NAME, buf) != 0) + return false; + #else +--- ./net/dns/public/scoped_res_state.cc.orig ++++ ./net/dns/public/scoped_res_state.cc +@@ -13,7 +13,7 @@ + namespace net { + + ScopedResState::ScopedResState() { +-#if BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_FUCHSIA) ++#if BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_FUCHSIA) || defined(_GNU_SOURCE) + // Note: res_ninit in glibc always returns 0 and sets RES_INIT. + // res_init behaves the same way. + memset(&_res, 0, sizeof(_res)); +@@ -25,16 +25,8 @@ + } + + ScopedResState::~ScopedResState() { +-#if !BUILDFLAG(IS_OPENBSD) && !BUILDFLAG(IS_FUCHSIA) +- +- // Prefer res_ndestroy where available. +-#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FREEBSD) +- res_ndestroy(&res_); +-#else +- res_nclose(&res_); +-#endif // BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FREEBSD) +- +-#endif // !BUILDFLAG(IS_OPENBSD) && !BUILDFLAG(IS_FUCHSIA) ++ // musl res_init() doesn't actually do anything ++ // no destruction is necessary as no memory has been allocated + } + + bool ScopedResState::IsValid() const { diff --git a/repo/apps/chromium/musl-hacks.patch b/repo/apps/chromium/musl-hacks.patch new file mode 100644 index 0000000..93db25a --- /dev/null +++ b/repo/apps/chromium/musl-hacks.patch @@ -0,0 +1,98 @@ +--- ./base/debug/stack_trace.cc ++++ ./base/debug/stack_trace.cc +@@ -168,7 +168,7 @@ + + #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) + uintptr_t GetStackEnd() { +-#if BUILDFLAG(IS_ANDROID) ++#if BUILDFLAG(IS_ANDROID) || (defined(OS_LINUX) && !defined(__GLIBC__)) + // Bionic reads proc/maps on every call to pthread_getattr_np() when called + // from the main thread. So we need to cache end of stack in that case to get + // acceptable performance. +@@ -234,8 +234,10 @@ + defined(MEMORY_SANITIZER) + // Sanitizer configurations (ASan, TSan, MSan) emit unsymbolized stacks. + return false; +-#else ++#elif defined(__GLIBC__) + return true; ++#else ++ return false; + #endif + } + +@@ -251,7 +253,9 @@ + } + + void StackTrace::OutputToStream(std::ostream* os) const { ++#if defined(__GLIBC__) && !defined(_AIX) + OutputToStreamWithPrefix(os, nullptr); ++#endif + } + + std::string StackTrace::ToString() const { +@@ -259,7 +263,7 @@ + } + std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const { + std::stringstream stream; +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + OutputToStreamWithPrefix(&stream, prefix_string); + #endif + return stream.str(); +--- ./net/socket/udp_socket_posix.cc ++++ ./net/socket/udp_socket_posix.cc +@@ -1191,7 +1191,7 @@ + msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()}); + msgvec->reserve(buffers.size()); + for (size_t j = 0; j < buffers.size(); j++) +- msgvec->push_back({{nullptr, 0, &msg_iov[j], 1, nullptr, 0, 0}, 0}); ++ msgvec->push_back({{nullptr, 0, &msg_iov[j], 1, 0, 0, 0}, 0}); + int result = HANDLE_EINTR(Sendmmsg(fd, &msgvec[0], buffers.size(), 0)); + SendResult send_result(0, 0, std::move(buffers)); + if (result < 0) { +--- ./base/debug/elf_reader.cc.orig ++++ ./base/debug/elf_reader.cc +@@ -149,7 +149,12 @@ + strtab_addr = static_cast<size_t>(dynamic_iter->d_un.d_ptr) + + reinterpret_cast<const char*>(relocation_offset); + #else +- strtab_addr = reinterpret_cast<const char*>(dynamic_iter->d_un.d_ptr); ++ if (dynamic_iter->d_un.d_ptr < relocation_offset) { ++ strtab_addr = static_cast<size_t>(dynamic_iter->d_un.d_ptr) + ++ reinterpret_cast<const char*>(relocation_offset); ++ } else { ++ strtab_addr = reinterpret_cast<const char*>(dynamic_iter->d_un.d_ptr); ++ } + #endif + } else if (dynamic_iter->d_tag == DT_SONAME) { + soname_strtab_offset = dynamic_iter->d_un.d_val; +--- ./mojo/public/c/system/thunks.cc.orig ++++ ./mojo/public/c/system/thunks.cc +@@ -100,7 +100,8 @@ + base::ScopedAllowBlocking allow_blocking; + base::NativeLibraryOptions library_options; + #if !defined(ADDRESS_SANITIZER) && !defined(THREAD_SANITIZER) && \ +- !defined(MEMORY_SANITIZER) && !defined(LEAK_SANITIZER) ++ !defined(MEMORY_SANITIZER) && !defined(LEAK_SANITIZER) && \ ++ defined(RTLD_DEEPBIND) + // Sanitizer builds cannnot support RTLD_DEEPBIND, but they also disable + // allocator shims, so it's unnecessary there. + library_options.prefer_own_symbols = true; +--- ./base/native_library_unittest.cc.orig ++++ ./base/native_library_unittest.cc +@@ -121,6 +121,7 @@ + #if !defined(OS_ANDROID) && !defined(THREAD_SANITIZER) && \ + !defined(MEMORY_SANITIZER) + ++#if defined(RTLD_DEEPBIND) + // Verifies that the |prefer_own_symbols| option satisfies its guarantee that + // a loaded library will always prefer local symbol resolution before + // considering global symbols. +@@ -156,6 +157,7 @@ + EXPECT_EQ(2, NativeLibraryTestIncrement()); + EXPECT_EQ(3, NativeLibraryTestIncrement()); + } ++#endif // defined(RTLD_DEEPBIND) + + #endif // !defined(OS_ANDROID) diff --git a/repo/apps/chromium/musl-libc++.patch b/repo/apps/chromium/musl-libc++.patch new file mode 100644 index 0000000..4316a7b --- /dev/null +++ b/repo/apps/chromium/musl-libc++.patch @@ -0,0 +1,51 @@ +--- ./buildtools/third_party/libc++/trunk/include/locale ++++ ./buildtools/third_party/libc++/trunk/include/locale +@@ -10,6 +10,15 @@ + #ifndef _LIBCPP_LOCALE + #define _LIBCPP_LOCALE + ++// musl doesn't define _l (with locale) variants of functions, as it only supports UTF-8. ++// we can simply make macros that will call the non-localated ones if we're using musl, or rather not-using something that has the _l ones. ++// couldn't find anything glibc #defines when it creates strtoull_l (that it doesn't undefine a few lines later), so let's test against glibc and glibc-likes. ++// almost all glibc-likes define __GNU_LIBRARY__ for compatibility ++#ifndef __GNU_LIBRARY__ ++#define strtoull_l(A, B, C, LOC) strtoull(A,B,C) ++#define strtoll_l(A, B, C, LOC) strtoll(A,B,C) ++#endif ++ + /* + locale synopsis + +--- ./buildtools/third_party/libc++/trunk/src/locale.cpp ++++ ./buildtools/third_party/libc++/trunk/src/locale.cpp +@@ -1019,11 +1019,11 @@ + return low; + } + +-#if defined(__EMSCRIPTEN__) ++// #if defined(__EMSCRIPTEN__) + extern "C" const unsigned short ** __ctype_b_loc(); + extern "C" const int ** __ctype_tolower_loc(); + extern "C" const int ** __ctype_toupper_loc(); +-#endif ++// #endif + + #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE + const ctype<char>::mask* +@@ -1127,12 +1127,10 @@ + #elif defined(_AIX) + return (const unsigned int *)__lc_ctype_ptr->obj->mask; + #else +- // Platform not supported: abort so the person doing the port knows what to +- // fix +-# warning ctype<char>::classic_table() is not implemented +- printf("ctype<char>::classic_table() is not implemented\n"); +- abort(); +- return NULL; ++// not sure any other libc like this exists, but there is no way to differentiate musl as of right now ++// to be fair, with the change above, this should always work ++// also, #warning is a gcc extension ++ return (const unsigned long *)*__ctype_b_loc(); + #endif + } + #endif diff --git a/repo/apps/chromium/musl-sandbox.patch b/repo/apps/chromium/musl-sandbox.patch new file mode 100644 index 0000000..4fe0098 --- /dev/null +++ b/repo/apps/chromium/musl-sandbox.patch @@ -0,0 +1,176 @@ +diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc +index ff5a1c0..da56b9b 100644 +--- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc ++++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc +@@ -139,21 +139,11 @@ namespace sandbox { + // present (as in newer versions of posix_spawn). + ResultExpr RestrictCloneToThreadsAndEPERMFork() { + const Arg<unsigned long> flags(0); +- +- // TODO(mdempsky): Extend DSL to support (flags & ~mask1) == mask2. +- const uint64_t kAndroidCloneMask = CLONE_VM | CLONE_FS | CLONE_FILES | +- CLONE_SIGHAND | CLONE_THREAD | +- CLONE_SYSVSEM; +- const uint64_t kObsoleteAndroidCloneMask = kAndroidCloneMask | CLONE_DETACHED; +- +- const uint64_t kGlibcPthreadFlags = +- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | +- CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID; +- const BoolExpr glibc_test = flags == kGlibcPthreadFlags; +- +- const BoolExpr android_test = +- AnyOf(flags == kAndroidCloneMask, flags == kObsoleteAndroidCloneMask, +- flags == kGlibcPthreadFlags); ++ const int required = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | ++ CLONE_THREAD | CLONE_SYSVSEM; ++ const int safe = CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | ++ CLONE_DETACHED; ++ const BoolExpr thread_clone_ok = (flags&~safe)==required; + + // The following two flags are the two important flags in any vfork-emulating + // clone call. EPERM any clone call that contains both of them. +@@ -163,7 +153,7 @@ ResultExpr RestrictCloneToThreadsAndEPERMFork() { + AnyOf((flags & (CLONE_VM | CLONE_THREAD)) == 0, + (flags & kImportantCloneVforkFlags) == kImportantCloneVforkFlags); + +- return If(IsAndroid() ? android_test : glibc_test, Allow()) ++ return If(thread_clone_ok, Allow()) + .ElseIf(is_fork_or_clone_vfork, Error(EPERM)) + .Else(CrashSIGSYSClone()); + } +diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc +index d9d1882..0567557 100644 +--- a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc ++++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc +@@ -392,6 +392,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) { + #if defined(__i386__) + case __NR_waitpid: + #endif ++ case __NR_set_tid_address: + return true; + case __NR_clone: // Should be parameter-restricted. + case __NR_setns: // Privileged. +@@ -404,7 +405,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) { + #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) + case __NR_set_thread_area: + #endif +- case __NR_set_tid_address: + case __NR_unshare: + #if !defined(__mips__) && !defined(__aarch64__) + case __NR_vfork: +@@ -514,6 +514,8 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) { + case __NR_mlock: + case __NR_munlock: + case __NR_munmap: ++ case __NR_mremap: ++ case __NR_membarrier: + return true; + case __NR_madvise: + case __NR_mincore: +@@ -531,7 +533,6 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) { + case __NR_modify_ldt: + #endif + case __NR_mprotect: +- case __NR_mremap: + case __NR_msync: + case __NR_munlockall: + case __NR_readahead: +diff --git a/sandbox/linux/system_headers/arm64_linux_syscalls.h ./sandbox/linux/system_headers/arm64_linux_syscalls.h +index 59d0eab..7ae7002 100644 +--- a/sandbox/linux/system_headers/arm64_linux_syscalls.h ++++ ./sandbox/linux/system_headers/arm64_linux_syscalls.h +@@ -1063,4 +1063,8 @@ + #define __NR_memfd_create 279 + #endif + ++#if !defined(__NR_membarrier) ++#define __NR_membarrier 283 ++#endif ++ + #endif // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_ +diff --git a/sandbox/linux/system_headers/arm_linux_syscalls.h ./sandbox/linux/system_headers/arm_linux_syscalls.h +index 1addd53..7843b5e 100644 +--- a/sandbox/linux/system_headers/arm_linux_syscalls.h ++++ ./sandbox/linux/system_headers/arm_linux_syscalls.h +@@ -1385,6 +1385,10 @@ + #define __NR_memfd_create (__NR_SYSCALL_BASE+385) + #endif + ++#if !defined(__NR_membarrier) ++#define __NR_membarrier (__NR_SYSCALL_BASE+389) ++#endif ++ + // ARM private syscalls. + #if !defined(__ARM_NR_BASE) + #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000) +diff --git a/sandbox/linux/system_headers/linux_syscalls.h ./sandbox/linux/system_headers/linux_syscalls.h +index 2b78a0c..b6fedb5 100644 +--- a/sandbox/linux/system_headers/linux_syscalls.h ++++ ./sandbox/linux/system_headers/linux_syscalls.h +@@ -10,6 +10,7 @@ + #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_ + + #include "build/build_config.h" ++#include <sys/syscall.h> + + #if defined(__x86_64__) + #include "sandbox/linux/system_headers/x86_64_linux_syscalls.h" +diff --git a/sandbox/linux/system_headers/mips64_linux_syscalls.h ./sandbox/linux/system_headers/mips64_linux_syscalls.h +index ec75815..5515270 100644 +--- a/sandbox/linux/system_headers/mips64_linux_syscalls.h ++++ ./sandbox/linux/system_headers/mips64_linux_syscalls.h +@@ -1271,4 +1271,8 @@ + #define __NR_memfd_create (__NR_Linux + 314) + #endif + ++#if !defined(__NR_membarrier) ++#define __NR_membarrier (__NR_Linux 318) ++#endif ++ + #endif // SANDBOX_LINUX_SYSTEM_HEADERS_MIPS64_LINUX_SYSCALLS_H_ +diff --git a/sandbox/linux/system_headers/mips_linux_syscalls.h ./sandbox/linux/system_headers/mips_linux_syscalls.h +index ddbf97f..ad3d64b 100644 +--- a/sandbox/linux/system_headers/mips_linux_syscalls.h ++++ ./sandbox/linux/system_headers/mips_linux_syscalls.h +@@ -1433,4 +1433,8 @@ + #define __NR_memfd_create (__NR_Linux + 354) + #endif + ++#if !defined(__NR_membarrier) ++#define __NR_membarrier (__NR_Linux 358) ++#endif ++ + #endif // SANDBOX_LINUX_SYSTEM_HEADERS_MIPS_LINUX_SYSCALLS_H_ +diff --git a/sandbox/linux/system_headers/x86_64_linux_syscalls.h ./sandbox/linux/system_headers/x86_64_linux_syscalls.h +index b0ae0a2..8b12029 100644 +--- a/sandbox/linux/system_headers/x86_64_linux_syscalls.h ++++ ./sandbox/linux/system_headers/x86_64_linux_syscalls.h +@@ -1350,5 +1350,9 @@ + #define __NR_rseq 334 + #endif + ++#if !defined(__NR_membarrier) ++#define __NR_membarrier 324 ++#endif ++ + #endif // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_ + +diff --git a/services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc ./services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc +index a85c0ea..715aa1e 100644 +--- a/sandbox/policy/linux/bpf_renderer_policy_linux.cc ++++ ./sandbox/policy/linux/bpf_renderer_policy_linux.cc +@@ -93,11 +93,11 @@ + case __NR_sysinfo: + case __NR_times: + case __NR_uname: +- return Allow(); +- case __NR_sched_getaffinity: + case __NR_sched_getparam: + case __NR_sched_getscheduler: + case __NR_sched_setscheduler: ++ return Allow(); ++ case __NR_sched_getaffinity: + return RestrictSchedTarget(GetPolicyPid(), sysno); + case __NR_prlimit64: + // See crbug.com/662450 and setrlimit comment above. + diff --git a/repo/apps/chromium/musl-stat.patch b/repo/apps/chromium/musl-stat.patch new file mode 100644 index 0000000..5a6036a --- /dev/null +++ b/repo/apps/chromium/musl-stat.patch @@ -0,0 +1,12 @@ +--- a/base/files/file.h.orig ++++ b/base/files/file.h +@@ -19,7 +19,8 @@ + #include "build/build_config.h" + + #if BUILDFLAG(IS_BSD) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_NACL) || \ +- BUILDFLAG(IS_FUCHSIA) || (BUILDFLAG(IS_ANDROID) && __ANDROID_API__ < 21) ++ BUILDFLAG(IS_FUCHSIA) || (BUILDFLAG(IS_ANDROID) && __ANDROID_API__ < 21) || \ ++ (defined(OS_LINUX) && !defined(__GLIBC__)) + struct stat; + namespace base { + typedef struct stat stat_wrapper_t; diff --git a/repo/apps/chromium/musl-tid-caching.patch b/repo/apps/chromium/musl-tid-caching.patch new file mode 100644 index 0000000..bb83038 --- /dev/null +++ b/repo/apps/chromium/musl-tid-caching.patch @@ -0,0 +1,81 @@ +--- ./sandbox/linux/services/namespace_sandbox.cc.orig ++++ ./sandbox/linux/services/namespace_sandbox.cc +@@ -209,6 +209,70 @@ + return base::LaunchProcess(argv, launch_options_copy); + } + ++#if defined(__aarch64__) ++#define TLS_ABOVE_TP ++#endif ++ ++struct musl_pthread ++{ ++ /* Part 1 -- these fields may be external or ++ * internal (accessed via asm) ABI. Do not change. */ ++ struct pthread *self; ++#ifndef TLS_ABOVE_TP ++ uintptr_t *dtv; ++#endif ++ struct pthread *prev, *next; /* non-ABI */ ++ uintptr_t sysinfo; ++#ifndef TLS_ABOVE_TP ++#ifdef CANARY_PAD ++ uintptr_t canary_pad; ++#endif ++ uintptr_t canary; ++#endif ++ ++/* Part 2 -- implementation details, non-ABI. */ ++ int tid; ++ int errno_val; ++ volatile int detach_state; ++ volatile int cancel; ++ volatile unsigned char canceldisable, cancelasync; ++ unsigned char tsd_used:1; ++ unsigned char dlerror_flag:1; ++ unsigned char *map_base; ++ size_t map_size; ++ void *stack; ++ size_t stack_size; ++ size_t guard_size; ++ void *result; ++ struct __ptcb *cancelbuf; ++ void **tsd; ++ struct { ++ volatile void *volatile head; ++ long off; ++ volatile void *volatile pending; ++ } robust_list; ++ int h_errno_val; ++ volatile int timer_id; ++ locale_t locale; ++ volatile int killlock[1]; ++ char *dlerror_buf; ++ void *stdio_locks; ++ ++ /* Part 3 -- the positions of these fields relative to ++ * the end of the structure is external and internal ABI. */ ++#ifdef TLS_ABOVE_TP ++ uintptr_t canary; ++ uintptr_t *dtv; ++#endif ++}; ++ ++void MaybeUpdateMuslTidCache() ++{ ++ pid_t real_tid = sys_gettid(); ++ pid_t* cached_tid_location = &reinterpret_cast<struct musl_pthread*>(pthread_self())->tid; ++ *cached_tid_location = real_tid; ++} ++ + // static + pid_t NamespaceSandbox::ForkInNewPidNamespace(bool drop_capabilities_in_child) { + const pid_t pid = +@@ -226,6 +290,7 @@ + #if defined(LIBC_GLIBC) + MaybeUpdateGlibcTidCache(); + #endif ++ MaybeUpdateMuslTidCache(); + return 0; + } + diff --git a/repo/apps/chromium/musl-v8-monotonic-pthread-cont_timedwait.patch b/repo/apps/chromium/musl-v8-monotonic-pthread-cont_timedwait.patch new file mode 100644 index 0000000..768027d --- /dev/null +++ b/repo/apps/chromium/musl-v8-monotonic-pthread-cont_timedwait.patch @@ -0,0 +1,22 @@ +Use monotonic clock for pthread_cond_timedwait with musl too. + +--- ./v8/src/base/platform/condition-variable.cc ++++ ./v8/src/base/platform/condition-variable.cc +@@ -16,7 +16,7 @@ + + ConditionVariable::ConditionVariable() { + #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ +- (V8_OS_LINUX && V8_LIBC_GLIBC)) ++ V8_OS_LINUX) + // On Free/Net/OpenBSD and Linux with glibc we can change the time + // source for pthread_cond_timedwait() to use the monotonic clock. + pthread_condattr_t attr; +@@ -92,7 +92,7 @@ + &native_handle_, &mutex->native_handle(), &ts); + #else + #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \ +- (V8_OS_LINUX && V8_LIBC_GLIBC)) ++ V8_OS_LINUX) + // On Free/Net/OpenBSD and Linux with glibc we can change the time + // source for pthread_cond_timedwait() to use the monotonic clock. + result = clock_gettime(CLOCK_MONOTONIC, &ts); diff --git a/repo/apps/chromium/nasm.patch b/repo/apps/chromium/nasm.patch new file mode 100644 index 0000000..ff22a6f --- /dev/null +++ b/repo/apps/chromium/nasm.patch @@ -0,0 +1,11 @@ +--- ./third_party/nasm/config/config-linux.h ++++ ./third_party/nasm/config/config-linux.h +@@ -117,7 +117,7 @@ + #define HAVE_ACCESS 1 + + /* Define to 1 if you have the `canonicalize_file_name' function. */ +-#define HAVE_CANONICALIZE_FILE_NAME 1 ++// #define HAVE_CANONICALIZE_FILE_NAME 1 + + /* Define to 1 if you have the `cpu_to_le16' intrinsic function. */ + /* #undef HAVE_CPU_TO_LE16 */ diff --git a/repo/apps/chromium/no-execinfo.patch b/repo/apps/chromium/no-execinfo.patch new file mode 100644 index 0000000..8cb2f79 --- /dev/null +++ b/repo/apps/chromium/no-execinfo.patch @@ -0,0 +1,75 @@ +--- ./base/debug/stack_trace_posix.cc ++++ ./base/debug/stack_trace_posix.cc +@@ -27,7 +27,7 @@ + #if !defined(USE_SYMBOLIZE) + #include <cxxabi.h> + #endif +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + #include <execinfo.h> + #endif + +@@ -89,7 +89,7 @@ + // Note: code in this function is NOT async-signal safe (std::string uses + // malloc internally). + +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + std::string::size_type search_from = 0; + while (search_from < text->size()) { + // Look for the start of a mangled symbol, from search_from. +@@ -136,7 +136,7 @@ + virtual ~BacktraceOutputHandler() = default; + }; + +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + void OutputPointer(void* pointer, BacktraceOutputHandler* handler) { + // This should be more than enough to store a 64-bit number in hex: + // 16 hex digits + 1 for null-terminator. +@@ -839,7 +839,7 @@ + // If we do not have unwind tables, then try tracing using frame pointers. + return base::debug::TraceStackFramePointers(const_cast<const void**>(trace), + count, 0); +-#elif !defined(__UCLIBC__) && !defined(_AIX) ++#elif defined(__GLIBC__) && !defined(_AIX) + // Though the backtrace API man page does not list any possible negative + // return values, we take no chance. + return base::saturated_cast<size_t>(backtrace(trace, count)); +@@ -852,13 +852,13 @@ + // NOTE: This code MUST be async-signal safe (it's used by in-process + // stack dumping signal handler). NO malloc or stdio is allowed here. + +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + PrintBacktraceOutputHandler handler; + ProcessBacktrace(trace_, count_, prefix_string, &handler); + #endif + } + +-#if !defined(__UCLIBC__) && !defined(_AIX) ++#if defined(__GLIBC__) && !defined(_AIX) + void StackTrace::OutputToStreamWithPrefix(std::ostream* os, + const char* prefix_string) const { + StreamBacktraceOutputHandler handler(os); +--- ./v8/src/codegen/external-reference-table.cc.orig ++++ ./v8/src/codegen/external-reference-table.cc +@@ -11,7 +11,9 @@ + + #if defined(DEBUG) && defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID) + #define SYMBOLIZE_FUNCTION ++#if defined(__GLIBC__) + #include <execinfo.h> ++#endif + + #include <vector> + +@@ -96,7 +98,7 @@ + } + + const char* ExternalReferenceTable::ResolveSymbol(void* address) { +-#ifdef SYMBOLIZE_FUNCTION ++#if defined(SYMBOLIZE_FUNCTION) && defined(__GLIBC__) + char** names = backtrace_symbols(&address, 1); + const char* name = names[0]; + // The array of names is malloc'ed. However, each name string is static diff --git a/repo/apps/chromium/no-getcontext.patch b/repo/apps/chromium/no-getcontext.patch new file mode 100644 index 0000000..71c1e91 --- /dev/null +++ b/repo/apps/chromium/no-getcontext.patch @@ -0,0 +1,26 @@ +--- ./third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc ++++ ./third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc +@@ -490,7 +490,9 @@ + siginfo.si_code = SI_USER; + siginfo.si_pid = getpid(); + ucontext_t context; ++#if defined(__GLIBC__) + getcontext(&context); ++#endif + return HandleSignal(sig, &siginfo, &context); + } + +@@ -675,9 +677,13 @@ + sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); + + CrashContext context; ++#if defined(__GLIBC__) + int getcontext_result = getcontext(&context.context); + if (getcontext_result) + return false; ++#else ++ return false; ++#endif + + #if defined(__i386__) + // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved diff --git a/repo/apps/chromium/no-mallinfo.patch b/repo/apps/chromium/no-mallinfo.patch new file mode 100644 index 0000000..23ce40e --- /dev/null +++ b/repo/apps/chromium/no-mallinfo.patch @@ -0,0 +1,83 @@ +--- ./base/trace_event/malloc_dump_provider.cc.orig ++++ ./base/trace_event/malloc_dump_provider.cc +@@ -212,7 +212,7 @@ + &allocated_objects_count); + #elif defined(OS_FUCHSIA) + // TODO(fuchsia): Port, see https://crbug.com/706592. +-#else ++#elif defined(__GLIBC__) + #if defined(__GLIBC__) && defined(__GLIBC_PREREQ) + #if __GLIBC_PREREQ(2, 33) + #define MALLINFO2_FOUND_IN_LIBC +--- ./base/process/process_metrics_posix.cc.orig ++++ ./base/process/process_metrics_posix.cc +@@ -105,7 +105,7 @@ + + #endif // !BUILDFLAG(IS_FUCHSIA) + +-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ++#if (BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + namespace { + + size_t GetMallocUsageMallinfo() { +@@ -123,7 +123,7 @@ + } + + } // namespace +-#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || ++#endif // (BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID) + + size_t ProcessMetrics::GetMallocUsage() { +@@ -131,9 +131,9 @@ + malloc_statistics_t stats = {0}; + malloc_zone_statistics(nullptr, &stats); + return stats.size_in_use; +-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) ++#elif (BUILDFLAG(IS_LINUX) && defined(__GLIBC__)) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + return GetMallocUsageMallinfo(); +-#elif BUILDFLAG(IS_FUCHSIA) ++#else + // TODO(fuchsia): Not currently exposed. https://crbug.com/735087. + return 0; + #endif +--- ./third_party/tflite/src/tensorflow/lite/profiling/memory_info.cc.orig ++++ ./third_party/tflite/src/tensorflow/lite/profiling/memory_info.cc +@@ -35,7 +35,7 @@ + + MemoryUsage GetMemoryUsage() { + MemoryUsage result; +-#ifdef __linux__ ++#if defined(__linux__) && defined(__GLIBC__) + rusage res; + if (getrusage(RUSAGE_SELF, &res) == 0) { + result.max_rss_kb = res.ru_maxrss; +--- ./third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc ++++ ./third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig +@@ -86,11 +86,11 @@ + } + + size_t Process::GetMallocUsage() { +-#if defined(HAVE_MALLINFO2) ++#if defined(HAVE_MALLINFO2) && defined(__GLIBC__) + struct mallinfo2 mi; + mi = ::mallinfo2(); + return mi.uordblks; +-#elif defined(HAVE_MALLINFO) ++#elif defined(HAVE_MALLINFO) && defined(__GLIBC__) + struct mallinfo mi; + mi = ::mallinfo(); + return mi.uordblks; + +--- ./third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig 2019-09-30 13:03:42.556880537 -0400 ++++ ./third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h 2019-09-30 13:07:27.989821227 -0400 +@@ -122,7 +122,9 @@ + /* #undef HAVE_MALLCTL */ + + /* Define to 1 if you have the `mallinfo' function. */ ++#if defined(__GLIBC__) + #define HAVE_MALLINFO 1 ++#endif + + /* Define to 1 if you have the <malloc.h> header file. */ + #define HAVE_MALLOC_H 1 diff --git a/repo/apps/chromium/quiche-arena-size.patch b/repo/apps/chromium/quiche-arena-size.patch new file mode 100644 index 0000000..50abcae --- /dev/null +++ b/repo/apps/chromium/quiche-arena-size.patch @@ -0,0 +1,11 @@ +--- ./net/third_party/quiche/src/quic/core/quic_one_block_arena.h ++++ ./net/third_party/quiche/src/quic/core/quic_one_block_arena.h +@@ -69,7 +69,7 @@ + + // QuicConnections currently use around 1KB of polymorphic types which would + // ordinarily be on the heap. Instead, store them inline in an arena. +-using QuicConnectionArena = QuicOneBlockArena<1152>; ++using QuicConnectionArena = QuicOneBlockArena<1504>; + + } // namespace quic + diff --git a/repo/apps/chromium/remove-strip_binary.patch b/repo/apps/chromium/remove-strip_binary.patch new file mode 100644 index 0000000..8b13c6a --- /dev/null +++ b/repo/apps/chromium/remove-strip_binary.patch @@ -0,0 +1,32 @@ +--- a/chrome/test/chromedriver/BUILD.gn.orig ++++ b/chrome/test/chromedriver/BUILD.gn +@@ -308,11 +308,7 @@ + } + } + +-if (is_linux) { +- chromedriver_output = "chromedriver.unstripped" +-} else { +- chromedriver_output = "chromedriver" +-} ++chromedriver_output = "chromedriver" + + executable("$chromedriver_output") { + testonly = true +@@ -336,16 +332,6 @@ + } + } + +-if (is_linux) { +- strip_binary("chromedriver") { +- testonly = true +- binary_input = "$root_out_dir/$chromedriver_output" +- symbol_output = "$root_out_dir/chromedriver.debug" +- stripped_binary_output = "$root_out_dir/chromedriver" +- deps = [ ":$chromedriver_output" ] +- } +-} +- + python_library("chromedriver_py_tests") { + testonly = true + deps = [ diff --git a/repo/apps/chromium/resolver.patch b/repo/apps/chromium/resolver.patch new file mode 100644 index 0000000..8dca36a --- /dev/null +++ b/repo/apps/chromium/resolver.patch @@ -0,0 +1,36 @@ +--- ./net/dns/host_resolver_manager.cc.orig ++++ ./net/dns/host_resolver_manager.cc +@@ -3014,8 +3014,7 @@ + NetworkChangeNotifier::AddConnectionTypeObserver(this); + if (system_dns_config_notifier_) + system_dns_config_notifier_->AddObserver(this); +-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_OPENBSD) && \ +- !BUILDFLAG(IS_ANDROID) ++#if defined(__GLIBC__) + EnsureDnsReloaderInit(); + #endif + +--- ./net/dns/dns_reloader.cc.orig ++++ ./net/dns/dns_reloader.cc +@@ -6,8 +6,7 @@ + + #include "build/build_config.h" + +-#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_OPENBSD) && \ +- !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA) ++#if defined(__GLIBC__) + + #include <resolv.h> + +--- ./net/dns/host_resolver_proc.cc.orig ++++ ./net/dns/host_resolver_proc.cc +@@ -176,8 +176,7 @@ + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::WILL_BLOCK); + +-#if BUILDFLAG(IS_POSIX) && \ +- !(BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_ANDROID)) ++#if defined(__GLIBC__) + DnsReloaderMaybeReload(); + #endif + absl::optional<AddressInfo> ai; diff --git a/repo/apps/chromium/revert-use-ffile-compilation-dir.patch b/repo/apps/chromium/revert-use-ffile-compilation-dir.patch new file mode 100644 index 0000000..f0c110f --- /dev/null +++ b/repo/apps/chromium/revert-use-ffile-compilation-dir.patch @@ -0,0 +1,48 @@ +diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn +index f442166..c325f72 100644 +--- a/build/config/compiler/BUILD.gn ++++ b/build/config/compiler/BUILD.gn +@@ -1248,19 +1248,12 @@ config("compiler_deterministic") { + # different build directory like "out/feature_a" and "out/feature_b" if + # we build same files with same compile flag. + # Other paths are already given in relative, no need to normalize them. +- if (is_nacl) { +- # TODO(https://crbug.com/1231236): Use -ffile-compilation-dir= here. +- cflags += [ +- "-Xclang", +- "-fdebug-compilation-dir", +- "-Xclang", +- ".", +- ] +- } else { +- # -ffile-compilation-dir is an alias for both -fdebug-compilation-dir= +- # and -fcoverage-compilation-dir=. +- cflags += [ "-ffile-compilation-dir=." ] +- } ++ cflags += [ ++ "-Xclang", ++ "-fdebug-compilation-dir", ++ "-Xclang", ++ ".", ++ ] + if (!is_win) { + # We don't use clang -cc1as on Windows (yet? https://crbug.com/762167) + asmflags = [ "-Wa,-fdebug-compilation-dir,." ] +diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni +index 008a386..89e7fdf 100644 +--- a/build/config/compiler/compiler.gni ++++ b/build/config/compiler/compiler.gni +@@ -238,8 +238,11 @@ declare_args() { + # deterministic builds to reduce compile times, so this is less relevant for + # official builders. + strip_absolute_paths_from_debug_symbols_default = +- is_android || is_fuchsia || is_nacl || (is_win && use_lld) || is_linux || +- is_chromeos || (is_apple && !enable_dsyms) ++ # TODO(crbug.com/1010267): remove '!use_clang_coverage', coverage build has ++ # dependency to absolute path of source files. ++ !use_clang_coverage && ++ (is_android || is_fuchsia || is_nacl || (is_win && use_lld) || is_linux || ++ is_chromeos || (is_apple && !enable_dsyms)) + + # If the platform uses stripped absolute paths by default, then we don't expose + # it as a configuration option. If this is causing problems, please file a bug. diff --git a/repo/apps/chromium/scoped-file.patch b/repo/apps/chromium/scoped-file.patch new file mode 100644 index 0000000..34bf6eb --- /dev/null +++ b/repo/apps/chromium/scoped-file.patch @@ -0,0 +1,31 @@ +--- ./base/files/scoped_file_linux.cc.orig ++++ ./base/files/scoped_file_linux.cc +@@ -7,6 +7,7 @@ + #include <algorithm> + #include <array> + #include <atomic> ++#include <dlfcn.h> + + #include "base/compiler_specific.h" + #include "base/debug/stack_trace.h" +@@ -80,9 +81,18 @@ + + extern "C" { + +-int __close(int); +- + __attribute__((visibility("default"), noinline)) int close(int fd) { ++ static int (*__close)(int) = nullptr; ++ ++ if (__close == nullptr) { ++ __close = (int (*)(int))dlsym(RTLD_NEXT, "close"); ++ ++ if (__close == nullptr) { ++ RAW_LOG(ERROR, "musl close not found\n"); ++ IMMEDIATE_CRASH(); ++ } ++ } ++ + if (base::IsFDOwned(fd) && g_is_ownership_enforced) + CrashOnFdOwnershipViolation(); + return __close(fd); diff --git a/repo/apps/chromium/sql-make-VirtualCursor-standard-layout-type.patch b/repo/apps/chromium/sql-make-VirtualCursor-standard-layout-type.patch new file mode 100644 index 0000000..3364d41 --- /dev/null +++ b/repo/apps/chromium/sql-make-VirtualCursor-standard-layout-type.patch @@ -0,0 +1,238 @@ +From 144479ad7b4287bee4067f95e4218f614798a865 Mon Sep 17 00:00:00 2001 +From: Stephan Hartmann <stha09@googlemail.com> +Date: Sun, 16 Jan 2022 19:15:26 +0000 +Subject: [PATCH] sql: make VirtualCursor standard layout type + +sql::recover::VirtualCursor needs to be a standard layout type, but +has members of type std::unique_ptr. However, std::unique_ptr is not +guaranteed to be standard layout. Compiling with clang combined with +gcc-11 libstdc++ fails because of this. + +Bug: 1189788 +Change-Id: Ia6dc388cc5ef1c0f2afc75f8ca45b9f12687ca9c +--- + sql/recover_module/btree.cc | 18 ++++++++++++------ + sql/recover_module/btree.h | 21 +++++++++++++++------ + sql/recover_module/cursor.cc | 24 ++++++++++++------------ + sql/recover_module/cursor.h | 2 +- + sql/recover_module/pager.cc | 5 ++--- + sql/recover_module/pager.h | 6 +++--- + 6 files changed, 45 insertions(+), 31 deletions(-) + +diff --git a/sql/recover_module/btree.cc b/sql/recover_module/btree.cc +index cc9420e5c05..f12d8fa32a2 100644 +--- a/sql/recover_module/btree.cc ++++ b/sql/recover_module/btree.cc +@@ -136,16 +136,22 @@ static_assert(std::is_trivially_destructible<LeafPageDecoder>::value, + "Move the destructor to the .cc file if it's non-trival"); + #endif // !DCHECK_IS_ON() + +-LeafPageDecoder::LeafPageDecoder(DatabasePageReader* db_reader) noexcept +- : page_id_(db_reader->page_id()), +- db_reader_(db_reader), +- cell_count_(ComputeCellCount(db_reader)), +- next_read_index_(0), +- last_record_size_(0) { ++LeafPageDecoder::LeafPageDecoder() noexcept = default; ++ ++void LeafPageDecoder::Initialize(DatabasePageReader* db_reader) { ++ page_id_ = db_reader->page_id(); ++ db_reader_ = db_reader; ++ cell_count_ = ComputeCellCount(db_reader); ++ next_read_index_ = 0; ++ last_record_size_ = 0; + DCHECK(IsOnValidPage(db_reader)); + DCHECK(DatabasePageReader::IsValidPageId(page_id_)); + } + ++void LeafPageDecoder::Reset() { ++ db_reader_ = nullptr; ++} ++ + bool LeafPageDecoder::TryAdvance() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(CanAdvance()); +diff --git a/sql/recover_module/btree.h b/sql/recover_module/btree.h +index eaa087a5c52..df0e0c937c0 100644 +--- a/sql/recover_module/btree.h ++++ b/sql/recover_module/btree.h +@@ -101,9 +101,7 @@ class LeafPageDecoder { + public: + // Creates a decoder for a DatabasePageReader's last read page. + // +- // |db_reader| must have been used to read an inner page of a table B-tree. +- // |db_reader| must outlive this instance. +- explicit LeafPageDecoder(DatabasePageReader* db_reader) noexcept; ++ LeafPageDecoder() noexcept; + ~LeafPageDecoder() noexcept = default; + + LeafPageDecoder(const LeafPageDecoder&) = delete; +@@ -151,6 +149,17 @@ class LeafPageDecoder { + // read as long as CanAdvance() returns true. + bool TryAdvance(); + ++ // Initialize with DatabasePageReader ++ // |db_reader| must have been used to read an inner page of a table B-tree. ++ // |db_reader| must outlive this instance. ++ void Initialize(DatabasePageReader* db_reader); ++ ++ // Reset internal DatabasePageReader ++ void Reset(); ++ ++ // True if DatabasePageReader is valid ++ bool IsValid() { return (db_reader_ != nullptr); } ++ + // True if the given reader may point to an inner page in a table B-tree. + // + // The last ReadPage() call on |db_reader| must have succeeded. +@@ -164,14 +173,14 @@ class LeafPageDecoder { + static int ComputeCellCount(DatabasePageReader* db_reader); + + // The number of the B-tree page this reader is reading. +- const int64_t page_id_; ++ int64_t page_id_; + // Used to read the tree page. + // + // Raw pointer usage is acceptable because this instance's owner is expected + // to ensure that the DatabasePageReader outlives this. +- DatabasePageReader* const db_reader_; ++ DatabasePageReader* db_reader_; + // Caches the ComputeCellCount() value for this reader's page. +- const int cell_count_ = ComputeCellCount(db_reader_); ++ int cell_count_; + + // The reader's cursor state. + // +diff --git a/sql/recover_module/cursor.cc b/sql/recover_module/cursor.cc +index 4f827edf1b4..240de4999fe 100644 +--- a/sql/recover_module/cursor.cc ++++ b/sql/recover_module/cursor.cc +@@ -28,7 +28,7 @@ VirtualCursor::~VirtualCursor() { + int VirtualCursor::First() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + inner_decoders_.clear(); +- leaf_decoder_ = nullptr; ++ leaf_decoder_.Reset(); + + AppendPageDecoder(table_->root_page_id()); + return Next(); +@@ -38,18 +38,18 @@ int VirtualCursor::Next() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + record_reader_.Reset(); + +- while (!inner_decoders_.empty() || leaf_decoder_.get()) { +- if (leaf_decoder_.get()) { +- if (!leaf_decoder_->CanAdvance()) { ++ while (!inner_decoders_.empty() || leaf_decoder_.IsValid()) { ++ if (leaf_decoder_.IsValid()) { ++ if (!leaf_decoder_.CanAdvance()) { + // The leaf has been exhausted. Remove it from the DFS stack. +- leaf_decoder_ = nullptr; ++ leaf_decoder_.Reset(); + continue; + } +- if (!leaf_decoder_->TryAdvance()) ++ if (!leaf_decoder_.TryAdvance()) + continue; + +- if (!payload_reader_.Initialize(leaf_decoder_->last_record_size(), +- leaf_decoder_->last_record_offset())) { ++ if (!payload_reader_.Initialize(leaf_decoder_.last_record_size(), ++ leaf_decoder_.last_record_offset())) { + continue; + } + if (!record_reader_.Initialize()) +@@ -101,13 +101,13 @@ int VirtualCursor::ReadColumn(int column_index, + int64_t VirtualCursor::RowId() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(record_reader_.IsInitialized()); +- DCHECK(leaf_decoder_.get()); +- return leaf_decoder_->last_record_rowid(); ++ DCHECK(leaf_decoder_.IsValid()); ++ return leaf_decoder_.last_record_rowid(); + } + + void VirtualCursor::AppendPageDecoder(int page_id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +- DCHECK(leaf_decoder_.get() == nullptr) ++ DCHECK(!leaf_decoder_.IsValid()) + << __func__ + << " must only be called when the current path has no leaf decoder"; + +@@ -115,7 +115,7 @@ void VirtualCursor::AppendPageDecoder(int page_id) { + return; + + if (LeafPageDecoder::IsOnValidPage(&db_reader_)) { +- leaf_decoder_ = std::make_unique<LeafPageDecoder>(&db_reader_); ++ leaf_decoder_.Initialize(&db_reader_); + return; + } + +diff --git a/sql/recover_module/cursor.h b/sql/recover_module/cursor.h +index 845b7852648..cc4e85f83f9 100644 +--- a/sql/recover_module/cursor.h ++++ b/sql/recover_module/cursor.h +@@ -130,7 +130,7 @@ class VirtualCursor { + std::vector<std::unique_ptr<InnerPageDecoder>> inner_decoders_; + + // Decodes the leaf page containing records. +- std::unique_ptr<LeafPageDecoder> leaf_decoder_; ++ LeafPageDecoder leaf_decoder_; + + SEQUENCE_CHECKER(sequence_checker_); + }; +diff --git a/sql/recover_module/pager.cc b/sql/recover_module/pager.cc +index 58e75de2704..69d98cef98d 100644 +--- a/sql/recover_module/pager.cc ++++ b/sql/recover_module/pager.cc +@@ -23,8 +23,7 @@ static_assert(DatabasePageReader::kMaxPageId <= std::numeric_limits<int>::max(), + "ints are not appropriate for representing page IDs"); + + DatabasePageReader::DatabasePageReader(VirtualTable* table) +- : page_data_(std::make_unique<uint8_t[]>(table->page_size())), +- table_(table) { ++ : page_data_(table->page_size()), table_(table) { + DCHECK(table != nullptr); + DCHECK(IsValidPageSize(table->page_size())); + } +@@ -58,7 +57,7 @@ int DatabasePageReader::ReadPage(int page_id) { + "The |read_offset| computation above may overflow"); + + int sqlite_status = +- RawRead(sqlite_file, read_size, read_offset, page_data_.get()); ++ RawRead(sqlite_file, read_size, read_offset, page_data_.data()); + + // |page_id_| needs to be set to kInvalidPageId if the read failed. + // Otherwise, future ReadPage() calls with the previous |page_id_| value +diff --git a/sql/recover_module/pager.h b/sql/recover_module/pager.h +index 07cac3cb989..d08f0932fab 100644 +--- a/sql/recover_module/pager.h ++++ b/sql/recover_module/pager.h +@@ -6,8 +6,8 @@ + #define SQL_RECOVER_MODULE_PAGER_H_ + + #include <cstdint> +-#include <memory> + #include <ostream> ++#include <vector> + + #include "base/check_op.h" + #include "base/memory/raw_ptr.h" +@@ -72,7 +72,7 @@ class DatabasePageReader { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_NE(page_id_, kInvalidPageId) + << "Successful ReadPage() required before accessing pager state"; +- return page_data_.get(); ++ return page_data_.data(); + } + + // The number of bytes in the page read by the last ReadPage() call. +@@ -139,7 +139,7 @@ class DatabasePageReader { + int page_id_ = kInvalidPageId; + // Stores the bytes of the last page successfully read by ReadPage(). + // The content is undefined if the last call to ReadPage() did not succeed. +- const std::unique_ptr<uint8_t[]> page_data_; ++ std::vector<uint8_t> page_data_; + // Raw pointer usage is acceptable because this instance's owner is expected + // to ensure that the VirtualTable outlives this. + const raw_ptr<VirtualTable> table_; diff --git a/repo/apps/chromium/system-opus.patch b/repo/apps/chromium/system-opus.patch new file mode 100644 index 0000000..dc85e80 --- /dev/null +++ b/repo/apps/chromium/system-opus.patch @@ -0,0 +1,52 @@ +Has been upstreamed in Chromium main branch, shouldn't be necessary +when the commit gets pulled into a new release + +From 3bd46cb9a51773f103ef52b39d6407740eb0d60a Mon Sep 17 00:00:00 2001 +From: Eugene Zemtsov <eugene@chromium.org> +Date: Thu, 24 Feb 2022 23:17:20 +0000 +Subject: [PATCH] webcodecs: Stop using AudioOpusEncoder as backed for mojo + audio encoder + +AudioOpusEncoder was only used here for testing. Let's not let it get +comfortable. We'll use MF AAC encoder here when we have it. (Soon...) + +Bug: 1259883 +Change-Id: Ia1819395c8c8fd6d403d4b8558c12f9a1bf7e761 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3489449 +Commit-Queue: Eugene Zemtsov <eugene@chromium.org> +Auto-Submit: Eugene Zemtsov <eugene@chromium.org> +Reviewed-by: Dale Curtis <dalecurtis@chromium.org> +Commit-Queue: Dale Curtis <dalecurtis@chromium.org> +Cr-Commit-Position: refs/heads/main@{#974895} +--- + media/mojo/services/gpu_mojo_media_client.cc | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc +index 8f83a4d6cf662..40cdaff8d3a00 100644 +--- a/media/mojo/services/gpu_mojo_media_client.cc ++++ b/media/mojo/services/gpu_mojo_media_client.cc +@@ -13,7 +13,6 @@ + #include "build/chromeos_buildflags.h" + #include "gpu/ipc/service/gpu_channel.h" + #include "media/audio/audio_features.h" +-#include "media/audio/audio_opus_encoder.h" + #include "media/base/audio_decoder.h" + #include "media/base/cdm_factory.h" + #include "media/base/media_switches.h" +@@ -119,14 +118,7 @@ std::unique_ptr<AudioEncoder> GpuMojoMediaClient::CreateAudioEncoder( + scoped_refptr<base::SequencedTaskRunner> task_runner) { + if (!base::FeatureList::IsEnabled(features::kPlatformAudioEncoder)) + return nullptr; +- // TODO(crbug.com/1259883) Right now Opus encoder is all we have, later on +- // we'll create a real platform encoder here. +- auto opus_encoder = std::make_unique<AudioOpusEncoder>(); +- auto encoding_runner = base::ThreadPool::CreateSequencedTaskRunner( +- {base::TaskPriority::USER_BLOCKING}); +- return std::make_unique<OffloadingAudioEncoder>(std::move(opus_encoder), +- std::move(encoding_runner), +- std::move(task_runner)); ++ return nullptr; + } + + VideoDecoderType GpuMojoMediaClient::GetDecoderImplementationType() { diff --git a/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch b/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch new file mode 100644 index 0000000..dae1add --- /dev/null +++ b/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch @@ -0,0 +1,12 @@ +diff --git a/build/linux/unbundle/ffmpeg.gn b/build/linux/unbundle/ffmpeg.gn +index 16e20744706..6a079b32221 100644 +--- a/build/linux/unbundle/ffmpeg.gn ++++ b/build/linux/unbundle/ffmpeg.gn +@@ -12,6 +12,7 @@ pkg_config("system_ffmpeg") { + "libavformat", + "libavutil", + ] ++ defines = [ "av_stream_get_first_dts(stream)=stream->first_dts" ] + } + + buildflag_header("ffmpeg_features") { diff --git a/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch.1 b/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch.1 new file mode 100644 index 0000000..dae1add --- /dev/null +++ b/repo/apps/chromium/unbundle-ffmpeg-av_stream_get_first_dts.patch.1 @@ -0,0 +1,12 @@ +diff --git a/build/linux/unbundle/ffmpeg.gn b/build/linux/unbundle/ffmpeg.gn +index 16e20744706..6a079b32221 100644 +--- a/build/linux/unbundle/ffmpeg.gn ++++ b/build/linux/unbundle/ffmpeg.gn +@@ -12,6 +12,7 @@ pkg_config("system_ffmpeg") { + "libavformat", + "libavutil", + ] ++ defines = [ "av_stream_get_first_dts(stream)=stream->first_dts" ] + } + + buildflag_header("ffmpeg_features") { diff --git a/repo/apps/chromium/use-deprecated-ffmpeg-api.patch b/repo/apps/chromium/use-deprecated-ffmpeg-api.patch new file mode 100644 index 0000000..f0ec736 --- /dev/null +++ b/repo/apps/chromium/use-deprecated-ffmpeg-api.patch @@ -0,0 +1,36 @@ +diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc +index ac4713b07268..492a9a37d096 100644 +--- a/media/filters/ffmpeg_demuxer.cc ++++ b/media/filters/ffmpeg_demuxer.cc +@@ -427,11 +427,11 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + scoped_refptr<DecoderBuffer> buffer; + + if (type() == DemuxerStream::TEXT) { +- size_t id_size = 0; ++ int id_size = 0; + uint8_t* id_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); + +- size_t settings_size = 0; ++ int settings_size = 0; + uint8_t* settings_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_SETTINGS, &settings_size); + +@@ -443,7 +443,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + buffer = DecoderBuffer::CopyFrom(packet->data, packet->size, + side_data.data(), side_data.size()); + } else { +- size_t side_data_size = 0; ++ int side_data_size = 0; + uint8_t* side_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); + +@@ -504,7 +504,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + packet->size - data_offset); + } + +- size_t skip_samples_size = 0; ++ int skip_samples_size = 0; + const uint32_t* skip_samples_ptr = + reinterpret_cast<const uint32_t*>(av_packet_get_side_data( + packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); diff --git a/repo/apps/chromium/use-deprecated-ffmpeg-api.patch.1 b/repo/apps/chromium/use-deprecated-ffmpeg-api.patch.1 new file mode 100644 index 0000000..f0ec736 --- /dev/null +++ b/repo/apps/chromium/use-deprecated-ffmpeg-api.patch.1 @@ -0,0 +1,36 @@ +diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc +index ac4713b07268..492a9a37d096 100644 +--- a/media/filters/ffmpeg_demuxer.cc ++++ b/media/filters/ffmpeg_demuxer.cc +@@ -427,11 +427,11 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + scoped_refptr<DecoderBuffer> buffer; + + if (type() == DemuxerStream::TEXT) { +- size_t id_size = 0; ++ int id_size = 0; + uint8_t* id_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); + +- size_t settings_size = 0; ++ int settings_size = 0; + uint8_t* settings_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_SETTINGS, &settings_size); + +@@ -443,7 +443,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + buffer = DecoderBuffer::CopyFrom(packet->data, packet->size, + side_data.data(), side_data.size()); + } else { +- size_t side_data_size = 0; ++ int side_data_size = 0; + uint8_t* side_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); + +@@ -504,7 +504,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + packet->size - data_offset); + } + +- size_t skip_samples_size = 0; ++ int skip_samples_size = 0; + const uint32_t* skip_samples_ptr = + reinterpret_cast<const uint32_t*>(av_packet_get_side_data( + packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); diff --git a/repo/apps/chromium/use-oauth2-client-switches-as-default.patch b/repo/apps/chromium/use-oauth2-client-switches-as-default.patch new file mode 100644 index 0000000..9d9c57b --- /dev/null +++ b/repo/apps/chromium/use-oauth2-client-switches-as-default.patch @@ -0,0 +1,17 @@ +diff -upr chromium-89.0.4389.58.orig/google_apis/google_api_keys.cc chromium-89.0.4389.58/google_apis/google_api_keys.cc +--- chromium-89.0.4389.58.orig/google_apis/google_api_keys.cc 2021-02-24 22:37:18.494007649 +0000 ++++ chromium-89.0.4389.58/google_apis/google_api_keys.cc 2021-02-24 22:35:00.865777600 +0000 +@@ -154,11 +154,11 @@ class APIKeyCache { + + std::string default_client_id = CalculateKeyValue( + GOOGLE_DEFAULT_CLIENT_ID, +- STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_ID), nullptr, ++ STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_ID), ::switches::kOAuth2ClientID, + std::string(), environment.get(), command_line, gaia_config); + std::string default_client_secret = CalculateKeyValue( + GOOGLE_DEFAULT_CLIENT_SECRET, +- STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_SECRET), nullptr, ++ STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_SECRET), ::switches::kOAuth2ClientSecret, + std::string(), environment.get(), command_line, gaia_config); + + // We currently only allow overriding the baked-in values for the diff --git a/repo/apps/chromium/wayland-egl.patch b/repo/apps/chromium/wayland-egl.patch new file mode 100644 index 0000000..58a0798 --- /dev/null +++ b/repo/apps/chromium/wayland-egl.patch @@ -0,0 +1,22 @@ +--- a/ui/gl/gl_image_native_pixmap.cc 2020-05-18 11:40:06.000000000 -0700 ++++ b/ui/gl/gl_image_native_pixmap.cc 2020-05-22 02:07:16.007770442 -0700 +@@ -288,6 +288,8 @@ + std::move(scoped_fd)); + } + ++ handle.planes[0].size = size_.GetArea(); ++ + return handle; + #endif // !defined(OS_FUCHSIA) + } +--- a/gpu/command_buffer/service/error_state.cc 2020-05-18 11:39:22.000000000 -0700 ++++ b/gpu/command_buffer/service/error_state.cc 2020-05-22 13:43:09.181180388 -0700 +@@ -115,6 +115,8 @@ + // buffer. + error = GL_NO_ERROR; + } ++ if (error == GL_INVALID_ENUM) ++ error = GL_NO_ERROR; + return error; + } + diff --git a/repo/apps/chromium/webcodecs-stop-using-AudioOpusEncoder.patch b/repo/apps/chromium/webcodecs-stop-using-AudioOpusEncoder.patch new file mode 100644 index 0000000..32957d3 --- /dev/null +++ b/repo/apps/chromium/webcodecs-stop-using-AudioOpusEncoder.patch @@ -0,0 +1,49 @@ +From 3bd46cb9a51773f103ef52b39d6407740eb0d60a Mon Sep 17 00:00:00 2001 +From: Eugene Zemtsov <eugene@chromium.org> +Date: Thu, 24 Feb 2022 23:17:20 +0000 +Subject: [PATCH] webcodecs: Stop using AudioOpusEncoder as backed for mojo + audio encoder + +AudioOpusEncoder was only used here for testing. Let's not let it get +comfortable. We'll use MF AAC encoder here when we have it. (Soon...) + +Bug: 1259883 +Change-Id: Ia1819395c8c8fd6d403d4b8558c12f9a1bf7e761 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3489449 +Commit-Queue: Eugene Zemtsov <eugene@chromium.org> +Auto-Submit: Eugene Zemtsov <eugene@chromium.org> +Reviewed-by: Dale Curtis <dalecurtis@chromium.org> +Commit-Queue: Dale Curtis <dalecurtis@chromium.org> +Cr-Commit-Position: refs/heads/main@{#974895} +--- + media/mojo/services/gpu_mojo_media_client.cc | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc +index 8f83a4d6cf6..40cdaff8d3a 100644 +--- a/media/mojo/services/gpu_mojo_media_client.cc ++++ b/media/mojo/services/gpu_mojo_media_client.cc +@@ -13,7 +13,6 @@ + #include "build/chromeos_buildflags.h" + #include "gpu/ipc/service/gpu_channel.h" + #include "media/audio/audio_features.h" +-#include "media/audio/audio_opus_encoder.h" + #include "media/base/audio_decoder.h" + #include "media/base/cdm_factory.h" + #include "media/base/media_switches.h" +@@ -119,14 +118,7 @@ std::unique_ptr<AudioEncoder> GpuMojoMediaClient::CreateAudioEncoder( + scoped_refptr<base::SequencedTaskRunner> task_runner) { + if (!base::FeatureList::IsEnabled(features::kPlatformAudioEncoder)) + return nullptr; +- // TODO(crbug.com/1259883) Right now Opus encoder is all we have, later on +- // we'll create a real platform encoder here. +- auto opus_encoder = std::make_unique<AudioOpusEncoder>(); +- auto encoding_runner = base::ThreadPool::CreateSequencedTaskRunner( +- {base::TaskPriority::USER_BLOCKING}); +- return std::make_unique<OffloadingAudioEncoder>(std::move(opus_encoder), +- std::move(encoding_runner), +- std::move(task_runner)); ++ return nullptr; + } + + VideoDecoderType GpuMojoMediaClient::GetDecoderImplementationType() { diff --git a/repo/apps/chromium/webrtc-check-existence-of-cursor-metadata.patch b/repo/apps/chromium/webrtc-check-existence-of-cursor-metadata.patch new file mode 100644 index 0000000..0c7e731 --- /dev/null +++ b/repo/apps/chromium/webrtc-check-existence-of-cursor-metadata.patch @@ -0,0 +1,31 @@ +From c2cd814cdd8cbf8dda6ccec2266327a5321fbde8 Mon Sep 17 00:00:00 2001 +From: Jan Grulich <grulja@gmail.com> +Date: Tue, 15 Mar 2022 14:31:55 +0100 +Subject: [PATCH] PipeWire capturer: check existence of cursor metadata + +Check whether there are any cursor metadata before we try to validate +and use them, otherwise we might crash on this. + +Bug: webrtc:13429 +Change-Id: I365da59a189b6b974cebafc94fec49d5b942efae +Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/255601 +Reviewed-by: Alexander Cooper <alcooper@chromium.org> +Commit-Queue: Alexander Cooper <alcooper@chromium.org> +Cr-Commit-Position: refs/heads/main@{#36240} +--- + .../desktop_capture/linux/wayland/shared_screencast_stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc b/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc +index a8c86e26..9e81df4c 100644 +--- a/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc ++++ b/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc +@@ -650,7 +650,7 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { + const struct spa_meta_cursor* cursor = + static_cast<struct spa_meta_cursor*>(spa_buffer_find_meta_data( + spa_buffer, SPA_META_Cursor, sizeof(*cursor))); +- if (spa_meta_cursor_is_valid(cursor)) { ++ if (cursor && spa_meta_cursor_is_valid(cursor)) { + struct spa_meta_bitmap* bitmap = nullptr; + + if (cursor->bitmap_offset) diff --git a/repo/apps/feh.xibuild b/repo/apps/feh/feh.xibuild index 0182a5e..0182a5e 100644 --- a/repo/apps/feh.xibuild +++ b/repo/apps/feh/feh.xibuild diff --git a/repo/apps/links.xibuild b/repo/apps/links/links.xibuild index bb2540d..bb2540d 100644 --- a/repo/apps/links.xibuild +++ b/repo/apps/links/links.xibuild diff --git a/repo/apps/lynx.xibuild b/repo/apps/lynx/lynx.xibuild index 1b1592d..1b1592d 100644 --- a/repo/apps/lynx.xibuild +++ b/repo/apps/lynx/lynx.xibuild diff --git a/repo/apps/mpv.xibuild b/repo/apps/mpv/mpv.xibuild index 6770c54..6770c54 100644 --- a/repo/apps/mpv.xibuild +++ b/repo/apps/mpv/mpv.xibuild diff --git a/repo/apps/ncmpcpp.xibuild b/repo/apps/ncmpcpp/ncmpcpp.xibuild index a27264e..a27264e 100644 --- a/repo/apps/ncmpcpp.xibuild +++ b/repo/apps/ncmpcpp/ncmpcpp.xibuild diff --git a/repo/apps/neovim.xibuild b/repo/apps/neovim/neovim.xibuild index 0b22d0e..0b22d0e 100644 --- a/repo/apps/neovim.xibuild +++ b/repo/apps/neovim/neovim.xibuild diff --git a/repo/apps/pcmanfm.xibuild b/repo/apps/pcmanfm/pcmanfm.xibuild index 35c3d52..35c3d52 100644 --- a/repo/apps/pcmanfm.xibuild +++ b/repo/apps/pcmanfm/pcmanfm.xibuild diff --git a/repo/apps/polybar/fix-version.patch b/repo/apps/polybar/fix-version.patch new file mode 100644 index 0000000..1548ce3 --- /dev/null +++ b/repo/apps/polybar/fix-version.patch @@ -0,0 +1,11 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -33,7 +33,7 @@ + OUTPUT_VARIABLE git_describe + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) + +-if(git_result EQUAL "0") ++if(0) + set(APP_VERSION "${git_describe}") + else() + message(STATUS "Could not detect version with git, falling back to built-in version information.") diff --git a/repo/apps/polybar.xibuild b/repo/apps/polybar/polybar.xibuild index 16e07af..16e07af 100644 --- a/repo/apps/polybar.xibuild +++ b/repo/apps/polybar/polybar.xibuild diff --git a/repo/apps/rxvt-unicode.xibuild b/repo/apps/rxvt-unicode/rxvt-unicode.xibuild index ddae254..ddae254 100644 --- a/repo/apps/rxvt-unicode.xibuild +++ b/repo/apps/rxvt-unicode/rxvt-unicode.xibuild diff --git a/repo/apps/vim.xibuild b/repo/apps/vim/vim.xibuild index d396eb2..d396eb2 100644 --- a/repo/apps/vim.xibuild +++ b/repo/apps/vim/vim.xibuild diff --git a/repo/apps/xclock-cat.xibuild b/repo/apps/xclock-cat/xclock-cat.xibuild index 0338096..0338096 100644 --- a/repo/apps/xclock-cat.xibuild +++ b/repo/apps/xclock-cat/xclock-cat.xibuild diff --git a/repo/apps/xlinks/links.desktop b/repo/apps/xlinks/links.desktop new file mode 100644 index 0000000..275d20f --- /dev/null +++ b/repo/apps/xlinks/links.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Links +Comment=Minimal web browser in graphical mode +Exec=xlinks -g +Icon=links-48x48.xpm +Type=Application +Terminal=false +Categories=Network;WebBrowser; diff --git a/repo/apps/xlinks.xibuild b/repo/apps/xlinks/xlinks.xibuild index 992c6a3..992c6a3 100644 --- a/repo/apps/xlinks.xibuild +++ b/repo/apps/xlinks/xlinks.xibuild diff --git a/repo/apps/xterm/posix-ptys.patch b/repo/apps/xterm/posix-ptys.patch new file mode 100644 index 0000000..596699f --- /dev/null +++ b/repo/apps/xterm/posix-ptys.patch @@ -0,0 +1,21 @@ +diff -upr xterm-323.orig/main.c xterm-323/main.c +--- xterm-323.orig/main.c 2016-03-09 15:30:51.191053881 +0100 ++++ xterm-323/main.c 2016-03-09 15:31:17.961635229 +0100 +@@ -2654,7 +2654,7 @@ get_pty(int *pty, char *from GCC_UNUSED) + close(opened_tty); + opened_tty = -1; + } +-#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY) ++#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) + if ((*pty = posix_openpt(O_RDWR)) >= 0) { + char *name = ptsname(*pty); + if (name != 0) { +@@ -3735,7 +3735,7 @@ spawnXTerm(XtermWidget xw) + /* + * now in child process + */ +-#if defined(_POSIX_SOURCE) || defined(SVR4) || defined(__convex__) || defined(__SCO__) || defined(__QNX__) ++#if defined(_POSIX_VERSION) || defined(SVR4) || defined(__convex__) || defined(__SCO__) || defined(__QNX__) + int pgrp = setsid(); /* variable may not be used... */ + #else + int pgrp = getpid(); diff --git a/repo/apps/xterm.xibuild b/repo/apps/xterm/xterm.xibuild index bceb89d..bceb89d 100644 --- a/repo/apps/xterm.xibuild +++ b/repo/apps/xterm/xterm.xibuild diff --git a/repo/devel/asciidoc.xibuild b/repo/devel/asciidoc/asciidoc.xibuild index 34202d0..34202d0 100644 --- a/repo/devel/asciidoc.xibuild +++ b/repo/devel/asciidoc/asciidoc.xibuild diff --git a/repo/devel/autoconf-archive.xibuild b/repo/devel/autoconf-archive/autoconf-archive.xibuild index ff50482..ff50482 100644 --- a/repo/devel/autoconf-archive.xibuild +++ b/repo/devel/autoconf-archive/autoconf-archive.xibuild diff --git a/repo/devel/autoconf.xibuild b/repo/devel/autoconf/autoconf.xibuild index 8068345..8068345 100644 --- a/repo/devel/autoconf.xibuild +++ b/repo/devel/autoconf/autoconf.xibuild diff --git a/repo/devel/autoconf2-13.xibuild b/repo/devel/autoconf2-13/autoconf2-13.xibuild index abddc17..abddc17 100644 --- a/repo/devel/autoconf2-13.xibuild +++ b/repo/devel/autoconf2-13/autoconf2-13.xibuild diff --git a/repo/devel/automake.xibuild b/repo/devel/automake/automake.xibuild index 8b8951f..8b8951f 100644 --- a/repo/devel/automake.xibuild +++ b/repo/devel/automake/automake.xibuild diff --git a/repo/devel/bc.xibuild b/repo/devel/bc/bc.xibuild index ffe43a5..ffe43a5 100644 --- a/repo/devel/bc.xibuild +++ b/repo/devel/bc/bc.xibuild diff --git a/repo/devel/bison.xibuild b/repo/devel/bison/bison.xibuild index 2f96141..2f96141 100644 --- a/repo/devel/bison.xibuild +++ b/repo/devel/bison/bison.xibuild diff --git a/repo/devel/boost/0001-revert-cease-dependence-on-range.patch b/repo/devel/boost/0001-revert-cease-dependence-on-range.patch new file mode 100644 index 0000000..77b8178 --- /dev/null +++ b/repo/devel/boost/0001-revert-cease-dependence-on-range.patch @@ -0,0 +1 @@ +Too Many Requests
\ No newline at end of file diff --git a/repo/devel/boost/boost-1.57.0-python-abi_letters.patch b/repo/devel/boost/boost-1.57.0-python-abi_letters.patch new file mode 100644 index 0000000..7df3ee7 --- /dev/null +++ b/repo/devel/boost/boost-1.57.0-python-abi_letters.patch @@ -0,0 +1,62 @@ +--- boost_1_57_0/tools/build/src/tools/python.jam 2013-05-21 06:14:18.000000000 +0200 ++++ boost_1_55_0/tools/build/src/tools/python.jam 2014-05-29 19:09:12.115413877 +0200 +@@ -94,7 +94,7 @@ feature.feature pythonpath : : free opti + # using python : 2.3 : /usr/local/bin/python ; + # + rule init ( version ? : cmd-or-prefix ? : includes * : libraries ? +- : condition * : extension-suffix ? ) ++ : condition * : extension-suffix ? : abi-letters ? ) + { + project.push-current $(.project) ; + +@@ -107,7 +107,7 @@ rule init ( version ? : cmd-or-prefix ? + } + } + +- configure $(version) : $(cmd-or-prefix) : $(includes) : $(libraries) : $(condition) : $(extension-suffix) ; ++ configure $(version) : $(cmd-or-prefix) : $(includes) : $(libraries) : $(condition) : $(extension-suffix) : $(abi-letters) ; + + project.pop-current ; + } +@@ -653,7 +653,7 @@ local rule system-library-dependencies ( + + # Declare a target to represent Python's library. + # +-local rule declare-libpython-target ( version ? : requirements * ) ++local rule declare-libpython-target ( version ? : requirements * : abi-letters ? ) + { + # Compute the representation of Python version in the name of Python's + # library file. +@@ -677,13 +677,13 @@ local rule declare-libpython-target ( ve + } + + # Declare it. +- lib python.lib : : <name>python$(lib-version) $(requirements) ; ++ lib python.lib : : <name>python$(lib-version)$(abi-letters) $(requirements) ; + } + + + # Implementation of init. + local rule configure ( version ? : cmd-or-prefix ? : includes * : libraries ? : +- condition * : extension-suffix ? ) ++ condition * : extension-suffix ? : abi-letters ? ) + { + local prefix ; + local exec-prefix ; +@@ -699,6 +699,7 @@ local rule configure ( version ? : cmd-o + extension-suffix ?= _d ; + } + extension-suffix ?= "" ; ++ abi-letters ?= "" ; + + # Normalize and dissect any version number. + local major-minor ; +@@ -922,7 +923,7 @@ local rule configure ( version ? : cmd-o + } + else + { +- declare-libpython-target $(version) : $(target-requirements) ; ++ declare-libpython-target $(version) : $(target-requirements) : $(abi-letters) ; + + # This is an evil hack. On, Windows, when Python is embedded, nothing + # seems to set up sys.path to include Python's standard library diff --git a/repo/devel/boost/boost-1.57.0-python-libpython_dep.patch b/repo/devel/boost/boost-1.57.0-python-libpython_dep.patch new file mode 100644 index 0000000..57bfc26 --- /dev/null +++ b/repo/devel/boost/boost-1.57.0-python-libpython_dep.patch @@ -0,0 +1,13 @@ +Index: boost_1_57_0/tools/build/src/tools/python.jam +=================================================================== +--- boost_1_57_0/tools/build/src/tools/python.jam (revision 50406) ++++ boost_1_57_0/tools/build/src/tools/python.jam (working copy) +@@ -994,7 +994,7 @@ + else + { + alias python_for_extensions +- : ++ : python + : $(target-requirements) + : + : $(usage-requirements) diff --git a/repo/devel/boost.xibuild b/repo/devel/boost/boost.xibuild index b97cab7..b97cab7 100644 --- a/repo/devel/boost.xibuild +++ b/repo/devel/boost/boost.xibuild diff --git a/repo/devel/boost/python-3.10.patch b/repo/devel/boost/python-3.10.patch new file mode 100644 index 0000000..2e1d5e3 --- /dev/null +++ b/repo/devel/boost/python-3.10.patch @@ -0,0 +1,49 @@ +From e193f080c7d209516ac9b712fa0c50bb08026fa2 Mon Sep 17 00:00:00 2001 +From: Martin Jansa <martin.jansa@lge.com> +Date: Tue, 19 Oct 2021 12:24:31 +0000 +Subject: [PATCH] BoostConfig.cmake: allow searching for python310 + +* accept double digits in Python3_VERSION_MINOR + +* if someone is using e.g.: + find_package(Python3 REQUIRED) + find_package(Boost REQUIRED python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}) + + with python-3.10 then it currently fails with: + + -- Found PythonLibs: /usr/lib/libpython3.10.so (found version "3.10.0") + -- Found Python3: -native/usr/bin/python3-native/python3 (found version "3.10.0") found components: Interpreter + CMake Error at /usr/lib/cmake/Boost-1.77.0/BoostConfig.cmake:141 (find_package): + Could not find a package configuration file provided by "boost_python310" + (requested version 1.77.0) with any of the following names: + + boost_python310Config.cmake + boost_python310-config.cmake + + Add the installation prefix of "boost_python310" to CMAKE_PREFIX_PATH or + set "boost_python310_DIR" to a directory containing one of the above files. + If "boost_python310" provides a separate development package or SDK, be + sure it has been installed. + Call Stack (most recent call first): + /usr/lib/cmake/Boost-1.77.0/BoostConfig.cmake:258 (boost_find_component) + /usr/share/cmake-3.21/Modules/FindBoost.cmake:594 (find_package) + CMakeLists.txt:18 (find_package) + +Signed-off-by: Martin Jansa <martin.jansa@lge.com> +--- + BoostConfig.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/BoostConfig.cmake b/BoostConfig.cmake +index fd17821..5dffa58 100644 +--- a/tools/boost_install/BoostConfig.cmake ++++ b/tools/boost_install/BoostConfig.cmake +@@ -113,7 +113,7 @@ macro(boost_find_component comp required quiet) + set(_BOOST_REQUIRED REQUIRED) + endif() + +- if("${comp}" MATCHES "^(python|numpy|mpi_python)([1-9])([0-9])$") ++ if("${comp}" MATCHES "^(python|numpy|mpi_python)([1-9])([0-9][0-9]?)$") + + # handle pythonXY and numpyXY versioned components for compatibility + diff --git a/repo/devel/cbindgen.xibuild b/repo/devel/cbindgen/cbindgen.xibuild index 8bebc3a..8bebc3a 100644 --- a/repo/devel/cbindgen.xibuild +++ b/repo/devel/cbindgen/cbindgen.xibuild diff --git a/repo/devel/check.xibuild b/repo/devel/check/check.xibuild index 192e219..192e219 100644 --- a/repo/devel/check.xibuild +++ b/repo/devel/check/check.xibuild diff --git a/repo/devel/clang.xibuild b/repo/devel/clang/clang.xibuild index 3b93ba3..3b93ba3 100644 --- a/repo/devel/clang.xibuild +++ b/repo/devel/clang/clang.xibuild diff --git a/repo/devel/clang/patches/10-add-musl-triples.patch b/repo/devel/clang/patches/10-add-musl-triples.patch new file mode 100644 index 0000000..b11ca84 --- /dev/null +++ b/repo/devel/clang/patches/10-add-musl-triples.patch @@ -0,0 +1,35 @@ +--- a/lib/Driver/ToolChains/Gnu.cpp ++++ b/lib/Driver/ToolChains/Gnu.cpp +@@ -2077,6 +2077,7 @@ + static const char *const AArch64LibDirs[] = {"/lib64", "/lib"}; + static const char *const AArch64Triples[] = { + "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", ++ "aarch64-linux-musl", + "aarch64-suse-linux", "aarch64-linux-android"}; + static const char *const AArch64beLibDirs[] = {"/lib"}; + static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu", +@@ -2086,6 +2087,8 @@ + static const char *const ARMTriples[] = {"arm-linux-gnueabi", + "arm-linux-androideabi"}; + static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf", ++ "arm-linux-musleabihf", ++ "armv7l-linux-musleabihf", + "armv7hl-redhat-linux-gnueabi", + "armv6hl-suse-linux-gnueabi", + "armv7hl-suse-linux-gnueabi"}; +@@ -2105,6 +2108,7 @@ + "x86_64-redhat-linux", "x86_64-suse-linux", + "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", + "x86_64-slackware-linux", "x86_64-unknown-linux", ++ "x86_64-linux-musl", + "x86_64-amazon-linux", "x86_64-linux-android"}; + static const char *const X32Triples[] = {"x86_64-linux-gnux32", + "x86_64-pc-linux-gnux32"}; +@@ -2116,6 +2120,7 @@ + "i686-redhat-linux", "i386-redhat-linux", + "i586-suse-linux", "i686-montavista-linux", + "i686-linux-android", "i686-gnu", ++ "i686-linux-musl", + }; + + static const char *const M68kLibDirs[] = {"/lib"}; diff --git a/repo/devel/clang/patches/30-Enable-stack-protector-by-default-for-Alpine-Linux.patch b/repo/devel/clang/patches/30-Enable-stack-protector-by-default-for-Alpine-Linux.patch new file mode 100644 index 0000000..f2895ce --- /dev/null +++ b/repo/devel/clang/patches/30-Enable-stack-protector-by-default-for-Alpine-Linux.patch @@ -0,0 +1,81 @@ +Based on original patchset from Jakub Jirutka <jakub@jirutka.cz> +Updated by Eric Molitor <eric@molitor.org> +Updated by Natanael Copa <ncopa@alpinelinux.org> +Updated by omni <omni+alpine@hack.org> + +--- a/lib/Driver/ToolChains/Linux.h ++++ b/lib/Driver/ToolChains/Linux.h +@@ -11,6 +11,7 @@ + + #include "Gnu.h" + #include "clang/Driver/ToolChain.h" ++#include "clang/Basic/LangOptions.h" + + namespace clang { + namespace driver { +@@ -38,6 +39,18 @@ + CXXStdlibType GetDefaultCXXStdlibType() const override; + bool isPIEDefault() const override; + bool isNoExecStackDefault() const override; ++ ++ LangOptions::StackProtectorMode ++ GetDefaultStackProtectorLevel(bool KernelOrKext) const override { ++ StringRef VendorName = Linux::getTriple().getVendorName(); ++ if (VendorName.compare("alpine") == 0) ++ return LangOptions::SSPStrong; ++ ++ return LangOptions::SSPOff; ++ } ++ ++ ++ + bool IsMathErrnoDefault() const override; + SanitizerMask getSupportedSanitizers() const override; + void addProfileRTLibs(const llvm::opt::ArgList &Args, +--- a/test/Driver/fsanitize.c ++++ b/test/Driver/fsanitize.c +@@ -667,18 +667,17 @@ + // RUN: %clang -fno-sanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NOSP + // NOSP-NOT: "-fsanitize=safe-stack" + +-// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP ++// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP + // RUN: %clang -target x86_64-linux-gnu -fsanitize=address,safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP-ASAN + // RUN: %clang -target x86_64-linux-gnu -fstack-protector -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP + // RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -fstack-protector-all -### %s 2>&1 | FileCheck %s -check-prefix=SP +-// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP +-// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP ++// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP ++// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP + // RUN: %clang -target i386-contiki-unknown -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP + // NO-SP-NOT: stack-protector + // NO-SP: "-fsanitize=safe-stack" + // SP-ASAN: error: invalid argument '-fsanitize=safe-stack' not allowed with '-fsanitize=address' + // SP: "-fsanitize=safe-stack" +-// SP: -stack-protector + // NO-SP-NOT: stack-protector + + // RUN: %clang -target powerpc64-unknown-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SANM +--- a/test/Driver/stack-protector.c ++++ b/test/Driver/stack-protector.c +@@ -35,6 +35,20 @@ + + // Test default stack protector values for Darwin platforms + ++// RUN: %clang -target x86_64-alpine-linux-musl -### %s 2>&1 | FileCheck %s -check-prefix=ALPINE ++// ALPINE: "-stack-protector" "2" ++ ++// RUN: %clang -target x86_64-alpine-linux-musl -fstack-protector -### %s 2>&1 | FileCheck %s -check-prefix=ALPINE_SPS ++// ALPINE_SPS: "-stack-protector" "2" ++ ++// RUN: %clang -target x86_64-alpine-linux-musl -fstack-protector-all -### %s 2>&1 | FileCheck %s -check-prefix=ALPINE_ALL ++// ALPINE_ALL: "-stack-protector" "3" ++// ALPINE_ALL-NOT: "-stack-protector-buffer-size" ++ ++// RUN: %clang -target x86_64-alpine-linux-musl -fno-stack-protector -### %s 2>&1 | FileCheck %s -check-prefix=ALPINE_NOSSP ++// ALPINE_NOSSP-NOT: "-stack-protector" ++// ALPINE_NOSSP-NOT: "-stack-protector-buffer-size" ++ + // RUN: %clang -target armv7k-apple-watchos2.0 -### %s 2>&1 | FileCheck %s -check-prefix=SSP_WATCHOS + // RUN: %clang -ffreestanding -target armv7k-apple-watchos2.0 -### %s 2>&1 | FileCheck %s -check-prefix=SSP_WATCHOS + // SSP_WATCHOS: "-stack-protector" "1" diff --git a/repo/devel/cmake-extra.xibuild b/repo/devel/cmake-extra/cmake-extra.xibuild index a81994f..a81994f 100644 --- a/repo/devel/cmake-extra.xibuild +++ b/repo/devel/cmake-extra/cmake-extra.xibuild diff --git a/repo/devel/cmake-modules.xibuild b/repo/devel/cmake-modules/cmake-modules.xibuild index b23083d..b23083d 100644 --- a/repo/devel/cmake-modules.xibuild +++ b/repo/devel/cmake-modules/cmake-modules.xibuild diff --git a/repo/devel/cmake.xibuild b/repo/devel/cmake/cmake.xibuild index 41be69c..41be69c 100644 --- a/repo/devel/cmake.xibuild +++ b/repo/devel/cmake/cmake.xibuild diff --git a/repo/devel/compiler-rt.xibuild b/repo/devel/compiler-rt/compiler-rt.xibuild index abff3dc..abff3dc 100644 --- a/repo/devel/compiler-rt.xibuild +++ b/repo/devel/compiler-rt/compiler-rt.xibuild diff --git a/repo/devel/compiler-rt/link-execinfo.patch b/repo/devel/compiler-rt/link-execinfo.patch new file mode 100644 index 0000000..8da49fb --- /dev/null +++ b/repo/devel/compiler-rt/link-execinfo.patch @@ -0,0 +1,11 @@ +--- a/lib/scudo/standalone/CMakeLists.txt ++++ b/lib/scudo/standalone/CMakeLists.txt +@@ -137,6 +137,8 @@ + + append_list_if(FUCHSIA zircon SCUDO_LINK_LIBS) + ++list(APPEND SCUDO_LINK_LIBS execinfo) ++ + if(COMPILER_RT_HAS_SCUDO_STANDALONE) + add_compiler_rt_object_libraries(RTScudoStandalone + ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH} diff --git a/repo/devel/dejagnu.xibuild b/repo/devel/dejagnu/dejagnu.xibuild index 82e443d..82e443d 100644 --- a/repo/devel/dejagnu.xibuild +++ b/repo/devel/dejagnu/dejagnu.xibuild diff --git a/repo/devel/distcc/dcc_gcc_rewrite_fqn-avoid-heap-corruption.patch b/repo/devel/distcc/dcc_gcc_rewrite_fqn-avoid-heap-corruption.patch new file mode 100644 index 0000000..5d0a86d --- /dev/null +++ b/repo/devel/distcc/dcc_gcc_rewrite_fqn-avoid-heap-corruption.patch @@ -0,0 +1,65 @@ +commit 879b71d6e95673e58d33f6c3c341a893ee307161 +Author: Alexey Sheplyakov <asheplyakov@yandex.ru> +Date: Sat Jul 10 22:18:14 2021 +0400 + + dcc_gcc_rewrite_fqn: avoid heap corruption + + On ALT Linux I've run into the following bug: + + distcc gcc -Wall -std=gnu89 -I. -O2 -o hello.o -c hello.c + free(): invalid next size (fast) + Aborted (core dumped) + + Apparently dcc_gcc_rewrite writes beyond the allocated memory: + + valgrind --leak-check=full -v ./distcc gcc -Wall -std=gnu89 -I. -O2 -o hello.o -c hello.c + + ==11382== ERROR SUMMARY: 53 errors from 5 contexts (suppressed: 0 from 0) + ==11382== + ==11382== 1 errors in context 1 of 5: + ==11382== Invalid write of size 1 + ==11382== at 0x4C349D8: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==11382== by 0x10D165: dcc_gcc_rewrite_fqn (compile.c:611) + ==11382== by 0x10D4B4: dcc_build_somewhere (compile.c:725) + ==11382== by 0x10DC01: dcc_build_somewhere_timed (compile.c:1014) + ==11382== by 0x10E380: main (distcc.c:352) + ==11382== Address 0x544e828 is 1 bytes after a block of size 23 alloc'd + ==11382== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==11382== by 0x10D087: dcc_gcc_rewrite_fqn (compile.c:588) + ==11382== by 0x10D4B4: dcc_build_somewhere (compile.c:725) + ==11382== by 0x10DC01: dcc_build_somewhere_timed (compile.c:1014) + ==11382== by 0x10E380: main (distcc.c:352) + ==11382== + ==11382== + ==11382== 1 errors in context 2 of 5: + ==11382== Invalid write of size 1 + ==11382== at 0x4C349C8: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==11382== by 0x10D165: dcc_gcc_rewrite_fqn (compile.c:611) + ==11382== by 0x10D4B4: dcc_build_somewhere (compile.c:725) + ==11382== by 0x10DC01: dcc_build_somewhere_timed (compile.c:1014) + ==11382== by 0x10E380: main (distcc.c:352) + ==11382== Address 0x544e827 is 0 bytes after a block of size 23 alloc'd + ==11382== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==11382== by 0x10D087: dcc_gcc_rewrite_fqn (compile.c:588) + ==11382== by 0x10D4B4: dcc_build_somewhere (compile.c:725) + ==11382== by 0x10DC01: dcc_build_somewhere_timed (compile.c:1014) + ==11382== by 0x10E380: main (distcc.c:352) + + and ALT Linux' hardened glibc does not quite like that. + Correctly compute the `newcmd_len` to avoid the problem. + + ALTBUG: #40425 + +diff --git a/src/compile.c b/src/compile.c +index 34964566fdd6..26d7d1821501 100644 +--- a/src/compile.c ++++ b/src/compile.c +@@ -584,7 +584,7 @@ static int dcc_gcc_rewrite_fqn(char **argv) + return -ENOENT; + + +- newcmd_len = strlen(target_with_vendor) + 1 + strlen(argv[0] + 1); ++ newcmd_len = strlen(target_with_vendor) + 1 + strlen(argv[0]) + 1; + newcmd = malloc(newcmd_len); + if (!newcmd) + return -ENOMEM; diff --git a/repo/devel/distcc/distcc-hardened.patch b/repo/devel/distcc/distcc-hardened.patch new file mode 100644 index 0000000..c50b15d --- /dev/null +++ b/repo/devel/distcc/distcc-hardened.patch @@ -0,0 +1,24 @@ +From: Gordon Malm <gengor@gentoo.org> + +Make distcc client pass -D__KERNEL__ macro. Hardened GCC uses this +macro to determine if code intended to be run in-kernel is being compiled. +If the code is kernel code, certain compile flags are not applied. + +When using distcc to build kernel code (modules, etc.) without this patch, +the distccd host doesn't get passed -D__KERNEL__. Consequently, gcc on +the distccd host applies all kinds of flags that it shouldn't. + +--- distcc-2.18.3/src/strip.c ++++ distcc-2.18.3-hardened/src/strip.c +@@ -79,7 +79,10 @@ int dcc_strip_local_args(char **from, ch + /* skip through argv, copying all arguments but skipping ones that + * ought to be omitted */ + for (from_i = to_i = 0; from[from_i]; from_i++) { +- if (str_equal("-D", from[from_i]) ++ if (str_equal("-D__KERNEL__", from[from_i])) { ++ to[to_i++] = from[from_i]; ++ } ++ else if (str_equal("-D", from[from_i]) + || str_equal("-I", from[from_i]) + || str_equal("-U", from[from_i]) + || str_equal("-L", from[from_i]) diff --git a/repo/devel/distcc.xibuild b/repo/devel/distcc/distcc.xibuild index f333ed6..f333ed6 100644 --- a/repo/devel/distcc.xibuild +++ b/repo/devel/distcc/distcc.xibuild diff --git a/repo/devel/distcc/gcc-10.patch b/repo/devel/distcc/gcc-10.patch new file mode 100644 index 0000000..599de51 --- /dev/null +++ b/repo/devel/distcc/gcc-10.patch @@ -0,0 +1,15 @@ +Upstream: Should be +Reason: Fixes compilation under gcc-10 which has -fno-common + +diff --git a/src/stats.c b/src/stats.c +index 35dbf7d..76bfbee 100644 +--- a/src/stats.c ++++ b/src/stats.c +@@ -82,7 +82,7 @@ struct statsdata { + char compiler[MAX_FILENAME_LEN]; + }; + +-const char *stats_text[20] = { "TCP_ACCEPT", "REJ_BAD_REQ", "REJ_OVERLOAD", ++extern const char *stats_text[20] = { "TCP_ACCEPT", "REJ_BAD_REQ", "REJ_OVERLOAD", + "COMPILE_OK", "COMPILE_ERROR", "COMPILE_TIMEOUT", "CLI_DISCONN", + "OTHER" }; diff --git a/repo/devel/docbook-dtd.xibuild b/repo/devel/docbook-dtd/docbook-dtd.xibuild index f751d36..f751d36 100644 --- a/repo/devel/docbook-dtd.xibuild +++ b/repo/devel/docbook-dtd/docbook-dtd.xibuild diff --git a/repo/devel/docbook-xml.xibuild b/repo/devel/docbook-xml/docbook-xml.xibuild index 56efc6c..56efc6c 100644 --- a/repo/devel/docbook-xml.xibuild +++ b/repo/devel/docbook-xml/docbook-xml.xibuild diff --git a/repo/devel/docbook-xsl.xibuild b/repo/devel/docbook-xsl/docbook-xsl.xibuild index f5d576d..f5d576d 100644 --- a/repo/devel/docbook-xsl.xibuild +++ b/repo/devel/docbook-xsl/docbook-xsl.xibuild diff --git a/repo/devel/docbook4-xml.xibuild b/repo/devel/docbook4-xml/docbook4-xml.xibuild index 36faa98..36faa98 100644 --- a/repo/devel/docbook4-xml.xibuild +++ b/repo/devel/docbook4-xml/docbook4-xml.xibuild diff --git a/repo/devel/expect.xibuild b/repo/devel/expect/expect.xibuild index c2dd0d8..c2dd0d8 100644 --- a/repo/devel/expect.xibuild +++ b/repo/devel/expect/expect.xibuild diff --git a/repo/devel/flex.xibuild b/repo/devel/flex/flex.xibuild index abf55f4..abf55f4 100644 --- a/repo/devel/flex.xibuild +++ b/repo/devel/flex/flex.xibuild diff --git a/repo/devel/gcc.xibuild b/repo/devel/gcc/gcc.xibuild index e0176cb..e0176cb 100644 --- a/repo/devel/gcc.xibuild +++ b/repo/devel/gcc/gcc.xibuild diff --git a/repo/devel/gdb.xibuild b/repo/devel/gdb/gdb.xibuild index 31d9b7c..31d9b7c 100644 --- a/repo/devel/gdb.xibuild +++ b/repo/devel/gdb/gdb.xibuild diff --git a/repo/devel/git.xibuild b/repo/devel/git/git.xibuild index ab8e273..ab8e273 100644 --- a/repo/devel/git.xibuild +++ b/repo/devel/git/git.xibuild diff --git a/repo/devel/go.xibuild b/repo/devel/go/go.xibuild index 9a5f1b7..9a5f1b7 100644 --- a/repo/devel/go.xibuild +++ b/repo/devel/go/go.xibuild diff --git a/repo/devel/gtk-doc.xibuild b/repo/devel/gtk-doc/gtk-doc.xibuild index 074eca0..074eca0 100644 --- a/repo/devel/gtk-doc.xibuild +++ b/repo/devel/gtk-doc/gtk-doc.xibuild diff --git a/repo/devel/help2man.xibuild b/repo/devel/help2man/help2man.xibuild index 6d91935..6d91935 100644 --- a/repo/devel/help2man.xibuild +++ b/repo/devel/help2man/help2man.xibuild diff --git a/repo/devel/icecream.xibuild b/repo/devel/icecream/icecream.xibuild index 713f16e..713f16e 100644 --- a/repo/devel/icecream.xibuild +++ b/repo/devel/icecream/icecream.xibuild diff --git a/repo/devel/imake.xibuild b/repo/devel/imake/imake.xibuild index 2828071..2828071 100644 --- a/repo/devel/imake.xibuild +++ b/repo/devel/imake/imake.xibuild diff --git a/repo/devel/itstool.xibuild b/repo/devel/itstool/itstool.xibuild index 721c5a7..721c5a7 100644 --- a/repo/devel/itstool.xibuild +++ b/repo/devel/itstool/itstool.xibuild diff --git a/repo/devel/libexecinfo/10-execinfo.patch b/repo/devel/libexecinfo/10-execinfo.patch new file mode 100644 index 0000000..44db530 --- /dev/null +++ b/repo/devel/libexecinfo/10-execinfo.patch @@ -0,0 +1,64 @@ +--- a/execinfo.c.orig ++++ b/execinfo.c +@@ -69,7 +69,8 @@ + char ** + backtrace_symbols(void *const *buffer, int size) + { +- int i, clen, alen, offset; ++ size_t clen, alen; ++ int i, offset; + char **rval; + char *cp; + Dl_info info; +@@ -78,7 +79,6 @@ + rval = malloc(clen); + if (rval == NULL) + return NULL; +- (char **)cp = &(rval[size]); + for (i = 0; i < size; i++) { + if (dladdr(buffer[i], &info) != 0) { + if (info.dli_sname == NULL) +@@ -92,14 +92,14 @@ + 2 + /* " <" */ + strlen(info.dli_sname) + /* "function" */ + 1 + /* "+" */ +- D10(offset) + /* "offset */ ++ 10 + /* "offset */ + 5 + /* "> at " */ + strlen(info.dli_fname) + /* "filename" */ + 1; /* "\0" */ + rval = realloc_safe(rval, clen + alen); + if (rval == NULL) + return NULL; +- snprintf(cp, alen, "%p <%s+%d> at %s", ++ snprintf((char *) rval + clen, alen, "%p <%s+%d> at %s", + buffer[i], info.dli_sname, offset, info.dli_fname); + } else { + alen = 2 + /* "0x" */ +@@ -108,12 +108,15 @@ + rval = realloc_safe(rval, clen + alen); + if (rval == NULL) + return NULL; +- snprintf(cp, alen, "%p", buffer[i]); ++ snprintf((char *) rval + clen, alen, "%p", buffer[i]); + } +- rval[i] = cp; +- cp += alen; ++ rval[i] = (char *) clen; ++ clen += alen; + } + ++ for (i = 0; i < size; i++) ++ rval[i] += (long) rval; ++ + return rval; + } + +@@ -155,6 +158,6 @@ + return; + snprintf(buf, len, "%p\n", buffer[i]); + } +- write(fd, buf, len - 1); ++ write(fd, buf, strlen(buf)); + } + } diff --git a/repo/devel/libexecinfo/20-define-gnu-source.patch b/repo/devel/libexecinfo/20-define-gnu-source.patch new file mode 100644 index 0000000..7255ecd --- /dev/null +++ b/repo/devel/libexecinfo/20-define-gnu-source.patch @@ -0,0 +1,24 @@ +--- a/execinfo.c.orig ++++ b/execinfo.c +@@ -26,6 +26,7 @@ + * $Id: execinfo.c,v 1.3 2004/07/19 05:21:09 sobomax Exp $ + */ + ++#define _GNU_SOURCE + #include <sys/types.h> + #include <sys/uio.h> + #include <dlfcn.h> +--- a/stacktraverse.c.orig ++++ b/stacktraverse.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <stddef.h> + + #include "stacktraverse.h" +--- a/test.c.orig ++++ b/test.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <stdio.h> + #include <stdlib.h> + diff --git a/repo/devel/libexecinfo/30-linux-makefile.patch b/repo/devel/libexecinfo/30-linux-makefile.patch new file mode 100644 index 0000000..6bc8a89 --- /dev/null +++ b/repo/devel/libexecinfo/30-linux-makefile.patch @@ -0,0 +1,44 @@ +--- a/Makefile.orig ++++ b/Makefile +@@ -23,24 +23,25 @@ + # SUCH DAMAGE. + # + # $Id: Makefile,v 1.3 2004/07/19 05:19:55 sobomax Exp $ ++# ++# Linux Makefile by Matt Smith <mcs@darkregion.net>, 2011/01/04 + +-LIB= execinfo ++CC=cc ++AR=ar ++EXECINFO_CFLAGS=$(CFLAGS) -O2 -pipe -fno-strict-aliasing -std=gnu99 -fstack-protector -c ++EXECINFO_LDFLAGS=$(LDFLAGS) + +-SRCS= stacktraverse.c stacktraverse.h execinfo.c execinfo.h ++all: static dynamic + +-INCS= execinfo.h ++static: ++ $(CC) $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) stacktraverse.c ++ $(CC) $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) execinfo.c ++ $(AR) rcs libexecinfo.a stacktraverse.o execinfo.o + +-SHLIB_MAJOR= 1 +-SHLIB_MINOR= 0 ++dynamic: ++ $(CC) -fpic -DPIC $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) stacktraverse.c -o stacktraverse.So ++ $(CC) -fpic -DPIC $(EXECINFO_CFLAGS) $(EXECINFO_LDFLAGS) execinfo.c -o execinfo.So ++ $(CC) -shared -Wl,-soname,libexecinfo.so.1 -o libexecinfo.so.1 stacktraverse.So execinfo.So + +-NOPROFILE= yes +- +-DPADD= ${LIBM} +-LDADD= -lm +- +-#WARNS?= 4 +- +-#stacktraverse.c: gen.py +-# ./gen.py > stacktraverse.c +- +-.include <bsd.lib.mk> ++clean: ++ rm -rf *.o *.So *.a *.so diff --git a/repo/devel/libexecinfo.xibuild b/repo/devel/libexecinfo/libexecinfo.xibuild index 67e1002..67e1002 100644 --- a/repo/devel/libexecinfo.xibuild +++ b/repo/devel/libexecinfo/libexecinfo.xibuild diff --git a/repo/devel/lld.xibuild b/repo/devel/lld/lld.xibuild index c2dff7f..c2dff7f 100644 --- a/repo/devel/lld.xibuild +++ b/repo/devel/lld/lld.xibuild diff --git a/repo/devel/llvm-libunwind/libcxx-musl.patch b/repo/devel/llvm-libunwind/libcxx-musl.patch new file mode 100644 index 0000000..358d4a3 --- /dev/null +++ b/repo/devel/llvm-libunwind/libcxx-musl.patch @@ -0,0 +1,28 @@ +Patch-Source: https://github.com/void-linux/void-packages/blob/74f16232621ca8dfb6d244beff1df35a6df1647f/srcpkgs/llvm12/patches/libcxx-musl.patch + +--- a/libcxx/include/locale ++++ b/libcxx/include/locale +@@ -742,7 +742,11 @@ __num_get_signed_integral(const char* __a, const char* __a_end, + typename remove_reference<decltype(errno)>::type __save_errno = errno; + errno = 0; + char *__p2; ++#if defined(__linux__) && !defined(__GLIBC__) ++ long long __ll = strtoll(__a, &__p2, __base); ++#else + long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++#endif + typename remove_reference<decltype(errno)>::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; +@@ -782,7 +786,11 @@ __num_get_unsigned_integral(const char* __a, const char* __a_end, + typename remove_reference<decltype(errno)>::type __save_errno = errno; + errno = 0; + char *__p2; ++#if defined(__linux__) && !defined(__GLIBC__) ++ unsigned long long __ll = strtoull(__a, &__p2, __base); ++#else + unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); ++#endif + typename remove_reference<decltype(errno)>::type __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; diff --git a/repo/devel/llvm-libunwind/libunwind-link-libssp.patch b/repo/devel/llvm-libunwind/libunwind-link-libssp.patch new file mode 100644 index 0000000..ae819fe --- /dev/null +++ b/repo/devel/llvm-libunwind/libunwind-link-libssp.patch @@ -0,0 +1,20 @@ +--- a/libunwind/src/CMakeLists.txt ++++ b/libunwind/src/CMakeLists.txt +@@ -129,7 +129,7 @@ + else() + target_compile_options(unwind_shared PRIVATE -fno-rtti) + endif() +- target_link_libraries(unwind_shared PRIVATE ${LIBUNWIND_LIBRARIES}) ++ target_link_libraries(unwind_shared PRIVATE ${LIBUNWIND_LIBRARIES} -lssp_nonshared) + set_target_properties(unwind_shared + PROPERTIES + CXX_EXTENSIONS OFF +@@ -157,7 +157,7 @@ + else() + target_compile_options(unwind_static PRIVATE -fno-rtti) + endif() +- target_link_libraries(unwind_static PRIVATE ${LIBUNWIND_LIBRARIES}) ++ target_link_libraries(unwind_static PRIVATE ${LIBUNWIND_LIBRARIES} -lssp_nonshared) + set_target_properties(unwind_static + PROPERTIES + CXX_EXTENSIONS OFF diff --git a/repo/devel/llvm-libunwind.xibuild b/repo/devel/llvm-libunwind/llvm-libunwind.xibuild index 9c61c31..9c61c31 100644 --- a/repo/devel/llvm-libunwind.xibuild +++ b/repo/devel/llvm-libunwind/llvm-libunwind.xibuild diff --git a/repo/devel/llvm.xibuild b/repo/devel/llvm/llvm.xibuild index f1eaf13..f1eaf13 100644 --- a/repo/devel/llvm.xibuild +++ b/repo/devel/llvm/llvm.xibuild diff --git a/repo/devel/m4.xibuild b/repo/devel/m4/m4.xibuild index e6ccf14..e6ccf14 100644 --- a/repo/devel/m4.xibuild +++ b/repo/devel/m4/m4.xibuild diff --git a/repo/devel/make.xibuild b/repo/devel/make/make.xibuild index bb4412f..bb4412f 100644 --- a/repo/devel/make.xibuild +++ b/repo/devel/make/make.xibuild diff --git a/repo/devel/meson.xibuild b/repo/devel/meson/meson.xibuild index f445bc4..f445bc4 100644 --- a/repo/devel/meson.xibuild +++ b/repo/devel/meson/meson.xibuild diff --git a/repo/devel/mpc.xibuild b/repo/devel/mpc/mpc.xibuild index f9c9477..f9c9477 100644 --- a/repo/devel/mpc.xibuild +++ b/repo/devel/mpc/mpc.xibuild diff --git a/repo/devel/nasm.xibuild b/repo/devel/nasm/nasm.xibuild index b8d7fd6..b8d7fd6 100644 --- a/repo/devel/nasm.xibuild +++ b/repo/devel/nasm/nasm.xibuild diff --git a/repo/devel/ninja.xibuild b/repo/devel/ninja/ninja.xibuild index 8ae4868..8ae4868 100644 --- a/repo/devel/ninja.xibuild +++ b/repo/devel/ninja/ninja.xibuild diff --git a/repo/devel/patch.xibuild b/repo/devel/patch/patch.xibuild index 015aeeb..015aeeb 100644 --- a/repo/devel/patch.xibuild +++ b/repo/devel/patch/patch.xibuild diff --git a/repo/devel/pkg-config.xibuild b/repo/devel/pkg-config/pkg-config.xibuild index 3db8dfd..3db8dfd 100644 --- a/repo/devel/pkg-config.xibuild +++ b/repo/devel/pkg-config/pkg-config.xibuild diff --git a/repo/devel/rustc/files/check-rustc b/repo/devel/rustc/files/check-rustc new file mode 100644 index 0000000..d4b85be --- /dev/null +++ b/repo/devel/rustc/files/check-rustc @@ -0,0 +1,109 @@ +#!/bin/sh +# vim: set ts=4: +set -eu + +RUSTC="$1" +TMPDIR="$(pwd)/.tmp-${0##*/}-$RANDOM" +failed=0 + +unset RUST_BACKTRACE +unset RUSTC_CRT_STATIC + + +_rustc() { + printf '\n$ rustc %s\n' "$*" + "$RUSTC" "$@" +} + +die() { + printf '\033[1;31mERROR:\033[0m %s\n' "$1" >&2 # bold red + exit 1 +} + +fail() { + printf '\033[1;31mFAIL:\033[0m %s\n' "$1" >&2 # bold red + failed=$(( failed + 1 )) +} + +assert_dynamic() { + readelf -l "$1" | grep -Fqw INTERP \ + && readelf -d "$1" | grep -Fqw NEEDED || { + fail "$1 is not a dynamic executable!" + readelf -ld "$1" + } +} + +assert_ok() { + "$1" || fail "$1 exited with status $?" +} + +assert_panic() { + local status=0 + "$1" || status=$? && [ "$status" = 101 ] \ + || fail "$1 exited with status $status, but expected 101" +} + +assert_pie() { + readelf -d "$1" | grep -Fw FLAGS_1 | grep -Fqw PIE || { + fail "$1 is not a PIE executable!" + readelf -d "$1" + } +} + +assert_static() { + test -f "$1" \ + && ! readelf -l "$1" | grep -Fqw INTERP \ + && ! readelf -d "$1" | grep -Fqw NEEDED || { + fail "$1 is not a static executable!" + readelf -ld "$1" + } +} + + +#-------------------- M a i n -------------------- + +test -d "$TMPDIR" && die "$TMPDIR already exists!" +mkdir -p "$TMPDIR" +trap "rm -R '$TMPDIR'" EXIT + +cd "$TMPDIR" + +cat >> hello_world.rs <<-EOF + fn main() { + println!("Hello, world!"); + } +EOF + +_rustc hello_world.rs +assert_ok ./hello_world +assert_dynamic hello_world +assert_pie hello_world +rm -f hello_world + +_rustc -C target-feature=-crt-static hello_world.rs +assert_ok ./hello_world +assert_dynamic hello_world +assert_pie hello_world +rm -f hello_world + +_rustc -C target-feature=+crt-static hello_world.rs +assert_ok ./hello_world +assert_static hello_world +assert_pie hello_world +rm -f hello_world + + +cat >> panic.rs <<-EOF + fn main() { + panic!("This should panic"); + } +EOF + +_rustc -C target-feature=-crt-static panic.rs +assert_panic ./panic + +_rustc -C target-feature=+crt-static panic.rs +assert_panic ./panic + + +[ "$failed" -eq 0 ] || die "$failed assertion(s) has failed" diff --git a/repo/devel/rustc/patches/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch b/repo/devel/rustc/patches/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch new file mode 100644 index 0000000..30cb66f --- /dev/null +++ b/repo/devel/rustc/patches/0006-Prefer-libgcc_eh-over-libunwind-for-musl.patch @@ -0,0 +1,24 @@ +Additions for build.rs by q66, necessary for our musl setup. + +From 1eb558f246269606c6d8d73824ef6b44fa10764e Mon Sep 17 00:00:00 2001 +From: Samuel Holland <samuel@sholland.org> +Date: Sat, 9 Sep 2017 00:14:16 -0500 +Subject: [PATCH 06/16] Prefer libgcc_eh over libunwind for musl + +--- + src/libunwind/lib.rs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/libunwind/lib.rs b/src/libunwind/lib.rs +index 9182e349b19..0377fbb58fc 100644 +--- a/library/unwind/src/lib.rs ++++ b/library/unwind/src/lib.rs +@@ -51,7 +51,7 @@ + #[link(name = "unwind", cfg(not(target_feature = "crt-static")))] + extern "C" {} + } else { +- #[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))] ++ #[link(name = "gcc_eh", cfg(target_feature = "crt-static"))] + #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))] + extern "C" {} + } diff --git a/repo/devel/rustc/patches/0007-do-not-install-libunwind-source.patch b/repo/devel/rustc/patches/0007-do-not-install-libunwind-source.patch new file mode 100644 index 0000000..e8ff8b7 --- /dev/null +++ b/repo/devel/rustc/patches/0007-do-not-install-libunwind-source.patch @@ -0,0 +1,19 @@ +From: Dominic Meiser <alpine@msrd0.de> +Date: Tue, 22 Dec 2020 23:31:28 +0100 +Subject: [PATCH] Do not install libunwind source + +This was added in rustc 1.48, but is incompatible with the Alpine Linux package since it removes all bundled +dependencies prior to building. + +diff -Naur rustc-1.48.0-src.orig/src/bootstrap/dist.rs rustc-1.48.0-src/src/bootstrap/dist.rs +--- rustc-1.48.0-src.orig/src/bootstrap/dist.rs 2020-12-22 16:39:30.504249113 +0100 ++++ rustc-1.48.0-src/src/bootstrap/dist.rs 2020-12-22 16:42:08.663006830 +0100 +@@ -1016,7 +1016,7 @@ + copy_src_dirs( + builder, + &builder.src, +- &["library", "src/llvm-project/libunwind"], ++ &["library"], + &[ + // not needed and contains symlinks which rustup currently + // chokes on when unpacking. diff --git a/repo/devel/rustc/patches/alpine-move-py-scripts-to-share.patch b/repo/devel/rustc/patches/alpine-move-py-scripts-to-share.patch new file mode 100644 index 0000000..21be36f --- /dev/null +++ b/repo/devel/rustc/patches/alpine-move-py-scripts-to-share.patch @@ -0,0 +1,23 @@ +--- a/src/etc/rust-gdb ++++ b/src/etc/rust-gdb +@@ -12,7 +12,7 @@ + + # Find out where the pretty printer Python module is + RUSTC_SYSROOT="$("$RUSTC" --print=sysroot)" +-GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" ++GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/share/rust/etc" + + # Run GDB with the additional arguments that load the pretty printers + # Set the environment variable `RUST_GDB` to overwrite the call to a + # Set the environment variable `RUST_GDB` to overwrite the call to a +--- a/src/etc/rust-lldb ++++ b/src/etc/rust-lldb +@@ -8,7 +8,7 @@ + + # Find out where to look for the pretty printer Python module + RUSTC_SYSROOT=$(rustc --print sysroot) +-RUST_LLDB="$RUSTC_SYSROOT/lib/rustlib/$host/bin/lldb" ++RUST_LLDB="$RUSTC_SYSROOT/share/rust/etc" + + lldb=lldb + if [ -f "$RUST_LLDB" ]; then diff --git a/repo/devel/rustc/patches/alpine-target.patch b/repo/devel/rustc/patches/alpine-target.patch new file mode 100644 index 0000000..2392cdd --- /dev/null +++ b/repo/devel/rustc/patches/alpine-target.patch @@ -0,0 +1,191 @@ +From: Shiz <hi@shiz.me> +Updated by Rasmus Thomsen <oss@cogitri.dev> on 28th of July 2019 +Updated again by Ariadne Conill <ariadne@dereferenced.org> on 31 October 2020 +Date: Thu, 20 Aug 2017 01:52:36 +0200 +Last-Updated: Sat, 28 Oct 2017 20:23:00 +0200 +Subject: [PATCH] Add Alpine targets + +This adds `$arch-alpine-linux-musl` targets to Rust to encode our toolchain +and distribution-specific quirks instead of polluting the main musl target of +`$arch-unknown-linux-musl`. + +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/aarch64_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::aarch64_unknown_linux_musl::target(); ++ ++ base.llvm_target = "aarch64-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/armv6_alpine_linux_musleabihf.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::arm_unknown_linux_musleabihf::target(); ++ ++ base.llvm_target = "armv6-alpine-linux-musleabihf".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/armv7_alpine_linux_musleabihf.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::armv7_unknown_linux_musleabihf::target(); ++ ++ base.llvm_target = "armv7-alpine-linux-musleabihf".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/i586_alpine_linux_musl.rs +@@ -0,0 +1,14 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::i686_unknown_linux_musl::target(); ++ ++ base.options.cpu = "pentium4".to_string(); ++ base.llvm_target = "i586-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- rustc-1.48.0-src.orig/compiler/rustc_target/src/spec/mod.rs ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/mod.rs +@@ -490,6 +490,16 @@ + } + + supported_targets! { ++ ("i586-alpine-linux-musl", i586_alpine_linux_musl), ++ ("x86_64-alpine-linux-musl", x86_64_alpine_linux_musl), ++ ("aarch64-alpine-linux-musl", aarch64_alpine_linux_musl), ++ ("armv6-alpine-linux-musleabihf", armv6_alpine_linux_musleabihf), ++ ("armv7-alpine-linux-musleabihf", armv7_alpine_linux_musleabihf), ++ ("powerpc-alpine-linux-musl", powerpc_alpine_linux_musl), ++ ("powerpc64-alpine-linux-musl", powerpc64_alpine_linux_musl), ++ ("powerpc64le-alpine-linux-musl", powerpc64le_alpine_linux_musl), ++ ("s390x-alpine-linux-musl", s390x_alpine_linux_musl), ++ ("riscv64-alpine-linux-musl", riscv64_alpine_linux_musl), + ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu), + ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32), + ("i686-unknown-linux-gnu", i686_unknown_linux_gnu), +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc64_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::powerpc64_unknown_linux_musl::target(); ++ ++ base.llvm_target = "powerpc64-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc64le_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::powerpc64le_unknown_linux_musl::target(); ++ ++ base.llvm_target = "powerpc64le-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/powerpc_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::powerpc_unknown_linux_musl::target(); ++ ++ base.llvm_target = "powerpc-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/s390x_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::s390x_unknown_linux_musl::target(); ++ ++ base.llvm_target = "s390x-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.48.0-src/compiler/rustc_target/src/spec/x86_64_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::x86_64_unknown_linux_musl::target(); ++ ++ base.llvm_target = "x86_64-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} +--- /dev/null ++++ rustc-1.52.1-src/compiler/rustc_target/src/spec/riscv64_alpine_linux_musl.rs +@@ -0,0 +1,13 @@ ++use crate::spec::Target; ++ ++pub fn target() -> Target { ++ let mut base = super::riscv64gc_unknown_linux_musl::target(); ++ ++ base.llvm_target = "riscv64-alpine-linux-musl".to_string(); ++ base.options.vendor = "alpine".to_string(); ++ base.options.crt_static_default = false; ++ base.options.static_position_independent_executables = true; ++ base.options.need_rpath = true; ++ ++ base ++} diff --git a/repo/devel/rustc/patches/install-template-shebang.patch b/repo/devel/rustc/patches/install-template-shebang.patch new file mode 100644 index 0000000..e81b579 --- /dev/null +++ b/repo/devel/rustc/patches/install-template-shebang.patch @@ -0,0 +1,10 @@ +The script seems to be POSIX-sh (+ local) compatible. + +--- a/src/tools/rust-installer/install-template.sh ++++ b/src/tools/rust-installer/install-template.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/bin/sh + # Copyright 2014 The Rust Project Developers. See the COPYRIGHT + # file at the top-level directory of this distribution and at + # http://rust-lang.org/COPYRIGHT. diff --git a/repo/devel/rustc/patches/link-musl-dynamically.patch b/repo/devel/rustc/patches/link-musl-dynamically.patch new file mode 100644 index 0000000..55d02a3 --- /dev/null +++ b/repo/devel/rustc/patches/link-musl-dynamically.patch @@ -0,0 +1,17 @@ +--- rustc-1.58.0-src.orig/vendor/libc/src/unix/mod.rs ++++ rustc-1.58.0-src/vendor/libc/src/unix/mod.rs +@@ -329,11 +329,11 @@ + #[link(name = "c", cfg(not(target_feature = "crt-static")))] + extern {} + } else if #[cfg(target_env = "musl")] { ++ #[link(name = "c")] ++ extern {} + #[cfg_attr(feature = "rustc-dep-of-std", +- link(name = "c", kind = "static", modifiers = "-bundle", ++ link(name = "gcc", kind = "static", modifiers = "-bundle", + cfg(target_feature = "crt-static")))] +- #[cfg_attr(feature = "rustc-dep-of-std", +- link(name = "c", cfg(not(target_feature = "crt-static"))))] + extern {} + } else if #[cfg(target_os = "emscripten")] { + #[link(name = "c")] diff --git a/repo/devel/rustc/patches/musl-fix-linux_musl_base.patch b/repo/devel/rustc/patches/musl-fix-linux_musl_base.patch new file mode 100644 index 0000000..1771ffe --- /dev/null +++ b/repo/devel/rustc/patches/musl-fix-linux_musl_base.patch @@ -0,0 +1,23 @@ +From: Jakub Jirutka <jakub@jirutka.cz> +Date: Sat, 08 Aug 2016 15:06:00 +0200 +Subject: [PATCH] Fix linux_musl_base for native musl host + +See https://github.com/rust-lang/rust/pull/40113 + +--- a/compiler/rustc_target/src/spec/linux_musl_base.rs ++++ b/compiler/rustc_target/src/spec/linux_musl_base.rs +@@ -5,12 +5,9 @@ + let mut base = super::linux_base::opts(); + + base.env = "musl".to_string(); +- base.pre_link_objects_fallback = crt_objects::pre_musl_fallback(); +- base.post_link_objects_fallback = crt_objects::post_musl_fallback(); +- base.crt_objects_fallback = Some(CrtObjectsFallback::Musl); + + // These targets statically link libc by default +- base.crt_static_default = true; ++ base.crt_static_default = false; + + base + } + diff --git a/repo/devel/rustc/patches/need-rpath.patch b/repo/devel/rustc/patches/need-rpath.patch new file mode 100644 index 0000000..5ab8377 --- /dev/null +++ b/repo/devel/rustc/patches/need-rpath.patch @@ -0,0 +1,62 @@ +From: Shiz <hi@shiz.me> +Date: Thu, 20 Aug 2017 01:48:22 +0200 +Subject: [PATCH] Add need_rpath target option to force RPATH generation + +This adds a `need_rpath` option to the target options in order to implicitly +have the equivalent of `-C rpath` specified by default for final products +(executables and dynamic libraries), so that RPATHs are always added. + +We have to skip this step in the bootstrap phase as it does its own manual +RPATH additions, but unfortunately there's no clean way to detect this. +As such, we have to resort to checking the `RUSTC_BOOTSTRAP` variable. +Hacky hacky! + +--- a/compiler/rustc_target/src/spec/mod.rs ++++ b/compiler/rustc_target/src/spec/mod.rs +@@ -379,6 +379,8 @@ + pub allows_weak_linkage: bool, + /// Whether the linker support rpaths or not. Defaults to false. + pub has_rpath: bool, ++ /// Whether to force rpath support on by default. Defaults to false. ++ pub need_rpath: bool, + /// Whether to disable linking to the default libraries, typically corresponds + /// to `-nodefaultlibs`. Defaults to true. + pub no_default_libraries: bool, +@@ -519,6 +519,7 @@ + linker_is_gnu: false, + allows_weak_linkage: true, + has_rpath: false, ++ need_rpath: false, + no_default_libraries: true, + position_independent_executables: false, + static_position_independent_executables: false, +@@ -776,6 +776,7 @@ + key!(linker_is_gnu, bool); + key!(allows_weak_linkage, bool); + key!(has_rpath, bool); ++ key!(need_rpath, bool); + key!(no_default_libraries, bool); + key!(position_independent_executables, bool); + key!(static_position_independent_executables, bool); +@@ -980,6 +980,7 @@ + target_option_val!(linker_is_gnu); + target_option_val!(allows_weak_linkage); + target_option_val!(has_rpath); ++ target_option_val!(need_rpath); + target_option_val!(no_default_libraries); + target_option_val!(position_independent_executables); + target_option_val!(static_position_independent_executables); +--- a/compiler/rustc_codegen_ssa/src/back/link.rs.orig ++++ b/compiler/rustc_codegen_ssa/src/back/link.rs +@@ -1675,7 +1675,10 @@ + // FIXME (#2397): At some point we want to rpath our guesses as to + // where extern libraries might live, based on the + // add_lib_search_paths +- if sess.opts.cg.rpath { ++ // XXX: hacky hacky ++ let bootstrap = env::var("RUSTC_BOOTSTRAP").is_ok(); ++ if !bootstrap && !sess.crt_static(None) && ++ (sess.opts.cg.rpath || sess.target.options.need_rpath) { + let libs = codegen_results + .crate_info + .used_crates diff --git a/repo/devel/rustc/patches/need-ssp_nonshared.patch b/repo/devel/rustc/patches/need-ssp_nonshared.patch new file mode 100644 index 0000000..f1adf20 --- /dev/null +++ b/repo/devel/rustc/patches/need-ssp_nonshared.patch @@ -0,0 +1,13 @@ +--- a/library/std/src/sys/unix/mod.rs.orig 2021-02-11 18:34:14.479832268 +0100 ++++ b/library/std/src/sys/unix/mod.rs 2021-02-11 18:38:28.078987749 +0100 +@@ -243,6 +243,9 @@ + #[link(name = "log")] + #[link(name = "gcc")] + extern "C" {} ++ } else if #[cfg(all(target_os = "linux", target_env = "musl"))] { ++ #[link(name = "ssp_nonshared")] ++ extern "C" {} + } else if #[cfg(target_os = "freebsd")] { + #[link(name = "execinfo")] + #[link(name = "pthread")] + diff --git a/repo/devel/rustc.xibuild b/repo/devel/rustc/rustc.xibuild index 758dafe..758dafe 100644 --- a/repo/devel/rustc.xibuild +++ b/repo/devel/rustc/rustc.xibuild diff --git a/repo/devel/scdoc.xibuild b/repo/devel/scdoc/scdoc.xibuild index d6fc4de..d6fc4de 100644 --- a/repo/devel/scdoc.xibuild +++ b/repo/devel/scdoc/scdoc.xibuild diff --git a/repo/devel/sgml-common.xibuild b/repo/devel/sgml-common/sgml-common.xibuild index 70fe070..70fe070 100644 --- a/repo/devel/sgml-common.xibuild +++ b/repo/devel/sgml-common/sgml-common.xibuild diff --git a/repo/devel/strace/disable-fortify.patch b/repo/devel/strace/disable-fortify.patch new file mode 100644 index 0000000..26b2978 --- /dev/null +++ b/repo/devel/strace/disable-fortify.patch @@ -0,0 +1,39 @@ +Subject: [PATCH] don't use fortify-headers on netlink test sources +From: A. Wilcox <AWilcox@Wilcox-Tech.com> + +We can't use fortify-headers on netlink tests because it tests what happens +when a buffer overrun occurs. + +--- strace-4.18/tests/netlink_protocol.c.old 2017-07-05 07:08:09.000000000 +0000 ++++ strace-4.18/tests/netlink_protocol.c 2017-08-17 01:09:45.822502012 +0000 +@@ -28,6 +28,8 @@ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#define _FORTIFY_SOURCE 0 ++ + #include "tests.h" + + #ifdef HAVE_SYS_XATTR_H +--- strace-4.18/tests/netlink_sock_diag.c.old 2017-07-05 07:08:09.000000000 +0000 ++++ strace-4.18/tests/netlink_sock_diag.c 2017-08-17 01:10:00.935807300 +0000 +@@ -27,6 +27,8 @@ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#define _FORTIFY_SOURCE 0 ++ + #include "tests.h" + #include <stdio.h> + #include <string.h> +--- strace-4.18/tests/nlattr.c.old 2017-07-05 07:08:09.000000000 +0000 ++++ strace-4.18/tests/nlattr.c 2017-08-17 01:10:11.862453682 +0000 +@@ -28,6 +28,8 @@ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + ++#define _FORTIFY_SOURCE 0 ++ + #include "tests.h" + + #include <stdio.h> diff --git a/repo/devel/strace/nlattr-fix.patch b/repo/devel/strace/nlattr-fix.patch new file mode 100644 index 0000000..6d480fa --- /dev/null +++ b/repo/devel/strace/nlattr-fix.patch @@ -0,0 +1,21 @@ +--- strace-4.18/tests/nlattr.c.old 2017-07-05 07:08:09.000000000 +0000 ++++ strace-4.18/tests/nlattr.c 2017-08-17 00:25:26.734218699 +0000 +@@ -61,7 +61,7 @@ + }; + struct msg *msg; + struct nlattr *nla; +- unsigned int msg_len; ++ uint32_t msg_len; + long rc; + + /* fetch fail: len < sizeof(struct nlattr) */ +@@ -259,7 +259,7 @@ + }; + struct msg *msg; + struct nlattr *nla; +- unsigned int msg_len; ++ uint32_t msg_len; + long rc; + + msg_len = NLMSG_SPACE(sizeof(msg->udm)) + sizeof(*nla); + diff --git a/repo/devel/strace.xibuild b/repo/devel/strace/strace.xibuild index e523146..e523146 100644 --- a/repo/devel/strace.xibuild +++ b/repo/devel/strace/strace.xibuild diff --git a/repo/devel/swig.xibuild b/repo/devel/swig/swig.xibuild index 5d2471c..5d2471c 100644 --- a/repo/devel/swig.xibuild +++ b/repo/devel/swig/swig.xibuild diff --git a/repo/devel/texinfo.xibuild b/repo/devel/texinfo/texinfo.xibuild index b53afe6..b53afe6 100644 --- a/repo/devel/texinfo.xibuild +++ b/repo/devel/texinfo/texinfo.xibuild diff --git a/repo/devel/uthash.xibuild b/repo/devel/uthash/uthash.xibuild index e9dd494..e9dd494 100644 --- a/repo/devel/uthash.xibuild +++ b/repo/devel/uthash/uthash.xibuild diff --git a/repo/devel/vala.xibuild b/repo/devel/vala/vala.xibuild index a457cca..a457cca 100644 --- a/repo/devel/vala.xibuild +++ b/repo/devel/vala/vala.xibuild diff --git a/repo/devel/waf.xibuild b/repo/devel/waf/waf.xibuild index a479282..a479282 100644 --- a/repo/devel/waf.xibuild +++ b/repo/devel/waf/waf.xibuild diff --git a/repo/devel/xmlto.xibuild b/repo/devel/xmlto/xmlto.xibuild index 0efc381..0efc381 100644 --- a/repo/devel/xmlto.xibuild +++ b/repo/devel/xmlto/xmlto.xibuild diff --git a/repo/devel/xorg-cf-files.xibuild b/repo/devel/xorg-cf-files/xorg-cf-files.xibuild index a99bcdc..a99bcdc 100644 --- a/repo/devel/xorg-cf-files.xibuild +++ b/repo/devel/xorg-cf-files/xorg-cf-files.xibuild diff --git a/repo/font/encodings.xibuild b/repo/font/encodings/encodings.xibuild index 6252d8a..6252d8a 100644 --- a/repo/font/encodings.xibuild +++ b/repo/font/encodings/encodings.xibuild diff --git a/repo/font/font-adobe-utopia-type1.xibuild b/repo/font/font-adobe-utopia-type1/font-adobe-utopia-type1.xibuild index 7dc766d..7dc766d 100644 --- a/repo/font/font-adobe-utopia-type1.xibuild +++ b/repo/font/font-adobe-utopia-type1/font-adobe-utopia-type1.xibuild diff --git a/repo/font/font-alias.xibuild b/repo/font/font-alias/font-alias.xibuild index 2d54f3a..2d54f3a 100644 --- a/repo/font/font-alias.xibuild +++ b/repo/font/font-alias/font-alias.xibuild diff --git a/repo/font/font-bh-ttf.xibuild b/repo/font/font-bh-ttf/font-bh-ttf.xibuild index 7d9d58c..7d9d58c 100644 --- a/repo/font/font-bh-ttf.xibuild +++ b/repo/font/font-bh-ttf/font-bh-ttf.xibuild diff --git a/repo/font/font-bh-type1.xibuild b/repo/font/font-bh-type1/font-bh-type1.xibuild index 5224ed4..5224ed4 100644 --- a/repo/font/font-bh-type1.xibuild +++ b/repo/font/font-bh-type1/font-bh-type1.xibuild diff --git a/repo/font/font-ibm-type1.xibuild b/repo/font/font-ibm-type1/font-ibm-type1.xibuild index fbf0fdf..fbf0fdf 100644 --- a/repo/font/font-ibm-type1.xibuild +++ b/repo/font/font-ibm-type1/font-ibm-type1.xibuild diff --git a/repo/font/font-misc-ethiopic.xibuild b/repo/font/font-misc-ethiopic/font-misc-ethiopic.xibuild index 872fa2c..872fa2c 100644 --- a/repo/font/font-misc-ethiopic.xibuild +++ b/repo/font/font-misc-ethiopic/font-misc-ethiopic.xibuild diff --git a/repo/font/font-opensans.xibuild b/repo/font/font-opensans/font-opensans.xibuild index 26369eb..26369eb 100644 --- a/repo/font/font-opensans.xibuild +++ b/repo/font/font-opensans/font-opensans.xibuild diff --git a/repo/font/font-util.xibuild b/repo/font/font-util/font-util.xibuild index 92b8078..92b8078 100644 --- a/repo/font/font-util.xibuild +++ b/repo/font/font-util/font-util.xibuild diff --git a/repo/font/font-xfree86-type1.xibuild b/repo/font/font-xfree86-type1/font-xfree86-type1.xibuild index aba89b8..aba89b8 100644 --- a/repo/font/font-xfree86-type1.xibuild +++ b/repo/font/font-xfree86-type1/font-xfree86-type1.xibuild diff --git a/repo/font/fontconfig.xibuild b/repo/font/fontconfig/fontconfig.xibuild index 7814f4a..7814f4a 100644 --- a/repo/font/fontconfig.xibuild +++ b/repo/font/fontconfig/fontconfig.xibuild diff --git a/repo/linux/b43-firmware.xibuild b/repo/linux/b43-firmware/b43-firmware.xibuild index b0a32d2..b0a32d2 100644 --- a/repo/linux/b43-firmware.xibuild +++ b/repo/linux/b43-firmware/b43-firmware.xibuild diff --git a/repo/linux/b43-fwcutter.xibuild b/repo/linux/b43-fwcutter/b43-fwcutter.xibuild index 68394f5..68394f5 100644 --- a/repo/linux/b43-fwcutter.xibuild +++ b/repo/linux/b43-fwcutter/b43-fwcutter.xibuild diff --git a/repo/linux/linux-firmware.xibuild b/repo/linux/linux-firmware/linux-firmware.xibuild index 67f5f14..67f5f14 100644 --- a/repo/linux/linux-firmware.xibuild +++ b/repo/linux/linux-firmware/linux-firmware.xibuild diff --git a/repo/linux/linux-headers.xibuild b/repo/linux/linux-headers/linux-headers.xibuild index f5404fe..f5404fe 100644 --- a/repo/linux/linux-headers.xibuild +++ b/repo/linux/linux-headers/linux-headers.xibuild diff --git a/repo/linux/linux-src/config b/repo/linux/linux-src/config new file mode 100644 index 0000000..4363fdc --- /dev/null +++ b/repo/linux/linux-src/config @@ -0,0 +1,10572 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86_64 5.16.11 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="gcc (XiLinux 11.2.0) 11.2.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=100201 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23501 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23501 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="_1" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_HAVE_KERNEL_ZSTD=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_ZSTD is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_WATCH_QUEUE=y +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_INJECTION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_SIM=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +CONFIG_BPF_UNPRIV_DEFAULT_OFF=y +CONFIG_USERMODE_DRIVER=y +CONFIG_BPF_PRELOAD=y +CONFIG_BPF_PRELOAD_UMD=m +CONFIG_BPF_LSM=y +# end of BPF subsystem + +CONFIG_PREEMPT_BUILD=y +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y +CONFIG_PREEMPT_DYNAMIC=y +CONFIG_SCHED_CORE=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_SCHED_AVG_IRQ=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_PSI=y +CONFIG_PSI_DEFAULT_DISABLED=y +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_RUDE_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_IKHEADERS=m +CONFIG_LOG_BUF_SHIFT=19 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +# CONFIG_PRINTK_INDEX is not set +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_NUMA_BALANCING=y +CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_MEMCG_KMEM=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +# CONFIG_CGROUP_RDMA is not set +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_SCHED_AUTOGROUP=y +# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_RD_ZSTD=y +CONFIG_BOOT_CONFIG=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_EXPERT=y +CONFIG_UID16=y +CONFIG_MULTIUSER=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_PCSPKR_PLATFORM=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_HAVE_ARCH_USERFAULTFD_WP=y +CONFIG_HAVE_ARCH_USERFAULTFD_MINOR=y +CONFIG_MEMBARRIER=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y +CONFIG_KALLSYMS_BASE_RELATIVE=y +CONFIG_USERFAULTFD=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y +CONFIG_RSEQ=y +# CONFIG_DEBUG_RSEQ is not set +# CONFIG_EMBEDDED is not set +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +CONFIG_SLAB_FREELIST_RANDOM=y +CONFIG_SLAB_FREELIST_HARDENED=y +CONFIG_SHUFFLE_PAGE_ALLOCATOR=y +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# end of General setup + +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HAS_FILTER_PGPROT=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_AUDIT_ARCH=y +CONFIG_HAVE_INTEL_TXT=y +CONFIG_X86_64_SMP=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_CC_HAS_SANE_STACKPROTECTOR=y + +# +# Processor type and features +# +CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y +CONFIG_X86_X2APIC=y +CONFIG_X86_MPPARSE=y +# CONFIG_GOLDFISH is not set +CONFIG_RETPOLINE=y +CONFIG_X86_CPU_RESCTRL=y +# CONFIG_X86_EXTENDED_PLATFORM is not set +CONFIG_X86_INTEL_LPSS=y +CONFIG_X86_AMD_PLATFORM_DEVICE=y +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_XXL=y +# CONFIG_PARAVIRT_DEBUG is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set +CONFIG_X86_HV_CALLBACK_VECTOR=y +CONFIG_XEN=y +CONFIG_XEN_PV=y +CONFIG_XEN_512GB=y +CONFIG_XEN_PV_SMP=y +CONFIG_XEN_PV_DOM0=y +CONFIG_XEN_PVHVM=y +CONFIG_XEN_PVHVM_SMP=y +CONFIG_XEN_PVHVM_GUEST=y +CONFIG_XEN_SAVE_RESTORE=y +# CONFIG_XEN_DEBUG_FS is not set +CONFIG_XEN_PVH=y +CONFIG_XEN_DOM0=y +CONFIG_KVM_GUEST=y +CONFIG_ARCH_CPUIDLE_HALTPOLL=y +CONFIG_PVH=y +CONFIG_PARAVIRT_TIME_ACCOUNTING=y +CONFIG_PARAVIRT_CLOCK=y +# CONFIG_JAILHOUSE_GUEST is not set +# CONFIG_ACRN_GUEST is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +# CONFIG_MCORE2 is not set +# CONFIG_MATOM is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_X86_VMX_FEATURE_NAMES=y +# CONFIG_PROCESSOR_SELECT is not set +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_HYGON=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_CPU_SUP_ZHAOXIN=y +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_DMI=y +CONFIG_GART_IOMMU=y +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS=256 +CONFIG_SCHED_CLUSTER=y +CONFIG_SCHED_SMT=y +CONFIG_SCHED_MC=y +CONFIG_SCHED_MC_PRIO=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_AMD=y +CONFIG_X86_MCE_THRESHOLD=y +CONFIG_X86_MCE_INJECT=m + +# +# Performance monitoring +# +CONFIG_PERF_EVENTS_INTEL_UNCORE=y +CONFIG_PERF_EVENTS_INTEL_RAPL=m +CONFIG_PERF_EVENTS_INTEL_CSTATE=m +CONFIG_PERF_EVENTS_AMD_POWER=m +CONFIG_PERF_EVENTS_AMD_UNCORE=m +# end of Performance monitoring + +# CONFIG_X86_16BIT is not set +CONFIG_X86_VSYSCALL_EMULATION=y +CONFIG_X86_IOPL_IOPERM=y +CONFIG_I8K=m +CONFIG_MICROCODE=y +CONFIG_MICROCODE_INTEL=y +CONFIG_MICROCODE_AMD=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +# CONFIG_X86_5LEVEL is not set +CONFIG_X86_DIRECT_GBPAGES=y +# CONFIG_X86_CPA_STATISTICS is not set +# CONFIG_AMD_MEM_ENCRYPT is not set +CONFIG_NUMA=y +CONFIG_AMD_NUMA=y +CONFIG_X86_64_ACPI_NUMA=y +# CONFIG_NUMA_EMU is not set +CONFIG_NODES_SHIFT=6 +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_MEMORY_PROBE=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_X86_PMEM_LEGACY_DEVICE=y +CONFIG_X86_PMEM_LEGACY=y +CONFIG_X86_CHECK_BIOS_CORRUPTION=y +CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y +CONFIG_MTRR=y +CONFIG_MTRR_SANITIZER=y +CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 +CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 +CONFIG_X86_PAT=y +CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_RANDOM=y +CONFIG_X86_SMAP=y +CONFIG_X86_UMIP=y +CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y +CONFIG_X86_INTEL_TSX_MODE_OFF=y +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +# CONFIG_X86_SGX is not set +CONFIG_EFI=y +CONFIG_EFI_STUB=y +CONFIG_EFI_MIXED=y +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 +CONFIG_SCHED_HRTICK=y +CONFIG_KEXEC=y +# CONFIG_KEXEC_FILE is not set +CONFIG_CRASH_DUMP=y +# CONFIG_KEXEC_JUMP is not set +CONFIG_PHYSICAL_START=0x1000000 +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa +CONFIG_HOTPLUG_CPU=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +# CONFIG_COMPAT_VDSO is not set +# CONFIG_LEGACY_VSYSCALL_EMULATE is not set +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LEGACY_VSYSCALL_NONE=y +# CONFIG_CMDLINE_BOOL is not set +CONFIG_MODIFY_LDT_SYSCALL=y +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set +CONFIG_HAVE_LIVEPATCH=y +# end of Processor type and features + +CONFIG_ARCH_HAS_ADD_PAGES=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_USE_PERCPU_NUMA_NODE_ID=y + +# +# Power management and ACPI options +# +CONFIG_ARCH_HIBERNATION_HEADER=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_HIBERNATION_SNAPSHOT_DEV=y +CONFIG_PM_STD_PARTITION="" +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_ENERGY_MODEL=y +CONFIG_ARCH_SUPPORTS_ACPI=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_FPDT=y +CONFIG_ACPI_LPIT=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +CONFIG_ACPI_EC_DEBUGFS=m +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_TINY_POWER_BUTTON=m +CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL=38 +CONFIG_ACPI_VIDEO=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_TAD=m +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_CPU_FREQ_PSS=y +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_CPPC_LIB=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_IPMI=m +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_PROCESSOR_AGGREGATOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_PLATFORM_PROFILE=m +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_PCI_SLOT=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_MEMORY=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +CONFIG_ACPI_SBS=m +CONFIG_ACPI_HED=y +CONFIG_ACPI_CUSTOM_METHOD=m +CONFIG_ACPI_BGRT=y +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +CONFIG_ACPI_NFIT=m +# CONFIG_NFIT_SECURITY_DEBUG is not set +CONFIG_ACPI_NUMA=y +CONFIG_ACPI_HMAT=y +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +CONFIG_ACPI_APEI=y +CONFIG_ACPI_APEI_GHES=y +CONFIG_ACPI_APEI_PCIEAER=y +CONFIG_ACPI_APEI_MEMORY_FAILURE=y +CONFIG_ACPI_APEI_EINJ=m +CONFIG_ACPI_APEI_ERST_DEBUG=m +CONFIG_ACPI_DPTF=y +CONFIG_DPTF_POWER=m +CONFIG_DPTF_PCH_FIVR=m +CONFIG_ACPI_WATCHDOG=y +CONFIG_ACPI_EXTLOG=m +CONFIG_ACPI_ADXL=y +CONFIG_ACPI_CONFIGFS=m +# CONFIG_PMIC_OPREGION is not set +CONFIG_TPS68470_PMIC_OPREGION=y +CONFIG_ACPI_VIOT=y +CONFIG_X86_PM_TIMER=y +CONFIG_ACPI_PRMT=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +# CONFIG_CPU_FREQ_STAT is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_X86_INTEL_PSTATE=y +CONFIG_X86_PCC_CPUFREQ=m +CONFIG_X86_ACPI_CPUFREQ=m +CONFIG_X86_ACPI_CPUFREQ_CPB=y +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_AMD_FREQ_SENSITIVITY=m +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +CONFIG_X86_P4_CLOCKMOD=m + +# +# shared options +# +CONFIG_X86_SPEEDSTEP_LIB=m +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_IDLE_GOV_TEO=y +CONFIG_CPU_IDLE_GOV_HALTPOLL=y +CONFIG_HALTPOLL_CPUIDLE=y +# end of CPU Idle + +CONFIG_INTEL_IDLE=y +# end of Power management and ACPI options + +# +# Bus options (PCI etc.) +# +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_XEN=y +CONFIG_MMCONF_FAM10H=y +# CONFIG_PCI_CNB20LE_QUIRK is not set +# CONFIG_ISA_BUS is not set +CONFIG_ISA_DMA_API=y +CONFIG_AMD_NB=y +# end of Bus options (PCI etc.) + +# +# Binary Emulations +# +CONFIG_IA32_EMULATION=y +# CONFIG_X86_X32 is not set +CONFIG_COMPAT_32=y +CONFIG_COMPAT=y +CONFIG_COMPAT_FOR_U64_ALIGNMENT=y +CONFIG_SYSVIPC_COMPAT=y +# end of Binary Emulations + +CONFIG_HAVE_KVM=y +CONFIG_HAVE_KVM_IRQCHIP=y +CONFIG_HAVE_KVM_IRQFD=y +CONFIG_HAVE_KVM_IRQ_ROUTING=y +CONFIG_HAVE_KVM_EVENTFD=y +CONFIG_KVM_MMIO=y +CONFIG_KVM_ASYNC_PF=y +CONFIG_HAVE_KVM_MSI=y +CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y +CONFIG_KVM_VFIO=y +CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y +CONFIG_KVM_COMPAT=y +CONFIG_HAVE_KVM_IRQ_BYPASS=y +CONFIG_HAVE_KVM_NO_POLL=y +CONFIG_KVM_XFER_TO_GUEST_WORK=y +CONFIG_HAVE_KVM_PM_NOTIFIER=y +CONFIG_VIRTUALIZATION=y +CONFIG_KVM=m +CONFIG_KVM_WERROR=y +CONFIG_KVM_INTEL=m +CONFIG_KVM_AMD=m +CONFIG_KVM_AMD_SEV=y +# CONFIG_KVM_XEN is not set +# CONFIG_KVM_MMU_AUDIT is not set +CONFIG_KVM_EXTERNAL_WRITE_TRACKING=y +CONFIG_AS_AVX512=y +CONFIG_AS_SHA1_NI=y +CONFIG_AS_SHA256_NI=y +CONFIG_AS_TPAUSE=y + +# +# General architecture-dependent options +# +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y +CONFIG_HOTPLUG_SMT=y +CONFIG_GENERIC_ENTRY=y +CONFIG_KPROBES=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_OPTPROBES=y +CONFIG_KPROBES_ON_FTRACE=y +CONFIG_UPROBES=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_KRETPROBES=y +CONFIG_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 +CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_HAVE_STACK_VALIDATION=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_STATIC_CALL=y +CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +# CONFIG_GCC_PLUGINS is not set +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_ASM_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_INTEGRITY_T10=y +CONFIG_BLK_DEV_ZONED=y +CONFIG_BLK_DEV_THROTTLING=y +# CONFIG_BLK_DEV_THROTTLING_LOW is not set +CONFIG_BLK_WBT=y +CONFIG_BLK_WBT_MQ=y +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_FC_APPID is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +CONFIG_BLK_CGROUP_IOPRIO=y +CONFIG_BLK_DEBUG_FS=y +CONFIG_BLK_DEBUG_FS_ZONED=y +# CONFIG_BLK_SED_OPAL is not set +CONFIG_BLK_INLINE_ENCRYPTION=y +CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_AIX_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +# CONFIG_UNIXWARE_DISKLABEL is not set +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +CONFIG_EFI_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +CONFIG_CMDLINE_PARTITION=y +# end of Partition Types + +CONFIG_BLOCK_COMPAT=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_MQ_RDMA=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_IOSCHED_BFQ=y +CONFIG_BFQ_GROUP_IOSCHED=y +# CONFIG_BFQ_CGROUP_DEBUG is not set +# end of IO Schedulers + +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_BINFMT_MISC=m +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_FAST_GUP=y +CONFIG_NUMA_KEEP_MEMINFO=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_EXCLUSIVE_SYSTEM_RAM=y +CONFIG_HAVE_BOOTMEM_INFO_NODE=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_MEMORY_HOTPLUG=y +CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_MEMORY_HOTREMOVE=y +CONFIG_MHP_MEMMAP_ON_MEMORY=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_MEMORY_BALLOON=y +CONFIG_BALLOON_COMPACTION=y +CONFIG_COMPACTION=y +CONFIG_PAGE_REPORTING=y +CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_VIRT_TO_BUS=y +CONFIG_MMU_NOTIFIER=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +CONFIG_MEMORY_FAILURE=y +# CONFIG_HWPOISON_INJECT is not set +CONFIG_TRANSPARENT_HUGEPAGE=y +# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +CONFIG_ARCH_WANTS_THP_SWAP=y +CONFIG_THP_SWAP=y +CONFIG_CLEANCACHE=y +CONFIG_FRONTSWAP=y +# CONFIG_CMA is not set +# CONFIG_MEM_SOFT_DIRTY is not set +CONFIG_ZSWAP=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" +CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD=y +# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD is not set +# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC is not set +CONFIG_ZSWAP_ZPOOL_DEFAULT="zbud" +# CONFIG_ZSWAP_DEFAULT_ON is not set +CONFIG_ZPOOL=y +CONFIG_ZBUD=y +CONFIG_Z3FOLD=m +CONFIG_ZSMALLOC=y +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +CONFIG_PAGE_IDLE_FLAG=y +CONFIG_IDLE_PAGE_TRACKING=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ZONE_DEVICE=y +CONFIG_DEV_PAGEMAP_OPS=y +CONFIG_HMM_MIRROR=y +# CONFIG_DEVICE_PRIVATE is not set +CONFIG_VMAP_PFN=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_HAS_PKEYS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_MAPPING_DIRTY_HELPERS=y +CONFIG_SECRETMEM=y + +# +# Data Access Monitoring +# +CONFIG_DAMON=y +CONFIG_DAMON_VADDR=y +CONFIG_DAMON_PADDR=y +CONFIG_DAMON_DBGFS=y +CONFIG_DAMON_RECLAIM=y +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_WANT_COMPAT_NETLINK_MESSAGES=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_REDIRECT=y +CONFIG_SKB_EXTENSIONS=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y +CONFIG_UNIX_DIAG=m +CONFIG_TLS=m +CONFIG_TLS_DEVICE=y +# CONFIG_TLS_TOE is not set +CONFIG_XFRM=y +CONFIG_XFRM_OFFLOAD=y +CONFIG_XFRM_ALGO=m +CONFIG_XFRM_USER=m +CONFIG_XFRM_USER_COMPAT=m +CONFIG_XFRM_INTERFACE=m +# CONFIG_XFRM_SUB_POLICY is not set +CONFIG_XFRM_MIGRATE=y +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_AH=m +CONFIG_XFRM_ESP=m +CONFIG_XFRM_IPCOMP=m +CONFIG_NET_KEY=m +CONFIG_NET_KEY_MIGRATE=y +CONFIG_XFRM_ESPINTCP=y +CONFIG_SMC=m +CONFIG_SMC_DIAG=m +CONFIG_XDP_SOCKETS=y +CONFIG_XDP_SOCKETS_DIAG=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_ROUTE_CLASSID=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IP_TUNNEL=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE_COMMON=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m +CONFIG_NET_UDP_TUNNEL=m +CONFIG_NET_FOU=m +# CONFIG_NET_FOU_IP_TUNNELS is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_ESP_OFFLOAD=m +CONFIG_INET_ESPINTCP=y +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +CONFIG_INET_UDP_DIAG=y +CONFIG_INET_RAW_DIAG=m +CONFIG_INET_DIAG_DESTROY=y +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=m +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_NV=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_CONG_BBR=m +CONFIG_DEFAULT_RENO=y +CONFIG_DEFAULT_TCP_CONG="reno" +CONFIG_TCP_MD5SIG=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_ESP_OFFLOAD=m +CONFIG_INET6_ESPINTCP=y +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=m +CONFIG_IPV6_ILA=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_IPV6_VTI=m +CONFIG_IPV6_SIT=m +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m +CONFIG_IPV6_FOU=m +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y +CONFIG_IPV6_PIMSM_V2=y +CONFIG_IPV6_SEG6_LWTUNNEL=y +CONFIG_IPV6_SEG6_HMAC=y +CONFIG_IPV6_SEG6_BPF=y +CONFIG_IPV6_RPL_LWTUNNEL=y +CONFIG_IPV6_IOAM6_LWTUNNEL=y +# CONFIG_NETLABEL is not set +CONFIG_MPTCP=y +CONFIG_INET_MPTCP_DIAG=y +CONFIG_MPTCP_IPV6=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_EGRESS=y +CONFIG_NETFILTER_SKIP_EGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_FAMILY_ARP=y +CONFIG_NETFILTER_NETLINK_HOOK=m +CONFIG_NETFILTER_NETLINK_ACCT=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_NETLINK_OSF=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_SYSLOG=m +CONFIG_NETFILTER_CONNCOUNT=m +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_LABELS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_GRE=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_BROADCAST=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_CT_NETLINK_HELPER=m +CONFIG_NETFILTER_NETLINK_GLUE_CT=y +CONFIG_NF_NAT=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +CONFIG_NF_TABLES_NETDEV=y +CONFIG_NFT_NUMGEN=m +CONFIG_NFT_CT=m +CONFIG_NFT_FLOW_OFFLOAD=m +CONFIG_NFT_COUNTER=m +CONFIG_NFT_CONNLIMIT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_NAT=m +CONFIG_NFT_TUNNEL=m +CONFIG_NFT_OBJREF=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_QUOTA=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_REJECT_INET=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NFT_FIB=m +CONFIG_NFT_FIB_INET=m +CONFIG_NFT_XFRM=m +CONFIG_NFT_SOCKET=m +CONFIG_NFT_OSF=m +CONFIG_NFT_TPROXY=m +# CONFIG_NFT_SYNPROXY is not set +CONFIG_NF_DUP_NETDEV=m +CONFIG_NFT_DUP_NETDEV=m +CONFIG_NFT_FWD_NETDEV=m +CONFIG_NFT_FIB_NETDEV=m +CONFIG_NFT_REJECT_NETDEV=m +CONFIG_NF_FLOW_TABLE_INET=m +CONFIG_NF_FLOW_TABLE=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XTABLES_COMPAT=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m +CONFIG_NETFILTER_XT_SET=m + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_HL=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +# end of Core Netfilter Configuration + +CONFIG_IP_SET=m +CONFIG_IP_SET_MAX=256 +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_IPMAC=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_IPV6=y +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_AH_ESP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_MH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_TWOS=m + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PE_SIP=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_NF_SOCKET_IPV4=m +CONFIG_NF_TPROXY_IPV4=m +CONFIG_NF_TABLES_IPV4=y +CONFIG_NFT_REJECT_IPV4=m +CONFIG_NFT_DUP_IPV4=m +CONFIG_NFT_FIB_IPV4=m +CONFIG_NF_TABLES_ARP=y +CONFIG_NF_FLOW_TABLE_IPV4=m +CONFIG_NF_DUP_IPV4=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_REJECT_IPV4=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +# CONFIG_IP_NF_SECURITY is not set +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_SOCKET_IPV6=m +CONFIG_NF_TPROXY_IPV6=m +CONFIG_NF_TABLES_IPV6=y +CONFIG_NFT_REJECT_IPV6=m +CONFIG_NFT_DUP_IPV6=m +CONFIG_NFT_FIB_IPV6=m +CONFIG_NF_FLOW_TABLE_IPV6=m +CONFIG_NF_DUP_IPV6=m +CONFIG_NF_REJECT_IPV6=m +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +# CONFIG_IP6_NF_SECURITY is not set +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +# end of IPv6: Netfilter Configuration + +CONFIG_NF_DEFRAG_IPV6=m +CONFIG_NF_TABLES_BRIDGE=m +# CONFIG_NFT_BRIDGE_META is not set +CONFIG_NFT_BRIDGE_REJECT=m +# CONFIG_NF_CONNTRACK_BRIDGE is not set +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +# CONFIG_BPFILTER is not set +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m + +# +# DCCP CCIDs Configuration +# +# CONFIG_IP_DCCP_CCID2_DEBUG is not set +CONFIG_IP_DCCP_CCID3=y +# CONFIG_IP_DCCP_CCID3_DEBUG is not set +CONFIG_IP_DCCP_TFRC_LIB=y +# end of DCCP CCIDs Configuration + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set +# end of DCCP Kernel Hacking + +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set +CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set +# CONFIG_SCTP_COOKIE_HMAC_MD5 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_INET_SCTP_DIAG=m +CONFIG_RDS=m +# CONFIG_RDS_RDMA is not set +CONFIG_RDS_TCP=m +# CONFIG_RDS_DEBUG is not set +CONFIG_TIPC=m +CONFIG_TIPC_MEDIA_IB=y +CONFIG_TIPC_MEDIA_UDP=y +CONFIG_TIPC_CRYPTO=y +CONFIG_TIPC_DIAG=m +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_L2TP=m +CONFIG_L2TP_DEBUGFS=m +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m +CONFIG_STP=m +CONFIG_GARP=m +CONFIG_MRP=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_BRIDGE_MRP=y +# CONFIG_BRIDGE_CFM is not set +CONFIG_NET_DSA=m +CONFIG_NET_DSA_TAG_AR9331=m +CONFIG_NET_DSA_TAG_BRCM_COMMON=m +CONFIG_NET_DSA_TAG_BRCM=m +CONFIG_NET_DSA_TAG_BRCM_LEGACY=m +CONFIG_NET_DSA_TAG_BRCM_PREPEND=m +# CONFIG_NET_DSA_TAG_HELLCREEK is not set +CONFIG_NET_DSA_TAG_GSWIP=m +CONFIG_NET_DSA_TAG_DSA_COMMON=m +CONFIG_NET_DSA_TAG_DSA=m +CONFIG_NET_DSA_TAG_EDSA=m +CONFIG_NET_DSA_TAG_MTK=m +CONFIG_NET_DSA_TAG_KSZ=m +CONFIG_NET_DSA_TAG_OCELOT=m +CONFIG_NET_DSA_TAG_OCELOT_8021Q=m +CONFIG_NET_DSA_TAG_QCA=m +CONFIG_NET_DSA_TAG_RTL4_A=m +CONFIG_NET_DSA_TAG_RTL8_4=m +CONFIG_NET_DSA_TAG_LAN9303=m +CONFIG_NET_DSA_TAG_SJA1105=m +CONFIG_NET_DSA_TAG_TRAILER=m +CONFIG_NET_DSA_TAG_XRS700X=m +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +# CONFIG_DECNET is not set +CONFIG_LLC=m +CONFIG_LLC2=m +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=m +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_PHONET=m +# CONFIG_6LOWPAN is not set +CONFIG_IEEE802154=m +CONFIG_IEEE802154_NL802154_EXPERIMENTAL=y +CONFIG_IEEE802154_SOCKET=m +CONFIG_MAC802154=m +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_MULTIQ=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFB=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_CBS=m +CONFIG_NET_SCH_ETF=m +CONFIG_NET_SCH_TAPRIO=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_DRR=m +CONFIG_NET_SCH_MQPRIO=m +CONFIG_NET_SCH_SKBPRIO=m +CONFIG_NET_SCH_CHOKE=m +CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_FQ_CODEL=m +CONFIG_NET_SCH_CAKE=m +CONFIG_NET_SCH_FQ=m +CONFIG_NET_SCH_HHF=m +CONFIG_NET_SCH_PIE=m +CONFIG_NET_SCH_FQ_PIE=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_PLUG=m +CONFIG_NET_SCH_ETS=m +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_CLS_U32_MARK is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_FLOW=m +# CONFIG_NET_CLS_CGROUP is not set +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_FLOWER=m +CONFIG_NET_CLS_MATCHALL=m +# CONFIG_NET_EMATCH is not set +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_SAMPLE=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_ACT_SKBEDIT=m +CONFIG_NET_ACT_CSUM=m +# CONFIG_NET_ACT_MPLS is not set +CONFIG_NET_ACT_VLAN=m +CONFIG_NET_ACT_BPF=m +CONFIG_NET_ACT_CONNMARK=m +# CONFIG_NET_ACT_CTINFO is not set +CONFIG_NET_ACT_SKBMOD=m +CONFIG_NET_ACT_IFE=m +CONFIG_NET_ACT_TUNNEL_KEY=m +# CONFIG_NET_ACT_CT is not set +CONFIG_NET_ACT_GATE=m +CONFIG_NET_IFE_SKBMARK=m +CONFIG_NET_IFE_SKBPRIO=m +CONFIG_NET_IFE_SKBTCINDEX=m +# CONFIG_NET_TC_SKB_EXT is not set +CONFIG_NET_SCH_FIFO=y +CONFIG_DCB=y +CONFIG_DNS_RESOLVER=y +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_BATMAN_V=y +CONFIG_BATMAN_ADV_BLA=y +CONFIG_BATMAN_ADV_DAT=y +CONFIG_BATMAN_ADV_NC=y +CONFIG_BATMAN_ADV_MCAST=y +# CONFIG_BATMAN_ADV_DEBUG is not set +# CONFIG_BATMAN_ADV_TRACING is not set +CONFIG_OPENVSWITCH=m +CONFIG_OPENVSWITCH_GRE=m +CONFIG_OPENVSWITCH_VXLAN=m +CONFIG_OPENVSWITCH_GENEVE=m +CONFIG_VSOCKETS=m +CONFIG_VSOCKETS_DIAG=m +CONFIG_VSOCKETS_LOOPBACK=m +CONFIG_VMWARE_VMCI_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS_COMMON=m +CONFIG_HYPERV_VSOCKETS=m +CONFIG_NETLINK_DIAG=m +CONFIG_MPLS=y +CONFIG_NET_MPLS_GSO=m +CONFIG_MPLS_ROUTING=m +CONFIG_MPLS_IPTUNNEL=m +CONFIG_NET_NSH=m +CONFIG_HSR=m +CONFIG_NET_SWITCHDEV=y +CONFIG_NET_L3_MASTER_DEV=y +CONFIG_QRTR=m +CONFIG_QRTR_SMD=m +CONFIG_QRTR_TUN=m +CONFIG_QRTR_MHI=m +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +CONFIG_BPF_STREAM_PARSER=y +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +CONFIG_CAN=m +CONFIG_CAN_RAW=m +CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m +# CONFIG_CAN_J1939 is not set +CONFIG_CAN_ISOTP=m + +# +# CAN Device Drivers +# +CONFIG_CAN_VCAN=m +# CONFIG_CAN_VXCAN is not set +CONFIG_CAN_SLCAN=m +CONFIG_CAN_DEV=m +CONFIG_CAN_CALC_BITTIMING=y +# CONFIG_CAN_JANZ_ICAN3 is not set +# CONFIG_CAN_KVASER_PCIEFD is not set +CONFIG_CAN_C_CAN=m +CONFIG_CAN_C_CAN_PLATFORM=m +CONFIG_CAN_C_CAN_PCI=m +CONFIG_CAN_CC770=m +CONFIG_CAN_CC770_ISA=m +CONFIG_CAN_CC770_PLATFORM=m +CONFIG_CAN_IFI_CANFD=m +CONFIG_CAN_M_CAN=m +# CONFIG_CAN_M_CAN_PCI is not set +# CONFIG_CAN_M_CAN_PLATFORM is not set +# CONFIG_CAN_M_CAN_TCAN4X5X is not set +# CONFIG_CAN_PEAK_PCIEFD is not set +# CONFIG_CAN_SJA1000 is not set +CONFIG_CAN_SOFTING=m + +# +# CAN SPI interfaces +# +# CONFIG_CAN_HI311X is not set +CONFIG_CAN_MCP251X=m +CONFIG_CAN_MCP251XFD=m +# CONFIG_CAN_MCP251XFD_SANITY is not set +# end of CAN SPI interfaces + +# +# CAN USB interfaces +# +CONFIG_CAN_8DEV_USB=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_ESD_USB2=m +CONFIG_CAN_ETAS_ES58X=m +CONFIG_CAN_GS_USB=m +CONFIG_CAN_KVASER_USB=m +# CONFIG_CAN_MCBA_USB is not set +CONFIG_CAN_PEAK_USB=m +CONFIG_CAN_UCAN=m +# end of CAN USB interfaces + +CONFIG_CAN_DEBUG_DEVICES=y +# end of CAN Device Drivers + +CONFIG_BT=m +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m +CONFIG_BT_HS=y +CONFIG_BT_LE=y +CONFIG_BT_LEDS=y +CONFIG_BT_MSFTEXT=y +CONFIG_BT_AOSPEXT=y +CONFIG_BT_DEBUGFS=y +# CONFIG_BT_SELFTEST is not set + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=m +CONFIG_BT_BCM=m +CONFIG_BT_RTL=m +CONFIG_BT_QCA=m +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y +CONFIG_BT_HCIBTUSB_BCM=y +CONFIG_BT_HCIBTUSB_MTK=y +CONFIG_BT_HCIBTUSB_RTL=y +CONFIG_BT_HCIBTSDIO=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_NOKIA=m +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_LL=y +CONFIG_BT_HCIUART_3WIRE=y +CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_RTL=y +CONFIG_BT_HCIUART_QCA=y +CONFIG_BT_HCIUART_AG6XX=y +# CONFIG_BT_HCIUART_MRVL is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_BT_ATH3K=m +CONFIG_BT_MTKSDIO=m +CONFIG_BT_MTKUART=m +CONFIG_BT_HCIRSI=m +CONFIG_BT_VIRTIO=m +# end of Bluetooth device drivers + +CONFIG_AF_RXRPC=m +# CONFIG_AF_RXRPC_IPV6 is not set +# CONFIG_AF_RXRPC_INJECT_LOSS is not set +# CONFIG_AF_RXRPC_DEBUG is not set +# CONFIG_RXKAD is not set +CONFIG_AF_KCM=m +CONFIG_STREAM_PARSER=y +CONFIG_MCTP=y +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_SPY=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=m +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +CONFIG_CFG80211_WEXT_EXPORT=y +CONFIG_LIB80211=m +CONFIG_LIB80211_CRYPT_WEP=m +CONFIG_LIB80211_CRYPT_CCMP=m +CONFIG_LIB80211_CRYPT_TKIP=m +# CONFIG_LIB80211_DEBUG is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +CONFIG_MAC80211_MESH=y +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_RFKILL=m +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +CONFIG_NET_9P=m +CONFIG_NET_9P_VIRTIO=m +# CONFIG_NET_9P_XEN is not set +# CONFIG_NET_9P_RDMA is not set +# CONFIG_NET_9P_DEBUG is not set +CONFIG_CAIF=m +# CONFIG_CAIF_DEBUG is not set +CONFIG_CAIF_NETDEV=m +CONFIG_CAIF_USB=m +CONFIG_CEPH_LIB=m +# CONFIG_CEPH_LIB_PRETTYDEBUG is not set +CONFIG_CEPH_LIB_USE_DNS_RESOLVER=y +CONFIG_NFC=m +CONFIG_NFC_DIGITAL=m +CONFIG_NFC_NCI=m +CONFIG_NFC_NCI_SPI=m +CONFIG_NFC_NCI_UART=m +CONFIG_NFC_HCI=m +# CONFIG_NFC_SHDLC is not set + +# +# Near Field Communication (NFC) devices +# +CONFIG_NFC_TRF7970A=m +CONFIG_NFC_MEI_PHY=m +CONFIG_NFC_SIM=m +CONFIG_NFC_PORT100=m +CONFIG_NFC_VIRTUAL_NCI=m +CONFIG_NFC_FDP=m +CONFIG_NFC_FDP_I2C=m +CONFIG_NFC_PN544=m +CONFIG_NFC_PN544_MEI=m +CONFIG_NFC_PN533=m +CONFIG_NFC_PN533_USB=m +CONFIG_NFC_PN533_I2C=m +CONFIG_NFC_PN532_UART=m +CONFIG_NFC_MICROREAD=m +CONFIG_NFC_MICROREAD_MEI=m +CONFIG_NFC_MRVL=m +CONFIG_NFC_MRVL_USB=m +CONFIG_NFC_MRVL_UART=m +CONFIG_NFC_MRVL_I2C=m +CONFIG_NFC_MRVL_SPI=m +CONFIG_NFC_ST_NCI=m +CONFIG_NFC_ST_NCI_I2C=m +CONFIG_NFC_ST_NCI_SPI=m +CONFIG_NFC_NXP_NCI=m +CONFIG_NFC_NXP_NCI_I2C=m +CONFIG_NFC_S3FWRN5=m +CONFIG_NFC_S3FWRN5_I2C=m +CONFIG_NFC_S3FWRN82_UART=m +CONFIG_NFC_ST95HF=m +# end of Near Field Communication (NFC) devices + +CONFIG_PSAMPLE=m +CONFIG_NET_IFE=m +CONFIG_LWTUNNEL=y +CONFIG_LWTUNNEL_BPF=y +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_SOCK_VALIDATE_XMIT=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_NET_DEVLINK=y +CONFIG_PAGE_POOL=y +CONFIG_FAILOVER=m +CONFIG_ETHTOOL_NETLINK=y + +# +# Device Drivers +# +CONFIG_HAVE_EISA=y +# CONFIG_EISA is not set +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_PCIEAER=y +CONFIG_PCIEAER_INJECT=m +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +CONFIG_PCIE_PME=y +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +CONFIG_PCI_REALLOC_ENABLE_AUTO=y +CONFIG_PCI_STUB=m +# CONFIG_PCI_PF_STUB is not set +CONFIG_XEN_PCIDEV_FRONTEND=m +CONFIG_PCI_ATS=y +CONFIG_PCI_LOCKLESS_CONFIG=y +CONFIG_PCI_IOV=y +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +# CONFIG_PCI_P2PDMA is not set +CONFIG_PCI_LABEL=y +CONFIG_PCI_HYPERV=m +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# PCI controller drivers +# +CONFIG_VMD=m +CONFIG_PCI_HYPERV_INTERFACE=m + +# +# DesignWare PCI Core Support +# +CONFIG_PCIE_DW=y +CONFIG_PCIE_DW_HOST=y +# CONFIG_PCIE_DW_PLAT_HOST is not set +CONFIG_PCI_MESON=y +# end of DesignWare PCI Core Support + +# +# Mobiveil PCIe Core Support +# +# end of Mobiveil PCIe Core Support + +# +# Cadence PCIe controllers support +# +# end of Cadence PCIe controllers support +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +CONFIG_PCI_SW_SWITCHTEC=m +# end of PCI switch controller drivers + +# CONFIG_CXL_BUS is not set +CONFIG_PCCARD=m +# CONFIG_PCMCIA is not set +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=m +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_RAPIDIO=m +CONFIG_RAPIDIO_TSI721=m +CONFIG_RAPIDIO_DISC_TIMEOUT=30 +CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS=y +CONFIG_RAPIDIO_DMA_ENGINE=y +CONFIG_RAPIDIO_DEBUG=y +CONFIG_RAPIDIO_ENUM_BASIC=m +CONFIG_RAPIDIO_CHMAN=m +CONFIG_RAPIDIO_MPORT_CDEV=m + +# +# RapidIO Switch drivers +# +CONFIG_RAPIDIO_TSI57X=m +CONFIG_RAPIDIO_CPS_XX=m +CONFIG_RAPIDIO_TSI568=m +CONFIG_RAPIDIO_CPS_GEN2=m +CONFIG_RAPIDIO_RXS_GEN3=m +# end of RapidIO Switch drivers + +# +# Generic Driver Options +# +CONFIG_AUXILIARY_BUS=y +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_EXTRA_FIRMWARE="" +CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set +# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_CACHE=y +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +CONFIG_HMEM_REPORTING=y +CONFIG_TEST_ASYNC_DRIVER_PROBE=m +CONFIG_SYS_HYPERVISOR=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_SPMI=m +CONFIG_REGMAP_W1=m +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_REGMAP_SOUNDWIRE=m +CONFIG_REGMAP_SOUNDWIRE_MBQ=m +CONFIG_REGMAP_I3C=m +CONFIG_REGMAP_SPI_AVMM=m +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +# end of Generic Driver Options + +# +# Bus devices +# +CONFIG_MHI_BUS=m +# CONFIG_MHI_BUS_DEBUG is not set +# CONFIG_MHI_BUS_PCI_GENERIC is not set +# end of Bus devices + +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +CONFIG_EDD=m +# CONFIG_EDD_OFF is not set +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_DMIID=y +CONFIG_DMI_SYSFS=m +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m +CONFIG_FW_CFG_SYSFS=m +# CONFIG_FW_CFG_SYSFS_CMDLINE is not set +CONFIG_SYSFB=y +# CONFIG_SYSFB_SIMPLEFB is not set +CONFIG_CS_DSP=m +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +# CONFIG_EFI_VARS is not set +CONFIG_EFI_ESRT=y +CONFIG_EFI_VARS_PSTORE=y +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_SOFT_RESERVE=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y +CONFIG_EFI_BOOTLOADER_CONTROL=m +CONFIG_EFI_CAPSULE_LOADER=m +CONFIG_EFI_TEST=m +CONFIG_APPLE_PROPERTIES=y +CONFIG_RESET_ATTACK_MITIGATION=y +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_EFI_EMBEDDED_FIRMWARE=y +CONFIG_UEFI_CPER=y +CONFIG_UEFI_CPER_X86=y +CONFIG_EFI_DEV_PATH_PARSER=y +CONFIG_EFI_EARLYCON=y +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +CONFIG_GNSS=m +CONFIG_GNSS_SERIAL=m +CONFIG_GNSS_MTK_SERIAL=m +CONFIG_GNSS_SIRF_SERIAL=m +CONFIG_GNSS_UBX_SERIAL=m +CONFIG_MTD=m +# CONFIG_MTD_TESTS is not set + +# +# Partition parsers +# +CONFIG_MTD_AR7_PARTS=m +CONFIG_MTD_CMDLINE_PARTS=m +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# end of Partition parsers + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=m +CONFIG_MTD_BLOCK=m +# CONFIG_MTD_BLOCK_RO is not set + +# +# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. +# +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_PSTORE is not set +CONFIG_MTD_SWAP=m +# CONFIG_MTD_PARTITIONED_MASTER is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# end of RAM/ROM/Flash chip drivers + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_PLATRAM is not set +# end of Mapping drivers for chip access + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_MCHP23K256 is not set +CONFIG_MTD_MCHP48L640=m +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SLRAM is not set +CONFIG_MTD_PHRAM=m +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOCG3=m +CONFIG_BCH_CONST_M=14 +CONFIG_BCH_CONST_T=4 +# end of Self-contained MTD device drivers + +# +# NAND +# +CONFIG_MTD_NAND_CORE=m +# CONFIG_MTD_ONENAND is not set +CONFIG_MTD_RAW_NAND=m + +# +# Raw/parallel NAND flash controllers +# +CONFIG_MTD_NAND_DENALI=m +CONFIG_MTD_NAND_DENALI_PCI=m +CONFIG_MTD_NAND_CAFE=m +CONFIG_MTD_NAND_MXIC=m +CONFIG_MTD_NAND_GPIO=m +CONFIG_MTD_NAND_PLATFORM=m +CONFIG_MTD_NAND_ARASAN=m + +# +# Misc +# +CONFIG_MTD_SM_COMMON=m +CONFIG_MTD_NAND_NANDSIM=m +CONFIG_MTD_NAND_RICOH=m +CONFIG_MTD_NAND_DISKONCHIP=m +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED=y +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0x0 +CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH=y +CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y +CONFIG_MTD_SPI_NAND=m + +# +# ECC engine support +# +CONFIG_MTD_NAND_ECC=y +CONFIG_MTD_NAND_ECC_SW_HAMMING=y +# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set +CONFIG_MTD_NAND_ECC_SW_BCH=y +# end of ECC engine support +# end of NAND + +# +# LPDDR & LPDDR2 PCM memory drivers +# +# CONFIG_MTD_LPDDR is not set +# end of LPDDR & LPDDR2 PCM memory drivers + +# CONFIG_MTD_SPI_NOR is not set +# CONFIG_MTD_UBI is not set +# CONFIG_MTD_HYPERBUS is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +CONFIG_PARPORT_PC_SUPERIO=y +CONFIG_PARPORT_AX88796=m +CONFIG_PARPORT_1284=y +CONFIG_PARPORT_NOT_PC=y +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +CONFIG_BLK_DEV_NULL_BLK=m +CONFIG_BLK_DEV_FD=m +CONFIG_CDROM=m +# CONFIG_PARIDE is not set +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m +CONFIG_ZRAM=m +CONFIG_ZRAM_DEF_COMP_LZORLE=y +# CONFIG_ZRAM_DEF_COMP_ZSTD is not set +# CONFIG_ZRAM_DEF_COMP_LZ4 is not set +# CONFIG_ZRAM_DEF_COMP_LZO is not set +# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set +# CONFIG_ZRAM_DEF_COMP_842 is not set +CONFIG_ZRAM_DEF_COMP="lzo-rle" +CONFIG_ZRAM_WRITEBACK=y +# CONFIG_ZRAM_MEMORY_TRACKING is not set +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_VIRTIO_BLK=m +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_RSXX=m +CONFIG_BLK_DEV_RNBD=y +CONFIG_BLK_DEV_RNBD_CLIENT=m +CONFIG_BLK_DEV_RNBD_SERVER=m + +# +# NVME Support +# +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_HWMON=y +CONFIG_NVME_FABRICS=m +CONFIG_NVME_RDMA=m +CONFIG_NVME_FC=m +CONFIG_NVME_TCP=m +CONFIG_NVME_TARGET=m +CONFIG_NVME_TARGET_PASSTHRU=y +CONFIG_NVME_TARGET_LOOP=m +CONFIG_NVME_TARGET_RDMA=m +CONFIG_NVME_TARGET_FC=m +CONFIG_NVME_TARGET_FCLOOP=m +CONFIG_NVME_TARGET_TCP=m +# end of NVME Support + +# +# Misc devices +# +CONFIG_SENSORS_LIS3LV02D=m +CONFIG_AD525X_DPOT=m +CONFIG_AD525X_DPOT_I2C=m +CONFIG_AD525X_DPOT_SPI=m +CONFIG_DUMMY_IRQ=m +# CONFIG_IBM_ASM is not set +CONFIG_PHANTOM=m +CONFIG_TIFM_CORE=m +CONFIG_TIFM_7XX1=m +CONFIG_ICS932S401=m +CONFIG_ENCLOSURE_SERVICES=m +CONFIG_HP_ILO=m +CONFIG_APDS9802ALS=m +CONFIG_ISL29003=m +CONFIG_ISL29020=m +CONFIG_SENSORS_TSL2550=m +CONFIG_SENSORS_BH1770=m +CONFIG_SENSORS_APDS990X=m +CONFIG_HMC6352=m +CONFIG_DS1682=m +CONFIG_VMWARE_BALLOON=m +CONFIG_LATTICE_ECP3_CONFIG=m +CONFIG_SRAM=y +CONFIG_DW_XDATA_PCIE=m +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +CONFIG_MISC_RTSX=m +CONFIG_C2PORT=m +CONFIG_C2PORT_DURAMAR_2150=m + +# +# EEPROM support +# +CONFIG_EEPROM_AT24=m +CONFIG_EEPROM_AT25=m +CONFIG_EEPROM_LEGACY=m +CONFIG_EEPROM_MAX6875=m +CONFIG_EEPROM_93CX6=m +CONFIG_EEPROM_93XX46=m +CONFIG_EEPROM_IDT_89HPESX=m +CONFIG_EEPROM_EE1004=m +# end of EEPROM support + +CONFIG_CB710_CORE=m +# CONFIG_CB710_DEBUG is not set +CONFIG_CB710_DEBUG_ASSUMPTIONS=y + +# +# Texas Instruments shared transport line discipline +# +CONFIG_TI_ST=m +# end of Texas Instruments shared transport line discipline + +CONFIG_SENSORS_LIS3_I2C=m +CONFIG_ALTERA_STAPL=m +CONFIG_INTEL_MEI=m +CONFIG_INTEL_MEI_ME=m +CONFIG_INTEL_MEI_TXE=m +CONFIG_INTEL_MEI_HDCP=m +CONFIG_INTEL_MEI_PXP=m +CONFIG_VMWARE_VMCI=m +CONFIG_GENWQE=m +CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0 +CONFIG_ECHO=m +# CONFIG_BCM_VK is not set +CONFIG_MISC_ALCOR_PCI=m +CONFIG_MISC_RTSX_PCI=m +CONFIG_MISC_RTSX_USB=m +CONFIG_HABANA_AI=m +CONFIG_UACCE=m +CONFIG_PVPANIC=y +CONFIG_PVPANIC_MMIO=m +CONFIG_PVPANIC_PCI=m +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=m +CONFIG_RAID_ATTRS=m +CONFIG_SCSI_COMMON=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_BLK_DEV_SR=m +CONFIG_CHR_DEV_SG=m +CONFIG_BLK_DEV_BSG=y +CONFIG_CHR_DEV_SCH=m +CONFIG_SCSI_ENCLOSURE=m +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SRP_ATTRS=m +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m +CONFIG_SCSI_CXGB3_ISCSI=m +CONFIG_SCSI_CXGB4_ISCSI=m +CONFIG_SCSI_BNX2_ISCSI=m +CONFIG_SCSI_BNX2X_FCOE=m +CONFIG_BE2ISCSI=m +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_HPSA=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_3W_SAS=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_DEBUG_ENABLE is not set +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +CONFIG_SCSI_MVSAS=m +# CONFIG_SCSI_MVSAS_DEBUG is not set +# CONFIG_SCSI_MVSAS_TASKLET is not set +CONFIG_SCSI_MVUMI=m +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_ARCMSR=m +CONFIG_SCSI_ESAS2R=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT3SAS=m +CONFIG_SCSI_MPT2SAS_MAX_SGE=128 +CONFIG_SCSI_MPT3SAS_MAX_SGE=128 +CONFIG_SCSI_MPT2SAS=m +CONFIG_SCSI_MPI3MR=m +CONFIG_SCSI_SMARTPQI=m +CONFIG_SCSI_UFSHCD=m +CONFIG_SCSI_UFSHCD_PCI=m +CONFIG_SCSI_UFS_DWC_TC_PCI=m +CONFIG_SCSI_UFSHCD_PLATFORM=m +CONFIG_SCSI_UFS_CDNS_PLATFORM=m +CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m +CONFIG_SCSI_UFS_BSG=y +CONFIG_SCSI_UFS_CRYPTO=y +CONFIG_SCSI_UFS_HPB=y +CONFIG_SCSI_UFS_HWMON=y +CONFIG_SCSI_HPTIOP=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_FLASHPOINT is not set +CONFIG_SCSI_MYRB=m +CONFIG_SCSI_MYRS=m +CONFIG_VMWARE_PVSCSI=m +CONFIG_XEN_SCSI_FRONTEND=m +CONFIG_HYPERV_STORAGE=m +CONFIG_LIBFC=m +CONFIG_LIBFCOE=m +CONFIG_FCOE=m +CONFIG_FCOE_FNIC=m +CONFIG_SCSI_SNIC=m +# CONFIG_SCSI_SNIC_DEBUG_FS is not set +CONFIG_SCSI_DMX3191D=m +# CONFIG_SCSI_FDOMAIN_PCI is not set +CONFIG_SCSI_ISCI=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INITIO=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_STEX=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +CONFIG_SCSI_SYM53C8XX_MMIO=y +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_TCM_QLA2XXX=m +# CONFIG_TCM_QLA2XXX_DEBUG is not set +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_QEDI=m +CONFIG_QEDF=m +CONFIG_SCSI_LPFC=m +# CONFIG_SCSI_LPFC_DEBUG_FS is not set +CONFIG_SCSI_EFCT=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_AM53C974=m +CONFIG_SCSI_WD719X=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_PMCRAID=m +CONFIG_SCSI_PM8001=m +CONFIG_SCSI_BFA_FC=m +CONFIG_SCSI_VIRTIO=m +CONFIG_SCSI_CHELSIO_FCOE=m +CONFIG_SCSI_DH=y +CONFIG_SCSI_DH_RDAC=m +CONFIG_SCSI_DH_HP_SW=m +CONFIG_SCSI_DH_EMC=m +CONFIG_SCSI_DH_ALUA=m +# end of SCSI device support + +CONFIG_ATA=m +CONFIG_SATA_HOST=y +CONFIG_PATA_TIMINGS=y +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y +CONFIG_ATA_ACPI=y +CONFIG_SATA_ZPODD=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=m +CONFIG_SATA_MOBILE_LPM_POLICY=3 +CONFIG_SATA_AHCI_PLATFORM=m +CONFIG_SATA_INIC162X=m +CONFIG_SATA_ACARD_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_SX4=m +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +CONFIG_ATA_PIIX=m +CONFIG_SATA_DWC=m +# CONFIG_SATA_DWC_OLD_DMA is not set +# CONFIG_SATA_DWC_DEBUG is not set +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_SVW=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m + +# +# PATA SFF controllers with BMDMA +# +CONFIG_PATA_ALI=m +CONFIG_PATA_AMD=m +CONFIG_PATA_ARTOP=m +CONFIG_PATA_ATIIXP=m +CONFIG_PATA_ATP867X=m +CONFIG_PATA_CMD64X=m +CONFIG_PATA_CYPRESS=m +CONFIG_PATA_EFAR=m +CONFIG_PATA_HPT366=m +CONFIG_PATA_HPT37X=m +CONFIG_PATA_HPT3X2N=m +CONFIG_PATA_HPT3X3=m +CONFIG_PATA_HPT3X3_DMA=y +CONFIG_PATA_IT8213=m +CONFIG_PATA_IT821X=m +CONFIG_PATA_JMICRON=m +CONFIG_PATA_MARVELL=m +CONFIG_PATA_NETCELL=m +CONFIG_PATA_NINJA32=m +CONFIG_PATA_NS87415=m +CONFIG_PATA_OLDPIIX=m +CONFIG_PATA_OPTIDMA=m +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_PDC_OLD=m +CONFIG_PATA_RADISYS=m +CONFIG_PATA_RDC=m +CONFIG_PATA_SCH=m +CONFIG_PATA_SERVERWORKS=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +CONFIG_PATA_TOSHIBA=m +CONFIG_PATA_TRIFLEX=m +CONFIG_PATA_VIA=m +CONFIG_PATA_WINBOND=m + +# +# PIO-only SFF controllers +# +CONFIG_PATA_CMD640_PCI=m +CONFIG_PATA_MPIIX=m +CONFIG_PATA_NS87410=m +CONFIG_PATA_OPTI=m +CONFIG_PATA_PLATFORM=m +CONFIG_PATA_RZ1000=m + +# +# Generic fallback / legacy drivers +# +CONFIG_PATA_ACPI=m +CONFIG_ATA_GENERIC=m +# CONFIG_PATA_LEGACY is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +CONFIG_MD_CLUSTER=m +CONFIG_BCACHE=m +# CONFIG_BCACHE_DEBUG is not set +# CONFIG_BCACHE_CLOSURES_DEBUG is not set +# CONFIG_BCACHE_ASYNC_REGISTRATION is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m +CONFIG_DM_CACHE_SMQ=m +# CONFIG_DM_WRITECACHE is not set +CONFIG_DM_EBS=m +CONFIG_DM_ERA=m +# CONFIG_DM_CLONE is not set +CONFIG_DM_MIRROR=m +CONFIG_DM_LOG_USERSPACE=m +CONFIG_DM_RAID=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_QL=m +CONFIG_DM_MULTIPATH_ST=m +CONFIG_DM_MULTIPATH_HST=m +# CONFIG_DM_MULTIPATH_IOA is not set +CONFIG_DM_DELAY=m +CONFIG_DM_DUST=m +CONFIG_DM_UEVENT=y +CONFIG_DM_FLAKEY=m +CONFIG_DM_VERITY=m +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +# CONFIG_DM_VERITY_FEC is not set +CONFIG_DM_SWITCH=m +CONFIG_DM_LOG_WRITES=m +CONFIG_DM_INTEGRITY=m +CONFIG_DM_ZONED=m +CONFIG_DM_AUDIT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m +CONFIG_TCM_USER2=m +CONFIG_LOOPBACK_TARGET=m +CONFIG_TCM_FC=m +CONFIG_ISCSI_TARGET=m +CONFIG_ISCSI_TARGET_CXGB4=m +CONFIG_SBP_TARGET=m +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set +# CONFIG_FUSION_LOGGING is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_SBP2=m +CONFIG_FIREWIRE_NET=m +CONFIG_FIREWIRE_NOSY=m +# end of IEEE 1394 (FireWire) support + +CONFIG_MACINTOSH_DRIVERS=y +CONFIG_MAC_EMUMOUSEBTN=m +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +CONFIG_BONDING=m +CONFIG_DUMMY=m +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set +CONFIG_EQUALIZER=m +CONFIG_NET_FC=y +CONFIG_IFB=m +CONFIG_NET_TEAM=m +CONFIG_NET_TEAM_MODE_BROADCAST=m +CONFIG_NET_TEAM_MODE_ROUNDROBIN=m +CONFIG_NET_TEAM_MODE_RANDOM=m +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m +CONFIG_NET_TEAM_MODE_LOADBALANCE=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=m +CONFIG_IPVTAP=m +CONFIG_VXLAN=m +CONFIG_GENEVE=m +CONFIG_BAREUDP=m +CONFIG_GTP=m +CONFIG_AMT=m +CONFIG_MACSEC=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_NETPOLL=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_NTB_NETDEV=m +CONFIG_RIONET=m +CONFIG_RIONET_TX_SIZE=128 +CONFIG_RIONET_RX_SIZE=128 +CONFIG_TUN=m +CONFIG_TAP=m +CONFIG_TUN_VNET_CROSS_LE=y +CONFIG_VETH=m +CONFIG_VIRTIO_NET=m +CONFIG_NLMON=m +CONFIG_NET_VRF=m +# CONFIG_VSOCKMON is not set +# CONFIG_MHI_NET is not set +CONFIG_SUNGEM_PHY=m +# CONFIG_ARCNET is not set +CONFIG_ATM_DRIVERS=y +# CONFIG_ATM_DUMMY is not set +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E=m +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_ATM_SOLOS=m +# CONFIG_CAIF_DRIVERS is not set + +# +# Distributed Switch Architecture drivers +# +CONFIG_B53=m +CONFIG_B53_SPI_DRIVER=m +CONFIG_B53_MDIO_DRIVER=m +CONFIG_B53_MMAP_DRIVER=m +CONFIG_B53_SRAB_DRIVER=m +CONFIG_B53_SERDES=m +# CONFIG_NET_DSA_BCM_SF2 is not set +# CONFIG_NET_DSA_LOOP is not set +# CONFIG_NET_DSA_HIRSCHMANN_HELLCREEK is not set +CONFIG_NET_DSA_LANTIQ_GSWIP=m +# CONFIG_NET_DSA_MT7530 is not set +CONFIG_NET_DSA_MV88E6060=m +CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=m +CONFIG_NET_DSA_MICROCHIP_KSZ9477=m +CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=m +CONFIG_NET_DSA_MICROCHIP_KSZ9477_SPI=m +CONFIG_NET_DSA_MICROCHIP_KSZ8795=m +CONFIG_NET_DSA_MICROCHIP_KSZ8795_SPI=m +CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI=m +CONFIG_NET_DSA_MV88E6XXX=m +CONFIG_NET_DSA_MV88E6XXX_PTP=y +CONFIG_NET_DSA_MSCC_SEVILLE=m +CONFIG_NET_DSA_AR9331=m +CONFIG_NET_DSA_SJA1105=m +# CONFIG_NET_DSA_SJA1105_PTP is not set +# CONFIG_NET_DSA_XRS700X_I2C is not set +# CONFIG_NET_DSA_XRS700X_MDIO is not set +CONFIG_NET_DSA_QCA8K=m +# CONFIG_NET_DSA_REALTEK_SMI is not set +# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set +# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set +CONFIG_NET_DSA_VITESSE_VSC73XX=m +CONFIG_NET_DSA_VITESSE_VSC73XX_SPI=m +CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM=m +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +CONFIG_MDIO=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_NET_VENDOR_ADAPTEC=y +CONFIG_ADAPTEC_STARFIRE=m +CONFIG_NET_VENDOR_AGERE=y +CONFIG_ET131X=m +CONFIG_NET_VENDOR_ALACRITECH=y +CONFIG_SLICOSS=m +CONFIG_NET_VENDOR_ALTEON=y +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_ALTERA_TSE=m +CONFIG_NET_VENDOR_AMAZON=y +CONFIG_ENA_ETHERNET=m +CONFIG_NET_VENDOR_AMD=y +CONFIG_AMD8111_ETH=m +CONFIG_PCNET32=y +CONFIG_AMD_XGBE=m +CONFIG_AMD_XGBE_DCB=y +CONFIG_AMD_XGBE_HAVE_ECC=y +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_AQTION=m +CONFIG_NET_VENDOR_ARC=y +CONFIG_NET_VENDOR_ASIX=y +CONFIG_SPI_AX88796C=m +# CONFIG_SPI_AX88796C_COMPRESSION is not set +CONFIG_NET_VENDOR_ATHEROS=y +CONFIG_ATL2=m +CONFIG_ATL1=m +CONFIG_ATL1E=m +CONFIG_ATL1C=m +CONFIG_ALX=m +CONFIG_NET_VENDOR_BROADCOM=y +CONFIG_B44=m +CONFIG_B44_PCI_AUTOSELECT=y +CONFIG_B44_PCICORE_AUTOSELECT=y +CONFIG_B44_PCI=y +CONFIG_BCMGENET=m +CONFIG_BNX2=m +CONFIG_CNIC=m +CONFIG_TIGON3=m +CONFIG_TIGON3_HWMON=y +CONFIG_BNX2X=m +CONFIG_BNX2X_SRIOV=y +CONFIG_SYSTEMPORT=m +CONFIG_BNXT=m +CONFIG_BNXT_SRIOV=y +CONFIG_BNXT_FLOWER_OFFLOAD=y +CONFIG_BNXT_DCB=y +CONFIG_BNXT_HWMON=y +CONFIG_NET_VENDOR_BROCADE=y +CONFIG_BNA=m +CONFIG_NET_VENDOR_CADENCE=y +CONFIG_MACB=m +CONFIG_MACB_USE_HWSTAMP=y +CONFIG_MACB_PCI=m +CONFIG_NET_VENDOR_CAVIUM=y +CONFIG_THUNDER_NIC_PF=m +CONFIG_THUNDER_NIC_VF=m +CONFIG_THUNDER_NIC_BGX=m +CONFIG_THUNDER_NIC_RGX=m +CONFIG_CAVIUM_PTP=m +CONFIG_LIQUIDIO=m +CONFIG_LIQUIDIO_VF=m +CONFIG_NET_VENDOR_CHELSIO=y +CONFIG_CHELSIO_T1=m +CONFIG_CHELSIO_T1_1G=y +CONFIG_CHELSIO_T3=m +CONFIG_CHELSIO_T4=m +# CONFIG_CHELSIO_T4_DCB is not set +CONFIG_CHELSIO_T4VF=m +CONFIG_CHELSIO_LIB=m +CONFIG_CHELSIO_INLINE_CRYPTO=y +# CONFIG_CHELSIO_IPSEC_INLINE is not set +CONFIG_CHELSIO_TLS_DEVICE=m +CONFIG_NET_VENDOR_CISCO=y +CONFIG_ENIC=m +CONFIG_NET_VENDOR_CORTINA=y +CONFIG_CX_ECAT=m +CONFIG_DNET=m +CONFIG_NET_VENDOR_DEC=y +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_DE2104X_DSL=0 +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +# CONFIG_PCMCIA_XIRCOM is not set +CONFIG_NET_VENDOR_DLINK=y +CONFIG_DL2K=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_NET_VENDOR_EMULEX=y +CONFIG_BE2NET=m +CONFIG_BE2NET_HWMON=y +CONFIG_BE2NET_BE2=y +CONFIG_BE2NET_BE3=y +CONFIG_BE2NET_LANCER=y +CONFIG_BE2NET_SKYHAWK=y +CONFIG_NET_VENDOR_EZCHIP=y +CONFIG_NET_VENDOR_GOOGLE=y +# CONFIG_GVE is not set +CONFIG_NET_VENDOR_HUAWEI=y +CONFIG_HINIC=m +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_INTEL=y +CONFIG_E100=m +CONFIG_E1000=m +CONFIG_E1000E=y +CONFIG_E1000E_HWTS=y +CONFIG_IGB=m +CONFIG_IGB_HWMON=y +CONFIG_IGB_DCA=y +CONFIG_IGBVF=m +CONFIG_IXGB=m +CONFIG_IXGBE=m +CONFIG_IXGBE_HWMON=y +CONFIG_IXGBE_DCA=y +# CONFIG_IXGBE_DCB is not set +CONFIG_IXGBE_IPSEC=y +CONFIG_IXGBEVF=m +CONFIG_IXGBEVF_IPSEC=y +CONFIG_I40E=m +CONFIG_I40E_DCB=y +CONFIG_IAVF=m +CONFIG_I40EVF=m +CONFIG_ICE=m +CONFIG_ICE_SWITCHDEV=y +CONFIG_FM10K=m +CONFIG_IGC=m +CONFIG_NET_VENDOR_MICROSOFT=y +CONFIG_MICROSOFT_MANA=m +CONFIG_JME=m +CONFIG_NET_VENDOR_LITEX=y +CONFIG_NET_VENDOR_MARVELL=y +CONFIG_MVMDIO=m +CONFIG_SKGE=m +# CONFIG_SKGE_DEBUG is not set +# CONFIG_SKGE_GENESIS is not set +CONFIG_SKY2=m +# CONFIG_SKY2_DEBUG is not set +CONFIG_PRESTERA=m +CONFIG_PRESTERA_PCI=m +CONFIG_NET_VENDOR_MELLANOX=y +CONFIG_MLX4_EN=m +CONFIG_MLX4_EN_DCB=y +CONFIG_MLX4_CORE=m +CONFIG_MLX4_DEBUG=y +CONFIG_MLX4_CORE_GEN2=y +CONFIG_MLX5_CORE=m +CONFIG_MLX5_ACCEL=y +# CONFIG_MLX5_FPGA is not set +CONFIG_MLX5_CORE_EN=y +CONFIG_MLX5_EN_ARFS=y +CONFIG_MLX5_EN_RXNFC=y +CONFIG_MLX5_MPFS=y +CONFIG_MLX5_ESWITCH=y +CONFIG_MLX5_BRIDGE=y +CONFIG_MLX5_CLS_ACT=y +CONFIG_MLX5_TC_SAMPLE=y +CONFIG_MLX5_CORE_EN_DCB=y +# CONFIG_MLX5_CORE_IPOIB is not set +CONFIG_MLX5_IPSEC=y +CONFIG_MLX5_EN_IPSEC=y +# CONFIG_MLX5_TLS is not set +CONFIG_MLX5_SW_STEERING=y +# CONFIG_MLX5_SF is not set +CONFIG_MLXSW_CORE=m +CONFIG_MLXSW_CORE_HWMON=y +CONFIG_MLXSW_CORE_THERMAL=y +CONFIG_MLXSW_PCI=m +CONFIG_MLXSW_I2C=m +CONFIG_MLXSW_SPECTRUM=m +CONFIG_MLXSW_SPECTRUM_DCB=y +CONFIG_MLXSW_MINIMAL=m +CONFIG_MLXFW=m +CONFIG_NET_VENDOR_MICREL=y +CONFIG_KS8842=m +CONFIG_KS8851=m +CONFIG_KS8851_MLL=m +CONFIG_KSZ884X_PCI=m +CONFIG_NET_VENDOR_MICROCHIP=y +CONFIG_ENC28J60=m +# CONFIG_ENC28J60_WRITEVERIFY is not set +CONFIG_ENCX24J600=m +CONFIG_LAN743X=m +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_MSCC_OCELOT_SWITCH_LIB=m +CONFIG_NET_VENDOR_MYRI=y +CONFIG_MYRI10GE=m +CONFIG_MYRI10GE_DCA=y +CONFIG_FEALNX=m +CONFIG_NET_VENDOR_NATSEMI=y +CONFIG_NATSEMI=m +CONFIG_NS83820=m +CONFIG_NET_VENDOR_NETERION=y +CONFIG_S2IO=m +CONFIG_VXGE=m +# CONFIG_VXGE_DEBUG_TRACE_ALL is not set +CONFIG_NET_VENDOR_NETRONOME=y +CONFIG_NFP=m +# CONFIG_NFP_APP_FLOWER is not set +CONFIG_NFP_APP_ABM_NIC=y +# CONFIG_NFP_DEBUG is not set +# CONFIG_NET_VENDOR_NI is not set +CONFIG_NET_VENDOR_8390=y +CONFIG_NE2K_PCI=m +CONFIG_NET_VENDOR_NVIDIA=y +CONFIG_FORCEDETH=m +CONFIG_NET_VENDOR_OKI=y +CONFIG_ETHOC=m +CONFIG_NET_VENDOR_PACKET_ENGINES=y +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_IONIC is not set +CONFIG_NET_VENDOR_QLOGIC=y +CONFIG_QLA3XXX=m +CONFIG_QLCNIC=m +CONFIG_QLCNIC_SRIOV=y +CONFIG_QLCNIC_DCB=y +CONFIG_QLCNIC_HWMON=y +CONFIG_NETXEN_NIC=m +CONFIG_QED=m +CONFIG_QED_LL2=y +CONFIG_QED_SRIOV=y +CONFIG_QEDE=m +CONFIG_QED_RDMA=y +CONFIG_QED_ISCSI=y +CONFIG_QED_FCOE=y +CONFIG_QED_OOO=y +CONFIG_NET_VENDOR_QUALCOMM=y +CONFIG_QCOM_EMAC=m +CONFIG_RMNET=m +CONFIG_NET_VENDOR_RDC=y +CONFIG_R6040=m +CONFIG_NET_VENDOR_REALTEK=y +CONFIG_ATP=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_R8169=m +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_ROCKER=m +CONFIG_NET_VENDOR_SAMSUNG=y +CONFIG_SXGBE_ETH=m +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SOLARFLARE=y +CONFIG_SFC=m +CONFIG_SFC_MTD=y +CONFIG_SFC_MCDI_MON=y +CONFIG_SFC_SRIOV=y +CONFIG_SFC_MCDI_LOGGING=y +CONFIG_SFC_FALCON=m +CONFIG_SFC_FALCON_MTD=y +CONFIG_NET_VENDOR_SILAN=y +CONFIG_SC92031=m +CONFIG_NET_VENDOR_SIS=y +CONFIG_SIS900=m +CONFIG_SIS190=m +CONFIG_NET_VENDOR_SMSC=y +CONFIG_EPIC100=m +CONFIG_SMSC911X=m +CONFIG_SMSC9420=m +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=m +# CONFIG_STMMAC_SELFTESTS is not set +CONFIG_STMMAC_PLATFORM=m +CONFIG_DWMAC_GENERIC=m +CONFIG_DWMAC_INTEL=m +CONFIG_DWMAC_LOONGSON=m +CONFIG_STMMAC_PCI=m +CONFIG_NET_VENDOR_SUN=y +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NIU=m +CONFIG_NET_VENDOR_SYNOPSYS=y +# CONFIG_DWC_XLGMAC is not set +CONFIG_NET_VENDOR_TEHUTI=y +CONFIG_TEHUTI=m +CONFIG_NET_VENDOR_TI=y +# CONFIG_TI_CPSW_PHY_SEL is not set +CONFIG_TLAN=m +CONFIG_NET_VENDOR_VIA=y +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_VENDOR_WIZNET=y +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5300=m +# CONFIG_WIZNET_BUS_DIRECT is not set +# CONFIG_WIZNET_BUS_INDIRECT is not set +CONFIG_WIZNET_BUS_ANY=y +CONFIG_WIZNET_W5100_SPI=m +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_XILINX_AXI_EMAC is not set +CONFIG_XILINX_LL_TEMAC=m +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_NET_SB1000=m +CONFIG_PHYLINK=m +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +CONFIG_LED_TRIGGER_PHY=y +CONFIG_FIXED_PHY=y +# CONFIG_SFP is not set + +# +# MII PHY device drivers +# +CONFIG_AMD_PHY=m +# CONFIG_ADIN_PHY is not set +CONFIG_AQUANTIA_PHY=m +CONFIG_AX88796B_PHY=m +CONFIG_BROADCOM_PHY=m +CONFIG_BCM54140_PHY=m +CONFIG_BCM7XXX_PHY=m +CONFIG_BCM84881_PHY=y +CONFIG_BCM87XX_PHY=m +CONFIG_BCM_NET_PHYLIB=m +CONFIG_CICADA_PHY=m +CONFIG_CORTINA_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_ICPLUS_PHY=m +CONFIG_LXT_PHY=m +CONFIG_INTEL_XWAY_PHY=m +CONFIG_LSI_ET1011C_PHY=m +CONFIG_MARVELL_PHY=m +CONFIG_MARVELL_10G_PHY=m +CONFIG_MARVELL_88X2222_PHY=m +CONFIG_MAXLINEAR_GPHY=m +CONFIG_MEDIATEK_GE_PHY=m +CONFIG_MICREL_PHY=m +CONFIG_MICROCHIP_PHY=m +# CONFIG_MICROCHIP_T1_PHY is not set +CONFIG_MICROSEMI_PHY=m +CONFIG_MOTORCOMM_PHY=m +CONFIG_NATIONAL_PHY=m +CONFIG_NXP_C45_TJA11XX_PHY=m +# CONFIG_NXP_TJA11XX_PHY is not set +CONFIG_AT803X_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_REALTEK_PHY=m +CONFIG_RENESAS_PHY=m +CONFIG_ROCKCHIP_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_STE10XP=m +CONFIG_TERANETICS_PHY=m +CONFIG_DP83822_PHY=m +# CONFIG_DP83TC811_PHY is not set +CONFIG_DP83848_PHY=m +CONFIG_DP83867_PHY=m +CONFIG_DP83869_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_XILINX_GMII2RGMII=m +CONFIG_MICREL_KS8995MA=m + +# +# MCTP Device Drivers +# +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +CONFIG_FWNODE_MDIO=y +CONFIG_ACPI_MDIO=y +CONFIG_MDIO_DEVRES=y +CONFIG_MDIO_BITBANG=m +CONFIG_MDIO_BCM_UNIMAC=m +CONFIG_MDIO_CAVIUM=m +CONFIG_MDIO_GPIO=m +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +CONFIG_MDIO_THUNDER=m + +# +# MDIO Multiplexers +# + +# +# PCS device drivers +# +CONFIG_PCS_XPCS=m +CONFIG_PCS_LYNX=m +# end of PCS device drivers + +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOATM=m +CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_SLIP=m +CONFIG_SLHC=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set + +# +# Host-side USB support is needed for USB Network Adapter support +# +CONFIG_USB_NET_DRIVERS=m +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_LAN78XX=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_AX88179_178A=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +CONFIG_USB_NET_HUAWEI_CDC_NCM=m +CONFIG_USB_NET_CDC_MBIM=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SR9700=m +CONFIG_USB_NET_SR9800=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET_ENABLE=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_QMI_WWAN=m +CONFIG_USB_HSO=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_CDC_PHONET=m +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m +CONFIG_USB_NET_CH9200=m +CONFIG_USB_NET_AQC111=m +# CONFIG_USB_RTL8153_ECM is not set +CONFIG_WLAN=y +CONFIG_WLAN_VENDOR_ADMTEK=y +CONFIG_ADM8211=m +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +# CONFIG_ATH5K_TRACER is not set +CONFIG_ATH5K_PCI=y +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=m +CONFIG_ATH9K_PCI=y +CONFIG_ATH9K_AHB=y +# CONFIG_ATH9K_DEBUGFS is not set +# CONFIG_ATH9K_DYNACK is not set +CONFIG_ATH9K_WOW=y +CONFIG_ATH9K_RFKILL=y +CONFIG_ATH9K_CHANNEL_CONTEXT=y +CONFIG_ATH9K_PCOEM=y +CONFIG_ATH9K_PCI_NO_EEPROM=m +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set +CONFIG_ATH9K_HWRNG=y +CONFIG_CARL9170=m +CONFIG_CARL9170_LEDS=y +CONFIG_CARL9170_WPC=y +CONFIG_CARL9170_HWRNG=y +CONFIG_ATH6KL=m +CONFIG_ATH6KL_SDIO=m +CONFIG_ATH6KL_USB=m +# CONFIG_ATH6KL_DEBUG is not set +# CONFIG_ATH6KL_TRACING is not set +CONFIG_AR5523=m +CONFIG_WIL6210=m +CONFIG_WIL6210_ISR_COR=y +# CONFIG_WIL6210_TRACING is not set +CONFIG_WIL6210_DEBUGFS=y +CONFIG_ATH10K=m +CONFIG_ATH10K_CE=y +CONFIG_ATH10K_PCI=m +# CONFIG_ATH10K_SDIO is not set +CONFIG_ATH10K_USB=m +# CONFIG_ATH10K_DEBUG is not set +# CONFIG_ATH10K_DEBUGFS is not set +# CONFIG_ATH10K_TRACING is not set +CONFIG_WCN36XX=m +# CONFIG_WCN36XX_DEBUGFS is not set +CONFIG_ATH11K=m +CONFIG_ATH11K_PCI=m +# CONFIG_ATH11K_DEBUG is not set +# CONFIG_ATH11K_TRACING is not set +CONFIG_WLAN_VENDOR_ATMEL=y +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m +CONFIG_AT76C50X_USB=m +CONFIG_WLAN_VENDOR_BROADCOM=y +CONFIG_B43=m +CONFIG_B43_BCMA=y +CONFIG_B43_SSB=y +CONFIG_B43_BUSES_BCMA_AND_SSB=y +# CONFIG_B43_BUSES_BCMA is not set +# CONFIG_B43_BUSES_SSB is not set +CONFIG_B43_PCI_AUTOSELECT=y +CONFIG_B43_PCICORE_AUTOSELECT=y +CONFIG_B43_SDIO=y +CONFIG_B43_BCMA_PIO=y +CONFIG_B43_PIO=y +CONFIG_B43_PHY_G=y +CONFIG_B43_PHY_N=y +CONFIG_B43_PHY_LP=y +CONFIG_B43_PHY_HT=y +CONFIG_B43_LEDS=y +CONFIG_B43_HWRNG=y +# CONFIG_B43_DEBUG is not set +CONFIG_B43LEGACY=m +CONFIG_B43LEGACY_PCI_AUTOSELECT=y +CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y +CONFIG_B43LEGACY_LEDS=y +CONFIG_B43LEGACY_HWRNG=y +# CONFIG_B43LEGACY_DEBUG is not set +CONFIG_B43LEGACY_DMA=y +CONFIG_B43LEGACY_PIO=y +CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y +# CONFIG_B43LEGACY_DMA_MODE is not set +# CONFIG_B43LEGACY_PIO_MODE is not set +CONFIG_BRCMUTIL=m +CONFIG_BRCMSMAC=m +CONFIG_BRCMSMAC_LEDS=y +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_PROTO_MSGBUF=y +CONFIG_BRCMFMAC_SDIO=y +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +CONFIG_WLAN_VENDOR_CISCO=y +CONFIG_AIRO=m +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_LIBIPW=m +# CONFIG_LIBIPW_DEBUG is not set +CONFIG_IWLEGACY=m +CONFIG_IWL4965=m +CONFIG_IWL3945=m + +# +# iwl3945 / iwl4965 Debugging Options +# +# CONFIG_IWLEGACY_DEBUG is not set +# end of iwl3945 / iwl4965 Debugging Options + +CONFIG_IWLWIFI=m +CONFIG_IWLWIFI_LEDS=y +CONFIG_IWLDVM=m +CONFIG_IWLMVM=m +CONFIG_IWLWIFI_OPMODE_MODULAR=y + +# +# Debugging Options +# +# CONFIG_IWLWIFI_DEBUG is not set +# CONFIG_IWLWIFI_DEVICE_TRACING is not set +# end of Debugging Options + +CONFIG_WLAN_VENDOR_INTERSIL=y +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HERMES=m +CONFIG_HERMES_PRISM=y +CONFIG_HERMES_CACHE_FW_ON_INIT=y +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ORINOCO_USB=m +CONFIG_P54_COMMON=m +CONFIG_P54_USB=m +CONFIG_P54_PCI=m +CONFIG_P54_SPI=m +# CONFIG_P54_SPI_DEFAULT_EEPROM is not set +CONFIG_P54_LEDS=y +CONFIG_WLAN_VENDOR_MARVELL=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_SDIO=m +CONFIG_LIBERTAS_SPI=m +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_LIBERTAS_MESH=y +CONFIG_LIBERTAS_THINFIRM=m +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_PCIE=m +CONFIG_MWIFIEX_USB=m +CONFIG_MWL8K=m +CONFIG_WLAN_VENDOR_MEDIATEK=y +CONFIG_MT7601U=m +CONFIG_MT76_CORE=m +CONFIG_MT76_LEDS=y +CONFIG_MT76_USB=m +CONFIG_MT76_SDIO=m +CONFIG_MT76x02_LIB=m +CONFIG_MT76x02_USB=m +CONFIG_MT76_CONNAC_LIB=m +CONFIG_MT76x0_COMMON=m +CONFIG_MT76x0U=m +CONFIG_MT76x0E=m +CONFIG_MT76x2_COMMON=m +CONFIG_MT76x2E=m +CONFIG_MT76x2U=m +CONFIG_MT7603E=m +CONFIG_MT7615_COMMON=m +CONFIG_MT7615E=m +CONFIG_MT7663_USB_SDIO_COMMON=m +CONFIG_MT7663U=m +CONFIG_MT7663S=m +CONFIG_MT7915E=m +CONFIG_MT7921_COMMON=m +CONFIG_MT7921E=m +CONFIG_MT7921S=m +CONFIG_WLAN_VENDOR_MICROCHIP=y +CONFIG_WILC1000=m +CONFIG_WILC1000_SDIO=m +# CONFIG_WILC1000_SPI is not set +# CONFIG_WILC1000_HW_OOB_INTR is not set +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=m +CONFIG_RT2400PCI=m +CONFIG_RT2500PCI=m +CONFIG_RT61PCI=m +CONFIG_RT2800PCI=m +CONFIG_RT2800PCI_RT33XX=y +CONFIG_RT2800PCI_RT35XX=y +CONFIG_RT2800PCI_RT53XX=y +CONFIG_RT2800PCI_RT3290=y +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=m +CONFIG_RT2800_LIB_MMIO=m +CONFIG_RT2X00_LIB_MMIO=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8187_LEDS=y +CONFIG_RTL_CARDS=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8192CU=m +CONFIG_RTLWIFI=m +CONFIG_RTLWIFI_PCI=m +CONFIG_RTLWIFI_USB=m +CONFIG_RTLWIFI_DEBUG=y +CONFIG_RTL8192C_COMMON=m +CONFIG_RTL8723_COMMON=m +CONFIG_RTLBTCOEXIST=m +CONFIG_RTL8XXXU=m +# CONFIG_RTL8XXXU_UNTESTED is not set +CONFIG_RTW88=m +CONFIG_RTW88_CORE=m +CONFIG_RTW88_PCI=m +CONFIG_RTW88_8822B=m +CONFIG_RTW88_8822C=m +CONFIG_RTW88_8723D=m +CONFIG_RTW88_8821C=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822CE=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8821CE=m +# CONFIG_RTW88_DEBUG is not set +# CONFIG_RTW88_DEBUGFS is not set +CONFIG_RTW89=m +CONFIG_RTW89_CORE=m +CONFIG_RTW89_PCI=m +CONFIG_RTW89_8852AE=m +# CONFIG_RTW89_DEBUGMSG is not set +# CONFIG_RTW89_DEBUGFS is not set +CONFIG_WLAN_VENDOR_RSI=y +CONFIG_RSI_91X=m +CONFIG_RSI_DEBUGFS=y +CONFIG_RSI_SDIO=m +CONFIG_RSI_USB=m +CONFIG_RSI_COEX=y +CONFIG_WLAN_VENDOR_ST=y +CONFIG_CW1200=m +CONFIG_CW1200_WLAN_SDIO=m +CONFIG_CW1200_WLAN_SPI=m +CONFIG_WLAN_VENDOR_TI=y +CONFIG_WL1251=m +CONFIG_WL1251_SPI=m +CONFIG_WL1251_SDIO=m +CONFIG_WL12XX=m +CONFIG_WL18XX=m +CONFIG_WLCORE=m +CONFIG_WLCORE_SDIO=m +CONFIG_WILINK_PLATFORM_DATA=y +CONFIG_WLAN_VENDOR_ZYDAS=y +CONFIG_USB_ZD1201=m +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +CONFIG_QTNFMAC=m +CONFIG_QTNFMAC_PCIE=m +# CONFIG_MAC80211_HWSIM is not set +CONFIG_USB_NET_RNDIS_WLAN=m +CONFIG_VIRT_WIFI=m +# CONFIG_WAN is not set +CONFIG_IEEE802154_DRIVERS=m +CONFIG_IEEE802154_FAKELB=m +CONFIG_IEEE802154_AT86RF230=m +# CONFIG_IEEE802154_AT86RF230_DEBUGFS is not set +CONFIG_IEEE802154_MRF24J40=m +# CONFIG_IEEE802154_CC2520 is not set +CONFIG_IEEE802154_ATUSB=m +CONFIG_IEEE802154_ADF7242=m +# CONFIG_IEEE802154_CA8210 is not set +# CONFIG_IEEE802154_MCR20A is not set +CONFIG_IEEE802154_HWSIM=m + +# +# Wireless WAN +# +CONFIG_WWAN=y +CONFIG_WWAN_HWSIM=m +CONFIG_MHI_WWAN_CTRL=m +CONFIG_MHI_WWAN_MBIM=m +CONFIG_RPMSG_WWAN_CTRL=m +CONFIG_IOSM=m +# end of Wireless WAN + +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_NETDEV_BACKEND=m +CONFIG_VMXNET3=m +CONFIG_FUJITSU_ES=m +CONFIG_USB4_NET=m +CONFIG_HYPERV_NET=m +# CONFIG_NETDEVSIM is not set +CONFIG_NET_FAILOVER=m +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=m +CONFIG_INPUT_FF_MEMLESS=m +CONFIG_INPUT_SPARSEKMAP=m +CONFIG_INPUT_MATRIXKMAP=m + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_EVDEV=m +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ADC=m +CONFIG_KEYBOARD_ADP5588=m +CONFIG_KEYBOARD_ADP5589=m +CONFIG_KEYBOARD_APPLESPI=m +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_QT1050=m +CONFIG_KEYBOARD_QT1070=m +CONFIG_KEYBOARD_QT2160=m +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_GPIO is not set +CONFIG_KEYBOARD_GPIO_POLLED=m +CONFIG_KEYBOARD_TCA6416=m +CONFIG_KEYBOARD_TCA8418=m +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +CONFIG_KEYBOARD_LM8333=m +CONFIG_KEYBOARD_MAX7359=m +CONFIG_KEYBOARD_MCS=m +CONFIG_KEYBOARD_MPR121=m +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_KEYBOARD_OPENCORES=m +CONFIG_KEYBOARD_SAMSUNG=m +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_IQS62X is not set +CONFIG_KEYBOARD_TM2_TOUCHKEY=m +# CONFIG_KEYBOARD_XTKBD is not set +CONFIG_KEYBOARD_CROS_EC=m +# CONFIG_KEYBOARD_MTK_PMIC is not set +CONFIG_KEYBOARD_CYPRESS_SF=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_BYD=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +CONFIG_MOUSE_PS2_CYPRESS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_MOUSE_PS2_ELANTECH_SMBUS=y +CONFIG_MOUSE_PS2_SENTELIC=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +CONFIG_MOUSE_PS2_FOCALTECH=y +CONFIG_MOUSE_PS2_VMMOUSE=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_SERIAL=y +CONFIG_MOUSE_APPLETOUCH=m +CONFIG_MOUSE_BCM5974=m +CONFIG_MOUSE_CYAPA=m +CONFIG_MOUSE_ELAN_I2C=m +CONFIG_MOUSE_ELAN_I2C_I2C=y +CONFIG_MOUSE_ELAN_I2C_SMBUS=y +CONFIG_MOUSE_VSXXXAA=m +CONFIG_MOUSE_GPIO=m +CONFIG_MOUSE_SYNAPTICS_I2C=m +CONFIG_MOUSE_SYNAPTICS_USB=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADC=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=m +CONFIG_JOYSTICK_IFORCE_232=m +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDJOY=m +CONFIG_JOYSTICK_ZHENHUA=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_JOYSTICK_AS5011=m +CONFIG_JOYSTICK_JOYDUMP=m +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +CONFIG_JOYSTICK_WALKERA0701=m +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +# CONFIG_JOYSTICK_PXRC is not set +CONFIG_JOYSTICK_QWIIC=m +CONFIG_JOYSTICK_FSIA6B=m +CONFIG_INPUT_TABLET=y +CONFIG_TABLET_USB_ACECAD=m +CONFIG_TABLET_USB_AIPTEK=m +CONFIG_TABLET_USB_HANWANG=m +CONFIG_TABLET_USB_KBTAB=m +CONFIG_TABLET_USB_PEGASUS=m +# CONFIG_TABLET_SERIAL_WACOM4 is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=m +CONFIG_TOUCHSCREEN_AD7877=m +CONFIG_TOUCHSCREEN_AD7879=m +CONFIG_TOUCHSCREEN_AD7879_I2C=m +CONFIG_TOUCHSCREEN_AD7879_SPI=m +CONFIG_TOUCHSCREEN_ADC=m +CONFIG_TOUCHSCREEN_ATMEL_MXT=m +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set +CONFIG_TOUCHSCREEN_AUO_PIXCIR=m +CONFIG_TOUCHSCREEN_BU21013=m +CONFIG_TOUCHSCREEN_BU21029=m +CONFIG_TOUCHSCREEN_CHIPONE_ICN8505=m +CONFIG_TOUCHSCREEN_CY8CTMA140=m +CONFIG_TOUCHSCREEN_CY8CTMG110=m +CONFIG_TOUCHSCREEN_CYTTSP_CORE=m +CONFIG_TOUCHSCREEN_CYTTSP_I2C=m +CONFIG_TOUCHSCREEN_CYTTSP_SPI=m +CONFIG_TOUCHSCREEN_CYTTSP4_CORE=m +CONFIG_TOUCHSCREEN_CYTTSP4_I2C=m +CONFIG_TOUCHSCREEN_CYTTSP4_SPI=m +CONFIG_TOUCHSCREEN_DA9052=m +CONFIG_TOUCHSCREEN_DYNAPRO=m +CONFIG_TOUCHSCREEN_HAMPSHIRE=m +CONFIG_TOUCHSCREEN_EETI=m +CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m +CONFIG_TOUCHSCREEN_EXC3000=m +CONFIG_TOUCHSCREEN_FUJITSU=m +CONFIG_TOUCHSCREEN_GOODIX=m +CONFIG_TOUCHSCREEN_HIDEEP=m +CONFIG_TOUCHSCREEN_HYCON_HY46XX=m +CONFIG_TOUCHSCREEN_ILI210X=m +CONFIG_TOUCHSCREEN_ILITEK=m +CONFIG_TOUCHSCREEN_S6SY761=m +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_TOUCHSCREEN_EKTF2127=m +CONFIG_TOUCHSCREEN_ELAN=m +CONFIG_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_WACOM_W8001=m +CONFIG_TOUCHSCREEN_WACOM_I2C=m +CONFIG_TOUCHSCREEN_MAX11801=m +CONFIG_TOUCHSCREEN_MCS5000=m +CONFIG_TOUCHSCREEN_MMS114=m +CONFIG_TOUCHSCREEN_MELFAS_MIP4=m +CONFIG_TOUCHSCREEN_MSG2638=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_INEXIO=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_TOUCHSCREEN_PENMOUNT=m +CONFIG_TOUCHSCREEN_EDT_FT5X06=m +CONFIG_TOUCHSCREEN_TOUCHRIGHT=m +CONFIG_TOUCHSCREEN_TOUCHWIN=m +CONFIG_TOUCHSCREEN_TI_AM335X_TSC=m +# CONFIG_TOUCHSCREEN_UCB1400 is not set +CONFIG_TOUCHSCREEN_PIXCIR=m +CONFIG_TOUCHSCREEN_WDT87XX_I2C=m +# CONFIG_TOUCHSCREEN_WM831X is not set +CONFIG_TOUCHSCREEN_WM97XX=m +CONFIG_TOUCHSCREEN_WM9705=y +CONFIG_TOUCHSCREEN_WM9712=y +CONFIG_TOUCHSCREEN_WM9713=y +CONFIG_TOUCHSCREEN_USB_COMPOSITE=m +CONFIG_TOUCHSCREEN_MC13783=m +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_TOUCHSCREEN_USB_IRTOUCH=y +CONFIG_TOUCHSCREEN_USB_IDEALTEK=y +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y +CONFIG_TOUCHSCREEN_USB_GOTOP=y +CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y +CONFIG_TOUCHSCREEN_USB_E2I=y +CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y +CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y +CONFIG_TOUCHSCREEN_TOUCHIT213=m +CONFIG_TOUCHSCREEN_TSC_SERIO=m +CONFIG_TOUCHSCREEN_TSC200X_CORE=m +CONFIG_TOUCHSCREEN_TSC2004=m +CONFIG_TOUCHSCREEN_TSC2005=m +CONFIG_TOUCHSCREEN_TSC2007=m +# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set +# CONFIG_TOUCHSCREEN_PCAP is not set +CONFIG_TOUCHSCREEN_RM_TS=m +CONFIG_TOUCHSCREEN_SILEAD=m +CONFIG_TOUCHSCREEN_SIS_I2C=m +CONFIG_TOUCHSCREEN_ST1232=m +# CONFIG_TOUCHSCREEN_STMFTS is not set +CONFIG_TOUCHSCREEN_SUR40=m +CONFIG_TOUCHSCREEN_SURFACE3_SPI=m +CONFIG_TOUCHSCREEN_SX8654=m +CONFIG_TOUCHSCREEN_TPS6507X=m +CONFIG_TOUCHSCREEN_ZET6223=m +CONFIG_TOUCHSCREEN_ZFORCE=m +CONFIG_TOUCHSCREEN_ROHM_BU21023=m +CONFIG_TOUCHSCREEN_IQS5XX=m +CONFIG_TOUCHSCREEN_ZINITIX=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_AD714X=m +CONFIG_INPUT_AD714X_I2C=m +CONFIG_INPUT_AD714X_SPI=m +CONFIG_INPUT_ARIZONA_HAPTICS=m +CONFIG_INPUT_BMA150=m +CONFIG_INPUT_E3X0_BUTTON=m +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_MAX77693_HAPTIC=m +CONFIG_INPUT_MC13783_PWRBUTTON=m +CONFIG_INPUT_MMA8450=m +CONFIG_INPUT_APANEL=m +# CONFIG_INPUT_GPIO_BEEPER is not set +CONFIG_INPUT_GPIO_DECODER=m +CONFIG_INPUT_GPIO_VIBRA=m +CONFIG_INPUT_ATLAS_BTNS=m +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_KXTJ9=m +CONFIG_INPUT_POWERMATE=m +CONFIG_INPUT_YEALINK=m +CONFIG_INPUT_CM109=m +CONFIG_INPUT_REGULATOR_HAPTIC=m +CONFIG_INPUT_RETU_PWRBUTTON=m +CONFIG_INPUT_AXP20X_PEK=m +CONFIG_INPUT_UINPUT=m +CONFIG_INPUT_PCF50633_PMU=m +CONFIG_INPUT_PCF8574=m +CONFIG_INPUT_PWM_BEEPER=m +CONFIG_INPUT_PWM_VIBRA=m +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +CONFIG_INPUT_DA9052_ONKEY=m +CONFIG_INPUT_DA9063_ONKEY=m +# CONFIG_INPUT_WM831X_ON is not set +# CONFIG_INPUT_PCAP is not set +CONFIG_INPUT_ADXL34X=m +CONFIG_INPUT_ADXL34X_I2C=m +CONFIG_INPUT_ADXL34X_SPI=m +CONFIG_INPUT_IMS_PCU=m +CONFIG_INPUT_IQS269A=m +CONFIG_INPUT_IQS626A=m +CONFIG_INPUT_CMA3000=m +CONFIG_INPUT_CMA3000_I2C=m +CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m +CONFIG_INPUT_IDEAPAD_SLIDEBAR=m +CONFIG_INPUT_DRV260X_HAPTICS=m +CONFIG_INPUT_DRV2665_HAPTICS=m +CONFIG_INPUT_DRV2667_HAPTICS=m +CONFIG_RMI4_CORE=m +CONFIG_RMI4_I2C=m +CONFIG_RMI4_SPI=m +CONFIG_RMI4_SMB=m +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=m +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +CONFIG_RMI4_F34=y +CONFIG_RMI4_F3A=y +# CONFIG_RMI4_F54 is not set +CONFIG_RMI4_F55=y + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=m +CONFIG_SERIO_ALTERA_PS2=m +CONFIG_SERIO_PS2MULT=m +CONFIG_SERIO_ARC_PS2=m +CONFIG_HYPERV_KEYBOARD=m +CONFIG_SERIO_GPIO_PS2=m +CONFIG_USERIO=m +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_PNP=y +CONFIG_SERIAL_8250_16550A_VARIANTS=y +CONFIG_SERIAL_8250_FINTEK=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_MEN_MCB=m +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_RSA=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_DW=m +CONFIG_SERIAL_8250_RT288X=y +CONFIG_SERIAL_8250_LPSS=m +CONFIG_SERIAL_8250_MID=m + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_MAX3100=m +CONFIG_SERIAL_MAX310X=y +CONFIG_SERIAL_UARTLITE=m +CONFIG_SERIAL_UARTLITE_NR_UARTS=1 +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_JSM=m +CONFIG_SERIAL_LANTIQ=m +CONFIG_SERIAL_SCCNXP=y +CONFIG_SERIAL_SCCNXP_CONSOLE=y +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_BCM63XX is not set +CONFIG_SERIAL_ALTERA_JTAGUART=m +CONFIG_SERIAL_ALTERA_UART=m +CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4 +CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200 +CONFIG_SERIAL_ARC=m +CONFIG_SERIAL_ARC_NR_PORTS=1 +CONFIG_SERIAL_RP2=m +CONFIG_SERIAL_RP2_NR_UARTS=32 +CONFIG_SERIAL_FSL_LPUART=m +CONFIG_SERIAL_FSL_LINFLEXUART=m +# CONFIG_SERIAL_MEN_Z135 is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +CONFIG_SYNCLINK_GT=m +CONFIG_N_HDLC=m +CONFIG_N_GSM=m +CONFIG_NOZOMI=m +CONFIG_NULL_TTY=m +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_HVC_XEN_FRONTEND=y +CONFIG_RPMSG_TTY=m +CONFIG_SERIAL_DEV_BUS=m +CONFIG_TTY_PRINTK=m +CONFIG_TTY_PRINTK_LEVEL=6 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_VIRTIO_CONSOLE=m +CONFIG_IPMI_HANDLER=m +CONFIG_IPMI_DMI_DECODE=y +CONFIG_IPMI_PLAT_DATA=y +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_SSIF=m +CONFIG_IPMI_IPMB=m +CONFIG_IPMI_WATCHDOG=m +CONFIG_IPMI_POWEROFF=m +# CONFIG_IPMB_DEVICE_INTERFACE is not set +CONFIG_HW_RANDOM=m +CONFIG_HW_RANDOM_TIMERIOMEM=m +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +CONFIG_HW_RANDOM_BA431=m +CONFIG_HW_RANDOM_VIA=m +CONFIG_HW_RANDOM_VIRTIO=m +CONFIG_HW_RANDOM_XIPHERA=m +CONFIG_APPLICOM=m +CONFIG_MWAVE=m +CONFIG_DEVMEM=y +CONFIG_NVRAM=m +CONFIG_DEVPORT=y +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +CONFIG_HPET_MMAP_DEFAULT=y +CONFIG_HANGCHECK_TIMER=m +CONFIG_TCG_TPM=m +CONFIG_HW_RANDOM_TPM=y +CONFIG_TCG_TIS_CORE=m +CONFIG_TCG_TIS=m +CONFIG_TCG_TIS_SPI=m +CONFIG_TCG_TIS_SPI_CR50=y +CONFIG_TCG_TIS_I2C_CR50=m +CONFIG_TCG_TIS_I2C_ATMEL=m +CONFIG_TCG_TIS_I2C_INFINEON=m +CONFIG_TCG_TIS_I2C_NUVOTON=m +CONFIG_TCG_NSC=m +CONFIG_TCG_ATMEL=m +CONFIG_TCG_INFINEON=m +CONFIG_TCG_XEN=m +CONFIG_TCG_CRB=m +CONFIG_TCG_VTPM_PROXY=m +CONFIG_TCG_TIS_ST33ZP24=m +CONFIG_TCG_TIS_ST33ZP24_I2C=m +CONFIG_TCG_TIS_ST33ZP24_SPI=m +CONFIG_TELCLOCK=m +CONFIG_XILLYBUS_CLASS=m +CONFIG_XILLYBUS=m +CONFIG_XILLYBUS_PCIE=m +CONFIG_XILLYUSB=m +CONFIG_RANDOM_TRUST_CPU=y +CONFIG_RANDOM_TRUST_BOOTLOADER=y +# end of Character devices + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_ACPI_I2C_OPREGION=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_MUX=m + +# +# Multiplexer I2C Chip support +# +CONFIG_I2C_MUX_GPIO=m +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=m +CONFIG_I2C_MUX_PCA954x=m +CONFIG_I2C_MUX_REG=m +CONFIG_I2C_MUX_MLXCPLD=m +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_SMBUS=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCA=m + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_AMD_MP2=m +CONFIG_I2C_I801=m +CONFIG_I2C_ISCH=m +CONFIG_I2C_ISMT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_NFORCE2_S4985=m +CONFIG_I2C_NVIDIA_GPU=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m + +# +# ACPI drivers +# +CONFIG_I2C_SCMI=m + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +CONFIG_I2C_CBUS_GPIO=m +CONFIG_I2C_DESIGNWARE_CORE=m +# CONFIG_I2C_DESIGNWARE_SLAVE is not set +CONFIG_I2C_DESIGNWARE_PLATFORM=m +CONFIG_I2C_DESIGNWARE_BAYTRAIL=y +CONFIG_I2C_DESIGNWARE_PCI=m +CONFIG_I2C_EMEV2=m +CONFIG_I2C_GPIO=m +# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set +CONFIG_I2C_KEMPLD=m +CONFIG_I2C_OCORES=m +CONFIG_I2C_PCA_PLATFORM=m +CONFIG_I2C_SIMTEC=m +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +CONFIG_I2C_DIOLAN_U2C=m +# CONFIG_I2C_DLN2 is not set +CONFIG_I2C_CP2615=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_ROBOTFUZZ_OSIF=m +CONFIG_I2C_TAOS_EVM=m +CONFIG_I2C_TINY_USB=m +CONFIG_I2C_VIPERBOARD=m + +# +# Other I2C/SMBus bus drivers +# +CONFIG_I2C_MLXCPLD=m +CONFIG_I2C_CROS_EC_TUNNEL=m +CONFIG_I2C_VIRTIO=m +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +CONFIG_I2C_SLAVE=y +CONFIG_I2C_SLAVE_EEPROM=m +CONFIG_I2C_SLAVE_TESTUNIT=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +CONFIG_I3C=m +CONFIG_CDNS_I3C_MASTER=m +CONFIG_DW_I3C_MASTER=m +CONFIG_SVC_I3C_MASTER=m +# CONFIG_MIPI_I3C_HCI is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ALTERA=m +CONFIG_SPI_ALTERA_CORE=m +CONFIG_SPI_ALTERA_DFL=m +CONFIG_SPI_AXI_SPI_ENGINE=m +CONFIG_SPI_BITBANG=m +CONFIG_SPI_BUTTERFLY=m +CONFIG_SPI_CADENCE=m +CONFIG_SPI_DESIGNWARE=m +CONFIG_SPI_DW_DMA=y +CONFIG_SPI_DW_PCI=m +CONFIG_SPI_DW_MMIO=m +CONFIG_SPI_DLN2=m +CONFIG_SPI_NXP_FLEXSPI=m +CONFIG_SPI_GPIO=m +CONFIG_SPI_LM70_LLP=m +CONFIG_SPI_LANTIQ_SSC=m +CONFIG_SPI_OC_TINY=m +CONFIG_SPI_PXA2XX=m +CONFIG_SPI_PXA2XX_PCI=m +CONFIG_SPI_ROCKCHIP=m +CONFIG_SPI_SC18IS602=m +CONFIG_SPI_SIFIVE=m +CONFIG_SPI_MXIC=m +CONFIG_SPI_XCOMM=m +CONFIG_SPI_XILINX=m +CONFIG_SPI_ZYNQMP_GQSPI=m +CONFIG_SPI_AMD=m + +# +# SPI Multiplexer support +# +CONFIG_SPI_MUX=m + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=m +CONFIG_SPI_LOOPBACK_TEST=m +CONFIG_SPI_TLE62X0=m +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +CONFIG_SPMI=m +CONFIG_SPMI_HISI3670=m +CONFIG_HSI=m +CONFIG_HSI_BOARDINFO=y + +# +# HSI controllers +# + +# +# HSI clients +# +CONFIG_HSI_CHAR=m +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +CONFIG_PPS_CLIENT_KTIMER=m +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PPS_CLIENT_GPIO=m + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PTP_1588_CLOCK_KVM=m +CONFIG_PTP_1588_CLOCK_IDT82P33=m +CONFIG_PTP_1588_CLOCK_IDTCM=m +CONFIG_PTP_1588_CLOCK_VMW=m +# CONFIG_PTP_1588_CLOCK_OCP is not set +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_PINMUX=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +CONFIG_PINCTRL_AMD=y +CONFIG_PINCTRL_DA9062=m +CONFIG_PINCTRL_MCP23S08_I2C=m +CONFIG_PINCTRL_MCP23S08_SPI=m +CONFIG_PINCTRL_MCP23S08=m +CONFIG_PINCTRL_SX150X=y + +# +# Intel pinctrl drivers +# +CONFIG_PINCTRL_BAYTRAIL=y +CONFIG_PINCTRL_CHERRYVIEW=y +CONFIG_PINCTRL_LYNXPOINT=m +CONFIG_PINCTRL_INTEL=y +# CONFIG_PINCTRL_ALDERLAKE is not set +CONFIG_PINCTRL_BROXTON=m +CONFIG_PINCTRL_CANNONLAKE=m +CONFIG_PINCTRL_CEDARFORK=m +CONFIG_PINCTRL_DENVERTON=m +# CONFIG_PINCTRL_ELKHARTLAKE is not set +CONFIG_PINCTRL_EMMITSBURG=m +CONFIG_PINCTRL_GEMINILAKE=m +CONFIG_PINCTRL_ICELAKE=m +CONFIG_PINCTRL_JASPERLAKE=m +# CONFIG_PINCTRL_LAKEFIELD is not set +CONFIG_PINCTRL_LEWISBURG=m +CONFIG_PINCTRL_SUNRISEPOINT=m +CONFIG_PINCTRL_TIGERLAKE=m +# end of Intel pinctrl drivers + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_PINCTRL_MADERA=m +CONFIG_PINCTRL_CS47L35=y +CONFIG_PINCTRL_CS47L85=y +CONFIG_PINCTRL_CS47L90=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_GPIO_ACPI=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y +CONFIG_GPIO_GENERIC=m +CONFIG_GPIO_MAX730X=m + +# +# Memory mapped GPIO drivers +# +CONFIG_GPIO_AMDPT=m +CONFIG_GPIO_DWAPB=m +CONFIG_GPIO_EXAR=m +CONFIG_GPIO_GENERIC_PLATFORM=m +CONFIG_GPIO_ICH=m +CONFIG_GPIO_MB86S7X=m +CONFIG_GPIO_MENZ127=m +CONFIG_GPIO_VX855=m +CONFIG_GPIO_AMD_FCH=m +# end of Memory mapped GPIO drivers + +# +# Port-mapped I/O GPIO drivers +# +CONFIG_GPIO_F7188X=m +CONFIG_GPIO_IT87=m +CONFIG_GPIO_SCH=m +CONFIG_GPIO_SCH311X=m +# CONFIG_GPIO_WINBOND is not set +# CONFIG_GPIO_WS16C48 is not set +# end of Port-mapped I/O GPIO drivers + +# +# I2C GPIO expanders +# +CONFIG_GPIO_ADP5588=m +CONFIG_GPIO_MAX7300=m +CONFIG_GPIO_MAX732X=m +CONFIG_GPIO_PCA953X=m +CONFIG_GPIO_PCA953X_IRQ=y +CONFIG_GPIO_PCA9570=m +CONFIG_GPIO_PCF857X=m +CONFIG_GPIO_TPIC2810=m +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +CONFIG_GPIO_ARIZONA=m +CONFIG_GPIO_BD9571MWV=m +CONFIG_GPIO_DA9052=m +CONFIG_GPIO_DLN2=m +CONFIG_GPIO_JANZ_TTL=m +CONFIG_GPIO_KEMPLD=m +CONFIG_GPIO_LP3943=m +CONFIG_GPIO_LP873X=m +CONFIG_GPIO_MADERA=m +CONFIG_GPIO_TPS65086=m +# CONFIG_GPIO_TPS65912 is not set +CONFIG_GPIO_TPS68470=y +CONFIG_GPIO_TQMX86=m +CONFIG_GPIO_UCB1400=m +# CONFIG_GPIO_WM831X is not set +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +CONFIG_GPIO_AMD8111=m +CONFIG_GPIO_ML_IOH=m +CONFIG_GPIO_PCI_IDIO_16=m +# CONFIG_GPIO_PCIE_IDIO_24 is not set +CONFIG_GPIO_RDC321X=m +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +CONFIG_GPIO_MAX3191X=m +CONFIG_GPIO_MAX7301=m +CONFIG_GPIO_MC33880=m +CONFIG_GPIO_PISOSR=m +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +CONFIG_GPIO_VIPERBOARD=m +# end of USB GPIO expanders + +# +# Virtual GPIO drivers +# +CONFIG_GPIO_AGGREGATOR=m +CONFIG_GPIO_MOCKUP=m +CONFIG_GPIO_VIRTIO=m +# end of Virtual GPIO drivers + +CONFIG_W1=m +CONFIG_W1_CON=y + +# +# 1-wire Bus Masters +# +CONFIG_W1_MASTER_MATROX=m +CONFIG_W1_MASTER_DS2490=m +CONFIG_W1_MASTER_DS2482=m +CONFIG_W1_MASTER_DS1WM=m +CONFIG_W1_MASTER_GPIO=m +CONFIG_W1_MASTER_SGI=m +# end of 1-wire Bus Masters + +# +# 1-wire Slaves +# +CONFIG_W1_SLAVE_THERM=m +CONFIG_W1_SLAVE_SMEM=m +CONFIG_W1_SLAVE_DS2405=m +CONFIG_W1_SLAVE_DS2408=m +CONFIG_W1_SLAVE_DS2408_READBACK=y +CONFIG_W1_SLAVE_DS2413=m +# CONFIG_W1_SLAVE_DS2406 is not set +CONFIG_W1_SLAVE_DS2423=m +CONFIG_W1_SLAVE_DS2805=m +CONFIG_W1_SLAVE_DS2430=m +CONFIG_W1_SLAVE_DS2431=m +CONFIG_W1_SLAVE_DS2433=m +CONFIG_W1_SLAVE_DS2433_CRC=y +# CONFIG_W1_SLAVE_DS2438 is not set +CONFIG_W1_SLAVE_DS250X=m +CONFIG_W1_SLAVE_DS2780=m +CONFIG_W1_SLAVE_DS2781=m +CONFIG_W1_SLAVE_DS28E04=m +CONFIG_W1_SLAVE_DS28E17=m +# end of 1-wire Slaves + +# CONFIG_POWER_RESET is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +CONFIG_PDA_POWER=m +CONFIG_GENERIC_ADC_BATTERY=m +# CONFIG_WM831X_BACKUP is not set +# CONFIG_WM831X_POWER is not set +CONFIG_TEST_POWER=m +CONFIG_CHARGER_ADP5061=m +CONFIG_BATTERY_CW2015=m +CONFIG_BATTERY_DS2760=m +CONFIG_BATTERY_DS2780=m +CONFIG_BATTERY_DS2781=m +CONFIG_BATTERY_DS2782=m +CONFIG_BATTERY_SBS=m +CONFIG_CHARGER_SBS=m +CONFIG_MANAGER_SBS=m +CONFIG_BATTERY_BQ27XXX=m +CONFIG_BATTERY_BQ27XXX_I2C=m +CONFIG_BATTERY_BQ27XXX_HDQ=m +# CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set +CONFIG_BATTERY_DA9052=m +CONFIG_CHARGER_DA9150=m +CONFIG_BATTERY_DA9150=m +CONFIG_AXP20X_POWER=m +CONFIG_AXP288_CHARGER=m +CONFIG_AXP288_FUEL_GAUGE=m +CONFIG_BATTERY_MAX17040=m +CONFIG_BATTERY_MAX17042=m +CONFIG_BATTERY_MAX1721X=m +CONFIG_CHARGER_PCF50633=m +CONFIG_CHARGER_ISP1704=m +CONFIG_CHARGER_MAX8903=m +CONFIG_CHARGER_LP8727=m +CONFIG_CHARGER_GPIO=m +CONFIG_CHARGER_MANAGER=y +CONFIG_CHARGER_LT3651=m +CONFIG_CHARGER_LTC4162L=m +CONFIG_CHARGER_MP2629=m +CONFIG_CHARGER_MT6360=m +CONFIG_CHARGER_BQ2415X=m +CONFIG_CHARGER_BQ24190=m +CONFIG_CHARGER_BQ24257=m +CONFIG_CHARGER_BQ24735=m +CONFIG_CHARGER_BQ2515X=m +CONFIG_CHARGER_BQ25890=m +CONFIG_CHARGER_BQ25980=m +CONFIG_CHARGER_BQ256XX=m +CONFIG_CHARGER_SMB347=m +CONFIG_BATTERY_GAUGE_LTC2941=m +# CONFIG_BATTERY_GOLDFISH is not set +CONFIG_BATTERY_RT5033=m +CONFIG_CHARGER_RT9455=m +CONFIG_CHARGER_CROS_USBPD=m +CONFIG_CHARGER_CROS_PCHG=m +CONFIG_CHARGER_BD99954=m +CONFIG_BATTERY_SURFACE=m +CONFIG_CHARGER_SURFACE=m +CONFIG_HWMON=y +CONFIG_HWMON_VID=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ABITUGURU3=m +CONFIG_SENSORS_AD7314=m +CONFIG_SENSORS_AD7414=m +CONFIG_SENSORS_AD7418=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1029=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM1177=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_ADT7X10=m +CONFIG_SENSORS_ADT7310=m +CONFIG_SENSORS_ADT7410=m +CONFIG_SENSORS_ADT7411=m +CONFIG_SENSORS_ADT7462=m +CONFIG_SENSORS_ADT7470=m +CONFIG_SENSORS_ADT7475=m +CONFIG_SENSORS_AHT10=m +CONFIG_SENSORS_AQUACOMPUTER_D5NEXT=m +CONFIG_SENSORS_AS370=m +CONFIG_SENSORS_ASC7621=m +CONFIG_SENSORS_AXI_FAN_CONTROL=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_K10TEMP=m +CONFIG_SENSORS_FAM15H_POWER=m +CONFIG_SENSORS_APPLESMC=m +CONFIG_SENSORS_ASB100=m +# CONFIG_SENSORS_ASPEED is not set +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_CORSAIR_CPRO=m +# CONFIG_SENSORS_CORSAIR_PSU is not set +CONFIG_SENSORS_DRIVETEMP=m +CONFIG_SENSORS_DS620=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_DELL_SMM=m +CONFIG_SENSORS_DA9052_ADC=m +CONFIG_SENSORS_I5K_AMB=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_F71882FG=m +CONFIG_SENSORS_F75375S=m +CONFIG_SENSORS_MC13783_ADC=m +CONFIG_SENSORS_FSCHMD=m +CONFIG_SENSORS_FTSTEUTATES=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_G760A=m +CONFIG_SENSORS_G762=m +CONFIG_SENSORS_HIH6130=m +CONFIG_SENSORS_IBMAEM=m +CONFIG_SENSORS_IBMPEX=m +CONFIG_SENSORS_IIO_HWMON=m +CONFIG_SENSORS_I5500=m +CONFIG_SENSORS_CORETEMP=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_JC42=m +# CONFIG_SENSORS_POWR1220 is not set +CONFIG_SENSORS_LINEAGE=m +CONFIG_SENSORS_LTC2945=m +CONFIG_SENSORS_LTC2947=m +CONFIG_SENSORS_LTC2947_I2C=m +CONFIG_SENSORS_LTC2947_SPI=m +CONFIG_SENSORS_LTC2990=m +# CONFIG_SENSORS_LTC2992 is not set +CONFIG_SENSORS_LTC4151=m +CONFIG_SENSORS_LTC4215=m +CONFIG_SENSORS_LTC4222=m +CONFIG_SENSORS_LTC4245=m +CONFIG_SENSORS_LTC4260=m +CONFIG_SENSORS_LTC4261=m +CONFIG_SENSORS_MAX1111=m +# CONFIG_SENSORS_MAX127 is not set +CONFIG_SENSORS_MAX16065=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_MAX1668=m +CONFIG_SENSORS_MAX197=m +CONFIG_SENSORS_MAX31722=m +CONFIG_SENSORS_MAX31730=m +CONFIG_SENSORS_MAX6620=m +CONFIG_SENSORS_MAX6621=m +CONFIG_SENSORS_MAX6639=m +# CONFIG_SENSORS_MAX6642 is not set +CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_MAX6697=m +CONFIG_SENSORS_MAX31790=m +CONFIG_SENSORS_MCP3021=m +CONFIG_SENSORS_TC654=m +CONFIG_SENSORS_TPS23861=m +CONFIG_SENSORS_MENF21BMC_HWMON=m +CONFIG_SENSORS_MR75203=m +CONFIG_SENSORS_ADCXX=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m +CONFIG_SENSORS_LM73=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_LM93=m +CONFIG_SENSORS_LM95234=m +CONFIG_SENSORS_LM95241=m +CONFIG_SENSORS_LM95245=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_PC87427=m +CONFIG_SENSORS_NTC_THERMISTOR=m +CONFIG_SENSORS_NCT6683=m +CONFIG_SENSORS_NCT6775=m +CONFIG_SENSORS_NCT7802=m +CONFIG_SENSORS_NCT7904=m +CONFIG_SENSORS_NPCM7XX=m +CONFIG_SENSORS_NZXT_KRAKEN2=m +CONFIG_SENSORS_PCF8591=m +CONFIG_PMBUS=m +CONFIG_SENSORS_PMBUS=m +CONFIG_SENSORS_ADM1266=m +CONFIG_SENSORS_ADM1275=m +CONFIG_SENSORS_BEL_PFE=m +CONFIG_SENSORS_BPA_RS600=m +CONFIG_SENSORS_FSP_3Y=m +CONFIG_SENSORS_IBM_CFFPS=m +CONFIG_SENSORS_DPS920AB=m +CONFIG_SENSORS_INSPUR_IPSPS=m +# CONFIG_SENSORS_IR35221 is not set +CONFIG_SENSORS_IR36021=m +CONFIG_SENSORS_IR38064=m +# CONFIG_SENSORS_IRPS5401 is not set +CONFIG_SENSORS_ISL68137=m +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_LTC2978=m +# CONFIG_SENSORS_LTC2978_REGULATOR is not set +CONFIG_SENSORS_LTC3815=m +CONFIG_SENSORS_MAX15301=m +CONFIG_SENSORS_MAX16064=m +CONFIG_SENSORS_MAX16601=m +CONFIG_SENSORS_MAX20730=m +CONFIG_SENSORS_MAX20751=m +CONFIG_SENSORS_MAX31785=m +CONFIG_SENSORS_MAX34440=m +CONFIG_SENSORS_MAX8688=m +CONFIG_SENSORS_MP2888=m +CONFIG_SENSORS_MP2975=m +CONFIG_SENSORS_PIM4328=m +# CONFIG_SENSORS_PM6764TR is not set +# CONFIG_SENSORS_PXE1610 is not set +# CONFIG_SENSORS_Q54SJ108A2 is not set +CONFIG_SENSORS_STPDDC60=m +# CONFIG_SENSORS_TPS40422 is not set +CONFIG_SENSORS_TPS53679=m +CONFIG_SENSORS_UCD9000=m +CONFIG_SENSORS_UCD9200=m +CONFIG_SENSORS_XDPE122=m +CONFIG_SENSORS_ZL6100=m +# CONFIG_SENSORS_SBTSI is not set +CONFIG_SENSORS_SBRMI=m +CONFIG_SENSORS_SHT15=m +CONFIG_SENSORS_SHT21=m +CONFIG_SENSORS_SHT3x=m +CONFIG_SENSORS_SHT4x=m +# CONFIG_SENSORS_SHTC1 is not set +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_DME1737=m +CONFIG_SENSORS_EMC1403=m +CONFIG_SENSORS_EMC2103=m +CONFIG_SENSORS_EMC6W201=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_SCH56XX_COMMON=m +CONFIG_SENSORS_SCH5627=m +CONFIG_SENSORS_SCH5636=m +CONFIG_SENSORS_STTS751=m +CONFIG_SENSORS_SMM665=m +CONFIG_SENSORS_ADC128D818=m +CONFIG_SENSORS_ADS7828=m +CONFIG_SENSORS_ADS7871=m +CONFIG_SENSORS_AMC6821=m +CONFIG_SENSORS_INA209=m +CONFIG_SENSORS_INA2XX=m +CONFIG_SENSORS_INA3221=m +CONFIG_SENSORS_TC74=m +CONFIG_SENSORS_THMC50=m +CONFIG_SENSORS_TMP102=m +# CONFIG_SENSORS_TMP103 is not set +CONFIG_SENSORS_TMP108=m +CONFIG_SENSORS_TMP401=m +CONFIG_SENSORS_TMP421=m +CONFIG_SENSORS_TMP513=m +CONFIG_SENSORS_VIA_CPUTEMP=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT1211=m +CONFIG_SENSORS_VT8231=m +# CONFIG_SENSORS_W83773G is not set +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83793=m +CONFIG_SENSORS_W83795=m +# CONFIG_SENSORS_W83795_FANCTRL is not set +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83L786NG=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +# CONFIG_SENSORS_WM831X is not set +CONFIG_SENSORS_XGENE=m +CONFIG_SENSORS_INTEL_M10_BMC_HWMON=m + +# +# ACPI drivers +# +CONFIG_SENSORS_ACPI_POWER=m +CONFIG_SENSORS_ATK0110=m +CONFIG_THERMAL=y +CONFIG_THERMAL_NETLINK=y +CONFIG_THERMAL_STATISTICS=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_DEVFREQ_THERMAL=y +# CONFIG_THERMAL_EMULATION is not set + +# +# Intel thermal drivers +# +CONFIG_INTEL_POWERCLAMP=m +CONFIG_X86_THERMAL_VECTOR=y +CONFIG_X86_PKG_TEMP_THERMAL=m +CONFIG_INTEL_SOC_DTS_IOSF_CORE=m +# CONFIG_INTEL_SOC_DTS_THERMAL is not set + +# +# ACPI INT340X thermal drivers +# +CONFIG_INT340X_THERMAL=m +CONFIG_ACPI_THERMAL_REL=m +CONFIG_INT3406_THERMAL=m +CONFIG_PROC_THERMAL_MMIO_RAPL=m +# end of ACPI INT340X thermal drivers + +CONFIG_INTEL_PCH_THERMAL=m +CONFIG_INTEL_TCC_COOLING=m +CONFIG_INTEL_MENLOW=m +# end of Intel thermal drivers + +CONFIG_GENERIC_ADC_THERMAL=m +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +CONFIG_WATCHDOG_SYSFS=y +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_DA9052_WATCHDOG=m +CONFIG_DA9062_WATCHDOG=m +CONFIG_MENF21BMC_WATCHDOG=m +# CONFIG_MENZ069_WATCHDOG is not set +CONFIG_WDAT_WDT=m +# CONFIG_WM831X_WATCHDOG is not set +CONFIG_XILINX_WATCHDOG=m +CONFIG_ZIIRAVE_WATCHDOG=m +CONFIG_CADENCE_WATCHDOG=m +CONFIG_DW_WATCHDOG=m +CONFIG_MAX63XX_WATCHDOG=m +CONFIG_RETU_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +# CONFIG_EBC_C384_WDT is not set +CONFIG_F71808E_WDT=m +CONFIG_SP5100_TCO=m +CONFIG_SBC_FITPC2_WATCHDOG=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_IBMASR=m +CONFIG_WAFER_WDT=m +CONFIG_I6300ESB_WDT=m +CONFIG_IE6XX_WDT=m +CONFIG_ITCO_WDT=m +CONFIG_ITCO_VENDOR_SUPPORT=y +CONFIG_IT8712F_WDT=m +CONFIG_IT87_WDT=m +CONFIG_HP_WATCHDOG=m +CONFIG_HPWDT_NMI_DECODING=y +CONFIG_KEMPLD_WDT=m +CONFIG_SC1200_WDT=m +CONFIG_PC87413_WDT=m +CONFIG_NV_TCO=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_SMSC_SCH311X_WDT=m +CONFIG_SMSC37B787_WDT=m +CONFIG_TQMX86_WDT=m +CONFIG_VIA_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +CONFIG_SBC_EPX_C3_WATCHDOG=m +CONFIG_INTEL_MEI_WDT=m +CONFIG_NI903X_WDT=m +CONFIG_NIC7018_WDT=m +CONFIG_MEN_A21_WDT=m +CONFIG_XEN_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_SSB_POSSIBLE=y +CONFIG_SSB=m +CONFIG_SSB_SPROM=y +CONFIG_SSB_BLOCKIO=y +CONFIG_SSB_PCIHOST_POSSIBLE=y +CONFIG_SSB_PCIHOST=y +CONFIG_SSB_B43_PCI_BRIDGE=y +CONFIG_SSB_SDIOHOST_POSSIBLE=y +CONFIG_SSB_SDIOHOST=y +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y +CONFIG_SSB_DRIVER_PCICORE=y +CONFIG_SSB_DRIVER_GPIO=y +CONFIG_BCMA_POSSIBLE=y +CONFIG_BCMA=m +CONFIG_BCMA_BLOCKIO=y +CONFIG_BCMA_HOST_PCI_POSSIBLE=y +CONFIG_BCMA_HOST_PCI=y +CONFIG_BCMA_HOST_SOC=y +CONFIG_BCMA_DRIVER_PCI=y +CONFIG_BCMA_SFLASH=y +CONFIG_BCMA_DRIVER_GMAC_CMN=y +CONFIG_BCMA_DRIVER_GPIO=y +# CONFIG_BCMA_DEBUG is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +CONFIG_MFD_BCM590XX=m +CONFIG_MFD_BD9571MWV=m +CONFIG_MFD_AXP20X=m +CONFIG_MFD_AXP20X_I2C=m +CONFIG_MFD_CROS_EC_DEV=m +CONFIG_MFD_MADERA=m +CONFIG_MFD_MADERA_I2C=m +CONFIG_MFD_MADERA_SPI=m +# CONFIG_MFD_CS47L15 is not set +CONFIG_MFD_CS47L35=y +CONFIG_MFD_CS47L85=y +CONFIG_MFD_CS47L90=y +# CONFIG_MFD_CS47L92 is not set +# CONFIG_PMIC_DA903X is not set +CONFIG_PMIC_DA9052=y +CONFIG_MFD_DA9052_SPI=y +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +CONFIG_MFD_DA9062=m +# CONFIG_MFD_DA9063 is not set +CONFIG_MFD_DA9150=m +CONFIG_MFD_DLN2=m +CONFIG_MFD_MC13XXX=m +CONFIG_MFD_MC13XXX_SPI=m +CONFIG_MFD_MC13XXX_I2C=m +CONFIG_MFD_MP2629=m +CONFIG_HTC_PASIC3=m +# CONFIG_HTC_I2CPLD is not set +CONFIG_MFD_INTEL_QUARK_I2C_GPIO=m +CONFIG_LPC_ICH=m +CONFIG_LPC_SCH=m +# CONFIG_INTEL_SOC_PMIC_BXTWC is not set +CONFIG_INTEL_SOC_PMIC_CHTDC_TI=m +CONFIG_INTEL_SOC_PMIC_MRFLD=m +CONFIG_MFD_INTEL_LPSS=m +CONFIG_MFD_INTEL_LPSS_ACPI=m +CONFIG_MFD_INTEL_LPSS_PCI=m +CONFIG_MFD_INTEL_PMC_BXT=m +# CONFIG_MFD_INTEL_PMT is not set +CONFIG_MFD_IQS62X=m +CONFIG_MFD_JANZ_CMODIO=m +CONFIG_MFD_KEMPLD=m +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77693 is not set +CONFIG_MFD_MAX77843=y +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +CONFIG_MFD_MT6360=m +CONFIG_MFD_MT6397=m +CONFIG_MFD_MENF21BMC=m +CONFIG_EZX_PCAP=y +CONFIG_MFD_VIPERBOARD=m +CONFIG_MFD_RETU=m +CONFIG_MFD_PCF50633=m +CONFIG_PCF50633_ADC=m +CONFIG_PCF50633_GPIO=m +CONFIG_UCB1400_CORE=m +CONFIG_MFD_RDC321X=m +CONFIG_MFD_RT4831=m +CONFIG_MFD_RT5033=m +# CONFIG_MFD_RC5T583 is not set +CONFIG_MFD_SI476X_CORE=m +CONFIG_MFD_SM501=m +CONFIG_MFD_SM501_GPIO=y +CONFIG_MFD_SKY81452=m +CONFIG_MFD_SYSCON=y +CONFIG_MFD_TI_AM335X_TSCADC=m +CONFIG_MFD_LP3943=m +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +CONFIG_TPS6105X=m +CONFIG_TPS65010=m +CONFIG_TPS6507X=m +CONFIG_MFD_TPS65086=m +# CONFIG_MFD_TPS65090 is not set +CONFIG_MFD_TI_LP873X=m +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +CONFIG_MFD_TPS65912=y +# CONFIG_MFD_TPS65912_I2C is not set +CONFIG_MFD_TPS65912_SPI=y +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +CONFIG_MFD_WL1273_CORE=m +CONFIG_MFD_LM3533=m +CONFIG_MFD_TQMX86=m +CONFIG_MFD_VX855=m +CONFIG_MFD_ARIZONA=m +CONFIG_MFD_ARIZONA_I2C=m +CONFIG_MFD_ARIZONA_SPI=m +CONFIG_MFD_CS47L24=y +CONFIG_MFD_WM5102=y +CONFIG_MFD_WM5110=y +# CONFIG_MFD_WM8997 is not set +CONFIG_MFD_WM8998=y +# CONFIG_MFD_WM8400 is not set +CONFIG_MFD_WM831X=y +# CONFIG_MFD_WM831X_I2C is not set +CONFIG_MFD_WM831X_SPI=y +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_RAVE_SP_CORE is not set +CONFIG_MFD_INTEL_M10_BMC=m +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=m +CONFIG_REGULATOR_VIRTUAL_CONSUMER=m +CONFIG_REGULATOR_USERSPACE_CONSUMER=m +# CONFIG_REGULATOR_88PG86X is not set +CONFIG_REGULATOR_ACT8865=m +CONFIG_REGULATOR_AD5398=m +# CONFIG_REGULATOR_ARIZONA_LDO1 is not set +# CONFIG_REGULATOR_ARIZONA_MICSUPP is not set +CONFIG_REGULATOR_AXP20X=m +CONFIG_REGULATOR_BCM590XX=m +CONFIG_REGULATOR_BD9571MWV=m +CONFIG_REGULATOR_DA9052=m +CONFIG_REGULATOR_DA9062=m +CONFIG_REGULATOR_DA9210=m +# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_FAN53555=m +CONFIG_REGULATOR_GPIO=m +CONFIG_REGULATOR_ISL9305=m +CONFIG_REGULATOR_ISL6271A=m +CONFIG_REGULATOR_LP3971=m +CONFIG_REGULATOR_LP3972=m +CONFIG_REGULATOR_LP872X=m +CONFIG_REGULATOR_LP8755=m +# CONFIG_REGULATOR_LTC3589 is not set +CONFIG_REGULATOR_LTC3676=m +CONFIG_REGULATOR_MAX1586=m +CONFIG_REGULATOR_MAX8649=m +CONFIG_REGULATOR_MAX8660=m +CONFIG_REGULATOR_MAX8893=m +CONFIG_REGULATOR_MAX8952=m +CONFIG_REGULATOR_MAX77693=m +CONFIG_REGULATOR_MAX77826=m +CONFIG_REGULATOR_MC13XXX_CORE=m +CONFIG_REGULATOR_MC13783=m +CONFIG_REGULATOR_MC13892=m +CONFIG_REGULATOR_MP8859=m +CONFIG_REGULATOR_MT6311=m +CONFIG_REGULATOR_MT6315=m +CONFIG_REGULATOR_MT6323=m +CONFIG_REGULATOR_MT6358=m +CONFIG_REGULATOR_MT6359=m +CONFIG_REGULATOR_MT6360=m +CONFIG_REGULATOR_MT6397=m +CONFIG_REGULATOR_PCA9450=m +CONFIG_REGULATOR_PCAP=m +CONFIG_REGULATOR_PCF50633=m +CONFIG_REGULATOR_PV88060=m +CONFIG_REGULATOR_PV88080=m +CONFIG_REGULATOR_PV88090=m +CONFIG_REGULATOR_PWM=m +CONFIG_REGULATOR_QCOM_SPMI=m +CONFIG_REGULATOR_QCOM_USB_VBUS=m +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +CONFIG_REGULATOR_RT4801=m +CONFIG_REGULATOR_RT4831=m +CONFIG_REGULATOR_RT5033=m +CONFIG_REGULATOR_RT6160=m +CONFIG_REGULATOR_RT6245=m +CONFIG_REGULATOR_RTQ2134=m +CONFIG_REGULATOR_RTMV20=m +CONFIG_REGULATOR_RTQ6752=m +CONFIG_REGULATOR_SKY81452=m +# CONFIG_REGULATOR_SLG51000 is not set +CONFIG_REGULATOR_TPS51632=m +CONFIG_REGULATOR_TPS6105X=m +CONFIG_REGULATOR_TPS62360=m +CONFIG_REGULATOR_TPS65023=m +CONFIG_REGULATOR_TPS6507X=m +CONFIG_REGULATOR_TPS65086=m +# CONFIG_REGULATOR_TPS65132 is not set +CONFIG_REGULATOR_TPS6524X=m +# CONFIG_REGULATOR_TPS65912 is not set +# CONFIG_REGULATOR_WM831X is not set +CONFIG_REGULATOR_QCOM_LABIBB=m +CONFIG_RC_CORE=m +CONFIG_RC_MAP=m +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_SANYO_DECODER=m +CONFIG_IR_SHARP_DECODER=m +CONFIG_IR_MCE_KBD_DECODER=m +CONFIG_IR_XMP_DECODER=m +CONFIG_IR_IMON_DECODER=m +CONFIG_IR_RCMM_DECODER=m +CONFIG_RC_DEVICES=y +CONFIG_RC_ATI_REMOTE=m +CONFIG_IR_ENE=m +CONFIG_IR_IMON=m +CONFIG_IR_IMON_RAW=m +CONFIG_IR_MCEUSB=m +CONFIG_IR_ITE_CIR=m +CONFIG_IR_FINTEK=m +CONFIG_IR_NUVOTON=m +CONFIG_IR_REDRAT3=m +CONFIG_IR_STREAMZAP=m +CONFIG_IR_WINBOND_CIR=m +CONFIG_IR_IGORPLUGUSB=m +CONFIG_IR_IGUANA=m +CONFIG_IR_TTUSBIR=m +CONFIG_RC_LOOPBACK=m +CONFIG_IR_SERIAL=m +CONFIG_IR_SERIAL_TRANSMITTER=y +CONFIG_RC_XBOX_DVD=m +CONFIG_IR_TOY=m +CONFIG_CEC_CORE=m +CONFIG_CEC_NOTIFIER=y +CONFIG_CEC_PIN=y + +# +# CEC support +# +CONFIG_MEDIA_CEC_RC=y +# CONFIG_CEC_PIN_ERROR_INJ is not set +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_CEC_CH7322=m +CONFIG_CEC_CROS_EC=m +CONFIG_CEC_GPIO=m +CONFIG_CEC_SECO=m +CONFIG_CEC_SECO_RC=y +CONFIG_USB_PULSE8_CEC=m +# CONFIG_USB_RAINSHADOW_CEC is not set +# end of CEC support + +CONFIG_MEDIA_SUPPORT=m +# CONFIG_MEDIA_SUPPORT_FILTER is not set +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y + +# +# Media device types +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +# end of Media device types + +# +# Media core support +# +CONFIG_VIDEO_DEV=m +CONFIG_MEDIA_CONTROLLER=y +CONFIG_DVB_CORE=m +# end of Media core support + +# +# Video4Linux options +# +CONFIG_VIDEO_V4L2=m +CONFIG_VIDEO_V4L2_I2C=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_TUNER=m +CONFIG_V4L2_MEM2MEM_DEV=m +CONFIG_V4L2_FLASH_LED_CLASS=m +CONFIG_V4L2_FWNODE=m +CONFIG_V4L2_ASYNC=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_DMA_SG=m +CONFIG_VIDEOBUF_VMALLOC=m +# end of Video4Linux options + +# +# Media controller options +# +CONFIG_MEDIA_CONTROLLER_DVB=y +# end of Media controller options + +# +# Digital TV options +# +# CONFIG_DVB_MMAP is not set +CONFIG_DVB_NET=y +CONFIG_DVB_MAX_ADAPTERS=8 +CONFIG_DVB_DYNAMIC_MINORS=y +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set +# end of Digital TV options + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_USB_M5602=m +CONFIG_USB_STV06XX=m +CONFIG_USB_GL860=m +CONFIG_USB_GSPCA_BENQ=m +CONFIG_USB_GSPCA_CONEX=m +CONFIG_USB_GSPCA_CPIA1=m +# CONFIG_USB_GSPCA_DTCS033 is not set +CONFIG_USB_GSPCA_ETOMS=m +CONFIG_USB_GSPCA_FINEPIX=m +CONFIG_USB_GSPCA_JEILINJ=m +CONFIG_USB_GSPCA_JL2005BCD=m +CONFIG_USB_GSPCA_KINECT=m +CONFIG_USB_GSPCA_KONICA=m +CONFIG_USB_GSPCA_MARS=m +CONFIG_USB_GSPCA_MR97310A=m +CONFIG_USB_GSPCA_NW80X=m +CONFIG_USB_GSPCA_OV519=m +CONFIG_USB_GSPCA_OV534=m +CONFIG_USB_GSPCA_OV534_9=m +CONFIG_USB_GSPCA_PAC207=m +CONFIG_USB_GSPCA_PAC7302=m +CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SE401=m +CONFIG_USB_GSPCA_SN9C2028=m +CONFIG_USB_GSPCA_SN9C20X=m +CONFIG_USB_GSPCA_SONIXB=m +CONFIG_USB_GSPCA_SONIXJ=m +CONFIG_USB_GSPCA_SPCA500=m +CONFIG_USB_GSPCA_SPCA501=m +CONFIG_USB_GSPCA_SPCA505=m +CONFIG_USB_GSPCA_SPCA506=m +CONFIG_USB_GSPCA_SPCA508=m +CONFIG_USB_GSPCA_SPCA561=m +CONFIG_USB_GSPCA_SPCA1528=m +CONFIG_USB_GSPCA_SQ905=m +CONFIG_USB_GSPCA_SQ905C=m +CONFIG_USB_GSPCA_SQ930X=m +CONFIG_USB_GSPCA_STK014=m +CONFIG_USB_GSPCA_STK1135=m +CONFIG_USB_GSPCA_STV0680=m +CONFIG_USB_GSPCA_SUNPLUS=m +CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TOPRO=m +CONFIG_USB_GSPCA_TOUPTEK=m +CONFIG_USB_GSPCA_TV8532=m +CONFIG_USB_GSPCA_VC032X=m +CONFIG_USB_GSPCA_VICAM=m +CONFIG_USB_GSPCA_XIRLINK_CIT=m +CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +CONFIG_VIDEO_CPIA2=m +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +CONFIG_VIDEO_USBTV=m + +# +# Analog TV USB devices +# +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +CONFIG_VIDEO_PVRUSB2_DVB=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_HDPVR=m +CONFIG_VIDEO_STK1160_COMMON=m +CONFIG_VIDEO_STK1160=m +CONFIG_VIDEO_GO7007=m +CONFIG_VIDEO_GO7007_USB=m +CONFIG_VIDEO_GO7007_LOADER=m +CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m + +# +# Analog/digital TV USB devices +# +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_AU0828_V4L2=y +# CONFIG_VIDEO_AU0828_RC is not set +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_RC=y +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_VIDEO_TM6000=m +CONFIG_VIDEO_TM6000_ALSA=m +CONFIG_VIDEO_TM6000_DVB=m + +# +# Digital TV USB devices +# +CONFIG_DVB_USB=m +# CONFIG_DVB_USB_DEBUG is not set +CONFIG_DVB_USB_DIB3000MC=m +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_CXUSB=m +# CONFIG_DVB_USB_CXUSB_ANALOG is not set +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_ZD1301=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_SMS_USB_DRV=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set +CONFIG_DVB_AS102=m + +# +# Webcam, TV (analog/digital) USB devices +# +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m + +# +# Software defined radio USB devices +# +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y + +# +# Media capture support +# +CONFIG_VIDEO_MEYE=m +# CONFIG_VIDEO_SOLO6X10 is not set +CONFIG_VIDEO_TW5864=m +CONFIG_VIDEO_TW68=m +CONFIG_VIDEO_TW686X=m + +# +# Media capture/analog TV support +# +CONFIG_VIDEO_IVTV=m +CONFIG_VIDEO_IVTV_ALSA=m +CONFIG_VIDEO_FB_IVTV=m +# CONFIG_VIDEO_FB_IVTV_FORCE_PAT is not set +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DT3155=m + +# +# Media capture/analog/hybrid TV support +# +CONFIG_VIDEO_CX18=m +CONFIG_VIDEO_CX18_ALSA=m +CONFIG_VIDEO_CX23885=m +CONFIG_MEDIA_ALTERA_CI=m +CONFIG_VIDEO_CX25821=m +CONFIG_VIDEO_CX25821_ALSA=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_CX88_ALSA=m +CONFIG_VIDEO_CX88_BLACKBIRD=m +CONFIG_VIDEO_CX88_DVB=m +CONFIG_VIDEO_CX88_ENABLE_VP3054=y +CONFIG_VIDEO_CX88_VP3054=m +CONFIG_VIDEO_CX88_MPEG=m +CONFIG_VIDEO_BT848=m +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_SAA7134_ALSA=m +CONFIG_VIDEO_SAA7134_RC=y +CONFIG_VIDEO_SAA7134_DVB=m +CONFIG_VIDEO_SAA7134_GO7007=m +CONFIG_VIDEO_SAA7164=m + +# +# Media digital TV PCI Adapters +# +CONFIG_DVB_BUDGET_CORE=m +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_B2C2_FLEXCOP_PCI=m +# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set +CONFIG_DVB_PLUTO2=m +CONFIG_DVB_DM1105=m +CONFIG_DVB_PT1=m +CONFIG_DVB_PT3=m +CONFIG_MANTIS_CORE=m +CONFIG_DVB_MANTIS=m +CONFIG_DVB_HOPPER=m +CONFIG_DVB_NGENE=m +CONFIG_DVB_DDBRIDGE=m +# CONFIG_DVB_DDBRIDGE_MSIENABLE is not set +CONFIG_DVB_SMIPCIE=m +CONFIG_DVB_NETUP_UNIDVB=m +# CONFIG_VIDEO_IPU3_CIO2 is not set +CONFIG_RADIO_ADAPTERS=y +CONFIG_RADIO_TEA575X=m +CONFIG_RADIO_SI470X=m +CONFIG_USB_SI470X=m +CONFIG_I2C_SI470X=m +CONFIG_RADIO_SI4713=m +CONFIG_USB_SI4713=m +CONFIG_PLATFORM_SI4713=m +CONFIG_I2C_SI4713=m +CONFIG_RADIO_SI476X=m +CONFIG_USB_MR800=m +CONFIG_USB_DSBR=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_USB_KEENE=m +CONFIG_USB_RAREMONO=m +CONFIG_USB_MA901=m +CONFIG_RADIO_TEA5764=m +CONFIG_RADIO_SAA7706H=m +CONFIG_RADIO_TEF6862=m +CONFIG_RADIO_WL1273=m +CONFIG_RADIO_WL128X=m +CONFIG_MEDIA_COMMON_OPTIONS=y + +# +# common driver options +# +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_TTPCI_EEPROM=m +CONFIG_CYPRESS_FIRMWARE=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +CONFIG_VIDEOBUF2_DVB=m +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_SMS_SIANO_MDTV=m +CONFIG_SMS_SIANO_RC=y +# CONFIG_SMS_SIANO_DEBUGFS is not set +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VIDEO_CAFE_CCIC=m +CONFIG_VIDEO_VIA_CAMERA=m +# CONFIG_VIDEO_CADENCE is not set +CONFIG_VIDEO_ASPEED=m +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_SDR_PLATFORM_DRIVERS=y + +# +# MMC/SDIO DVB adapters +# +CONFIG_SMS_SDIO_DRV=m +# CONFIG_V4L_TEST_DRIVERS is not set +# CONFIG_DVB_TEST_DRIVERS is not set + +# +# FireWire (IEEE 1394) Adapters +# +# CONFIG_DVB_FIREDTV is not set +# end of Media drivers + +# +# Media ancillary drivers +# +CONFIG_MEDIA_ATTACH=y + +# +# IR I2C driver auto-selected by 'Autoselect ancillary drivers' +# +CONFIG_VIDEO_IR_I2C=m + +# +# Audio decoders, processors and mixers +# +CONFIG_VIDEO_TVAUDIO=m +CONFIG_VIDEO_TDA7432=m +CONFIG_VIDEO_TDA9840=m +# CONFIG_VIDEO_TDA1997X is not set +CONFIG_VIDEO_TEA6415C=m +CONFIG_VIDEO_TEA6420=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS3308=m +CONFIG_VIDEO_CS5345=m +CONFIG_VIDEO_CS53L32A=m +# CONFIG_VIDEO_TLV320AIC23B is not set +CONFIG_VIDEO_UDA1342=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_VP27SMPX=m +CONFIG_VIDEO_SONY_BTF_MPX=m +# end of Audio decoders, processors and mixers + +# +# RDS decoders +# +CONFIG_VIDEO_SAA6588=m +# end of RDS decoders + +# +# Video decoders +# +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7183 is not set +# CONFIG_VIDEO_ADV7604 is not set +# CONFIG_VIDEO_ADV7842 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_ML86V7667 is not set +# CONFIG_VIDEO_SAA7110 is not set +CONFIG_VIDEO_SAA711X=m +# CONFIG_VIDEO_TC358743 is not set +# CONFIG_VIDEO_TVP514X is not set +CONFIG_VIDEO_TVP5150=m +# CONFIG_VIDEO_TVP7002 is not set +CONFIG_VIDEO_TW2804=m +CONFIG_VIDEO_TW9903=m +CONFIG_VIDEO_TW9906=m +# CONFIG_VIDEO_TW9910 is not set +# CONFIG_VIDEO_VPX3220 is not set + +# +# Video and audio decoders +# +CONFIG_VIDEO_SAA717X=m +CONFIG_VIDEO_CX25840=m +# end of Video decoders + +# +# Video encoders +# +CONFIG_VIDEO_SAA7127=m +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV7393 is not set +# CONFIG_VIDEO_ADV7511 is not set +# CONFIG_VIDEO_AD9389B is not set +# CONFIG_VIDEO_AK881X is not set +# CONFIG_VIDEO_THS8200 is not set +# end of Video encoders + +# +# Video improvement chips +# +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m +# end of Video improvement chips + +# +# Audio/Video compression chips +# +CONFIG_VIDEO_SAA6752HS=m +# end of Audio/Video compression chips + +# +# SDR tuner chips +# +CONFIG_SDR_MAX2175=m +# end of SDR tuner chips + +# +# Miscellaneous helper chips +# +# CONFIG_VIDEO_THS7303 is not set +CONFIG_VIDEO_M52790=m +# CONFIG_VIDEO_I2C is not set +# CONFIG_VIDEO_ST_MIPID02 is not set +# end of Miscellaneous helper chips + +# +# Camera sensor devices +# +CONFIG_VIDEO_HI556=m +CONFIG_VIDEO_HI846=m +CONFIG_VIDEO_IMX208=m +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_OV02A10 is not set +CONFIG_VIDEO_OV2640=m +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV2740 is not set +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV6650 is not set +# CONFIG_VIDEO_OV5670 is not set +CONFIG_VIDEO_OV5675=m +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV7251 is not set +# CONFIG_VIDEO_OV772X is not set +CONFIG_VIDEO_OV7640=m +CONFIG_VIDEO_OV7670=m +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_OV9734 is not set +# CONFIG_VIDEO_OV13858 is not set +CONFIG_VIDEO_OV13B10=m +# CONFIG_VIDEO_VS6624 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M032 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T001 is not set +# CONFIG_VIDEO_MT9T112 is not set +CONFIG_VIDEO_MT9V011=m +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_SR030PC30 is not set +# CONFIG_VIDEO_NOON010PC30 is not set +# CONFIG_VIDEO_M5MOLS is not set +CONFIG_VIDEO_MAX9271_LIB=m +CONFIG_VIDEO_RDACM20=m +CONFIG_VIDEO_RDACM21=m +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_S5K6AA is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_S5K4ECGX is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_ET8EK8 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# end of Camera sensor devices + +# +# Lens drivers +# +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_DW9714 is not set +CONFIG_VIDEO_DW9768=m +# CONFIG_VIDEO_DW9807_VCM is not set +# end of Lens drivers + +# +# Flash devices +# +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# end of Flash devices + +# +# SPI helper chips +# +# CONFIG_VIDEO_GS1662 is not set +# end of SPI helper chips + +# +# Media SPI Adapters +# +CONFIG_CXD2880_SPI_DRV=m +# end of Media SPI Adapters + +CONFIG_MEDIA_TUNER=m + +# +# Customize TV tuners +# +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA18250=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA827X=m +CONFIG_MEDIA_TUNER_TDA18271=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MSI001=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT2266=m +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_MEDIA_TUNER_XC4000=m +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +CONFIG_MEDIA_TUNER_MC44S803=m +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_M88RS6000T=m +CONFIG_MEDIA_TUNER_TUA9001=m +CONFIG_MEDIA_TUNER_SI2157=m +CONFIG_MEDIA_TUNER_IT913X=m +CONFIG_MEDIA_TUNER_R820T=m +CONFIG_MEDIA_TUNER_MXL301RF=m +CONFIG_MEDIA_TUNER_QM1D1C0042=m +CONFIG_MEDIA_TUNER_QM1D1B0004=m +# end of Customize TV tuners + +# +# Customise DVB Frontends +# + +# +# Multistandard (satellite) frontends +# +CONFIG_DVB_STB0899=m +CONFIG_DVB_STB6100=m +CONFIG_DVB_STV090x=m +CONFIG_DVB_STV0910=m +CONFIG_DVB_STV6110x=m +CONFIG_DVB_STV6111=m +CONFIG_DVB_MXL5XX=m +CONFIG_DVB_M88DS3103=m + +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_TDA18271C2DD=m +CONFIG_DVB_SI2165=m +CONFIG_DVB_MN88472=m +CONFIG_DVB_MN88473=m + +# +# DVB-S (satellite) frontends +# +CONFIG_DVB_CX24110=m +CONFIG_DVB_CX24123=m +CONFIG_DVB_MT312=m +CONFIG_DVB_ZL10036=m +CONFIG_DVB_ZL10039=m +CONFIG_DVB_S5H1420=m +CONFIG_DVB_STV0288=m +CONFIG_DVB_STB6000=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_STV6110=m +CONFIG_DVB_STV0900=m +CONFIG_DVB_TDA8083=m +CONFIG_DVB_TDA10086=m +CONFIG_DVB_TDA8261=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TUNER_ITD1000=m +CONFIG_DVB_TUNER_CX24113=m +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TUA6100=m +CONFIG_DVB_CX24116=m +CONFIG_DVB_CX24117=m +CONFIG_DVB_CX24120=m +CONFIG_DVB_SI21XX=m +CONFIG_DVB_TS2020=m +CONFIG_DVB_DS3000=m +CONFIG_DVB_MB86A16=m +CONFIG_DVB_TDA10071=m + +# +# DVB-T (terrestrial) frontends +# +CONFIG_DVB_SP887X=m +CONFIG_DVB_CX22700=m +CONFIG_DVB_CX22702=m +# CONFIG_DVB_S5H1432 is not set +CONFIG_DVB_DRXD=m +CONFIG_DVB_L64781=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_NXT6000=m +CONFIG_DVB_MT352=m +CONFIG_DVB_ZL10353=m +CONFIG_DVB_DIB3000MB=m +CONFIG_DVB_DIB3000MC=m +CONFIG_DVB_DIB7000M=m +CONFIG_DVB_DIB7000P=m +# CONFIG_DVB_DIB9000 is not set +CONFIG_DVB_TDA10048=m +CONFIG_DVB_AF9013=m +CONFIG_DVB_EC100=m +CONFIG_DVB_STV0367=m +CONFIG_DVB_CXD2820R=m +CONFIG_DVB_CXD2841ER=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m +CONFIG_DVB_RTL2832_SDR=m +CONFIG_DVB_SI2168=m +CONFIG_DVB_AS102_FE=m +CONFIG_DVB_ZD1301_DEMOD=m +CONFIG_DVB_GP8PSK_FE=m +# CONFIG_DVB_CXD2880 is not set + +# +# DVB-C (cable) frontends +# +CONFIG_DVB_VES1820=m +CONFIG_DVB_TDA10021=m +CONFIG_DVB_TDA10023=m +CONFIG_DVB_STV0297=m + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +CONFIG_DVB_NXT200X=m +CONFIG_DVB_OR51211=m +CONFIG_DVB_OR51132=m +CONFIG_DVB_BCM3510=m +CONFIG_DVB_LGDT330X=m +CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LGDT3306A=m +CONFIG_DVB_LG2160=m +CONFIG_DVB_S5H1409=m +CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m +CONFIG_DVB_S5H1411=m +CONFIG_DVB_MXL692=m + +# +# ISDB-T (terrestrial) frontends +# +CONFIG_DVB_S921=m +CONFIG_DVB_DIB8000=m +CONFIG_DVB_MB86A20S=m + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +CONFIG_DVB_TC90522=m +# CONFIG_DVB_MN88443X is not set + +# +# Digital terrestrial only tuners/PLL +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m + +# +# SEC control devices for DVB-S +# +CONFIG_DVB_DRX39XYJ=m +CONFIG_DVB_LNBH25=m +# CONFIG_DVB_LNBH29 is not set +CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m +CONFIG_DVB_A8293=m +# CONFIG_DVB_LGS8GL5 is not set +CONFIG_DVB_LGS8GXX=m +CONFIG_DVB_ATBM8830=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_IX2505V=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_AF9033=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m + +# +# Common Interface (EN50221) controller drivers +# +CONFIG_DVB_CXD2099=m +CONFIG_DVB_SP2=m +# end of Customise DVB Frontends + +# +# Tools to develop new frontends +# +CONFIG_DVB_DUMMY_FE=m +# end of Media ancillary drivers + +# +# Graphics support +# +CONFIG_AGP=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_SIS=m +CONFIG_AGP_VIA=m +CONFIG_INTEL_GTT=m +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +CONFIG_VGA_SWITCHEROO=y +CONFIG_DRM=m +CONFIG_DRM_MIPI_DBI=m +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_DP_AUX_CHARDEV=y +# CONFIG_DRM_DEBUG_SELFTEST is not set +CONFIG_DRM_KMS_HELPER=m +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_DP_CEC=y +CONFIG_DRM_TTM=m +CONFIG_DRM_VRAM_HELPER=m +CONFIG_DRM_TTM_HELPER=m +CONFIG_DRM_GEM_CMA_HELPER=y +CONFIG_DRM_KMS_CMA_HELPER=y +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SCHED=m + +# +# I2C encoder or helper chips +# +CONFIG_DRM_I2C_CH7006=m +CONFIG_DRM_I2C_SIL164=m +CONFIG_DRM_I2C_NXP_TDA998X=m +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# end of I2C encoder or helper chips + +# +# ARM devices +# +# end of ARM devices + +CONFIG_DRM_RADEON=m +CONFIG_DRM_RADEON_USERPTR=y +CONFIG_DRM_AMDGPU=m +CONFIG_DRM_AMDGPU_SI=y +CONFIG_DRM_AMDGPU_CIK=y +CONFIG_DRM_AMDGPU_USERPTR=y + +# +# ACP (Audio CoProcessor) Configuration +# +CONFIG_DRM_AMD_ACP=y +# end of ACP (Audio CoProcessor) Configuration + +# +# Display Engine Configuration +# +CONFIG_DRM_AMD_DC=y +CONFIG_DRM_AMD_DC_DCN=y +# CONFIG_DRM_AMD_DC_HDCP is not set +# CONFIG_DRM_AMD_DC_SI is not set +CONFIG_DRM_AMD_SECURE_DISPLAY=y +# end of Display Engine Configuration + +CONFIG_HSA_AMD=y +CONFIG_DRM_NOUVEAU=m +CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT=y +CONFIG_NOUVEAU_DEBUG=5 +CONFIG_NOUVEAU_DEBUG_DEFAULT=3 +# CONFIG_NOUVEAU_DEBUG_MMU is not set +# CONFIG_NOUVEAU_DEBUG_PUSH is not set +CONFIG_DRM_NOUVEAU_BACKLIGHT=y +CONFIG_DRM_I915=m +CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +CONFIG_DRM_I915_USERPTR=y +CONFIG_DRM_I915_GVT=y +CONFIG_DRM_I915_GVT_KVMGT=m +CONFIG_DRM_I915_PXP=y + +# +# drm/i915 Debugging +# +# CONFIG_DRM_I915_WERROR is not set +# CONFIG_DRM_I915_DEBUG is not set +# CONFIG_DRM_I915_DEBUG_MMIO is not set +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set +# CONFIG_DRM_I915_DEBUG_GUC is not set +# CONFIG_DRM_I915_SELFTEST is not set +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set +# end of drm/i915 Debugging + +# +# drm/i915 Profile Guided Optimisation +# +CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 +CONFIG_DRM_I915_FENCE_TIMEOUT=10000 +CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 +CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 +CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 +CONFIG_DRM_I915_STOP_TIMEOUT=100 +CONFIG_DRM_I915_TIMESLICE_DURATION=1 +# end of drm/i915 Profile Guided Optimisation + +CONFIG_DRM_VGEM=m +CONFIG_DRM_VKMS=m +CONFIG_DRM_VMWGFX=m +CONFIG_DRM_VMWGFX_FBCON=y +# CONFIG_DRM_VMWGFX_MKSSTATS is not set +CONFIG_DRM_GMA500=m +CONFIG_DRM_UDL=m +CONFIG_DRM_AST=m +CONFIG_DRM_MGAG200=m +CONFIG_DRM_QXL=m +CONFIG_DRM_VIRTIO_GPU=m +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_PANEL_WIDECHIPS_WS2401=m +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +CONFIG_DRM_ANALOGIX_ANX78XX=m +CONFIG_DRM_ANALOGIX_DP=m +# end of Display Interface Bridges + +# CONFIG_DRM_ETNAVIV is not set +CONFIG_DRM_BOCHS=m +CONFIG_DRM_CIRRUS_QEMU=m +CONFIG_DRM_GM12U320=m +CONFIG_DRM_SIMPLEDRM=m +CONFIG_TINYDRM_HX8357D=m +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +CONFIG_TINYDRM_MI0283QT=m +CONFIG_TINYDRM_REPAPER=m +CONFIG_TINYDRM_ST7586=m +# CONFIG_TINYDRM_ST7735R is not set +CONFIG_DRM_XEN=y +CONFIG_DRM_XEN_FRONTEND=m +CONFIG_DRM_VBOXVIDEO=m +CONFIG_DRM_GUD=m +CONFIG_DRM_HYPERV=m +CONFIG_DRM_LEGACY=y +# CONFIG_DRM_TDFX is not set +# CONFIG_DRM_R128 is not set +# CONFIG_DRM_MGA is not set +# CONFIG_DRM_SIS is not set +# CONFIG_DRM_VIA is not set +# CONFIG_DRM_SAVAGE is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DDC=m +CONFIG_FB_BOOT_VESA_SUPPORT=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SYS_FILLRECT=m +CONFIG_FB_SYS_COPYAREA=m +CONFIG_FB_SYS_IMAGEBLIT=m +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=m +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_BACKLIGHT=m +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_UVESA=m +CONFIG_FB_VESA=y +CONFIG_FB_EFI=y +# CONFIG_FB_N411 is not set +# CONFIG_FB_HGA is not set +CONFIG_FB_OPENCORES=m +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_LE80578 is not set +CONFIG_FB_INTEL=m +# CONFIG_FB_INTEL_DEBUG is not set +CONFIG_FB_INTEL_I2C=y +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +CONFIG_FB_VIA=m +CONFIG_FB_VIA_DIRECT_PROCFS=y +CONFIG_FB_VIA_X_COMPATIBILITY=y +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SM501 is not set +# CONFIG_FB_SMSCUFX is not set +CONFIG_FB_UDL=m +CONFIG_FB_IBM_GXT4500=m +# CONFIG_FB_VIRTUAL is not set +CONFIG_XEN_FBDEV_FRONTEND=m +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +CONFIG_FB_HYPERV=m +# CONFIG_FB_SIMPLE is not set +CONFIG_FB_SSD1307=m +CONFIG_FB_SM712=m +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_L4F00242T03=m +CONFIG_LCD_LMS283GF05=m +CONFIG_LCD_LTV350QV=m +CONFIG_LCD_ILI922X=m +CONFIG_LCD_ILI9320=m +CONFIG_LCD_TDO24M=m +CONFIG_LCD_VGG2432A4=m +CONFIG_LCD_PLATFORM=m +CONFIG_LCD_AMS369FG06=m +CONFIG_LCD_LMS501KF03=m +CONFIG_LCD_HX8357=m +# CONFIG_LCD_OTM3225A is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_KTD253=m +CONFIG_BACKLIGHT_LM3533=m +CONFIG_BACKLIGHT_PWM=m +CONFIG_BACKLIGHT_DA9052=m +CONFIG_BACKLIGHT_APPLE=m +CONFIG_BACKLIGHT_QCOM_WLED=m +CONFIG_BACKLIGHT_RT4831=m +CONFIG_BACKLIGHT_SAHARA=m +# CONFIG_BACKLIGHT_WM831X is not set +CONFIG_BACKLIGHT_ADP8860=m +CONFIG_BACKLIGHT_ADP8870=m +CONFIG_BACKLIGHT_PCF50633=m +CONFIG_BACKLIGHT_LM3630A=m +CONFIG_BACKLIGHT_LM3639=m +CONFIG_BACKLIGHT_LP855X=m +CONFIG_BACKLIGHT_SKY81452=m +CONFIG_BACKLIGHT_GPIO=m +CONFIG_BACKLIGHT_LV5207LP=m +CONFIG_BACKLIGHT_BD6107=m +# CONFIG_BACKLIGHT_ARCXCNN is not set +# end of Backlight & LCD device support + +CONFIG_VGASTATE=m +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y +# end of Console display driver support + +# CONFIG_LOGO is not set +# end of Graphics support + +CONFIG_SOUND=m +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_DMAENGINE_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_SEQ_DEVICE=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_COMPRESS_OFFLOAD=m +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=m +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y +CONFIG_SND_DMA_SGBUF=y +CONFIG_SND_CTL_LED=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SEQUENCER_OSS=m +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=m +CONFIG_SND_SEQ_MIDI=m +CONFIG_SND_SEQ_MIDI_EMUL=m +CONFIG_SND_SEQ_VIRMIDI=m +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL3_LIB_SEQ=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DRIVERS=y +# CONFIG_SND_PCSP is not set +CONFIG_SND_DUMMY=m +CONFIG_SND_ALOOP=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_MTS64=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m +CONFIG_SND_PORTMAN2X4=m +CONFIG_SND_AC97_POWER_SAVE=y +CONFIG_SND_AC97_POWER_SAVE_DEFAULT=1 +CONFIG_SND_SB_COMMON=m +CONFIG_SND_PCI=y +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ASIHPI=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_ATIIXP_MODEM=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AW2=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +# CONFIG_SND_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_OXYGEN_LIB=m +CONFIG_SND_OXYGEN=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CTXFI=m +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_INDIGOIOX=m +CONFIG_SND_INDIGODJX=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1_SEQ=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_ES1968_INPUT=y +# CONFIG_SND_ES1968_RADIO is not set +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_LOLA=m +CONFIG_SND_LX6464ES=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MAESTRO3_INPUT=y +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VIRTUOSO=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m + +# +# HD-Audio +# +CONFIG_SND_HDA=m +CONFIG_SND_HDA_GENERIC_LEDS=y +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDA_HWDEP=y +CONFIG_SND_HDA_RECONFIG=y +CONFIG_SND_HDA_INPUT_BEEP=y +CONFIG_SND_HDA_INPUT_BEEP_MODE=1 +CONFIG_SND_HDA_PATCH_LOADER=y +CONFIG_SND_HDA_CODEC_REALTEK=m +CONFIG_SND_HDA_CODEC_ANALOG=m +CONFIG_SND_HDA_CODEC_SIGMATEL=m +CONFIG_SND_HDA_CODEC_VIA=m +CONFIG_SND_HDA_CODEC_HDMI=m +CONFIG_SND_HDA_CODEC_CIRRUS=m +CONFIG_SND_HDA_CODEC_CS8409=m +CONFIG_SND_HDA_CODEC_CONEXANT=m +CONFIG_SND_HDA_CODEC_CA0110=m +CONFIG_SND_HDA_CODEC_CA0132=m +CONFIG_SND_HDA_CODEC_CA0132_DSP=y +CONFIG_SND_HDA_CODEC_CMEDIA=m +CONFIG_SND_HDA_CODEC_SI3054=m +CONFIG_SND_HDA_GENERIC=m +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1 +# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set +# end of HD-Audio + +CONFIG_SND_HDA_CORE=m +CONFIG_SND_HDA_DSP_LOADER=y +CONFIG_SND_HDA_COMPONENT=y +CONFIG_SND_HDA_I915=y +CONFIG_SND_HDA_EXT_CORE=m +CONFIG_SND_HDA_PREALLOC_SIZE=0 +CONFIG_SND_INTEL_NHLT=y +CONFIG_SND_INTEL_DSP_CONFIG=m +CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m +# CONFIG_SND_INTEL_BYT_PREFER_SOF is not set +CONFIG_SND_SPI=y +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +CONFIG_SND_USB_UA101=m +CONFIG_SND_USB_USX2Y=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_US122L=m +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m +# CONFIG_SND_BCD2000 is not set +CONFIG_SND_USB_LINE6=m +CONFIG_SND_USB_POD=m +CONFIG_SND_USB_PODHD=m +CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_USB_VARIAX=m +CONFIG_SND_FIREWIRE=y +CONFIG_SND_FIREWIRE_LIB=m +CONFIG_SND_DICE=m +CONFIG_SND_OXFW=m +# CONFIG_SND_ISIGHT is not set +# CONFIG_SND_FIREWORKS is not set +# CONFIG_SND_BEBOB is not set +CONFIG_SND_FIREWIRE_DIGI00X=m +CONFIG_SND_FIREWIRE_TASCAM=m +# CONFIG_SND_FIREWIRE_MOTU is not set +# CONFIG_SND_FIREFACE is not set +CONFIG_SND_SOC=m +CONFIG_SND_SOC_AC97_BUS=y +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +CONFIG_SND_SOC_COMPRESS=y +CONFIG_SND_SOC_TOPOLOGY=y +CONFIG_SND_SOC_ACPI=m +# CONFIG_SND_SOC_ADI is not set +CONFIG_SND_SOC_AMD_ACP=m +CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH=m +CONFIG_SND_SOC_AMD_CZ_RT5645_MACH=m +CONFIG_SND_SOC_AMD_ACP3x=m +CONFIG_SND_SOC_AMD_RV_RT5682_MACH=m +CONFIG_SND_SOC_AMD_RENOIR=m +CONFIG_SND_SOC_AMD_RENOIR_MACH=m +CONFIG_SND_SOC_AMD_ACP5x=m +CONFIG_SND_SOC_AMD_VANGOGH_MACH=m +CONFIG_SND_SOC_AMD_ACP6x=m +CONFIG_SND_SOC_AMD_YC_MACH=m +CONFIG_SND_SOC_AMD_ACP_COMMON=m +CONFIG_SND_SOC_AMD_ACP_I2S=m +CONFIG_SND_SOC_AMD_ACP_PCM=m +CONFIG_SND_AMD_ASOC_RENOIR=m +CONFIG_SND_SOC_AMD_MACH_COMMON=m +CONFIG_SND_SOC_AMD_LEGACY_MACH=m +CONFIG_SND_SOC_AMD_SOF_MACH=m +CONFIG_SND_ATMEL_SOC=m +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +CONFIG_SND_DESIGNWARE_I2S=m +# CONFIG_SND_DESIGNWARE_PCM is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +CONFIG_SND_SOC_FSL_AUDMIX=m +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +CONFIG_SND_SOC_FSL_MICFIL=m +# CONFIG_SND_SOC_FSL_XCVR is not set +CONFIG_SND_SOC_FSL_RPMSG=m +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_I2S_HI6210_I2S is not set +CONFIG_SND_SOC_IMG=y +CONFIG_SND_SOC_IMG_I2S_IN=m +CONFIG_SND_SOC_IMG_I2S_OUT=m +CONFIG_SND_SOC_IMG_PARALLEL_OUT=m +CONFIG_SND_SOC_IMG_SPDIF_IN=m +CONFIG_SND_SOC_IMG_SPDIF_OUT=m +CONFIG_SND_SOC_IMG_PISTACHIO_INTERNAL_DAC=m +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y +CONFIG_SND_SOC_INTEL_SST=m +CONFIG_SND_SOC_INTEL_CATPT=m +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=m +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI=m +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI=m +CONFIG_SND_SOC_INTEL_SKYLAKE=m +CONFIG_SND_SOC_INTEL_SKL=m +CONFIG_SND_SOC_INTEL_APL=m +CONFIG_SND_SOC_INTEL_KBL=m +CONFIG_SND_SOC_INTEL_GLK=m +CONFIG_SND_SOC_INTEL_CNL=m +CONFIG_SND_SOC_INTEL_CFL=m +# CONFIG_SND_SOC_INTEL_CML_H is not set +# CONFIG_SND_SOC_INTEL_CML_LP is not set +CONFIG_SND_SOC_INTEL_SKYLAKE_FAMILY=m +CONFIG_SND_SOC_INTEL_SKYLAKE_SSP_CLK=m +CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC=y +CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON=m +CONFIG_SND_SOC_ACPI_INTEL_MATCH=m +CONFIG_SND_SOC_INTEL_MACH=y +CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES=y +CONFIG_SND_SOC_INTEL_HDA_DSP_COMMON=m +CONFIG_SND_SOC_INTEL_SOF_MAXIM_COMMON=m +CONFIG_SND_SOC_INTEL_HASWELL_MACH=m +CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH=m +CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH=m +CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m +CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=m +CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=m +CONFIG_SND_SOC_INTEL_BYTCR_WM5102_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH=m +CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_DA7219_MAX98357A_GENERIC=m +CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON=m +CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_BXT_RT298_MACH=m +CONFIG_SND_SOC_INTEL_SOF_WM8804_MACH=m +CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m +CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m +CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH=m +CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH=m +CONFIG_SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m +CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH=m +CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH=m +CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH=m +CONFIG_SND_SOC_INTEL_SOF_ES8336_MACH=m +CONFIG_SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH=m +CONFIG_SND_SOC_INTEL_SOF_DA7219_MAX98373_MACH=m +CONFIG_SND_SOC_INTEL_EHL_RT5660_MACH=m +CONFIG_SND_SOC_INTEL_SOUNDWIRE_SOF_MACH=m +CONFIG_SND_SOC_MTK_BTCVSD=m +CONFIG_SND_SOC_SOF_TOPLEVEL=y +CONFIG_SND_SOC_SOF_PCI_DEV=m +CONFIG_SND_SOC_SOF_PCI=m +CONFIG_SND_SOC_SOF_ACPI=m +CONFIG_SND_SOC_SOF_ACPI_DEV=m +# CONFIG_SND_SOC_SOF_DEBUG_PROBES is not set +# CONFIG_SND_SOC_SOF_DEVELOPER_SUPPORT is not set +CONFIG_SND_SOC_SOF=m +CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE=y +CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL=y +CONFIG_SND_SOC_SOF_INTEL_HIFI_EP_IPC=m +CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP=m +CONFIG_SND_SOC_SOF_INTEL_COMMON=m +CONFIG_SND_SOC_SOF_BAYTRAIL=m +CONFIG_SND_SOC_SOF_BROADWELL=m +CONFIG_SND_SOC_SOF_MERRIFIELD=m +CONFIG_SND_SOC_SOF_INTEL_APL=m +CONFIG_SND_SOC_SOF_APOLLOLAKE=m +CONFIG_SND_SOC_SOF_GEMINILAKE=m +CONFIG_SND_SOC_SOF_INTEL_CNL=m +CONFIG_SND_SOC_SOF_CANNONLAKE=m +CONFIG_SND_SOC_SOF_COFFEELAKE=m +CONFIG_SND_SOC_SOF_COMETLAKE=m +CONFIG_SND_SOC_SOF_INTEL_ICL=m +CONFIG_SND_SOC_SOF_ICELAKE=m +CONFIG_SND_SOC_SOF_JASPERLAKE=m +CONFIG_SND_SOC_SOF_INTEL_TGL=m +CONFIG_SND_SOC_SOF_TIGERLAKE=m +CONFIG_SND_SOC_SOF_ELKHARTLAKE=m +CONFIG_SND_SOC_SOF_ALDERLAKE=m +CONFIG_SND_SOC_SOF_HDA_COMMON=m +CONFIG_SND_SOC_SOF_HDA_LINK=y +CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC=y +CONFIG_SND_SOC_SOF_HDA_LINK_BASELINE=m +CONFIG_SND_SOC_SOF_HDA=m +CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE=m +CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE=m +CONFIG_SND_SOC_SOF_XTENSA=m + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +CONFIG_SND_SOC_XILINX_I2S=m +CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER=m +CONFIG_SND_SOC_XILINX_SPDIF=m +CONFIG_SND_SOC_XTFPGA_I2S=m +CONFIG_SND_SOC_I2C_AND_SPI=m + +# +# CODEC drivers +# +CONFIG_SND_SOC_ARIZONA=m +CONFIG_SND_SOC_WM_ADSP=m +CONFIG_SND_SOC_AC97_CODEC=m +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +CONFIG_SND_SOC_ADAU1701=m +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +CONFIG_SND_SOC_ADAU7002=m +CONFIG_SND_SOC_ADAU7118=m +CONFIG_SND_SOC_ADAU7118_HW=m +CONFIG_SND_SOC_ADAU7118_I2C=m +CONFIG_SND_SOC_AK4104=m +CONFIG_SND_SOC_AK4118=m +CONFIG_SND_SOC_AK4458=m +CONFIG_SND_SOC_AK4554=m +CONFIG_SND_SOC_AK4613=m +CONFIG_SND_SOC_AK4642=m +CONFIG_SND_SOC_AK5386=m +CONFIG_SND_SOC_AK5558=m +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_BD28623 is not set +CONFIG_SND_SOC_BT_SCO=m +CONFIG_SND_SOC_CROS_EC_CODEC=m +CONFIG_SND_SOC_CS35L32=m +CONFIG_SND_SOC_CS35L33=m +CONFIG_SND_SOC_CS35L34=m +# CONFIG_SND_SOC_CS35L35 is not set +CONFIG_SND_SOC_CS35L36=m +CONFIG_SND_SOC_CS35L41_SPI=m +CONFIG_SND_SOC_CS35L41_I2C=m +CONFIG_SND_SOC_CS42L42=m +CONFIG_SND_SOC_CS42L51=m +CONFIG_SND_SOC_CS42L51_I2C=m +CONFIG_SND_SOC_CS42L52=m +# CONFIG_SND_SOC_CS42L56 is not set +CONFIG_SND_SOC_CS42L73=m +CONFIG_SND_SOC_CS4234=m +# CONFIG_SND_SOC_CS4265 is not set +CONFIG_SND_SOC_CS4270=m +CONFIG_SND_SOC_CS4271=m +CONFIG_SND_SOC_CS4271_I2C=m +CONFIG_SND_SOC_CS4271_SPI=m +CONFIG_SND_SOC_CS42XX8=m +CONFIG_SND_SOC_CS42XX8_I2C=m +CONFIG_SND_SOC_CS43130=m +CONFIG_SND_SOC_CS4341=m +CONFIG_SND_SOC_CS4349=m +CONFIG_SND_SOC_CS53L30=m +CONFIG_SND_SOC_CX2072X=m +CONFIG_SND_SOC_DA7213=m +CONFIG_SND_SOC_DA7219=m +CONFIG_SND_SOC_DMIC=m +CONFIG_SND_SOC_HDMI_CODEC=m +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +CONFIG_SND_SOC_ES8316=m +CONFIG_SND_SOC_ES8328=m +CONFIG_SND_SOC_ES8328_I2C=m +CONFIG_SND_SOC_ES8328_SPI=m +CONFIG_SND_SOC_GTM601=m +CONFIG_SND_SOC_HDAC_HDMI=m +CONFIG_SND_SOC_HDAC_HDA=m +CONFIG_SND_SOC_ICS43432=m +CONFIG_SND_SOC_INNO_RK3036=m +CONFIG_SND_SOC_MAX98088=m +CONFIG_SND_SOC_MAX98090=m +CONFIG_SND_SOC_MAX98357A=m +CONFIG_SND_SOC_MAX98504=m +CONFIG_SND_SOC_MAX9867=m +CONFIG_SND_SOC_MAX98927=m +CONFIG_SND_SOC_MAX98520=m +CONFIG_SND_SOC_MAX98373=m +CONFIG_SND_SOC_MAX98373_I2C=m +CONFIG_SND_SOC_MAX98373_SDW=m +CONFIG_SND_SOC_MAX98390=m +CONFIG_SND_SOC_MAX9860=m +CONFIG_SND_SOC_MSM8916_WCD_ANALOG=m +CONFIG_SND_SOC_MSM8916_WCD_DIGITAL=m +CONFIG_SND_SOC_PCM1681=m +CONFIG_SND_SOC_PCM1789=m +CONFIG_SND_SOC_PCM1789_I2C=m +CONFIG_SND_SOC_PCM179X=m +CONFIG_SND_SOC_PCM179X_I2C=m +CONFIG_SND_SOC_PCM179X_SPI=m +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +CONFIG_SND_SOC_PCM3060=m +CONFIG_SND_SOC_PCM3060_I2C=m +CONFIG_SND_SOC_PCM3060_SPI=m +CONFIG_SND_SOC_PCM3168A=m +CONFIG_SND_SOC_PCM3168A_I2C=m +CONFIG_SND_SOC_PCM3168A_SPI=m +# CONFIG_SND_SOC_PCM5102A is not set +CONFIG_SND_SOC_PCM512x=m +CONFIG_SND_SOC_PCM512x_I2C=m +CONFIG_SND_SOC_PCM512x_SPI=m +CONFIG_SND_SOC_RK3328=m +CONFIG_SND_SOC_RL6231=m +CONFIG_SND_SOC_RL6347A=m +CONFIG_SND_SOC_RT286=m +CONFIG_SND_SOC_RT298=m +CONFIG_SND_SOC_RT1011=m +CONFIG_SND_SOC_RT1015=m +CONFIG_SND_SOC_RT1015P=m +CONFIG_SND_SOC_RT1019=m +CONFIG_SND_SOC_RT1308=m +CONFIG_SND_SOC_RT1308_SDW=m +CONFIG_SND_SOC_RT1316_SDW=m +CONFIG_SND_SOC_RT5514=m +CONFIG_SND_SOC_RT5514_SPI=m +CONFIG_SND_SOC_RT5616=m +CONFIG_SND_SOC_RT5631=m +CONFIG_SND_SOC_RT5640=m +CONFIG_SND_SOC_RT5645=m +CONFIG_SND_SOC_RT5651=m +CONFIG_SND_SOC_RT5659=m +CONFIG_SND_SOC_RT5660=m +CONFIG_SND_SOC_RT5663=m +CONFIG_SND_SOC_RT5670=m +CONFIG_SND_SOC_RT5677=m +CONFIG_SND_SOC_RT5677_SPI=m +CONFIG_SND_SOC_RT5682=m +CONFIG_SND_SOC_RT5682_I2C=m +CONFIG_SND_SOC_RT5682_SDW=m +CONFIG_SND_SOC_RT5682S=m +CONFIG_SND_SOC_RT700=m +CONFIG_SND_SOC_RT700_SDW=m +CONFIG_SND_SOC_RT711=m +CONFIG_SND_SOC_RT711_SDW=m +CONFIG_SND_SOC_RT711_SDCA_SDW=m +CONFIG_SND_SOC_RT715=m +CONFIG_SND_SOC_RT715_SDW=m +CONFIG_SND_SOC_RT715_SDCA_SDW=m +CONFIG_SND_SOC_RT9120=m +CONFIG_SND_SOC_SDW_MOCKUP=m +CONFIG_SND_SOC_SGTL5000=m +CONFIG_SND_SOC_SI476X=m +CONFIG_SND_SOC_SIGMADSP=m +CONFIG_SND_SOC_SIGMADSP_I2C=m +# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set +# CONFIG_SND_SOC_SIMPLE_MUX is not set +CONFIG_SND_SOC_SPDIF=m +# CONFIG_SND_SOC_SSM2305 is not set +CONFIG_SND_SOC_SSM2518=m +CONFIG_SND_SOC_SSM2602=m +CONFIG_SND_SOC_SSM2602_SPI=m +CONFIG_SND_SOC_SSM2602_I2C=m +CONFIG_SND_SOC_SSM4567=m +CONFIG_SND_SOC_STA32X=m +# CONFIG_SND_SOC_STA350 is not set +CONFIG_SND_SOC_STI_SAS=m +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +CONFIG_SND_SOC_TAS5086=m +CONFIG_SND_SOC_TAS571X=m +CONFIG_SND_SOC_TAS5720=m +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +CONFIG_SND_SOC_TFA9879=m +CONFIG_SND_SOC_TFA989X=m +CONFIG_SND_SOC_TLV320AIC23=m +CONFIG_SND_SOC_TLV320AIC23_I2C=m +CONFIG_SND_SOC_TLV320AIC23_SPI=m +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +CONFIG_SND_SOC_TLV320AIC3X=m +CONFIG_SND_SOC_TLV320AIC3X_I2C=m +CONFIG_SND_SOC_TLV320AIC3X_SPI=m +CONFIG_SND_SOC_TLV320ADCX140=m +CONFIG_SND_SOC_TS3A227E=m +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +CONFIG_SND_SOC_UDA1334=m +CONFIG_SND_SOC_WCD_MBHC=m +CONFIG_SND_SOC_WCD938X=m +CONFIG_SND_SOC_WCD938X_SDW=m +CONFIG_SND_SOC_WM5102=m +CONFIG_SND_SOC_WM8510=m +CONFIG_SND_SOC_WM8523=m +CONFIG_SND_SOC_WM8524=m +CONFIG_SND_SOC_WM8580=m +CONFIG_SND_SOC_WM8711=m +CONFIG_SND_SOC_WM8728=m +CONFIG_SND_SOC_WM8731=m +CONFIG_SND_SOC_WM8737=m +CONFIG_SND_SOC_WM8741=m +CONFIG_SND_SOC_WM8750=m +CONFIG_SND_SOC_WM8753=m +CONFIG_SND_SOC_WM8770=m +CONFIG_SND_SOC_WM8776=m +# CONFIG_SND_SOC_WM8782 is not set +CONFIG_SND_SOC_WM8804=m +CONFIG_SND_SOC_WM8804_I2C=m +CONFIG_SND_SOC_WM8804_SPI=m +CONFIG_SND_SOC_WM8903=m +CONFIG_SND_SOC_WM8904=m +CONFIG_SND_SOC_WM8960=m +CONFIG_SND_SOC_WM8962=m +CONFIG_SND_SOC_WM8974=m +CONFIG_SND_SOC_WM8978=m +CONFIG_SND_SOC_WM8985=m +CONFIG_SND_SOC_WSA881X=m +CONFIG_SND_SOC_ZL38060=m +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +CONFIG_SND_SOC_MT6358=m +CONFIG_SND_SOC_MT6660=m +# CONFIG_SND_SOC_NAU8315 is not set +CONFIG_SND_SOC_NAU8540=m +CONFIG_SND_SOC_NAU8810=m +CONFIG_SND_SOC_NAU8821=m +CONFIG_SND_SOC_NAU8822=m +CONFIG_SND_SOC_NAU8824=m +CONFIG_SND_SOC_NAU8825=m +CONFIG_SND_SOC_TPA6130A2=m +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# end of CODEC drivers + +CONFIG_SND_SIMPLE_CARD_UTILS=m +CONFIG_SND_SIMPLE_CARD=m +CONFIG_SND_X86=y +CONFIG_HDMI_LPE_AUDIO=m +CONFIG_SND_SYNTH_EMUX=m +# CONFIG_SND_XEN_FRONTEND is not set +CONFIG_SND_VIRTIO=m +CONFIG_AC97_BUS=m + +# +# HID support +# +CONFIG_HID=m +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_GENERIC=m + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=m +# CONFIG_HID_ACCUTOUCH is not set +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +CONFIG_HID_ASUS=m +CONFIG_HID_AUREAL=m +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +CONFIG_HID_BIGBEN_FF=m +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_COUGAR=m +CONFIG_HID_MACALLY=m +CONFIG_HID_PRODIKEYS=m +CONFIG_HID_CMEDIA=m +CONFIG_HID_CP2112=m +CONFIG_HID_CREATIVE_SB0540=m +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=m +CONFIG_HID_ELAN=m +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +CONFIG_HID_EZKEY=m +CONFIG_HID_FT260=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_GLORIOUS=m +CONFIG_HID_HOLTEK=m +# CONFIG_HOLTEK_FF is not set +CONFIG_HID_GOOGLE_HAMMER=m +CONFIG_HID_VIVALDI=m +# CONFIG_HID_GT683R is not set +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +CONFIG_HID_UCLOGIC=m +CONFIG_HID_WALTOP=m +CONFIG_HID_VIEWSONIC=m +CONFIG_HID_XIAOMI=m +CONFIG_HID_GYRATION=m +CONFIG_HID_ICADE=m +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +CONFIG_HID_TWINHAN=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LED=m +CONFIG_HID_LENOVO=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_LOGITECH_HIDPP=m +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=m +CONFIG_HID_MALTRON=m +CONFIG_HID_MAYFLASH=m +# CONFIG_HID_REDRAGON is not set +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NINTENDO=m +CONFIG_NINTENDO_FF=y +# CONFIG_HID_NTI is not set +CONFIG_HID_NTRIG=m +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PICOLCD_CIR=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PLAYSTATION=m +CONFIG_PLAYSTATION_FF=y +CONFIG_HID_PRIMAX=m +# CONFIG_HID_RETRODE is not set +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SEMITEK=m +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=m +CONFIG_HID_STEAM=m +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +CONFIG_HID_RMI=m +CONFIG_HID_GREENASIA=m +CONFIG_GREENASIA_FF=y +CONFIG_HID_HYPERV_MOUSE=m +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_UDRAW_PS3=m +CONFIG_HID_U2FZERO=m +CONFIG_HID_WACOM=m +CONFIG_HID_WIIMOTE=m +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=m +CONFIG_HID_SENSOR_HUB=m +CONFIG_HID_SENSOR_CUSTOM_SENSOR=m +CONFIG_HID_ALPS=m +CONFIG_HID_MCP2221=m +# end of Special HID drivers + +# +# USB HID support +# +CONFIG_USB_HID=m +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +# end of USB HID Boot Protocol drivers +# end of USB HID support + +# +# I2C HID support +# +CONFIG_I2C_HID_ACPI=m +# end of I2C HID support + +CONFIG_I2C_HID_CORE=m + +# +# Intel ISH HID support +# +CONFIG_INTEL_ISH_HID=m +CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=m +# end of Intel ISH HID support + +# +# AMD SFH HID Support +# +CONFIG_AMD_SFH_HID=m +# end of AMD SFH HID Support + +# +# Surface System Aggregator Module HID support +# +CONFIG_SURFACE_HID=m +CONFIG_SURFACE_KBD=m +# end of Surface System Aggregator Module HID support + +CONFIG_SURFACE_HID_CORE=m +# end of HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=m +CONFIG_USB_LED_TRIG=y +CONFIG_USB_ULPI_BUS=m +CONFIG_USB_CONN_GPIO=m +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=m +CONFIG_USB_PCI=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_LEDS_TRIGGER_USBPORT=m +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_MON=m + +# +# USB Host Controller Drivers +# +CONFIG_USB_C67X00_HCD=m +CONFIG_USB_XHCI_HCD=m +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=m +CONFIG_USB_XHCI_PCI_RENESAS=m +CONFIG_USB_XHCI_PLATFORM=m +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=m +CONFIG_USB_EHCI_FSL=m +CONFIG_USB_EHCI_HCD_PLATFORM=m +CONFIG_USB_OXU210HP_HCD=m +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_FOTG210_HCD=m +# CONFIG_USB_MAX3421_HCD is not set +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_OHCI_HCD_PCI=m +CONFIG_USB_OHCI_HCD_SSB=y +CONFIG_USB_OHCI_HCD_PLATFORM=m +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_U132_HCD=m +CONFIG_USB_SL811_HCD=m +# CONFIG_USB_SL811_HCD_ISO is not set +CONFIG_USB_R8A66597_HCD=m +CONFIG_USB_HCD_BCMA=m +CONFIG_USB_HCD_SSB=m +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_WDM=m +CONFIG_USB_TMC=m + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_REALTEK=m +CONFIG_REALTEK_AUTOPM=y +CONFIG_USB_STORAGE_DATAFAB=m +CONFIG_USB_STORAGE_FREECOM=m +CONFIG_USB_STORAGE_ISD200=m +CONFIG_USB_STORAGE_USBAT=m +CONFIG_USB_STORAGE_SDDR09=m +CONFIG_USB_STORAGE_SDDR55=m +CONFIG_USB_STORAGE_JUMPSHOT=m +CONFIG_USB_STORAGE_ALAUDA=m +CONFIG_USB_STORAGE_ONETOUCH=m +CONFIG_USB_STORAGE_KARMA=m +CONFIG_USB_STORAGE_CYPRESS_ATACB=m +CONFIG_USB_STORAGE_ENE_UB6250=m +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USBIP_CORE=m +CONFIG_USBIP_VHCI_HCD=m +CONFIG_USBIP_VHCI_HC_PORTS=8 +CONFIG_USBIP_VHCI_NR_HCS=1 +CONFIG_USBIP_HOST=m +CONFIG_USBIP_VUDC=m +# CONFIG_USBIP_DEBUG is not set +CONFIG_USB_CDNS_SUPPORT=m +CONFIG_USB_CDNS_HOST=y +CONFIG_USB_CDNS3=m +CONFIG_USB_CDNS3_GADGET=y +CONFIG_USB_CDNS3_HOST=y +CONFIG_USB_CDNS3_PCI_WRAP=m +CONFIG_USB_CDNSP_PCI=m +# CONFIG_USB_CDNSP_GADGET is not set +# CONFIG_USB_CDNSP_HOST is not set +CONFIG_USB_MUSB_HDRC=m +# CONFIG_USB_MUSB_HOST is not set +# CONFIG_USB_MUSB_GADGET is not set +CONFIG_USB_MUSB_DUAL_ROLE=y + +# +# Platform Glue Layer +# + +# +# MUSB DMA mode +# +CONFIG_MUSB_PIO_ONLY=y +CONFIG_USB_DWC3=m +CONFIG_USB_DWC3_ULPI=y +# CONFIG_USB_DWC3_HOST is not set +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_DUAL_ROLE=y + +# +# Platform Glue Driver Support +# +CONFIG_USB_DWC3_PCI=m +CONFIG_USB_DWC3_HAPS=m +# CONFIG_USB_DWC2 is not set +CONFIG_USB_CHIPIDEA=m +# CONFIG_USB_CHIPIDEA_UDC is not set +CONFIG_USB_CHIPIDEA_HOST=y +CONFIG_USB_CHIPIDEA_PCI=m +CONFIG_USB_CHIPIDEA_MSM=m +CONFIG_USB_CHIPIDEA_GENERIC=m +CONFIG_USB_ISP1760=m +CONFIG_USB_ISP1760_HCD=y +CONFIG_USB_ISP1761_UDC=y +# CONFIG_USB_ISP1760_HOST_ROLE is not set +# CONFIG_USB_ISP1760_GADGET_ROLE is not set +CONFIG_USB_ISP1760_DUAL_ROLE=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_SIMPLE=m +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_F81232=m +CONFIG_USB_SERIAL_F8153X=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_IUU=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_METRO=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7715_PARPORT=y +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_MXUPORT=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_QCAUX=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SPCP8X5=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_SYMBOL=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_OPTICON=m +CONFIG_USB_SERIAL_XSENS_MT=m +CONFIG_USB_SERIAL_WISHBONE=m +CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_QT2=m +CONFIG_USB_SERIAL_UPD78F0730=m +CONFIG_USB_SERIAL_XR=m +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_ADUTUX=m +CONFIG_USB_SEVSEG=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_CYPRESS_CY7C63=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_FTDI_ELAN=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_APPLE_MFI_FASTCHARGE=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_LD=m +CONFIG_USB_TRANCEVIBRATOR=m +CONFIG_USB_IOWARRIOR=m +CONFIG_USB_TEST=m +CONFIG_USB_EHSET_TEST_FIXTURE=m +CONFIG_USB_ISIGHTFW=m +CONFIG_USB_YUREX=m +CONFIG_USB_EZUSB_FX2=m +CONFIG_USB_HUB_USB251XB=m +CONFIG_USB_HSIC_USB3503=m +CONFIG_USB_HSIC_USB4604=m +# CONFIG_USB_LINK_LAYER_TEST is not set +CONFIG_USB_CHAOSKEY=m +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=m +CONFIG_USB_GPIO_VBUS=m +CONFIG_TAHVO_USB=m +# CONFIG_TAHVO_USB_HOST_BY_DEFAULT is not set +CONFIG_USB_ISP1301=m +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_U_SERIAL_CONSOLE=y + +# +# USB Peripheral Controller +# +CONFIG_USB_FOTG210_UDC=m +CONFIG_USB_GR_UDC=m +CONFIG_USB_R8A66597=m +CONFIG_USB_PXA27X=m +CONFIG_USB_MV_UDC=m +CONFIG_USB_MV_U3D=m +CONFIG_USB_SNP_CORE=m +CONFIG_USB_M66592=m +CONFIG_USB_BDC_UDC=m +CONFIG_USB_AMD5536UDC=m +CONFIG_USB_NET2272=m +# CONFIG_USB_NET2272_DMA is not set +CONFIG_USB_NET2280=m +CONFIG_USB_GOKU=m +CONFIG_USB_EG20T=m +# CONFIG_USB_MAX3420_UDC is not set +CONFIG_USB_DUMMY_HCD=m +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=m +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_U_ETHER=m +CONFIG_USB_U_AUDIO=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_NCM=m +CONFIG_USB_F_ECM=m +CONFIG_USB_F_PHONET=m +CONFIG_USB_F_EEM=m +CONFIG_USB_F_SUBSET=m +CONFIG_USB_F_RNDIS=m +CONFIG_USB_F_MASS_STORAGE=m +CONFIG_USB_F_FS=m +CONFIG_USB_F_UAC1=m +CONFIG_USB_F_UVC=m +CONFIG_USB_F_MIDI=m +CONFIG_USB_F_HID=m +CONFIG_USB_F_PRINTER=m +CONFIG_USB_F_TCM=m +CONFIG_USB_CONFIGFS=m +# CONFIG_USB_CONFIGFS_SERIAL is not set +# CONFIG_USB_CONFIGFS_ACM is not set +# CONFIG_USB_CONFIGFS_OBEX is not set +# CONFIG_USB_CONFIGFS_NCM is not set +# CONFIG_USB_CONFIGFS_ECM is not set +# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set +# CONFIG_USB_CONFIGFS_RNDIS is not set +# CONFIG_USB_CONFIGFS_EEM is not set +# CONFIG_USB_CONFIGFS_PHONET is not set +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +# CONFIG_USB_CONFIGFS_F_FS is not set +# CONFIG_USB_CONFIGFS_F_UAC1 is not set +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +# CONFIG_USB_CONFIGFS_F_UAC2 is not set +# CONFIG_USB_CONFIGFS_F_MIDI is not set +# CONFIG_USB_CONFIGFS_F_HID is not set +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_USB_CONFIGFS_F_PRINTER=y +CONFIG_USB_CONFIGFS_F_TCM=y + +# +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set +CONFIG_USB_AUDIO=m +CONFIG_GADGET_UAC1=y +# CONFIG_GADGET_UAC1_LEGACY is not set +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_ETH_EEM=y +CONFIG_USB_G_NCM=m +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +# CONFIG_USB_FUNCTIONFS_ETH is not set +# CONFIG_USB_FUNCTIONFS_RNDIS is not set +CONFIG_USB_FUNCTIONFS_GENERIC=y +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_GADGET_TARGET=m +CONFIG_USB_G_SERIAL=m +CONFIG_USB_MIDI_GADGET=m +CONFIG_USB_G_PRINTER=m +# CONFIG_USB_CDC_COMPOSITE is not set +CONFIG_USB_G_NOKIA=m +CONFIG_USB_G_ACM_MS=m +CONFIG_USB_G_MULTI=m +CONFIG_USB_G_MULTI_RNDIS=y +CONFIG_USB_G_MULTI_CDC=y +CONFIG_USB_G_HID=m +CONFIG_USB_G_DBGP=m +# CONFIG_USB_G_DBGP_PRINTK is not set +CONFIG_USB_G_DBGP_SERIAL=y +CONFIG_USB_G_WEBCAM=m +# CONFIG_USB_RAW_GADGET is not set +# end of USB Gadget precomposed configurations + +CONFIG_TYPEC=m +# CONFIG_TYPEC_TCPM is not set +# CONFIG_TYPEC_UCSI is not set +CONFIG_TYPEC_TPS6598X=m +CONFIG_TYPEC_HD3SS3220=m +CONFIG_TYPEC_STUSB160X=m + +# +# USB Type-C Multiplexer/DeMultiplexer Switch support +# +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_MUX_INTEL_PMC is not set +# end of USB Type-C Multiplexer/DeMultiplexer Switch support + +# +# USB Type-C Alternate Mode drivers +# +CONFIG_TYPEC_DP_ALTMODE=m +CONFIG_TYPEC_NVIDIA_ALTMODE=m +# end of USB Type-C Alternate Mode drivers + +CONFIG_USB_ROLE_SWITCH=m +CONFIG_USB_ROLES_INTEL_XHCI=m +CONFIG_MMC=m +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_MINORS=8 +CONFIG_SDIO_UART=m +# CONFIG_MMC_TEST is not set +CONFIG_MMC_CRYPTO=y + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_SDHCI=m +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_PCI=m +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI_ACPI=m +CONFIG_MMC_SDHCI_PLTFM=m +# CONFIG_MMC_SDHCI_F_SDH30 is not set +CONFIG_MMC_WBSD=m +CONFIG_MMC_ALCOR=m +CONFIG_MMC_TIFM_SD=m +CONFIG_MMC_SPI=m +CONFIG_MMC_CB710=m +CONFIG_MMC_VIA_SDMMC=m +CONFIG_MMC_VUB300=m +CONFIG_MMC_USHC=m +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_REALTEK_PCI=m +CONFIG_MMC_REALTEK_USB=m +CONFIG_MMC_CQHCI=m +# CONFIG_MMC_HSQ is not set +CONFIG_MMC_TOSHIBA_PCI=m +CONFIG_MMC_MTK=m +# CONFIG_MMC_SDHCI_XENON is not set +CONFIG_MEMSTICK=m +# CONFIG_MEMSTICK_DEBUG is not set + +# +# MemoryStick drivers +# +# CONFIG_MEMSTICK_UNSAFE_RESUME is not set +CONFIG_MSPRO_BLOCK=m +CONFIG_MS_BLOCK=m + +# +# MemoryStick Host Controller Drivers +# +CONFIG_MEMSTICK_TIFM_MS=m +CONFIG_MEMSTICK_JMICRON_38X=m +CONFIG_MEMSTICK_R592=m +CONFIG_MEMSTICK_REALTEK_PCI=m +CONFIG_MEMSTICK_REALTEK_USB=m +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=m +CONFIG_LEDS_CLASS_MULTICOLOR=m +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +CONFIG_LEDS_APU=m +CONFIG_LEDS_LM3530=m +CONFIG_LEDS_LM3532=m +CONFIG_LEDS_LM3533=m +CONFIG_LEDS_LM3642=m +# CONFIG_LEDS_MT6323 is not set +CONFIG_LEDS_PCA9532=m +CONFIG_LEDS_PCA9532_GPIO=y +CONFIG_LEDS_GPIO=m +CONFIG_LEDS_LP3944=m +CONFIG_LEDS_LP3952=m +CONFIG_LEDS_LP50XX=m +CONFIG_LEDS_CLEVO_MAIL=m +CONFIG_LEDS_PCA955X=m +# CONFIG_LEDS_PCA955X_GPIO is not set +CONFIG_LEDS_PCA963X=m +# CONFIG_LEDS_WM831X_STATUS is not set +CONFIG_LEDS_DA9052=m +CONFIG_LEDS_DAC124S085=m +CONFIG_LEDS_PWM=m +CONFIG_LEDS_REGULATOR=m +CONFIG_LEDS_BD2802=m +CONFIG_LEDS_INTEL_SS4200=m +CONFIG_LEDS_LT3593=m +CONFIG_LEDS_MC13783=m +CONFIG_LEDS_TCA6507=m +CONFIG_LEDS_TLC591XX=m +CONFIG_LEDS_LM355x=m +CONFIG_LEDS_MENF21BMC=m + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +CONFIG_LEDS_BLINKM=m +CONFIG_LEDS_MLXCPLD=m +CONFIG_LEDS_MLXREG=m +CONFIG_LEDS_USER=m +CONFIG_LEDS_NIC78BX=m +# CONFIG_LEDS_TI_LMU_COMMON is not set +CONFIG_LEDS_TPS6105X=m + +# +# Flash and Torch LED drivers +# +CONFIG_LEDS_AS3645A=m +# CONFIG_LEDS_LM3601X is not set +# CONFIG_LEDS_RT8515 is not set +CONFIG_LEDS_SGM3140=m + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_ONESHOT=m +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_MTD=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +CONFIG_LEDS_TRIGGER_BACKLIGHT=m +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=m +CONFIG_LEDS_TRIGGER_GPIO=m +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=m +CONFIG_LEDS_TRIGGER_CAMERA=m +CONFIG_LEDS_TRIGGER_PANIC=y +# CONFIG_LEDS_TRIGGER_NETDEV is not set +CONFIG_LEDS_TRIGGER_PATTERN=m +CONFIG_LEDS_TRIGGER_AUDIO=m +CONFIG_LEDS_TRIGGER_TTY=m +CONFIG_ACCESSIBILITY=y +CONFIG_A11Y_BRAILLE_CONSOLE=y + +# +# Speakup console speech +# +CONFIG_SPEAKUP=m +CONFIG_SPEAKUP_SYNTH_ACNTSA=m +CONFIG_SPEAKUP_SYNTH_APOLLO=m +CONFIG_SPEAKUP_SYNTH_AUDPTR=m +CONFIG_SPEAKUP_SYNTH_BNS=m +CONFIG_SPEAKUP_SYNTH_DECTLK=m +CONFIG_SPEAKUP_SYNTH_DECEXT=m +CONFIG_SPEAKUP_SYNTH_LTLK=m +CONFIG_SPEAKUP_SYNTH_SOFT=m +CONFIG_SPEAKUP_SYNTH_SPKOUT=m +CONFIG_SPEAKUP_SYNTH_TXPRT=m +CONFIG_SPEAKUP_SYNTH_DUMMY=m +# end of Speakup console speech + +CONFIG_INFINIBAND=m +CONFIG_INFINIBAND_USER_MAD=m +CONFIG_INFINIBAND_USER_ACCESS=m +CONFIG_INFINIBAND_USER_MEM=y +CONFIG_INFINIBAND_ON_DEMAND_PAGING=y +CONFIG_INFINIBAND_ADDR_TRANS=y +CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y +CONFIG_INFINIBAND_VIRT_DMA=y +CONFIG_INFINIBAND_MTHCA=m +CONFIG_INFINIBAND_MTHCA_DEBUG=y +CONFIG_INFINIBAND_QIB=m +CONFIG_INFINIBAND_QIB_DCA=y +CONFIG_INFINIBAND_CXGB4=m +CONFIG_INFINIBAND_EFA=m +CONFIG_INFINIBAND_IRDMA=m +CONFIG_MLX4_INFINIBAND=m +CONFIG_MLX5_INFINIBAND=m +CONFIG_INFINIBAND_OCRDMA=m +CONFIG_INFINIBAND_VMWARE_PVRDMA=m +CONFIG_INFINIBAND_USNIC=m +CONFIG_INFINIBAND_BNXT_RE=m +CONFIG_INFINIBAND_HFI1=m +# CONFIG_HFI1_DEBUG_SDMA_ORDER is not set +# CONFIG_SDMA_VERBOSITY is not set +CONFIG_INFINIBAND_QEDR=m +CONFIG_INFINIBAND_RDMAVT=m +CONFIG_RDMA_RXE=m +# CONFIG_RDMA_SIW is not set +CONFIG_INFINIBAND_IPOIB=m +CONFIG_INFINIBAND_IPOIB_CM=y +CONFIG_INFINIBAND_IPOIB_DEBUG=y +# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set +CONFIG_INFINIBAND_SRP=m +CONFIG_INFINIBAND_SRPT=m +CONFIG_INFINIBAND_ISER=m +CONFIG_INFINIBAND_ISERT=m +CONFIG_INFINIBAND_RTRS=m +CONFIG_INFINIBAND_RTRS_CLIENT=m +CONFIG_INFINIBAND_RTRS_SERVER=m +# CONFIG_INFINIBAND_OPA_VNIC is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EDAC=y +CONFIG_EDAC_LEGACY_SYSFS=y +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_DECODE_MCE=m +# CONFIG_EDAC_GHES is not set +CONFIG_EDAC_AMD64=m +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I82975X=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I3200=m +# CONFIG_EDAC_IE31200 is not set +CONFIG_EDAC_X38=m +CONFIG_EDAC_I5400=m +CONFIG_EDAC_I7CORE=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_I5100=m +CONFIG_EDAC_I7300=m +CONFIG_EDAC_SBRIDGE=m +CONFIG_EDAC_SKX=m +CONFIG_EDAC_I10NM=m +CONFIG_EDAC_PND2=m +# CONFIG_EDAC_IGEN6 is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +CONFIG_RTC_DRV_TEST=m + +# +# I2C RTC drivers +# +CONFIG_RTC_DRV_ABB5ZES3=m +CONFIG_RTC_DRV_ABEOZ9=m +CONFIG_RTC_DRV_ABX80X=m +CONFIG_RTC_DRV_DS1307=m +# CONFIG_RTC_DRV_DS1307_CENTURY is not set +CONFIG_RTC_DRV_DS1374=m +# CONFIG_RTC_DRV_DS1374_WDT is not set +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_MAX6900=m +CONFIG_RTC_DRV_RS5C372=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_ISL12022=m +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_PCF8523=m +CONFIG_RTC_DRV_PCF85063=m +CONFIG_RTC_DRV_PCF85363=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_M41T80=m +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_BQ32K=m +CONFIG_RTC_DRV_S35390A=m +CONFIG_RTC_DRV_FM3130=m +CONFIG_RTC_DRV_RX8010=m +CONFIG_RTC_DRV_RX8581=m +CONFIG_RTC_DRV_RX8025=m +CONFIG_RTC_DRV_EM3027=m +CONFIG_RTC_DRV_RV3028=m +CONFIG_RTC_DRV_RV3032=m +CONFIG_RTC_DRV_RV8803=m +CONFIG_RTC_DRV_SD3078=m + +# +# SPI RTC drivers +# +CONFIG_RTC_DRV_M41T93=m +CONFIG_RTC_DRV_M41T94=m +CONFIG_RTC_DRV_DS1302=m +CONFIG_RTC_DRV_DS1305=m +CONFIG_RTC_DRV_DS1343=m +CONFIG_RTC_DRV_DS1347=m +CONFIG_RTC_DRV_DS1390=m +CONFIG_RTC_DRV_MAX6916=m +CONFIG_RTC_DRV_R9701=m +CONFIG_RTC_DRV_RX4581=m +CONFIG_RTC_DRV_RS5C348=m +CONFIG_RTC_DRV_MAX6902=m +CONFIG_RTC_DRV_PCF2123=m +CONFIG_RTC_DRV_MCP795=m +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +CONFIG_RTC_DRV_DS3232=m +CONFIG_RTC_DRV_DS3232_HWMON=y +CONFIG_RTC_DRV_PCF2127=m +CONFIG_RTC_DRV_RV3029C2=m +CONFIG_RTC_DRV_RV3029_HWMON=y +CONFIG_RTC_DRV_RX6110=m + +# +# Platform RTC drivers +# +CONFIG_RTC_DRV_CMOS=y +CONFIG_RTC_DRV_DS1286=m +CONFIG_RTC_DRV_DS1511=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_DS1685_FAMILY=m +CONFIG_RTC_DRV_DS1685=y +# CONFIG_RTC_DRV_DS1689 is not set +# CONFIG_RTC_DRV_DS17285 is not set +# CONFIG_RTC_DRV_DS17485 is not set +# CONFIG_RTC_DRV_DS17885 is not set +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_DS2404=m +CONFIG_RTC_DRV_DA9052=m +CONFIG_RTC_DRV_DA9063=m +CONFIG_RTC_DRV_STK17TA8=m +CONFIG_RTC_DRV_M48T86=m +CONFIG_RTC_DRV_M48T35=m +CONFIG_RTC_DRV_M48T59=m +CONFIG_RTC_DRV_MSM6242=m +CONFIG_RTC_DRV_BQ4802=m +CONFIG_RTC_DRV_RP5C01=m +CONFIG_RTC_DRV_V3020=m +CONFIG_RTC_DRV_WM831X=m +CONFIG_RTC_DRV_PCF50633=m +# CONFIG_RTC_DRV_CROS_EC is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_FTRTC010 is not set +CONFIG_RTC_DRV_PCAP=m +CONFIG_RTC_DRV_MC13XXX=m +CONFIG_RTC_DRV_MT6397=m + +# +# HID Sensor RTC drivers +# +CONFIG_RTC_DRV_HID_SENSOR_TIME=m +# CONFIG_RTC_DRV_GOLDFISH is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=m +CONFIG_DMA_ACPI=y +CONFIG_ALTERA_MSGDMA=m +CONFIG_INTEL_IDMA64=m +CONFIG_INTEL_IDXD_BUS=m +CONFIG_INTEL_IDXD=m +# CONFIG_INTEL_IDXD_COMPAT is not set +# CONFIG_INTEL_IDXD_SVM is not set +CONFIG_INTEL_IDXD_PERFMON=y +CONFIG_INTEL_IOATDMA=m +CONFIG_PLX_DMA=m +CONFIG_AMD_PTDMA=m +CONFIG_QCOM_HIDMA_MGMT=m +CONFIG_QCOM_HIDMA=m +CONFIG_DW_DMAC_CORE=m +CONFIG_DW_DMAC=m +CONFIG_DW_DMAC_PCI=m +# CONFIG_DW_EDMA is not set +# CONFIG_DW_EDMA_PCIE is not set +CONFIG_HSU_DMA=m +# CONFIG_SF_PDMA is not set +# CONFIG_INTEL_LDMA is not set + +# +# DMA Clients +# +CONFIG_ASYNC_TX_DMA=y +# CONFIG_DMATEST is not set +CONFIG_DMA_ENGINE_RAID=y + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +CONFIG_UDMABUF=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set +# end of DMABUF options + +CONFIG_DCA=m +CONFIG_AUXDISPLAY=y +CONFIG_CHARLCD=m +CONFIG_LINEDISP=m +CONFIG_HD44780_COMMON=m +# CONFIG_HD44780 is not set +CONFIG_KS0108=m +CONFIG_KS0108_PORT=0x378 +CONFIG_KS0108_DELAY=2 +CONFIG_CFAG12864B=m +CONFIG_CFAG12864B_RATE=20 +CONFIG_IMG_ASCII_LCD=m +CONFIG_HT16K33=m +# CONFIG_LCD2S is not set +CONFIG_PARPORT_PANEL=m +CONFIG_PANEL_PARPORT=0 +CONFIG_PANEL_PROFILE=5 +# CONFIG_PANEL_CHANGE_MESSAGE is not set +# CONFIG_CHARLCD_BL_OFF is not set +# CONFIG_CHARLCD_BL_ON is not set +CONFIG_CHARLCD_BL_FLASH=y +CONFIG_PANEL=m +CONFIG_UIO=m +CONFIG_UIO_CIF=m +CONFIG_UIO_PDRV_GENIRQ=m +CONFIG_UIO_DMEM_GENIRQ=m +CONFIG_UIO_AEC=m +CONFIG_UIO_SERCOS3=m +CONFIG_UIO_PCI_GENERIC=m +CONFIG_UIO_NETX=m +CONFIG_UIO_PRUSS=m +CONFIG_UIO_MF624=m +CONFIG_UIO_HV_GENERIC=m +CONFIG_UIO_DFL=m +CONFIG_VFIO=m +CONFIG_VFIO_IOMMU_TYPE1=m +CONFIG_VFIO_VIRQFD=m +CONFIG_VFIO_NOIOMMU=y +CONFIG_VFIO_PCI_CORE=m +CONFIG_VFIO_PCI_MMAP=y +CONFIG_VFIO_PCI_INTX=y +CONFIG_VFIO_PCI=m +CONFIG_VFIO_PCI_VGA=y +CONFIG_VFIO_PCI_IGD=y +CONFIG_VFIO_MDEV=m +CONFIG_IRQ_BYPASS_MANAGER=m +CONFIG_VIRT_DRIVERS=y +CONFIG_VBOXGUEST=m +CONFIG_NITRO_ENCLAVES=m +CONFIG_VIRTIO=m +CONFIG_VIRTIO_PCI_LIB=m +CONFIG_VIRTIO_PCI_LIB_LEGACY=m +CONFIG_VIRTIO_MENU=y +CONFIG_VIRTIO_PCI=m +CONFIG_VIRTIO_PCI_LEGACY=y +# CONFIG_VIRTIO_PMEM is not set +CONFIG_VIRTIO_BALLOON=m +CONFIG_VIRTIO_MEM=m +CONFIG_VIRTIO_INPUT=m +CONFIG_VIRTIO_MMIO=m +# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set +CONFIG_VIRTIO_DMA_SHARED_BUFFER=m +# CONFIG_VDPA is not set +CONFIG_VHOST_IOTLB=m +CONFIG_VHOST=m +CONFIG_VHOST_MENU=y +CONFIG_VHOST_NET=m +CONFIG_VHOST_SCSI=m +CONFIG_VHOST_VSOCK=m +CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y + +# +# Microsoft Hyper-V guest support +# +CONFIG_HYPERV=m +CONFIG_HYPERV_TIMER=y +CONFIG_HYPERV_UTILS=m +CONFIG_HYPERV_BALLOON=m +# end of Microsoft Hyper-V guest support + +# +# Xen driver support +# +CONFIG_XEN_BALLOON=y +# CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set +CONFIG_XEN_MEMORY_HOTPLUG_LIMIT=512 +CONFIG_XEN_SCRUB_PAGES_DEFAULT=y +CONFIG_XEN_DEV_EVTCHN=m +CONFIG_XEN_BACKEND=y +CONFIG_XENFS=m +CONFIG_XEN_COMPAT_XENFS=y +CONFIG_XEN_SYS_HYPERVISOR=y +CONFIG_XEN_XENBUS_FRONTEND=y +CONFIG_XEN_GNTDEV=m +CONFIG_XEN_GNTDEV_DMABUF=y +CONFIG_XEN_GRANT_DEV_ALLOC=m +CONFIG_XEN_GRANT_DMA_ALLOC=y +CONFIG_SWIOTLB_XEN=y +CONFIG_XEN_PCI_STUB=y +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PVCALLS_FRONTEND=m +# CONFIG_XEN_PVCALLS_BACKEND is not set +CONFIG_XEN_SCSI_BACKEND=m +CONFIG_XEN_PRIVCMD=m +CONFIG_XEN_ACPI_PROCESSOR=m +# CONFIG_XEN_MCE_LOG is not set +CONFIG_XEN_HAVE_PVMMU=y +CONFIG_XEN_EFI=y +CONFIG_XEN_AUTO_XLATE=y +CONFIG_XEN_ACPI=y +CONFIG_XEN_SYMS=y +CONFIG_XEN_HAVE_VPMU=y +CONFIG_XEN_FRONT_PGDIR_SHBUF=m +CONFIG_XEN_UNPOPULATED_ALLOC=y +# end of Xen driver support + +CONFIG_GREYBUS=m +CONFIG_GREYBUS_ES2=m +CONFIG_COMEDI=m +# CONFIG_COMEDI_DEBUG is not set +CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048 +CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480 +CONFIG_COMEDI_MISC_DRIVERS=y +CONFIG_COMEDI_BOND=m +CONFIG_COMEDI_TEST=m +CONFIG_COMEDI_PARPORT=m +# CONFIG_COMEDI_ISA_DRIVERS is not set +CONFIG_COMEDI_PCI_DRIVERS=m +CONFIG_COMEDI_8255_PCI=m +CONFIG_COMEDI_ADDI_WATCHDOG=m +CONFIG_COMEDI_ADDI_APCI_1032=m +CONFIG_COMEDI_ADDI_APCI_1500=m +CONFIG_COMEDI_ADDI_APCI_1516=m +CONFIG_COMEDI_ADDI_APCI_1564=m +CONFIG_COMEDI_ADDI_APCI_16XX=m +CONFIG_COMEDI_ADDI_APCI_2032=m +CONFIG_COMEDI_ADDI_APCI_2200=m +CONFIG_COMEDI_ADDI_APCI_3120=m +CONFIG_COMEDI_ADDI_APCI_3501=m +CONFIG_COMEDI_ADDI_APCI_3XXX=m +CONFIG_COMEDI_ADL_PCI6208=m +CONFIG_COMEDI_ADL_PCI7X3X=m +CONFIG_COMEDI_ADL_PCI8164=m +CONFIG_COMEDI_ADL_PCI9111=m +CONFIG_COMEDI_ADL_PCI9118=m +CONFIG_COMEDI_ADV_PCI1710=m +CONFIG_COMEDI_ADV_PCI1720=m +CONFIG_COMEDI_ADV_PCI1723=m +CONFIG_COMEDI_ADV_PCI1724=m +CONFIG_COMEDI_ADV_PCI1760=m +CONFIG_COMEDI_ADV_PCI_DIO=m +CONFIG_COMEDI_AMPLC_DIO200_PCI=m +CONFIG_COMEDI_AMPLC_PC236_PCI=m +CONFIG_COMEDI_AMPLC_PC263_PCI=m +CONFIG_COMEDI_AMPLC_PCI224=m +CONFIG_COMEDI_AMPLC_PCI230=m +CONFIG_COMEDI_CONTEC_PCI_DIO=m +CONFIG_COMEDI_DAS08_PCI=m +CONFIG_COMEDI_DT3000=m +CONFIG_COMEDI_DYNA_PCI10XX=m +CONFIG_COMEDI_GSC_HPDI=m +CONFIG_COMEDI_MF6X4=m +CONFIG_COMEDI_ICP_MULTI=m +CONFIG_COMEDI_DAQBOARD2000=m +CONFIG_COMEDI_JR3_PCI=m +CONFIG_COMEDI_KE_COUNTER=m +CONFIG_COMEDI_CB_PCIDAS64=m +CONFIG_COMEDI_CB_PCIDAS=m +CONFIG_COMEDI_CB_PCIDDA=m +CONFIG_COMEDI_CB_PCIMDAS=m +CONFIG_COMEDI_CB_PCIMDDA=m +CONFIG_COMEDI_ME4000=m +CONFIG_COMEDI_ME_DAQ=m +CONFIG_COMEDI_NI_6527=m +CONFIG_COMEDI_NI_65XX=m +CONFIG_COMEDI_NI_660X=m +CONFIG_COMEDI_NI_670X=m +CONFIG_COMEDI_NI_LABPC_PCI=m +CONFIG_COMEDI_NI_PCIDIO=m +CONFIG_COMEDI_NI_PCIMIO=m +CONFIG_COMEDI_RTD520=m +CONFIG_COMEDI_S626=m +CONFIG_COMEDI_MITE=m +CONFIG_COMEDI_NI_TIOCMD=m +CONFIG_COMEDI_USB_DRIVERS=m +CONFIG_COMEDI_DT9812=m +CONFIG_COMEDI_NI_USB6501=m +CONFIG_COMEDI_USBDUX=m +CONFIG_COMEDI_USBDUXFAST=m +CONFIG_COMEDI_USBDUXSIGMA=m +CONFIG_COMEDI_VMK80XX=m +CONFIG_COMEDI_8254=m +CONFIG_COMEDI_8255=m +CONFIG_COMEDI_8255_SA=m +CONFIG_COMEDI_KCOMEDILIB=m +CONFIG_COMEDI_AMPLC_DIO200=m +CONFIG_COMEDI_AMPLC_PC236=m +CONFIG_COMEDI_DAS08=m +CONFIG_COMEDI_NI_LABPC=m +CONFIG_COMEDI_NI_TIO=m +CONFIG_COMEDI_NI_ROUTING=m +# CONFIG_COMEDI_TESTS is not set +CONFIG_STAGING=y +CONFIG_PRISM2_USB=m +CONFIG_RTL8192U=m +CONFIG_RTLLIB=m +CONFIG_RTLLIB_CRYPTO_CCMP=m +CONFIG_RTLLIB_CRYPTO_TKIP=m +CONFIG_RTLLIB_CRYPTO_WEP=m +CONFIG_RTL8192E=m +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_R8188EU=m +CONFIG_RTS5208=m +CONFIG_VT6655=m +CONFIG_VT6656=m + +# +# IIO staging drivers +# + +# +# Accelerometers +# +CONFIG_ADIS16203=m +CONFIG_ADIS16240=m +# end of Accelerometers + +# +# Analog to digital converters +# +CONFIG_AD7816=m +CONFIG_AD7280=m +# end of Analog to digital converters + +# +# Analog digital bi-direction converters +# +CONFIG_ADT7316=m +CONFIG_ADT7316_SPI=m +CONFIG_ADT7316_I2C=m +# end of Analog digital bi-direction converters + +# +# Capacitance to digital converters +# +CONFIG_AD7746=m +# end of Capacitance to digital converters + +# +# Direct Digital Synthesis +# +CONFIG_AD9832=m +CONFIG_AD9834=m +# end of Direct Digital Synthesis + +# +# Network Analyzer, Impedance Converters +# +CONFIG_AD5933=m +# end of Network Analyzer, Impedance Converters + +# +# Active energy metering IC +# +CONFIG_ADE7854=m +CONFIG_ADE7854_I2C=m +CONFIG_ADE7854_SPI=m +# end of Active energy metering IC + +# +# Resolver to digital converters +# +CONFIG_AD2S1210=m +# end of Resolver to digital converters +# end of IIO staging drivers + +CONFIG_FB_SM750=m +CONFIG_STAGING_MEDIA=y +CONFIG_INTEL_ATOMISP=y +# CONFIG_VIDEO_ZORAN is not set +CONFIG_VIDEO_IPU3_IMGU=m +CONFIG_DVB_AV7110_IR=y +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET_PATCH=m +CONFIG_DVB_SP8870=m + +# +# Android +# +# end of Android + +CONFIG_LTE_GDM724X=m +CONFIG_FIREWIRE_SERIAL=m +CONFIG_FWTTY_MAX_TOTAL_PORTS=64 +CONFIG_FWTTY_MAX_CARD_PORTS=32 +CONFIG_GS_FPGABOOT=m +# CONFIG_UNISYSSPAR is not set +CONFIG_FB_TFT=m +CONFIG_FB_TFT_AGM1264K_FL=m +CONFIG_FB_TFT_BD663474=m +CONFIG_FB_TFT_HX8340BN=m +CONFIG_FB_TFT_HX8347D=m +CONFIG_FB_TFT_HX8353D=m +CONFIG_FB_TFT_HX8357D=m +CONFIG_FB_TFT_ILI9163=m +CONFIG_FB_TFT_ILI9320=m +CONFIG_FB_TFT_ILI9325=m +CONFIG_FB_TFT_ILI9340=m +CONFIG_FB_TFT_ILI9341=m +CONFIG_FB_TFT_ILI9481=m +CONFIG_FB_TFT_ILI9486=m +CONFIG_FB_TFT_PCD8544=m +CONFIG_FB_TFT_RA8875=m +CONFIG_FB_TFT_S6D02A1=m +CONFIG_FB_TFT_S6D1121=m +CONFIG_FB_TFT_SEPS525=m +CONFIG_FB_TFT_SH1106=m +CONFIG_FB_TFT_SSD1289=m +CONFIG_FB_TFT_SSD1305=m +CONFIG_FB_TFT_SSD1306=m +CONFIG_FB_TFT_SSD1331=m +CONFIG_FB_TFT_SSD1351=m +CONFIG_FB_TFT_ST7735R=m +CONFIG_FB_TFT_ST7789V=m +CONFIG_FB_TFT_TINYLCD=m +CONFIG_FB_TFT_TLS8204=m +CONFIG_FB_TFT_UC1611=m +CONFIG_FB_TFT_UC1701=m +CONFIG_FB_TFT_UPD161704=m +CONFIG_FB_TFT_WATTEROTT=m +# CONFIG_MOST_COMPONENTS is not set +CONFIG_KS7010=m +CONFIG_GREYBUS_AUDIO=m +CONFIG_GREYBUS_AUDIO_APB_CODEC=m +CONFIG_GREYBUS_BOOTROM=m +CONFIG_GREYBUS_FIRMWARE=m +CONFIG_GREYBUS_HID=m +CONFIG_GREYBUS_LIGHT=m +CONFIG_GREYBUS_LOG=m +CONFIG_GREYBUS_LOOPBACK=m +CONFIG_GREYBUS_POWER=m +CONFIG_GREYBUS_RAW=m +CONFIG_GREYBUS_VIBRATOR=m +CONFIG_GREYBUS_BRIDGED_PHY=m +CONFIG_GREYBUS_GPIO=m +CONFIG_GREYBUS_I2C=m +CONFIG_GREYBUS_PWM=m +CONFIG_GREYBUS_SDIO=m +CONFIG_GREYBUS_SPI=m +CONFIG_GREYBUS_UART=m +CONFIG_GREYBUS_USB=m +CONFIG_PI433=m +# CONFIG_FIELDBUS_DEV is not set +CONFIG_QLGE=m +CONFIG_WFX=m +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_ACPI_WMI=m +CONFIG_WMI_BMOF=m +CONFIG_HUAWEI_WMI=m +CONFIG_MXM_WMI=m +CONFIG_PEAQ_WMI=m +CONFIG_NVIDIA_WMI_EC_BACKLIGHT=m +# CONFIG_XIAOMI_WMI is not set +CONFIG_GIGABYTE_WMI=m +CONFIG_ACERHDF=m +# CONFIG_ACER_WIRELESS is not set +CONFIG_ACER_WMI=m +CONFIG_AMD_PMC=m +CONFIG_ADV_SWBUTTON=m +CONFIG_APPLE_GMUX=m +CONFIG_ASUS_LAPTOP=m +CONFIG_ASUS_WIRELESS=m +CONFIG_ASUS_WMI=m +CONFIG_ASUS_NB_WMI=m +CONFIG_MERAKI_MX100=m +CONFIG_EEEPC_LAPTOP=m +CONFIG_EEEPC_WMI=m +CONFIG_X86_PLATFORM_DRIVERS_DELL=y +CONFIG_ALIENWARE_WMI=m +CONFIG_DCDBAS=m +CONFIG_DELL_LAPTOP=m +CONFIG_DELL_RBU=m +CONFIG_DELL_RBTN=m +CONFIG_DELL_SMBIOS=m +CONFIG_DELL_SMBIOS_WMI=y +CONFIG_DELL_SMBIOS_SMM=y +CONFIG_DELL_SMO8800=m +CONFIG_DELL_WMI=m +CONFIG_DELL_WMI_PRIVACY=y +CONFIG_DELL_WMI_AIO=m +CONFIG_DELL_WMI_DESCRIPTOR=m +CONFIG_DELL_WMI_LED=m +# CONFIG_DELL_WMI_SYSMAN is not set +CONFIG_AMILO_RFKILL=m +CONFIG_FUJITSU_LAPTOP=m +CONFIG_FUJITSU_TABLET=m +CONFIG_GPD_POCKET_FAN=m +CONFIG_HP_ACCEL=m +CONFIG_WIRELESS_HOTKEY=m +CONFIG_HP_WMI=m +CONFIG_IBM_RTL=m +CONFIG_IDEAPAD_LAPTOP=m +CONFIG_SENSORS_HDAPS=m +CONFIG_THINKPAD_ACPI=m +CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y +# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set +# CONFIG_THINKPAD_ACPI_DEBUG is not set +# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y +CONFIG_THINKPAD_LMI=m +CONFIG_INTEL_ATOMISP2_PDX86=y +CONFIG_INTEL_ATOMISP2_LED=m +CONFIG_INTEL_SAR_INT1092=m +CONFIG_INTEL_SKL_INT3472=m +CONFIG_INTEL_PMC_CORE=y + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +CONFIG_INTEL_TELEMETRY=m +CONFIG_INTEL_WMI=y +CONFIG_INTEL_WMI_SBL_FW_UPDATE=m +CONFIG_INTEL_WMI_THUNDERBOLT=m +CONFIG_INTEL_HID_EVENT=m +CONFIG_INTEL_VBTN=m +# CONFIG_INTEL_INT0002_VGPIO is not set +CONFIG_INTEL_OAKTRAIL=m +# CONFIG_INTEL_CHTDC_TI_PWRBTN is not set +CONFIG_INTEL_ISHTP_ECLITE=m +CONFIG_INTEL_MRFLD_PWRBTN=m +CONFIG_INTEL_PUNIT_IPC=m +CONFIG_INTEL_RST=m +CONFIG_INTEL_SMARTCONNECT=m +# CONFIG_INTEL_TURBO_MAX_3 is not set +CONFIG_INTEL_UNCORE_FREQ_CONTROL=m +CONFIG_MSI_LAPTOP=m +CONFIG_MSI_WMI=m +CONFIG_PCENGINES_APU2=m +CONFIG_BARCO_P50_GPIO=m +CONFIG_SAMSUNG_LAPTOP=m +# CONFIG_SAMSUNG_Q10 is not set +CONFIG_ACPI_TOSHIBA=m +CONFIG_TOSHIBA_BT_RFKILL=m +CONFIG_TOSHIBA_HAPS=m +CONFIG_TOSHIBA_WMI=m +# CONFIG_ACPI_CMPC is not set +CONFIG_COMPAL_LAPTOP=m +CONFIG_LG_LAPTOP=m +CONFIG_PANASONIC_LAPTOP=m +CONFIG_SONY_LAPTOP=m +CONFIG_SONYPI_COMPAT=y +CONFIG_SYSTEM76_ACPI=m +CONFIG_TOPSTAR_LAPTOP=m +CONFIG_I2C_MULTI_INSTANTIATE=m +CONFIG_MLX_PLATFORM=m +CONFIG_TOUCHSCREEN_DMI=y +CONFIG_FW_ATTR_CLASS=m +CONFIG_INTEL_IPS=m +CONFIG_INTEL_SCU_IPC=y +CONFIG_INTEL_SCU=y +CONFIG_INTEL_SCU_PCI=y +CONFIG_INTEL_SCU_PLATFORM=m +CONFIG_INTEL_SCU_IPC_UTIL=m +CONFIG_PMC_ATOM=y +CONFIG_CHROME_PLATFORMS=y +CONFIG_CHROMEOS_LAPTOP=m +CONFIG_CHROMEOS_PSTORE=m +# CONFIG_CHROMEOS_TBMC is not set +CONFIG_CROS_EC=m +CONFIG_CROS_EC_I2C=m +# CONFIG_CROS_EC_ISHTP is not set +CONFIG_CROS_EC_SPI=m +CONFIG_CROS_EC_LPC=m +CONFIG_CROS_EC_PROTO=y +CONFIG_CROS_KBD_LED_BACKLIGHT=m +CONFIG_CROS_EC_CHARDEV=m +CONFIG_CROS_EC_LIGHTBAR=m +CONFIG_CROS_EC_DEBUGFS=m +CONFIG_CROS_EC_SENSORHUB=m +CONFIG_CROS_EC_SYSFS=m +CONFIG_CROS_EC_TYPEC=m +CONFIG_CROS_USBPD_LOGGER=m +CONFIG_CROS_USBPD_NOTIFY=m +# CONFIG_WILCO_EC is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_SURFACE_PLATFORMS=y +CONFIG_SURFACE3_WMI=m +CONFIG_SURFACE_3_POWER_OPREGION=m +CONFIG_SURFACE_ACPI_NOTIFY=m +CONFIG_SURFACE_AGGREGATOR_CDEV=m +CONFIG_SURFACE_AGGREGATOR_REGISTRY=m +CONFIG_SURFACE_DTX=m +# CONFIG_SURFACE_GPE is not set +CONFIG_SURFACE_HOTPLUG=m +CONFIG_SURFACE_PLATFORM_PROFILE=m +CONFIG_SURFACE_PRO3_BUTTON=m +CONFIG_SURFACE_AGGREGATOR=m +CONFIG_SURFACE_AGGREGATOR_BUS=y +# CONFIG_SURFACE_AGGREGATOR_ERROR_INJECTION is not set +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_WM831X=m +CONFIG_LMK04832=m +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +CONFIG_COMMON_CLK_SI5351=m +CONFIG_COMMON_CLK_SI544=m +CONFIG_COMMON_CLK_CDCE706=m +CONFIG_COMMON_CLK_CS2000_CP=m +CONFIG_COMMON_CLK_PWM=m +# CONFIG_XILINX_VCU is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +# end of Clock Source drivers + +CONFIG_MAILBOX=y +CONFIG_PCC=y +CONFIG_ALTERA_MBOX=m +CONFIG_IOMMU_IOVA=y +CONFIG_IOASID=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA_LIB=y +CONFIG_AMD_IOMMU=y +CONFIG_AMD_IOMMU_V2=m +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +CONFIG_INTEL_IOMMU_SVM=y +CONFIG_INTEL_IOMMU_DEFAULT_ON=y +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +# CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set +CONFIG_IRQ_REMAP=y +CONFIG_HYPERV_IOMMU=y +CONFIG_VIRTIO_IOMMU=m + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +CONFIG_RPMSG=m +CONFIG_RPMSG_CHAR=m +CONFIG_RPMSG_NS=m +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +CONFIG_RPMSG_VIRTIO=m +# end of Rpmsg drivers + +CONFIG_SOUNDWIRE=m + +# +# SoundWire Devices +# +CONFIG_SOUNDWIRE_CADENCE=m +CONFIG_SOUNDWIRE_INTEL=m +CONFIG_SOUNDWIRE_QCOM=m +CONFIG_SOUNDWIRE_GENERIC_ALLOCATION=m + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# end of NXP/Freescale QorIQ SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + +# +# Qualcomm SoC drivers +# +CONFIG_QCOM_QMI_HELPERS=m +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +CONFIG_DEVFREQ_GOV_PASSIVE=m + +# +# DEVFREQ Drivers +# +CONFIG_PM_DEVFREQ_EVENT=y +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +CONFIG_EXTCON_ADC_JACK=m +CONFIG_EXTCON_AXP288=m +# CONFIG_EXTCON_FSA9480 is not set +CONFIG_EXTCON_GPIO=m +CONFIG_EXTCON_INTEL_INT3496=m +CONFIG_EXTCON_INTEL_MRFLD=m +CONFIG_EXTCON_MAX3355=m +CONFIG_EXTCON_MAX77843=m +CONFIG_EXTCON_PTN5150=m +CONFIG_EXTCON_RT8973A=m +# CONFIG_EXTCON_SM5502 is not set +CONFIG_EXTCON_USB_GPIO=m +CONFIG_EXTCON_USBC_CROS_EC=m +# CONFIG_EXTCON_USBC_TUSB320 is not set +CONFIG_MEMORY=y +# CONFIG_FPGA_DFL_EMIF is not set +CONFIG_IIO=m +CONFIG_IIO_BUFFER=y +CONFIG_IIO_BUFFER_CB=m +CONFIG_IIO_BUFFER_DMA=m +CONFIG_IIO_BUFFER_DMAENGINE=m +CONFIG_IIO_BUFFER_HW_CONSUMER=m +CONFIG_IIO_KFIFO_BUF=m +CONFIG_IIO_TRIGGERED_BUFFER=m +CONFIG_IIO_CONFIGFS=m +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +CONFIG_IIO_SW_DEVICE=m +CONFIG_IIO_SW_TRIGGER=m +CONFIG_IIO_TRIGGERED_EVENT=m + +# +# Accelerometers +# +CONFIG_ADIS16201=m +CONFIG_ADIS16209=m +CONFIG_ADXL313=m +CONFIG_ADXL313_I2C=m +CONFIG_ADXL313_SPI=m +CONFIG_ADXL355=m +CONFIG_ADXL355_I2C=m +CONFIG_ADXL355_SPI=m +CONFIG_ADXL372=m +CONFIG_ADXL372_SPI=m +CONFIG_ADXL372_I2C=m +CONFIG_BMA220=m +CONFIG_BMA400=m +CONFIG_BMA400_I2C=m +CONFIG_BMA400_SPI=m +CONFIG_BMC150_ACCEL=m +CONFIG_BMC150_ACCEL_I2C=m +CONFIG_BMC150_ACCEL_SPI=m +CONFIG_BMI088_ACCEL=m +CONFIG_BMI088_ACCEL_SPI=m +CONFIG_DA280=m +CONFIG_DA311=m +CONFIG_DMARD09=m +CONFIG_DMARD10=m +CONFIG_FXLS8962AF=m +CONFIG_FXLS8962AF_I2C=m +CONFIG_FXLS8962AF_SPI=m +CONFIG_HID_SENSOR_ACCEL_3D=m +CONFIG_IIO_CROS_EC_ACCEL_LEGACY=m +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m +CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m +CONFIG_KXSD9=m +CONFIG_KXSD9_SPI=m +CONFIG_KXSD9_I2C=m +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +CONFIG_MMA7455=m +CONFIG_MMA7455_I2C=m +CONFIG_MMA7455_SPI=m +CONFIG_MMA7660=m +# CONFIG_MMA8452 is not set +CONFIG_MMA9551_CORE=m +CONFIG_MMA9551=m +CONFIG_MMA9553=m +CONFIG_MXC4005=m +CONFIG_MXC6255=m +CONFIG_SCA3000=m +CONFIG_SCA3300=m +CONFIG_STK8312=m +CONFIG_STK8BA50=m +# end of Accelerometers + +# +# Analog to digital converters +# +CONFIG_AD_SIGMA_DELTA=m +CONFIG_AD7091R5=m +CONFIG_AD7124=m +CONFIG_AD7192=m +CONFIG_AD7266=m +CONFIG_AD7291=m +CONFIG_AD7292=m +CONFIG_AD7298=m +CONFIG_AD7476=m +CONFIG_AD7606=m +CONFIG_AD7606_IFACE_PARALLEL=m +CONFIG_AD7606_IFACE_SPI=m +CONFIG_AD7766=m +CONFIG_AD7768_1=m +CONFIG_AD7780=m +CONFIG_AD7791=m +CONFIG_AD7793=m +CONFIG_AD7887=m +CONFIG_AD7923=m +CONFIG_AD7949=m +CONFIG_AD799X=m +# CONFIG_AXP20X_ADC is not set +CONFIG_AXP288_ADC=m +CONFIG_CC10001_ADC=m +CONFIG_DA9150_GPADC=m +CONFIG_DLN2_ADC=m +CONFIG_HI8435=m +CONFIG_HX711=m +CONFIG_INA2XX_ADC=m +CONFIG_INTEL_MRFLD_ADC=m +CONFIG_LTC2471=m +CONFIG_LTC2485=m +CONFIG_LTC2496=m +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +CONFIG_MAX11100=m +# CONFIG_MAX1118 is not set +CONFIG_MAX1241=m +CONFIG_MAX1363=m +# CONFIG_MAX9611 is not set +CONFIG_MCP320X=m +CONFIG_MCP3422=m +CONFIG_MCP3911=m +# CONFIG_MEDIATEK_MT6360_ADC is not set +CONFIG_MEN_Z188_ADC=m +CONFIG_MP2629_ADC=m +CONFIG_NAU7802=m +CONFIG_QCOM_VADC_COMMON=m +CONFIG_QCOM_SPMI_IADC=m +CONFIG_QCOM_SPMI_VADC=m +CONFIG_QCOM_SPMI_ADC5=m +CONFIG_TI_ADC081C=m +CONFIG_TI_ADC0832=m +# CONFIG_TI_ADC084S021 is not set +CONFIG_TI_ADC12138=m +# CONFIG_TI_ADC108S102 is not set +CONFIG_TI_ADC128S052=m +CONFIG_TI_ADC161S626=m +CONFIG_TI_ADS1015=m +CONFIG_TI_ADS7950=m +CONFIG_TI_ADS131E08=m +CONFIG_TI_AM335X_ADC=m +CONFIG_TI_TLC4541=m +CONFIG_TI_TSC2046=m +CONFIG_VIPERBOARD_ADC=m +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog Front Ends +# +# end of Analog Front Ends + +# +# Amplifiers +# +CONFIG_AD8366=m +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Capacitance to digital converters +# +CONFIG_AD7150=m +# end of Capacitance to digital converters + +# +# Chemical Sensors +# +CONFIG_ATLAS_PH_SENSOR=m +CONFIG_ATLAS_EZO_SENSOR=m +CONFIG_BME680=m +CONFIG_BME680_I2C=m +CONFIG_BME680_SPI=m +CONFIG_CCS811=m +CONFIG_IAQCORE=m +CONFIG_PMS7003=m +CONFIG_SCD30_CORE=m +CONFIG_SCD30_I2C=m +CONFIG_SCD30_SERIAL=m +CONFIG_SCD4X=m +CONFIG_SENSIRION_SGP30=m +CONFIG_SENSIRION_SGP40=m +CONFIG_SPS30=m +CONFIG_SPS30_I2C=m +CONFIG_SPS30_SERIAL=m +CONFIG_SENSEAIR_SUNRISE_CO2=m +CONFIG_VZ89X=m +# end of Chemical Sensors + +CONFIG_IIO_CROS_EC_SENSORS_CORE=m +CONFIG_IIO_CROS_EC_SENSORS=m +# CONFIG_IIO_CROS_EC_SENSORS_LID_ANGLE is not set + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=m +CONFIG_HID_SENSOR_IIO_TRIGGER=m +# end of Hid Sensor IIO Common + +CONFIG_IIO_MS_SENSORS_I2C=m + +# +# IIO SCMI Sensors +# +# end of IIO SCMI Sensors + +# +# SSP Sensor Common +# +CONFIG_IIO_SSP_SENSORS_COMMONS=m +CONFIG_IIO_SSP_SENSORHUB=m +# end of SSP Sensor Common + +CONFIG_IIO_ST_SENSORS_I2C=m +CONFIG_IIO_ST_SENSORS_SPI=m +CONFIG_IIO_ST_SENSORS_CORE=m + +# +# Digital to analog converters +# +CONFIG_AD5064=m +CONFIG_AD5360=m +CONFIG_AD5380=m +CONFIG_AD5421=m +CONFIG_AD5446=m +CONFIG_AD5449=m +CONFIG_AD5592R_BASE=m +CONFIG_AD5592R=m +CONFIG_AD5593R=m +CONFIG_AD5504=m +CONFIG_AD5624R_SPI=m +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +CONFIG_AD5755=m +# CONFIG_AD5758 is not set +CONFIG_AD5761=m +CONFIG_AD5764=m +CONFIG_AD5766=m +# CONFIG_AD5770R is not set +CONFIG_AD5791=m +CONFIG_AD7303=m +CONFIG_AD8801=m +CONFIG_DS4424=m +CONFIG_LTC1660=m +# CONFIG_LTC2632 is not set +CONFIG_M62332=m +CONFIG_MAX517=m +CONFIG_MCP4725=m +# CONFIG_MCP4922 is not set +CONFIG_TI_DAC082S085=m +# CONFIG_TI_DAC5571 is not set +CONFIG_TI_DAC7311=m +CONFIG_TI_DAC7612=m +# end of Digital to analog converters + +# +# IIO dummy driver +# +CONFIG_IIO_SIMPLE_DUMMY=m +# CONFIG_IIO_SIMPLE_DUMMY_EVENTS is not set +# CONFIG_IIO_SIMPLE_DUMMY_BUFFER is not set +# end of IIO dummy driver + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +CONFIG_AD9523=m +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +CONFIG_ADF4350=m +# CONFIG_ADF4371 is not set +CONFIG_ADRF6780=m +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +CONFIG_ADIS16080=m +CONFIG_ADIS16130=m +CONFIG_ADIS16136=m +CONFIG_ADIS16260=m +CONFIG_ADXRS290=m +CONFIG_ADXRS450=m +CONFIG_BMG160=m +CONFIG_BMG160_I2C=m +CONFIG_BMG160_SPI=m +CONFIG_FXAS21002C=m +CONFIG_FXAS21002C_I2C=m +CONFIG_FXAS21002C_SPI=m +CONFIG_HID_SENSOR_GYRO_3D=m +CONFIG_MPU3050=m +CONFIG_MPU3050_I2C=m +CONFIG_IIO_ST_GYRO_3AXIS=m +CONFIG_IIO_ST_GYRO_I2C_3AXIS=m +CONFIG_IIO_ST_GYRO_SPI_3AXIS=m +CONFIG_ITG3200=m +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +CONFIG_AFE4403=m +CONFIG_AFE4404=m +CONFIG_MAX30100=m +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +CONFIG_AM2315=m +CONFIG_DHT11=m +CONFIG_HDC100X=m +CONFIG_HDC2010=m +# CONFIG_HID_SENSOR_HUMIDITY is not set +CONFIG_HTS221=m +CONFIG_HTS221_I2C=m +CONFIG_HTS221_SPI=m +CONFIG_HTU21=m +CONFIG_SI7005=m +CONFIG_SI7020=m +# end of Humidity sensors + +# +# Inertial measurement units +# +CONFIG_ADIS16400=m +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +CONFIG_ADIS16480=m +CONFIG_BMI160=m +CONFIG_BMI160_I2C=m +CONFIG_BMI160_SPI=m +CONFIG_FXOS8700=m +CONFIG_FXOS8700_I2C=m +CONFIG_FXOS8700_SPI=m +CONFIG_KMX61=m +CONFIG_INV_ICM42600=m +CONFIG_INV_ICM42600_I2C=m +CONFIG_INV_ICM42600_SPI=m +CONFIG_INV_MPU6050_IIO=m +CONFIG_INV_MPU6050_I2C=m +CONFIG_INV_MPU6050_SPI=m +CONFIG_IIO_ST_LSM6DSX=m +CONFIG_IIO_ST_LSM6DSX_I2C=m +CONFIG_IIO_ST_LSM6DSX_SPI=m +CONFIG_IIO_ST_LSM6DSX_I3C=m +CONFIG_IIO_ST_LSM9DS0=m +CONFIG_IIO_ST_LSM9DS0_I2C=m +CONFIG_IIO_ST_LSM9DS0_SPI=m +# end of Inertial measurement units + +CONFIG_IIO_ADIS_LIB=m +CONFIG_IIO_ADIS_LIB_BUFFER=y + +# +# Light sensors +# +CONFIG_ACPI_ALS=m +CONFIG_ADJD_S311=m +CONFIG_ADUX1020=m +# CONFIG_AL3010 is not set +CONFIG_AL3320A=m +CONFIG_APDS9300=m +CONFIG_APDS9960=m +CONFIG_AS73211=m +CONFIG_BH1750=m +CONFIG_BH1780=m +CONFIG_CM32181=m +CONFIG_CM3232=m +CONFIG_CM3323=m +CONFIG_CM36651=m +# CONFIG_IIO_CROS_EC_LIGHT_PROX is not set +# CONFIG_GP2AP002 is not set +CONFIG_GP2AP020A00F=m +# CONFIG_IQS621_ALS is not set +CONFIG_SENSORS_ISL29018=m +CONFIG_SENSORS_ISL29028=m +# CONFIG_ISL29125 is not set +CONFIG_HID_SENSOR_ALS=m +CONFIG_HID_SENSOR_PROX=m +CONFIG_JSA1212=m +CONFIG_RPR0521=m +CONFIG_SENSORS_LM3533=m +CONFIG_LTR501=m +CONFIG_LV0104CS=m +CONFIG_MAX44000=m +CONFIG_MAX44009=m +CONFIG_NOA1305=m +CONFIG_OPT3001=m +CONFIG_PA12203001=m +# CONFIG_SI1133 is not set +CONFIG_SI1145=m +CONFIG_STK3310=m +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +CONFIG_TCS3472=m +CONFIG_SENSORS_TSL2563=m +CONFIG_TSL2583=m +CONFIG_TSL2591=m +# CONFIG_TSL2772 is not set +CONFIG_TSL4531=m +CONFIG_US5182D=m +CONFIG_VCNL4000=m +CONFIG_VCNL4035=m +CONFIG_VEML6030=m +CONFIG_VEML6070=m +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +CONFIG_AK8975=m +# CONFIG_AK09911 is not set +CONFIG_BMC150_MAGN=m +CONFIG_BMC150_MAGN_I2C=m +CONFIG_BMC150_MAGN_SPI=m +CONFIG_MAG3110=m +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +CONFIG_MMC35240=m +CONFIG_IIO_ST_MAGN_3AXIS=m +CONFIG_IIO_ST_MAGN_I2C_3AXIS=m +CONFIG_IIO_ST_MAGN_SPI_3AXIS=m +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +CONFIG_SENSORS_RM3100=m +CONFIG_SENSORS_RM3100_I2C=m +CONFIG_SENSORS_RM3100_SPI=m +CONFIG_YAMAHA_YAS530=m +# end of Magnetometer sensors + +# +# Multiplexers +# +# end of Multiplexers + +# +# Inclinometer sensors +# +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set +# end of Inclinometer sensors + +# +# Triggers - standalone +# +CONFIG_IIO_HRTIMER_TRIGGER=m +CONFIG_IIO_INTERRUPT_TRIGGER=m +CONFIG_IIO_TIGHTLOOP_TRIGGER=m +CONFIG_IIO_SYSFS_TRIGGER=m +# end of Triggers - standalone + +# +# Linear and angular position sensors +# +CONFIG_IQS624_POS=m +CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE=m +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +CONFIG_AD5110=m +CONFIG_AD5272=m +CONFIG_DS1803=m +CONFIG_MAX5432=m +CONFIG_MAX5481=m +CONFIG_MAX5487=m +CONFIG_MCP4018=m +CONFIG_MCP4131=m +CONFIG_MCP4531=m +CONFIG_MCP41010=m +CONFIG_TPL0102=m +# end of Digital potentiometers + +# +# Digital potentiostats +# +CONFIG_LMP91000=m +# end of Digital potentiostats + +# +# Pressure sensors +# +CONFIG_ABP060MG=m +CONFIG_BMP280=m +CONFIG_BMP280_I2C=m +CONFIG_BMP280_SPI=m +CONFIG_IIO_CROS_EC_BARO=m +CONFIG_DLHL60D=m +# CONFIG_DPS310 is not set +CONFIG_HID_SENSOR_PRESS=m +CONFIG_HP03=m +# CONFIG_ICP10100 is not set +CONFIG_MPL115=m +CONFIG_MPL115_I2C=m +CONFIG_MPL115_SPI=m +CONFIG_MPL3115=m +CONFIG_MS5611=m +CONFIG_MS5611_I2C=m +CONFIG_MS5611_SPI=m +CONFIG_MS5637=m +CONFIG_IIO_ST_PRESS=m +CONFIG_IIO_ST_PRESS_I2C=m +CONFIG_IIO_ST_PRESS_SPI=m +# CONFIG_T5403 is not set +CONFIG_HP206C=m +CONFIG_ZPA2326=m +CONFIG_ZPA2326_I2C=m +CONFIG_ZPA2326_SPI=m +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +CONFIG_CROS_EC_MKBP_PROXIMITY=m +CONFIG_ISL29501=m +CONFIG_LIDAR_LITE_V2=m +CONFIG_MB1232=m +CONFIG_PING=m +CONFIG_RFD77402=m +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +CONFIG_SX9500=m +CONFIG_SRF08=m +CONFIG_VCNL3020=m +CONFIG_VL53L0X_I2C=m +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +CONFIG_AD2S90=m +CONFIG_AD2S1200=m +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_IQS620AT_TEMP is not set +CONFIG_LTC2983=m +CONFIG_MAXIM_THERMOCOUPLE=m +# CONFIG_HID_SENSOR_TEMP is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +CONFIG_TMP006=m +CONFIG_TMP007=m +CONFIG_TMP117=m +CONFIG_TSYS01=m +CONFIG_TSYS02D=m +CONFIG_MAX31856=m +CONFIG_MAX31865=m +# end of Temperature sensors + +CONFIG_NTB=m +# CONFIG_NTB_MSI is not set +CONFIG_NTB_AMD=m +# CONFIG_NTB_IDT is not set +CONFIG_NTB_INTEL=m +# CONFIG_NTB_EPF is not set +CONFIG_NTB_SWITCHTEC=m +CONFIG_NTB_PINGPONG=m +CONFIG_NTB_TOOL=m +CONFIG_NTB_PERF=m +CONFIG_NTB_TRANSPORT=m +# CONFIG_VME_BUS is not set +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_DEBUG is not set +CONFIG_PWM_CROS_EC=m +# CONFIG_PWM_DWC is not set +CONFIG_PWM_IQS620A=m +CONFIG_PWM_LP3943=m +CONFIG_PWM_LPSS=m +CONFIG_PWM_LPSS_PCI=m +CONFIG_PWM_LPSS_PLATFORM=m +CONFIG_PWM_PCA9685=m + +# +# IRQ chip support +# +CONFIG_MADERA_IRQ=m +# end of IRQ chip support + +CONFIG_IPACK_BUS=m +CONFIG_BOARD_TPCI200=m +CONFIG_SERIAL_IPOCTAL=m +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_TI_SYSCON is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_USB_LGM_PHY=m +CONFIG_PHY_CAN_TRANSCEIVER=m + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +CONFIG_PHY_PXA_28NM_HSIC=m +CONFIG_PHY_PXA_28NM_USB2=m +# CONFIG_PHY_CPCAP_USB is not set +CONFIG_PHY_QCOM_USB_HS=m +CONFIG_PHY_QCOM_USB_HSIC=m +CONFIG_PHY_TUSB1210=m +CONFIG_PHY_INTEL_LGM_EMMC=m +# end of PHY Subsystem + +CONFIG_POWERCAP=y +CONFIG_INTEL_RAPL_CORE=m +CONFIG_INTEL_RAPL=m +CONFIG_IDLE_INJECT=y +# CONFIG_DTPM is not set +CONFIG_MCB=m +CONFIG_MCB_PCI=m +CONFIG_MCB_LPC=m + +# +# Performance monitor support +# +# end of Performance monitor support + +CONFIG_RAS=y +# CONFIG_RAS_CEC is not set +CONFIG_USB4=m +# CONFIG_USB4_DEBUGFS_WRITE is not set +# CONFIG_USB4_DMA_TEST is not set + +# +# Android +# +# CONFIG_ANDROID is not set +# end of Android + +CONFIG_LIBNVDIMM=y +CONFIG_BLK_DEV_PMEM=m +CONFIG_ND_BLK=m +CONFIG_ND_CLAIM=y +CONFIG_ND_BTT=m +CONFIG_BTT=y +CONFIG_ND_PFN=m +CONFIG_NVDIMM_PFN=y +CONFIG_NVDIMM_DAX=y +CONFIG_DAX_DRIVER=y +CONFIG_DAX=y +CONFIG_DEV_DAX=m +CONFIG_DEV_DAX_PMEM=m +CONFIG_DEV_DAX_HMEM=m +CONFIG_DEV_DAX_HMEM_DEVICES=y +CONFIG_DEV_DAX_KMEM=m +CONFIG_DEV_DAX_PMEM_COMPAT=m +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y +CONFIG_NVMEM_SPMI_SDAM=m +CONFIG_NVMEM_RMEM=m + +# +# HW tracing support +# +CONFIG_STM=m +CONFIG_STM_PROTO_BASIC=m +CONFIG_STM_PROTO_SYS_T=m +CONFIG_STM_DUMMY=m +CONFIG_STM_SOURCE_CONSOLE=m +CONFIG_STM_SOURCE_HEARTBEAT=m +CONFIG_STM_SOURCE_FTRACE=m +CONFIG_INTEL_TH=m +CONFIG_INTEL_TH_PCI=m +CONFIG_INTEL_TH_ACPI=m +CONFIG_INTEL_TH_GTH=m +CONFIG_INTEL_TH_STH=m +CONFIG_INTEL_TH_MSU=m +CONFIG_INTEL_TH_PTI=m +# CONFIG_INTEL_TH_DEBUG is not set +# end of HW tracing support + +CONFIG_FPGA=m +# CONFIG_ALTERA_PR_IP_CORE is not set +CONFIG_FPGA_MGR_ALTERA_PS_SPI=m +CONFIG_FPGA_MGR_ALTERA_CVP=m +# CONFIG_FPGA_MGR_XILINX_SPI is not set +# CONFIG_FPGA_MGR_MACHXO2_SPI is not set +CONFIG_FPGA_BRIDGE=m +CONFIG_ALTERA_FREEZE_BRIDGE=m +CONFIG_XILINX_PR_DECOUPLER=m +CONFIG_FPGA_REGION=m +CONFIG_FPGA_DFL=m +CONFIG_FPGA_DFL_FME=m +CONFIG_FPGA_DFL_FME_MGR=m +CONFIG_FPGA_DFL_FME_BRIDGE=m +CONFIG_FPGA_DFL_FME_REGION=m +CONFIG_FPGA_DFL_AFU=m +CONFIG_FPGA_DFL_NIOS_INTEL_PAC_N3000=m +CONFIG_FPGA_DFL_PCI=m +CONFIG_TEE=m + +# +# TEE drivers +# +CONFIG_AMDTEE=m +# end of TEE drivers + +CONFIG_MULTIPLEXER=m + +# +# Multiplexer drivers +# +# CONFIG_MUX_ADG792A is not set +# CONFIG_MUX_ADGS1408 is not set +# CONFIG_MUX_GPIO is not set +# end of Multiplexer drivers + +CONFIG_PM_OPP=y +# CONFIG_UNISYS_VISORBUS is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +CONFIG_INTERCONNECT=y +# CONFIG_COUNTER is not set +CONFIG_MOST=m +CONFIG_MOST_USB_HDM=m +CONFIG_MOST_CDEV=m +CONFIG_MOST_SND=m +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=m +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +CONFIG_REISERFS_FS_POSIX_ACL=y +CONFIG_REISERFS_FS_SECURITY=y +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +CONFIG_JFS_SECURITY=y +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_XFS_FS=m +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_XFS_RT=y +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_DLM=y +CONFIG_OCFS2_FS=m +CONFIG_OCFS2_FS_O2CB=m +CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m +CONFIG_OCFS2_FS_STATS=y +# CONFIG_OCFS2_DEBUG_MASKLOG is not set +# CONFIG_OCFS2_DEBUG_FS is not set +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_FS_REF_VERIFY is not set +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=m +CONFIG_F2FS_STAT_FS=y +CONFIG_F2FS_FS_XATTR=y +CONFIG_F2FS_FS_POSIX_ACL=y +CONFIG_F2FS_FS_SECURITY=y +CONFIG_F2FS_CHECK_FS=y +# CONFIG_F2FS_FAULT_INJECTION is not set +CONFIG_F2FS_FS_COMPRESSION=y +CONFIG_F2FS_FS_LZO=y +CONFIG_F2FS_FS_LZORLE=y +CONFIG_F2FS_FS_LZ4=y +CONFIG_F2FS_FS_LZ4HC=y +CONFIG_F2FS_FS_ZSTD=y +CONFIG_F2FS_IOSTAT=y +CONFIG_ZONEFS_FS=m +CONFIG_FS_DAX=y +CONFIG_FS_DAX_PMD=y +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +CONFIG_EXPORTFS_BLOCK_OPS=y +CONFIG_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=m +CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set +CONFIG_QUOTA=y +CONFIG_QUOTA_NETLINK_INTERFACE=y +# CONFIG_PRINT_QUOTA_WARNING is not set +# CONFIG_QUOTA_DEBUG is not set +CONFIG_QUOTA_TREE=m +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS4_FS=y +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_CUSE=m +CONFIG_VIRTIO_FS=m +CONFIG_FUSE_DAX=y +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +CONFIG_OVERLAY_FS_XINO_AUTO=y +# CONFIG_OVERLAY_FS_METACOPY is not set + +# +# Caches +# +CONFIG_NETFS_SUPPORT=m +# CONFIG_NETFS_STATS is not set +CONFIG_FSCACHE=m +# CONFIG_FSCACHE_STATS is not set +# CONFIG_FSCACHE_DEBUG is not set +CONFIG_CACHEFILES=m +# CONFIG_CACHEFILES_DEBUG is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set +CONFIG_NTFS3_FS=m +# CONFIG_NTFS3_64BIT_CLUSTER is not set +CONFIG_NTFS3_LZX_XPRESS=y +# CONFIG_NTFS3_FS_POSIX_ACL is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_PROC_CPU_RESCTRL=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +CONFIG_TMPFS_INODE64=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PAGE_FREE_VMEMMAP=y +# CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON is not set +CONFIG_MEMFD_CREATE=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=m +CONFIG_EFIVAR_FS=y +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +CONFIG_ORANGEFS_FS=m +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +# CONFIG_ECRYPT_FS_MESSAGING is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +CONFIG_CRAMFS=m +CONFIG_CRAMFS_BLOCKDEV=y +# CONFIG_CRAMFS_MTD is not set +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +# CONFIG_SQUASHFS_DECOMP_SINGLE is not set +CONFIG_SQUASHFS_DECOMP_MULTI=y +# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +CONFIG_HPFS_FS=m +# CONFIG_QNX4FS_FS is not set +CONFIG_QNX6FS_FS=m +# CONFIG_QNX6FS_DEBUG is not set +# CONFIG_ROMFS_FS is not set +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 +CONFIG_PSTORE_DEFLATE_COMPRESS=m +# CONFIG_PSTORE_LZO_COMPRESS is not set +# CONFIG_PSTORE_LZ4_COMPRESS is not set +CONFIG_PSTORE_LZ4HC_COMPRESS=m +# CONFIG_PSTORE_842_COMPRESS is not set +CONFIG_PSTORE_ZSTD_COMPRESS=y +CONFIG_PSTORE_COMPRESS=y +CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y +# CONFIG_PSTORE_LZ4HC_COMPRESS_DEFAULT is not set +# CONFIG_PSTORE_ZSTD_COMPRESS_DEFAULT is not set +CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" +# CONFIG_PSTORE_CONSOLE is not set +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_FTRACE is not set +CONFIG_PSTORE_RAM=m +CONFIG_PSTORE_ZONE=m +CONFIG_PSTORE_BLK=m +CONFIG_PSTORE_BLK_BLKDEV="" +CONFIG_PSTORE_BLK_KMSG_SIZE=64 +CONFIG_PSTORE_BLK_MAX_REASON=2 +# CONFIG_SYSV_FS is not set +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set +# CONFIG_UFS_DEBUG is not set +CONFIG_EROFS_FS=m +# CONFIG_EROFS_FS_DEBUG is not set +CONFIG_EROFS_FS_XATTR=y +CONFIG_EROFS_FS_POSIX_ACL=y +CONFIG_EROFS_FS_SECURITY=y +# CONFIG_EROFS_FS_ZIP is not set +CONFIG_VBOXSF_FS=m +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=m +CONFIG_NFS_V2=m +CONFIG_NFS_V3=m +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=m +CONFIG_NFS_SWAP=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_PNFS_FILE_LAYOUT=m +CONFIG_PNFS_BLOCK=m +CONFIG_PNFS_FLEXFILE_LAYOUT=m +CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" +CONFIG_NFS_V4_1_MIGRATION=y +CONFIG_NFS_V4_SECURITY_LABEL=y +CONFIG_NFS_FSCACHE=y +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFS_DISABLE_UDP_SUPPORT=y +# CONFIG_NFS_V4_2_READ_PLUS is not set +CONFIG_NFSD=m +CONFIG_NFSD_V2_ACL=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_PNFS=y +CONFIG_NFSD_BLOCKLAYOUT=y +CONFIG_NFSD_SCSILAYOUT=y +CONFIG_NFSD_FLEXFILELAYOUT=y +CONFIG_NFSD_V4_2_INTER_SSC=y +CONFIG_NFSD_V4_SECURITY_LABEL=y +CONFIG_GRACE_PERIOD=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_NFS_V4_2_SSC_HELPER=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_SUNRPC_SWAP=y +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set +# CONFIG_SUNRPC_DEBUG is not set +CONFIG_SUNRPC_XPRT_RDMA=m +CONFIG_CEPH_FS=m +CONFIG_CEPH_FSCACHE=y +CONFIG_CEPH_FS_POSIX_ACL=y +# CONFIG_CEPH_FS_SECURITY_LABEL is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_SWN_UPCALL=y +# CONFIG_CIFS_SMB_DIRECT is not set +CONFIG_CIFS_FSCACHE=y +# CONFIG_SMB_SERVER is not set +CONFIG_SMBFS_COMMON=m +CONFIG_CODA_FS=m +CONFIG_AFS_FS=m +# CONFIG_AFS_DEBUG is not set +CONFIG_AFS_FSCACHE=y +# CONFIG_AFS_DEBUG_CURSOR is not set +CONFIG_9P_FS=m +CONFIG_9P_FSCACHE=y +CONFIG_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_MAC_ROMAN=m +CONFIG_NLS_MAC_CELTIC=m +CONFIG_NLS_MAC_CENTEURO=m +CONFIG_NLS_MAC_CROATIAN=m +CONFIG_NLS_MAC_CYRILLIC=m +CONFIG_NLS_MAC_GAELIC=m +CONFIG_NLS_MAC_GREEK=m +CONFIG_NLS_MAC_ICELAND=m +CONFIG_NLS_MAC_INUIT=m +CONFIG_NLS_MAC_ROMANIAN=m +CONFIG_NLS_MAC_TURKISH=m +CONFIG_NLS_UTF8=m +CONFIG_DLM=m +# CONFIG_DLM_DEBUG is not set +CONFIG_UNICODE=y +# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +CONFIG_TRUSTED_KEYS=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_KEY_DH_OPERATIONS=y +CONFIG_KEY_NOTIFICATIONS=y +CONFIG_SECURITY_DMESG_RESTRICT=y +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +CONFIG_PAGE_TABLE_ISOLATION=y +# CONFIG_SECURITY_INFINIBAND is not set +# CONFIG_SECURITY_NETWORK_XFRM is not set +CONFIG_SECURITY_PATH=y +CONFIG_INTEL_TXT=y +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +CONFIG_HARDENED_USERCOPY=y +# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set +CONFIG_FORTIFY_SOURCE=y +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SELINUX is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +CONFIG_SECURITY_APPARMOR=y +CONFIG_SECURITY_APPARMOR_HASH=y +CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y +# CONFIG_SECURITY_APPARMOR_DEBUG is not set +# CONFIG_SECURITY_LOADPIN is not set +CONFIG_SECURITY_YAMA=y +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +CONFIG_SECURITY_LANDLOCK=y +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +# CONFIG_EVM is not set +# CONFIG_DEFAULT_SECURITY_APPARMOR is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="yama,loadpin,safesetid,integrity" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization +# end of Kernel hardening options +# end of Security options + +CONFIG_XOR_BLOCKS=m +CONFIG_ASYNC_CORE=m +CONFIG_ASYNC_MEMCPY=m +CONFIG_ASYNC_XOR=m +CONFIG_ASYNC_PQ=m +CONFIG_ASYNC_RAID6_RECOV=m +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=m +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=m +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_PCRYPT=m +CONFIG_CRYPTO_CRYPTD=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_SIMD=m +CONFIG_CRYPTO_ENGINE=m + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=y +CONFIG_CRYPTO_ECC=m +CONFIG_CRYPTO_ECDH=m +CONFIG_CRYPTO_ECDSA=m +CONFIG_CRYPTO_ECRDSA=m +CONFIG_CRYPTO_SM2=m +CONFIG_CRYPTO_CURVE25519=m +CONFIG_CRYPTO_CURVE25519_X86=m + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_GCM=m +CONFIG_CRYPTO_CHACHA20POLY1305=m +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_ECHAINIV=m + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CFB=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_OFB=m +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_KEYWRAP=m +CONFIG_CRYPTO_NHPOLY1305=m +CONFIG_CRYPTO_NHPOLY1305_SSE2=m +CONFIG_CRYPTO_NHPOLY1305_AVX2=m +CONFIG_CRYPTO_ADIANTUM=m +CONFIG_CRYPTO_ESSIV=m + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_VMAC=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_CRC32C_INTEL=m +CONFIG_CRYPTO_CRC32=m +CONFIG_CRYPTO_CRC32_PCLMUL=m +CONFIG_CRYPTO_XXHASH=m +CONFIG_CRYPTO_BLAKE2B=m +CONFIG_CRYPTO_BLAKE2S=m +CONFIG_CRYPTO_BLAKE2S_X86=m +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m +CONFIG_CRYPTO_GHASH=m +CONFIG_CRYPTO_POLY1305=m +CONFIG_CRYPTO_POLY1305_X86_64=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_RMD160=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_SSSE3=m +CONFIG_CRYPTO_SHA256_SSSE3=m +CONFIG_CRYPTO_SHA512_SSSE3=m +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=m +CONFIG_CRYPTO_SM3=m +CONFIG_CRYPTO_STREEBOG=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_AES_TI=m +CONFIG_CRYPTO_AES_NI_INTEL=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_BLOWFISH_COMMON=m +CONFIG_CRYPTO_BLOWFISH_X86_64=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAMELLIA_X86_64=m +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m +CONFIG_CRYPTO_CAST_COMMON=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST5_AVX_X86_64=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_CAST6_AVX_X86_64=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_DES3_EDE_X86_64=m +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_CHACHA20=m +CONFIG_CRYPTO_CHACHA20_X86_64=m +CONFIG_CRYPTO_SEED=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m +CONFIG_CRYPTO_SERPENT_AVX_X86_64=m +CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m +# CONFIG_CRYPTO_SM4 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m +CONFIG_CRYPTO_TWOFISH_X86_64=m +CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m +CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_842=m +CONFIG_CRYPTO_LZ4=m +CONFIG_CRYPTO_LZ4HC=m +CONFIG_CRYPTO_ZSTD=y + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m +CONFIG_CRYPTO_DRBG_MENU=m +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=m +CONFIG_CRYPTO_JITTERENTROPY=m +CONFIG_CRYPTO_USER_API=m +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m +CONFIG_CRYPTO_USER_API_RNG=m +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set +CONFIG_CRYPTO_USER_API_AEAD=m +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +# CONFIG_CRYPTO_STATS is not set +CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=m +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m +CONFIG_CRYPTO_LIB_BLAKE2S=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_DES=m +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_DEV_PADLOCK=m +CONFIG_CRYPTO_DEV_PADLOCK_AES=m +CONFIG_CRYPTO_DEV_PADLOCK_SHA=m +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +CONFIG_CRYPTO_DEV_CCP=y +CONFIG_CRYPTO_DEV_CCP_DD=m +CONFIG_CRYPTO_DEV_SP_CCP=y +CONFIG_CRYPTO_DEV_CCP_CRYPTO=m +CONFIG_CRYPTO_DEV_SP_PSP=y +# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set +CONFIG_CRYPTO_DEV_QAT=m +# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set +CONFIG_CRYPTO_DEV_QAT_C3XXX=m +CONFIG_CRYPTO_DEV_QAT_C62X=m +# CONFIG_CRYPTO_DEV_QAT_4XXX is not set +CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m +CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m +CONFIG_CRYPTO_DEV_QAT_C62XVF=m +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +CONFIG_CRYPTO_DEV_CHELSIO=m +CONFIG_CRYPTO_DEV_VIRTIO=m +CONFIG_CRYPTO_DEV_SAFEXCEL=m +CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL_DEBUG is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE=m +CONFIG_X509_CERTIFICATE_PARSER=y +CONFIG_PKCS8_PRIVATE_KEY_PARSER=m +CONFIG_TPM_KEY_PARSER=m +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=m +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_LINEAR_RANGES=y +CONFIG_PACKING=y +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_CORDIC=m +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC64=m +CONFIG_CRC4=m +CONFIG_CRC7=m +CONFIG_LIBCRC32C=m +CONFIG_CRC8=m +CONFIG_XXHASH=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_842_COMPRESS=m +CONFIG_842_DECOMPRESS=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=m +CONFIG_LZ4HC_COMPRESS=m +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +# CONFIG_XZ_DEC_MICROLZMA is not set +CONFIG_XZ_DEC_BCJ=y +CONFIG_XZ_DEC_TEST=m +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_BCH=m +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_BTREE=y +CONFIG_INTERVAL_TREE=y +CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_SWIOTLB=y +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_SGL_ALLOC=y +CONFIG_IOMMU_HELPER=y +CONFIG_CHECK_SIGNATURE=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m +CONFIG_CLZ_TAB=y +CONFIG_IRQ_POLL=y +CONFIG_MPILIB=y +CONFIG_DIMLIB=y +CONFIG_OID_REGISTRY=y +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_6x10 is not set +# CONFIG_FONT_10x18 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +CONFIG_FONT_TER16x32=y +# CONFIG_FONT_6x8 is not set +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_MEMREGION=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +CONFIG_PARMAN=m +CONFIG_OBJAGG=m +# end of Library routines + +CONFIG_PLDMFW=y +CONFIG_ASN1_ENCODER=m + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +# +# Compile-time checks and compiler options +# +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_INFO_COMPRESSED is not set +# CONFIG_DEBUG_INFO_SPLIT is not set +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +# CONFIG_DEBUG_INFO_DWARF4 is not set +CONFIG_DEBUG_INFO_BTF=y +CONFIG_PAHOLE_HAS_SPLIT_BTF=y +CONFIG_DEBUG_INFO_BTF_MODULES=y +# CONFIG_GDB_SCRIPTS is not set +CONFIG_FRAME_WARN=1024 +CONFIG_STRIP_ASM_SYMS=y +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_STACK_VALIDATION=y +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +# end of Generic Kernel Debugging Instruments + +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + +# +# Memory Debugging +# +CONFIG_PAGE_EXTENSION=y +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set +CONFIG_PAGE_POISONING=y +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +CONFIG_DEBUG_WX=y +CONFIG_GENERIC_PTDUMP=y +CONFIG_PTDUMP_CORE=y +# CONFIG_PTDUMP_DEBUGFS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_SCHED_STACK_END_CHECK=y +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HARDLOCKUP_DETECTOR=y +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set +CONFIG_DEBUG_PREEMPT=y + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +CONFIG_WW_MUTEX_SELFTEST=m +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +CONFIG_DEBUG_LIST=y +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_DEBUG_NOTIFIERS=y +CONFIG_BUG_ON_DATA_CORRUPTION=y +# end of Debug kernel data structures + +CONFIG_DEBUG_CREDENTIALS=y + +# +# RCU Debugging +# +CONFIG_TORTURE_TEST=m +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_REF_SCALE_TEST=m +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACER_MAX_TRACE=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +# CONFIG_BOOTTIME_TRACING is not set +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_FUNCTION_PROFILER=y +# CONFIG_STACK_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +CONFIG_SCHED_TRACER=y +CONFIG_HWLAT_TRACER=y +CONFIG_OSNOISE_TRACER=y +CONFIG_TIMERLAT_TRACER=y +CONFIG_MMIOTRACE=y +CONFIG_FTRACE_SYSCALLS=y +CONFIG_TRACER_SNAPSHOT=y +# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_KPROBE_EVENTS=y +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +CONFIG_UPROBE_EVENTS=y +CONFIG_BPF_EVENTS=y +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_BPF_KPROBE_OVERRIDE=y +CONFIG_FTRACE_MCOUNT_RECORD=y +CONFIG_FTRACE_MCOUNT_USE_CC=y +CONFIG_TRACING_MAP=y +CONFIG_SYNTH_EVENTS=y +CONFIG_HIST_TRIGGERS=y +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_FTRACE_RECORD_RECURSION is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_MMIOTRACE_TEST is not set +CONFIG_PREEMPTIRQ_DELAY_TEST=m +# CONFIG_SYNTH_EVENT_GEN_TEST is not set +CONFIG_KPROBE_EVENT_GEN_TEST=m +# CONFIG_HIST_TRIGGERS_DEBUG is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +CONFIG_STRICT_DEVMEM=y +CONFIG_IO_STRICT_DEVMEM=y + +# +# x86 Debugging +# +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_X86_VERBOSE_BOOTUP=y +CONFIG_EARLY_PRINTK=y +# CONFIG_EARLY_PRINTK_DBGP is not set +# CONFIG_EARLY_PRINTK_USB_XDBC is not set +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_DEBUG_TLBFLUSH is not set +# CONFIG_IOMMU_DEBUG is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +CONFIG_IO_DELAY_0X80=y +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_DEBUG_BOOT_PARAMS is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +CONFIG_X86_DEBUG_FPU=y +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_UNWINDER_ORC=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UNWINDER_GUESS is not set +# end of x86 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +CONFIG_FUNCTION_ERROR_INJECTION=y +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +CONFIG_RUNTIME_TESTING_MENU=y +CONFIG_LKDTM=m +# CONFIG_TEST_MIN_HEAP is not set +# CONFIG_TEST_DIV64 is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_RBTREE_TEST is not set +# CONFIG_REED_SOLOMON_TEST is not set +# CONFIG_INTERVAL_TREE_TEST is not set +# CONFIG_PERCPU_TEST is not set +# CONFIG_ATOMIC64_SELFTEST is not set +CONFIG_ASYNC_RAID6_TEST=m +# CONFIG_TEST_HEXDUMP is not set +# CONFIG_STRING_SELFTEST is not set +CONFIG_TEST_STRING_HELPERS=m +# CONFIG_TEST_STRSCPY is not set +CONFIG_TEST_KSTRTOX=m +CONFIG_TEST_PRINTF=m +CONFIG_TEST_SCANF=m +CONFIG_TEST_BITMAP=m +CONFIG_TEST_UUID=m +# CONFIG_TEST_XARRAY is not set +# CONFIG_TEST_OVERFLOW is not set +# CONFIG_TEST_RHASHTABLE is not set +CONFIG_TEST_HASH=m +# CONFIG_TEST_IDA is not set +CONFIG_TEST_PARMAN=m +# CONFIG_TEST_LKM is not set +# CONFIG_TEST_BITOPS is not set +# CONFIG_TEST_VMALLOC is not set +# CONFIG_TEST_USER_COPY is not set +# CONFIG_TEST_BPF is not set +# CONFIG_TEST_BLACKHOLE_DEV is not set +# CONFIG_FIND_BIT_BENCHMARK is not set +# CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set +# CONFIG_TEST_UDELAY is not set +CONFIG_TEST_STATIC_KEYS=m +# CONFIG_TEST_KMOD is not set +# CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_OBJAGG is not set +# CONFIG_TEST_STACKINIT is not set +# CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_FREE_PAGES is not set +CONFIG_TEST_FPU=m +CONFIG_TEST_CLOCKSOURCE_WATCHDOG=m +CONFIG_ARCH_USE_MEMTEST=y +CONFIG_MEMTEST=y +# CONFIG_HYPERV_TESTING is not set +# end of Kernel Testing and Coverage +# end of Kernel hacking + diff --git a/repo/linux/linux-src/fix-sbase-coreutils.patch b/repo/linux/linux-src/fix-sbase-coreutils.patch new file mode 100644 index 0000000..27f2a95 --- /dev/null +++ b/repo/linux/linux-src/fix-sbase-coreutils.patch @@ -0,0 +1,137 @@ +diff -rNu a/arch/arc/boot/Makefile b/arch/arc/boot/Makefile +--- a/arch/arc/boot/Makefile 2022-03-08 18:11:18.465678852 +0000 ++++ b/arch/arc/boot/Makefile 2022-03-08 19:14:39.092796488 +0000 +@@ -7,7 +7,7 @@ + OBJCOPYFLAGS= -O binary -R .note -R .note.gnu.build-id -R .comment -S + + LINUX_START_TEXT = $$($(READELF) -h vmlinux | \ +- grep "Entry point address" | grep -o 0x.*) ++ grep "Entry point address" | ggrep -o 0x.*) + + UIMAGE_LOADADDR = $(CONFIG_LINUX_LINK_BASE) + UIMAGE_ENTRYADDR = $(LINUX_START_TEXT) +diff -rNu a/arch/x86/Makefile b/arch/x86/Makefile +--- a/arch/x86/Makefile 2022-03-08 18:11:18.639015396 +0000 ++++ b/arch/x86/Makefile 2022-03-08 22:31:30.242604366 +0000 +@@ -252,7 +252,7 @@ + endif + $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE) + $(Q)mkdir -p $(objtree)/arch/$(UTS_MACHINE)/boot +- $(Q)ln -fsn ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/$@ ++ $(Q)ln -fs ../../x86/boot/bzImage $(objtree)/arch/$(UTS_MACHINE)/boot/$@ + + $(BOOT_TARGETS): vmlinux + $(Q)$(MAKE) $(build)=$(boot) $@ +diff -rNu a/Documentation/devicetree/bindings/Makefile b/Documentation/devicetree/bindings/Makefile +--- a/Documentation/devicetree/bindings/Makefile 2022-03-08 18:11:18.385677370 +0000 ++++ b/Documentation/devicetree/bindings/Makefile 2022-03-08 19:14:39.092796488 +0000 +@@ -15,7 +15,7 @@ + echo "Current PATH is:" >&2; \ + echo "$$PATH" >&2; false; } + @{ echo $(DT_SCHEMA_MIN_VERSION); \ +- $(DT_DOC_CHECKER) --version 2>/dev/null || echo 0; } | sort -Vc >/dev/null || \ ++ $(DT_DOC_CHECKER) --version 2>/dev/null || echo 0; } | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -c >/dev/null || \ + { echo "ERROR: dtschema minimum version is v$(DT_SCHEMA_MIN_VERSION)" >&2; false; } + + quiet_cmd_extract_ex = DTEX $@ +diff -rNu a/Makefile b/Makefile +--- a/Makefile 2022-03-08 18:11:18.462345457 +0000 ++++ b/Makefile 2022-03-08 22:30:31.351528535 +0000 +@@ -579,7 +579,7 @@ + echo >&2 "***"; \ + false; \ + fi +- $(Q)ln -fsn $(srctree) source ++ $(Q)ln -fs $(srctree) source + $(call cmd,makefile) + $(Q)test -e .gitignore || \ + { echo "# this is build directory, ignore it"; echo "*"; } > .gitignore +@@ -1695,7 +1695,7 @@ + PHONY += scripts_gdb + scripts_gdb: prepare0 + $(Q)$(MAKE) $(build)=scripts/gdb +- $(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py) ++ $(Q)ln -fs $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py) + + ifdef CONFIG_GDB_SCRIPTS + all: scripts_gdb +diff -rNu a/scripts/gdb/linux/Makefile b/scripts/gdb/linux/Makefile +--- a/scripts/gdb/linux/Makefile 2022-03-08 18:11:19.369028916 +0000 ++++ b/scripts/gdb/linux/Makefile 2022-03-08 22:31:15.895675602 +0000 +@@ -5,7 +5,7 @@ + symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py)) + + quiet_cmd_symlink = SYMLINK $@ +- cmd_symlink = ln -fsn $(patsubst $(obj)/%,$(abspath $(srctree))/$(src)/%,$@) $@ ++ cmd_symlink = ln -fs $(patsubst $(obj)/%,$(abspath $(srctree))/$(src)/%,$@) $@ + + always-y += $(symlinks) + $(addprefix $(obj)/, $(symlinks)): FORCE +diff -rNu a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile +--- a/tools/lib/bpf/Makefile 2022-03-08 18:11:19.425696632 +0000 ++++ b/tools/lib/bpf/Makefile 2022-03-08 19:14:39.056129138 +0000 +@@ -6,8 +6,8 @@ + + VERSION_SCRIPT := libbpf.map + LIBBPF_VERSION := $(shell \ +- grep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \ +- sort -rV | head -n1 | cut -d'_' -f2) ++ ggrep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \ ++ sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -r | head -n1 | cut -d'_' -f2) + LIBBPF_MAJOR_VERSION := $(word 1,$(subst ., ,$(LIBBPF_VERSION))) + LIBBPF_MINOR_VERSION := $(word 2,$(subst ., ,$(LIBBPF_VERSION))) + +@@ -130,7 +130,7 @@ + VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \ + sed 's/\[.*\]//' | \ + awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \ +- grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l) ++ ggrep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l) + + CMD_TARGETS = $(LIB_TARGET) $(PC_FILE) + +@@ -193,7 +193,7 @@ + readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \ + sed 's/\[.*\]//' | \ + awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'| \ +- grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \ ++ ggrep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | \ + sort -u > $(OUTPUT)libbpf_versioned_syms.tmp; \ + diff -u $(OUTPUT)libbpf_global_syms.tmp \ + $(OUTPUT)libbpf_versioned_syms.tmp; \ +@@ -202,8 +202,8 @@ + exit 1; \ + fi + +-HDR_MAJ_VERSION := $(shell grep -oE '^$(pound)define LIBBPF_MAJOR_VERSION ([0-9]+)$$' libbpf_version.h | cut -d' ' -f3) +-HDR_MIN_VERSION := $(shell grep -oE '^$(pound)define LIBBPF_MINOR_VERSION ([0-9]+)$$' libbpf_version.h | cut -d' ' -f3) ++HDR_MAJ_VERSION := $(shell ggrep -oE '^$(pound)define LIBBPF_MAJOR_VERSION ([0-9]+)$$' libbpf_version.h | cut -d' ' -f3) ++HDR_MIN_VERSION := $(shell ggrep -oE '^$(pound)define LIBBPF_MINOR_VERSION ([0-9]+)$$' libbpf_version.h | cut -d' ' -f3) + + check_version: $(VERSION_SCRIPT) libbpf_version.h + @if [ "$(HDR_MAJ_VERSION)" != "$(LIBBPF_MAJOR_VERSION)" ]; then \ +diff -rNu a/tools/objtool/Makefile b/tools/objtool/Makefile +--- a/tools/objtool/Makefile 2022-03-08 18:11:19.429030027 +0000 ++++ b/tools/objtool/Makefile 2022-03-08 19:14:39.056129138 +0000 +@@ -34,7 +34,7 @@ + LDFLAGS += $(LIBELF_LIBS) $(LIBSUBCMD) $(KBUILD_HOSTLDFLAGS) + + # Allow old libelf to be used: +-elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E - | grep elf_getshdr) ++elfshdr := $(shell echo '$(pound)include <libelf.h>' | $(CC) $(CFLAGS) -x c -E - | ggrep elf_getshdr) + CFLAGS += $(if $(elfshdr),,-DLIBELF_USE_DEPRECATED) + + AWK = awk +diff -rNu a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh +--- a/scripts/link-vmlinux.sh 2022-03-12 19:18:55.306065317 +0000 ++++ b/scripts/link-vmlinux.sh 2022-03-12 19:17:31.794505850 +0000 +@@ -231,7 +231,7 @@ + --strip-all ${1} ${2} 2>/dev/null + # Change e_type to ET_REL so that it can be used to link final vmlinux. + # Unlike GNU ld, lld does not allow an ET_EXEC input. +- printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none ++ printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 + } + + # Create ${2} .S file with all symbols from the ${1} object file + diff --git a/repo/linux/linux-src.xibuild b/repo/linux/linux-src/linux-src.xibuild index d4d704e..d4d704e 100644 --- a/repo/linux/linux-src.xibuild +++ b/repo/linux/linux-src/linux-src.xibuild diff --git a/repo/linux/linux.xibuild b/repo/linux/linux/linux.xibuild index 1abf645..1abf645 100644 --- a/repo/linux/linux.xibuild +++ b/repo/linux/linux/linux.xibuild diff --git a/repo/media/alsa-firmware.xibuild b/repo/media/alsa-firmware/alsa-firmware.xibuild index d6311a9..d6311a9 100644 --- a/repo/media/alsa-firmware.xibuild +++ b/repo/media/alsa-firmware/alsa-firmware.xibuild diff --git a/repo/media/alsa-firmware/use-uint32_t-instead-u_int32_t.patch b/repo/media/alsa-firmware/use-uint32_t-instead-u_int32_t.patch new file mode 100644 index 0000000..70112fd --- /dev/null +++ b/repo/media/alsa-firmware/use-uint32_t-instead-u_int32_t.patch @@ -0,0 +1,52 @@ +diff -rNu a/hdsploader/digiface_firmware.dat b/hdsploader/digiface_firmware.dat +--- a/hdsploader/digiface_firmware.dat 2020-10-20 12:28:42.000000000 +0100 ++++ b/hdsploader/digiface_firmware.dat 2022-03-09 18:13:56.491133428 +0000 +@@ -1,5 +1,5 @@ + /* stored in little-endian */ +-static u_int32_t digiface_firmware[24413] = { ++static uint32_t digiface_firmware[24413] = { + 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000, + 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000, + 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a, +diff -rNu a/hdsploader/digiface_firmware_rev11.dat b/hdsploader/digiface_firmware_rev11.dat +--- a/hdsploader/digiface_firmware_rev11.dat 2020-10-20 12:28:42.000000000 +0100 ++++ b/hdsploader/digiface_firmware_rev11.dat 2022-03-09 18:13:56.491133428 +0000 +@@ -1,5 +1,5 @@ + /* stored in little-endian */ +-static u_int32_t digiface_firmware_rev11[24413] = { ++static uint32_t digiface_firmware_rev11[24413] = { + 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000, + 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000, + 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a, +diff -rNu a/hdsploader/multiface_firmware.dat b/hdsploader/multiface_firmware.dat +--- a/hdsploader/multiface_firmware.dat 2020-10-20 12:28:42.000000000 +0100 ++++ b/hdsploader/multiface_firmware.dat 2022-03-09 18:13:56.491133428 +0000 +@@ -1,5 +1,5 @@ + /* stored in little-endian */ +-static u_int32_t multiface_firmware[24413] = { ++static uint32_t multiface_firmware[24413] = { + 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000, + 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000, + 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a, +diff -rNu a/hdsploader/multiface_firmware_rev11.dat b/hdsploader/multiface_firmware_rev11.dat +--- a/hdsploader/multiface_firmware_rev11.dat 2020-10-20 12:28:42.000000000 +0100 ++++ b/hdsploader/multiface_firmware_rev11.dat 2022-03-09 18:13:56.491133428 +0000 +@@ -1,5 +1,5 @@ + /* stored in little-endian */ +-static u_int32_t multiface_firmware_rev11[24413] = { ++static uint32_t multiface_firmware_rev11[24413] = { + 0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000, + 0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000, + 0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a, +diff -rNu a/hdsploader/tobin.c b/hdsploader/tobin.c +--- a/hdsploader/tobin.c 2020-10-20 12:28:42.000000000 +0100 ++++ b/hdsploader/tobin.c 2022-03-09 18:13:56.491133428 +0000 +@@ -8,7 +8,7 @@ + #include "multiface_firmware.dat" + #include "multiface_firmware_rev11.dat" + +-int write_bin_file(u_int32_t *array, const char *filename) ++int write_bin_file(uint32_t *array, const char *filename) + { + FILE *out; + diff --git a/repo/media/alsa-lib.xibuild b/repo/media/alsa-lib/alsa-lib.xibuild index f6e9d1b..f6e9d1b 100644 --- a/repo/media/alsa-lib.xibuild +++ b/repo/media/alsa-lib/alsa-lib.xibuild diff --git a/repo/media/alsa-plugins.xibuild b/repo/media/alsa-plugins/alsa-plugins.xibuild index f7aac13..f7aac13 100644 --- a/repo/media/alsa-plugins.xibuild +++ b/repo/media/alsa-plugins/alsa-plugins.xibuild diff --git a/repo/media/alsa-tools.xibuild b/repo/media/alsa-tools/alsa-tools.xibuild index 5901538..5901538 100644 --- a/repo/media/alsa-tools.xibuild +++ b/repo/media/alsa-tools/alsa-tools.xibuild diff --git a/repo/media/alsa-utils.xibuild b/repo/media/alsa-utils/alsa-utils.xibuild index cd8c644..cd8c644 100644 --- a/repo/media/alsa-utils.xibuild +++ b/repo/media/alsa-utils/alsa-utils.xibuild diff --git a/repo/media/aom.xibuild b/repo/media/aom/aom.xibuild index 66aaa4b..66aaa4b 100644 --- a/repo/media/aom.xibuild +++ b/repo/media/aom/aom.xibuild diff --git a/repo/media/aom/fix-stack-size-e53da0b.patch b/repo/media/aom/fix-stack-size-e53da0b.patch new file mode 100644 index 0000000..d8206e8 --- /dev/null +++ b/repo/media/aom/fix-stack-size-e53da0b.patch @@ -0,0 +1,78 @@ +From e53da0b1bf2652896bed7b65929a1d8d0729d922 Mon Sep 17 00:00:00 2001 +From: Wan-Teh Chang <wtc@google.com> +Date: Thu, 27 Aug 2020 20:49:03 -0700 +Subject: [PATCH] Ensure thread stack size is at least 256 KB + +BUG=aomedia:2754 + +Change-Id: Ia6e211f9b87bc2efe376e7b9f4adb11741850b18 +--- + +diff --git a/aom_util/aom_thread.c b/aom_util/aom_thread.c +index a749a22..8411569 100644 +--- a/aom_util/aom_thread.c ++++ b/aom_util/aom_thread.c +@@ -133,16 +133,39 @@ + goto Error; + } + if (pthread_cond_init(&worker->impl_->condition_, NULL)) { +- pthread_mutex_destroy(&worker->impl_->mutex_); +- goto Error; ++ goto Error1; + } ++ pthread_attr_t *attr = NULL; ++#if HAVE_PTHREAD_H ++ pthread_attr_t thread_attributes; ++ attr = &thread_attributes; ++ if (pthread_attr_init(attr)) { ++ goto Error2; ++ } ++ size_t stack_size; ++ if (pthread_attr_getstacksize(attr, &stack_size)) { ++ pthread_attr_destroy(attr); ++ goto Error2; ++ } ++ const size_t kMinStackSize = 256 * 1024; ++ if (stack_size < kMinStackSize && ++ pthread_attr_setstacksize(attr, kMinStackSize)) { ++ pthread_attr_destroy(attr); ++ goto Error2; ++ } ++#endif // HAVE_PTHREAD_H + pthread_mutex_lock(&worker->impl_->mutex_); +- ok = !pthread_create(&worker->impl_->thread_, NULL, thread_loop, worker); ++ ok = !pthread_create(&worker->impl_->thread_, attr, thread_loop, worker); + if (ok) worker->status_ = OK; + pthread_mutex_unlock(&worker->impl_->mutex_); ++#if HAVE_PTHREAD_H ++ pthread_attr_destroy(attr); ++#endif + if (!ok) { +- pthread_mutex_destroy(&worker->impl_->mutex_); ++ Error2: + pthread_cond_destroy(&worker->impl_->condition_); ++ Error1: ++ pthread_mutex_destroy(&worker->impl_->mutex_); + Error: + aom_free(worker->impl_); + worker->impl_ = NULL; +diff --git a/aom_util/aom_thread.h b/aom_util/aom_thread.h +index 8d04312..efbed78 100644 +--- a/aom_util/aom_thread.h ++++ b/aom_util/aom_thread.h +@@ -32,6 +32,7 @@ + #include <process.h> // NOLINT + #include <windows.h> // NOLINT + typedef HANDLE pthread_t; ++typedef int pthread_attr_t; + typedef CRITICAL_SECTION pthread_mutex_t; + + #if _WIN32_WINNT < 0x0600 +@@ -147,6 +148,7 @@ + #include <sys/builtin.h> // NOLINT + + #define pthread_t TID ++#define pthread_attr_t int + #define pthread_mutex_t HMTX + + typedef struct { diff --git a/repo/media/audiofile.xibuild b/repo/media/audiofile/audiofile.xibuild index 3a7de56..3a7de56 100644 --- a/repo/media/audiofile.xibuild +++ b/repo/media/audiofile/audiofile.xibuild diff --git a/repo/media/babl.xibuild b/repo/media/babl/babl.xibuild index f786806..f786806 100644 --- a/repo/media/babl.xibuild +++ b/repo/media/babl/babl.xibuild diff --git a/repo/media/babl/meson-0.60.patch b/repo/media/babl/meson-0.60.patch new file mode 100644 index 0000000..5ac3862 --- /dev/null +++ b/repo/media/babl/meson-0.60.patch @@ -0,0 +1,12 @@ +--- a/meson.build ++++ b/meson.build +@@ -55,8 +55,7 @@ + stability_version_number = (major_version != 0 ? minor_version : micro_version) + stable = (stability_version_number % 2 == 0) + +-conf.set10('BABL_UNSTABLE', not stable, Description: +- 'Define to 1 if this is an unstable version of BABL.') ++conf.set10('BABL_UNSTABLE', not stable) + + conf.set ('BABL_MAJOR_VERSION', '@0@'.format(major_version)) + conf.set ('BABL_MINOR_VERSION', '@0@'.format(minor_version)) diff --git a/repo/media/dav1d.xibuild b/repo/media/dav1d/dav1d.xibuild index a25471b..a25471b 100644 --- a/repo/media/dav1d.xibuild +++ b/repo/media/dav1d/dav1d.xibuild diff --git a/repo/media/dav1d/fix-asmcheck.patch b/repo/media/dav1d/fix-asmcheck.patch new file mode 100644 index 0000000..922db6e --- /dev/null +++ b/repo/media/dav1d/fix-asmcheck.patch @@ -0,0 +1,63 @@ +Patch-Source: https://code.videolan.org/videolan/dav1d/-/merge_requests/1406 +From 87f9a81cd770e49394a45deca7a3df41243de00b Mon Sep 17 00:00:00 2001 +From: Henrik Gramner <gramner@twoorioles.com> +Date: Sat, 19 Mar 2022 03:09:31 +0100 +Subject: [PATCH] checkasm: Fix alignment of stack buffers in the film grain + tests + +--- + tests/checkasm/filmgrain.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tests/checkasm/filmgrain.c b/tests/checkasm/filmgrain.c +index ff7ffc36..9aa4f269 100644 +--- a/tests/checkasm/filmgrain.c ++++ b/tests/checkasm/filmgrain.c +@@ -83,9 +83,9 @@ static void check_gen_grny(const Dav1dFilmGrainDSPContext *const dsp) { + } + + static void check_gen_grnuv(const Dav1dFilmGrainDSPContext *const dsp) { +- entry grain_lut_y[GRAIN_HEIGHT + 1][GRAIN_WIDTH]; +- entry grain_lut_c[GRAIN_HEIGHT][GRAIN_WIDTH]; +- entry grain_lut_a[GRAIN_HEIGHT + 1][GRAIN_WIDTH]; ++ ALIGN_STK_16(entry, grain_lut_y, GRAIN_HEIGHT + 1,[GRAIN_WIDTH]); ++ ALIGN_STK_16(entry, grain_lut_c, GRAIN_HEIGHT, [GRAIN_WIDTH]); ++ ALIGN_STK_16(entry, grain_lut_a, GRAIN_HEIGHT + 1,[GRAIN_WIDTH]); + + declare_func(void, entry grain_lut[][GRAIN_WIDTH], + const entry grain_lut_y[][GRAIN_WIDTH], +@@ -155,6 +155,7 @@ static void check_fgy_sbrow(const Dav1dFilmGrainDSPContext *const dsp) { + + if (check_func(dsp->fgy_32x32xn, "fgy_32x32xn_%dbpc", BITDEPTH)) { + ALIGN_STK_16(Dav1dFilmGrainData, fg_data, 16,); ++ ALIGN_STK_16(entry, grain_lut, GRAIN_HEIGHT + 1,[GRAIN_WIDTH]); + ALIGN_STK_64(uint8_t, scaling, SCALING_SIZE,); + fg_data[0].seed = rnd() & 0xFFFF; + +@@ -164,7 +165,6 @@ static void check_fgy_sbrow(const Dav1dFilmGrainDSPContext *const dsp) { + const int bitdepth_max = 0xff; + #endif + +- entry grain_lut[GRAIN_HEIGHT + 1][GRAIN_WIDTH]; + fg_data[0].grain_scale_shift = rnd() & 3; + fg_data[0].ar_coeff_shift = (rnd() & 3) + 6; + fg_data[0].ar_coeff_lag = rnd() & 3; +@@ -267,6 +267,7 @@ static void check_fguv_sbrow(const Dav1dFilmGrainDSPContext *const dsp) { + BITDEPTH, ss_name[layout_idx], csfl)) + { + ALIGN_STK_16(Dav1dFilmGrainData, fg_data, 1,); ++ ALIGN_STK_16(entry, grain_lut, 2,[GRAIN_HEIGHT + 1][GRAIN_WIDTH]); + ALIGN_STK_64(uint8_t, scaling, SCALING_SIZE,); + + fg_data[0].seed = rnd() & 0xFFFF; +@@ -279,7 +280,6 @@ static void check_fguv_sbrow(const Dav1dFilmGrainDSPContext *const dsp) { + const int uv_pl = rnd() & 1; + const int is_identity = rnd() & 1; + +- entry grain_lut[2][GRAIN_HEIGHT + 1][GRAIN_WIDTH]; + fg_data[0].grain_scale_shift = rnd() & 3; + fg_data[0].ar_coeff_shift = (rnd() & 3) + 6; + fg_data[0].ar_coeff_lag = rnd() & 3; +-- +GitLab + diff --git a/repo/media/exiv2.xibuild b/repo/media/exiv2/exiv2.xibuild index 9a640bc..9a640bc 100644 --- a/repo/media/exiv2.xibuild +++ b/repo/media/exiv2/exiv2.xibuild diff --git a/repo/media/faac.xibuild b/repo/media/faac/faac.xibuild index 07b66fd..07b66fd 100644 --- a/repo/media/faac.xibuild +++ b/repo/media/faac/faac.xibuild diff --git a/repo/media/faad2.xibuild b/repo/media/faad2/faad2.xibuild index e1c158d..e1c158d 100644 --- a/repo/media/faad2.xibuild +++ b/repo/media/faad2/faad2.xibuild diff --git a/repo/media/fdk-aac.xibuild b/repo/media/fdk-aac/fdk-aac.xibuild index c4aee9b..c4aee9b 100644 --- a/repo/media/fdk-aac.xibuild +++ b/repo/media/fdk-aac/fdk-aac.xibuild diff --git a/repo/media/ffmpeg/0001-ffbuild-libversion.sh-add-shebang.patch b/repo/media/ffmpeg/0001-ffbuild-libversion.sh-add-shebang.patch new file mode 100644 index 0000000..1df1691 --- /dev/null +++ b/repo/media/ffmpeg/0001-ffbuild-libversion.sh-add-shebang.patch @@ -0,0 +1,24 @@ +From 3eb43e2e9df80baad20722b3698e6995a546853a Mon Sep 17 00:00:00 2001 +From: Carlo Landmeter <clandmeter@alpinelinux.org> +Date: Tue, 29 Jun 2021 11:56:32 +0000 +Subject: [PATCH] ffbuild/libversion.sh: add shebang + +when using something like qemu-user where argv[0] is qemu the script +will not be exexuted by the shell. +--- + ffbuild/libversion.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/ffbuild/libversion.sh b/ffbuild/libversion.sh +index 990ce9f640..30046b1d25 100755 +--- a/ffbuild/libversion.sh ++++ b/ffbuild/libversion.sh +@@ -1,3 +1,5 @@ ++#!/bin/sh ++ + toupper(){ + echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ + } +-- +2.32.0 + diff --git a/repo/media/ffmpeg/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch b/repo/media/ffmpeg/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch new file mode 100644 index 0000000..9cc6fdf --- /dev/null +++ b/repo/media/ffmpeg/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch @@ -0,0 +1,55 @@ +From ab11be0becb90542f10d5713659b559842c53af2 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Tue, 29 Mar 2016 15:15:17 +0200 +Subject: [PATCH] libavutil: clean up unused FF_SYMVER macro + +There is nothing using it since commit d63443b9 (lavc: drop the +av_fast_{re,m}alloc compatibility wrappers). + +Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> +--- + libavutil/internal.h | 28 ---------------------------- + 1 file changed, 28 deletions(-) + +diff --git a/libavutil/internal.h b/libavutil/internal.h +index 61784b5..69d63d5 100644 +--- a/libavutil/internal.h ++++ b/libavutil/internal.h +@@ -187,34 +187,6 @@ + #endif + + /** +- * Define a function with only the non-default version specified. +- * +- * On systems with ELF shared libraries, all symbols exported from +- * FFmpeg libraries are tagged with the name and major version of the +- * library to which they belong. If a function is moved from one +- * library to another, a wrapper must be retained in the original +- * location to preserve binary compatibility. +- * +- * Functions defined with this macro will never be used to resolve +- * symbols by the build-time linker. +- * +- * @param type return type of function +- * @param name name of function +- * @param args argument list of function +- * @param ver version tag to assign function +- */ +-#if HAVE_SYMVER_ASM_LABEL +-# define FF_SYMVER(type, name, args, ver) \ +- type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ +- type ff_##name args +-#elif HAVE_SYMVER_GNU_ASM +-# define FF_SYMVER(type, name, args, ver) \ +- __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ +- type ff_##name args; \ +- type ff_##name args +-#endif +- +-/** + * Return NULL if a threading library has not been enabled. + * Used to disable threading functions in AVCodec definitions + * when not needed. +-- +2.7.4 + diff --git a/repo/media/ffmpeg/add-av_stream_get_first_dts-for-chromium.patch b/repo/media/ffmpeg/add-av_stream_get_first_dts-for-chromium.patch new file mode 100644 index 0000000..1ba7b76 --- /dev/null +++ b/repo/media/ffmpeg/add-av_stream_get_first_dts-for-chromium.patch @@ -0,0 +1,45 @@ +Patch-Source: https://github.com/archlinux/svntogit-packages/blob/afdf00ac125851675c1599ab46545f6c58cfb655/trunk/add-av_stream_get_first_dts-for-chromium.patch +From 95aab0fd83619408995720ce53d7a74790580220 Mon Sep 17 00:00:00 2001 +From: "liberato@chromium.org" <liberato@chromium.org> +Date: Wed, 7 Jul 2021 19:01:22 -0700 +Subject: [PATCH] Add av_stream_get_first_dts for Chromium + +[foutrelis: adjust for new FFStream struct replacing AVStreamInternal] +--- + libavformat/avformat.h | 4 ++++ + libavformat/utils.c | 7 +++++++ + 2 files changed, 11 insertions(+) + +diff --git a/libavformat/avformat.h b/libavformat/avformat.h +index cd7b0d941c..b4a6dce885 100644 +--- a/libavformat/avformat.h ++++ b/libavformat/avformat.h +@@ -1010,6 +1010,10 @@ struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + */ + int64_t av_stream_get_end_pts(const AVStream *st); + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st); ++// Chromium: We use the internal field first_dts ^^^ ++ + #define AV_PROGRAM_RUNNING 1 + + /** +diff --git a/libavformat/utils.c b/libavformat/utils.c +index de7580c32d..0ef0fe530e 100644 +--- a/libavformat/utils.c ++++ b/libavformat/utils.c +@@ -121,6 +121,13 @@ int64_t av_stream_get_end_pts(const AVStream *st) + return AV_NOPTS_VALUE; + } + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st) ++{ ++ return cffstream(st)->first_dts; ++} ++// Chromium: We use the internal field first_dts ^^^ ++ + struct AVCodecParserContext *av_stream_get_parser(const AVStream *st) + { + return st->internal->parser; diff --git a/repo/media/ffmpeg.xibuild b/repo/media/ffmpeg/ffmpeg.xibuild index 6d7f960..6d7f960 100644 --- a/repo/media/ffmpeg.xibuild +++ b/repo/media/ffmpeg/ffmpeg.xibuild diff --git a/repo/media/ffmpeg4/0001-ffbuild-libversion.sh-add-shebang.patch b/repo/media/ffmpeg4/0001-ffbuild-libversion.sh-add-shebang.patch new file mode 100644 index 0000000..1df1691 --- /dev/null +++ b/repo/media/ffmpeg4/0001-ffbuild-libversion.sh-add-shebang.patch @@ -0,0 +1,24 @@ +From 3eb43e2e9df80baad20722b3698e6995a546853a Mon Sep 17 00:00:00 2001 +From: Carlo Landmeter <clandmeter@alpinelinux.org> +Date: Tue, 29 Jun 2021 11:56:32 +0000 +Subject: [PATCH] ffbuild/libversion.sh: add shebang + +when using something like qemu-user where argv[0] is qemu the script +will not be exexuted by the shell. +--- + ffbuild/libversion.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/ffbuild/libversion.sh b/ffbuild/libversion.sh +index 990ce9f640..30046b1d25 100755 +--- a/ffbuild/libversion.sh ++++ b/ffbuild/libversion.sh +@@ -1,3 +1,5 @@ ++#!/bin/sh ++ + toupper(){ + echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ + } +-- +2.32.0 + diff --git a/repo/media/ffmpeg4/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch b/repo/media/ffmpeg4/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch new file mode 100644 index 0000000..9cc6fdf --- /dev/null +++ b/repo/media/ffmpeg4/0001-libavutil-clean-up-unused-FF_SYMVER-macro.patch @@ -0,0 +1,55 @@ +From ab11be0becb90542f10d5713659b559842c53af2 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Tue, 29 Mar 2016 15:15:17 +0200 +Subject: [PATCH] libavutil: clean up unused FF_SYMVER macro + +There is nothing using it since commit d63443b9 (lavc: drop the +av_fast_{re,m}alloc compatibility wrappers). + +Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> +--- + libavutil/internal.h | 28 ---------------------------- + 1 file changed, 28 deletions(-) + +diff --git a/libavutil/internal.h b/libavutil/internal.h +index 61784b5..69d63d5 100644 +--- a/libavutil/internal.h ++++ b/libavutil/internal.h +@@ -187,34 +187,6 @@ + #endif + + /** +- * Define a function with only the non-default version specified. +- * +- * On systems with ELF shared libraries, all symbols exported from +- * FFmpeg libraries are tagged with the name and major version of the +- * library to which they belong. If a function is moved from one +- * library to another, a wrapper must be retained in the original +- * location to preserve binary compatibility. +- * +- * Functions defined with this macro will never be used to resolve +- * symbols by the build-time linker. +- * +- * @param type return type of function +- * @param name name of function +- * @param args argument list of function +- * @param ver version tag to assign function +- */ +-#if HAVE_SYMVER_ASM_LABEL +-# define FF_SYMVER(type, name, args, ver) \ +- type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ +- type ff_##name args +-#elif HAVE_SYMVER_GNU_ASM +-# define FF_SYMVER(type, name, args, ver) \ +- __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ +- type ff_##name args; \ +- type ff_##name args +-#endif +- +-/** + * Return NULL if a threading library has not been enabled. + * Used to disable threading functions in AVCodec definitions + * when not needed. +-- +2.7.4 + diff --git a/repo/media/ffmpeg4.xibuild b/repo/media/ffmpeg4/ffmpeg4.xibuild index f17b0ef..f17b0ef 100644 --- a/repo/media/ffmpeg4.xibuild +++ b/repo/media/ffmpeg4/ffmpeg4.xibuild diff --git a/repo/media/flac.xibuild b/repo/media/flac/flac.xibuild index b72f3a5..b72f3a5 100644 --- a/repo/media/flac.xibuild +++ b/repo/media/flac/flac.xibuild diff --git a/repo/media/gexiv2.xibuild b/repo/media/gexiv2/gexiv2.xibuild index 1aacbd4..1aacbd4 100644 --- a/repo/media/gexiv2.xibuild +++ b/repo/media/gexiv2/gexiv2.xibuild diff --git a/repo/media/lame.xibuild b/repo/media/lame/lame.xibuild index 311292b..311292b 100644 --- a/repo/media/lame.xibuild +++ b/repo/media/lame/lame.xibuild diff --git a/repo/media/libass.xibuild b/repo/media/libass/libass.xibuild index 60e3e04..60e3e04 100644 --- a/repo/media/libass.xibuild +++ b/repo/media/libass/libass.xibuild diff --git a/repo/media/libjpeg-turbo.xibuild b/repo/media/libjpeg-turbo/libjpeg-turbo.xibuild index 5840097..5840097 100644 --- a/repo/media/libjpeg-turbo.xibuild +++ b/repo/media/libjpeg-turbo/libjpeg-turbo.xibuild diff --git a/repo/media/libmpdclient.xibuild b/repo/media/libmpdclient/libmpdclient.xibuild index a80ad57..a80ad57 100644 --- a/repo/media/libmpdclient.xibuild +++ b/repo/media/libmpdclient/libmpdclient.xibuild diff --git a/repo/media/libmypaint.xibuild b/repo/media/libmypaint/libmypaint.xibuild index 87df793..87df793 100644 --- a/repo/media/libmypaint.xibuild +++ b/repo/media/libmypaint/libmypaint.xibuild diff --git a/repo/media/libogg.xibuild b/repo/media/libogg/libogg.xibuild index 51a6b9b..51a6b9b 100644 --- a/repo/media/libogg.xibuild +++ b/repo/media/libogg/libogg.xibuild diff --git a/repo/media/libraw.xibuild b/repo/media/libraw/libraw.xibuild index 5a06397..5a06397 100644 --- a/repo/media/libraw.xibuild +++ b/repo/media/libraw/libraw.xibuild diff --git a/repo/media/librist.xibuild b/repo/media/librist/librist.xibuild index a51c3fa..a51c3fa 100644 --- a/repo/media/librist.xibuild +++ b/repo/media/librist/librist.xibuild diff --git a/repo/media/libsamplerate.xibuild b/repo/media/libsamplerate/libsamplerate.xibuild index 1c3dd07..1c3dd07 100644 --- a/repo/media/libsamplerate.xibuild +++ b/repo/media/libsamplerate/libsamplerate.xibuild diff --git a/repo/media/libsndfile.xibuild b/repo/media/libsndfile/libsndfile.xibuild index 78ae0f1..78ae0f1 100644 --- a/repo/media/libsndfile.xibuild +++ b/repo/media/libsndfile/libsndfile.xibuild diff --git a/repo/media/libsrt/fix-cmake.patch b/repo/media/libsrt/fix-cmake.patch new file mode 100644 index 0000000..6193da2 --- /dev/null +++ b/repo/media/libsrt/fix-cmake.patch @@ -0,0 +1,39 @@ +Upstream: Should be, and they should fix it +Reason: Fixes a few issues + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ed6e603..5f899c1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -34,14 +34,8 @@ set_if(GNU ${CMAKE_SYSTEM_NAME} MATCHES "GNU") + set_if(POSIX LINUX OR DARWIN OR BSD OR (CYGWIN AND CYGWIN_USE_POSIX)) + set_if(SYMLINKABLE LINUX OR DARWIN OR BSD OR CYGWIN OR GNU) + +-# Not sure what to do in case of compiling by MSVC. +-# This will make installdir in C:\Program Files\SRT then +-# inside "bin" and "lib64" directories. At least this maintains +-# the current status. Shall this be not desired, override values +-# of CMAKE_INSTALL_BINDIR, CMAKE_INSTALL_LIBDIR and CMAKE_INSTALL_INCLUDEDIR. +-if (NOT DEFINED CMAKE_INSTALL_LIBDIR) +- include(GNUInstallDirs) +-endif() ++ ++include(GNUInstallDirs) + + set (SRT_VERSION 1.4.2) + set_version_variables(SRT_VERSION ${SRT_VERSION}) +@@ -59,14 +53,6 @@ endif() + # Set CMAKE_BUILD_TYPE properly, now that you know + # that ENABLE_DEBUG is set as it should. + +-if (ENABLE_DEBUG EQUAL 2) +- set (CMAKE_BUILD_TYPE "RelWithDebInfo") +-elseif (ENABLE_DEBUG) # 1, ON, YES, TRUE, Y, or any other non-zero number +- set (CMAKE_BUILD_TYPE "Debug") +-else() +- set (CMAKE_BUILD_TYPE "Release") +-endif() +- + message(STATUS "BUILD TYPE: ${CMAKE_BUILD_TYPE}") + + getVarsWith(ENFORCE_ enforcers) diff --git a/repo/media/libsrt.xibuild b/repo/media/libsrt/libsrt.xibuild index 3d79326..3d79326 100644 --- a/repo/media/libsrt.xibuild +++ b/repo/media/libsrt/libsrt.xibuild diff --git a/repo/media/libtheora.xibuild b/repo/media/libtheora/libtheora.xibuild index 64bfcc0..64bfcc0 100644 --- a/repo/media/libtheora.xibuild +++ b/repo/media/libtheora/libtheora.xibuild diff --git a/repo/media/libvorbis.xibuild b/repo/media/libvorbis/libvorbis.xibuild index 5952715..5952715 100644 --- a/repo/media/libvorbis.xibuild +++ b/repo/media/libvorbis/libvorbis.xibuild diff --git a/repo/media/libvpx.xibuild b/repo/media/libvpx/libvpx.xibuild index 7614473..7614473 100644 --- a/repo/media/libvpx.xibuild +++ b/repo/media/libvpx/libvpx.xibuild diff --git a/repo/media/libwebp.xibuild b/repo/media/libwebp/libwebp.xibuild index ff84576..ff84576 100644 --- a/repo/media/libwebp.xibuild +++ b/repo/media/libwebp/libwebp.xibuild diff --git a/repo/media/mpc-mpd.xibuild b/repo/media/mpc-mpd/mpc-mpd.xibuild index 2d6d5f3..2d6d5f3 100644 --- a/repo/media/mpc-mpd.xibuild +++ b/repo/media/mpc-mpd/mpc-mpd.xibuild diff --git a/repo/media/mpd/libcdio-paa-version.patch b/repo/media/mpd/libcdio-paa-version.patch new file mode 100644 index 0000000..82612b1 --- /dev/null +++ b/repo/media/mpd/libcdio-paa-version.patch @@ -0,0 +1,266 @@ +<!DOCTYPE html> +<html lang='en'> +<head> +<title>aports - Alpine packages build scripts +</title> +<meta name='generator' content='cgit v1.2.3'/> +<meta name='robots' content='index, nofollow'/> +<link rel='stylesheet' type='text/css' href='/cgit.css'/> +<link rel='shortcut icon' href='//alpinelinux.org/alpine-logo.ico'/> +<link rel='alternate' title='Atom feed' href='http://git.alpinelinux.org/aports/atom/?h=master' type='application/atom+xml'/> +<link rel='vcs-git' href='https://git.alpinelinux.org/aports' title='aports Git repository'/> +</head> +<body> +<div id='cgit'><table id='header'> +<tr> +<td class='logo' rowspan='2'><a href='/'><img src='//wiki.alpinelinux.org/images/alogo.png' alt='cgit logo'/></a></td> +<td class='main'><a href='/'>index</a> : <a title='aports' href='/aports/'>aports</a></td><td class='form'><form method='get'> +<select name='h' onchange='this.form.submit();'> +<option value='1.10-stable'>1.10-stable</option> +<option value='1.9'>1.9</option> +<option value='2.0-stable'>2.0-stable</option> +<option value='2.1-stable'>2.1-stable</option> +<option value='2.2-stable'>2.2-stable</option> +<option value='2.3-stable'>2.3-stable</option> +<option value='2.4-stable'>2.4-stable</option> +<option value='2.5-stable'>2.5-stable</option> +<option value='2.6-stable'>2.6-stable</option> +<option value='2.7-stable'>2.7-stable</option> +<option value='3.0-stable'>3.0-stable</option> +<option value='3.1-stable'>3.1-stable</option> +<option value='3.10-stable'>3.10-stable</option> +<option value='3.11-stable'>3.11-stable</option> +<option value='3.12-stable'>3.12-stable</option> +<option value='3.13-stable'>3.13-stable</option> +<option value='3.14-stable'>3.14-stable</option> +<option value='3.15-stable'>3.15-stable</option> +<option value='3.2-stable'>3.2-stable</option> +<option value='3.3-stable'>3.3-stable</option> +<option value='3.4-stable'>3.4-stable</option> +<option value='3.5-stable'>3.5-stable</option> +<option value='3.6-stable'>3.6-stable</option> +<option value='3.7-stable'>3.7-stable</option> +<option value='3.8-stable'>3.8-stable</option> +<option value='3.9-stable'>3.9-stable</option> +<option value='fs-upgrade-1.10.7'>fs-upgrade-1.10.7</option> +<option value='libcgroup'>libcgroup</option> +<option value='master' selected='selected'>master</option> +<option value='nuspell'>nuspell</option> +<option value='patches/3526'>patches/3526</option> +<option value='patches/3527'>patches/3527</option> +<option value='patches/3530'>patches/3530</option> +<option value='patches/3531'>patches/3531</option> +<option value='patches/3534'>patches/3534</option> +<option value='patches/3535'>patches/3535</option> +<option value='patches/3538'>patches/3538</option> +<option value='patches/3539'>patches/3539</option> +<option value='patches/3540'>patches/3540</option> +<option value='patches/3551'>patches/3551</option> +<option value='patches/3556'>patches/3556</option> +<option value='patches/3558'>patches/3558</option> +<option value='patches/3559'>patches/3559</option> +<option value='patches/3562'>patches/3562</option> +<option value='patches/3563'>patches/3563</option> +<option value='patches/3564'>patches/3564</option> +<option value='patches/3565'>patches/3565</option> +<option value='patches/3567'>patches/3567</option> +<option value='patches/3568'>patches/3568</option> +<option value='patches/3569'>patches/3569</option> +<option value='patches/3574'>patches/3574</option> +<option value='patches/3575'>patches/3575</option> +<option value='patches/3576'>patches/3576</option> +<option value='patches/3577'>patches/3577</option> +<option value='patches/3582'>patches/3582</option> +<option value='patches/3584'>patches/3584</option> +<option value='patches/3590'>patches/3590</option> +<option value='patches/3592'>patches/3592</option> +<option value='patches/3594'>patches/3594</option> +<option value='patches/3598'>patches/3598</option> +<option value='patches/3599'>patches/3599</option> +<option value='patches/3601'>patches/3601</option> +<option value='patches/3603'>patches/3603</option> +<option value='patches/3604'>patches/3604</option> +<option value='patches/3606'>patches/3606</option> +<option value='patches/3607'>patches/3607</option> +<option value='patches/3608'>patches/3608</option> +<option value='patches/3610'>patches/3610</option> +<option value='patches/3612'>patches/3612</option> +<option value='patches/3613'>patches/3613</option> +<option value='patches/3615'>patches/3615</option> +<option value='patches/3616'>patches/3616</option> +<option value='patches/3618'>patches/3618</option> +<option value='patches/3621'>patches/3621</option> +<option value='patches/3622'>patches/3622</option> +<option value='patches/3624'>patches/3624</option> +<option value='patches/3627'>patches/3627</option> +<option value='patches/3632'>patches/3632</option> +<option value='patches/3633'>patches/3633</option> +<option value='patches/3635'>patches/3635</option> +<option value='patches/3636'>patches/3636</option> +<option value='patches/3646'>patches/3646</option> +<option value='patches/3654'>patches/3654</option> +<option value='patches/3656'>patches/3656</option> +<option value='patches/3662'>patches/3662</option> +<option value='patches/3666'>patches/3666</option> +<option value='patches/3670'>patches/3670</option> +<option value='patches/3671'>patches/3671</option> +<option value='patches/3675'>patches/3675</option> +<option value='patches/3687'>patches/3687</option> +<option value='patches/3690'>patches/3690</option> +<option value='patches/3691'>patches/3691</option> +<option value='patches/3692'>patches/3692</option> +<option value='patches/3697'>patches/3697</option> +<option value='patches/3706'>patches/3706</option> +<option value='patches/3707'>patches/3707</option> +<option value='patches/3715'>patches/3715</option> +<option value='patches/3721'>patches/3721</option> +<option value='patches/3722'>patches/3722</option> +<option value='patches/3724'>patches/3724</option> +<option value='patches/3731'>patches/3731</option> +<option value='patches/3756'>patches/3756</option> +<option value='patches/3764'>patches/3764</option> +<option value='patches/3767'>patches/3767</option> +<option value='patches/3770'>patches/3770</option> +<option value='patches/3771'>patches/3771</option> +<option value='patches/3774'>patches/3774</option> +<option value='patches/3775'>patches/3775</option> +<option value='patches/3777'>patches/3777</option> +<option value='patches/3779'>patches/3779</option> +<option value='patches/3787'>patches/3787</option> +<option value='patches/3788'>patches/3788</option> +<option value='patches/3789'>patches/3789</option> +<option value='patches/3790'>patches/3790</option> +<option value='patches/3793'>patches/3793</option> +<option value='patches/3796'>patches/3796</option> +<option value='patches/3797'>patches/3797</option> +<option value='patches/3798'>patches/3798</option> +<option value='patches/3799'>patches/3799</option> +<option value='patches/3800'>patches/3800</option> +<option value='patches/3802'>patches/3802</option> +<option value='patches/3803'>patches/3803</option> +<option value='patches/3804'>patches/3804</option> +<option value='patches/3805'>patches/3805</option> +<option value='patches/3808'>patches/3808</option> +<option value='patches/3811'>patches/3811</option> +<option value='patches/3813'>patches/3813</option> +<option value='patches/3816'>patches/3816</option> +<option value='patches/3818'>patches/3818</option> +<option value='patches/3820'>patches/3820</option> +<option value='patches/3821'>patches/3821</option> +<option value='patches/3822'>patches/3822</option> +<option value='patches/3823'>patches/3823</option> +<option value='patches/3825'>patches/3825</option> +<option value='patches/3827'>patches/3827</option> +<option value='patches/3828'>patches/3828</option> +<option value='patches/3829'>patches/3829</option> +<option value='patches/3830'>patches/3830</option> +<option value='patches/3831'>patches/3831</option> +<option value='patches/3832'>patches/3832</option> +<option value='patches/3833'>patches/3833</option> +<option value='patches/3835'>patches/3835</option> +<option value='patches/3836'>patches/3836</option> +<option value='patches/3837'>patches/3837</option> +<option value='patches/3838'>patches/3838</option> +<option value='patches/3839'>patches/3839</option> +<option value='patches/3843'>patches/3843</option> +<option value='patches/3845'>patches/3845</option> +<option value='patches/3846'>patches/3846</option> +<option value='patches/3847'>patches/3847</option> +<option value='patches/3850'>patches/3850</option> +<option value='patches/3852'>patches/3852</option> +<option value='patches/3853'>patches/3853</option> +<option value='patches/3854'>patches/3854</option> +<option value='patches/3855'>patches/3855</option> +<option value='patches/3858'>patches/3858</option> +<option value='patches/3861'>patches/3861</option> +<option value='patches/3863'>patches/3863</option> +<option value='patches/3864'>patches/3864</option> +<option value='patches/3868'>patches/3868</option> +<option value='patches/3869'>patches/3869</option> +<option value='patches/3870'>patches/3870</option> +<option value='patches/3871'>patches/3871</option> +<option value='patches/3873'>patches/3873</option> +<option value='patches/3878'>patches/3878</option> +<option value='patches/3881'>patches/3881</option> +<option value='patches/3882'>patches/3882</option> +<option value='patches/3883'>patches/3883</option> +<option value='patches/3885'>patches/3885</option> +<option value='patches/3886'>patches/3886</option> +<option value='patches/3887'>patches/3887</option> +<option value='patches/3888'>patches/3888</option> +<option value='patches/3890'>patches/3890</option> +<option value='patches/3891'>patches/3891</option> +<option value='patches/3892'>patches/3892</option> +<option value='patches/3895'>patches/3895</option> +<option value='patches/3896'>patches/3896</option> +<option value='patches/3897'>patches/3897</option> +<option value='patches/3908'>patches/3908</option> +<option value='patches/3909'>patches/3909</option> +<option value='patches/3912'>patches/3912</option> +<option value='patches/3913'>patches/3913</option> +<option value='patches/3914'>patches/3914</option> +<option value='patches/3916'>patches/3916</option> +<option value='patches/3918'>patches/3918</option> +<option value='patches/3920'>patches/3920</option> +<option value='patches/3923'>patches/3923</option> +<option value='patches/3927'>patches/3927</option> +<option value='patches/3933'>patches/3933</option> +<option value='patches/3934'>patches/3934</option> +<option value='patches/3937'>patches/3937</option> +<option value='patches/3941'>patches/3941</option> +<option value='patches/3946'>patches/3946</option> +<option value='patches/3947'>patches/3947</option> +<option value='patches/3949'>patches/3949</option> +<option value='patches/3950'>patches/3950</option> +<option value='patches/3953'>patches/3953</option> +<option value='patches/3954'>patches/3954</option> +<option value='patches/3957'>patches/3957</option> +<option value='patches/3958'>patches/3958</option> +<option value='patches/3959'>patches/3959</option> +<option value='patches/3963'>patches/3963</option> +<option value='patches/3969'>patches/3969</option> +<option value='patches/3970'>patches/3970</option> +<option value='patches/3976'>patches/3976</option> +<option value='patches/3977'>patches/3977</option> +<option value='patches/3979'>patches/3979</option> +<option value='patches/3980'>patches/3980</option> +<option value='patches/3981'>patches/3981</option> +<option value='patches/3987'>patches/3987</option> +<option value='patches/3988'>patches/3988</option> +<option value='patches/3989'>patches/3989</option> +<option value='patches/3998'>patches/3998</option> +<option value='patches/3999'>patches/3999</option> +<option value='patches/4000'>patches/4000</option> +<option value='patches/4001'>patches/4001</option> +<option value='patches/4002'>patches/4002</option> +<option value='patches/4006'>patches/4006</option> +<option value='patches/4008'>patches/4008</option> +<option value='patches/4012'>patches/4012</option> +<option value='patches/4013'>patches/4013</option> +<option value='patches/4017'>patches/4017</option> +<option value='patches/4019'>patches/4019</option> +<option value='patches/4021'>patches/4021</option> +<option value='patches/4022'>patches/4022</option> +<option value='patches/4026'>patches/4026</option> +<option value='wlroots'>wlroots</option> +</select> <input type='submit' value='switch'/></form></td></tr> +<tr><td class='sub'>Alpine packages build scripts +</td><td class='sub right'>uwsgi</td></tr></table> +<table class='tabs'><tr><td> +<a href='/aports/about/'>about</a><a href='/aports/'>summary</a><a href='/aports/refs/'>refs</a><a href='/aports/log/'>log</a><a href='/aports/tree/'>tree</a><a href='/aports/commit/'>commit</a><a href='/aports/diff/'>diff</a><a href='/aports/stats/'>stats</a></td><td class='form'><form class='right' method='get' action='/aports/log/'> +<select name='qt'> +<option value='grep'>log msg</option> +<option value='author'>author</option> +<option value='committer'>committer</option> +<option value='range'>range</option> +</select> +<input class='txt' type='search' size='10' name='q' value=''/> +<input type='submit' value='search'/> +</form> +</td></tr></table> +<div class='content'><div class='error'>Not found</div> +</div> <!-- class=content --> +<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2022-04-14 22:32:26 +0000</div> +</div> <!-- id=cgit --> +</body> +</html> diff --git a/repo/media/mpd/libcdio-paranoia-version.patch b/repo/media/mpd/libcdio-paranoia-version.patch new file mode 100644 index 0000000..44810b3 --- /dev/null +++ b/repo/media/mpd/libcdio-paranoia-version.patch @@ -0,0 +1,13 @@ +diff --git a/src/input/plugins/meson.build b/src/input/plugins/meson.build +index 7322365..65ff564 100644 +--- a/src/input/plugins/meson.build ++++ b/src/input/plugins/meson.build +@@ -10,7 +10,7 @@ if alsa_dep.found() + input_plugins_sources += 'AlsaInputPlugin.cxx' + endif + +-libcdio_paranoia_dep = dependency('libcdio_paranoia', version: '>= 10.2+0.93+1', required: get_option('cdio_paranoia')) ++libcdio_paranoia_dep = dependency('libcdio_paranoia', required: get_option('cdio_paranoia')) + input_features.set('ENABLE_CDIO_PARANOIA', libcdio_paranoia_dep.found()) + if libcdio_paranoia_dep.found() + input_plugins_sources += 'CdioParanoiaInputPlugin.cxx' diff --git a/repo/media/mpd/mpd.confd b/repo/media/mpd/mpd.confd new file mode 100644 index 0000000..720306e --- /dev/null +++ b/repo/media/mpd/mpd.confd @@ -0,0 +1,7 @@ +# conf.d file for music player daemon + +# +# Specify daemon $OPTS here. +# + +OPTS="" diff --git a/repo/media/mpd/mpd.initd b/repo/media/mpd/mpd.initd new file mode 100644 index 0000000..817583c --- /dev/null +++ b/repo/media/mpd/mpd.initd @@ -0,0 +1,25 @@ +#!/sbin/openrc-run + +# init.d file for music player daemon + +supervisor=supervise-daemon + +name="Music Player Daemon" +description="A daemon for playing music" + +command=/usr/bin/mpd +command_args="$MPD_OPTS" +command_args_foreground="--no-daemon" + +command_user="${M_USER:-mpd}:${M_GROUP:-audio}" + +depend() { + need localmount + use net netmount nfsmount esound pulseaudio + after firewall +} + +start_pre() { + checkpath --directory --quiet \ + --owner "${M_USER:-mpd}" --mode 0775 /var/run/mpd +} diff --git a/repo/media/mpd.xibuild b/repo/media/mpd/mpd.xibuild index afedb54..afedb54 100644 --- a/repo/media/mpd.xibuild +++ b/repo/media/mpd/mpd.xibuild diff --git a/repo/media/openjpeg/b4700bc09d55ac17ff6bef9b0a867f6de527be17.patch b/repo/media/openjpeg/b4700bc09d55ac17ff6bef9b0a867f6de527be17.patch new file mode 100644 index 0000000..169e4ad --- /dev/null +++ b/repo/media/openjpeg/b4700bc09d55ac17ff6bef9b0a867f6de527be17.patch @@ -0,0 +1,77 @@ +From b4700bc09d55ac17ff6bef9b0a867f6de527be17 Mon Sep 17 00:00:00 2001 +From: Ariadne Conill <ariadne@dereferenced.org> +Date: Tue, 27 Apr 2021 09:37:40 -0600 +Subject: [PATCH] use calloc instead of malloc to allocate arrays + +--- + src/bin/jp2/opj_compress.c | 4 ++-- + src/bin/jp2/opj_decompress.c | 5 ++--- + src/bin/jp2/opj_dump.c | 6 +++--- + 3 files changed, 7 insertions(+), 8 deletions(-) + +diff --git a/src/bin/jp2/opj_compress.c b/src/bin/jp2/opj_compress.c +index 4cc513452..d8f894cb1 100644 +--- a/src/bin/jp2/opj_compress.c ++++ b/src/bin/jp2/opj_compress.c +@@ -1910,9 +1910,9 @@ int main(int argc, char **argv) + num_images = get_num_images(img_fol.imgdirpath); + dirptr = (dircnt_t*)malloc(sizeof(dircnt_t)); + if (dirptr) { +- dirptr->filename_buf = (char*)malloc(num_images * OPJ_PATH_LEN * sizeof( ++ dirptr->filename_buf = (char*)calloc(num_images, OPJ_PATH_LEN * sizeof( + char)); /* Stores at max 10 image file names*/ +- dirptr->filename = (char**) malloc(num_images * sizeof(char*)); ++ dirptr->filename = (char**) calloc(num_images, sizeof(char*)); + if (!dirptr->filename_buf) { + ret = 0; + goto fin; +diff --git a/src/bin/jp2/opj_decompress.c b/src/bin/jp2/opj_decompress.c +index 487e3fa18..e54e54fce 100644 +--- a/src/bin/jp2/opj_decompress.c ++++ b/src/bin/jp2/opj_decompress.c +@@ -1357,14 +1357,13 @@ int main(int argc, char **argv) + return EXIT_FAILURE; + } + /* Stores at max 10 image file names */ +- dirptr->filename_buf = (char*)malloc(sizeof(char) * +- (size_t)num_images * OPJ_PATH_LEN); ++ dirptr->filename_buf = calloc((size_t) num_images, sizeof(char) * OPJ_PATH_LEN); + if (!dirptr->filename_buf) { + failed = 1; + goto fin; + } + +- dirptr->filename = (char**) malloc((size_t)num_images * sizeof(char*)); ++ dirptr->filename = (char**) calloc((size_t) num_images, sizeof(char*)); + + if (!dirptr->filename) { + failed = 1; +diff --git a/src/bin/jp2/opj_dump.c b/src/bin/jp2/opj_dump.c +index 754a39dd0..4e19c6177 100644 +--- a/src/bin/jp2/opj_dump.c ++++ b/src/bin/jp2/opj_dump.c +@@ -457,7 +457,7 @@ int main(int argc, char *argv[]) + opj_codestream_info_v2_t* cstr_info = NULL; + opj_codestream_index_t* cstr_index = NULL; + +- OPJ_INT32 num_images, imageno; ++ int num_images, imageno; + img_fol_t img_fol; + dircnt_t *dirptr = NULL; + +@@ -486,13 +486,13 @@ int main(int argc, char *argv[]) + if (!dirptr) { + return EXIT_FAILURE; + } +- dirptr->filename_buf = (char*)malloc((size_t)num_images * OPJ_PATH_LEN * sizeof( ++ dirptr->filename_buf = (char*) calloc((size_t) num_images, OPJ_PATH_LEN * sizeof( + char)); /* Stores at max 10 image file names*/ + if (!dirptr->filename_buf) { + free(dirptr); + return EXIT_FAILURE; + } +- dirptr->filename = (char**) malloc((size_t)num_images * sizeof(char*)); ++ dirptr->filename = (char**) calloc((size_t) num_images, sizeof(char*)); + + if (!dirptr->filename) { + goto fails; diff --git a/repo/media/openjpeg/fix-cmakelists.patch b/repo/media/openjpeg/fix-cmakelists.patch new file mode 100644 index 0000000..ee5fb01 --- /dev/null +++ b/repo/media/openjpeg/fix-cmakelists.patch @@ -0,0 +1,11 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -148,7 +148,7 @@ + # We could install *.cmake files in share/ however those files contains + # hardcoded path to libraries on a multi-arch system (fedora/debian) those + # path will be different (lib/i386-linux-gnu vs lib/x86_64-linux-gnu) +- set(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}") ++ set(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/cmake/${OPENJPEG_INSTALL_SUBDIR}") + endif() + + if (APPLE) diff --git a/repo/media/openjpeg.xibuild b/repo/media/openjpeg/openjpeg.xibuild index 9a20ff7..9a20ff7 100644 --- a/repo/media/openjpeg.xibuild +++ b/repo/media/openjpeg/openjpeg.xibuild diff --git a/repo/media/opus.xibuild b/repo/media/opus/opus.xibuild index bb254e2..bb254e2 100644 --- a/repo/media/opus.xibuild +++ b/repo/media/opus/opus.xibuild diff --git a/repo/media/pipewire.xibuild b/repo/media/pipewire/pipewire.xibuild index c663d25..c663d25 100644 --- a/repo/media/pipewire.xibuild +++ b/repo/media/pipewire/pipewire.xibuild diff --git a/repo/media/poppler/dont-enforce-build-type.patch b/repo/media/poppler/dont-enforce-build-type.patch new file mode 100644 index 0000000..5296880 --- /dev/null +++ b/repo/media/poppler/dont-enforce-build-type.patch @@ -0,0 +1,26 @@ +diff --git a/cmake/modules/PopplerMacros.cmake b/cmake/modules/PopplerMacros.cmake +index 2aed028..fdbe318 100644 +--- a/cmake/modules/PopplerMacros.cmake ++++ b/cmake/modules/PopplerMacros.cmake +@@ -75,21 +75,6 @@ if(WIN32) + "${CMAKE_INSTALL_PREFIX}/bin" ) + endif(WIN32) + +-if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) +- set(CMAKE_BUILD_TYPE RelWithDebInfo) +-endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) +- +-string(TOUPPER "${CMAKE_BUILD_TYPE}" _CMAKE_BUILD_TYPE_UPPER) +-set(_known_build_types RELWITHDEBINFO;RELEASE;DEBUG;DEBUGFULL;PROFILE) +-# We override CMAKE_CXX_FLAGS_${_CMAKE_BUILD_TYPE_UPPER} below. If the user +-# selects a CMAKE_BUILD_TYPE that is not handled by the logic below, we will +-# end up dropping the previous flags (e.g. those set in a cross-compilation +-# CMake toolchain file). To avoid surprising compilation errors, we emit an +-# error in that case, so that the user can handle the passed CMAKE_BUILD_TYPE +-# in the compiler flags logic below. +-if (NOT "${_CMAKE_BUILD_TYPE_UPPER}" IN_LIST _known_build_types) +- message(FATAL_ERROR "Unsupported CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") +-endif() + set(_save_cflags "${CMAKE_C_FLAGS}") + set(_save_cxxflags "${CMAKE_CXX_FLAGS}") + diff --git a/repo/media/poppler.xibuild b/repo/media/poppler/poppler.xibuild index 181fc75..181fc75 100644 --- a/repo/media/poppler.xibuild +++ b/repo/media/poppler/poppler.xibuild diff --git a/repo/media/pulseaudio.xibuild b/repo/media/pulseaudio/pulseaudio.xibuild index 9554c72..9554c72 100644 --- a/repo/media/pulseaudio.xibuild +++ b/repo/media/pulseaudio/pulseaudio.xibuild diff --git a/repo/media/pulsemixer.xibuild b/repo/media/pulsemixer/pulsemixer.xibuild index 4bf0850..4bf0850 100644 --- a/repo/media/pulsemixer.xibuild +++ b/repo/media/pulsemixer/pulsemixer.xibuild diff --git a/repo/media/soxr.xibuild b/repo/media/soxr/soxr.xibuild index 48b1e3b..48b1e3b 100644 --- a/repo/media/soxr.xibuild +++ b/repo/media/soxr/soxr.xibuild diff --git a/repo/media/tiff/CVE-2018-12900.patch b/repo/media/tiff/CVE-2018-12900.patch new file mode 100644 index 0000000..f95cd06 --- /dev/null +++ b/repo/media/tiff/CVE-2018-12900.patch @@ -0,0 +1,29 @@ +From 86861b86f26be5301ccfa96f9bf765051f4e644a Mon Sep 17 00:00:00 2001 +From: pgajdos <pgajdos@suse.cz> +Date: Tue, 13 Nov 2018 09:03:31 +0100 +Subject: [PATCH] prevent integer overflow + +--- + tools/tiffcp.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/tools/tiffcp.c b/tools/tiffcp.c +index 2f406e2d..ece7ba13 100644 +--- a/tools/tiffcp.c ++++ b/tools/tiffcp.c +@@ -1435,6 +1435,12 @@ DECLAREreadFunc(readSeparateTilesIntoBuffer) + status = 0; + goto done; + } ++ if (0xFFFFFFFF / tilew < spp) ++ { ++ TIFFError(TIFFFileName(in), "Error, either TileWidth (%u) or BitsPerSample (%u) is too large", tilew, bps); ++ status = 0; ++ goto done; ++ } + bytes_per_sample = bps/8; + + for (row = 0; row < imagelength; row += tl) { +-- +2.18.1 + diff --git a/repo/media/tiff.xibuild b/repo/media/tiff/tiff.xibuild index 544116b..544116b 100644 --- a/repo/media/tiff.xibuild +++ b/repo/media/tiff/tiff.xibuild diff --git a/repo/media/v4l-utils/fix_parse_next_subopt.patch b/repo/media/v4l-utils/fix_parse_next_subopt.patch new file mode 100644 index 0000000..d4df9d4 --- /dev/null +++ b/repo/media/v4l-utils/fix_parse_next_subopt.patch @@ -0,0 +1,36 @@ +parse_next_subopt() relies on undefined behavior and only works with glibc's +implementation of getsubopt(). This fixes the issue. +--- a/utils/v4l2-ctl/v4l2-ctl-common.cpp 2021-11-08 11:23:39.079748359 +0100 ++++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp 2021-11-08 11:39:49.328576794 +0100 +@@ -956,15 +956,23 @@ static bool parse_subset(char *optarg) + + static bool parse_next_subopt(char **subs, char **value) + { +- static char *const subopts[] = { +- nullptr +- }; +- int opt = getsubopt(subs, subopts, value); ++ char *start = *subs; ++ if (!start || (start[0] == '\0')) { ++ fprintf(stderr, "Missing suboption value\n"); ++ return true; ++ } ++ *value = start; + +- if (opt < 0 || *value) +- return false; +- fprintf(stderr, "Missing suboption value\n"); +- return true; ++ char *sep = std::strchr(start, ','); ++ if (sep != nullptr) { ++ *sep = '\0'; ++ *subs = sep + 1; ++ } ++ else { ++ *subs = std::strchr(start, '\0'); ++ } ++ ++ return false; + } + + void common_cmd(const std::string &media_bus_info, int ch, char *optarg) diff --git a/repo/media/v4l-utils/types.patch b/repo/media/v4l-utils/types.patch new file mode 100644 index 0000000..340bb81 --- /dev/null +++ b/repo/media/v4l-utils/types.patch @@ -0,0 +1,26 @@ +--- a/utils/keytable/keymap.h ++++ b/utils/keytable/keymap.h +@@ -2,6 +2,10 @@ + #ifndef __KEYMAP_H + #define __KEYMAP_H + ++#include <stdint.h> ++typedef uint32_t u_int32_t; ++typedef int error_t; ++ + struct keymap { + struct keymap *next; + char *name; +--- a/utils/ir-ctl/keymap.h ++++ b/utils/ir-ctl/keymap.h +@@ -2,6 +2,10 @@ + #ifndef __KEYMAP_H + #define __KEYMAP_H + ++#include <stdint.h> ++typedef uint32_t u_int32_t; ++typedef int error_t; ++ + struct keymap { + struct keymap *next; + char *name; diff --git a/repo/media/v4l-utils.xibuild b/repo/media/v4l-utils/v4l-utils.xibuild index bd40b23..bd40b23 100644 --- a/repo/media/v4l-utils.xibuild +++ b/repo/media/v4l-utils/v4l-utils.xibuild diff --git a/repo/media/vidstab.xibuild b/repo/media/vidstab/vidstab.xibuild index cd0e5cf..cd0e5cf 100644 --- a/repo/media/vidstab.xibuild +++ b/repo/media/vidstab/vidstab.xibuild diff --git a/repo/media/wavpack.xibuild b/repo/media/wavpack/wavpack.xibuild index eb9ccfc..eb9ccfc 100644 --- a/repo/media/wavpack.xibuild +++ b/repo/media/wavpack/wavpack.xibuild diff --git a/repo/media/x264/oclobj.h b/repo/media/x264/oclobj.h new file mode 100644 index 0000000..8ec2e5a --- /dev/null +++ b/repo/media/x264/oclobj.h @@ -0,0 +1,4684 @@ +static const char x264_opencl_source[] = { +0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4c, 0x20, 0x45, +0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x63, 0x6c, 0x5f, 0x6b, 0x68, 0x72, 0x5f, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, +0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x20, 0x3a, 0x20, 0x65, +0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x74, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, +0x20, 0x3d, 0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x49, 0x5a, 0x45, +0x44, 0x5f, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x53, 0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x20, 0x7c, +0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4c, 0x41, +0x4d, 0x50, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x44, 0x47, 0x45, 0x20, 0x7c, 0x20, 0x43, 0x4c, 0x4b, +0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x45, 0x41, 0x52, 0x45, 0x53, 0x54, 0x3b, +0x0a, 0x2f, 0x2a, 0x20, 0x37, 0x2e, 0x31, 0x38, 0x2e, 0x31, 0x2e, 0x31, 0x20, 0x20, 0x45, 0x78, +0x61, 0x63, 0x74, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, +0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, +0x65, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x69, +0x6e, 0x74, 0x38, 0x5f, 0x74, 0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, +0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x20, 0x20, 0x75, +0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, +0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x3b, 0x0a, +0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, +0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, +0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x69, +0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, +0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, +0x32, 0x5f, 0x74, 0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x69, 0x6e, +0x74, 0x38, 0x5f, 0x74, 0x20, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x3b, 0x0a, 0x74, 0x79, 0x70, +0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x73, 0x75, +0x6d, 0x5f, 0x74, 0x3b, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, 0x20, 0x75, 0x69, 0x6e, +0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x3b, 0x0a, 0x23, 0x64, +0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x53, +0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x20, 0x28, 0x28, 0x31, 0x3c, 0x3c, 0x31, 0x34, 0x29, 0x2d, +0x31, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, +0x53, 0x5f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x48, 0x49, 0x46, 0x54, 0x20, 0x31, 0x34, 0x0a, +0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x58, +0x20, 0x28, 0x31, 0x3c, 0x3c, 0x32, 0x38, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, +0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x4d, 0x41, 0x58, 0x20, 0x32, 0x35, 0x35, 0x0a, 0x23, +0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, +0x53, 0x55, 0x4d, 0x20, 0x28, 0x38, 0x20, 0x2a, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, +0x73, 0x75, 0x6d, 0x5f, 0x74, 0x29, 0x29, 0x0a, 0x2f, 0x2a, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, +0x61, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, +0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, +0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x2a, 0x2f, +0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x45, 0x53, +0x54, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, +0x4f, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x51, 0x20, 0x31, 0x0a, 0x23, 0x64, 0x65, +0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x4d, 0x42, 0x53, 0x20, 0x20, +0x20, 0x32, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x32, +0x5f, 0x49, 0x46, 0x5f, 0x4c, 0x54, 0x28, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x61, 0x2c, +0x20, 0x62, 0x20, 0x29, 0x5c, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x28, 0x79, 0x29, 0x20, 0x3c, 0x20, +0x28, 0x78, 0x29, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x28, 0x78, 0x29, 0x20, 0x3d, 0x20, +0x28, 0x79, 0x29, 0x3b, 0x5c, 0x0a, 0x28, 0x61, 0x29, 0x20, 0x3d, 0x20, 0x28, 0x62, 0x29, 0x3b, +0x5c, 0x0a, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x64, 0x69, 0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x0a, +0x7b, 0x0a, 0x7b, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x7d, 0x2c, 0x20, 0x7b, 0x2d, 0x31, 0x2c, 0x20, +0x30, 0x7d, 0x2c, 0x20, 0x7b, 0x31, 0x2c, 0x20, 0x30, 0x7d, 0x2c, 0x20, 0x7b, 0x30, 0x2c, 0x20, +0x31, 0x7d, 0x2c, 0x0a, 0x7d, 0x3b, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x72, +0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x29, 0x20, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x28, 0x20, 0x78, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x20, 0x30, 0x2c, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x4d, 0x41, 0x58, +0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x6d, 0x76, +0x28, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x61, 0x2c, 0x20, 0x73, 0x68, 0x6f, 0x72, +0x74, 0x32, 0x20, 0x62, 0x2c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x63, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x6d, +0x69, 0x6e, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x3b, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, +0x20, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x61, 0x2c, +0x20, 0x62, 0x29, 0x2c, 0x20, 0x63, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, +0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x6d, 0x61, 0x78, +0x28, 0x74, 0x31, 0x2c, 0x20, 0x74, 0x32, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x6c, +0x69, 0x6e, 0x65, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, +0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x73, 0x75, +0x6d, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x61, 0x20, 0x3e, 0x3e, 0x20, +0x28, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x20, 0x2d, 0x20, +0x31, 0x29, 0x29, 0x20, 0x26, 0x20, 0x28, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x29, +0x31, 0x20, 0x3c, 0x3c, 0x20, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, +0x4d, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x75, 0x6d, +0x5f, 0x74, 0x29, 0x2d, 0x31, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, +0x61, 0x20, 0x2b, 0x20, 0x73, 0x29, 0x20, 0x5e, 0x20, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x64, +0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x28, +0x20, 0x64, 0x30, 0x2c, 0x20, 0x64, 0x31, 0x2c, 0x20, 0x64, 0x32, 0x2c, 0x20, 0x64, 0x33, 0x2c, +0x20, 0x73, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20, 0x73, 0x33, 0x20, +0x29, 0x20, 0x7b, 0x5c, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x30, 0x20, 0x3d, +0x20, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x31, 0x3b, 0x5c, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, +0x74, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x30, 0x20, 0x2d, 0x20, 0x73, 0x31, 0x3b, 0x5c, +0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x32, 0x20, +0x2b, 0x20, 0x73, 0x33, 0x3b, 0x5c, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x33, +0x20, 0x3d, 0x20, 0x73, 0x32, 0x20, 0x2d, 0x20, 0x73, 0x33, 0x3b, 0x5c, 0x0a, 0x64, 0x30, 0x20, +0x3d, 0x20, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x74, 0x32, 0x3b, 0x5c, 0x0a, 0x64, 0x32, 0x20, 0x3d, +0x20, 0x74, 0x30, 0x20, 0x2d, 0x20, 0x74, 0x32, 0x3b, 0x5c, 0x0a, 0x64, 0x31, 0x20, 0x3d, 0x20, +0x74, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x3b, 0x5c, 0x0a, 0x64, 0x33, 0x20, 0x3d, 0x20, 0x74, +0x31, 0x20, 0x2d, 0x20, 0x74, 0x33, 0x3b, 0x5c, 0x0a, 0x7d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, +0x6e, 0x65, 0x20, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x64, +0x30, 0x2c, 0x20, 0x64, 0x31, 0x2c, 0x20, 0x64, 0x32, 0x2c, 0x20, 0x64, 0x33, 0x2c, 0x20, 0x73, +0x30, 0x2c, 0x20, 0x73, 0x31, 0x2c, 0x20, 0x73, 0x32, 0x2c, 0x20, 0x73, 0x33, 0x20, 0x29, 0x20, +0x7b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x30, 0x20, +0x2b, 0x20, 0x73, 0x31, 0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x74, 0x31, 0x20, 0x3d, +0x20, 0x73, 0x30, 0x20, 0x2d, 0x20, 0x73, 0x31, 0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, +0x74, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x33, 0x3b, 0x5c, 0x0a, 0x69, +0x6e, 0x74, 0x32, 0x20, 0x74, 0x33, 0x20, 0x3d, 0x20, 0x73, 0x32, 0x20, 0x2d, 0x20, 0x73, 0x33, +0x3b, 0x5c, 0x0a, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x30, 0x20, 0x2b, 0x20, 0x74, 0x32, 0x3b, +0x5c, 0x0a, 0x64, 0x32, 0x20, 0x3d, 0x20, 0x74, 0x30, 0x20, 0x2d, 0x20, 0x74, 0x32, 0x3b, 0x5c, +0x0a, 0x64, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x20, 0x2b, 0x20, 0x74, 0x33, 0x3b, 0x5c, 0x0a, +0x64, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x31, 0x20, 0x2d, 0x20, 0x74, 0x33, 0x3b, 0x5c, 0x0a, 0x7d, +0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x41, 0x54, 0x44, 0x5f, 0x43, 0x5f, +0x38, 0x78, 0x34, 0x5f, 0x51, 0x28, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x71, 0x31, 0x2c, +0x20, 0x71, 0x32, 0x20, 0x29, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x28, +0x20, 0x71, 0x31, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x70, 0x69, 0x78, 0x31, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x5f, 0x70, 0x69, 0x78, 0x31, 0x2c, 0x20, 0x71, 0x32, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x70, 0x69, 0x78, 0x32, 0x2c, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x69, 0x5f, 0x70, 0x69, 0x78, 0x32, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x73, 0x75, +0x6d, 0x32, 0x5f, 0x74, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x34, 0x5d, 0x5b, 0x34, 0x5d, 0x3b, 0x5c, +0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x61, 0x30, 0x2c, 0x20, 0x61, 0x31, 0x2c, 0x20, +0x61, 0x32, 0x2c, 0x20, 0x61, 0x33, 0x3b, 0x5c, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, +0x73, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x5c, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, +0x20, 0x69, 0x2b, 0x2b, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x5f, +0x70, 0x69, 0x78, 0x31, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x32, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x5f, +0x70, 0x69, 0x78, 0x32, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x61, 0x30, 0x20, 0x3d, 0x20, +0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, 0x30, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, +0x30, 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x29, 0x28, +0x70, 0x69, 0x78, 0x31, 0x5b, 0x34, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, 0x34, +0x5d, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, +0x55, 0x4d, 0x29, 0x3b, 0x5c, 0x0a, 0x61, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x69, 0x78, 0x31, +0x5b, 0x31, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x29, 0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, +0x35, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, 0x35, 0x5d, 0x29, 0x20, 0x3c, 0x3c, +0x20, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x3b, 0x5c, +0x0a, 0x61, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, 0x32, 0x5d, 0x20, 0x2d, +0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x75, +0x6d, 0x32, 0x5f, 0x74, 0x29, 0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, 0x36, 0x5d, 0x20, 0x2d, 0x20, +0x70, 0x69, 0x78, 0x32, 0x5b, 0x36, 0x5d, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x42, 0x49, 0x54, 0x53, +0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x3b, 0x5c, 0x0a, 0x61, 0x33, 0x20, 0x3d, +0x20, 0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, 0x33, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, +0x5b, 0x33, 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x29, +0x28, 0x70, 0x69, 0x78, 0x31, 0x5b, 0x37, 0x5d, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x78, 0x32, 0x5b, +0x37, 0x5d, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, +0x53, 0x55, 0x4d, 0x29, 0x3b, 0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, +0x28, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, +0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x5d, 0x5b, 0x32, +0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x5d, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x61, 0x30, +0x2c, 0x20, 0x61, 0x31, 0x2c, 0x20, 0x61, 0x32, 0x2c, 0x20, 0x61, 0x33, 0x20, 0x29, 0x3b, 0x5c, +0x0a, 0x7d, 0x5c, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x20, 0x29, +0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x28, 0x20, +0x61, 0x30, 0x2c, 0x20, 0x61, 0x31, 0x2c, 0x20, 0x61, 0x32, 0x2c, 0x20, 0x61, 0x33, 0x2c, 0x20, +0x74, 0x6d, 0x70, 0x5b, 0x30, 0x5d, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x31, +0x5d, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x32, 0x5d, 0x5b, 0x69, 0x5d, 0x2c, +0x20, 0x74, 0x6d, 0x70, 0x5b, 0x33, 0x5d, 0x5b, 0x69, 0x5d, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x73, +0x75, 0x6d, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x61, 0x30, 0x20, 0x29, +0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x61, 0x31, 0x20, 0x29, 0x20, 0x2b, 0x20, +0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x61, 0x32, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, +0x32, 0x28, 0x20, 0x61, 0x33, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x7d, 0x5c, 0x0a, 0x72, 0x65, 0x74, +0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x5f, 0x74, 0x29, 0x73, 0x75, 0x6d, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x3e, 0x3e, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, +0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x3b, 0x5c, 0x0a, +0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x66, +0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, +0x72, 0x6d, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x20, 0x73, 0x75, +0x6d, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, +0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, +0x65, 0x72, 0x73, 0x0a, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, +0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, +0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x2c, 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, +0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x2a, 0x61, +0x72, 0x72, 0x61, 0x79, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5b, 0x78, +0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, +0x65, 0x72, 0x28, 0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, +0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x64, +0x69, 0x6d, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, +0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, +0x20, 0x64, 0x69, 0x6d, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x64, 0x69, 0x6d, +0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x31, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x78, 0x20, 0x3c, 0x20, +0x64, 0x69, 0x6d, 0x20, 0x29, 0x0a, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5b, 0x78, 0x5d, 0x20, 0x2b, +0x3d, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5b, 0x78, 0x20, 0x2b, 0x20, 0x64, 0x69, 0x6d, 0x5d, +0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x64, 0x69, 0x6d, 0x20, 0x3e, 0x20, 0x33, 0x32, 0x20, 0x29, +0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, +0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x20, 0x29, 0x3b, +0x0a, 0x7d, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5b, +0x30, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, +0x74, 0x28, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x6d, 0x76, 0x64, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x76, 0x64, 0x66, 0x20, 0x3d, 0x20, 0x28, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x76, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x6d, +0x76, 0x64, 0x2e, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x3b, 0x0a, 0x66, 0x6c, +0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, +0x64, 0x28, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x6d, 0x76, 0x64, 0x66, 0x29, 0x20, 0x2a, 0x20, +0x32, 0x2e, 0x30, 0x66, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x38, 0x66, 0x20, 0x2b, 0x20, +0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x21, 0x21, 0x6d, 0x76, 0x64, 0x2e, 0x78, +0x2c, 0x20, 0x21, 0x21, 0x6d, 0x76, 0x64, 0x2e, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, +0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x20, 0x28, 0x63, 0x6f, 0x73, 0x74, +0x2e, 0x78, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, +0x2f, 0x2a, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, +0x6e, 0x20, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, +0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x53, 0x41, 0x54, +0x44, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, +0x65, 0x61, 0x63, 0x68, 0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x0a, 0x2a, 0x20, 0x6d, 0x61, +0x63, 0x72, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x20, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, +0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x42, 0x20, 0x73, 0x6c, 0x69, 0x63, +0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, +0x73, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x0a, 0x2a, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, +0x62, 0x69, 0x64, 0x69, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x20, 0x20, 0x2a, 0x2f, +0x0a, 0x2f, 0x2a, 0x20, 0x46, 0x6f, 0x75, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, +0x20, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x6d, +0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x38, 0x78, 0x38, 0x20, 0x42, 0x49, 0x44, 0x49, 0x52, +0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x41, 0x54, 0x44, 0x20, +0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x69, 0x64, 0x69, 0x72, 0x5f, 0x73, 0x61, 0x74, +0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, +0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, +0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2c, 0x0a, 0x72, +0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, +0x5f, 0x74, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2c, 0x0a, 0x72, 0x65, 0x61, +0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, +0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x69, +0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x77, +0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, +0x32, 0x5f, 0x74, 0x20, 0x2a, 0x74, 0x6d, 0x70, 0x70, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, +0x64, 0x78, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x28, 0x20, 0x2a, 0x74, +0x6d, 0x70, 0x20, 0x29, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x6f, 0x6c, 0x61, 0x74, +0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, +0x28, 0x20, 0x2a, 0x20, 0x29, 0x5b, 0x34, 0x5d, 0x29, 0x74, 0x6d, 0x70, 0x70, 0x3b, 0x0a, 0x73, +0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, 0x32, +0x2c, 0x20, 0x62, 0x33, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x6d, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, +0x41, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x71, 0x70, +0x6f, 0x73, 0x30, 0x2e, 0x78, 0x3e, 0x3e, 0x32, 0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2e, +0x79, 0x3e, 0x3e, 0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x30, +0x41, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x78, 0x26, 0x32, 0x29, +0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x79, 0x26, +0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x42, 0x20, +0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x20, 0x2b, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x78, +0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, +0x2e, 0x79, 0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, 0x29, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, +0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x42, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, +0x74, 0x32, 0x29, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x42, 0x2e, 0x78, 0x3e, 0x3e, 0x32, 0x2c, +0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x42, 0x2e, 0x79, 0x3e, 0x3e, 0x32, 0x29, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x30, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, +0x6f, 0x73, 0x30, 0x42, 0x2e, 0x78, 0x26, 0x32, 0x29, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x42, 0x2e, 0x79, 0x26, 0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2e, 0x78, 0x3e, 0x3e, 0x32, +0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2e, 0x79, 0x3e, 0x3e, 0x32, 0x29, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x31, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, +0x6f, 0x73, 0x31, 0x2e, 0x78, 0x26, 0x32, 0x29, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x71, 0x70, 0x6f, 0x73, 0x31, 0x2e, 0x79, 0x26, 0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, +0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, +0x71, 0x70, 0x6f, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x28, +0x28, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2e, 0x78, 0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, 0x29, 0x2c, +0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2e, 0x79, 0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, +0x29, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x42, 0x70, +0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x71, 0x70, 0x6f, 0x73, +0x31, 0x42, 0x2e, 0x78, 0x3e, 0x3e, 0x32, 0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x42, 0x2e, +0x79, 0x3e, 0x3e, 0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x31, +0x42, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x42, 0x2e, 0x78, 0x26, 0x32, +0x29, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x42, 0x2e, +0x79, 0x26, 0x32, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, +0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x41, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, +0x65, 0x6c, 0x30, 0x41, 0x2c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, +0x30, 0x42, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x30, 0x42, 0x3b, +0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, +0x31, 0x41, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x31, 0x41, 0x2c, +0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x31, 0x42, 0x20, 0x3d, 0x20, +0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x31, 0x42, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x76, 0x41, 0x2c, 0x20, 0x76, 0x42, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x6e, +0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x30, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x31, 0x3b, 0x0a, 0x75, +0x69, 0x6e, 0x74, 0x20, 0x61, 0x30, 0x2c, 0x20, 0x61, 0x31, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x32, 0x20, 0x3d, 0x20, +0x36, 0x34, 0x20, 0x2d, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0a, 0x23, 0x64, 0x65, +0x66, 0x69, 0x6e, 0x65, 0x20, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, 0x5f, +0x44, 0x49, 0x46, 0x46, 0x28, 0x20, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x58, 0x20, 0x29, 0x5c, 0x0a, +0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x2c, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, +0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, +0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x3b, 0x5c, 0x0a, 0x76, 0x41, 0x20, 0x3d, 0x20, 0x28, +0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, +0x65, 0x66, 0x30, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x2b, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, +0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, +0x66, 0x74, 0x30, 0x41, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x5c, 0x0a, 0x76, +0x42, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x42, +0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, +0x69, 0x64, 0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, +0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x42, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, +0x46, 0x3b, 0x5c, 0x0a, 0x72, 0x65, 0x66, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, +0x28, 0x20, 0x76, 0x41, 0x2c, 0x20, 0x76, 0x42, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x76, 0x41, 0x20, +0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, +0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x41, 0x70, 0x6f, +0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, +0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, +0x73, 0x68, 0x69, 0x66, 0x74, 0x31, 0x41, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, +0x5c, 0x0a, 0x76, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, 0x70, 0x6c, 0x61, 0x6e, +0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, +0x66, 0x31, 0x42, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, +0x58, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, +0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x31, 0x42, 0x29, 0x20, 0x26, 0x20, +0x30, 0x78, 0x46, 0x46, 0x3b, 0x5c, 0x0a, 0x72, 0x65, 0x66, 0x31, 0x20, 0x3d, 0x20, 0x72, 0x68, +0x61, 0x64, 0x64, 0x28, 0x20, 0x76, 0x41, 0x2c, 0x20, 0x76, 0x42, 0x20, 0x29, 0x3b, 0x5c, 0x0a, +0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x63, 0x20, 0x2d, 0x20, 0x28, 0x28, 0x72, 0x65, +0x66, 0x30, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2b, 0x20, 0x72, 0x65, +0x66, 0x31, 0x20, 0x2a, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x32, 0x20, 0x2b, 0x20, 0x28, +0x31, 0x20, 0x3c, 0x3c, 0x20, 0x35, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x36, 0x29, 0x3b, 0x0a, +0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, +0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x20, +0x29, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, 0x5f, 0x44, 0x49, +0x46, 0x46, 0x28, 0x20, 0x61, 0x30, 0x2c, 0x20, 0x61, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x52, 0x45, +0x41, 0x44, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x28, 0x20, 0x61, +0x31, 0x2c, 0x20, 0x62, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x61, +0x30, 0x20, 0x2b, 0x20, 0x28, 0x61, 0x31, 0x3c, 0x3c, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, +0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, +0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x61, 0x2c, +0x20, 0x62, 0x2c, 0x20, 0x63, 0x20, 0x29, 0x5c, 0x0a, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, +0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x3b, 0x5c, 0x0a, 0x66, 0x72, 0x65, 0x66, 0x30, 0x41, +0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x5c, 0x0a, 0x66, 0x72, 0x65, +0x66, 0x30, 0x42, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x5c, 0x0a, +0x66, 0x72, 0x65, 0x66, 0x31, 0x41, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x63, +0x3b, 0x5c, 0x0a, 0x66, 0x72, 0x65, 0x66, 0x31, 0x42, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, +0x3d, 0x20, 0x63, 0x3b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, +0x45, 0x58, 0x28, 0x20, 0x62, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x34, 0x20, 0x29, 0x3b, 0x5c, +0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, +0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, +0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x32, 0x2c, +0x20, 0x36, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, +0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, 0x33, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x37, 0x20, 0x29, 0x3b, +0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x28, 0x20, 0x74, 0x6d, 0x70, +0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x64, +0x78, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, +0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, 0x33, 0x5d, 0x2c, +0x20, 0x62, 0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x62, 0x33, 0x20, +0x29, 0x3b, 0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x28, 0x20, 0x62, +0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x62, 0x33, 0x2c, 0x20, 0x74, +0x6d, 0x70, 0x5b, 0x30, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, +0x31, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x32, 0x5d, 0x5b, +0x69, 0x64, 0x78, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x33, 0x5d, 0x5b, 0x69, 0x64, 0x78, +0x5d, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x73, 0x75, 0x6d, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, +0x32, 0x28, 0x20, 0x62, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, +0x62, 0x31, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x62, 0x32, 0x20, +0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x62, 0x33, 0x20, 0x29, 0x3b, 0x0a, +0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x30, 0x2c, +0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, +0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x34, 0x20, 0x29, +0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x49, +0x44, 0x49, 0x52, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, +0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x0a, 0x23, 0x75, 0x6e, +0x64, 0x65, 0x66, 0x20, 0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, +0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x5f, 0x74, +0x29, 0x73, 0x75, 0x6d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x3e, 0x3e, 0x42, 0x49, +0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x73, +0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, +0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x70, +0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, +0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x38, 0x78, 0x38, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, +0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x0a, 0x2a, 0x20, 0x49, 0x6e, 0x74, 0x72, 0x61, 0x2c, 0x20, +0x6c, 0x69, 0x73, 0x74, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x31, 0x2e, 0x20, +0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, +0x61, 0x20, 0x42, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, +0x74, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x62, 0x69, 0x64, 0x69, 0x72, +0x0a, 0x2a, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, +0x2e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, +0x73, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x30, 0x7c, 0x31, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, +0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, +0x73, 0x74, 0x73, 0x5b, 0x30, 0x7c, 0x31, 0x5d, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x72, +0x67, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, +0x2a, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x66, 0x72, 0x61, 0x6d, +0x65, 0x73, 0x20, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x20, 0x20, 0x57, 0x65, 0x20, +0x6d, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, +0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x0a, 0x2a, 0x20, 0x6c, +0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x27, 0x73, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, +0x3a, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x20, 0x20, 0x43, 0x50, 0x55, 0x20, 0x65, 0x71, 0x75, 0x69, +0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2d, 0x3e, 0x6c, 0x6f, +0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x30, 0x5d, 0x5b, 0x62, 0x20, 0x2d, 0x20, +0x70, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x0a, 0x2a, 0x20, 0x20, 0x20, 0x47, 0x50, 0x55, 0x20, +0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x30, 0x5b, 0x28, 0x62, 0x20, +0x2d, 0x20, 0x70, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x63, +0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, +0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x50, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x65, +0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x20, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, +0x64, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, +0x2a, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, +0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, +0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3a, +0x20, 0x20, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x34, 0x2c, +0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, +0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x5f, +0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, +0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x2c, 0x0a, 0x72, 0x65, +0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, +0x74, 0x20, 0x20, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, +0x2c, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, 0x70, 0x6c, +0x61, 0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, +0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, +0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x30, 0x2c, 0x0a, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, +0x32, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, +0x6d, 0x76, 0x73, 0x31, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, +0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x2a, 0x66, 0x72, 0x65, 0x66, +0x31, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x30, 0x2c, 0x0a, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, +0x36, 0x5f, 0x74, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, +0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x30, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, +0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, +0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x31, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, +0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x2c, +0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x63, 0x6f, +0x73, 0x74, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x72, 0x61, 0x6d, 0x65, +0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, +0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, +0x73, 0x61, 0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x62, 0x69, 0x70, 0x72, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, +0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x62, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x30, 0x2c, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x70, 0x31, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x6d, +0x62, 0x64, 0x61, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, +0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, +0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x5f, 0x62, 0x69, 0x64, +0x69, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x20, 0x3c, 0x20, 0x70, 0x31, 0x3b, 0x0a, 0x69, 0x66, 0x28, +0x20, 0x62, 0x5f, 0x62, 0x69, 0x64, 0x69, 0x72, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x2f, 0x2a, 0x20, +0x77, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, +0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, +0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x42, 0x49, 0x44, 0x49, 0x52, 0x20, 0x53, +0x41, 0x54, 0x44, 0x0a, 0x2a, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, +0x74, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x61, 0x75, +0x6e, 0x63, 0x68, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, +0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x68, +0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x0a, 0x2a, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, +0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, +0x6f, 0x72, 0x6b, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, +0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x55, 0x2e, 0x20, 0x20, 0x41, 0x6e, 0x64, +0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x0a, 0x2a, 0x20, 0x70, 0x61, +0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, +0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, +0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x32, 0x3b, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x62, 0x5f, +0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, +0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, +0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, +0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, +0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x63, 0x6f, +0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, +0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x6d, 0x62, 0x5f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x2b, 0x20, 0x6d, +0x62, 0x5f, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, +0x2f, 0x2a, 0x20, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5b, 0x34, 0x5d, +0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, +0x20, 0x28, 0x73, 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x73, 0x74, +0x29, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3c, 0x20, +0x34, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x29, +0x0a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5b, 0x6d, 0x62, 0x5f, +0x78, 0x5d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x63, 0x6f, 0x73, +0x74, 0x20, 0x3d, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x3b, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x21, 0x62, 0x5f, 0x62, 0x69, 0x64, 0x69, 0x72, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x65, +0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5b, 0x6d, 0x62, +0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x43, 0x4f, 0x50, 0x59, 0x32, 0x5f, 0x49, 0x46, 0x5f, 0x4c, +0x54, 0x28, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x63, 0x6f, 0x73, 0x74, 0x2c, +0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, +0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, 0x20, 0x21, 0x3d, 0x20, 0x70, 0x30, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x30, 0x20, +0x3d, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, +0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x30, 0x5b, 0x28, 0x62, 0x20, 0x2d, 0x20, 0x70, 0x30, 0x20, +0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, +0x2b, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x43, 0x4f, 0x50, 0x59, 0x32, 0x5f, +0x49, 0x46, 0x5f, 0x4c, 0x54, 0x28, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x76, +0x5f, 0x63, 0x6f, 0x73, 0x74, 0x30, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, +0x64, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, 0x20, +0x21, 0x3d, 0x20, 0x70, 0x31, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x76, +0x5f, 0x63, 0x6f, 0x73, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, +0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x31, 0x5b, 0x28, +0x70, 0x31, 0x20, 0x2d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, +0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, +0x0a, 0x43, 0x4f, 0x50, 0x59, 0x32, 0x5f, 0x49, 0x46, 0x5f, 0x4c, 0x54, 0x28, 0x20, 0x62, 0x63, +0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x31, 0x2c, 0x20, 0x6c, +0x69, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x3b, 0x0a, 0x7d, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, 0x5f, 0x62, 0x69, 0x64, 0x69, 0x72, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x78, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x29, +0x20, 0x3c, 0x3c, 0x20, 0x33, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x20, +0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, +0x20, 0x30, 0x20, 0x29, 0x20, 0x26, 0x20, 0x33, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, +0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, 0x20, +0x28, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, +0x20, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x67, 0x65, +0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, +0x20, 0x2a, 0x20, 0x34, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x20, 0x2b, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, +0x2a, 0x20, 0x31, 0x36, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x52, +0x59, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, 0x28, 0x20, 0x6d, 0x76, 0x30, 0x2c, 0x20, 0x6d, 0x76, +0x31, 0x2c, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, +0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x32, 0x29, 0x28, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x3c, 0x3c, 0x32, +0x29, 0x20, 0x2b, 0x20, 0x6d, 0x76, 0x30, 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x63, 0x6f, 0x6f, 0x72, +0x64, 0x2e, 0x79, 0x3c, 0x3c, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x6d, 0x76, 0x30, 0x2e, 0x79, 0x29, +0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x20, 0x3d, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x3c, +0x3c, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x6d, 0x76, 0x31, 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x63, 0x6f, +0x6f, 0x72, 0x64, 0x2e, 0x79, 0x3c, 0x3c, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x6d, 0x76, 0x31, 0x2e, +0x79, 0x29, 0x3b, 0x5c, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, +0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x64, 0x69, 0x72, 0x5f, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, +0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x6f, +0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x30, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, +0x73, 0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x30, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, +0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x31, 0x2c, 0x20, 0x62, +0x69, 0x70, 0x72, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x20, 0x29, +0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x33, 0x5d, 0x3b, 0x5c, 0x0a, 0x43, 0x4f, +0x50, 0x59, 0x32, 0x5f, 0x49, 0x46, 0x5f, 0x4c, 0x54, 0x28, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, +0x2c, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x61, 0x6d, 0x62, +0x64, 0x61, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, +0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, +0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x2f, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x64, +0x6d, 0x76, 0x30, 0x2c, 0x20, 0x64, 0x6d, 0x76, 0x31, 0x3b, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, +0x32, 0x20, 0x6d, 0x76, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x65, 0x66, 0x31, 0x5f, 0x6c, 0x6f, +0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x30, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, +0x3b, 0x0a, 0x64, 0x6d, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x76, 0x72, 0x20, 0x2a, 0x20, +0x28, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x29, 0x20, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x61, +0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x68, 0x6f, +0x72, 0x74, 0x29, 0x20, 0x31, 0x32, 0x38, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x73, 0x68, 0x6f, +0x72, 0x74, 0x29, 0x20, 0x38, 0x3b, 0x0a, 0x64, 0x6d, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x64, 0x6d, +0x76, 0x30, 0x20, 0x2d, 0x20, 0x6d, 0x76, 0x72, 0x3b, 0x0a, 0x54, 0x52, 0x59, 0x5f, 0x42, 0x49, +0x44, 0x49, 0x52, 0x28, 0x20, 0x64, 0x6d, 0x76, 0x30, 0x2c, 0x20, 0x64, 0x6d, 0x76, 0x31, 0x2c, +0x20, 0x30, 0x20, 0x29, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x69, 0x6e, 0x74, +0x28, 0x20, 0x64, 0x6d, 0x76, 0x30, 0x20, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x61, 0x73, 0x5f, 0x75, +0x69, 0x6e, 0x74, 0x28, 0x20, 0x64, 0x6d, 0x76, 0x31, 0x20, 0x29, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x2f, 0x2a, 0x20, 0x42, 0x2d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x70, 0x72, 0x65, 0x64, +0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x2f, 0x0a, 0x64, 0x6d, 0x76, 0x30, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x20, 0x64, 0x6d, 0x76, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x54, 0x52, +0x59, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, 0x28, 0x20, 0x64, 0x6d, 0x76, 0x30, 0x2c, 0x20, 0x64, +0x6d, 0x76, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x4c, +0x30, 0x2b, 0x4c, 0x31, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x2a, 0x2f, 0x0a, 0x64, 0x6d, 0x76, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, +0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x30, 0x5b, 0x28, 0x62, 0x20, 0x2d, 0x20, +0x70, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x63, 0x6f, 0x75, +0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x64, 0x6d, 0x76, +0x31, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, +0x6d, 0x76, 0x73, 0x31, 0x5b, 0x28, 0x70, 0x31, 0x20, 0x2d, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x31, +0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x6d, +0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x54, 0x52, 0x59, 0x5f, 0x42, 0x49, 0x44, 0x49, 0x52, +0x28, 0x20, 0x64, 0x6d, 0x76, 0x30, 0x2c, 0x20, 0x64, 0x6d, 0x76, 0x31, 0x2c, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x54, 0x52, 0x59, 0x5f, 0x42, 0x49, +0x44, 0x49, 0x52, 0x0a, 0x7d, 0x0a, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, +0x74, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, +0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, 0x53, 0x5f, 0x43, +0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x6c, 0x69, +0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3c, 0x3c, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, +0x53, 0x5f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x48, 0x49, 0x46, 0x54, 0x29, 0x3b, 0x0a, 0x7d, +0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x20, 0x73, +0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x0a, 0x2a, +0x0a, 0x2a, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, +0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x5b, 0x32, 0x35, +0x36, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, 0x2a, 0x2f, +0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x75, 0x6d, +0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, +0x5f, 0x74, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, +0x63, 0x6f, 0x73, 0x74, 0x73, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, +0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, 0x69, 0x6e, +0x76, 0x5f, 0x71, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2c, +0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x72, 0x6f, 0x77, 0x5f, +0x73, 0x61, 0x74, 0x64, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x72, 0x61, +0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x62, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x30, 0x2c, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x31, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, +0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, +0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, +0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x30, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, +0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, +0x72, 0x61, 0x5f, 0x6d, 0x62, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, +0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x20, 0x78, 0x20, 0x3c, +0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, +0x20, 0x30, 0x20, 0x29, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, +0x79, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, +0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, +0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, +0x74, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x26, 0x20, 0x4c, 0x4f, 0x57, 0x52, +0x45, 0x53, 0x5f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, +0x77, 0x72, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, +0x5d, 0x20, 0x3e, 0x3e, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x53, 0x54, +0x5f, 0x53, 0x48, 0x49, 0x46, 0x54, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x5f, 0x66, 0x72, +0x61, 0x6d, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, 0x62, 0x20, 0x3d, 0x20, 0x28, +0x78, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, +0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x26, 0x26, 0x20, 0x79, 0x20, 0x3e, +0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, +0x67, 0x68, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6d, 0x62, 0x5f, 0x77, +0x69, 0x64, 0x74, 0x68, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0x20, 0x6d, 0x62, 0x5f, +0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x66, 0x28, +0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x62, 0x5f, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, 0x62, 0x20, 0x29, +0x0a, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6d, 0x62, 0x73, 0x2b, 0x2b, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x73, +0x74, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x76, 0x5f, 0x71, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, +0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x2b, 0x20, 0x31, +0x32, 0x38, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x3b, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, +0x74, 0x64, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x3b, 0x0a, +0x69, 0x66, 0x28, 0x20, 0x62, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, +0x65, 0x5f, 0x6d, 0x62, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, +0x74, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, +0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x61, +0x71, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, +0x74, 0x64, 0x73, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, +0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x73, 0x2c, +0x20, 0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, +0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, +0x73, 0x74, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, +0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x70, +0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x63, 0x6f, 0x73, +0x74, 0x5f, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, +0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6d, 0x62, 0x73, +0x20, 0x20, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, +0x6d, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6d, 0x62, 0x73, 0x2c, 0x20, 0x78, 0x2c, +0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, +0x20, 0x21, 0x3d, 0x20, 0x70, 0x31, 0x20, 0x29, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, +0x74, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, +0x29, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30, 0x2e, +0x30, 0x66, 0x20, 0x2f, 0x20, 0x28, 0x31, 0x32, 0x30, 0x2e, 0x30, 0x66, 0x20, 0x2b, 0x20, 0x28, +0x66, 0x6c, 0x6f, 0x61, 0x74, 0x29, 0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x61, +0x73, 0x29, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, +0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, +0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, +0x74, 0x64, 0x73, 0x5b, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, +0x64, 0x73, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x43, 0x4f, +0x53, 0x54, 0x5f, 0x45, 0x53, 0x54, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, +0x20, 0x29, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x20, +0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x43, 0x4f, +0x53, 0x54, 0x5f, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x51, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, +0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x29, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, +0x5f, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, +0x73, 0x20, 0x2b, 0x20, 0x49, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x4d, 0x42, 0x53, 0x2c, 0x20, 0x69, +0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6d, 0x62, 0x73, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, +0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6c, +0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x3a, 0x20, 0x66, 0x75, 0x6c, 0x6c, +0x2d, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x64, +0x6f, 0x77, 0x6e, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, +0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x68, +0x70, 0x65, 0x6c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x2d, 0x2d, +0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6d, 0x67, 0x20, 0x69, 0x73, +0x20, 0x61, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x20, 0x28, 0x61, 0x72, 0x65, 0x61, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, +0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x6f, +0x75, 0x67, 0x68, 0x20, 0x61, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x0a, 0x2a, 0x20, +0x63, 0x61, 0x63, 0x68, 0x65, 0x29, 0x2e, 0x20, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, +0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x6f, 0x63, 0x61, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, +0x6e, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x76, 0x61, +0x6c, 0x75, 0x65, 0x73, 0x3a, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x76, 0x61, 0x6c, 0x2e, 0x73, 0x30, +0x20, 0x3d, 0x20, 0x50, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x0a, 0x2a, 0x20, 0x76, 0x61, 0x6c, 0x2e, +0x73, 0x31, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x78, 0x2b, 0x31, 0x2c, 0x79, 0x29, 0x0a, 0x2a, 0x20, +0x76, 0x61, 0x6c, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x78, 0x2b, 0x32, 0x2c, 0x79, +0x29, 0x0a, 0x2a, 0x20, 0x76, 0x61, 0x6c, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x78, +0x2b, 0x33, 0x2c, 0x79, 0x29, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, +0x73, 0x20, 0x61, 0x20, 0x34, 0x78, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, +0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, +0x2d, 0x6f, 0x66, 0x66, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x65, 0x6d, +0x6f, 0x72, 0x79, 0x0a, 0x2a, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, +0x65, 0x61, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x2e, 0x0a, 0x2a, 0x0a, 0x2a, +0x20, 0x2d, 0x2d, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x5f, 0x70, 0x6c, 0x61, +0x6e, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, +0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, +0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x48, 0x50, +0x45, 0x4c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, +0x6f, 0x72, 0x0a, 0x2a, 0x20, 0x73, 0x75, 0x62, 0x70, 0x65, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x69, +0x6e, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6f, +0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x6f, 0x63, 0x61, +0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, +0x6e, 0x73, 0x20, 0x61, 0x20, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x20, 0x77, 0x69, 0x74, 0x68, +0x0a, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x6e, +0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x43, 0x20, 0x7c, 0x20, 0x56, 0x20, +0x7c, 0x20, 0x48, 0x20, 0x7c, 0x20, 0x46, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x6c, 0x61, 0x75, 0x6e, +0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x20, +0x5b, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x6c, +0x6f, 0x77, 0x72, 0x65, 0x73, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, 0x2a, 0x2f, +0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x77, +0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x68, 0x70, 0x65, 0x6c, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, +0x2a, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, +0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x5f, 0x69, 0x6d, 0x67, 0x2c, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, +0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x5f, +0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, +0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, +0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x75, +0x69, 0x6e, 0x74, 0x34, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0a, 0x66, 0x65, 0x6e, +0x63, 0x20, 0x2b, 0x3d, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, +0x2a, 0x20, 0x32, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, +0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3d, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x20, 0x2b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x79, 0x20, 0x3d, 0x3d, 0x20, +0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, +0x20, 0x31, 0x20, 0x29, 0x2d, 0x31, 0x29, 0x20, 0x3f, 0x20, 0x73, 0x72, 0x63, 0x31, 0x20, 0x3a, +0x20, 0x73, 0x72, 0x63, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x32, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, +0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x72, +0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0a, 0x72, 0x69, 0x67, 0x68, +0x74, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, +0x78, 0x2a, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, +0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, +0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, +0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, +0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x0a, 0x72, +0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, +0x6e, 0x63, 0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, +0x32, 0x2a, 0x78, 0x2b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, +0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x32, 0x2a, +0x78, 0x2b, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x32, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x20, 0x3d, +0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x2f, 0x2f, 0x20, 0x48, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x68, +0x61, 0x64, 0x64, 0x28, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x32, 0x2a, 0x78, 0x5d, 0x2c, 0x20, +0x73, 0x72, 0x63, 0x32, 0x5b, 0x32, 0x2a, 0x78, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, +0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x73, 0x72, 0x63, 0x31, +0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x32, 0x5b, 0x32, 0x2a, +0x78, 0x2b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x56, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, +0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x32, 0x2a, 0x78, +0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x32, 0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x31, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, +0x64, 0x28, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x32, 0x5d, 0x2c, 0x20, +0x73, 0x72, 0x63, 0x32, 0x5b, 0x32, 0x2a, 0x78, 0x2b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, +0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, +0x28, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x0a, +0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, +0x74, 0x34, 0x29, 0x20, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x33, 0x20, +0x26, 0x20, 0x30, 0x78, 0x66, 0x66, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7c, +0x20, 0x28, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x32, 0x20, 0x26, 0x20, 0x30, +0x78, 0x66, 0x66, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x36, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x28, +0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x20, 0x26, 0x20, 0x30, 0x78, 0x66, 0x66, +0x29, 0x20, 0x3c, 0x3c, 0x20, 0x38, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, +0x73, 0x2e, 0x73, 0x30, 0x20, 0x26, 0x20, 0x30, 0x78, 0x66, 0x66, 0x29, 0x3b, 0x0a, 0x77, 0x72, +0x69, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x68, 0x70, 0x65, +0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x76, +0x61, 0x6c, 0x20, 0x29, 0x3b, 0x0a, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, +0x28, 0x20, 0x78, 0x2c, 0x20, 0x78, 0x2b, 0x31, 0x2c, 0x20, 0x78, 0x2b, 0x31, 0x20, 0x3c, 0x20, +0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, +0x20, 0x30, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, +0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x78, 0x2a, 0x32, 0x5d, +0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x6c, +0x65, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, +0x6e, 0x63, 0x5b, 0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, +0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, +0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x69, 0x67, +0x68, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x78, 0x20, 0x3d, 0x20, +0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x78, 0x2c, 0x20, 0x78, 0x2b, 0x31, 0x2c, 0x20, +0x78, 0x2b, 0x31, 0x20, 0x3c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x69, +0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, +0x63, 0x5b, 0x78, 0x2a, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, +0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x2c, +0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, +0x64, 0x28, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, +0x3b, 0x0a, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x78, 0x2c, +0x20, 0x78, 0x2b, 0x31, 0x2c, 0x20, 0x78, 0x2b, 0x31, 0x20, 0x3c, 0x20, 0x67, 0x65, 0x74, 0x5f, +0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, +0x20, 0x29, 0x3b, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, +0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x78, 0x2a, 0x32, 0x5d, 0x2c, 0x20, 0x73, 0x72, +0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x20, +0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5b, 0x78, +0x2a, 0x32, 0x2b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x31, 0x5b, 0x78, 0x2a, 0x32, 0x2b, +0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x33, 0x20, +0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6d, 0x67, 0x2c, +0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, +0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, +0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, +0x63, 0x68, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x66, +0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, +0x0a, 0x2a, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, +0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, +0x73, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, +0x65, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x74, +0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x2a, +0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, +0x65, 0x73, 0x2e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, +0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x20, 0x5b, 0x6c, 0x6f, 0x77, +0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, +0x77, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, +0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, +0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x31, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x68, +0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, +0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, +0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, +0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, +0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, +0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x75, 0x69, +0x6e, 0x74, 0x34, 0x20, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2c, 0x20, 0x76, 0x61, +0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0a, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, +0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, +0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x29, 0x20, +0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, +0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, +0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x2b, 0x31, 0x29, 0x20, 0x29, +0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x68, +0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, +0x73, 0x30, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, +0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x6f, 0x74, +0x2e, 0x73, 0x31, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x73, +0x65, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, +0x6e, 0x74, 0x73, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x72, 0x65, 0x64, 0x75, 0x6e, +0x64, 0x61, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x73, +0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x65, +0x73, 0x74, 0x73, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x0a, 0x2a, +0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x65, +0x72, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, +0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, +0x79, 0x20, 0x61, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x62, 0x75, 0x67, 0x0a, 0x2a, +0x2f, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, +0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x30, 0x2c, +0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x32, 0x20, 0x29, 0x2c, +0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x33, 0x2c, 0x20, +0x62, 0x6f, 0x74, 0x2e, 0x73, 0x33, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, +0x2b, 0x20, 0x31, 0x20, 0x3c, 0x20, 0x67, 0x73, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x74, 0x6f, 0x70, +0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, +0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, +0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, +0x2b, 0x34, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x74, 0x20, +0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, +0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2b, +0x34, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x2b, 0x31, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, +0x75, 0x65, 0x73, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, +0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, +0x64, 0x28, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x30, +0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, +0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, +0x31, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x3c, +0x20, 0x67, 0x73, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x76, 0x61, 0x6c, +0x75, 0x65, 0x73, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, +0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x6f, +0x74, 0x2e, 0x73, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x2e, 0x73, 0x33, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x33, 0x20, 0x29, 0x20, +0x29, 0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x20, 0x3c, 0x20, 0x67, 0x73, 0x20, +0x29, 0x20, 0x29, 0x3b, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x75, 0x69, 0x28, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x70, +0x6f, 0x73, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x76, 0x61, 0x6c, 0x75, +0x65, 0x73, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x53, 0x65, +0x63, 0x6f, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x6f, 0x77, +0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x6e, +0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x54, +0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x28, 0x6e, 0x6f, 0x20, 0x70, 0x65, 0x72, +0x66, 0x20, 0x6c, 0x6f, 0x73, 0x73, 0x29, 0x0a, 0x2a, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, +0x6f, 0x75, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, +0x75, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x75, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x75, 0x72, +0x72, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x20, 0x64, 0x72, 0x69, 0x76, +0x65, 0x72, 0x73, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x62, 0x75, 0x67, 0x20, 0x68, +0x61, 0x73, 0x0a, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, +0x6c, 0x79, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x69, 0x6e, +0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x75, 0x6c, 0x79, 0x20, 0x32, 0x30, 0x31, 0x32, 0x20, 0x64, +0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x66, 0x72, +0x6f, 0x6d, 0x20, 0x41, 0x4d, 0x44, 0x2e, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, +0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, +0x32, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, +0x73, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x72, 0x65, +0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, +0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, +0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x32, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, +0x78, 0x2c, 0x20, 0x79, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x73, 0x20, 0x3d, 0x20, +0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, +0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x74, 0x6f, 0x70, 0x2c, +0x20, 0x62, 0x6f, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3b, 0x0a, 0x74, 0x6f, +0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, +0x28, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, +0x32, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x74, 0x20, 0x3d, +0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x68, +0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2c, 0x20, +0x32, 0x2a, 0x79, 0x2b, 0x31, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x68, 0x61, +0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x30, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, +0x73, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x29, 0x20, 0x29, 0x3b, +0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, +0x65, 0x63, 0x74, 0x28, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x30, 0x2c, 0x20, +0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x32, 0x20, 0x29, 0x2c, 0x20, +0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x33, 0x2c, 0x20, 0x62, +0x6f, 0x74, 0x2e, 0x73, 0x33, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, 0x2b, +0x20, 0x31, 0x20, 0x3c, 0x20, 0x67, 0x73, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x74, 0x6f, 0x70, 0x20, +0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, +0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2b, +0x34, 0x2c, 0x20, 0x32, 0x2a, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x74, 0x20, 0x3d, +0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x68, +0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2a, 0x32, 0x2b, 0x34, +0x2c, 0x20, 0x32, 0x2a, 0x79, 0x2b, 0x31, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, +0x65, 0x73, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, +0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, +0x28, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x30, 0x2c, +0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x31, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x31, +0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x3c, 0x20, +0x67, 0x73, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x73, +0x33, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x76, 0x61, 0x6c, 0x75, +0x65, 0x73, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x72, 0x68, +0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x2e, 0x73, 0x32, 0x2c, 0x20, 0x62, 0x6f, 0x74, +0x2e, 0x73, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x2e, 0x73, 0x33, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x2e, 0x73, 0x33, 0x20, 0x29, 0x20, 0x29, +0x2c, 0x20, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x20, 0x3c, 0x20, 0x67, 0x73, 0x20, 0x29, +0x20, 0x29, 0x3b, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x6f, +0x73, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, +0x73, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x43, +0x4c, 0x20, 0x31, 0x2e, 0x32, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x64, +0x64, 0x65, 0x64, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6d, +0x6d, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, +0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x2e, +0x32, 0x20, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, +0x20, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x20, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, 0x62, +0x75, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, +0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x62, 0x75, 0x66, 0x5b, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, +0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x5d, 0x20, 0x3d, 0x20, +0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x4c, 0x6f, 0x6f, 0x6b, +0x61, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, +0x72, 0x61, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, +0x45, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, +0x73, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, +0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, +0x64, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, +0x72, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x47, 0x50, 0x55, 0x73, 0x0a, 0x2a, 0x20, +0x28, 0x4e, 0x56, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, +0x72, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x47, 0x50, 0x55, +0x73, 0x20, 0x28, 0x41, 0x4d, 0x44, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, +0x65, 0x72, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x29, 0x2e, 0x20, 0x20, 0x78, +0x32, 0x36, 0x34, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x73, 0x0a, 0x2a, 0x20, 0x74, 0x68, +0x65, 0x20, 0x47, 0x50, 0x55, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, +0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x44, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, +0x49, 0x5a, 0x45, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, +0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x2e, 0x0a, 0x2a, 0x0a, +0x2a, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, +0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, +0x6e, 0x73, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, +0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x43, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, +0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2e, 0x63, 0x0a, 0x2a, 0x20, 0x61, +0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, +0x78, 0x61, 0x63, 0x74, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, +0x73, 0x2e, 0x0a, 0x2a, 0x2f, 0x0a, 0x2f, 0x2a, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, 0x61, +0x6c, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, +0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, +0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x76, +0x65, 0x6e, 0x74, 0x20, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x20, 0x74, 0x79, +0x70, 0x65, 0x73, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x28, 0x20, 0x58, 0x2c, 0x20, 0x4d, 0x49, 0x4e, +0x2c, 0x20, 0x4d, 0x41, 0x58, 0x20, 0x29, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x20, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x28, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, 0x28, 0x58, 0x29, 0x2c, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x29, 0x28, 0x4d, 0x49, 0x4e, 0x29, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x29, +0x28, 0x4d, 0x41, 0x58, 0x29, 0x20, 0x29, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x56, 0x45, 0x43, 0x54, +0x4f, 0x52, 0x49, 0x5a, 0x45, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, +0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x38, 0x20, +0x70, 0x72, 0x32, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x61, 0x5f, 0x76, 0x2c, 0x20, 0x64, 0x5f, 0x76, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, +0x30, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x33, +0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x31, 0x2c, 0x20, +0x74, 0x6d, 0x70, 0x31, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x33, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x32, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x31, 0x2c, +0x20, 0x74, 0x6d, 0x70, 0x32, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x33, 0x2c, 0x20, 0x74, +0x6d, 0x70, 0x33, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, +0x33, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, 0x33, 0x3b, 0x0a, 0x64, 0x5f, 0x76, 0x20, 0x3d, +0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x28, 0x20, 0x76, +0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, +0x20, 0x29, 0x3b, 0x0a, 0x61, 0x5f, 0x76, 0x2e, 0x73, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x5f, 0x76, 0x20, 0x2d, 0x20, 0x70, 0x72, 0x30, 0x29, 0x2e, +0x73, 0x30, 0x34, 0x31, 0x35, 0x32, 0x36, 0x33, 0x37, 0x3b, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, +0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x30, 0x2c, 0x20, 0x74, 0x6d, +0x70, 0x30, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, +0x33, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, +0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, +0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x68, 0x69, 0x20, 0x29, 0x3b, +0x0a, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2b, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x64, 0x5f, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, +0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x28, 0x20, 0x76, 0x6c, 0x6f, 0x61, 0x64, 0x38, +0x28, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x61, +0x5f, 0x76, 0x2e, 0x73, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x28, +0x64, 0x5f, 0x76, 0x20, 0x2d, 0x20, 0x70, 0x72, 0x31, 0x29, 0x2e, 0x73, 0x30, 0x34, 0x31, 0x35, +0x32, 0x36, 0x33, 0x37, 0x3b, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, +0x28, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x31, 0x2c, 0x20, +0x74, 0x6d, 0x70, 0x31, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x33, 0x2c, 0x20, 0x61, 0x5f, +0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, +0x68, 0x69, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, +0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x68, 0x69, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x61, 0x74, 0x61, +0x20, 0x2b, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, +0x0a, 0x64, 0x5f, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, +0x6e, 0x74, 0x38, 0x28, 0x20, 0x76, 0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, 0x2c, 0x20, +0x64, 0x61, 0x74, 0x61, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x61, 0x5f, 0x76, 0x2e, 0x73, 0x30, +0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x5f, 0x76, 0x20, 0x2d, +0x20, 0x70, 0x72, 0x32, 0x29, 0x2e, 0x73, 0x30, 0x34, 0x31, 0x35, 0x32, 0x36, 0x33, 0x37, 0x3b, +0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x74, 0x6d, 0x70, +0x32, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x32, +0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x33, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, +0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x61, +0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, +0x2e, 0x68, 0x69, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2b, 0x3d, 0x20, 0x64, +0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x64, 0x5f, 0x76, 0x20, +0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x28, 0x20, +0x76, 0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, +0x29, 0x20, 0x29, 0x3b, 0x0a, 0x61, 0x5f, 0x76, 0x2e, 0x73, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, +0x36, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x5f, 0x76, 0x20, 0x2d, 0x20, 0x70, 0x72, 0x33, 0x29, +0x2e, 0x73, 0x30, 0x34, 0x31, 0x35, 0x32, 0x36, 0x33, 0x37, 0x3b, 0x0a, 0x48, 0x41, 0x44, 0x41, +0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x74, 0x6d, 0x70, 0x33, 0x30, 0x2c, 0x20, 0x74, +0x6d, 0x70, 0x33, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, +0x33, 0x33, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, +0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, +0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x68, 0x69, 0x20, 0x29, +0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x3b, 0x0a, 0x48, +0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, +0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, +0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, +0x68, 0x69, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x30, 0x2c, 0x20, 0x74, 0x6d, +0x70, 0x31, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x30, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, +0x30, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, +0x28, 0x20, 0x61, 0x5f, 0x76, 0x20, 0x29, 0x3b, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, +0x44, 0x34, 0x56, 0x28, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, +0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, +0x69, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x68, 0x69, 0x2c, +0x20, 0x74, 0x6d, 0x70, 0x30, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x31, 0x2c, 0x20, 0x74, +0x6d, 0x70, 0x32, 0x31, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x73, +0x75, 0x6d, 0x5f, 0x76, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x20, 0x61, 0x5f, 0x76, +0x20, 0x29, 0x3b, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, +0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, +0x6f, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x6c, 0x6f, 0x2c, +0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, +0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x31, 0x32, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x32, 0x2c, +0x20, 0x74, 0x6d, 0x70, 0x33, 0x32, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x20, +0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x20, 0x61, 0x5f, 0x76, 0x20, 0x29, 0x3b, 0x0a, 0x48, +0x41, 0x44, 0x41, 0x4d, 0x41, 0x52, 0x44, 0x34, 0x56, 0x28, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, +0x6f, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x2e, 0x68, 0x69, 0x2c, +0x20, 0x61, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x2e, 0x6c, 0x6f, 0x2c, 0x20, 0x61, 0x5f, 0x76, 0x2e, +0x68, 0x69, 0x2e, 0x68, 0x69, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x30, 0x33, 0x2c, 0x20, 0x74, 0x6d, +0x70, 0x31, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x32, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x33, +0x33, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, +0x73, 0x28, 0x20, 0x61, 0x5f, 0x76, 0x20, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, +0x73, 0x75, 0x6d, 0x32, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x2e, 0x68, 0x69, 0x20, +0x2b, 0x20, 0x73, 0x75, 0x6d, 0x5f, 0x76, 0x2e, 0x6c, 0x6f, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x73, 0x75, 0x6d, 0x33, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x2e, 0x68, 0x69, +0x20, 0x2b, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x2e, 0x6c, 0x6f, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, +0x72, 0x6e, 0x20, 0x28, 0x20, 0x73, 0x75, 0x6d, 0x33, 0x2e, 0x68, 0x69, 0x20, 0x2b, 0x20, 0x73, +0x75, 0x6d, 0x33, 0x2e, 0x6c, 0x6f, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x3b, 0x0a, 0x7d, +0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x53, 0x41, 0x54, 0x44, 0x5f, 0x43, 0x5f, 0x38, 0x78, +0x34, 0x5f, 0x51, 0x28, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, +0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, 0x70, +0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x29, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, +0x2f, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x2a, 0x20, +0x38, 0x78, 0x38, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, +0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x62, 0x6c, +0x6f, 0x63, 0x6b, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, +0x2f, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x31, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x0a, 0x23, 0x64, +0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x32, 0x28, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, +0x63, 0x20, 0x29, 0x20, 0x28, 0x20, 0x61, 0x2b, 0x32, 0x2a, 0x62, 0x2b, 0x63, 0x2b, 0x32, 0x20, +0x29, 0x3e, 0x3e, 0x32, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x49, +0x5a, 0x45, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, +0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x64, 0x64, 0x6c, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, +0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, +0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x35, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x20, +0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, +0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, +0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x33, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x36, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x20, +0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, +0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, +0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, +0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, +0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, +0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, +0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, +0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x36, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x20, +0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, +0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, +0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, +0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, +0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, +0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x36, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, +0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, +0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, +0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, +0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x34, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, +0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, +0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, +0x73, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x38, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x30, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x20, +0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, +0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, +0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, +0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, +0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x35, 0x5d, +0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, +0x2b, 0x20, 0x33, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, +0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, +0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, +0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, +0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x64, 0x64, 0x72, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, +0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, +0x65, 0x66, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, +0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, +0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, +0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, +0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, +0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, +0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, +0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, +0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, +0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, +0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, +0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, +0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, +0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x76, 0x72, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, +0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, +0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, +0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, +0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, +0x66, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, +0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, 0x2c, +0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x3b, 0x0a, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x31, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x31, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, +0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, +0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, +0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, +0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, +0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, +0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, +0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x50, 0x52, 0x45, 0x44, 0x0a, 0x7d, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, +0x38, 0x78, 0x38, 0x5f, 0x68, 0x64, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, 0x66, 0x74, 0x2c, +0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, +0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, +0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, +0x6f, 0x70, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, +0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, +0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, +0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, +0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, +0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, +0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, +0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, +0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, +0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, +0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, +0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, +0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, +0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, +0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, +0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, +0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, +0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x33, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, +0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5f, 0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x30, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, +0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, +0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, +0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, +0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, +0x78, 0x38, 0x5f, 0x76, 0x6c, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x20, 0x2a, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, +0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, +0x33, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, +0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, +0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, +0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x34, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x33, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, +0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, +0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, +0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, +0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, +0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x68, +0x75, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, +0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, +0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, +0x66, 0x74, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, 0x30, 0x2c, +0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x3b, 0x0a, +0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, +0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, +0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, +0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, +0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, +0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, +0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, +0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x33, 0x2e, 0x73, +0x37, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, +0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, +0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, +0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, +0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, +0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x35, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, +0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, +0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, +0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, +0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, 0x72, 0x31, 0x2e, 0x73, 0x35, 0x20, +0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x2e, 0x73, +0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x20, +0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, +0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, +0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, 0x72, 0x32, 0x2e, 0x73, +0x35, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x70, 0x72, 0x32, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x20, 0x70, +0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x3b, +0x0a, 0x70, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x37, 0x5d, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, +0x64, 0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, +0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, +0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, +0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, +0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, +0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x68, 0x28, 0x20, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, +0x5f, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, +0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, +0x33, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, +0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x70, 0x72, 0x31, 0x20, 0x3d, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, +0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, +0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x20, 0x3d, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, +0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, +0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x20, 0x3d, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, 0x73, +0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x3b, 0x0a, 0x70, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, +0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x20, 0x3d, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x20, 0x73, +0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x3b, 0x0a, 0x70, 0x72, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x38, 0x29, 0x73, 0x72, +0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, +0x74, 0x64, 0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, +0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x20, 0x2b, 0x20, +0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, +0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, +0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, +0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x76, +0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, +0x38, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, +0x5f, 0x69, 0x6e, 0x74, 0x38, 0x28, 0x20, 0x76, 0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, +0x2c, 0x20, 0x26, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x5d, 0x20, 0x29, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, +0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, +0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x70, +0x72, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x20, 0x2b, 0x0a, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, +0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x72, +0x65, 0x64, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, +0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x70, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x48, 0x20, 0x3d, 0x20, +0x30, 0x2c, 0x20, 0x56, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, +0x20, 0x69, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x48, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x69, +0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x34, 0x20, 0x2b, +0x20, 0x69, 0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, +0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x32, 0x20, 0x2d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, 0x0a, 0x56, 0x20, 0x2b, +0x3d, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, +0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x34, 0x29, 0x20, 0x2a, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x20, 0x2d, 0x20, 0x73, 0x72, +0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x32, 0x20, 0x2d, 0x20, 0x69, 0x29, 0x20, 0x2a, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, 0x0a, 0x7d, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x28, 0x73, +0x72, 0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x37, 0x20, 0x2a, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x37, 0x20, +0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x48, 0x20, +0x2b, 0x20, 0x31, 0x36, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x63, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x56, 0x20, 0x2b, 0x20, 0x31, 0x36, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x30, 0x30, 0x20, +0x3d, 0x20, 0x61, 0x20, 0x2d, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x33, 0x20, +0x2a, 0x20, 0x63, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x70, 0x72, +0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, +0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, +0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, +0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, +0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x31, +0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x70, 0x69, 0x78, +0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, +0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, 0x3d, +0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, +0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, +0x30, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, +0x63, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, +0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, +0x20, 0x70, 0x72, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, +0x30, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, +0x62, 0x3b, 0x0a, 0x70, 0x72, 0x30, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, +0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, +0x63, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, +0x31, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, +0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, +0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x70, 0x69, +0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x31, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x32, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x33, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x34, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x35, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x36, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, +0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x32, 0x2e, 0x73, 0x37, 0x20, +0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, +0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, +0x30, 0x30, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x34, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x35, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x36, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, +0x20, 0x62, 0x3b, 0x0a, 0x70, 0x72, 0x33, 0x2e, 0x73, 0x37, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x20, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, +0x20, 0x63, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, +0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, +0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x30, 0x2c, +0x20, 0x70, 0x72, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x33, 0x20, 0x29, +0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x64, 0x63, 0x28, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, +0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x32, 0x20, +0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, +0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, +0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x73, 0x30, 0x20, 0x2b, +0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x69, 0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, +0x5b, 0x69, 0x20, 0x2b, 0x20, 0x34, 0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x73, 0x32, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, +0x2d, 0x31, 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x73, 0x33, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, +0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x2b, 0x34, 0x29, 0x2a, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x38, 0x20, 0x64, +0x63, 0x30, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, +0x74, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x32, 0x20, 0x2b, 0x20, +0x34, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x68, +0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x31, 0x20, +0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, +0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x64, 0x63, 0x30, 0x2c, +0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x64, 0x63, 0x30, 0x20, 0x29, +0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x34, +0x29, 0x28, 0x20, 0x28, 0x73, 0x33, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x20, 0x29, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, +0x74, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x73, 0x33, 0x20, 0x2b, 0x20, +0x34, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, +0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, +0x34, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x6c, 0x72, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, +0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, +0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x2c, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x64, 0x63, 0x30, +0x2c, 0x20, 0x64, 0x63, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, +0x20, 0x20, 0x2f, 0x2a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, +0x7a, 0x65, 0x64, 0x3a, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, +0x63, 0x68, 0x65, 0x61, 0x70, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, +0x61, 0x72, 0x65, 0x20, 0x73, 0x63, 0x61, 0x72, 0x63, 0x65, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, +0x78, 0x38, 0x5f, 0x64, 0x64, 0x6c, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, +0x74, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, +0x5d, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, +0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, +0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x20, +0x3d, 0x20, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x29, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, +0x69, 0x6e, 0x74, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, +0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x2a, +0x38, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x78, +0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, +0x5b, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x2b, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x20, 0x2b, 0x20, +0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, +0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, +0x29, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, +0x34, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, +0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x20, +0x3d, 0x20, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x29, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, +0x69, 0x6e, 0x74, 0x28, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, +0x33, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x20, +0x79, 0x20, 0x2d, 0x20, 0x34, 0x20, 0x29, 0x2a, 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x32, +0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, 0x79, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x78, 0x5f, 0x70, 0x6c, 0x75, 0x73, 0x5f, +0x79, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x78, 0x5f, 0x70, +0x6c, 0x75, 0x73, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x32, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x31, 0x5d, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x32, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x34, 0x5d, 0x20, +0x2b, 0x20, 0x33, 0x2a, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x35, 0x5d, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, +0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, +0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, +0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, +0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, +0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x64, +0x64, 0x72, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, +0x6f, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, +0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, +0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, +0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x29, 0x20, 0x70, 0x72, 0x65, +0x64, 0x5b, 0x28, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x79, 0x29, 0x2a, 0x38, 0x5d, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x32, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x33, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, +0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x30, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x34, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, +0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, +0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x31, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, +0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, +0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, +0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, +0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x33, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x30, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, +0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, +0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x37, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x36, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, +0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, +0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, +0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, +0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, +0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, +0x61, 0x74, 0x64, 0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x50, 0x52, 0x45, 0x44, +0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, +0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x76, 0x72, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, +0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, +0x65, 0x66, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, +0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, +0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x78, 0x2c, +0x20, 0x79, 0x20, 0x29, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x78, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x79, 0x29, 0x2a, 0x38, 0x5d, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, +0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, +0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, +0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x32, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, +0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x32, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x33, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x34, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x35, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x36, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, +0x37, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, +0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, +0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, +0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, +0x38, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, +0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, +0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, +0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x33, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, +0x70, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, +0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, +0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, +0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, +0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x32, 0x20, 0x29, +0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x30, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, +0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, +0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, +0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x23, +0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x50, 0x52, 0x45, 0x44, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x6c, +0x69, 0x6e, 0x65, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, +0x74, 0x20, 0x61, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, +0x29, 0x0a, 0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x28, +0x62, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x36, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x6c, 0x69, +0x6e, 0x65, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, +0x61, 0x2c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x20, 0x62, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x2b, 0x20, 0x28, 0x62, 0x20, +0x3c, 0x3c, 0x20, 0x38, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, +0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x68, 0x64, +0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x74, 0x6f, 0x70, +0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, +0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, +0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, +0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, +0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, +0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, +0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, +0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x70, 0x35, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, +0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, +0x36, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, +0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x37, +0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, +0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5f, +0x74, 0x6f, 0x70, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x38, +0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, +0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, +0x6f, 0x70, 0x20, 0x2b, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x39, +0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, +0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x29, 0x29, 0x2c, +0x20, 0x28, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x20, 0x29, 0x29, 0x20, +0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x31, 0x30, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, +0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, +0x31, 0x31, 0x20, 0x3d, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, +0x20, 0x28, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x29, 0x2c, +0x20, 0x28, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x29, 0x20, +0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, +0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, +0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, 0x20, 0x70, 0x39, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, 0x20, 0x30, 0x20, 0x2a, 0x20, +0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, +0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, +0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x31, 0x30, 0x2c, 0x20, 0x70, 0x31, 0x31, 0x20, 0x29, +0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, +0x20, 0x30, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, +0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x37, 0x2c, 0x20, 0x70, +0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, +0x30, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, +0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x39, +0x2c, 0x20, 0x70, 0x31, 0x30, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, +0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, +0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, +0x28, 0x20, 0x70, 0x36, 0x2c, 0x20, 0x70, 0x37, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, +0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x38, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, +0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, +0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, 0x20, 0x70, 0x39, 0x20, 0x29, 0x20, 0x29, 0x2c, +0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, 0x32, 0x20, +0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, +0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x35, 0x2c, 0x20, 0x70, 0x36, 0x20, 0x29, +0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, +0x20, 0x33, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, +0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x37, 0x2c, 0x20, 0x70, +0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, +0x34, 0x20, 0x2b, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, +0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, +0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, +0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x34, +0x2c, 0x20, 0x70, 0x35, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, +0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, +0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, +0x20, 0x70, 0x36, 0x2c, 0x20, 0x70, 0x37, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, +0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x38, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, +0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, +0x33, 0x32, 0x28, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, +0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2a, +0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, +0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, +0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x35, 0x2c, 0x20, 0x70, 0x36, 0x20, 0x29, 0x20, +0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, +0x31, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, +0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, +0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, +0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, +0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x34, 0x2c, +0x20, 0x70, 0x35, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, +0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, +0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, +0x70, 0x31, 0x2c, 0x20, 0x70, 0x32, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, +0x70, 0x72, 0x65, 0x64, 0x5b, 0x30, 0x20, 0x2b, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, +0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, +0x32, 0x28, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x34, 0x20, 0x2b, 0x20, 0x33, 0x20, 0x2a, 0x20, +0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, +0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, +0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, +0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, +0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, +0x5f, 0x76, 0x6c, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x74, 0x6f, 0x70, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, +0x65, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x29, 0x20, 0x70, +0x72, 0x65, 0x64, 0x5b, 0x28, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x79, 0x29, 0x2a, 0x38, 0x5d, +0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, +0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, +0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x30, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x32, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, +0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, +0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, +0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x31, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, +0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, +0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, +0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, +0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, +0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x32, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x30, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x30, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x31, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x34, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x32, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x32, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x35, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x33, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x33, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x36, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x33, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x34, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x34, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x37, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x34, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x35, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x37, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x35, 0x2c, +0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, +0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x38, 0x5d, +0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x35, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, +0x20, 0x36, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x38, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, +0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x36, +0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, +0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x39, +0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, +0x45, 0x44, 0x28, 0x20, 0x36, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x50, 0x52, 0x45, +0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x39, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x2c, +0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, +0x28, 0x20, 0x37, 0x2c, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3d, 0x20, 0x46, 0x31, 0x28, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x50, 0x52, 0x45, 0x44, 0x28, 0x20, 0x37, 0x2c, 0x20, 0x33, 0x20, 0x29, 0x20, +0x3d, 0x20, 0x46, 0x32, 0x28, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x30, 0x5d, 0x2c, 0x20, 0x74, +0x6f, 0x70, 0x5b, 0x31, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x32, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, +0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, +0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, +0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x50, 0x52, +0x45, 0x44, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, +0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x68, 0x75, 0x28, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, +0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, +0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, +0x74, 0x64, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x31, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x29, +0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, +0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, +0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, +0x31, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, +0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x70, 0x33, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, +0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x70, 0x34, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, +0x28, 0x20, 0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x33, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x2b, 0x20, +0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x70, 0x35, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, +0x28, 0x46, 0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x34, 0x5d, 0x2c, 0x20, 0x6c, 0x65, +0x66, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x34, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, +0x5d, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x36, +0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, +0x31, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, +0x5b, 0x36, 0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x35, +0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, +0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x37, 0x20, 0x3d, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x28, 0x46, 0x31, 0x28, +0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, +0x5d, 0x20, 0x29, 0x29, 0x2c, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x36, 0x5d, 0x20, +0x2b, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x38, 0x20, 0x3d, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x38, 0x74, 0x6f, 0x31, 0x36, 0x28, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, +0x5d, 0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x37, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, +0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x31, +0x2c, 0x20, 0x70, 0x32, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, +0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x30, 0x20, 0x29, +0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, +0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, +0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, 0x20, +0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, +0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, +0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, +0x33, 0x32, 0x28, 0x20, 0x70, 0x32, 0x2c, 0x20, 0x70, 0x33, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, +0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, +0x20, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, +0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, +0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, +0x34, 0x2c, 0x20, 0x70, 0x35, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, +0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x31, 0x20, +0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, +0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, +0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x33, 0x2c, 0x20, 0x70, 0x34, +0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, +0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x32, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, +0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, +0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, +0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x35, 0x2c, 0x20, 0x70, 0x36, 0x20, 0x29, 0x20, 0x29, 0x2c, +0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, 0x29, 0x20, +0x2b, 0x20, 0x28, 0x20, 0x32, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, +0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, +0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, +0x70, 0x34, 0x2c, 0x20, 0x70, 0x35, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, +0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x33, +0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, +0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, +0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x36, 0x2c, 0x20, 0x70, +0x37, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, +0x28, 0x20, 0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x33, 0x20, 0x29, 0x20, 0x2a, 0x20, +0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, +0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, +0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, +0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, +0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x35, 0x2c, 0x20, 0x70, 0x36, 0x20, 0x29, 0x20, 0x29, +0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, +0x20, 0x2b, 0x20, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, +0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, +0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, +0x20, 0x70, 0x37, 0x2c, 0x20, 0x70, 0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, +0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, +0x30, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, +0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, +0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x36, 0x2c, 0x20, +0x70, 0x37, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, +0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, +0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, +0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, +0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, 0x20, 0x70, 0x38, 0x20, 0x29, 0x20, +0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, +0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, +0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, +0x28, 0x20, 0x70, 0x37, 0x2c, 0x20, 0x70, 0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, +0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, +0x20, 0x32, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, +0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, +0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, +0x20, 0x70, 0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, +0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x32, 0x20, 0x29, 0x20, +0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, +0x20, 0x61, 0x73, 0x5f, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, +0x31, 0x36, 0x74, 0x6f, 0x33, 0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, 0x20, 0x70, 0x38, 0x20, 0x29, +0x20, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x30, +0x20, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x33, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x34, 0x28, 0x20, 0x61, 0x73, 0x5f, 0x75, +0x63, 0x68, 0x61, 0x72, 0x34, 0x28, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x31, 0x36, 0x74, 0x6f, 0x33, +0x32, 0x28, 0x20, 0x70, 0x38, 0x2c, 0x20, 0x70, 0x38, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x26, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x28, 0x20, 0x34, 0x20, 0x29, 0x20, 0x2b, 0x20, +0x28, 0x20, 0x33, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x61, +0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, +0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, +0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, +0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x68, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x20, 0x2a, 0x73, 0x72, 0x63, 0x5f, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x3b, 0x0a, +0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, +0x29, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x70, +0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, +0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x29, 0x28, 0x73, 0x72, 0x63, 0x5b, +0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, +0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, +0x68, 0x61, 0x72, 0x38, 0x29, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, +0x32, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, +0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x29, 0x28, +0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x70, 0x72, 0x65, +0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x6c, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x29, 0x28, +0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x65, +0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, +0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x29, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, +0x5d, 0x29, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, +0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, +0x72, 0x38, 0x29, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x32, 0x2c, +0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, +0x72, 0x65, 0x38, 0x28, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x29, 0x28, 0x73, 0x72, +0x63, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, +0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x2b, +0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, +0x63, 0x5f, 0x6c, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, +0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x76, 0x28, 0x20, 0x63, 0x6f, 0x6e, +0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, +0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, +0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, 0x0a, +0x75, 0x63, 0x68, 0x61, 0x72, 0x31, 0x36, 0x20, 0x76, 0x31, 0x36, 0x3b, 0x0a, 0x76, 0x31, 0x36, +0x2e, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x76, 0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, 0x2c, +0x20, 0x26, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, +0x65, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x31, 0x36, 0x2e, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x76, +0x6c, 0x6f, 0x61, 0x64, 0x38, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x26, 0x73, 0x72, 0x63, 0x5b, 0x2d, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x76, +0x73, 0x74, 0x6f, 0x72, 0x65, 0x31, 0x36, 0x28, 0x20, 0x76, 0x31, 0x36, 0x2c, 0x20, 0x30, 0x2c, +0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x31, +0x36, 0x28, 0x20, 0x76, 0x31, 0x36, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, +0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, +0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, +0x29, 0x20, 0x2b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, +0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, +0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, +0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, +0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x70, 0x28, 0x20, 0x63, 0x6f, 0x6e, 0x73, +0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x2a, 0x73, +0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x48, 0x20, 0x3d, 0x20, 0x30, +0x2c, 0x20, 0x56, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, +0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, +0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x48, 0x20, 0x2b, 0x3d, 0x20, 0x28, +0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, 0x63, 0x5b, 0x34, 0x20, +0x2b, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x5d, 0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x32, 0x20, 0x2d, 0x20, 0x69, 0x20, 0x2d, 0x20, +0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, 0x0a, 0x56, 0x20, +0x2b, 0x3d, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x72, +0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x34, 0x29, 0x20, 0x2a, +0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x20, 0x2d, 0x20, 0x73, +0x72, 0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x32, 0x20, 0x2d, 0x20, 0x69, 0x29, 0x20, +0x2a, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x36, 0x20, 0x2a, 0x20, 0x28, +0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x37, 0x20, 0x2a, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x20, 0x2b, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x37, +0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x29, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x48, +0x20, 0x2b, 0x20, 0x31, 0x36, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x56, 0x20, 0x2b, 0x20, 0x31, +0x36, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x30, 0x30, +0x20, 0x3d, 0x20, 0x61, 0x20, 0x2d, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2d, 0x20, 0x33, +0x20, 0x2a, 0x20, 0x63, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x34, +0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x69, +0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, +0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x78, 0x20, 0x2b, +0x20, 0x79, 0x2a, 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, 0x6c, 0x69, +0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, 0x3e, 0x20, +0x35, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x0a, 0x7d, +0x0a, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, 0x61, 0x74, +0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, +0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, +0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x66, 0x6f, 0x72, +0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, +0x20, 0x34, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x70, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x30, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, +0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x78, +0x20, 0x2b, 0x20, 0x79, 0x2a, 0x38, 0x5d, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x63, +0x6c, 0x69, 0x70, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x28, 0x20, 0x70, 0x69, 0x78, 0x20, 0x3e, +0x3e, 0x20, 0x35, 0x20, 0x29, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, +0x0a, 0x7d, 0x0a, 0x69, 0x30, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x3b, 0x0a, 0x7d, 0x0a, 0x73, +0x61, 0x74, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, +0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, +0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, +0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, +0x20, 0x38, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, +0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, +0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x64, 0x63, 0x28, 0x20, 0x63, +0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x20, 0x2a, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, +0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x5b, 0x33, 0x32, 0x5d, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x31, +0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x73, 0x33, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x34, 0x3b, 0x20, 0x69, 0x2b, 0x2b, +0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x73, 0x30, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x69, +0x20, 0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, +0x73, 0x31, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x69, 0x20, 0x2b, 0x20, 0x34, 0x20, +0x2d, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x73, +0x32, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x69, 0x20, +0x2a, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, 0x0a, 0x73, +0x33, 0x20, 0x2b, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x28, 0x69, +0x2b, 0x34, 0x29, 0x2a, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x5d, 0x3b, +0x0a, 0x7d, 0x0a, 0x75, 0x63, 0x68, 0x61, 0x72, 0x38, 0x20, 0x64, 0x63, 0x30, 0x3b, 0x0a, 0x64, +0x63, 0x30, 0x2e, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x29, +0x28, 0x20, 0x28, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x34, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x33, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x68, 0x69, 0x20, 0x3d, +0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x31, 0x20, 0x2b, +0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, +0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x70, 0x72, 0x65, +0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, +0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, +0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x70, +0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, +0x64, 0x63, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, +0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x72, 0x63, +0x5f, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, +0x20, 0x29, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x6c, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x63, +0x68, 0x61, 0x72, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x33, 0x20, 0x2b, 0x20, 0x32, 0x29, 0x20, +0x3e, 0x3e, 0x20, 0x32, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x63, 0x30, 0x2e, 0x68, 0x69, 0x20, 0x3d, +0x20, 0x28, 0x75, 0x63, 0x68, 0x61, 0x72, 0x34, 0x29, 0x28, 0x20, 0x28, 0x73, 0x31, 0x20, 0x2b, +0x20, 0x73, 0x33, 0x20, 0x2b, 0x20, 0x34, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x20, 0x29, 0x3b, +0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, +0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, +0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, +0x20, 0x32, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x20, 0x29, 0x3b, 0x0a, 0x76, 0x73, 0x74, 0x6f, +0x72, 0x65, 0x38, 0x28, 0x20, 0x64, 0x63, 0x30, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x70, 0x72, 0x65, +0x64, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x2b, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x6c, 0x70, 0x28, 0x20, +0x73, 0x72, 0x63, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x74, 0x72, 0x69, +0x64, 0x65, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x20, 0x29, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x5f, 0x73, +0x74, 0x72, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x38, 0x20, 0x29, +0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x2f, 0x2a, 0x20, 0x46, 0x69, +0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x73, +0x74, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, +0x20, 0x33, 0x32, 0x20, 0x38, 0x78, 0x38, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x62, 0x6c, 0x6f, +0x63, 0x6b, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x67, 0x72, 0x6f, 0x75, +0x70, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x33, 0x33, 0x20, 0x6d, +0x61, 0x63, 0x72, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x70, 0x6c, 0x75, 0x73, 0x20, +0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, +0x74, 0x6c, 0x79, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x69, +0x6e, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, +0x2c, 0x0a, 0x2a, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, 0x72, +0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, +0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2e, 0x20, 0x20, 0x49, +0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, +0x76, 0x65, 0x6c, 0x79, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x0a, +0x2a, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x61, +0x6e, 0x64, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x66, +0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, +0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x0a, +0x2a, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, +0x6f, 0x66, 0x20, 0x33, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x65, 0x61, +0x63, 0x68, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, +0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, +0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x38, 0x78, 0x38, 0x0a, 0x2a, 0x20, +0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x20, 0x20, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x6f, +0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, +0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, +0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, +0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x2a, 0x20, 0x69, 0x73, +0x20, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2d, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x69, +0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x20, 0x38, 0x20, 0x69, 0x6e, 0x74, +0x72, 0x61, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, +0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, +0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x0a, 0x2a, 0x20, 0x74, 0x68, +0x65, 0x20, 0x22, 0x73, 0x6c, 0x6f, 0x77, 0x22, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, +0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x2c, 0x20, 0x74, +0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x28, 0x6c, 0x65, +0x61, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x29, 0x20, 0x69, 0x6e, 0x74, 0x72, +0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x0a, 0x2a, 0x20, 0x74, 0x65, +0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, +0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x6c, 0x6f, 0x77, +0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x65, 0x6e, +0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, +0x73, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x2c, 0x0a, 0x2a, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x65, 0x72, +0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x2e, 0x0a, 0x2a, +0x0a, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x61, +0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, +0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, +0x61, 0x64, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6c, +0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, +0x0a, 0x2a, 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x73, 0x20, 0x72, 0x65, 0x2d, 0x66, 0x65, 0x74, +0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6d, 0x65, +0x6d, 0x6f, 0x72, 0x79, 0x2e, 0x20, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6c, +0x6c, 0x6f, 0x77, 0x73, 0x20, 0x75, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x2a, 0x20, 0x63, 0x61, 0x6c, +0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, +0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x63, 0x6f, 0x73, +0x74, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, +0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, +0x20, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x2a, 0x0a, 0x2a, +0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, +0x3a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x20, 0x33, 0x32, 0x2c, 0x20, 0x38, 0x20, 0x5d, 0x0a, 0x2a, +0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, +0x6e, 0x73, 0x3a, 0x20, 0x20, 0x5b, 0x20, 0x70, 0x61, 0x64, 0x64, 0x65, 0x64, 0x57, 0x69, 0x64, +0x74, 0x68, 0x2c, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x5d, 0x20, 0x2a, 0x2f, 0x0a, +0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x62, 0x5f, 0x69, +0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, +0x78, 0x38, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x0a, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x20, +0x20, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, +0x6f, 0x73, 0x74, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, +0x73, 0x74, 0x61, 0x74, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x6d, 0x62, +0x64, 0x61, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, +0x68, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, +0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x32, 0x36, 0x35, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, +0x65, 0x20, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x32, +0x36, 0x36, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x63, +0x61, 0x63, 0x68, 0x65, 0x5b, 0x32, 0x33, 0x38, 0x35, 0x5d, 0x3b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x5b, 0x33, +0x32, 0x5d, 0x3b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, +0x74, 0x6f, 0x70, 0x5b, 0x33, 0x32, 0x20, 0x2a, 0x20, 0x31, 0x36, 0x5d, 0x3b, 0x0a, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x33, +0x32, 0x20, 0x2a, 0x20, 0x38, 0x5d, 0x3b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x5b, 0x33, 0x32, 0x5d, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, +0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x78, +0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, +0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x79, 0x20, 0x3d, 0x20, +0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, +0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x67, +0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, +0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, +0x6c, 0x79, 0x20, 0x2a, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, +0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x78, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, +0x41, 0x58, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x78, 0x20, 0x3d, 0x20, +0x67, 0x69, 0x64, 0x78, 0x20, 0x3c, 0x3c, 0x20, 0x38, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, +0x61, 0x73, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x67, 0x69, 0x64, 0x79, 0x20, 0x3c, 0x3c, 0x20, +0x33, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, +0x33, 0x33, 0x20, 0x38, 0x78, 0x38, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x62, 0x6c, 0x6f, 0x63, +0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x73, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x74, +0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x2a, 0x2f, +0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, +0x20, 0x79, 0x20, 0x3c, 0x20, 0x39, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, +0x5f, 0x69, 0x64, 0x20, 0x3c, 0x20, 0x28, 0x33, 0x33, 0x3c, 0x3c, 0x33, 0x29, 0x3e, 0x3e, 0x32, +0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, +0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3c, 0x3c, 0x20, 0x32, +0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x72, +0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, +0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, +0x32, 0x29, 0x28, 0x78, 0x20, 0x2b, 0x20, 0x62, 0x61, 0x73, 0x65, 0x78, 0x2c, 0x20, 0x79, 0x20, +0x2b, 0x20, 0x62, 0x61, 0x73, 0x65, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x61, 0x63, 0x68, +0x65, 0x5b, 0x79, 0x20, 0x2a, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, +0x44, 0x45, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x61, +0x74, 0x61, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x79, 0x20, 0x2a, +0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, +0x31, 0x20, 0x2b, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, +0x61, 0x2e, 0x73, 0x31, 0x3b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x79, 0x20, 0x2a, 0x20, +0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x31, +0x20, 0x2b, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, +0x2e, 0x73, 0x32, 0x3b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x79, 0x20, 0x2a, 0x20, 0x43, +0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x31, 0x20, +0x2b, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, +0x73, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x65, 0x64, 0x67, +0x65, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, +0x69, 0x64, 0x20, 0x3c, 0x20, 0x39, 0x20, 0x29, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x6c, +0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x2a, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, +0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x20, +0x62, 0x61, 0x73, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, +0x72, 0x5f, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x62, 0x61, 0x73, 0x65, 0x79, 0x29, 0x20, 0x29, 0x2e, +0x73, 0x30, 0x3b, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x20, 0x43, 0x4c, 0x4b, +0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, +0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x6c, 0x79, 0x3b, 0x0a, +0x74, 0x6f, 0x70, 0x5b, 0x6c, 0x78, 0x2a, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x3d, +0x20, 0x28, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, +0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, +0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, +0x61, 0x6d, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x28, 0x20, 0x6a, 0x20, 0x2d, 0x20, 0x31, 0x2c, 0x20, +0x2d, 0x31, 0x2c, 0x20, 0x31, 0x35, 0x20, 0x29, 0x5d, 0x20, 0x2b, 0x0a, 0x32, 0x2a, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x69, +0x6e, 0x74, 0x28, 0x20, 0x6a, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x35, 0x20, 0x29, 0x5d, 0x20, +0x2b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, +0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, 0x41, +0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, 0x61, +0x6d, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x28, 0x20, 0x6a, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x31, 0x35, 0x20, 0x29, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x6a, 0x20, 0x2b, 0x3d, 0x20, 0x38, 0x3b, 0x0a, 0x74, 0x6f, 0x70, 0x5b, +0x6c, 0x78, 0x2a, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x63, +0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, +0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, +0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, +0x69, 0x6e, 0x74, 0x28, 0x20, 0x6a, 0x20, 0x2d, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x2c, 0x20, +0x31, 0x35, 0x20, 0x29, 0x5d, 0x20, 0x2b, 0x0a, 0x32, 0x2a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, +0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, +0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, +0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x28, 0x20, +0x6a, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x35, 0x20, 0x29, 0x5d, 0x20, 0x2b, 0x0a, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x2b, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x69, +0x6e, 0x74, 0x28, 0x20, 0x6a, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x35, +0x20, 0x29, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, +0x6c, 0x65, 0x66, 0x74, 0x5b, 0x6c, 0x78, 0x2a, 0x38, 0x20, 0x2b, 0x20, 0x6c, 0x79, 0x5d, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, +0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, +0x31, 0x20, 0x2b, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, +0x2a, 0x28, 0x6c, 0x79, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x2b, 0x0a, 0x32, 0x2a, 0x63, +0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, +0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x43, +0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2a, 0x6c, 0x79, 0x5d, 0x20, +0x2b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, +0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, 0x31, 0x20, +0x2b, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2a, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x28, 0x28, 0x6c, 0x79, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x2c, 0x20, 0x30, +0x2c, 0x20, 0x37, 0x20, 0x29, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x79, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x5b, 0x6c, 0x78, 0x5d, 0x20, +0x3d, 0x20, 0x28, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, +0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x20, 0x2d, 0x20, +0x31, 0x5d, 0x20, 0x2b, 0x20, 0x32, 0x2a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, +0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, +0x20, 0x2d, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, +0x49, 0x44, 0x45, 0x5d, 0x20, 0x2b, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, +0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, +0x20, 0x2d, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x5d, +0x20, 0x2b, 0x20, 0x32, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x63, 0x6f, 0x73, +0x74, 0x5f, 0x62, 0x75, 0x66, 0x5b, 0x6c, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x43, 0x4f, 0x53, 0x54, +0x5f, 0x4d, 0x41, 0x58, 0x3b, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, +0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, +0x45, 0x4e, 0x43, 0x45, 0x20, 0x29, 0x3b, 0x0a, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x28, 0x20, +0x6c, 0x79, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x30, 0x3a, 0x0a, 0x73, +0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, +0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x68, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, 0x68, +0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, +0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, +0x52, 0x49, 0x44, 0x45, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, +0x61, 0x73, 0x65, 0x20, 0x31, 0x3a, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, +0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, +0x76, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, +0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, +0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x29, 0x3b, 0x0a, +0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x32, 0x3a, 0x0a, 0x73, +0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, +0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, 0x5f, 0x64, 0x63, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, +0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, +0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, +0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, +0x63, 0x61, 0x73, 0x65, 0x20, 0x33, 0x3a, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, +0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x63, +0x5f, 0x70, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, +0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, +0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x20, 0x29, 0x3b, +0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x34, 0x3a, 0x0a, +0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, +0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x64, 0x64, 0x72, 0x28, 0x20, 0x26, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2c, 0x20, 0x26, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x36, 0x2a, +0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x26, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x38, 0x2a, 0x6c, 0x78, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x5b, 0x6c, 0x78, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x35, 0x3a, +0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x76, 0x72, 0x28, 0x20, 0x26, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2c, 0x20, 0x26, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x36, 0x2a, +0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x26, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x38, 0x2a, 0x6c, 0x78, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x5b, 0x6c, 0x78, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x36, 0x3a, +0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x68, 0x64, 0x28, 0x20, 0x26, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2c, 0x20, 0x26, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x36, 0x2a, +0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x26, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x38, 0x2a, 0x6c, 0x78, 0x5d, +0x2c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x6f, 0x70, 0x5b, 0x6c, 0x78, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, 0x37, 0x3a, +0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, +0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x68, 0x75, 0x28, 0x20, 0x26, 0x63, 0x61, +0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, +0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, +0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2c, 0x20, 0x26, 0x6c, 0x65, 0x66, 0x74, 0x5b, 0x38, 0x2a, +0x6c, 0x78, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x64, 0x65, +0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a, +0x61, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x26, 0x63, 0x6f, 0x73, 0x74, 0x5f, +0x62, 0x75, 0x66, 0x5b, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x29, 0x3b, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x73, 0x77, +0x69, 0x74, 0x63, 0x68, 0x28, 0x20, 0x6c, 0x79, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x63, 0x61, 0x73, +0x65, 0x20, 0x30, 0x3a, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x44, 0x4c, 0x0a, 0x73, 0x61, 0x74, 0x64, +0x20, 0x3d, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, +0x38, 0x78, 0x38, 0x5f, 0x64, 0x64, 0x6c, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, +0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, +0x2a, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, +0x44, 0x45, 0x2c, 0x20, 0x26, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x36, 0x2a, 0x6c, 0x78, 0x5d, 0x20, +0x29, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x26, 0x63, 0x6f, +0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x5b, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x73, 0x61, 0x74, 0x64, +0x20, 0x29, 0x3b, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x63, 0x61, 0x73, 0x65, 0x20, +0x31, 0x3a, 0x20, 0x2f, 0x2f, 0x20, 0x56, 0x4c, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x20, 0x3d, 0x20, +0x78, 0x32, 0x36, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x5f, 0x38, 0x78, 0x38, +0x5f, 0x76, 0x6c, 0x28, 0x20, 0x26, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x42, 0x4c, 0x4f, 0x43, +0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x20, 0x2b, 0x20, 0x38, 0x2a, 0x6c, 0x78, 0x5d, +0x2c, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x2c, 0x20, +0x26, 0x74, 0x6f, 0x70, 0x5b, 0x31, 0x36, 0x2a, 0x6c, 0x78, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x61, +0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x26, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x62, +0x75, 0x66, 0x5b, 0x6c, 0x78, 0x5d, 0x2c, 0x20, 0x73, 0x61, 0x74, 0x64, 0x20, 0x29, 0x3b, 0x0a, +0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3a, 0x0a, +0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x62, 0x61, 0x72, 0x72, 0x69, +0x65, 0x72, 0x28, 0x20, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, +0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x28, +0x30, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x67, 0x78, 0x20, +0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x20, 0x29, 0x0a, 0x66, 0x65, +0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5b, 0x67, 0x69, +0x64, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2b, 0x20, +0x67, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x5b, 0x6c, +0x78, 0x5d, 0x2b, 0x20, 0x35, 0x2a, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x3b, 0x0a, 0x69, 0x66, +0x28, 0x20, 0x67, 0x78, 0x20, 0x3c, 0x20, 0x32, 0x20, 0x26, 0x26, 0x20, 0x67, 0x79, 0x20, 0x3d, +0x3d, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, +0x73, 0x5b, 0x67, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, +0x66, 0x20, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x44, 0x45, 0x0a, 0x23, +0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x4f, 0x46, 0x46, 0x53, +0x45, 0x54, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, +0x65, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x63, 0x6f, 0x73, +0x74, 0x73, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6c, 0x61, +0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, +0x20, 0x5b, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, +0x5d, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, +0x20, 0x73, 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x28, +0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, +0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, +0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, +0x69, 0x6e, 0x76, 0x5f, 0x71, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, +0x72, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x72, 0x6f, +0x77, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, +0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, +0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x73, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, +0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, +0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, +0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, +0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x20, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x67, +0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, +0x30, 0x20, 0x29, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x79, +0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, +0x64, 0x74, 0x68, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5b, +0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x2a, 0x20, 0x69, 0x6e, +0x76, 0x5f, 0x71, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, +0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x2b, 0x20, 0x31, 0x32, 0x38, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x38, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, +0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, 0x62, 0x20, 0x3d, 0x20, 0x28, 0x78, 0x20, 0x3e, 0x20, +0x30, 0x20, 0x26, 0x26, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, +0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x26, 0x26, 0x20, 0x79, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x26, +0x26, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, +0x2d, 0x20, 0x31, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, +0x20, 0x3c, 0x3d, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, +0x68, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x3b, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, +0x64, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x3b, 0x0a, 0x69, +0x66, 0x28, 0x20, 0x62, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, +0x5f, 0x6d, 0x62, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, +0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, +0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x2b, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x71, +0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5b, 0x32, 0x35, 0x36, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, +0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, +0x64, 0x73, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, +0x73, 0x75, 0x6d, 0x28, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, 0x74, 0x64, 0x73, 0x2c, 0x20, +0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, +0x74, 0x5f, 0x65, 0x73, 0x74, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6c, +0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, +0x74, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, +0x63, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x3d, 0x20, 0x70, 0x61, +0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, +0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3d, 0x3d, 0x20, +0x30, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x72, 0x6f, 0x77, 0x5f, 0x73, +0x61, 0x74, 0x64, 0x73, 0x5b, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x61, +0x74, 0x64, 0x73, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x28, +0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2b, 0x20, 0x43, +0x4f, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x54, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x65, 0x73, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x61, +0x64, 0x64, 0x28, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, +0x2b, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x51, 0x2c, 0x20, 0x63, +0x6f, 0x73, 0x74, 0x5f, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x71, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, +0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, +0x6c, 0x20, 0x28, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x29, 0x20, 0x4f, 0x70, +0x65, 0x6e, 0x43, 0x4c, 0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, 0x6d, 0x6f, 0x74, 0x69, +0x6f, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x6c, +0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x77, +0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x28, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, +0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, +0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x2f, 0x2a, 0x20, 0x65, +0x64, 0x67, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, +0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, +0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, +0x6e, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x65, 0x73, 0x74, 0x20, +0x2a, 0x2f, 0x0a, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x78, +0x20, 0x3e, 0x3e, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x78, 0x20, 0x2d, 0x20, 0x28, 0x6d, 0x62, 0x5f, +0x77, 0x69, 0x64, 0x74, 0x68, 0x26, 0x31, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x2c, 0x20, +0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x31, 0x20, +0x29, 0x3b, 0x0a, 0x79, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x20, 0x79, +0x20, 0x3e, 0x3e, 0x20, 0x31, 0x2c, 0x20, 0x28, 0x79, 0x20, 0x2d, 0x20, 0x28, 0x6d, 0x62, 0x5f, +0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x26, 0x31, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x2c, +0x20, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2d, +0x31, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6d, 0x62, 0x5f, +0x77, 0x69, 0x64, 0x74, 0x68, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x79, 0x20, 0x2b, 0x20, +0x78, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x46, 0x6f, 0x75, 0x72, 0x20, 0x74, 0x68, 0x72, +0x65, 0x61, 0x64, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, +0x6e, 0x20, 0x38, 0x78, 0x38, 0x20, 0x53, 0x41, 0x44, 0x2e, 0x20, 0x20, 0x45, 0x61, 0x63, 0x68, +0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x20, 0x2a, +0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, +0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, +0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2c, 0x20, +0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, +0x64, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, +0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x78, 0x2c, +0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, +0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, +0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x64, 0x78, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x3b, +0x0a, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x64, +0x78, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, +0x73, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x2f, 0x2a, 0x20, 0x73, +0x6c, 0x6f, 0x77, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x4d, 0x56, +0x20, 0x67, 0x6f, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, +0x65, 0x64, 0x67, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x50, 0x55, 0x20, 0x63, +0x6c, 0x61, 0x6d, 0x70, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, +0x0a, 0x2a, 0x20, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x28, 0x30, +0x2c, 0x30, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x65, 0x74, 0x20, +0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, +0x20, 0x33, 0x5d, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, +0x75, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x0a, 0x2a, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, +0x61, 0x72, 0x65, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x32, 0x5d, +0x0a, 0x2a, 0x2f, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x32, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, +0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, +0x7b, 0x0a, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, +0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, +0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, +0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x72, 0x65, +0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, +0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, +0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, +0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x63, 0x6f, +0x73, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, +0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, +0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x65, +0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x29, +0x3b, 0x0a, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x29, 0x3b, 0x0a, +0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, +0x66, 0x28, 0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, 0x65, +0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, +0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, +0x32, 0x29, 0x28, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x66, 0x20, +0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, +0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, +0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, +0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x2b, +0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x65, 0x6e, 0x63, 0x2c, +0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, +0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, +0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x30, 0x2c, 0x20, 0x31, +0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, +0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x30, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x29, +0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, +0x69, 0x66, 0x66, 0x28, 0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, +0x0a, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x32, 0x29, 0x28, 0x34, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x72, 0x65, +0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, +0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, +0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, +0x29, 0x28, 0x34, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x73, +0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x65, 0x6e, +0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, +0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x73, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x73, 0x32, 0x20, +0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x73, 0x33, 0x3b, 0x0a, 0x7d, 0x0a, 0x63, 0x6f, +0x73, 0x74, 0x73, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x3b, +0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5b, 0x30, 0x5d, +0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x73, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5b, 0x33, +0x5d, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x4f, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, +0x61, 0x64, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x38, 0x78, 0x38, 0x20, +0x53, 0x41, 0x44, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, +0x78, 0x38, 0x5f, 0x69, 0x69, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, +0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x72, +0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, +0x5f, 0x74, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, +0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x66, 0x72, +0x65, 0x66, 0x70, 0x6f, 0x73, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x2f, 0x2a, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x77, 0x68, 0x65, +0x6e, 0x20, 0x4d, 0x56, 0x20, 0x67, 0x6f, 0x65, 0x73, 0x20, 0x70, 0x61, 0x73, 0x74, 0x20, 0x6c, +0x65, 0x66, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, +0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x38, 0x3b, +0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, +0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, +0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x63, +0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, +0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, +0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x69, 0x6e, +0x74, 0x20, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, +0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, +0x66, 0x66, 0x28, 0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x7d, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x3b, +0x0a, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, +0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x66, 0x6f, 0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, +0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, 0x20, 0x38, 0x3b, 0x20, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x34, +0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, +0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x29, +0x3b, 0x0a, 0x72, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x63, +0x6f, 0x73, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, +0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, +0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2e, 0x73, 0x30, 0x20, +0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2e, 0x73, 0x33, 0x3b, 0x0a, 0x7d, +0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x0a, 0x2a, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, +0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x73, 0x74, 0x69, +0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, +0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x69, 0x73, +0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x4d, 0x42, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, +0x6f, 0x72, 0x6b, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x74, +0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6c, 0x63, 0x6c, 0x78, 0x20, +0x2f, 0x20, 0x34, 0x20, 0x2a, 0x20, 0x6c, 0x63, 0x6c, 0x79, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, +0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x20, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, +0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x34, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, +0x68, 0x74, 0x5d, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, +0x69, 0x64, 0x20, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x5f, +0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, +0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x66, 0x65, 0x6e, +0x63, 0x2c, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x0a, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, +0x32, 0x20, 0x2a, 0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, +0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, +0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x76, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, +0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x6f, 0x75, +0x74, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, +0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x2a, 0x6d, 0x76, 0x70, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x2a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x2a, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, +0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, +0x61, 0x6c, 0x65, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x5f, 0x73, 0x68, 0x69, 0x66, +0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x5f, +0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, +0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, +0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x32, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x6d, +0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, +0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, +0x65, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x69, +0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, +0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x26, 0x20, 0x33, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x62, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, +0x5f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, +0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x3b, 0x0a, 0x63, 0x6f, +0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, +0x3d, 0x20, 0x38, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, +0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x78, 0x2c, 0x20, 0x6d, +0x62, 0x5f, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, +0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x67, 0x65, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x30, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, +0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x2b, 0x3d, +0x20, 0x34, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x3b, +0x0a, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x34, 0x20, +0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x3b, 0x0a, 0x6d, +0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x3d, 0x30, 0x3b, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x21, 0x62, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x69, 0x74, +0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x23, 0x64, 0x65, 0x66, +0x69, 0x6e, 0x65, 0x20, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x44, 0x58, 0x2c, 0x20, 0x44, 0x59, 0x20, +0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, 0x78, 0x20, 0x3d, 0x20, 0x6d, +0x62, 0x5f, 0x78, 0x20, 0x2b, 0x20, 0x44, 0x58, 0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x70, +0x79, 0x20, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x44, 0x59, 0x3b, 0x5c, 0x0a, +0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x5d, +0x20, 0x3d, 0x20, 0x62, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, +0x20, 0x3f, 0x20, 0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x64, +0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x28, 0x20, +0x70, 0x78, 0x2c, 0x20, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, +0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x29, 0x5d, 0x20, 0x3a, +0x20, 0x5c, 0x0a, 0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, +0x74, 0x68, 0x20, 0x2a, 0x20, 0x70, 0x79, 0x20, 0x2b, 0x20, 0x70, 0x78, 0x5d, 0x3b, 0x5c, 0x0a, +0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x5d, +0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x28, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x29, 0x20, 0x73, 0x63, 0x61, +0x6c, 0x65, 0x3b, 0x5c, 0x0a, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x2b, 0x2b, 0x3b, 0x5c, 0x0a, 0x7d, +0x0a, 0x2f, 0x2a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x4d, 0x56, 0x50, 0x20, 0x66, 0x72, 0x6f, +0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x56, 0x43, 0x73, +0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, +0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x2f, 0x2a, 0x20, 0x6f, 0x64, 0x64, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, +0x6e, 0x73, 0x3a, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x20, 0x4d, 0x56, 0x50, 0x20, 0x66, +0x72, 0x6f, 0x6d, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x69, 0x67, +0x68, 0x74, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3c, +0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x29, 0x0a, +0x4d, 0x56, 0x43, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, +0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, +0x74, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x30, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, +0x3e, 0x20, 0x62, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, +0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, +0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x31, +0x2c, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, +0x7b, 0x0a, 0x2f, 0x2a, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, +0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x20, 0x4d, 0x56, 0x50, +0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x75, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x66, +0x74, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x20, +0x30, 0x20, 0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x29, +0x0a, 0x7b, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x3b, +0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x77, +0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, +0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, +0x78, 0x20, 0x3e, 0x20, 0x62, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, +0x78, 0x20, 0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, +0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4d, 0x56, +0x43, 0x0a, 0x6d, 0x76, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x20, 0x3c, +0x3d, 0x20, 0x31, 0x29, 0x20, 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, +0x6e, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x6d, 0x65, 0x64, +0x69, 0x61, 0x6e, 0x5f, 0x6d, 0x76, 0x28, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, +0x31, 0x5d, 0x2c, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, +0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, +0x20, 0x6d, 0x76, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, +0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x61, 0x6e, +0x64, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, +0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x20, 0x20, 0x57, 0x65, +0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x0a, 0x2a, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x67, 0x6f, +0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x72, 0x72, 0x69, 0x76, 0x65, 0x20, 0x61, 0x74, +0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x4d, 0x56, 0x20, 0x61, 0x67, 0x61, +0x69, 0x6e, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, +0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x0a, 0x2a, 0x20, +0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x75, +0x74, 0x70, 0x75, 0x74, 0x2e, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x21, 0x62, 0x5f, +0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6d, +0x76, 0x70, 0x2e, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x76, 0x70, 0x5f, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x2e, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6d, +0x76, 0x70, 0x2e, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x76, 0x70, 0x5f, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x2e, 0x79, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, +0x20, 0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, +0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x7d, 0x0a, 0x6d, 0x76, 0x70, 0x5f, 0x62, 0x75, +0x66, 0x66, 0x65, 0x72, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, +0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, +0x28, 0x6d, 0x76, 0x70, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x6d, 0x76, 0x5f, 0x6d, +0x69, 0x6e, 0x20, 0x3d, 0x20, 0x2d, 0x6d, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, +0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x78, 0x2c, 0x20, 0x6d, 0x62, 0x5f, +0x79, 0x29, 0x20, 0x2d, 0x20, 0x34, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x6d, 0x76, 0x5f, +0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2a, 0x20, +0x28, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, +0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x20, 0x2d, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x78, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x79, +0x29, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x34, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, +0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, +0x6d, 0x76, 0x70, 0x2c, 0x20, 0x6d, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x2c, 0x20, 0x6d, 0x76, 0x5f, +0x6d, 0x61, 0x78, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x72, 0x65, 0x66, 0x63, 0x72, +0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x62, 0x65, 0x73, 0x74, +0x6d, 0x76, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x63, +0x6f, 0x73, 0x74, 0x20, 0x61, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x2a, 0x2f, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x64, +0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, 0x66, +0x65, 0x6e, 0x63, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, +0x2c, 0x20, 0x72, 0x65, 0x66, 0x63, 0x72, 0x64, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x2c, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x29, 0x20, 0x2b, 0x0a, 0x6c, +0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x2a, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x28, +0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, +0x76, 0x2c, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x32, 0x20, 0x2b, +0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x64, 0x6f, 0x0a, 0x7b, 0x0a, +0x2f, 0x2a, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x73, +0x20, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, +0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x2a, 0x2f, 0x0a, 0x72, 0x65, 0x66, 0x63, 0x72, +0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x62, 0x65, 0x73, 0x74, +0x6d, 0x76, 0x20, 0x2b, 0x20, 0x64, 0x69, 0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x5b, 0x6d, 0x62, +0x5f, 0x69, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, +0x3d, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x2b, 0x20, 0x64, 0x69, 0x61, 0x5f, 0x6f, +0x66, 0x66, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, +0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, +0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, +0x72, 0x65, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x66, 0x63, 0x72, 0x64, 0x20, 0x29, 0x20, 0x2b, 0x0a, +0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x2a, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, +0x28, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x74, 0x72, 0x79, 0x6d, +0x76, 0x2c, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x28, 0x32, 0x20, 0x2b, +0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, +0x6f, 0x73, 0x74, 0x3c, 0x3c, 0x32, 0x29, 0x20, 0x7c, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x3b, 0x0a, +0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6d, +0x69, 0x6e, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, +0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x33, 0x5d, +0x20, 0x29, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x28, 0x63, 0x6f, 0x73, +0x74, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, +0x20, 0x29, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, 0x0a, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, +0x20, 0x2b, 0x3d, 0x20, 0x64, 0x69, 0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x5b, 0x63, 0x6f, 0x73, +0x74, 0x26, 0x33, 0x5d, 0x3b, 0x0a, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x3e, 0x3e, 0x32, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, +0x76, 0x2e, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x2e, 0x78, 0x20, +0x7c, 0x7c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x6d, +0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x2e, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, +0x76, 0x2e, 0x79, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x2e, 0x79, 0x20, +0x7c, 0x7c, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x2e, 0x79, 0x20, 0x3c, 0x3d, 0x20, 0x6d, +0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x2e, 0x79, 0x20, 0x29, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3b, +0x0a, 0x7d, 0x0a, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x20, 0x2d, 0x2d, 0x6d, 0x65, 0x5f, 0x72, +0x61, 0x6e, 0x67, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, +0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x69, 0x66, 0x66, +0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x43, 0x4f, +0x53, 0x54, 0x5f, 0x4d, 0x56, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x44, 0x28, 0x20, 0x4c, 0x20, +0x29, 0x5c, 0x0a, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, +0x28, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x2c, 0x20, 0x6d, 0x76, 0x5f, 0x6d, 0x69, 0x6e, 0x2c, +0x20, 0x6d, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x64, 0x69, 0x66, 0x66, +0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x32, 0x5f, +0x73, 0x61, 0x74, 0x28, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x6d, 0x76, +0x70, 0x2c, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, 0x29, 0x29, 0x3b, 0x5c, 0x0a, 0x69, 0x66, +0x28, 0x20, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x78, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, +0x64, 0x69, 0x66, 0x66, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x29, 0x20, 0x7b, 0x5c, 0x0a, +0x69, 0x6e, 0x74, 0x32, 0x20, 0x72, 0x65, 0x66, 0x63, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, +0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x3b, 0x5c, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, +0x5f, 0x69, 0x69, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, +0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x2c, 0x20, 0x72, 0x65, +0x66, 0x63, 0x72, 0x64, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x2c, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x29, 0x20, 0x2b, 0x5c, 0x0a, 0x4c, 0x20, 0x2a, 0x20, +0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, +0x66, 0x28, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x2c, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x29, 0x20, +0x3c, 0x3c, 0x20, 0x28, 0x32, 0x20, 0x2b, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x20, 0x29, +0x3b, 0x5c, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3c, 0x20, 0x62, 0x63, +0x6f, 0x73, 0x74, 0x20, 0x29, 0x20, 0x7b, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x3b, 0x20, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x74, +0x72, 0x79, 0x6d, 0x76, 0x3b, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, +0x56, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x44, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, +0x66, 0x28, 0x20, 0x21, 0x62, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x72, +0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x2f, 0x2a, 0x20, 0x74, 0x72, 0x79, +0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x74, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, +0x73, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x73, 0x20, 0x4d, 0x56, +0x2c, 0x20, 0x69, 0x66, 0x20, 0x4d, 0x56, 0x50, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x6f, +0x20, 0x66, 0x61, 0x72, 0x20, 0x61, 0x77, 0x61, 0x79, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x70, 0x72, 0x65, 0x76, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x62, 0x5f, 0x73, 0x68, 0x69, +0x66, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, +0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x69, 0x6e, 0x5f, 0x6d, +0x76, 0x73, 0x5b, 0x66, 0x69, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, +0x65, 0x5f, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x2c, 0x20, 0x6d, +0x62, 0x5f, 0x79, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x6d, +0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x29, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x63, +0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, +0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x29, 0x3b, 0x0a, +0x70, 0x72, 0x65, 0x76, 0x6d, 0x76, 0x20, 0x3e, 0x3e, 0x3d, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, +0x3b, 0x0a, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x6d, 0x76, +0x3b, 0x0a, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x56, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x44, +0x28, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6f, +0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, +0x3c, 0x20, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, +0x0a, 0x2f, 0x2a, 0x20, 0x74, 0x72, 0x79, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x74, 0x20, +0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x4d, +0x56, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x4d, 0x56, 0x50, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x6f, +0x6f, 0x20, 0x66, 0x61, 0x72, 0x20, 0x61, 0x77, 0x61, 0x79, 0x20, 0x2a, 0x2f, 0x0a, 0x74, 0x72, +0x79, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, +0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x5b, 0x69, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x56, 0x5f, +0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x44, 0x28, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x29, +0x3b, 0x0a, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x20, 0x3d, 0x3d, 0x20, +0x30, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x62, 0x65, 0x73, 0x74, 0x6d, 0x76, 0x20, 0x3c, 0x3c, 0x3d, +0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x76, 0x73, 0x5b, +0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, +0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x62, 0x65, 0x73, 0x74, +0x6d, 0x76, 0x29, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, +0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, +0x62, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, 0x53, 0x5f, 0x43, 0x4f, +0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x7d, 0x0a, 0x2f, +0x2a, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x20, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, +0x73, 0x75, 0x62, 0x70, 0x65, 0x6c, 0x20, 0x52, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x2a, 0x2f, +0x0a, 0x2f, 0x2a, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, +0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x38, 0x78, 0x38, 0x20, 0x53, 0x41, 0x44, +0x2e, 0x20, 0x20, 0x34, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x70, 0x65, 0x72, +0x20, 0x4d, 0x42, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x34, 0x20, 0x44, 0x49, +0x41, 0x20, 0x48, 0x50, 0x45, 0x4c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, +0x72, 0x65, 0x0a, 0x2a, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, +0x73, 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x20, 0x2a, +0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, +0x5f, 0x68, 0x70, 0x65, 0x6c, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, +0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, +0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x72, +0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, +0x5f, 0x74, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, +0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, +0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x71, 0x70, 0x6f, +0x73, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, +0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x78, 0x20, +0x26, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, +0x6f, 0x73, 0x2e, 0x79, 0x20, 0x26, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, +0x20, 0x68, 0x70, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x78, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, +0x20, 0x63, 0x6f, 0x73, 0x74, 0x34, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, 0x72, 0x28, +0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, 0x3c, 0x20, +0x38, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, +0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x34, 0x3b, 0x0a, 0x65, 0x6e, 0x63, 0x20, +0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, +0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, +0x30, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, +0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x30, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, 0x73, +0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x29, +0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, 0x31, +0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, +0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, +0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x31, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, +0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, +0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, +0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, +0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x32, 0x2c, 0x20, 0x79, 0x29, 0x29, +0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, +0x74, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, +0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x33, 0x2c, 0x20, 0x79, 0x29, +0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, +0x66, 0x74, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, +0x34, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x65, +0x6e, 0x63, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x34, 0x20, 0x29, 0x3b, 0x0a, 0x65, 0x6e, 0x63, 0x20, +0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, +0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, +0x34, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, 0x30, 0x20, +0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, +0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, +0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, 0x2b, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x34, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, 0x73, +0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x29, +0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, 0x31, +0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, +0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, +0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, 0x20, +0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x35, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, +0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, +0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, 0x73, +0x32, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, +0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, 0x73, +0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x36, 0x2c, 0x20, 0x79, 0x29, 0x29, +0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, +0x74, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x76, 0x61, 0x6c, 0x34, 0x2e, +0x73, 0x33, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, +0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x70, 0x6f, +0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x37, 0x2c, 0x20, 0x79, 0x29, +0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, +0x66, 0x74, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, +0x34, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x65, +0x6e, 0x63, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x34, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x72, 0x65, +0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x34, 0x2e, 0x73, 0x30, 0x20, 0x2b, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x34, 0x2e, 0x73, 0x31, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x34, +0x2e, 0x73, 0x32, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x34, 0x2e, 0x73, 0x33, 0x3b, 0x0a, +0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x4f, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, +0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x20, 0x38, 0x78, 0x38, 0x20, 0x53, 0x41, 0x44, +0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x51, 0x50, 0x45, 0x4c, 0x20, +0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x48, +0x50, 0x45, 0x4c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, 0x71, 0x70, 0x65, 0x6c, +0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, +0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, +0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x72, +0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, +0x71, 0x70, 0x6f, 0x73, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, +0x65, 0x66, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x3e, 0x3e, +0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x41, 0x20, 0x3d, 0x20, +0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x78, 0x20, 0x26, 0x20, 0x32, 0x29, 0x20, 0x3e, 0x3e, +0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x26, 0x20, +0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x3d, +0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x26, +0x20, 0x31, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x31, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, +0x66, 0x72, 0x65, 0x66, 0x42, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x42, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x42, +0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x42, 0x2e, 0x78, 0x20, 0x26, 0x20, 0x32, +0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x42, +0x2e, 0x79, 0x20, 0x26, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, +0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, +0x68, 0x70, 0x65, 0x6c, 0x41, 0x2c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, +0x74, 0x31, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x42, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x66, 0x6f, +0x72, 0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x79, 0x20, +0x3c, 0x20, 0x38, 0x3b, 0x20, 0x79, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x66, 0x6f, 0x72, +0x28, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x78, 0x20, 0x3c, +0x20, 0x38, 0x3b, 0x20, 0x78, 0x2b, 0x2b, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x75, 0x69, 0x6e, 0x74, +0x20, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, +0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, 0x73, 0x30, 0x3b, 0x0a, +0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, +0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, +0x72, 0x65, 0x66, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, +0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, 0x20, 0x6d, 0x61, +0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x46, +0x46, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, +0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, +0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, +0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x42, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, +0x74, 0x32, 0x29, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, +0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x31, 0x29, 0x20, 0x26, 0x20, +0x30, 0x78, 0x46, 0x46, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, +0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x72, 0x68, 0x61, +0x64, 0x64, 0x28, 0x20, 0x76, 0x41, 0x2c, 0x20, 0x76, 0x42, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, +0x7d, 0x0a, 0x7d, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x3b, +0x0a, 0x7d, 0x0a, 0x2f, 0x2a, 0x20, 0x46, 0x6f, 0x75, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, +0x64, 0x73, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x38, 0x78, 0x38, 0x20, 0x53, +0x41, 0x54, 0x44, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x51, 0x50, +0x45, 0x4c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, +0x6e, 0x20, 0x48, 0x50, 0x45, 0x4c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x0a, 0x2a, 0x0a, 0x2a, +0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, 0x6f, 0x6c, +0x6c, 0x65, 0x63, 0x74, 0x73, 0x20, 0x31, 0x2f, 0x34, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, +0x20, 0x72, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x73, 0x20, 0x61, +0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x65, +0x20, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x0a, 0x2a, 0x20, 0x74, 0x68, +0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x0a, 0x2a, 0x2f, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, +0x71, 0x70, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, +0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, +0x6f, 0x73, 0x2c, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, +0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x2c, 0x0a, +0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x2a, 0x74, 0x6d, +0x70, 0x70, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x78, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, +0x75, 0x6d, 0x32, 0x5f, 0x74, 0x28, 0x20, 0x2a, 0x74, 0x6d, 0x70, 0x20, 0x29, 0x5b, 0x34, 0x5d, +0x20, 0x3d, 0x20, 0x28, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x28, 0x20, 0x2a, 0x20, 0x29, 0x5b, 0x34, +0x5d, 0x29, 0x74, 0x6d, 0x70, 0x70, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x62, +0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x62, 0x33, 0x3b, 0x0a, 0x69, +0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x71, +0x70, 0x6f, 0x73, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x70, +0x65, 0x6c, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x78, 0x26, 0x32, +0x29, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x26, +0x32, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x3d, +0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x28, +0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x78, 0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, 0x29, 0x2c, 0x20, +0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x26, 0x31, 0x29, 0x3c, 0x3c, 0x31, 0x29, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x66, 0x72, 0x65, 0x66, 0x42, 0x70, 0x6f, 0x73, 0x20, +0x3d, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x42, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x6e, +0x74, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x71, 0x70, 0x6f, 0x73, +0x42, 0x2e, 0x78, 0x26, 0x32, 0x29, 0x3e, 0x3e, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x71, 0x70, +0x6f, 0x73, 0x42, 0x2e, 0x79, 0x26, 0x32, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, +0x20, 0x68, 0x70, 0x65, 0x6c, 0x41, 0x2c, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, +0x66, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x38, 0x20, 0x2a, 0x20, 0x68, 0x70, 0x65, 0x6c, 0x42, 0x3b, +0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x41, 0x2c, 0x20, 0x76, 0x42, 0x3b, 0x0a, 0x75, 0x69, +0x6e, 0x74, 0x20, 0x61, 0x30, 0x2c, 0x20, 0x61, 0x31, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, +0x65, 0x6e, 0x63, 0x3b, 0x0a, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x73, 0x75, 0x6d, 0x20, +0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x52, 0x45, 0x41, +0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x28, 0x20, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x58, 0x20, 0x29, +0x5c, 0x0a, 0x65, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, +0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, +0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x29, 0x2e, +0x73, 0x30, 0x3b, 0x5c, 0x0a, 0x76, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, +0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x66, +0x72, 0x65, 0x66, 0x41, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, +0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x20, 0x3e, 0x3e, +0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x30, 0x29, 0x20, 0x26, 0x20, +0x30, 0x78, 0x46, 0x46, 0x3b, 0x5c, 0x0a, 0x76, 0x42, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, 0x61, +0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, +0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, +0x20, 0x66, 0x72, 0x65, 0x66, 0x42, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x28, 0x69, 0x6e, 0x74, +0x32, 0x29, 0x28, 0x58, 0x2c, 0x20, 0x69, 0x64, 0x78, 0x29, 0x20, 0x29, 0x2e, 0x73, 0x30, 0x20, +0x3e, 0x3e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x31, 0x29, 0x20, +0x26, 0x20, 0x30, 0x78, 0x46, 0x46, 0x3b, 0x5c, 0x0a, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x65, +0x6e, 0x63, 0x20, 0x2d, 0x20, 0x72, 0x68, 0x61, 0x64, 0x64, 0x28, 0x20, 0x76, 0x41, 0x2c, 0x20, +0x76, 0x42, 0x20, 0x29, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x52, 0x45, +0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x4f, 0x55, 0x54, 0x2c, +0x20, 0x61, 0x2c, 0x20, 0x62, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, +0x5f, 0x44, 0x49, 0x46, 0x46, 0x28, 0x20, 0x61, 0x30, 0x2c, 0x20, 0x61, 0x20, 0x29, 0x3b, 0x5c, +0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x28, 0x20, 0x61, 0x31, 0x2c, 0x20, +0x62, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x4f, 0x55, 0x54, 0x20, 0x3d, 0x20, 0x61, 0x30, 0x20, 0x2b, +0x20, 0x28, 0x61, 0x31, 0x3c, 0x3c, 0x42, 0x49, 0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, +0x55, 0x4d, 0x29, 0x3b, 0x5c, 0x0a, 0x7d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, +0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x61, 0x2c, +0x20, 0x62, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, 0x0a, 0x66, 0x65, 0x6e, 0x63, 0x70, 0x6f, 0x73, +0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x3b, 0x5c, 0x0a, 0x66, 0x72, 0x65, 0x66, 0x41, 0x70, +0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x5c, 0x0a, 0x66, 0x72, 0x65, 0x66, +0x42, 0x70, 0x6f, 0x73, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x3b, 0x5c, 0x0a, 0x52, 0x45, +0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, 0x30, 0x2c, 0x20, +0x30, 0x2c, 0x20, 0x34, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, +0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x35, 0x20, +0x29, 0x3b, 0x5c, 0x0a, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, +0x28, 0x20, 0x62, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x36, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x52, +0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x28, 0x20, 0x62, 0x33, 0x2c, +0x20, 0x33, 0x2c, 0x20, 0x37, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, 0x4d, 0x41, +0x52, 0x44, 0x34, 0x28, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, 0x30, 0x5d, +0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, +0x6d, 0x70, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, +0x69, 0x64, 0x78, 0x5d, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x62, 0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, +0x20, 0x62, 0x32, 0x2c, 0x20, 0x62, 0x33, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x48, 0x41, 0x44, 0x41, +0x4d, 0x41, 0x52, 0x44, 0x34, 0x28, 0x20, 0x62, 0x30, 0x2c, 0x20, 0x62, 0x31, 0x2c, 0x20, 0x62, +0x32, 0x2c, 0x20, 0x62, 0x33, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x30, 0x5d, 0x5b, 0x69, 0x64, +0x78, 0x5d, 0x2c, 0x20, 0x74, 0x6d, 0x70, 0x5b, 0x31, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x2c, +0x20, 0x74, 0x6d, 0x70, 0x5b, 0x32, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x2c, 0x20, 0x74, 0x6d, +0x70, 0x5b, 0x33, 0x5d, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x73, 0x75, +0x6d, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x62, 0x30, 0x20, 0x29, 0x20, +0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, 0x28, 0x20, 0x62, 0x31, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x61, +0x62, 0x73, 0x32, 0x28, 0x20, 0x62, 0x32, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x62, 0x73, 0x32, +0x28, 0x20, 0x62, 0x33, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x7d, 0x0a, 0x52, 0x4f, 0x57, 0x5f, 0x38, +0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, +0x0a, 0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x28, 0x20, 0x34, +0x2c, 0x20, 0x34, 0x20, 0x29, 0x3b, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x52, 0x45, +0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x0a, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x52, +0x45, 0x41, 0x44, 0x5f, 0x44, 0x49, 0x46, 0x46, 0x5f, 0x45, 0x58, 0x0a, 0x23, 0x75, 0x6e, 0x64, +0x65, 0x66, 0x20, 0x52, 0x4f, 0x57, 0x5f, 0x38, 0x78, 0x34, 0x5f, 0x53, 0x41, 0x54, 0x44, 0x0a, +0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x28, 0x28, 0x73, 0x75, 0x6d, 0x5f, 0x74, 0x29, +0x73, 0x75, 0x6d, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x3e, 0x3e, 0x42, 0x49, 0x54, +0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x29, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x31, +0x3b, 0x0a, 0x7d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x68, 0x70, 0x6f, 0x66, 0x66, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x0a, 0x7b, 0x0a, +0x7b, 0x30, 0x2c, 0x20, 0x2d, 0x32, 0x7d, 0x2c, 0x20, 0x7b, 0x2d, 0x32, 0x2c, 0x20, 0x30, 0x7d, +0x2c, 0x20, 0x7b, 0x32, 0x2c, 0x20, 0x30, 0x7d, 0x2c, 0x20, 0x7b, 0x30, 0x2c, 0x20, 0x32, 0x7d, +0x0a, 0x7d, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x73, 0x75, 0x62, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, +0x20, 0x72, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, +0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x6f, +0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x4d, 0x56, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, +0x6f, 0x6d, 0x0a, 0x2a, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x62, +0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x61, +0x6c, 0x20, 0x70, 0x65, 0x72, 0x2d, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, +0x65, 0x72, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x6c, 0x61, +0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, +0x20, 0x20, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x34, 0x2c, +0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5d, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, +0x57, 0x69, 0x74, 0x68, 0x20, 0x58, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, +0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x31, 0x36, 0x78, 0x31, 0x36, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x46, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, +0x6f, 0x77, 0x72, 0x65, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, +0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x2a, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, +0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x20, 0x20, 0x57, 0x65, 0x20, 0x77, 0x69, 0x6c, +0x6c, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, +0x65, 0x20, 0x48, 0x20, 0x56, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x73, 0x20, 0x28, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, +0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x2a, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x29, +0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x61, 0x74, 0x20, 0x68, 0x61, +0x6c, 0x66, 0x2d, 0x70, 0x65, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, +0x73, 0x2e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, +0x20, 0x58, 0x0a, 0x2a, 0x20, 0x20, 0x46, 0x20, 0x48, 0x20, 0x46, 0x20, 0x48, 0x20, 0x46, 0x0a, +0x2a, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x0a, 0x2a, 0x20, +0x20, 0x56, 0x20, 0x43, 0x20, 0x56, 0x20, 0x43, 0x20, 0x56, 0x0a, 0x2a, 0x20, 0x58, 0x20, 0x58, +0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x0a, 0x2a, 0x20, 0x20, 0x46, 0x20, 0x48, 0x20, +0x46, 0x20, 0x48, 0x20, 0x46, 0x0a, 0x2a, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, 0x58, 0x20, +0x58, 0x20, 0x58, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x59, 0x58, 0x20, 0x48, +0x50, 0x45, 0x4c, 0x20, 0x62, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, +0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x65, +0x6c, 0x65, 0x63, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, +0x77, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x69, 0x6e, 0x2e, 0x20, 0x20, 0x54, +0x68, 0x65, 0x0a, 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, +0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, +0x68, 0x65, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x20, 0x32, +0x44, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x20, +0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x2a, 0x20, 0x72, +0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x3a, 0x20, 0x20, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x46, 0x2c, +0x20, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x48, 0x2c, 0x20, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x56, 0x2c, +0x20, 0x73, 0x33, 0x20, 0x3d, 0x20, 0x43, 0x20, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, +0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x75, 0x62, 0x70, 0x65, 0x6c, 0x5f, 0x72, 0x65, +0x66, 0x69, 0x6e, 0x65, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, +0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x2c, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, +0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, +0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x2a, 0x69, 0x6e, 0x5f, 0x6d, 0x76, +0x73, 0x2c, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, +0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x2a, 0x69, 0x6e, 0x5f, 0x73, 0x61, 0x64, 0x5f, +0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, +0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, +0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x73, 0x75, 0x6d, 0x32, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x2a, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x6c, 0x6f, +0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x2a, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x0a, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, +0x5f, 0x6d, 0x76, 0x2c, 0x0a, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x31, +0x36, 0x5f, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x65, 0x6e, 0x63, 0x5f, +0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, +0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x2c, 0x0a, 0x69, +0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, +0x66, 0x2c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x5f, 0x69, 0x73, 0x6c, 0x69, 0x73, +0x74, 0x31, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, +0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, +0x20, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, +0x62, 0x5f, 0x78, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, +0x29, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, +0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, +0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, +0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x26, 0x20, +0x33, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, +0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x62, +0x5f, 0x79, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2b, 0x20, +0x6d, 0x62, 0x5f, 0x78, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, +0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, +0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, +0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x2a, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x6d, +0x61, 0x6e, 0x79, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x6f, 0x72, 0x74, 0x68, +0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, +0x72, 0x73, 0x2e, 0x20, 0x20, 0x57, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x66, +0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, +0x72, 0x65, 0x63, 0x74, 0x0a, 0x2a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, +0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x27, 0x73, +0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6b, +0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, +0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, +0x0a, 0x2a, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, +0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, +0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, +0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x31, 0x20, 0x6f, 0x72, 0x20, +0x6c, 0x69, 0x73, 0x74, 0x30, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x20, 0x20, 0x43, 0x50, 0x55, 0x20, +0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x66, 0x65, 0x6e, 0x63, +0x2d, 0x3e, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x30, 0x5d, 0x5b, +0x62, 0x20, 0x2d, 0x20, 0x70, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x0a, 0x2a, 0x20, 0x20, 0x20, +0x47, 0x50, 0x55, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x3a, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x73, 0x5b, +0x28, 0x62, 0x20, 0x2d, 0x20, 0x70, 0x30, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, +0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x65, 0x6e, 0x63, +0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x20, 0x2b, 0x3d, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x28, 0x62, 0x5f, 0x69, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x31, 0x20, 0x3f, +0x20, 0x28, 0x72, 0x65, 0x66, 0x2d, 0x62, 0x2d, 0x31, 0x29, 0x20, 0x3a, 0x20, 0x28, 0x62, 0x2d, +0x72, 0x65, 0x66, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, +0x74, 0x68, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0a, +0x66, 0x65, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, +0x6f, 0x73, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x62, 0x5f, 0x69, 0x73, 0x6c, 0x69, 0x73, +0x74, 0x31, 0x20, 0x3f, 0x20, 0x28, 0x72, 0x65, 0x66, 0x2d, 0x62, 0x2d, 0x31, 0x29, 0x20, 0x3a, +0x20, 0x28, 0x62, 0x2d, 0x72, 0x65, 0x66, 0x2d, 0x31, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x62, +0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x6d, 0x62, 0x5f, 0x68, 0x65, 0x69, 0x67, +0x68, 0x74, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x70, 0x6f, +0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, +0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, +0x27, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x6d, +0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x20, 0x2a, +0x20, 0x28, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, +0x28, 0x20, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x67, +0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, +0x20, 0x3e, 0x3e, 0x20, 0x32, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, +0x70, 0x20, 0x2a, 0x20, 0x34, 0x3b, 0x0a, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, +0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, +0x20, 0x2a, 0x20, 0x31, 0x36, 0x3b, 0x0a, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x20, 0x2b, 0x3d, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, +0x2a, 0x20, 0x34, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x20, 0x3d, +0x20, 0x30, 0x3b, 0x0a, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x30, 0x5d, +0x20, 0x3d, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, 0x20, +0x3d, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x20, 0x3d, +0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, +0x30, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4d, 0x56, 0x43, 0x28, 0x20, +0x44, 0x58, 0x2c, 0x20, 0x44, 0x59, 0x20, 0x29, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x5b, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x2b, 0x2b, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x6e, +0x5f, 0x6d, 0x76, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, +0x28, 0x6d, 0x62, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x44, 0x59, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x6d, +0x62, 0x5f, 0x78, 0x20, 0x2b, 0x20, 0x44, 0x58, 0x29, 0x5d, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, +0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, +0x2d, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, +0x79, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x30, +0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, +0x20, 0x3c, 0x20, 0x6d, 0x62, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, +0x29, 0x0a, 0x4d, 0x56, 0x43, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x3b, 0x0a, +0x69, 0x66, 0x28, 0x20, 0x6d, 0x62, 0x5f, 0x78, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x29, 0x0a, 0x4d, +0x56, 0x43, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, +0x23, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x4d, 0x56, 0x43, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, +0x6d, 0x76, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x5f, 0x6d, 0x76, 0x63, 0x20, 0x3c, 0x3d, 0x20, +0x31, 0x29, 0x20, 0x3f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x74, +0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, +0x30, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x78, 0x32, 0x36, 0x34, 0x5f, 0x6d, 0x65, 0x64, 0x69, 0x61, +0x6e, 0x5f, 0x6d, 0x76, 0x28, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, +0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, +0x2c, 0x20, 0x6d, 0x76, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x20, 0x29, +0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x20, 0x69, +0x6e, 0x5f, 0x73, 0x61, 0x64, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5b, 0x6d, +0x62, 0x5f, 0x78, 0x79, 0x5d, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x63, 0x6f, 0x6f, 0x72, +0x64, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x6d, 0x62, 0x5f, 0x78, 0x2c, +0x20, 0x6d, 0x62, 0x5f, 0x79, 0x29, 0x20, 0x3c, 0x3c, 0x20, 0x33, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x32, 0x20, 0x62, 0x6d, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, +0x69, 0x6e, 0x74, 0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x20, 0x69, 0x6e, 0x5f, 0x6d, 0x76, 0x73, +0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x2f, 0x2a, 0x20, 0x4d, 0x61, +0x6b, 0x65, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6d, 0x76, 0x20, 0x51, +0x50, 0x45, 0x4c, 0x20, 0x4d, 0x56, 0x20, 0x2a, 0x2f, 0x0a, 0x6d, 0x76, 0x70, 0x20, 0x3c, 0x3c, +0x3d, 0x20, 0x32, 0x3b, 0x20, 0x62, 0x6d, 0x76, 0x20, 0x3c, 0x3c, 0x3d, 0x20, 0x32, 0x3b, 0x0a, +0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x50, 0x45, 0x4c, 0x5f, 0x51, 0x50, 0x45, +0x4c, 0x28, 0x20, 0x41, 0x52, 0x52, 0x2c, 0x20, 0x46, 0x55, 0x4e, 0x43, 0x20, 0x29, 0x5c, 0x0a, +0x7b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x20, 0x3d, 0x20, +0x62, 0x6d, 0x76, 0x20, 0x2b, 0x20, 0x41, 0x52, 0x52, 0x5b, 0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x3b, +0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x63, +0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, 0x74, 0x72, 0x79, +0x6d, 0x76, 0x3b, 0x5c, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, +0x46, 0x55, 0x4e, 0x43, 0x28, 0x20, 0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, +0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, +0x71, 0x70, 0x6f, 0x73, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, +0x2a, 0x20, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, +0x69, 0x66, 0x66, 0x28, 0x20, 0x74, 0x72, 0x79, 0x6d, 0x76, 0x2c, 0x20, 0x6d, 0x76, 0x70, 0x20, +0x29, 0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, +0x5b, 0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x73, 0x74, 0x3c, 0x3c, +0x32, 0x29, 0x20, 0x2b, 0x20, 0x6d, 0x62, 0x5f, 0x69, 0x3b, 0x5c, 0x0a, 0x63, 0x6f, 0x73, 0x74, +0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, +0x61, 0x6c, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, +0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x63, +0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x20, 0x29, +0x20, 0x29, 0x3b, 0x5c, 0x0a, 0x69, 0x66, 0x28, 0x20, 0x28, 0x63, 0x6f, 0x73, 0x74, 0x3e, 0x3e, +0x32, 0x29, 0x20, 0x3c, 0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x29, 0x5c, 0x0a, 0x7b, 0x5c, +0x0a, 0x62, 0x6d, 0x76, 0x20, 0x2b, 0x3d, 0x20, 0x41, 0x52, 0x52, 0x5b, 0x63, 0x6f, 0x73, 0x74, +0x26, 0x33, 0x5d, 0x3b, 0x5c, 0x0a, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, +0x73, 0x74, 0x3e, 0x3e, 0x32, 0x3b, 0x5c, 0x0a, 0x7d, 0x5c, 0x0a, 0x7d, 0x0a, 0x48, 0x50, 0x45, +0x4c, 0x5f, 0x51, 0x50, 0x45, 0x4c, 0x28, 0x20, 0x68, 0x70, 0x6f, 0x66, 0x66, 0x73, 0x2c, 0x20, +0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, 0x69, 0x69, 0x5f, 0x68, 0x70, 0x65, 0x6c, 0x20, +0x29, 0x3b, 0x0a, 0x48, 0x50, 0x45, 0x4c, 0x5f, 0x51, 0x50, 0x45, 0x4c, 0x28, 0x20, 0x64, 0x69, +0x61, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x64, 0x5f, 0x38, 0x78, 0x38, 0x5f, +0x69, 0x69, 0x5f, 0x71, 0x70, 0x65, 0x6c, 0x20, 0x29, 0x3b, 0x0a, 0x66, 0x65, 0x6e, 0x63, 0x5f, +0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, +0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, +0x32, 0x5f, 0x73, 0x61, 0x74, 0x28, 0x20, 0x62, 0x6d, 0x76, 0x20, 0x29, 0x3b, 0x0a, 0x2f, 0x2a, +0x20, 0x72, 0x65, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, +0x6f, 0x66, 0x20, 0x62, 0x6d, 0x76, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x41, 0x54, +0x44, 0x20, 0x2a, 0x2f, 0x0a, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x20, 0x3d, +0x20, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3c, 0x3c, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, +0x62, 0x6d, 0x76, 0x3b, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, +0x6d, 0x62, 0x5f, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x64, 0x5f, 0x38, 0x78, 0x38, +0x5f, 0x69, 0x69, 0x5f, 0x71, 0x70, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6f, 0x70, 0x34, 0x28, 0x20, +0x66, 0x65, 0x6e, 0x63, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, +0x66, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x71, 0x70, 0x6f, 0x73, 0x2c, 0x20, +0x73, 0x61, 0x74, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x62, 0x5f, 0x69, +0x20, 0x29, 0x3b, 0x0a, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x73, 0x74, +0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x62, 0x63, 0x6f, 0x73, 0x74, +0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x20, 0x2a, 0x20, 0x6d, 0x76, 0x5f, +0x63, 0x6f, 0x73, 0x74, 0x28, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x28, 0x20, +0x62, 0x6d, 0x76, 0x2c, 0x20, 0x6d, 0x76, 0x70, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x66, 0x65, +0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x72, 0x65, 0x73, 0x5f, 0x6d, 0x76, 0x5f, 0x63, 0x6f, 0x73, +0x74, 0x73, 0x5b, 0x6d, 0x62, 0x5f, 0x78, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x28, +0x20, 0x62, 0x63, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x4c, 0x4f, 0x57, 0x52, 0x45, 0x53, 0x5f, 0x43, +0x4f, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, +0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, +0x61, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, +0x61, 0x72, 0x79, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, +0x72, 0x2e, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, +0x20, 0x69, 0x73, 0x20, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x63, +0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, +0x2e, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, 0x69, 0x6d, +0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x78, +0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x70, 0x69, 0x78, 0x65, +0x6c, 0x73, 0x29, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, +0x69, 0x64, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, +0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, +0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x69, 0x6e, +0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, +0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x6f, 0x75, 0x74, +0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x66, +0x73, 0x65, 0x74, 0x2c, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, +0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x20, 0x29, 0x0a, 0x7b, 0x0a, +0x69, 0x6e, 0x74, 0x20, 0x67, 0x78, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, +0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, +0x20, 0x67, 0x79, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, +0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, 0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, +0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, +0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x3b, 0x0a, 0x69, 0x6e, 0x70, +0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, +0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, +0x28, 0x67, 0x78, 0x2c, 0x20, 0x67, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, +0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, +0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x28, 0x20, 0x28, 0x28, +0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x29, 0x20, 0x2a, +0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, +0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x29, 0x29, +0x20, 0x29, 0x3b, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, +0x69, 0x28, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, 0x20, 0x28, 0x69, +0x6e, 0x74, 0x32, 0x29, 0x28, 0x67, 0x78, 0x2c, 0x20, 0x67, 0x79, 0x29, 0x2c, 0x20, 0x6f, 0x75, +0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x2f, 0x2a, +0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, +0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x2d, 0x70, 0x65, 0x6c, +0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6d, +0x61, 0x67, 0x65, 0x0a, 0x2a, 0x0a, 0x2a, 0x20, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x20, 0x64, +0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, +0x20, 0x78, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x70, 0x69, +0x78, 0x65, 0x6c, 0x73, 0x29, 0x0a, 0x2a, 0x2f, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, +0x76, 0x6f, 0x69, 0x64, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, 0x5f, 0x68, 0x70, 0x65, +0x6c, 0x28, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, +0x67, 0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, +0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6d, 0x61, 0x67, +0x65, 0x32, 0x64, 0x5f, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, +0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x0a, 0x75, 0x69, +0x6e, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x64, +0x65, 0x6e, 0x6f, 0x6d, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x78, 0x20, +0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, +0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x67, 0x79, 0x20, 0x3d, 0x20, 0x67, +0x65, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x20, 0x31, 0x20, +0x29, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, +0x6c, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, +0x61, 0x6c, 0x3b, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, +0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x69, 0x6e, +0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, +0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x67, 0x78, 0x2c, 0x20, 0x67, 0x79, 0x29, 0x29, +0x2e, 0x73, 0x30, 0x3b, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x3b, +0x0a, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, +0x5f, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x66, 0x66, 0x3b, 0x20, 0x74, +0x65, 0x6d, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, +0x76, 0x61, 0x6c, 0x20, 0x3e, 0x3e, 0x20, 0x38, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, +0x66, 0x66, 0x3b, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x32, 0x20, 0x3d, 0x20, 0x28, 0x69, +0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3e, 0x3e, 0x20, 0x31, 0x36, 0x29, 0x20, +0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x66, 0x66, 0x3b, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, +0x33, 0x20, 0x3d, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3e, +0x3e, 0x20, 0x32, 0x34, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x66, 0x66, 0x3b, 0x0a, +0x74, 0x65, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x6f, +0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x20, 0x28, 0x20, 0x28, 0x28, 0x75, +0x69, 0x6e, 0x74, 0x34, 0x29, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x29, 0x29, 0x20, 0x2a, 0x20, +0x74, 0x65, 0x6d, 0x70, 0x20, 0x29, 0x20, 0x3e, 0x3e, 0x20, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, +0x34, 0x29, 0x28, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x29, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x6f, 0x75, +0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x2e, +0x73, 0x30, 0x20, 0x7c, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x31, 0x20, 0x3c, 0x3c, +0x20, 0x38, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x32, 0x20, 0x3c, +0x3c, 0x20, 0x31, 0x36, 0x29, 0x20, 0x7c, 0x20, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x2e, 0x73, 0x33, +0x20, 0x3c, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x3b, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x69, +0x6d, 0x61, 0x67, 0x65, 0x75, 0x69, 0x28, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, +0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x32, 0x29, 0x28, 0x67, 0x78, 0x2c, 0x20, 0x67, 0x79, +0x29, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x29, 0x3b, +0x0a, 0x7d, 0x0a, +0x00 }; +static const char x264_opencl_source_hash[] = { +0x66, 0x34, 0x62, 0x36, 0x63, 0x32, 0x39, 0x63, 0x61, 0x32, 0x34, 0x38, 0x38, 0x35, 0x38, 0x62, +0x62, 0x37, 0x31, 0x37, 0x37, 0x65, 0x36, 0x34, 0x36, 0x39, 0x34, 0x65, 0x34, 0x32, 0x61, 0x38, +0x00 }; diff --git a/repo/media/x264.xibuild b/repo/media/x264/x264.xibuild index 5c1d375..5c1d375 100644 --- a/repo/media/x264.xibuild +++ b/repo/media/x264/x264.xibuild diff --git a/repo/media/x265.xibuild b/repo/media/x265/x265.xibuild index 69bd3e2..69bd3e2 100644 --- a/repo/media/x265.xibuild +++ b/repo/media/x265/x265.xibuild diff --git a/repo/media/xvidcore.xibuild b/repo/media/xvidcore/xvidcore.xibuild index 6ffce5a..6ffce5a 100644 --- a/repo/media/xvidcore.xibuild +++ b/repo/media/xvidcore/xvidcore.xibuild diff --git a/repo/meta/all.xibuild b/repo/meta/all/all.xibuild index 286a254..286a254 100644 --- a/repo/meta/all.xibuild +++ b/repo/meta/all/all.xibuild diff --git a/repo/meta/base-build.xibuild b/repo/meta/base-build/base-build.xibuild index dfe8ac1..dfe8ac1 100644 --- a/repo/meta/base-build.xibuild +++ b/repo/meta/base-build/base-build.xibuild diff --git a/repo/meta/base-fonts.xibuild b/repo/meta/base-fonts/base-fonts.xibuild index 79285dc..79285dc 100644 --- a/repo/meta/base-fonts.xibuild +++ b/repo/meta/base-fonts/base-fonts.xibuild diff --git a/repo/meta/base-xorg.xibuild b/repo/meta/base-xorg/base-xorg.xibuild index 1a75d53..1a75d53 100644 --- a/repo/meta/base-xorg.xibuild +++ b/repo/meta/base-xorg/base-xorg.xibuild diff --git a/repo/meta/base.xibuild b/repo/meta/base/base.xibuild index d773e40..d773e40 100644 --- a/repo/meta/base.xibuild +++ b/repo/meta/base/base.xibuild diff --git a/repo/meta/repo-apps.xibuild b/repo/meta/repo-apps/repo-apps.xibuild index 08bd151..08bd151 100644 --- a/repo/meta/repo-apps.xibuild +++ b/repo/meta/repo-apps/repo-apps.xibuild diff --git a/repo/meta/repo-devel.xibuild b/repo/meta/repo-devel/repo-devel.xibuild index 01a0c6c..01a0c6c 100644 --- a/repo/meta/repo-devel.xibuild +++ b/repo/meta/repo-devel/repo-devel.xibuild diff --git a/repo/meta/repo-font.xibuild b/repo/meta/repo-font/repo-font.xibuild index 89a90f1..89a90f1 100644 --- a/repo/meta/repo-font.xibuild +++ b/repo/meta/repo-font/repo-font.xibuild diff --git a/repo/meta/repo-linux.xibuild b/repo/meta/repo-linux/repo-linux.xibuild index d4ab3e0..d4ab3e0 100644 --- a/repo/meta/repo-linux.xibuild +++ b/repo/meta/repo-linux/repo-linux.xibuild diff --git a/repo/meta/repo-media.xibuild b/repo/meta/repo-media/repo-media.xibuild index a2aec98..a2aec98 100644 --- a/repo/meta/repo-media.xibuild +++ b/repo/meta/repo-media/repo-media.xibuild diff --git a/repo/meta/repo-python.xibuild b/repo/meta/repo-python/repo-python.xibuild index a06b208..a06b208 100644 --- a/repo/meta/repo-python.xibuild +++ b/repo/meta/repo-python/repo-python.xibuild diff --git a/repo/meta/repo-system.xibuild b/repo/meta/repo-system/repo-system.xibuild index 37ef7ae..37ef7ae 100644 --- a/repo/meta/repo-system.xibuild +++ b/repo/meta/repo-system/repo-system.xibuild diff --git a/repo/meta/repo-util.xibuild b/repo/meta/repo-util/repo-util.xibuild index 6cc0a60..6cc0a60 100644 --- a/repo/meta/repo-util.xibuild +++ b/repo/meta/repo-util/repo-util.xibuild diff --git a/repo/meta/repo-x11.xibuild b/repo/meta/repo-x11/repo-x11.xibuild index 1191f8f..1191f8f 100644 --- a/repo/meta/repo-x11.xibuild +++ b/repo/meta/repo-x11/repo-x11.xibuild diff --git a/repo/meta/repo-xi.xibuild b/repo/meta/repo-xi/repo-xi.xibuild index a3b3160..a3b3160 100644 --- a/repo/meta/repo-xi.xibuild +++ b/repo/meta/repo-xi/repo-xi.xibuild diff --git a/repo/meta/skip.xibuild b/repo/meta/skip/skip.xibuild index 0fd2cb5..0fd2cb5 100644 --- a/repo/meta/skip.xibuild +++ b/repo/meta/skip/skip.xibuild diff --git a/repo/python/python-Jinja2.xibuild b/repo/python/python-Jinja2/python-Jinja2.xibuild index 7f69b7d..7f69b7d 100644 --- a/repo/python/python-Jinja2.xibuild +++ b/repo/python/python-Jinja2/python-Jinja2.xibuild diff --git a/repo/python/python-alabaster.xibuild b/repo/python/python-alabaster/python-alabaster.xibuild index adb94ce..adb94ce 100644 --- a/repo/python/python-alabaster.xibuild +++ b/repo/python/python-alabaster/python-alabaster.xibuild diff --git a/repo/python/python-appdirs.xibuild b/repo/python/python-appdirs/python-appdirs.xibuild index 5f0d515..5f0d515 100644 --- a/repo/python/python-appdirs.xibuild +++ b/repo/python/python-appdirs/python-appdirs.xibuild diff --git a/repo/python/python-babel.xibuild b/repo/python/python-babel/python-babel.xibuild index 0e9af5c..0e9af5c 100644 --- a/repo/python/python-babel.xibuild +++ b/repo/python/python-babel/python-babel.xibuild diff --git a/repo/python/python-certifi.xibuild b/repo/python/python-certifi/python-certifi.xibuild index 5da7f2d..5da7f2d 100644 --- a/repo/python/python-certifi.xibuild +++ b/repo/python/python-certifi/python-certifi.xibuild diff --git a/repo/python/python-chardet.xibuild b/repo/python/python-chardet/python-chardet.xibuild index 81db06f..81db06f 100644 --- a/repo/python/python-chardet.xibuild +++ b/repo/python/python-chardet/python-chardet.xibuild diff --git a/repo/python/python-docutils.xibuild b/repo/python/python-docutils/python-docutils.xibuild index 546c14d..546c14d 100644 --- a/repo/python/python-docutils.xibuild +++ b/repo/python/python-docutils/python-docutils.xibuild diff --git a/repo/python/python-gobject.xibuild b/repo/python/python-gobject/python-gobject.xibuild index 348724a..348724a 100644 --- a/repo/python/python-gobject.xibuild +++ b/repo/python/python-gobject/python-gobject.xibuild diff --git a/repo/python/python-html5lib.xibuild b/repo/python/python-html5lib/python-html5lib.xibuild index cc89547..cc89547 100644 --- a/repo/python/python-html5lib.xibuild +++ b/repo/python/python-html5lib/python-html5lib.xibuild diff --git a/repo/python/python-idna.xibuild b/repo/python/python-idna/python-idna.xibuild index cc3c78c..cc3c78c 100644 --- a/repo/python/python-idna.xibuild +++ b/repo/python/python-idna/python-idna.xibuild diff --git a/repo/python/python-imagesize.xibuild b/repo/python/python-imagesize/python-imagesize.xibuild index 03d7b78..03d7b78 100644 --- a/repo/python/python-imagesize.xibuild +++ b/repo/python/python-imagesize/python-imagesize.xibuild diff --git a/repo/python/python-jinja.xibuild b/repo/python/python-jinja/python-jinja.xibuild index 35fc65f..35fc65f 100644 --- a/repo/python/python-jinja.xibuild +++ b/repo/python/python-jinja/python-jinja.xibuild diff --git a/repo/python/python-lxml.xibuild b/repo/python/python-lxml/python-lxml.xibuild index e69de29..e69de29 100644 --- a/repo/python/python-lxml.xibuild +++ b/repo/python/python-lxml/python-lxml.xibuild diff --git a/repo/python/python-mach.xibuild b/repo/python/python-mach/python-mach.xibuild index c838687..c838687 100644 --- a/repo/python/python-mach.xibuild +++ b/repo/python/python-mach/python-mach.xibuild diff --git a/repo/python/python-mako.xibuild b/repo/python/python-mako/python-mako.xibuild index be10b64..be10b64 100644 --- a/repo/python/python-mako.xibuild +++ b/repo/python/python-mako/python-mako.xibuild diff --git a/repo/python/python-markupsafe.xibuild b/repo/python/python-markupsafe/python-markupsafe.xibuild index b8327e6..b8327e6 100644 --- a/repo/python/python-markupsafe.xibuild +++ b/repo/python/python-markupsafe/python-markupsafe.xibuild diff --git a/repo/python/python-packaging.xibuild b/repo/python/python-packaging/python-packaging.xibuild index 3dab5bf..3dab5bf 100644 --- a/repo/python/python-packaging.xibuild +++ b/repo/python/python-packaging/python-packaging.xibuild diff --git a/repo/python/python-pip.xibuild b/repo/python/python-pip/python-pip.xibuild index 9700967..9700967 100644 --- a/repo/python/python-pip.xibuild +++ b/repo/python/python-pip/python-pip.xibuild diff --git a/repo/python/python-pygments.xibuild b/repo/python/python-pygments/python-pygments.xibuild index 8a19bcd..8a19bcd 100644 --- a/repo/python/python-pygments.xibuild +++ b/repo/python/python-pygments/python-pygments.xibuild diff --git a/repo/python/python-pyparsing.xibuild b/repo/python/python-pyparsing/python-pyparsing.xibuild index 803df1a..803df1a 100644 --- a/repo/python/python-pyparsing.xibuild +++ b/repo/python/python-pyparsing/python-pyparsing.xibuild diff --git a/repo/python/python-pytz.xibuild b/repo/python/python-pytz/python-pytz.xibuild index 033d5aa..033d5aa 100644 --- a/repo/python/python-pytz.xibuild +++ b/repo/python/python-pytz/python-pytz.xibuild diff --git a/repo/python/python-requests.xibuild b/repo/python/python-requests/python-requests.xibuild index db1d920..db1d920 100644 --- a/repo/python/python-requests.xibuild +++ b/repo/python/python-requests/python-requests.xibuild diff --git a/repo/python/python-six.xibuild b/repo/python/python-six/python-six.xibuild index 88e5251..88e5251 100644 --- a/repo/python/python-six.xibuild +++ b/repo/python/python-six/python-six.xibuild diff --git a/repo/python/python-snowballstemmer.xibuild b/repo/python/python-snowballstemmer/python-snowballstemmer.xibuild index c857421..c857421 100644 --- a/repo/python/python-snowballstemmer.xibuild +++ b/repo/python/python-snowballstemmer/python-snowballstemmer.xibuild diff --git a/repo/python/python-sphinx-alabaster-theme.xibuild b/repo/python/python-sphinx-alabaster-theme/python-sphinx-alabaster-theme.xibuild index aaeee3b..aaeee3b 100644 --- a/repo/python/python-sphinx-alabaster-theme.xibuild +++ b/repo/python/python-sphinx-alabaster-theme/python-sphinx-alabaster-theme.xibuild diff --git a/repo/python/python-sphinx.xibuild b/repo/python/python-sphinx/python-sphinx.xibuild index 7d24130..7d24130 100644 --- a/repo/python/python-sphinx.xibuild +++ b/repo/python/python-sphinx/python-sphinx.xibuild diff --git a/repo/python/python-sphinxcontrib-applehelp.xibuild b/repo/python/python-sphinxcontrib-applehelp/python-sphinxcontrib-applehelp.xibuild index bcc2de5..bcc2de5 100644 --- a/repo/python/python-sphinxcontrib-applehelp.xibuild +++ b/repo/python/python-sphinxcontrib-applehelp/python-sphinxcontrib-applehelp.xibuild diff --git a/repo/python/python-sphinxcontrib-devhelp.xibuild b/repo/python/python-sphinxcontrib-devhelp/python-sphinxcontrib-devhelp.xibuild index c623fc0..c623fc0 100644 --- a/repo/python/python-sphinxcontrib-devhelp.xibuild +++ b/repo/python/python-sphinxcontrib-devhelp/python-sphinxcontrib-devhelp.xibuild diff --git a/repo/python/python-sphinxcontrib-htmlhelp.xibuild b/repo/python/python-sphinxcontrib-htmlhelp/python-sphinxcontrib-htmlhelp.xibuild index 29a4a9b..29a4a9b 100644 --- a/repo/python/python-sphinxcontrib-htmlhelp.xibuild +++ b/repo/python/python-sphinxcontrib-htmlhelp/python-sphinxcontrib-htmlhelp.xibuild diff --git a/repo/python/python-sphinxcontrib-jsmath.xibuild b/repo/python/python-sphinxcontrib-jsmath/python-sphinxcontrib-jsmath.xibuild index 3ada466..3ada466 100644 --- a/repo/python/python-sphinxcontrib-jsmath.xibuild +++ b/repo/python/python-sphinxcontrib-jsmath/python-sphinxcontrib-jsmath.xibuild diff --git a/repo/python/python-sphinxcontrib-qthelp.xibuild b/repo/python/python-sphinxcontrib-qthelp/python-sphinxcontrib-qthelp.xibuild index b16dd94..b16dd94 100644 --- a/repo/python/python-sphinxcontrib-qthelp.xibuild +++ b/repo/python/python-sphinxcontrib-qthelp/python-sphinxcontrib-qthelp.xibuild diff --git a/repo/python/python-sphinxcontrib-serializinghtml.xibuild b/repo/python/python-sphinxcontrib-serializinghtml/python-sphinxcontrib-serializinghtml.xibuild index dc5fe54..dc5fe54 100644 --- a/repo/python/python-sphinxcontrib-serializinghtml.xibuild +++ b/repo/python/python-sphinxcontrib-serializinghtml/python-sphinxcontrib-serializinghtml.xibuild diff --git a/repo/python/python-urllib3.xibuild b/repo/python/python-urllib3/python-urllib3.xibuild index fc75750..fc75750 100644 --- a/repo/python/python-urllib3.xibuild +++ b/repo/python/python-urllib3/python-urllib3.xibuild diff --git a/repo/python/python-webencodings.xibuild b/repo/python/python-webencodings/python-webencodings.xibuild index 5a29aa8..5a29aa8 100644 --- a/repo/python/python-webencodings.xibuild +++ b/repo/python/python-webencodings/python-webencodings.xibuild diff --git a/repo/python/python.xibuild b/repo/python/python/python.xibuild index 3876d8b..3876d8b 100644 --- a/repo/python/python.xibuild +++ b/repo/python/python/python.xibuild diff --git a/repo/system/acl.xibuild b/repo/system/acl/acl.xibuild index eca7ca5..eca7ca5 100644 --- a/repo/system/acl.xibuild +++ b/repo/system/acl/acl.xibuild diff --git a/repo/system/acpid/acpid.confd b/repo/system/acpid/acpid.confd new file mode 100644 index 0000000..2b3d304 --- /dev/null +++ b/repo/system/acpid/acpid.confd @@ -0,0 +1,7 @@ +# Configuration file for /etc/init.d/acpid (from acpid package) + +# Additional arguments to pass to acpid. +command_args="--logevents" + +# Uncomment to use process supervisor. +#supervisor="supervise-daemon" diff --git a/repo/system/acpid/acpid.initd b/repo/system/acpid/acpid.initd new file mode 100644 index 0000000..c2d60f9 --- /dev/null +++ b/repo/system/acpid/acpid.initd @@ -0,0 +1,28 @@ +#!/sbin/openrc-run + +description="The ACPI Daemon" + +extra_started_commands="reload" +description_reload="Reload configuration" + +command="/sbin/acpid" +command_args="--foreground ${command_args:-}" +command_background="yes" +pidfile="/run/$RC_SVCNAME.pid" + +depend() { + need dev localmount + after hwdrivers modules + provide acpid + keyword -vserver -lxc +} + +reload() { + ebegin "Reloading $RC_SVCNAME configuration" + if [ "$supervisor" ]; then + $supervisor "$RC_SVCNAME" --signal HUP + else + start-stop-daemon --pidfile "$pidfile" --signal HUP + fi + eend $? +} diff --git a/repo/system/acpid.xibuild b/repo/system/acpid/acpid.xibuild index f960ac0..f960ac0 100644 --- a/repo/system/acpid.xibuild +++ b/repo/system/acpid/acpid.xibuild diff --git a/repo/system/acpid/anything b/repo/system/acpid/anything new file mode 100644 index 0000000..d182898 --- /dev/null +++ b/repo/system/acpid/anything @@ -0,0 +1,3 @@ +# Pass all events to our one handler script +event=.* +action=/etc/acpi/handler.sh %e diff --git a/repo/system/acpid/handler.sh b/repo/system/acpid/handler.sh new file mode 100644 index 0000000..412ac02 --- /dev/null +++ b/repo/system/acpid/handler.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# vim: set ts=4: +# +# This is the default ACPI handler script that is configured in +# /etc/acpi/events/anything to be called for every ACPI event. +# You can edit it and add your own actions; treat it as a configuration file. +# +PATH="/usr/share/acpid:$PATH" +alias log='logger -t acpid' + +# <dev-class>:<dev-name>:<notif-value>:<sup-value> +case "$1:$2:$3:$4" in + +button/power:PWRF:*) + log 'Power button pressed' + # Shutdown the system unless it has a lid (notebook). + [ -e /proc/acpi/button/lid/LID ] || poweroff +;; +button/sleep:SLPB:*) + log 'Sleep button pressed' + # Suspend to RAM. + zzz +;; +button/lid:*:close:*) + log 'Lid closed' + # Suspend to RAM if AC adapter is not connected. + power-supply-ac || zzz +;; +ac_adapter:*:*:*0) + log 'AC adapter unplugged' + # Suspend to RAM if notebook's lid is closed. + lid-closed && zzz +;; +esac + +exit 0 diff --git a/repo/system/acpid/lid-closed b/repo/system/acpid/lid-closed new file mode 100644 index 0000000..57ffb71 --- /dev/null +++ b/repo/system/acpid/lid-closed @@ -0,0 +1,21 @@ +#!/bin/sh +# This script exits with status 0 if the latop's lid is closed, 1 if opened, +# 10 if /proc/acpi/button/lid/LID/state does not exist or is not readable. +set -u + +STATE_FILE='/proc/acpi/button/lid/LID/state' + +verbose=false +[ "${1:-}" = '-v' ] && verbose=true + +if ! [ -r "$STATE_FILE" ]; then + $verbose && echo "$STATE_FILE does not exist or is not readable!" >&2 + exit 10 +fi + +read -r _ state < "$STATE_FILE" || exit 10 + +[ "$state" = 'closed' ]; rc=$? + +$verbose && echo $rc +exit $rc diff --git a/repo/system/acpid/power-supply-ac b/repo/system/acpid/power-supply-ac new file mode 100644 index 0000000..337aae2 --- /dev/null +++ b/repo/system/acpid/power-supply-ac @@ -0,0 +1,25 @@ +#!/bin/sh +# This script exits with status 0 when the computer is on AC power (or no AC +# power supply found), 1 otherwise (i.e. running on battery). +set -u + +verbose=false +[ "${1:-}" = '-v' ] && verbose=true + +# If we do not have any power supplies, assume we are on AC. +rc=0 + +# Iterate through power supplies sysfs knows about. +for ps in /sys/class/power_supply/*; do + [ -r $ps/online ] || continue + # We know we have an AC adaptor, our default return changes to failed. + rc=1 + + if [ "$(cat $ps/online)" -eq 1 ]; then + rc=0 + break + fi +done + +$verbose && echo $rc +exit $rc diff --git a/repo/system/argp-standalone.xibuild b/repo/system/argp-standalone/argp-standalone.xibuild index 4c2a722..4c2a722 100644 --- a/repo/system/argp-standalone.xibuild +++ b/repo/system/argp-standalone/argp-standalone.xibuild diff --git a/repo/system/at-spi2-atk.xibuild b/repo/system/at-spi2-atk/at-spi2-atk.xibuild index 9cdecd9..9cdecd9 100644 --- a/repo/system/at-spi2-atk.xibuild +++ b/repo/system/at-spi2-atk/at-spi2-atk.xibuild diff --git a/repo/system/at-spi2-core.xibuild b/repo/system/at-spi2-core/at-spi2-core.xibuild index 58e56a2..58e56a2 100644 --- a/repo/system/at-spi2-core.xibuild +++ b/repo/system/at-spi2-core/at-spi2-core.xibuild diff --git a/repo/system/atk.xibuild b/repo/system/atk/atk.xibuild index 4fd470a..4fd470a 100644 --- a/repo/system/atk.xibuild +++ b/repo/system/atk/atk.xibuild diff --git a/repo/system/attr.xibuild b/repo/system/attr/attr.xibuild index bbd9a27..bbd9a27 100644 --- a/repo/system/attr.xibuild +++ b/repo/system/attr/attr.xibuild diff --git a/repo/system/binutils/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch b/repo/system/binutils/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch new file mode 100644 index 0000000..6e1fa77 --- /dev/null +++ b/repo/system/binutils/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch @@ -0,0 +1,55 @@ +From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001 +From: Ariadne Conill <ariadne@dereferenced.org> +Date: Tue, 21 Sep 2021 14:53:13 +0000 +Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared + libraries" + +This revert is needed to avoid wrongly tagging objects with the incompatible +IBM long double ABI, which is not supported by musl and will result in +linking errors if used. + +This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba. +--- + bfd/elf32-tic6x.c | 3 --- + ld/ldlang.c | 10 ++++------ + 2 files changed, 4 insertions(+), 9 deletions(-) + +diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c +index 5754f3cb860..3ad1d612749 100644 +--- a/bfd/elf32-tic6x.c ++++ b/bfd/elf32-tic6x.c +@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info) + + case Tag_ABI_PIC: + case Tag_ABI_PID: +- /* Don't transfer these tags from dynamic objects. */ +- if ((ibfd->flags & DYNAMIC) != 0) +- continue; + if (out_attr[i].i > in_attr[i].i) + out_attr[i].i = in_attr[i].i; + break; +diff --git a/ld/ldlang.c b/ld/ldlang.c +index 37b64c89ee1..f13beaef9d9 100644 +--- a/ld/ldlang.c ++++ b/ld/ldlang.c +@@ -7071,13 +7071,11 @@ lang_check (void) + bfd_printable_name (input_bfd), input_bfd, + bfd_printable_name (link_info.output_bfd)); + } +- +- /* If the input bfd has no contents, it shouldn't set the +- private data of the output bfd. */ +- else if (!file->flags.just_syms +- && ((input_bfd->flags & DYNAMIC) != 0 +- || bfd_count_sections (input_bfd) != 0)) ++ else if (bfd_count_sections (input_bfd)) + { ++ /* If the input bfd has no contents, it shouldn't set the ++ private data of the output bfd. */ ++ + bfd_error_handler_type pfn = NULL; + + /* If we aren't supposed to warn about mismatched input +-- +2.33.0 + diff --git a/repo/system/binutils/bfd-close-file-desriptor-if-there-is-no-archive-fd.patch b/repo/system/binutils/bfd-close-file-desriptor-if-there-is-no-archive-fd.patch new file mode 100644 index 0000000..357d0f9 --- /dev/null +++ b/repo/system/binutils/bfd-close-file-desriptor-if-there-is-no-archive-fd.patch @@ -0,0 +1,234 @@ +Upstream: yes +URL: https://sourceware.org/bugzilla/show_bug.cgi?id=28138 +From 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" <hjl.tools@gmail.com> +Date: Mon, 26 Jul 2021 05:59:55 -0700 +Subject: [PATCH] bfd: Close the file descriptor if there is no archive fd + +Close the file descriptor if there is no archive plugin file descriptor +to avoid running out of file descriptors on thin archives with many +archive members. + +bfd/ + + PR ld/28138 + * plugin.c (bfd_plugin_close_file_descriptor): Close the file + descriptor there is no archive plugin file descriptor. + +ld/ + + PR ld/28138 + * testsuite/ld-plugin/lto.exp: Run tmpdir/pr28138 only for + native build. + + PR ld/28138 + * testsuite/ld-plugin/lto.exp: Run ld/28138 tests. + * testsuite/ld-plugin/pr28138.c: New file. + * testsuite/ld-plugin/pr28138-1.c: Likewise. + * testsuite/ld-plugin/pr28138-2.c: Likewise. + * testsuite/ld-plugin/pr28138-3.c: Likewise. + * testsuite/ld-plugin/pr28138-4.c: Likewise. + * testsuite/ld-plugin/pr28138-5.c: Likewise. + * testsuite/ld-plugin/pr28138-6.c: Likewise. + * testsuite/ld-plugin/pr28138-7.c: Likewise. + +(cherry picked from commit 5a98fb7513b559e20dfebdbaa2a471afda3b4742) +(cherry picked from commit 7dc37e1e1209c80e0bab784df6b6bac335e836f2) +--- + bfd/plugin.c | 8 +++++++ + ld/testsuite/ld-plugin/lto.exp | 34 ++++++++++++++++++++++++++++++ + ld/testsuite/ld-plugin/pr28138-1.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-2.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-3.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-4.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-5.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-6.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138-7.c | 6 ++++++ + ld/testsuite/ld-plugin/pr28138.c | 20 ++++++++++++++++++ + 10 files changed, 104 insertions(+) + create mode 100644 ld/testsuite/ld-plugin/pr28138-1.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-2.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-3.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-4.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-5.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-6.c + create mode 100644 ld/testsuite/ld-plugin/pr28138-7.c + create mode 100644 ld/testsuite/ld-plugin/pr28138.c + +diff --git a/bfd/plugin.c b/bfd/plugin.c +index 6cfa2b66470..3bab8febe88 100644 +--- a/bfd/plugin.c ++++ b/bfd/plugin.c +@@ -291,6 +291,14 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd) + && !bfd_is_thin_archive (abfd->my_archive)) + abfd = abfd->my_archive; + ++ /* Close the file descriptor if there is no archive plugin file ++ descriptor. */ ++ if (abfd->archive_plugin_fd == -1) ++ { ++ close (fd); ++ return; ++ } ++ + abfd->archive_plugin_fd_open_count--; + /* Dup the archive plugin file descriptor for later use, which + will be closed by _bfd_archive_close_and_cleanup. */ +diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp +index def69e43ab3..999d911ce6a 100644 +--- a/ld/testsuite/ld-plugin/lto.exp ++++ b/ld/testsuite/ld-plugin/lto.exp +@@ -687,6 +687,40 @@ if { [is_elf_format] && [check_lto_shared_available] } { + } + } + ++run_cc_link_tests [list \ ++ [list \ ++ "Build pr28138.a" \ ++ "-T" "" \ ++ {pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \ ++ pr28138-6.c pr28138-7.c} {} "pr28138.a" \ ++ ] \ ++ [list \ ++ "Build pr28138.o" \ ++ "" "" \ ++ {pr28138.c} {} \ ++ ] \ ++] ++ ++set exec_output [run_host_cmd "sh" \ ++ "-c \"ulimit -n 20; \ ++ $CC -Btmpdir/ld -o tmpdir/pr28138 \ ++ tmpdir/pr28138.o tmpdir/pr28138.a\""] ++set exec_output [prune_warnings $exec_output] ++if [string match "" $exec_output] then { ++ if { [isnative] } { ++ set exec_output [run_host_cmd "tmpdir/pr28138" ""] ++ if [string match "PASS" $exec_output] then { ++ pass "PR ld/28138" ++ } else { ++ fail "PR ld/28138" ++ } ++ } else { ++ pass "PR ld/28138" ++ } ++} else { ++ fail "PR ld/28138" ++} ++ + set testname "Build liblto-11.a" + remote_file host delete "tmpdir/liblto-11.a" + set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"] +diff --git a/ld/testsuite/ld-plugin/pr28138-1.c b/ld/testsuite/ld-plugin/pr28138-1.c +new file mode 100644 +index 00000000000..51d119e1642 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-1.c +@@ -0,0 +1,6 @@ ++extern int a0(void); ++int ++a1(void) ++{ ++ return 1 + a0(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-2.c b/ld/testsuite/ld-plugin/pr28138-2.c +new file mode 100644 +index 00000000000..1120cd797e9 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-2.c +@@ -0,0 +1,6 @@ ++extern int a1(void); ++int ++a2(void) ++{ ++ return 1 + a1(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-3.c b/ld/testsuite/ld-plugin/pr28138-3.c +new file mode 100644 +index 00000000000..ec464947ee6 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-3.c +@@ -0,0 +1,6 @@ ++extern int a2(void); ++int ++a3(void) ++{ ++ return 1 + a2(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-4.c b/ld/testsuite/ld-plugin/pr28138-4.c +new file mode 100644 +index 00000000000..475701b2c5c +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-4.c +@@ -0,0 +1,6 @@ ++extern int a3(void); ++int ++a4(void) ++{ ++ return 1 + a3(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-5.c b/ld/testsuite/ld-plugin/pr28138-5.c +new file mode 100644 +index 00000000000..e24f86c363e +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-5.c +@@ -0,0 +1,6 @@ ++extern int a4(void); ++int ++a5(void) ++{ ++ return 1 + a4(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-6.c b/ld/testsuite/ld-plugin/pr28138-6.c +new file mode 100644 +index 00000000000..b5b938bdb21 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-6.c +@@ -0,0 +1,6 @@ ++extern int a5(void); ++int ++a6(void) ++{ ++ return 1 + a5(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138-7.c b/ld/testsuite/ld-plugin/pr28138-7.c +new file mode 100644 +index 00000000000..4ef75bf0f0c +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138-7.c +@@ -0,0 +1,6 @@ ++extern int a6(void); ++int ++a7(void) ++{ ++ return 1 + a6(); ++} +diff --git a/ld/testsuite/ld-plugin/pr28138.c b/ld/testsuite/ld-plugin/pr28138.c +new file mode 100644 +index 00000000000..68252c9f382 +--- /dev/null ++++ b/ld/testsuite/ld-plugin/pr28138.c +@@ -0,0 +1,20 @@ ++#include <stdio.h> ++ ++extern int a7(void); ++ ++int ++a0(void) ++{ ++ return 0; ++} ++ ++int ++main() ++{ ++ if (a7() == 7) ++ { ++ printf ("PASS\n"); ++ return 0; ++ } ++ return 1; ++} +-- +2.27.0 + diff --git a/repo/system/binutils/binutils-ld-fix-static-linking.patch b/repo/system/binutils/binutils-ld-fix-static-linking.patch new file mode 100644 index 0000000..bc5d762 --- /dev/null +++ b/repo/system/binutils/binutils-ld-fix-static-linking.patch @@ -0,0 +1,46 @@ +This fixes static linking for our hardened toolchain +diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc +index e8126cb..9532bfb 100644 +--- a/ld/scripttempl/elf.sc ++++ b/ld/scripttempl/elf.sc +@@ -235,8 +235,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS=" + if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then + SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))" + SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))" +- CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors" +- DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors" ++ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors" ++ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors" + else + SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))" + SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))" +@@ -270,15 +270,14 @@ CTOR=".ctors ${CONSTRUCTING-0} : + doesn't matter which directory crtbegin.o + is in. */ + +- KEEP (*crtbegin.o(.ctors)) +- KEEP (*crtbegin?.o(.ctors)) ++ KEEP (*crtbegin*.o(.ctors)) + + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + +- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors)) ++ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + ${CONSTRUCTING+${CTOR_END}} +@@ -286,9 +285,8 @@ CTOR=".ctors ${CONSTRUCTING-0} : + DTOR=".dtors ${CONSTRUCTING-0} : + { + ${CONSTRUCTING+${DTOR_START}} +- KEEP (*crtbegin.o(.dtors)) +- KEEP (*crtbegin?.o(.dtors)) +- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors)) ++ KEEP (*crtbegin*.o(.dtors)) ++ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + ${CONSTRUCTING+${DTOR_END}} diff --git a/repo/system/binutils.xibuild b/repo/system/binutils/binutils.xibuild index f7172ea..f7172ea 100644 --- a/repo/system/binutils.xibuild +++ b/repo/system/binutils/binutils.xibuild diff --git a/repo/system/binutils/defang-no-split.patch b/repo/system/binutils/defang-no-split.patch new file mode 100644 index 0000000..cea68ed --- /dev/null +++ b/repo/system/binutils/defang-no-split.patch @@ -0,0 +1,38 @@ +From 2dad02b6d46eef438cbd14d8511487b056628a38 Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich <siarheit@google.com> +Date: Mon, 26 Jul 2021 22:51:18 +0100 +Subject: [PATCH 1/1] texi2pod.pl: add no-op --no-split option support + [PR28144] + +Change 2faf902da ("generate single html manual page by default") +added use of --no-split option to makeinfo. binutils reuses +makeinfo options for texi2pod.pl wrapper. Unsupported option +led to silent manpage truncation. + +The change adds no-op option support. + +etc/ + PR 28144 + * texi2pod.pl: Handle no-op --no-split option. + +(cherry picked from commit 96a7037cd8573cf065aa6b12baca68696f96d9ca) +--- + etc/texi2pod.pl | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/etc/texi2pod.pl b/etc/texi2pod.pl +index 11f70d156be..dcf2b437640 100644 +--- a/etc/texi2pod.pl ++++ b/etc/texi2pod.pl +@@ -59,6 +59,8 @@ while ($_ = shift) { + $flag = shift; + } + push (@ipath, $flag); ++ } elsif (/^--no-split$/) { ++ # ignore option for makeinfo compatibility + } elsif (/^-/) { + usage(); + } else { +-- +2.27.0 + diff --git a/repo/system/binutils/gold-mips.patch b/repo/system/binutils/gold-mips.patch new file mode 100644 index 0000000..291a2aa --- /dev/null +++ b/repo/system/binutils/gold-mips.patch @@ -0,0 +1,39 @@ +# DP: Fix gold on mips64 targets. + +gold/ + +2016-08-09 Aurelien Jarno <aurelien@aurel32.net> + + * configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*. + + +--- a/gold/configure.tgt ++++ b/gold/configure.tgt +@@ -153,6 +153,13 @@ aarch64*-*) + targ_big_endian=false + targ_extra_big_endian=true + ;; ++mips*64*el*-*-*|mips*64*le*-*-*) ++ targ_obj=mips ++ targ_machine=EM_MIPS_RS3_LE ++ targ_size=64 ++ targ_big_endian=false ++ targ_extra_big_endian=true ++ ;; + mips*el*-*-*|mips*le*-*-*) + targ_obj=mips + targ_machine=EM_MIPS_RS3_LE +@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*) + targ_big_endian=false + targ_extra_big_endian=true + ;; ++mips*64*-*-*) ++ targ_obj=mips ++ targ_machine=EM_MIPS ++ targ_size=64 ++ targ_big_endian=true ++ targ_extra_big_endian=false ++ ;; + mips*-*-*) + targ_obj=mips + targ_machine=EM_MIPS diff --git a/repo/system/binutils/ld-bfd-mips.patch b/repo/system/binutils/ld-bfd-mips.patch new file mode 100644 index 0000000..2991c88 --- /dev/null +++ b/repo/system/binutils/ld-bfd-mips.patch @@ -0,0 +1,19 @@ +--- ./ld/configure.tgt.orig ++++ ./ld/configure.tgt +@@ -541,12 +541,12 @@ + ;; + mips*-*-windiss) targ_emul=elf32mipswindiss + ;; +-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32 +- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" ++mips64*el-*-linux-*) targ_emul=elf64ltsmip ++ targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip" + targ_extra_libpath=$targ_extra_emuls + ;; +-mips64*-*-linux-*) targ_emul=elf32btsmipn32 +- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" ++mips64*-*-linux-*) targ_emul=elf64btsmip ++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip" + targ_extra_libpath=$targ_extra_emuls + ;; + mips*el-*-linux-*) targ_emul=elf32ltsmip diff --git a/repo/system/brotli.xibuild b/repo/system/brotli/brotli.xibuild index dbdd973..dbdd973 100644 --- a/repo/system/brotli.xibuild +++ b/repo/system/brotli/brotli.xibuild diff --git a/repo/system/bzip2.xibuild b/repo/system/bzip2/bzip2.xibuild index d0d42f6..d0d42f6 100644 --- a/repo/system/bzip2.xibuild +++ b/repo/system/bzip2/bzip2.xibuild diff --git a/repo/system/c-ares.xibuild b/repo/system/c-ares/c-ares.xibuild index 6cf3e3f..6cf3e3f 100644 --- a/repo/system/c-ares.xibuild +++ b/repo/system/c-ares/c-ares.xibuild diff --git a/repo/system/cacerts.xibuild b/repo/system/cacerts/cacerts.xibuild index 9fef8e1..9fef8e1 100644 --- a/repo/system/cacerts.xibuild +++ b/repo/system/cacerts/cacerts.xibuild diff --git a/repo/system/cacerts/fix-sbase-coreutils.patch b/repo/system/cacerts/fix-sbase-coreutils.patch new file mode 100644 index 0000000..8e34376 --- /dev/null +++ b/repo/system/cacerts/fix-sbase-coreutils.patch @@ -0,0 +1,12 @@ +diff -Nuar a/make-ca b/make-ca +--- a/make-ca 2020-03-08 04:55:46.000000000 +0000 ++++ b/make-ca 2022-03-09 21:41:03.786961743 +0000 +@@ -809,7 +809,7 @@ + + # Install certdata.txt + if test "${REBUILD}" == "0"; then +- install -vdm755 "${DESTDIR}${SSLDIR}" ++ install -dm755 "${DESTDIR}${SSLDIR}" + install -m644 "${WORKDIR}/certdata.txt" "${DESTDIR}${SSLDIR}/certdata.txt" + fi + diff --git a/repo/system/cairo.xibuild b/repo/system/cairo/cairo.xibuild index 4bc7041..4bc7041 100644 --- a/repo/system/cairo.xibuild +++ b/repo/system/cairo/cairo.xibuild diff --git a/repo/system/cairo/fix-mask-usage-in-image-compositor.patch b/repo/system/cairo/fix-mask-usage-in-image-compositor.patch new file mode 100644 index 0000000..8d5717f --- /dev/null +++ b/repo/system/cairo/fix-mask-usage-in-image-compositor.patch @@ -0,0 +1,172 @@ +From 03a820b173ed1fdef6ff14b4468f5dbc02ff59be Mon Sep 17 00:00:00 2001 +From: Heiko Lewin <heiko.lewin@worldiety.de> +Date: Tue, 15 Dec 2020 16:48:19 +0100 +Subject: [PATCH 1/3] Fix mask usage in image-compositor + +--- + src/cairo-image-compositor.c | 8 ++-- + test/Makefile.sources | 1 + + test/bug-image-compositor.c | 39 ++++++++++++++++++++ + test/reference/bug-image-compositor.ref.png | Bin 0 -> 185 bytes + 4 files changed, 44 insertions(+), 4 deletions(-) + create mode 100644 test/bug-image-compositor.c + create mode 100644 test/reference/bug-image-compositor.ref.png + +diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c +index 79ad69f68..4f8aaed99 100644 +--- a/src/cairo-image-compositor.c ++++ b/src/cairo-image-compositor.c +@@ -2610,14 +2610,14 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, + unsigned num_spans) + { + cairo_image_span_renderer_t *r = abstract_renderer; +- uint8_t *m; ++ uint8_t *m, *base = (uint8_t*)pixman_image_get_data(r->mask); + int x0; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + x0 = spans[0].x; +- m = r->_buf; ++ m = base; + do { + int len = spans[1].x - spans[0].x; + if (len >= r->u.composite.run_length && spans[0].coverage == 0xff) { +@@ -2655,7 +2655,7 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, + spans[0].x, y, + spans[1].x - spans[0].x, h); + +- m = r->_buf; ++ m = base; + x0 = spans[1].x; + } else if (spans[0].coverage == 0x0) { + if (spans[0].x != x0) { +@@ -2684,7 +2684,7 @@ _inplace_src_spans (void *abstract_renderer, int y, int h, + #endif + } + +- m = r->_buf; ++ m = base; + x0 = spans[1].x; + } else { + *m++ = spans[0].coverage; +diff --git a/test/bug-image-compositor.c b/test/bug-image-compositor.c +new file mode 100644 +index 000000000..fc4fd370b +--- /dev/null ++++ b/test/bug-image-compositor.c +@@ -0,0 +1,39 @@ ++#include "cairo-test.h" ++ ++static cairo_test_status_t ++draw (cairo_t *cr, int width, int height) ++{ ++ cairo_set_source_rgb (cr, 0., 0., 0.); ++ cairo_paint (cr); ++ ++ cairo_set_source_rgb (cr, 1., 1., 1.); ++ cairo_set_line_width (cr, 1.); ++ ++ cairo_pattern_t *p = cairo_pattern_create_linear (0, 0, width, height); ++ cairo_pattern_add_color_stop_rgb (p, 0, 0.99, 1, 1); ++ cairo_pattern_add_color_stop_rgb (p, 1, 1, 1, 1); ++ cairo_set_source (cr, p); ++ ++ cairo_move_to (cr, 0.5, -1); ++ for (int i = 0; i < width; i+=3) { ++ cairo_rel_line_to (cr, 2, 2); ++ cairo_rel_line_to (cr, 1, -2); ++ } ++ ++ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); ++ cairo_stroke (cr); ++ ++ cairo_pattern_destroy(p); ++ ++ return CAIRO_TEST_SUCCESS; ++} ++ ++ ++CAIRO_TEST (bug_image_compositor, ++ "Crash in image-compositor", ++ "stroke, stress", /* keywords */ ++ NULL, /* requirements */ ++ 10000, 1, ++ NULL, draw) ++ ++ + +From 8bc14a6bba3bc8a64ff0749c74d9b96305bf6429 Mon Sep 17 00:00:00 2001 +From: Heiko Lewin <heiko.lewin@worldiety.de> +Date: Tue, 15 Dec 2020 17:14:18 +0100 +Subject: [PATCH 2/3] Minor cleanups + +--- + test/bug-image-compositor.c | 33 ++++++++++++++++++++++++++++++--- + 1 file changed, 30 insertions(+), 3 deletions(-) + +diff --git a/test/bug-image-compositor.c b/test/bug-image-compositor.c +index fc4fd370b..304ea089c 100644 +--- a/test/bug-image-compositor.c ++++ b/test/bug-image-compositor.c +@@ -1,5 +1,34 @@ ++/* ++ * Copyright © 2020 Uli Schlachter, Heiko Lewin ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, copy, ++ * modify, merge, publish, distribute, sublicense, and/or sell copies ++ * of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++ * SOFTWARE. ++ * ++ * Author: Uli Schlachter <psychon@znc.in> ++ * Author: Heiko Lewin <hlewin@gmx.de> ++ */ + #include "cairo-test.h" + ++ ++/* This test reproduces an overflow of a mask-buffer in cairo-image-compositor.c */ ++ + static cairo_test_status_t + draw (cairo_t *cr, int width, int height) + { +@@ -13,6 +42,7 @@ draw (cairo_t *cr, int width, int height) + cairo_pattern_add_color_stop_rgb (p, 0, 0.99, 1, 1); + cairo_pattern_add_color_stop_rgb (p, 1, 1, 1, 1); + cairo_set_source (cr, p); ++ cairo_pattern_destroy(p); + + cairo_move_to (cr, 0.5, -1); + for (int i = 0; i < width; i+=3) { +@@ -23,8 +53,6 @@ draw (cairo_t *cr, int width, int height) + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_stroke (cr); + +- cairo_pattern_destroy(p); +- + return CAIRO_TEST_SUCCESS; + } + +@@ -36,4 +64,3 @@ CAIRO_TEST (bug_image_compositor, + 10000, 1, + NULL, draw) + +- +-- +GitLab + diff --git a/repo/system/cairo/musl-stacksize.patch b/repo/system/cairo/musl-stacksize.patch new file mode 100644 index 0000000..d10469e --- /dev/null +++ b/repo/system/cairo/musl-stacksize.patch @@ -0,0 +1,23 @@ +Reduce the footprint of stack frame usage by turning +some large(r) structures as `static __thread` instead. + +--- a/src/cairo-rectangular-scan-converter.c 2015-10-27 22:04:21.000000000 +0100 ++++ b/src/cairo-rectangular-scan-converter.c 2016-05-07 04:25:26.640851782 +0200 +@@ -489,7 +489,7 @@ + cairo_span_renderer_t *renderer, + rectangle_t **rectangles) + { +- sweep_line_t sweep_line; ++ static __thread sweep_line_t sweep_line; + rectangle_t *start, *stop; + cairo_status_t status; + +@@ -656,7 +656,7 @@ + cairo_span_renderer_t *renderer) + { + cairo_rectangular_scan_converter_t *self = converter; +- rectangle_t *rectangles_stack[CAIRO_STACK_ARRAY_LENGTH (rectangle_t *)]; ++ static __thread rectangle_t *rectangles_stack[CAIRO_STACK_ARRAY_LENGTH (rectangle_t *)]; + rectangle_t **rectangles; + struct _cairo_rectangular_scan_converter_chunk *chunk; + cairo_status_t status; diff --git a/repo/system/cairo/pdf-font-subset-Generate-valid-font-names.patch b/repo/system/cairo/pdf-font-subset-Generate-valid-font-names.patch new file mode 100644 index 0000000..d5cfe2f --- /dev/null +++ b/repo/system/cairo/pdf-font-subset-Generate-valid-font-names.patch @@ -0,0 +1,58 @@ +From a3b69a0215fdface0fd5730872a4b3242d979dca Mon Sep 17 00:00:00 2001 +From: Uli Schlachter <psychon@znc.in> +Date: Tue, 9 Feb 2021 16:54:35 +0100 +Subject: [PATCH] pdf font subset: Generate valid font names + +A hash value is encoded in base 26 with upper case letters for font +names. + +Commit ed984146 replaced "numerator = abs (hash);" with "numerator = +hash;" in this code, because hash has type uint32_t and the compiler +warned about taking the absolute value of an unsigned value. However, +abs() is actually defined to take an int argument. Thus, there was some +implicit cast. + +Since numerator has type long, i.e. is signed, it is now actually +possible to get an overflow in the implicit cast and then have a +negative number. The following code is not prepared for this and +produces non-letters when encoding the hash. + +This commit fixes that problem by not using ldiv() and instead using / +and % to directly compute the needed values. This gets rid of the need +to convert to type long. Since now everything works with uint32_t, there +is no more chance for negative numbers messing things up. + +Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/449 +Signed-off-by: Uli Schlachter <psychon@znc.in> +--- + src/cairo-pdf-surface.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c +index 6da460878..52c49b6d2 100644 +--- a/src/cairo-pdf-surface.c ++++ b/src/cairo-pdf-surface.c +@@ -5310,18 +5310,14 @@ _create_font_subset_tag (cairo_scaled_font_subset_t *font_subset, + { + uint32_t hash; + int i; +- long numerator; +- ldiv_t d; + + hash = _hash_data ((unsigned char *) font_name, strlen(font_name), 0); + hash = _hash_data ((unsigned char *) (font_subset->glyphs), + font_subset->num_glyphs * sizeof(unsigned long), hash); + +- numerator = hash; + for (i = 0; i < 6; i++) { +- d = ldiv (numerator, 26); +- numerator = d.quot; +- tag[i] = 'A' + d.rem; ++ tag[i] = 'A' + (hash % 26); ++ hash /= 26; + } + tag[i] = 0; + } +-- +GitLab + diff --git a/repo/system/dbus/dbus.confd b/repo/system/dbus/dbus.confd new file mode 100644 index 0000000..0454047 --- /dev/null +++ b/repo/system/dbus/dbus.confd @@ -0,0 +1,7 @@ +# Configuration for /etc/init.d/dbus + +# Additional arguments to pass to dbus-daemon. +#command_args= + +# Uncomment to use process supervisor. +#supervisor=supervise-daemon diff --git a/repo/system/dbus/dbus.initd b/repo/system/dbus/dbus.initd new file mode 100644 index 0000000..f3f44da --- /dev/null +++ b/repo/system/dbus/dbus.initd @@ -0,0 +1,33 @@ +#!/sbin/openrc-run +name="System Message Bus" +description="D-Bus System Message Bus" + +extra_started_commands="reload" + +command="/usr/bin/dbus-daemon" +command_args="--system --nofork --nopidfile --syslog-only ${command_args:-}" +command_background="yes" +pidfile="/run/$RC_SVCNAME.pid" + +depend() { + need localmount + after bootmisc +} + +start_pre() { + checkpath -d -m755 -o root:messagebus /run/dbus || return 1 + + /usr/bin/dbus-uuidgen --ensure=/etc/machine-id +} + +stop_post() { + [ ! -S /run/dbus/system_bus_socket ] || rm -f /run/dbus/system_bus_socket +} + +reload() { + ebegin "Reloading $name configuration" + /usr/bin/dbus-send --print-reply --system --type=method_call \ + --dest=org.freedesktop.DBus \ + / org.freedesktop.DBus.ReloadConfig > /dev/null + eend $? +} diff --git a/repo/system/dbus/dbus.trigger b/repo/system/dbus/dbus.trigger new file mode 100644 index 0000000..a537bd8 --- /dev/null +++ b/repo/system/dbus/dbus.trigger @@ -0,0 +1,4 @@ +#!/bin/sh + +dbus-send --system --type=method_call --dest=org.freedesktop.DBus / \ + org.freedesktop.DBUS.ReloadConfig >/dev/null 2>&1 || : diff --git a/repo/system/dbus.xibuild b/repo/system/dbus/dbus.xibuild index 3bbfc31..3bbfc31 100644 --- a/repo/system/dbus.xibuild +++ b/repo/system/dbus/dbus.xibuild diff --git a/repo/system/dhcp/01-dhclient-script-fix-bare-ip.patch b/repo/system/dhcp/01-dhclient-script-fix-bare-ip.patch new file mode 100644 index 0000000..7b3165d --- /dev/null +++ b/repo/system/dhcp/01-dhclient-script-fix-bare-ip.patch @@ -0,0 +1,13 @@ +diff --git a/client/scripts/linux b/client/scripts/linux +index 0c42969..3cd2a75 100755 +--- a/client/scripts/linux ++++ b/client/scripts/linux +@@ -394,7 +394,7 @@ case "$reason" in + make_resolv_conf + else + # flush all IPs from interface +- ip -4 addr flush dev ${interface} ++ ${ip} -4 addr flush dev ${interface} + exit_with_hooks 2 + fi + diff --git a/repo/system/dhcp/02-dhclient-script-remove-bashisms.patch b/repo/system/dhcp/02-dhclient-script-remove-bashisms.patch new file mode 100644 index 0000000..afa1048 --- /dev/null +++ b/repo/system/dhcp/02-dhclient-script-remove-bashisms.patch @@ -0,0 +1,28 @@ +diff --git a/client/scripts/linux b/client/scripts/linux +index 0c42969..2e7274b 100755 +--- a/client/scripts/linux ++++ b/client/scripts/linux +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/bin/sh + # dhclient-script for Linux. Dan Halbert, March, 1997. + # Updated for Linux 2.[12] by Brian J. Murrell, January 1999. + # No guarantees about this. I'm a novice at the details of Linux +@@ -428,7 +428,7 @@ case "$reason" in + # Check if any IPv6 address on this interface is marked as + # tentative. + ${ip} addr show ${interface} | grep inet6 | grep tentative \ +- &> /dev/null ++ > /dev/null 2>&1 + if [ $? -eq 0 ]; then + # Wait for duplicate address detection to complete or for + # the timeout specified as --dad-wait-time. +@@ -437,7 +437,7 @@ case "$reason" in + # We're going to poll for the tentative flag every second. + sleep 1 + ${ip} addr show ${interface} | grep inet6 | grep tentative \ +- &> /dev/null ++ > /dev/null 2>&1 + if [ $? -ne 0 ]; then + break; + fi diff --git a/repo/system/dhcp/03-fix-unwind-import.patch b/repo/system/dhcp/03-fix-unwind-import.patch new file mode 100644 index 0000000..8b87fdb --- /dev/null +++ b/repo/system/dhcp/03-fix-unwind-import.patch @@ -0,0 +1,16 @@ +bind assumes _Unwind_GetIP is a function which is not necessarily +true. In some implementations of libunwind it's a macro. +This fixes the build on Alpine on armhf and armv7. + +--- a/bind/bind-9.11.36/lib/isc/backtrace.c ++++ b/bind/bind-9.11.36/lib/isc/backtrace.c +@@ -81,8 +81,7 @@ isc_backtrace_gettrace(void **addrs, int + return (ISC_R_SUCCESS); + } + #elif defined(BACKTRACE_GCC) +-extern int _Unwind_Backtrace(void* fn, void* a); +-extern void* _Unwind_GetIP(void* ctx); ++#include <unwind.h> + + typedef struct { + void **result; diff --git a/repo/system/dhcp.xibuild b/repo/system/dhcp/dhcp.xibuild index 241dee1..241dee1 100644 --- a/repo/system/dhcp.xibuild +++ b/repo/system/dhcp/dhcp.xibuild diff --git a/repo/system/dhcp/dhcpd.confd b/repo/system/dhcp/dhcpd.confd new file mode 100644 index 0000000..5cd2eec --- /dev/null +++ b/repo/system/dhcp/dhcpd.confd @@ -0,0 +1,28 @@ +# /etc/conf.d/dhcpd: config file for /etc/init.d/dhcpd + +# If you require more than one instance of dhcpd you can create symbolic +# links to dhcpd service like so +# cd /etc/init.d +# ln -s dhcpd dhcpd.foo +# cd ../conf.d +# cp dhcpd dhcpd.foo +# Now you can edit dhcpd.foo and specify a different configuration file. +# You'll also need to specify a pidfile in that dhcpd.conf file. +# See the pid-file-name option in the dhcpd.conf man page for details. + +# If you wish to run dhcpd in a chroot, uncomment the following line +# DHCPD_CHROOT="/var/lib/dhcp/chroot" + +# All file paths below are relative to the chroot. +# You can specify a different chroot directory but MAKE SURE it's empty. + +# Specify a configuration file - the default is /etc/dhcp/dhcpd.conf +# DHCPD_CONF="/etc/dhcp/dhcpd.conf" + +# Configure which interface or interfaces to for dhcpd to listen on. +# List all interfaces space separated. If this is not specified then +# we listen on all interfaces. +# DHCPD_IFACE="" + +# Insert any other dhcpd options - see the man page for a full list. +# DHCPD_OPTS="" diff --git a/repo/system/dhcp/dhcpd.initd b/repo/system/dhcp/dhcpd.initd new file mode 100644 index 0000000..f69ae71 --- /dev/null +++ b/repo/system/dhcp/dhcpd.initd @@ -0,0 +1,115 @@ +#!/sbin/openrc-run +# Copyright 1999-2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-misc/dhcp/files/dhcpd.init5,v 1.1 2011/12/04 22:45:07 vapier Exp $ + +extra_commands="configtest" + +: ${DHCPD_CONF:=/etc/dhcp/${SVCNAME}.conf} + +depend() { + need net + after firewall + use logger dns +} + +get_var() { + local var="$(sed -n 's/^[[:blank:]]\?'"$1"' "*\([^#";]\+\).*/\1/p' "${chroot}${DHCPD_CONF}")" + echo ${var:-$2} +} + +checkconfig() { + set -- ${DHCPD_OPTS} ${chroot:+-chroot} ${chroot} -t + + dhcpd "$@" 1>/dev/null 2>&1 + local ret=$? + if [ ${ret} -ne 0 ] ; then + eerror "${SVCNAME} has detected a syntax error in your configuration files:" + dhcpd "$@" + fi + + return ${ret} +} + +configtest() { + local chroot=${DHCPD_CHROOT%/} + + ebegin "Checking ${SVCNAME} configuration" + checkconfig + eend $? +} + +start() { + local chroot=${DHCPD_CHROOT%/} + + # Work out our cffile if it's in our DHCPD_OPTS + case " ${DHCPD_OPTS} " in + *" -cf "*) + DHCPD_CONF=" ${DHCPD_OPTS} " + DHCPD_CONF="${DHCPD_CONF##* -cf }" + DHCPD_CONF="${DHCPD_CONF%% *}" + ;; + *) DHCPD_OPTS="${DHCPD_OPTS} -cf ${DHCPD_CONF}" + ;; + esac + + if [ -n "${chroot}" ] ; then + # the config test want's these to exist + mkdir -p \ + "${chroot}"/run/dhcp \ + "${chroot}"/var/lib/dhcp \ + "${chroot}"/etc/dhcp + fi + + # see comment in get_var() above + if [ ! -f "${chroot}${DHCPD_CONF}" ] ; then + eerror "${chroot}${DHCPD_CONF} does not exist" + return 1 + fi + + checkconfig || return 1 + + checkpath -d -o dhcp:dhcp "${chroot}"/run/dhcp "${chroot}"/var/lib/dhcp + + local leasefile="$(get_var lease-file-name /var/lib/dhcp/${SVCNAME}.leases)" + checkpath -f -o dhcp:dhcp "${chroot}${leasefile}" + + # Setup LD_PRELOAD so name resolution works in our chroot. + if [ -n "${chroot}" ] ; then + checkpath -d -o root:root -m 755 "${chroot}"/dev "${chroot}"/etc "${chroot}"/proc + cp -pP /etc/localtime /etc/resolv.conf "${chroot}"/etc/ + export LD_PRELOAD="${LD_PRELOAD} libresolv.so libnss_dns.so" + if ! mountinfo -q "${chroot}/proc" ; then + mount --bind /proc "${chroot}/proc" + fi + fi + + local pidfile="$(get_var pid-file-name /run/dhcp/${SVCNAME}.pid)" + + ebegin "Starting ${chroot:+chrooted }${SVCNAME}" + start-stop-daemon --start --exec /usr/sbin/dhcpd \ + --pidfile "${chroot}/${pidfile}" \ + -- ${DHCPD_OPTS} -q -pf "${pidfile}" -lf "${leasefile}" \ + -user dhcp -group dhcp \ + ${chroot:+-chroot} ${chroot} ${DHCPD_IFACE} + eend $? \ + && save_options chroot "${chroot}" \ + && save_options pidfile "${pidfile}" +} + +stop() { + local chroot="$(get_options chroot)" + + ebegin "Stopping ${chroot:+chrooted }${SVCNAME}" + start-stop-daemon --stop --exec /usr/sbin/dhcpd \ + --pidfile "${chroot}/$(get_options pidfile)" + res=$? + + if [ ${res} -eq 0 ] && [ -n "${chroot}" ] ; then + if mountinfo -q "${chroot}/proc" ; then + umount "${chroot}/proc" + fi + fi + + eend $res +} diff --git a/repo/system/efibootmgr.xibuild b/repo/system/efibootmgr/efibootmgr.xibuild index ae58a48..ae58a48 100644 --- a/repo/system/efibootmgr.xibuild +++ b/repo/system/efibootmgr/efibootmgr.xibuild diff --git a/repo/system/efivar.xibuild b/repo/system/efivar/efivar.xibuild index 2b5b666..2b5b666 100644 --- a/repo/system/efivar.xibuild +++ b/repo/system/efivar/efivar.xibuild diff --git a/repo/system/efivar/patches/efivar-fix-format_guid.patch b/repo/system/efivar/patches/efivar-fix-format_guid.patch new file mode 100644 index 0000000..f40942f --- /dev/null +++ b/repo/system/efivar/patches/efivar-fix-format_guid.patch @@ -0,0 +1,56 @@ +From b98ba8921010d03f46704a476c69861515deb1ca Mon Sep 17 00:00:00 2001 +From: Peter Jones <pjones@redhat.com> +Date: Mon, 7 Jan 2019 10:30:59 -0500 +Subject: [PATCH] dp.h: make format_guid() handle misaligned guid pointers + safely. + +GCC 9 adds -Werror=address-of-packed-member, which causes us to see the +build error reported at + https://bugzilla.opensuse.org/show_bug.cgi?id=1120862 . + +That bug report shows us the following: + +In file included from dp.c:26: +dp.h: In function 'format_vendor_helper': +dp.h:120:37: error: taking address of packed member of 'struct <anonymous>' may result in an unaligned pointer value [-Werror=address-of-packed-member] + 120 | format_guid(buf, size, off, label, &dp->hw_vendor.vendor_guid); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +dp.h:74:25: note: in definition of macro 'format_guid' + 74 | _rc = efi_guid_to_str(guid, &_guidstr); \ + | ^~~~ +cc1: all warnings being treated as errors + +This patch makes format_guid() use a local variable as a bounce buffer +in the case that the guid we're passed is aligned as chaotic neutral. + +Note that this only fixes this instance and there may be others that bz +didn't show because it exited too soon, and I don't have a gcc 9 build +in front of me right now. + +Signed-off-by: Peter Jones <pjones@redhat.com> +--- + src/dp.h | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/src/dp.h b/src/dp.h +index aa4e390..20cb608 100644 +--- a/src/dp.h ++++ b/src/dp.h +@@ -70,8 +70,15 @@ + #define format_guid(buf, size, off, dp_type, guid) ({ \ + int _rc; \ + char *_guidstr = NULL; \ +- \ +- _rc = efi_guid_to_str(guid, &_guidstr); \ ++ efi_guid_t _guid; \ ++ const efi_guid_t * const _guid_p = \ ++ likely(__alignof__(guid) == sizeof(guid)) \ ++ ? guid \ ++ : &_guid; \ ++ \ ++ if (unlikely(__alignof__(guid) == sizeof(guid))) \ ++ memmove(&_guid, guid, sizeof(_guid)); \ ++ _rc = efi_guid_to_str(_guid_p, &_guidstr); \ + if (_rc < 0) { \ + efi_error("could not build %s GUID DP string", \ + dp_type); \ diff --git a/repo/system/efivar/patches/efivar-fix-packed.patch b/repo/system/efivar/patches/efivar-fix-packed.patch new file mode 100644 index 0000000..bbb6a99 --- /dev/null +++ b/repo/system/efivar/patches/efivar-fix-packed.patch @@ -0,0 +1,168 @@ +From c3c553db85ff10890209d0fe48fb4856ad68e4e0 Mon Sep 17 00:00:00 2001 +From: Peter Jones <pjones@redhat.com> +Date: Thu, 21 Feb 2019 15:20:12 -0500 +Subject: [PATCH] Fix all the places -Werror=address-of-packed-member catches. + +This gets rid of all the places GCC 9's -Werror=address-of-packed-member +flags as problematic. + +Fixes github issue #123 + +Signed-off-by: Peter Jones <pjones@redhat.com> +--- + src/dp-message.c | 6 ++++-- + src/dp.h | 12 ++++-------- + src/guid.c | 2 +- + src/include/efivar/efivar.h | 2 +- + src/ucs2.h | 27 +++++++++++++++++++-------- + 5 files changed, 29 insertions(+), 20 deletions(-) + +diff --git a/src/dp-message.c b/src/dp-message.c +index 3724e5f..9f96466 100644 +--- a/src/dp-message.c ++++ b/src/dp-message.c +@@ -620,11 +620,13 @@ _format_message_dn(char *buf, size_t size, const_efidp dp) + ) / sizeof(efi_ip_addr_t); + format(buf, size, off, "Dns", "Dns("); + for (int i=0; i < end; i++) { +- const efi_ip_addr_t *addr = &dp->dns.addrs[i]; ++ efi_ip_addr_t addr; ++ ++ memcpy(&addr, &dp->dns.addrs[i], sizeof(addr)); + if (i != 0) + format(buf, size, off, "Dns", ","); + format_ip_addr(buf, size, off, "Dns", +- dp->dns.is_ipv6, addr); ++ dp->dns.is_ipv6, &addr); + } + format(buf, size, off, "Dns", ")"); + break; +diff --git a/src/dp.h b/src/dp.h +index 20cb608..1f921d5 100644 +--- a/src/dp.h ++++ b/src/dp.h +@@ -71,13 +71,9 @@ + int _rc; \ + char *_guidstr = NULL; \ + efi_guid_t _guid; \ +- const efi_guid_t * const _guid_p = \ +- likely(__alignof__(guid) == sizeof(guid)) \ +- ? guid \ +- : &_guid; \ +- \ +- if (unlikely(__alignof__(guid) == sizeof(guid))) \ +- memmove(&_guid, guid, sizeof(_guid)); \ ++ const efi_guid_t * const _guid_p = &_guid; \ ++ \ ++ memmove(&_guid, guid, sizeof(_guid)); \ + _rc = efi_guid_to_str(_guid_p, &_guidstr); \ + if (_rc < 0) { \ + efi_error("could not build %s GUID DP string", \ +@@ -86,7 +82,7 @@ + _guidstr = onstack(_guidstr, \ + strlen(_guidstr)+1); \ + _rc = format(buf, size, off, dp_type, "%s", \ +- _guidstr); \ ++ _guidstr); \ + } \ + _rc; \ + }) +diff --git a/src/guid.c b/src/guid.c +index 306c9ff..3156b3b 100644 +--- a/src/guid.c ++++ b/src/guid.c +@@ -31,7 +31,7 @@ + extern const efi_guid_t efi_guid_zero; + + int NONNULL(1, 2) PUBLIC +-efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b) ++efi_guid_cmp(const void * const a, const void * const b) + { + return memcmp(a, b, sizeof (efi_guid_t)); + } +diff --git a/src/include/efivar/efivar.h b/src/include/efivar/efivar.h +index 316891c..ad6449d 100644 +--- a/src/include/efivar/efivar.h ++++ b/src/include/efivar/efivar.h +@@ -128,7 +128,7 @@ extern int efi_symbol_to_guid(const char *symbol, efi_guid_t *guid) + + extern int efi_guid_is_zero(const efi_guid_t *guid); + extern int efi_guid_is_empty(const efi_guid_t *guid); +-extern int efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b); ++extern int efi_guid_cmp(const void * const a, const void * const b); + + /* import / export functions */ + typedef struct efi_variable efi_variable_t; +diff --git a/src/ucs2.h b/src/ucs2.h +index dbb5900..edd8367 100644 +--- a/src/ucs2.h ++++ b/src/ucs2.h +@@ -23,16 +23,21 @@ + (((val) & ((mask) << (shift))) >> (shift)) + + static inline size_t UNUSED +-ucs2len(const uint16_t * const s, ssize_t limit) ++ucs2len(const void *vs, ssize_t limit) + { + ssize_t i; +- for (i = 0; i < (limit >= 0 ? limit : i+1) && s[i] != (uint16_t)0; i++) ++ const uint16_t *s = vs; ++ const uint8_t *s8 = vs; ++ ++ for (i = 0; ++ i < (limit >= 0 ? limit : i+1) && s8[0] != 0 && s8[1] != 0; ++ i++, s8 += 2, s++) + ; + return i; + } + + static inline size_t UNUSED +-ucs2size(const uint16_t * const s, ssize_t limit) ++ucs2size(const void *s, ssize_t limit) + { + size_t rc = ucs2len(s, limit); + rc *= sizeof (uint16_t); +@@ -69,10 +74,11 @@ utf8size(uint8_t *s, ssize_t limit) + } + + static inline unsigned char * UNUSED +-ucs2_to_utf8(const uint16_t * const chars, ssize_t limit) ++ucs2_to_utf8(const void * const voidchars, ssize_t limit) + { + ssize_t i, j; + unsigned char *ret; ++ const uint16_t * const chars = voidchars; + + if (limit < 0) + limit = ucs2len(chars, -1); +@@ -124,10 +130,12 @@ ucs2_to_utf8(const uint16_t * const chars, ssize_t limit) + } + + static inline ssize_t UNUSED NONNULL(4) +-utf8_to_ucs2(uint16_t *ucs2, ssize_t size, int terminate, uint8_t *utf8) ++utf8_to_ucs2(void *ucs2void, ssize_t size, int terminate, uint8_t *utf8) + { + ssize_t req; + ssize_t i, j; ++ uint16_t *ucs2 = ucs2void; ++ uint16_t val16; + + if (!ucs2 && size > 0) { + errno = EINVAL; +@@ -162,10 +170,13 @@ utf8_to_ucs2(uint16_t *ucs2, ssize_t size, int terminate, uint8_t *utf8) + val = utf8[i] & 0x7f; + i += 1; + } +- ucs2[j] = val; ++ val16 = val; ++ ucs2[j] = val16; ++ } ++ if (terminate) { ++ val16 = 0; ++ ucs2[j++] = val16; + } +- if (terminate) +- ucs2[j++] = (uint16_t)0; + return j; + }; + diff --git a/repo/system/efivar/patches/efivar-fix-ucs2.patch b/repo/system/efivar/patches/efivar-fix-ucs2.patch new file mode 100644 index 0000000..594da61 --- /dev/null +++ b/repo/system/efivar/patches/efivar-fix-ucs2.patch @@ -0,0 +1,59 @@ +From fdb803402fb32fa6d020bac57a40c7efe4aabb7d Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas <javierm@redhat.com> +Date: Tue, 5 Mar 2019 17:23:24 +0100 +Subject: [PATCH] ucs2.h: remove unused variable + +The const uint16_t pointer is not used since now the two bytes of the +UCS-2 chars are checked to know if is the termination of the string. + +Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> +--- + src/ucs2.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/ucs2.h b/src/ucs2.h +index edd8367..e0390c3 100644 +--- a/src/ucs2.h ++++ b/src/ucs2.h +@@ -26,12 +26,11 @@ static inline size_t UNUSED + ucs2len(const void *vs, ssize_t limit) + { + ssize_t i; +- const uint16_t *s = vs; + const uint8_t *s8 = vs; + + for (i = 0; + i < (limit >= 0 ? limit : i+1) && s8[0] != 0 && s8[1] != 0; +- i++, s8 += 2, s++) ++ i++, s8 += 2) + ; + return i; + } +From 4e04afc2df9bbc26e5ab524b53a6f4f1e61d7c9e Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas <javierm@redhat.com> +Date: Tue, 5 Mar 2019 17:23:32 +0100 +Subject: [PATCH] ucs2.h: fix logic that checks for UCS-2 string termination + +Currently the loop to count the lenght of the UCS-2 string ends if either +of the two bytes are 0, but 0 is a valid value for UCS-2 character codes. + +So only break the loop when 0 is the value for both UCS-2 char bytes. + +Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> +--- + src/ucs2.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ucs2.h b/src/ucs2.h +index e0390c3..fd8b056 100644 +--- a/src/ucs2.h ++++ b/src/ucs2.h +@@ -29,7 +29,7 @@ ucs2len(const void *vs, ssize_t limit) + const uint8_t *s8 = vs; + + for (i = 0; +- i < (limit >= 0 ? limit : i+1) && s8[0] != 0 && s8[1] != 0; ++ i < (limit >= 0 ? limit : i+1) && !(s8[0] == 0 && s8[1] == 0); + i++, s8 += 2) + ; + return i; diff --git a/repo/system/efivar/patches/musl-bswap.patch b/repo/system/efivar/patches/musl-bswap.patch new file mode 100644 index 0000000..8b86d9a --- /dev/null +++ b/repo/system/efivar/patches/musl-bswap.patch @@ -0,0 +1,33 @@ +From c9b54ee2cd504542cac4ed95fa7842bd14b39f9c Mon Sep 17 00:00:00 2001 +From: "A. Wilcox" <AWilcox@Wilcox-Tech.com> +Date: Fri, 18 Aug 2017 20:36:03 -0500 +Subject: [PATCH] makeguids: Ensure compatibility with other libcs + +The musl libc does not provide __bswap_constant_XX. +If <endian.h> does not provide these macros, use our own. + +This fixes issue #84. +--- + src/makeguids.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/makeguids.c b/src/makeguids.c +index ec75a86..6b0d80e 100644 +--- a/src/makeguids.c ++++ b/src/makeguids.c +@@ -152,6 +152,15 @@ main(int argc, char *argv[]) + fprintf(symout, "#include <efivar/efivar.h>\n"); + fprintf(symout, "#include <endian.h>\n"); + fprintf(symout, """\n\ ++#ifndef __bswap_constant_16\n\ ++#define __bswap_constant_16(x)\\\n\ ++ ((unsigned short int) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))\n\ ++#endif\n\ ++#ifndef __bswap_constant_32\n\ ++#define __bswap_constant_32(x)\\\n\ ++ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \\\n\ ++ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))\n\ ++#endif\n\ + #if BYTE_ORDER == BIG_ENDIAN\n\ + #define cpu_to_be32(n) (n)\n\ + #define cpu_to_be16(n) (n)\n\ diff --git a/repo/system/elfutils.xibuild b/repo/system/elfutils/elfutils.xibuild index a68827f..a68827f 100644 --- a/repo/system/elfutils.xibuild +++ b/repo/system/elfutils/elfutils.xibuild diff --git a/repo/system/elfutils/files/error.h b/repo/system/elfutils/files/error.h new file mode 100644 index 0000000..ef06827 --- /dev/null +++ b/repo/system/elfutils/files/error.h @@ -0,0 +1,27 @@ +#ifndef _ERROR_H_ +#define _ERROR_H_ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +static unsigned int error_message_count = 0; + +static inline void error(int status, int errnum, const char* format, ...) +{ + va_list ap; + fprintf(stderr, "%s: ", program_invocation_name); + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + if (errnum) + fprintf(stderr, ": %s", strerror(errnum)); + fprintf(stderr, "\n"); + error_message_count++; + if (status) + exit(status); +} + +#endif /* _ERROR_H_ */ diff --git a/repo/system/elfutils/patches/fix-aarch64_fregs.patch b/repo/system/elfutils/patches/fix-aarch64_fregs.patch new file mode 100644 index 0000000..4007416 --- /dev/null +++ b/repo/system/elfutils/patches/fix-aarch64_fregs.patch @@ -0,0 +1,14 @@ +It looks like fregs.vregs[] is an array of double? +Casting to Dwarf_Word instead of & 0xFFFFFFF should do. + +--- a/backends/aarch64_initreg.c 2015-11-27 14:36:29.000000000 +0100 ++++ b/backends/aarch64_initreg.c 2016-08-09 03:47:25.428560159 +0200 +@@ -82,7 +82,7 @@ + + Dwarf_Word dwarf_fregs[32]; + for (int r = 0; r < 32; r++) +- dwarf_fregs[r] = fregs.vregs[r] & 0xFFFFFFFF; ++ dwarf_fregs[r] = (Dwarf_Word)fregs.vregs[r]; + + if (! setfunc (64, 32, dwarf_fregs, arg)) + return false; diff --git a/repo/system/elfutils/patches/fix-uninitialized.patch b/repo/system/elfutils/patches/fix-uninitialized.patch new file mode 100644 index 0000000..31ecd9e --- /dev/null +++ b/repo/system/elfutils/patches/fix-uninitialized.patch @@ -0,0 +1,17 @@ + +--- a/libcpu/i386_disasm.c 2015-08-21 14:22:37.000000000 +0200 ++++ b/libcpu/i386_disasm.c 2015-11-20 06:30:59.250629957 +0100 +@@ -1,4 +1,4 @@ +-/* Disassembler for x86. ++/* Disassembler for x86. + Copyright (C) 2007, 2008, 2009, 2011 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper <drepper@redhat.com>, 2007. +@@ -710,6 +710,7 @@ + + case 'm': + /* Mnemonic. */ ++ str = mnebuf; + + if (unlikely (instrtab[cnt].mnemonic == MNE_INVALID)) + { diff --git a/repo/system/elfutils/patches/musl-asm-ptrace-h.patch b/repo/system/elfutils/patches/musl-asm-ptrace-h.patch new file mode 100644 index 0000000..fc14686 --- /dev/null +++ b/repo/system/elfutils/patches/musl-asm-ptrace-h.patch @@ -0,0 +1,10 @@ +--- a/backends/ppc_initreg.c 2019-11-26 23:48:42.000000000 +0100 ++++ b/backends/ppc_initreg.c 2019-12-08 16:57:58.334872602 +0100 +@@ -32,6 +32,7 @@ + + #include <stdlib.h> + #if defined(__powerpc__) && defined(__linux__) ++# include <asm/ptrace.h> + # include <sys/ptrace.h> + # include <sys/user.h> + #endif diff --git a/repo/system/elfutils/patches/musl-macros.patch b/repo/system/elfutils/patches/musl-macros.patch new file mode 100644 index 0000000..0d7ec41 --- /dev/null +++ b/repo/system/elfutils/patches/musl-macros.patch @@ -0,0 +1,87 @@ +--- a/src/arlib.h 2015-08-21 14:22:37.000000000 +0200 ++++ b/src/arlib.h 2015-11-20 08:02:55.153199611 +0100 +@@ -29,6 +29,16 @@ + #include <stdint.h> + #include <sys/types.h> + ++#if !defined(ACCESSPERMS) ++# define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ ++#endif ++#if !defined(ALLPERMS) ++# define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) /* 07777 */ ++#endif ++#if !defined(DEFFILEMODE) ++# define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666*/ ++#endif ++ + + /* State of -D/-U flags. */ + extern bool arlib_deterministic_output; +--- a/src/elfcompress.c.orig 2016-04-02 12:51:26.903848894 +0200 ++++ b/src/elfcompress.c 2016-04-02 12:55:15.076996338 +0200 +@@ -35,6 +35,14 @@ + #include <gelf.h> + #include "system.h" + ++#if !defined(FNM_EXTMATCH) ++# define FNM_EXTMATCH 0 ++#endif ++ ++#if !defined(ALLPERMS) ++# define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) /* 07777 */ ++#endif ++ + /* Name and version of program. */ + static void print_version (FILE *stream, struct argp_state *state); + ARGP_PROGRAM_VERSION_HOOK_DEF = print_version; +diff --git a/lib/libeu.h b/lib/libeu.h +index 69fe3d7..e5c99b8 100644 +--- a/lib/libeu.h ++++ b/lib/libeu.h +@@ -31,6 +31,27 @@ + + #include <stddef.h> + #include <stdint.h> ++#include <unistd.h> ++#include <alloca.h> ++#include <string.h> ++ ++#ifndef TEMP_FAILURE_RETRY ++#define TEMP_FAILURE_RETRY(expression) \ ++ (__extension__ \ ++ ({ long int __result; \ ++ do __result = (long int) (expression); \ ++ while (__result == -1L && errno == EINTR); \ ++ __result; })) ++#endif ++ ++#ifndef strndupa ++#define strndupa(s, n) \ ++ (__extension__ ({const char *__in = (s); \ ++ size_t __len = strnlen (__in, (n)) + 1; \ ++ char *__out = (char *) alloca (__len); \ ++ __out[__len-1] = '\0'; \ ++ (char *) memcpy (__out, __in, __len-1);})) ++#endif + + extern void *xmalloc (size_t) __attribute__ ((__malloc__)); + extern void *xcalloc (size_t, size_t) __attribute__ ((__malloc__)); +diff --git a/src/strip.c b/src/strip.c +index 48792a7..d2f0c60 100644 +--- a/src/strip.c ++++ b/src/strip.c +@@ -46,6 +46,14 @@ + #include <system.h> + #include <printversion.h> + ++#if !defined(FNM_EXTMATCH) ++# define FNM_EXTMATCH 0 ++#endif ++ ++#if !defined(ACCESSPERMS) ++#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) ++#endif ++ + typedef uint8_t GElf_Byte; + + /* Name and version of program. */ diff --git a/repo/system/elfutils/patches/musl-strndupa.patch b/repo/system/elfutils/patches/musl-strndupa.patch new file mode 100644 index 0000000..a520688 --- /dev/null +++ b/repo/system/elfutils/patches/musl-strndupa.patch @@ -0,0 +1,18 @@ +--- a/src/unstrip.c.orig 2017-04-27 14:26:26.000000000 +0000 ++++ b/src/unstrip.c 2017-05-05 15:51:33.515154220 +0000 +@@ -56,6 +56,15 @@ + # define _(str) gettext (str) + #endif + ++#ifndef strndupa ++#define strndupa(s, n) \ ++ (__extension__ ({const char *__in = (s); \ ++ size_t __len = strnlen (__in, (n)) + 1; \ ++ char *__out = (char *) alloca (__len); \ ++ __out[__len-1] = '\0'; \ ++ (char *) memcpy (__out, __in, __len-1);})) ++#endif ++ + /* Name and version of program. */ + ARGP_PROGRAM_VERSION_HOOK_DEF = print_version; + diff --git a/repo/system/elogind/elogind.initd b/repo/system/elogind/elogind.initd new file mode 100644 index 0000000..0c22ca9 --- /dev/null +++ b/repo/system/elogind/elogind.initd @@ -0,0 +1,23 @@ +#!/sbin/openrc-run +supervisor=supervise-daemon + +name="System login manager" +description="System service that manages user logins" +description_reload="Reload configuration without exiting" + +command=/usr/libexec/elogind/elogind + +depend() { + need dbus + + # Make sure we start before any other display manager + before display-manager +} + +extra_started_commands="reload" + +reload() { + ebegin "Reloading configuration" + $supervisor $RC_SVCNAME --signal HUP + eend $? +} diff --git a/repo/system/elogind.xibuild b/repo/system/elogind/elogind.xibuild index c5f1774..c5f1774 100644 --- a/repo/system/elogind.xibuild +++ b/repo/system/elogind/elogind.xibuild diff --git a/repo/system/elogind/id-nobody.patch b/repo/system/elogind/id-nobody.patch new file mode 100644 index 0000000..5e9e5cd --- /dev/null +++ b/repo/system/elogind/id-nobody.patch @@ -0,0 +1,13 @@ +--- a/src/basic/user-util.h ++++ b/src/basic/user-util.h +@@ -70,8 +70,8 @@ int take_etc_passwd_lock(const char *root); + #define UID_INVALID ((uid_t) -1) + #define GID_INVALID ((gid_t) -1) + +-#define UID_NOBODY ((uid_t) 65534U) +-#define GID_NOBODY ((gid_t) 65534U) ++#define UID_NOBODY ((uid_t) 99U) ++#define GID_NOBODY ((gid_t) 99U) + + #define ETC_PASSWD_LOCK_PATH "/etc/.pwd.lock" + diff --git a/repo/system/elogind/mips.patch b/repo/system/elogind/mips.patch new file mode 100644 index 0000000..ca1c097 --- /dev/null +++ b/repo/system/elogind/mips.patch @@ -0,0 +1,11 @@ +--- a/src/basic/missing_syscall.h 2021-01-15 08:12:02.000000000 +0100 ++++ b/src/basic/missing_syscall.h 2021-02-24 07:20:32.026355819 +0100 +@@ -11,7 +11,7 @@ + #include <sys/wait.h> + #include <unistd.h> + +-#ifdef ARCH_MIPS ++#if defined(_MIPSEL) || defined(_MIPSEB) + #include <asm/sgidefs.h> + #endif + diff --git a/repo/system/elogind/ppc64-bad-tuple.patch b/repo/system/elogind/ppc64-bad-tuple.patch new file mode 100644 index 0000000..f6237ff --- /dev/null +++ b/repo/system/elogind/ppc64-bad-tuple.patch @@ -0,0 +1,25 @@ +From 0ce8ef86e8bfc872b40bc090fea9873fa1f51836 Mon Sep 17 00:00:00 2001 +From: q66 <daniel@octaforge.org> +Date: Thu, 21 Jan 2021 22:22:28 +0100 +Subject: [PATCH] fix ppc64 arch tuple + +--- + src/basic/architecture.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git src/basic/architecture.h src/basic/architecture.h +index 620b522..3ea6e52 100644 +--- a/src/basic/architecture.h ++++ b/src/basic/architecture.h +@@ -77,7 +77,7 @@ int uname_architecture(void); + #elif defined(__powerpc64__) + # if __BYTE_ORDER == __BIG_ENDIAN + # define native_architecture() ARCHITECTURE_PPC64 +-# define LIB_ARCH_TUPLE "ppc64-linux-gnu" ++# define LIB_ARCH_TUPLE "powerpc64-linux-gnu" + # define SECONDARY_ARCHITECTURE ARCHITECTURE_PPC + # else + # define native_architecture() ARCHITECTURE_PPC64_LE +-- +2.30.0 + diff --git a/repo/system/elogind/ppcle.patch b/repo/system/elogind/ppcle.patch new file mode 100644 index 0000000..b986b0f --- /dev/null +++ b/repo/system/elogind/ppcle.patch @@ -0,0 +1,25 @@ +From 836f3efb84a703b3594906572a54616d25cecf5e Mon Sep 17 00:00:00 2001 +From: q66 <daniel@octaforge.org> +Date: Thu, 21 Jan 2021 21:59:12 +0100 +Subject: [PATCH] add ppcle arch tuple + +--- + src/basic/architecture.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git src/basic/architecture.h src/basic/architecture.h +index 620b522..afdff7a 100644 +--- a/src/basic/architecture.h ++++ b/src/basic/architecture.h +@@ -94,7 +94,7 @@ int uname_architecture(void); + # endif + # else + # define native_architecture() ARCHITECTURE_PPC_LE +-# error "Missing LIB_ARCH_TUPLE for PPCLE" ++# define LIB_ARCH_TUPLE "powerpcle-linux-gnu" + # endif + #elif defined(__ia64__) + # define native_architecture() ARCHITECTURE_IA64 +-- +2.30.0 + diff --git a/repo/system/eudev/default-rules.patch b/repo/system/eudev/default-rules.patch new file mode 100644 index 0000000..0786a98 --- /dev/null +++ b/repo/system/eudev/default-rules.patch @@ -0,0 +1,9 @@ +--- a/rules/50-udev-default.rules ++++ b/rules/50-udev-default.rules +@@ -73,5 +73,6 @@ KERNEL=="rfkill", MODE="0664" + KERNEL=="tun", MODE="0666", OPTIONS+="static_node=net/tun" + + KERNEL=="fuse", MODE="0666", OPTIONS+="static_node=fuse" ++KERNEL=="kvm", GROUP="kvm", MODE="0660" + + LABEL="default_end" diff --git a/repo/system/eudev.xibuild b/repo/system/eudev/eudev.xibuild index 983d112..983d112 100644 --- a/repo/system/eudev.xibuild +++ b/repo/system/eudev/eudev.xibuild diff --git a/repo/system/eudev/load-fbcon.patch b/repo/system/eudev/load-fbcon.patch new file mode 100644 index 0000000..e5e404a --- /dev/null +++ b/repo/system/eudev/load-fbcon.patch @@ -0,0 +1,10 @@ +--- eudev-3.2.1/rules/80-drivers.rules.orig 2017-01-24 11:00:53.174192908 +0200 ++++ eudev-3.2.1/rules/80-drivers.rules 2017-01-24 11:04:01.886714118 +0200 +@@ -8,6 +8,7 @@ + SUBSYSTEM=="memstick", RUN{builtin}+="kmod load ms_block mspro_block" + SUBSYSTEM=="i2o", RUN{builtin}+="kmod load i2o_block" + SUBSYSTEM=="module", KERNEL=="parport_pc", RUN{builtin}+="kmod load ppdev" ++SUBSYSTEM=="graphics", RUN{builtin}+="kmod load fbcon" + KERNEL=="mtd*ro", ENV{MTD_FTL}=="smartmedia", RUN{builtin}+="kmod load sm_ftl" + + LABEL="drivers_end" diff --git a/repo/system/eudev/udev.initd b/repo/system/eudev/udev.initd new file mode 100644 index 0000000..5ce2354 --- /dev/null +++ b/repo/system/eudev/udev.initd @@ -0,0 +1,22 @@ +#!/sbin/openrc-run + +start () { + # Start the udev daemon to continually watch for, and act on, + # uevents + /sbin/udevd --daemon + + # Now traverse /sys in order to "coldplug" devices that have + # already been discovered + /sbin/udevadm trigger --action=add --type=subsystems + /sbin/udevadm trigger --action=add --type=devices + /sbin/udevadm trigger --action=change --type=devices + + # Now wait for udevd to process the uevents we triggered + if ! is_true "$OMIT_UDEV_SETTLE"; then + /sbin/udevadm settle + fi + + # If any LVM based partitions are on the system, ensure they + # are activated so they can be used. + if [ -x /sbin/vgchange ]; then /sbin/vgchange -a y >/dev/null; fi +} diff --git a/repo/system/eudev/udev_retry.initd b/repo/system/eudev/udev_retry.initd new file mode 100644 index 0000000..cfe077c --- /dev/null +++ b/repo/system/eudev/udev_retry.initd @@ -0,0 +1,31 @@ +#!/sbin/openrc-run +start () { + echo "Retrying failed uevents, if any..." + + # As of udev-186, the --run option is no longer valid + #rundir=$(/sbin/udevadm info --run) + rundir=/run/udev + # From Debian: "copy the rules generated before / was mounted + # read-write": + + for file in ${rundir}/tmp-rules--*; do + dest=${file##*tmp-rules--} + [ "$dest" = '*' ] && break + cat $file >> /etc/udev/rules.d/$dest + rm -f $file + done + + # Re-trigger the uevents that may have failed, + # in hope they will succeed now + /bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \ + while read line ; do + for subsystem in $line ; do + /sbin/udevadm trigger --subsystem-match=$subsystem --action=add + done + done + + # Now wait for udevd to process the uevents we triggered + if ! is_true "$OMIT_UDEV_RETRY_SETTLE"; then + /sbin/udevadm settle + fi +} diff --git a/repo/system/execline.xibuild b/repo/system/execline/execline.xibuild index 61d3e57..61d3e57 100644 --- a/repo/system/execline.xibuild +++ b/repo/system/execline/execline.xibuild diff --git a/repo/system/expat.xibuild b/repo/system/expat/expat.xibuild index d921e1b..d921e1b 100644 --- a/repo/system/expat.xibuild +++ b/repo/system/expat/expat.xibuild diff --git a/repo/system/findutils.xibuild b/repo/system/findutils/findutils.xibuild index 1dbc9d3..1dbc9d3 100644 --- a/repo/system/findutils.xibuild +++ b/repo/system/findutils/findutils.xibuild diff --git a/repo/system/freetype2.xibuild b/repo/system/freetype2/freetype2.xibuild index b4a2571..b4a2571 100644 --- a/repo/system/freetype2.xibuild +++ b/repo/system/freetype2/freetype2.xibuild diff --git a/repo/system/fribidi.xibuild b/repo/system/fribidi/fribidi.xibuild index ec3ea83..ec3ea83 100644 --- a/repo/system/fribidi.xibuild +++ b/repo/system/fribidi/fribidi.xibuild diff --git a/repo/system/gc.xibuild b/repo/system/gc/gc.xibuild index bde408f..bde408f 100644 --- a/repo/system/gc.xibuild +++ b/repo/system/gc/gc.xibuild diff --git a/repo/system/gdbm.xibuild b/repo/system/gdbm/gdbm.xibuild index 3906bbb..3906bbb 100644 --- a/repo/system/gdbm.xibuild +++ b/repo/system/gdbm/gdbm.xibuild diff --git a/repo/system/gettext.xibuild b/repo/system/gettext/gettext.xibuild index 11b6754..11b6754 100644 --- a/repo/system/gettext.xibuild +++ b/repo/system/gettext/gettext.xibuild diff --git a/repo/system/glew/glew.patch b/repo/system/glew/glew.patch new file mode 100644 index 0000000..61c4447 --- /dev/null +++ b/repo/system/glew/glew.patch @@ -0,0 +1,34 @@ +Fixes pkg-config file to have correct system libdir. + +diff -aur glew-2.2.0/Makefile glew-2.2.0-alpine/Makefile +--- glew-2.2.0/Makefile 2020-03-15 11:53:59.000000000 +0000 ++++ glew-2.2.0-alpine/Makefile 2022-01-28 02:42:23.773580331 +0000 +@@ -144,7 +144,7 @@ + glew.pc: glew.pc.in + sed \ + -e "s|@prefix@|$(GLEW_PREFIX)|g" \ +- -e "s|@libdir@|$(LIBDIR)|g" \ ++ -e "s|@libdir@|/usr/lib|g" \ + -e "s|@exec_prefix@|$(BINDIR)|g" \ + -e "s|@includedir@|$(INCDIR)|g" \ + -e "s|@version@|$(GLEW_VERSION)|g" \ + +diff -aur glew-2.2.0/config/Makefile.linux glew-2.2.0-alpine/config/Makefile.linux +--- glew-2.2.0/config/Makefile.linux 2020-03-15 11:53:59.000000000 +0000 ++++ glew-2.2.0-alpine/config/Makefile.linux 2022-01-28 02:43:26.813582486 +0000 +@@ -12,13 +12,8 @@ + ifeq (e2k,${M_ARCH}) + ARCH64 = true + endif +-ifeq (${ARCH64},true) +- LDFLAGS.EXTRA = -L/usr/X11R6/lib64 -L/usr/lib64 +- LIBDIR = $(GLEW_DEST)/lib64 +-else +- LDFLAGS.EXTRA = -L/usr/X11R6/lib -L/usr/lib +- LIBDIR = $(GLEW_DEST)/lib +-endif ++LDFLAGS.EXTRA = -L/usr/X11R6/lib -L/usr/lib ++LIBDIR = $(GLEW_DEST)/lib + LDFLAGS.GL = -lGL -lX11 + LDFLAGS.STATIC = -Wl,-Bstatic + LDFLAGS.DYNAMIC = -Wl,-Bdynamic diff --git a/repo/system/glew.xibuild b/repo/system/glew/glew.xibuild index 7ad27fe..7ad27fe 100644 --- a/repo/system/glew.xibuild +++ b/repo/system/glew/glew.xibuild diff --git a/repo/system/glib/0001-gquark-fix-initialization-with-c-constructors.patch b/repo/system/glib/0001-gquark-fix-initialization-with-c-constructors.patch new file mode 100644 index 0000000..50a9a8c --- /dev/null +++ b/repo/system/glib/0001-gquark-fix-initialization-with-c-constructors.patch @@ -0,0 +1,47 @@ +From e4216dee57f5156e192b2910f13eb855a104cb18 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Wed, 6 Jul 2016 12:38:40 +0200 +Subject: [PATCH] gquark: fix initialization with c++ constructors + +C++ constructors may want create new quarks, but we can not guarantee +that the glib library ctor is executed first. Therefore we make sure +that quarks are always initialized from g_quark_from_string and +g_quark_from_static_string + +This fixes crashes in glibmm with musl which likely happens on AIX too. + +https://bugzilla.gnome.org/show_bug.cgi?id=768215 +https://bugzilla.gnome.org/show_bug.cgi?id=756139#c14 +--- + glib/gquark.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/glib/gquark.c b/glib/gquark.c +index 9e51a92..17ecd7f 100644 +--- a/glib/gquark.c ++++ b/glib/gquark.c +@@ -57,6 +57,11 @@ static gint quark_block_offset = 0; + void + g_quark_init (void) + { ++ /* we may be initialized from c++ constructor or the glib ctor, but we ++ cannot guarantee in what order. So we check if we have been initialized */ ++ if (quark_ht != NULL) ++ return; ++ + g_assert (quark_seq_id == 0); + quark_ht = g_hash_table_new (g_str_hash, g_str_equal); + quarks = g_new (gchar*, QUARK_BLOCK_SIZE); +@@ -179,6 +184,9 @@ quark_from_string (const gchar *string, + { + GQuark quark = 0; + ++ if (G_UNLIKELY (quark_ht == NULL)) ++ g_quark_init(); ++ + quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string)); + + if (!quark) +-- +2.9.0 + diff --git a/repo/system/glib/deprecated-no-warn.patch b/repo/system/glib/deprecated-no-warn.patch new file mode 100644 index 0000000..e247eca --- /dev/null +++ b/repo/system/glib/deprecated-no-warn.patch @@ -0,0 +1,23 @@ +diff -Naur a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c +--- a/gio/glib-compile-schemas.c 2018-09-21 15:23:52.000000000 +0100 ++++ b/gio/glib-compile-schemas.c 2019-02-10 14:37:30.034879344 +0000 +@@ -1233,19 +1233,6 @@ + return; + } + +- if (path && (g_str_has_prefix (path, "/apps/") || +- g_str_has_prefix (path, "/desktop/") || +- g_str_has_prefix (path, "/system/"))) +- { +- gchar *message = NULL; +- message = g_strdup_printf (_("Warning: Schema “%s” has path “%s”. " +- "Paths starting with " +- "“/apps/”, “/desktop/” or “/system/” are deprecated."), +- id, path); +- g_printerr ("%s\n", message); +- g_free (message); +- } +- + state->schema_state = schema_state_new (path, gettext_domain, + extends, extends_name, list_of); + diff --git a/repo/system/glib.xibuild b/repo/system/glib/glib.xibuild index 870e600..870e600 100644 --- a/repo/system/glib.xibuild +++ b/repo/system/glib/glib.xibuild diff --git a/repo/system/glib/musl-libintl.patch b/repo/system/glib/musl-libintl.patch new file mode 100644 index 0000000..a673800 --- /dev/null +++ b/repo/system/glib/musl-libintl.patch @@ -0,0 +1,22 @@ +diff --git a/meson.build b/meson.build +index 319f183..3a5fdfc 100644 +--- a/meson.build ++++ b/meson.build +@@ -2047,9 +2047,6 @@ endif + # FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible + # implementations. This could be extended if issues are found in some platforms. + libintl_deps = [] +-if cc.has_function('ngettext') +- have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset') +-else + # First just find the bare library. + libintl = cc.find_library('intl', required : false) + # The bare library probably won't link without help if it's static. +@@ -2081,7 +2078,6 @@ else + have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', args : osx_ldflags, + dependencies : libintl_deps) + endif +-endif + + glib_conf.set('HAVE_BIND_TEXTDOMAIN_CODESET', have_bind_textdomain_codeset) + diff --git a/repo/system/glm/fix-endian-test.patch b/repo/system/glm/fix-endian-test.patch new file mode 100644 index 0000000..ba2cce4 --- /dev/null +++ b/repo/system/glm/fix-endian-test.patch @@ -0,0 +1,30 @@ +diff --git a/test/gtc/gtc_packing.cpp b/test/gtc/gtc_packing.cpp +index 5830999..86167c5 100644 +--- a/test/gtc/gtc_packing.cpp ++++ b/test/gtc/gtc_packing.cpp +@@ -5,6 +5,8 @@ + #include <cstdio> + #include <vector> + ++#include <endian.h> ++ + void print_bits(float const& s) + { + union +@@ -154,6 +156,7 @@ int test_U3x10_1x2() + Error += glm::all(glm::equal(v0, v1)) ? 0 : 1; + } + ++#if BYTE_ORDER == LITTLE_ENDIAN + glm::u8vec4 const v0(0xff, 0x77, 0x0, 0x33); + glm::uint32 const p0 = *reinterpret_cast<glm::uint32 const*>(&v0[0]); + glm::uint32 const r0 = 0x330077ff; +@@ -165,7 +168,7 @@ int test_U3x10_1x2() + glm::uint32 const r1 = 0xc001dcff; + + Error += p1 == r1 ? 0 : 1; +- ++#endif + return Error; + } + diff --git a/repo/system/glm/glm.pc b/repo/system/glm/glm.pc new file mode 100644 index 0000000..e3bb5ac --- /dev/null +++ b/repo/system/glm/glm.pc @@ -0,0 +1,7 @@ +prefix=/usr +includedir=${prefix}/include + +Name: GLM +Description: OpenGL Mathematics +Version: 0.9.9 +Cflags: -I${includedir} diff --git a/repo/system/glm.xibuild b/repo/system/glm/glm.xibuild index cd918c3..cd918c3 100644 --- a/repo/system/glm.xibuild +++ b/repo/system/glm/glm.xibuild diff --git a/repo/system/glu.xibuild b/repo/system/glu/glu.xibuild index 54249a7..54249a7 100644 --- a/repo/system/glu.xibuild +++ b/repo/system/glu/glu.xibuild diff --git a/repo/system/gmp.xibuild b/repo/system/gmp/gmp.xibuild index 0bfd3f4..0bfd3f4 100644 --- a/repo/system/gmp.xibuild +++ b/repo/system/gmp/gmp.xibuild diff --git a/repo/system/gnutls.xibuild b/repo/system/gnutls/gnutls.xibuild index 20160e4..20160e4 100644 --- a/repo/system/gnutls.xibuild +++ b/repo/system/gnutls/gnutls.xibuild diff --git a/repo/system/gobject-introspection.xibuild b/repo/system/gobject-introspection/gobject-introspection.xibuild index 5d5a117..5d5a117 100644 --- a/repo/system/gobject-introspection.xibuild +++ b/repo/system/gobject-introspection/gobject-introspection.xibuild diff --git a/repo/system/gobject-introspection/musl-time64.patch b/repo/system/gobject-introspection/musl-time64.patch new file mode 100644 index 0000000..9990efd --- /dev/null +++ b/repo/system/gobject-introspection/musl-time64.patch @@ -0,0 +1,37 @@ +--- a/giscanner/ast.py 2022-03-18 11:54:42.318927500 +0000 ++++ b/giscanner/ast.py 2022-03-18 11:54:42.318927500 +0000 +@@ -346,7 +346,7 @@ + type_names['ssize_t'] = type_names['gssize'] + type_names['uintptr_t'] = type_names['guintptr'] + type_names['intptr_t'] = type_names['gintptr'] +-type_names['time_t'] = TYPE_LONG ++type_names['time_t'] = TYPE_INT64 + type_names['off_t'] = type_names['gsize'] + type_names['pid_t'] = TYPE_INT + type_names['uid_t'] = TYPE_UINT +--- a/tests/scanner/Regress-1.0-expected.gir 2022-03-18 11:54:42.318927500 +0000 ++++ b/tests/scanner/Regress-1.0-expected.gir 2022-03-18 11:54:42.318927500 +0000 +@@ -2023,7 +2023,7 @@ + <type name="FooObject" c:type="RegressFooObject*"/> + </instance-parameter> + <parameter name="time" transfer-ownership="none"> +- <type name="glong" c:type="time_t"/> ++ <type name="gint64" c:type="time_t"/> + </parameter> + </parameters> + </method> +@@ -8569,7 +8569,7 @@ + <function name="test_timet" c:identifier="regress_test_timet"> + <source-position filename="regress.h" line="94"/> + <return-value transfer-ownership="none"> +- <type name="glong" c:type="time_t"/> ++ <type name="gint64" c:type="time_t"/> + </return-value> + <parameters> + <parameter name="in" transfer-ownership="none"> +@@ -8576,4 +8576,4 @@ +- <type name="glong" c:type="time_t"/> ++ <type name="gint64" c:type="time_t"/> + </parameter> + </parameters> + </function> diff --git a/repo/system/gperf.xibuild b/repo/system/gperf/gperf.xibuild index eebb471..eebb471 100644 --- a/repo/system/gperf.xibuild +++ b/repo/system/gperf/gperf.xibuild diff --git a/repo/system/grub.xibuild b/repo/system/grub/grub.xibuild index 343c07e..343c07e 100644 --- a/repo/system/grub.xibuild +++ b/repo/system/grub/grub.xibuild diff --git a/repo/system/guile.xibuild b/repo/system/guile/guile.xibuild index 5873f37..5873f37 100644 --- a/repo/system/guile.xibuild +++ b/repo/system/guile/guile.xibuild diff --git a/repo/system/gzip.xibuild b/repo/system/gzip/gzip.xibuild index 8e3c78a..8e3c78a 100644 --- a/repo/system/gzip.xibuild +++ b/repo/system/gzip/gzip.xibuild diff --git a/repo/system/hwids.xibuild b/repo/system/hwids/hwids.xibuild index 1cd6827..1cd6827 100644 --- a/repo/system/hwids.xibuild +++ b/repo/system/hwids/hwids.xibuild diff --git a/repo/system/iana-etc.xibuild b/repo/system/iana-etc/iana-etc.xibuild index 812ed14..812ed14 100644 --- a/repo/system/iana-etc.xibuild +++ b/repo/system/iana-etc/iana-etc.xibuild diff --git a/repo/system/icu/fix-ucptrietest-golden-diff.patch b/repo/system/icu/fix-ucptrietest-golden-diff.patch new file mode 100644 index 0000000..1b8082e --- /dev/null +++ b/repo/system/icu/fix-ucptrietest-golden-diff.patch @@ -0,0 +1,33 @@ +Patch-Source: https://github.com/unicode-org/icu/pull/1925 +Subject: [PATCH] ICU-21793 Fix ucptrietest golden diff + +diff --git a/icu4c/source/tools/toolutil/toolutil.cpp b/icu4c/source/tools/toolutil/toolutil.cpp +index 1fc68aa69c8..a9dc37377a8 100644 +--- a/tools/toolutil/toolutil.cpp ++++ b/tools/toolutil/toolutil.cpp +@@ -228,18 +228,19 @@ uprv_compareGoldenFiles( + std::ifstream ifs(goldenFilePath, std::ifstream::in); + int32_t pos = 0; + char c; +- while ((c = ifs.get()) != std::char_traits<char>::eof() && pos < bufferLen) { ++ while (ifs.get(c) && pos < bufferLen) { + if (c != buffer[pos]) { + // Files differ at this position +- return pos; ++ break; + } + pos++; + } +- if (pos < bufferLen || c != std::char_traits<char>::eof()) { +- // Files are different lengths +- return pos; ++ if (pos == bufferLen && ifs.eof()) { ++ // Files are same lengths ++ pos = -1; + } +- return -1; ++ ifs.close(); ++ return pos; + } + + /*U_CAPI UDate U_EXPORT2 diff --git a/repo/system/icu.xibuild b/repo/system/icu/icu.xibuild index 0d8d798..0d8d798 100644 --- a/repo/system/icu.xibuild +++ b/repo/system/icu/icu.xibuild diff --git a/repo/system/imlib2.xibuild b/repo/system/imlib2/imlib2.xibuild index 9ed5b15..9ed5b15 100644 --- a/repo/system/imlib2.xibuild +++ b/repo/system/imlib2/imlib2.xibuild diff --git a/repo/system/intltool.xibuild b/repo/system/intltool/intltool.xibuild index aee502e..aee502e 100644 --- a/repo/system/intltool.xibuild +++ b/repo/system/intltool/intltool.xibuild diff --git a/repo/system/jansson.xibuild b/repo/system/jansson/jansson.xibuild index 9f82843..9f82843 100644 --- a/repo/system/jansson.xibuild +++ b/repo/system/jansson/jansson.xibuild diff --git a/repo/system/js78.xibuild b/repo/system/js78/js78.xibuild index 199740a..199740a 100644 --- a/repo/system/js78.xibuild +++ b/repo/system/js78/js78.xibuild diff --git a/repo/system/js78/patches/disable-jslint.patch b/repo/system/js78/patches/disable-jslint.patch new file mode 100644 index 0000000..04a8b3e --- /dev/null +++ b/repo/system/js78/patches/disable-jslint.patch @@ -0,0 +1,17 @@ +--- a/js/src/build/moz.build ++++ b/js/src/build/moz.build +@@ -80,14 +80,3 @@ + NO_EXPAND_LIBS = True + + DIST_INSTALL = True +- +-# Run SpiderMonkey style checker after linking the static library. This avoids +-# running the script for no-op builds. +-GeneratedFile( +- 'spidermonkey_checks', script='/config/run_spidermonkey_checks.py', +- inputs=[ +- '!%sjs_static.%s' % (CONFIG['LIB_PREFIX'], CONFIG['LIB_SUFFIX']), +- '/config/check_spidermonkey_style.py', +- '/config/check_macroassembler_style.py', +- '/config/check_js_opcode.py' +- ]) diff --git a/repo/system/js78/patches/fd6847c9416f9eebde636e21d794d25d1be8791d.patch b/repo/system/js78/patches/fd6847c9416f9eebde636e21d794d25d1be8791d.patch new file mode 100644 index 0000000..1af68d9 --- /dev/null +++ b/repo/system/js78/patches/fd6847c9416f9eebde636e21d794d25d1be8791d.patch @@ -0,0 +1,37 @@ +See https://bugzilla.mozilla.org/show_bug.cgi?id=1539739 + +From fd6847c9416f9eebde636e21d794d25d1be8791d Mon Sep 17 00:00:00 2001 +From: Mike Hommey <mh@glandium.org> +Date: Sat, 1 Jun 2019 09:06:01 +0900 +Subject: [PATCH] Bug 1526653 - Include struct definitions for user_vfp and + user_vfp_exc. + +--- + js/src/wasm/WasmSignalHandlers.cpp | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/js/src/wasm/WasmSignalHandlers.cpp b/js/src/wasm/WasmSignalHandlers.cpp +index 636537f8478..383c380f04c 100644 +--- a/js/src/wasm/WasmSignalHandlers.cpp ++++ b/js/src/wasm/WasmSignalHandlers.cpp +@@ -248,7 +248,16 @@ using mozilla::DebugOnly; + #endif + + #ifdef WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS +-# include <sys/user.h> ++struct user_vfp { ++ unsigned long long fpregs[32]; ++ unsigned long fpscr; ++}; ++ ++struct user_vfp_exc { ++ unsigned long fpexc; ++ unsigned long fpinst; ++ unsigned long fpinst2; ++}; + #endif + + #if defined(ANDROID) +-- +2.20.1 + diff --git a/repo/system/js78/patches/fix-musl-build.patch b/repo/system/js78/patches/fix-musl-build.patch new file mode 100644 index 0000000..af39467 --- /dev/null +++ b/repo/system/js78/patches/fix-musl-build.patch @@ -0,0 +1,16 @@ +Upstream: No +Reason: mozjs60 miscompiles on musl if built with HAVE_THREAD_TLS_KEYWORD: +https://github.com/void-linux/void-packages/issues/2598 +diff --git a/js/src/old-configure.in b/js/src/old-configure.in +--- a/js/src/old-configure.in ++++ b/js/src/old-configure.in +@@ -1272,6 +1272,9 @@ + *-android*|*-linuxandroid*) + : + ;; ++ *-musl*) ++ : ++ ;; + *) + AC_DEFINE(HAVE_THREAD_TLS_KEYWORD) + ;; diff --git a/repo/system/js78/patches/fix-python3.10-compilation.patch b/repo/system/js78/patches/fix-python3.10-compilation.patch new file mode 100644 index 0000000..4473d9b --- /dev/null +++ b/repo/system/js78/patches/fix-python3.10-compilation.patch @@ -0,0 +1,312 @@ +#https://src.fedoraproject.org/rpms/mozjs78/blob/rawhide/f/Fixup-compatibility-of-mozbuild-with-Python-3.10.patch + +m a88d0c8e27b48344942187c2611bb121bde9332d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Franti=C5=A1ek=20Zatloukal?= <fzatlouk@redhat.com> +Date: Tue, 13 Jul 2021 11:46:20 +0200 +Subject: [PATCH] Fixup compatibility of mozbuild with Python 3.10 + +--- + python/mach/mach/config.py | 4 ++-- + python/mach/mach/main.py | 4 ++-- + python/mach/mach/decorators.py | 2 +- + python/mozbuild/mozbuild/backend/configenvironment.py | 3 ++- + python/mozbuild/mozbuild/makeutil.py | 2 +- + python/mozbuild/mozbuild/util.py | 2 +- + testing/marionette/client/marionette_driver/wait.py | 2 +- + testing/mozbase/manifestparser/manifestparser/filters.py | 3 ++- + testing/mozbase/versioninfo.py | 2 +- + testing/web-platform/tests/tools/manifest/vcs.py | 2 +- + .../web-platform/tests/tools/third_party/h2/h2/settings.py | 2 +- + .../tests/tools/third_party/html5lib/html5lib/_trie/_base.py | 2 +- + .../tools/third_party/html5lib/html5lib/treebuilders/dom.py | 2 +- + .../tests/tools/third_party/hyper/hyper/common/headers.py | 2 +- + .../tests/tools/third_party/hyper/hyper/h2/settings.py | 2 +- + .../tests/tools/third_party/hyper/hyper/http11/connection.py | 4 ++-- + .../third_party/hyper/hyper/packages/hyperframe/flags.py | 2 +- + .../tests/tools/third_party/hyperframe/hyperframe/flags.py | 2 +- + testing/web-platform/tests/tools/wptserve/wptserve/config.py | 3 ++- + testing/web-platform/tests/webdriver/tests/support/sync.py | 2 +- + 19 files changed, 24 insertions(+), 21 deletions(-) + +diff --git a/python/mach/mach/config.py b/python/mach/mach/config.py +index 7210eca82..edb4d2e93 100644 +--- a/python/mach/mach/config.py ++++ b/python/mach/mach/config.py +@@ -144,7 +144,7 @@ def reraise_attribute_error(func): + return _ + + +-class ConfigSettings(collections.Mapping): ++class ConfigSettings(collections.abc.Mapping): + """Interface for configuration settings. + + This is the main interface to the configuration. +@@ -190,7 +190,7 @@ class ConfigSettings(collections.Mapping): + will result in exceptions being raised. + """ + +- class ConfigSection(collections.MutableMapping, object): ++ class ConfigSection(collections.abc.MutableMapping, object): + """Represents an individual config section.""" + def __init__(self, config, name, settings): + object.__setattr__(self, '_config', config) +diff --git a/python/mach/mach/decorators.py b/python/mach/mach/decorators.py +index 27f7f34a6..5f63271a3 100644 +--- a/python/mach/mach/decorators.py ++++ b/python/mach/mach/decorators.py +@@ -140,7 +140,7 @@ def CommandProvider(cls): + 'Conditions argument must take a list ' + \ + 'of functions. Found %s instead.' + +- if not isinstance(command.conditions, collections.Iterable): ++ if not isinstance(command.conditions, collections.abc.Iterable): + msg = msg % (command.name, type(command.conditions)) + raise MachError(msg) + +--- a/python/mach/mach/main.py ++++ b/python/mach/mach/main.py +@@ -16,7 +16,7 @@ + import sys + import traceback + import uuid +-from collections import Iterable ++from collections.abc import Iterable + + from six import string_types + +diff --git a/python/mozbuild/mozbuild/backend/configenvironment.py b/python/mozbuild/mozbuild/backend/configenvironment.py +index 20d1a9fa6..8747958bd 100644 +--- a/python/mozbuild/mozbuild/backend/configenvironment.py ++++ b/python/mozbuild/mozbuild/backend/configenvironment.py +@@ -9,7 +9,8 @@ import six + import sys + import json + +-from collections import Iterable, OrderedDict ++from collections import OrderedDict ++from collections.abc import Iterable + from types import ModuleType + + import mozpack.path as mozpath +diff --git a/python/mozbuild/mozbuild/makeutil.py b/python/mozbuild/mozbuild/makeutil.py +index 4da1a3b26..4ce56848c 100644 +--- a/python/mozbuild/mozbuild/makeutil.py ++++ b/python/mozbuild/mozbuild/makeutil.py +@@ -7,7 +7,7 @@ from __future__ import absolute_import, print_function, unicode_literals + import os + import re + import six +-from collections import Iterable ++from collections.abc import Iterable + + + class Makefile(object): +diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py +index 044cf645c..98ed3ef52 100644 +--- a/python/mozbuild/mozbuild/util.py ++++ b/python/mozbuild/mozbuild/util.py +@@ -782,7 +782,7 @@ class HierarchicalStringList(object): + self._strings = StrictOrderingOnAppendList() + self._children = {} + +- class StringListAdaptor(collections.Sequence): ++ class StringListAdaptor(collections.abc.Sequence): + def __init__(self, hsl): + self._hsl = hsl + +diff --git a/testing/marionette/client/marionette_driver/wait.py b/testing/marionette/client/marionette_driver/wait.py +index eeaa1e23d..c147f463f 100644 +--- a/testing/marionette/client/marionette_driver/wait.py ++++ b/testing/marionette/client/marionette_driver/wait.py +@@ -82,7 +82,7 @@ class Wait(object): + + exceptions = [] + if ignored_exceptions is not None: +- if isinstance(ignored_exceptions, collections.Iterable): ++ if isinstance(ignored_exceptions, collections.abc.Iterable): + exceptions.extend(iter(ignored_exceptions)) + else: + exceptions.append(ignored_exceptions) +diff --git a/testing/mozbase/manifestparser/manifestparser/filters.py b/testing/mozbase/manifestparser/manifestparser/filters.py +index 287ee033b..b1d608003 100644 +--- a/testing/mozbase/manifestparser/manifestparser/filters.py ++++ b/testing/mozbase/manifestparser/manifestparser/filters.py +@@ -12,7 +12,8 @@ from __future__ import absolute_import + + import itertools + import os +-from collections import defaultdict, MutableSequence ++from collections import defaultdict ++from collections.abc import MutableSequence + + import six + from six import string_types +diff --git a/testing/mozbase/versioninfo.py b/testing/mozbase/versioninfo.py +index 91d1a0473..8c1680069 100755 +--- a/testing/mozbase/versioninfo.py ++++ b/testing/mozbase/versioninfo.py +@@ -11,7 +11,7 @@ from commit messages. + + from __future__ import absolute_import, print_function + +-from collections import Iterable ++from collections.abc import Iterable + from distutils.version import StrictVersion + import argparse + import os +diff --git a/testing/web-platform/tests/tools/manifest/vcs.py b/testing/web-platform/tests/tools/manifest/vcs.py +index 7c0feeb81..05ee19c7c 100644 +--- a/testing/web-platform/tests/tools/manifest/vcs.py ++++ b/testing/web-platform/tests/tools/manifest/vcs.py +@@ -3,7 +3,7 @@ import json + import os + import stat + from collections import deque +-from collections import MutableMapping ++from collections.abc import MutableMapping + + from six import with_metaclass, PY2 + +diff --git a/testing/web-platform/tests/tools/third_party/h2/h2/settings.py b/testing/web-platform/tests/tools/third_party/h2/h2/settings.py +index 3da720329..e097630e9 100644 +--- a/testing/web-platform/tests/tools/third_party/h2/h2/settings.py ++++ b/testing/web-platform/tests/tools/third_party/h2/h2/settings.py +@@ -88,7 +88,7 @@ class ChangedSetting: + ) + + +-class Settings(collections.MutableMapping): ++class Settings(collections.abc.MutableMapping): + """ + An object that encapsulates HTTP/2 settings state. + +diff --git a/testing/web-platform/tests/tools/third_party/html5lib/html5lib/_trie/_base.py b/testing/web-platform/tests/tools/third_party/html5lib/html5lib/_trie/_base.py +index a1158bbbf..a9295a2ba 100644 +--- a/testing/web-platform/tests/tools/third_party/html5lib/html5lib/_trie/_base.py ++++ b/testing/web-platform/tests/tools/third_party/html5lib/html5lib/_trie/_base.py +@@ -1,6 +1,6 @@ + from __future__ import absolute_import, division, unicode_literals + +-from collections import Mapping ++from collections.abc import Mapping + + + class Trie(Mapping): +diff --git a/testing/web-platform/tests/tools/third_party/html5lib/html5lib/treebuilders/dom.py b/testing/web-platform/tests/tools/third_party/html5lib/html5lib/treebuilders/dom.py +index dcfac220b..818a33433 100644 +--- a/testing/web-platform/tests/tools/third_party/html5lib/html5lib/treebuilders/dom.py ++++ b/testing/web-platform/tests/tools/third_party/html5lib/html5lib/treebuilders/dom.py +@@ -1,7 +1,7 @@ + from __future__ import absolute_import, division, unicode_literals + + +-from collections import MutableMapping ++from collections.abc import MutableMapping + from xml.dom import minidom, Node + import weakref + +diff --git a/testing/web-platform/tests/tools/third_party/hyper/hyper/common/headers.py b/testing/web-platform/tests/tools/third_party/hyper/hyper/common/headers.py +index 655a591ac..6454f550a 100644 +--- a/testing/web-platform/tests/tools/third_party/hyper/hyper/common/headers.py ++++ b/testing/web-platform/tests/tools/third_party/hyper/hyper/common/headers.py +@@ -10,7 +10,7 @@ import collections + from hyper.common.util import to_bytestring, to_bytestring_tuple + + +-class HTTPHeaderMap(collections.MutableMapping): ++class HTTPHeaderMap(collections.abc.MutableMapping): + """ + A structure that contains HTTP headers. + +diff --git a/testing/web-platform/tests/tools/third_party/hyper/hyper/h2/settings.py b/testing/web-platform/tests/tools/third_party/hyper/hyper/h2/settings.py +index fedc5e3c4..040afea92 100755 +--- a/testing/web-platform/tests/tools/third_party/hyper/hyper/h2/settings.py ++++ b/testing/web-platform/tests/tools/third_party/hyper/hyper/h2/settings.py +@@ -151,7 +151,7 @@ class ChangedSetting: + ) + + +-class Settings(collections.MutableMapping): ++class Settings(collections.abc.MutableMapping): + """ + An object that encapsulates HTTP/2 settings state. + +diff --git a/testing/web-platform/tests/tools/third_party/hyper/hyper/http11/connection.py b/testing/web-platform/tests/tools/third_party/hyper/hyper/http11/connection.py +index 61361c358..a214311d2 100644 +--- a/testing/web-platform/tests/tools/third_party/hyper/hyper/http11/connection.py ++++ b/testing/web-platform/tests/tools/third_party/hyper/hyper/http11/connection.py +@@ -10,7 +10,7 @@ import os + import socket + import base64 + +-from collections import Iterable, Mapping ++from collections.abc import Iterable, Mapping + + import collections + from hyperframe.frame import SettingsFrame +@@ -295,7 +295,7 @@ class HTTP11Connection(object): + return + + # Iterables that set a specific content length. +- elif isinstance(body, collections.Iterable): ++ elif isinstance(body, collections.abc.Iterable): + for item in body: + try: + self._sock.send(item) +diff --git a/testing/web-platform/tests/tools/third_party/hyper/hyper/packages/hyperframe/flags.py b/testing/web-platform/tests/tools/third_party/hyper/hyper/packages/hyperframe/flags.py +index e8f630056..8f2ea689b 100644 +--- a/testing/web-platform/tests/tools/third_party/hyper/hyper/packages/hyperframe/flags.py ++++ b/testing/web-platform/tests/tools/third_party/hyper/hyper/packages/hyperframe/flags.py +@@ -11,7 +11,7 @@ import collections + Flag = collections.namedtuple("Flag", ["name", "bit"]) + + +-class Flags(collections.MutableSet): ++class Flags(collections.abc.MutableSet): + """ + A simple MutableSet implementation that will only accept known flags as elements. + +diff --git a/testing/web-platform/tests/tools/third_party/hyperframe/hyperframe/flags.py b/testing/web-platform/tests/tools/third_party/hyperframe/hyperframe/flags.py +index 05b35017e..14c352e10 100644 +--- a/testing/web-platform/tests/tools/third_party/hyperframe/hyperframe/flags.py ++++ b/testing/web-platform/tests/tools/third_party/hyperframe/hyperframe/flags.py +@@ -11,7 +11,7 @@ import collections + Flag = collections.namedtuple("Flag", ["name", "bit"]) + + +-class Flags(collections.MutableSet): ++class Flags(collections.abc.MutableSet): + """ + A simple MutableSet implementation that will only accept known flags as + elements. +diff --git a/testing/web-platform/tests/tools/wptserve/wptserve/config.py b/testing/web-platform/tests/tools/wptserve/wptserve/config.py +index 7766565fe..3c1c36d6f 100644 +--- a/testing/web-platform/tests/tools/wptserve/wptserve/config.py ++++ b/testing/web-platform/tests/tools/wptserve/wptserve/config.py +@@ -2,7 +2,8 @@ import copy + import logging + import os + +-from collections import defaultdict, Mapping ++from collections import defaultdict ++from collections.abc import Mapping + from six import integer_types, iteritems, itervalues, string_types + + from . import sslutils +diff --git a/testing/web-platform/tests/webdriver/tests/support/sync.py b/testing/web-platform/tests/webdriver/tests/support/sync.py +index 3fc77131c..8e8f6b819 100644 +--- a/testing/web-platform/tests/webdriver/tests/support/sync.py ++++ b/testing/web-platform/tests/webdriver/tests/support/sync.py +@@ -81,7 +81,7 @@ class Poll(object): + + exceptions = [] + if ignored_exceptions is not None: +- if isinstance(ignored_exceptions, collections.Iterable): ++ if isinstance(ignored_exceptions, collections.abc.Iterable): + exceptions.extend(iter(ignored_exceptions)) + else: + exceptions.append(ignored_exceptions) +-- +2.31.1 + + diff --git a/repo/system/js78/patches/fix-rust-target.patch b/repo/system/js78/patches/fix-rust-target.patch new file mode 100644 index 0000000..f1a98df --- /dev/null +++ b/repo/system/js78/patches/fix-rust-target.patch @@ -0,0 +1,15 @@ +Allow us to just set RUST_TARGEt ourselves instead of hacking around in mozilla's +weird custom build system... + +diff -upr firefox-68.9.0.orig/build/moz.configure/rust.configure firefox-68.9.0/build/moz.configure/rust.configure +--- firefox-68.9.0.orig/build/moz.configure/rust.configure 2020-06-02 22:54:39.982616128 +0200 ++++ firefox-68.9.0/build/moz.configure/rust.configure 2020-06-02 23:08:37.656332899 +0200 +@@ -345,7 +345,7 @@ def rust_triple_alias(host_or_target): + + return None + +- rustc_target = find_candidate(candidates) ++ rustc_target = os.environ['RUST_TARGET'] + + if rustc_target is None: + die("Don't know how to translate {} for rustc".format( diff --git a/repo/system/json-c.xibuild b/repo/system/json-c/json-c.xibuild index 339e62b..339e62b 100644 --- a/repo/system/json-c.xibuild +++ b/repo/system/json-c/json-c.xibuild diff --git a/repo/system/json-glib.xibuild b/repo/system/json-glib/json-glib.xibuild index ce9f0b5..ce9f0b5 100644 --- a/repo/system/json-glib.xibuild +++ b/repo/system/json-glib/json-glib.xibuild diff --git a/repo/system/jsoncpp.xibuild b/repo/system/jsoncpp/jsoncpp.xibuild index 01d3bb6..01d3bb6 100644 --- a/repo/system/jsoncpp.xibuild +++ b/repo/system/jsoncpp/jsoncpp.xibuild diff --git a/repo/system/kbd.xibuild b/repo/system/kbd/kbd.xibuild index 9c48903..9c48903 100644 --- a/repo/system/kbd.xibuild +++ b/repo/system/kbd/kbd.xibuild diff --git a/repo/system/kmod.xibuild b/repo/system/kmod/kmod.xibuild index 673036a..673036a 100644 --- a/repo/system/kmod.xibuild +++ b/repo/system/kmod/kmod.xibuild diff --git a/repo/system/krb5.xibuild b/repo/system/krb5/krb5.xibuild index 4ed4ef7..4ed4ef7 100644 --- a/repo/system/krb5.xibuild +++ b/repo/system/krb5/krb5.xibuild diff --git a/repo/system/lcms2.xibuild b/repo/system/lcms2/lcms2.xibuild index 3f9cdd3..3f9cdd3 100644 --- a/repo/system/lcms2.xibuild +++ b/repo/system/lcms2/lcms2.xibuild diff --git a/repo/system/ldns.xibuild b/repo/system/ldns/ldns.xibuild index a835ee6..a835ee6 100644 --- a/repo/system/ldns.xibuild +++ b/repo/system/ldns/ldns.xibuild diff --git a/repo/system/libarchive.xibuild b/repo/system/libarchive/libarchive.xibuild index c03c225..c03c225 100644 --- a/repo/system/libarchive.xibuild +++ b/repo/system/libarchive/libarchive.xibuild diff --git a/repo/system/libcap-ng.xibuild b/repo/system/libcap-ng/libcap-ng.xibuild index a67ebbf..a67ebbf 100644 --- a/repo/system/libcap-ng.xibuild +++ b/repo/system/libcap-ng/libcap-ng.xibuild diff --git a/repo/system/libcap.xibuild b/repo/system/libcap/libcap.xibuild index dab917e..dab917e 100644 --- a/repo/system/libcap.xibuild +++ b/repo/system/libcap/libcap.xibuild diff --git a/repo/system/libconfig.xibuild b/repo/system/libconfig/libconfig.xibuild index b81a2bd..b81a2bd 100644 --- a/repo/system/libconfig.xibuild +++ b/repo/system/libconfig/libconfig.xibuild diff --git a/repo/system/libdwarf.xibuild b/repo/system/libdwarf/libdwarf.xibuild index 66aec4f..66aec4f 100644 --- a/repo/system/libdwarf.xibuild +++ b/repo/system/libdwarf/libdwarf.xibuild diff --git a/repo/system/libedit.xibuild b/repo/system/libedit/libedit.xibuild index b594d83..b594d83 100644 --- a/repo/system/libedit.xibuild +++ b/repo/system/libedit/libedit.xibuild diff --git a/repo/system/libelf.xibuild b/repo/system/libelf/libelf.xibuild index 5ec93b0..5ec93b0 100644 --- a/repo/system/libelf.xibuild +++ b/repo/system/libelf/libelf.xibuild diff --git a/repo/system/libev/libev-4.11-Add-pkgconfig-support.patch b/repo/system/libev/libev-4.11-Add-pkgconfig-support.patch new file mode 100644 index 0000000..8c478ca --- /dev/null +++ b/repo/system/libev/libev-4.11-Add-pkgconfig-support.patch @@ -0,0 +1,58 @@ +From 01d2c386b58afa49567ccc079c963f76dc2e60f3 Mon Sep 17 00:00:00 2001 +From: Mathieu Bridon <bochecha@fedoraproject.org> +Date: Fri, 8 Feb 2013 15:40:51 +0800 +Subject: [PATCH] Add pkgconfig support + +--- + Makefile.am | 4 ++++ + configure.ac | 2 +- + libev.pc.in | 11 +++++++++++ + 3 files changed, 16 insertions(+), 1 deletion(-) + create mode 100644 libev.pc.in + +diff --git a/Makefile.am b/Makefile.am +index 059305b..9e556c0 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -11,6 +11,10 @@ man_MANS = ev.3 + + include_HEADERS = ev.h ev++.h event.h + ++pkgconfigdir = $(libdir)/pkgconfig ++ ++pkgconfig_DATA = libev.pc ++ + lib_LTLIBRARIES = libev.la + + libev_la_SOURCES = ev.c event.c +diff --git a/configure.ac b/configure.ac +index 31d0a25..1af149a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -21,5 +21,5 @@ AC_PROG_LIBTOOL + + m4_include([libev.m4]) + +-AC_CONFIG_FILES([Makefile]) ++AC_CONFIG_FILES([Makefile libev.pc]) + AC_OUTPUT +diff --git a/libev.pc.in b/libev.pc.in +new file mode 100644 +index 0000000..3b6c636 +--- /dev/null ++++ b/libev.pc.in +@@ -0,0 +1,11 @@ ++prefix=@prefix@ ++exec_prefix=@prefix@ ++libdir=@libdir@ ++includedir=@includedir@ ++ ++Name: libev ++Description: High-performance event loop/event model ++Version: @VERSION@ ++Libs: -L${libdir} -lev ++Libs.private: ++Cflags: -I${includedir} +-- +1.8.1 + diff --git a/repo/system/libev.xibuild b/repo/system/libev/libev.xibuild index 6f43e9b..6f43e9b 100644 --- a/repo/system/libev.xibuild +++ b/repo/system/libev/libev.xibuild diff --git a/repo/system/libevent.xibuild b/repo/system/libevent/libevent.xibuild index 84e2dd4..84e2dd4 100644 --- a/repo/system/libevent.xibuild +++ b/repo/system/libevent/libevent.xibuild diff --git a/repo/system/libexif.xibuild b/repo/system/libexif/libexif.xibuild index 129c73a..129c73a 100644 --- a/repo/system/libexif.xibuild +++ b/repo/system/libexif/libexif.xibuild diff --git a/repo/system/libffi.xibuild b/repo/system/libffi/libffi.xibuild index d802142..d802142 100644 --- a/repo/system/libffi.xibuild +++ b/repo/system/libffi/libffi.xibuild diff --git a/repo/system/libfm-extra.xibuild b/repo/system/libfm-extra/libfm-extra.xibuild index 7cb00fa..7cb00fa 100644 --- a/repo/system/libfm-extra.xibuild +++ b/repo/system/libfm-extra/libfm-extra.xibuild diff --git a/repo/system/libfm.xibuild b/repo/system/libfm/libfm.xibuild index 21661e5..21661e5 100644 --- a/repo/system/libfm.xibuild +++ b/repo/system/libfm/libfm.xibuild diff --git a/repo/system/libgcrypt.xibuild b/repo/system/libgcrypt/libgcrypt.xibuild index 4c90552..4c90552 100644 --- a/repo/system/libgcrypt.xibuild +++ b/repo/system/libgcrypt/libgcrypt.xibuild diff --git a/repo/system/libgpg-error.xibuild b/repo/system/libgpg-error/libgpg-error.xibuild index 7498665..7498665 100644 --- a/repo/system/libgpg-error.xibuild +++ b/repo/system/libgpg-error/libgpg-error.xibuild diff --git a/repo/system/libgudev.xibuild b/repo/system/libgudev/libgudev.xibuild index a365c76..a365c76 100644 --- a/repo/system/libgudev.xibuild +++ b/repo/system/libgudev/libgudev.xibuild diff --git a/repo/system/libidn.xibuild b/repo/system/libidn/libidn.xibuild index f592955..f592955 100644 --- a/repo/system/libidn.xibuild +++ b/repo/system/libidn/libidn.xibuild diff --git a/repo/system/libldap.xibuild b/repo/system/libldap/libldap.xibuild index 5faf692..5faf692 100644 --- a/repo/system/libldap.xibuild +++ b/repo/system/libldap/libldap.xibuild diff --git a/repo/system/liblinear.xibuild b/repo/system/liblinear/liblinear.xibuild index 7a20846..7a20846 100644 --- a/repo/system/liblinear.xibuild +++ b/repo/system/liblinear/liblinear.xibuild diff --git a/repo/system/libluv.xibuild b/repo/system/libluv/libluv.xibuild index fabd348..fabd348 100644 --- a/repo/system/libluv.xibuild +++ b/repo/system/libluv/libluv.xibuild diff --git a/repo/system/libmbim.xibuild b/repo/system/libmbim/libmbim.xibuild index 8fe1d88..8fe1d88 100644 --- a/repo/system/libmbim.xibuild +++ b/repo/system/libmbim/libmbim.xibuild diff --git a/repo/system/libmpack.xibuild b/repo/system/libmpack/libmpack.xibuild index 3685876..3685876 100644 --- a/repo/system/libmpack.xibuild +++ b/repo/system/libmpack/libmpack.xibuild diff --git a/repo/system/libndp.xibuild b/repo/system/libndp/libndp.xibuild index 8e061ef..8e061ef 100644 --- a/repo/system/libndp.xibuild +++ b/repo/system/libndp/libndp.xibuild diff --git a/repo/system/libnghttp.xibuild b/repo/system/libnghttp/libnghttp.xibuild index 6f006dc..6f006dc 100644 --- a/repo/system/libnghttp.xibuild +++ b/repo/system/libnghttp/libnghttp.xibuild diff --git a/repo/system/libnl.xibuild b/repo/system/libnl/libnl.xibuild index 7ea18ba..7ea18ba 100644 --- a/repo/system/libnl.xibuild +++ b/repo/system/libnl/libnl.xibuild diff --git a/repo/system/libnsl.xibuild b/repo/system/libnsl/libnsl.xibuild index 051272b..051272b 100644 --- a/repo/system/libnsl.xibuild +++ b/repo/system/libnsl/libnsl.xibuild diff --git a/repo/system/libp11-kit.xibuild b/repo/system/libp11-kit/libp11-kit.xibuild index 11d33be..11d33be 100644 --- a/repo/system/libp11-kit.xibuild +++ b/repo/system/libp11-kit/libp11-kit.xibuild diff --git a/repo/system/libpcap.xibuild b/repo/system/libpcap/libpcap.xibuild index 27e56c5..27e56c5 100644 --- a/repo/system/libpcap.xibuild +++ b/repo/system/libpcap/libpcap.xibuild diff --git a/repo/system/libpipeline.xibuild b/repo/system/libpipeline/libpipeline.xibuild index e7cac33..e7cac33 100644 --- a/repo/system/libpipeline.xibuild +++ b/repo/system/libpipeline/libpipeline.xibuild diff --git a/repo/system/libpng/libpng-1.6.37-apng.patch b/repo/system/libpng/libpng-1.6.37-apng.patch new file mode 100644 index 0000000..8aaa50b --- /dev/null +++ b/repo/system/libpng/libpng-1.6.37-apng.patch @@ -0,0 +1,1728 @@ +diff -Naru libpng-1.6.37.org/png.h libpng-1.6.37/png.h +--- libpng-1.6.37.org/png.h 2019-04-19 07:21:37.398024800 +0900 ++++ libpng-1.6.37/png.h 2019-04-19 07:22:37.871245630 +0900 +@@ -330,6 +330,10 @@ + # include "pnglibconf.h" + #endif + ++#define PNG_APNG_SUPPORTED ++#define PNG_READ_APNG_SUPPORTED ++#define PNG_WRITE_APNG_SUPPORTED ++ + #ifndef PNG_VERSION_INFO_ONLY + /* Machine specific configuration. */ + # include "pngconf.h" +@@ -425,6 +429,17 @@ + * See pngconf.h for base types that vary by machine/system + */ + ++#ifdef PNG_APNG_SUPPORTED ++/* dispose_op flags from inside fcTL */ ++#define PNG_DISPOSE_OP_NONE 0x00U ++#define PNG_DISPOSE_OP_BACKGROUND 0x01U ++#define PNG_DISPOSE_OP_PREVIOUS 0x02U ++ ++/* blend_op flags from inside fcTL */ ++#define PNG_BLEND_OP_SOURCE 0x00U ++#define PNG_BLEND_OP_OVER 0x01U ++#endif /* PNG_APNG_SUPPORTED */ ++ + /* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +@@ -746,6 +761,10 @@ + #define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */ + #define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */ + #define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */ ++#ifdef PNG_APNG_SUPPORTED ++#define PNG_INFO_acTL 0x20000U ++#define PNG_INFO_fcTL 0x40000U ++#endif + + /* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using +@@ -783,6 +802,10 @@ + #ifdef PNG_PROGRESSIVE_READ_SUPPORTED + typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); + typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); ++#ifdef PNG_APNG_SUPPORTED ++typedef PNG_CALLBACK(void, *png_progressive_frame_ptr, (png_structp, ++ png_uint_32)); ++#endif + + /* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the +@@ -3226,6 +3249,74 @@ + /******************************************************************************* + * END OF HARDWARE AND SOFTWARE OPTIONS + ******************************************************************************/ ++#ifdef PNG_APNG_SUPPORTED ++PNG_EXPORT(250, png_uint_32, png_get_acTL, (png_structp png_ptr, ++ png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays)); ++ ++PNG_EXPORT(251, png_uint_32, png_set_acTL, (png_structp png_ptr, ++ png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays)); ++ ++PNG_EXPORT(252, png_uint_32, png_get_num_frames, (png_structp png_ptr, ++ png_infop info_ptr)); ++ ++PNG_EXPORT(253, png_uint_32, png_get_num_plays, (png_structp png_ptr, ++ png_infop info_ptr)); ++ ++PNG_EXPORT(254, png_uint_32, png_get_next_frame_fcTL, ++ (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, ++ png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset, ++ png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op, ++ png_byte *blend_op)); ++ ++PNG_EXPORT(255, png_uint_32, png_set_next_frame_fcTL, ++ (png_structp png_ptr, png_infop info_ptr, png_uint_32 width, ++ png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, ++ png_byte blend_op)); ++ ++PNG_EXPORT(256, png_uint_32, png_get_next_frame_width, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(257, png_uint_32, png_get_next_frame_height, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(258, png_uint_32, png_get_next_frame_x_offset, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(259, png_uint_32, png_get_next_frame_y_offset, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(260, png_uint_16, png_get_next_frame_delay_num, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(261, png_uint_16, png_get_next_frame_delay_den, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(262, png_byte, png_get_next_frame_dispose_op, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(263, png_byte, png_get_next_frame_blend_op, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(264, png_byte, png_get_first_frame_is_hidden, ++ (png_structp png_ptr, png_infop info_ptr)); ++PNG_EXPORT(265, png_uint_32, png_set_first_frame_is_hidden, ++ (png_structp png_ptr, png_infop info_ptr, png_byte is_hidden)); ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++PNG_EXPORT(266, void, png_read_frame_head, (png_structp png_ptr, ++ png_infop info_ptr)); ++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED ++PNG_EXPORT(267, void, png_set_progressive_frame_fn, (png_structp png_ptr, ++ png_progressive_frame_ptr frame_info_fn, ++ png_progressive_frame_ptr frame_end_fn)); ++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ ++#endif /* PNG_READ_APNG_SUPPORTED */ ++ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++PNG_EXPORT(268, void, png_write_frame_head, (png_structp png_ptr, ++ png_infop info_ptr, png_bytepp row_pointers, ++ png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, ++ png_byte blend_op)); ++ ++PNG_EXPORT(269, void, png_write_frame_tail, (png_structp png_ptr, ++ png_infop info_ptr)); ++#endif /* PNG_WRITE_APNG_SUPPORTED */ ++#endif /* PNG_APNG_SUPPORTED */ + + /* Maintainer: Put new public prototypes here ^, in libpng.3, in project + * defs, and in scripts/symbols.def. +@@ -3235,7 +3326,11 @@ + * one to use is one more than this.) + */ + #ifdef PNG_EXPORT_LAST_ORDINAL ++#ifdef PNG_APNG_SUPPORTED ++ PNG_EXPORT_LAST_ORDINAL(269); ++#else + PNG_EXPORT_LAST_ORDINAL(249); ++#endif /* PNG_APNG_SUPPORTED */ + #endif + + #ifdef __cplusplus +diff -Naru libpng-1.6.37.org/pngget.c libpng-1.6.37/pngget.c +--- libpng-1.6.37.org/pngget.c 2019-04-19 07:21:37.399024787 +0900 ++++ libpng-1.6.37/pngget.c 2019-04-19 07:22:37.850245901 +0900 +@@ -1246,4 +1246,166 @@ + # endif + #endif + ++#ifdef PNG_APNG_SUPPORTED ++png_uint_32 PNGAPI ++png_get_acTL(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 *num_frames, png_uint_32 *num_plays) ++{ ++ png_debug1(1, "in %s retrieval function", "acTL"); ++ ++ if (png_ptr != NULL && info_ptr != NULL && ++ (info_ptr->valid & PNG_INFO_acTL) && ++ num_frames != NULL && num_plays != NULL) ++ { ++ *num_frames = info_ptr->num_frames; ++ *num_plays = info_ptr->num_plays; ++ return (1); ++ } ++ ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_num_frames(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_num_frames()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->num_frames); ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_num_plays(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_num_plays()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->num_plays); ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 *width, png_uint_32 *height, ++ png_uint_32 *x_offset, png_uint_32 *y_offset, ++ png_uint_16 *delay_num, png_uint_16 *delay_den, ++ png_byte *dispose_op, png_byte *blend_op) ++{ ++ png_debug1(1, "in %s retrieval function", "fcTL"); ++ ++ if (png_ptr != NULL && info_ptr != NULL && ++ (info_ptr->valid & PNG_INFO_fcTL) && ++ width != NULL && height != NULL && ++ x_offset != NULL && y_offset != NULL && ++ delay_num != NULL && delay_den != NULL && ++ dispose_op != NULL && blend_op != NULL) ++ { ++ *width = info_ptr->next_frame_width; ++ *height = info_ptr->next_frame_height; ++ *x_offset = info_ptr->next_frame_x_offset; ++ *y_offset = info_ptr->next_frame_y_offset; ++ *delay_num = info_ptr->next_frame_delay_num; ++ *delay_den = info_ptr->next_frame_delay_den; ++ *dispose_op = info_ptr->next_frame_dispose_op; ++ *blend_op = info_ptr->next_frame_blend_op; ++ return (1); ++ } ++ ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_width()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_width); ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_height()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_height); ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_x_offset()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_x_offset); ++ return (0); ++} ++ ++png_uint_32 PNGAPI ++png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_y_offset()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_y_offset); ++ return (0); ++} ++ ++png_uint_16 PNGAPI ++png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_delay_num()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_delay_num); ++ return (0); ++} ++ ++png_uint_16 PNGAPI ++png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_delay_den()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_delay_den); ++ return (0); ++} ++ ++png_byte PNGAPI ++png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_dispose_op()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_dispose_op); ++ return (0); ++} ++ ++png_byte PNGAPI ++png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_get_next_frame_blend_op()"); ++ ++ if (png_ptr != NULL && info_ptr != NULL) ++ return (info_ptr->next_frame_blend_op); ++ return (0); ++} ++ ++png_byte PNGAPI ++png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_first_frame_is_hidden()"); ++ ++ if (png_ptr != NULL) ++ return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN); ++ ++ PNG_UNUSED(info_ptr) ++ ++ return 0; ++} ++#endif /* PNG_APNG_SUPPORTED */ + #endif /* READ || WRITE */ +diff -Naru libpng-1.6.37.org/pnginfo.h libpng-1.6.37/pnginfo.h +--- libpng-1.6.37.org/pnginfo.h 2019-04-19 07:21:37.399024787 +0900 ++++ libpng-1.6.37/pnginfo.h 2019-04-19 07:22:37.850245901 +0900 +@@ -263,5 +263,18 @@ + png_bytepp row_pointers; /* the image bits */ + #endif + ++#ifdef PNG_APNG_SUPPORTED ++ png_uint_32 num_frames; /* including default image */ ++ png_uint_32 num_plays; ++ png_uint_32 next_frame_width; ++ png_uint_32 next_frame_height; ++ png_uint_32 next_frame_x_offset; ++ png_uint_32 next_frame_y_offset; ++ png_uint_16 next_frame_delay_num; ++ png_uint_16 next_frame_delay_den; ++ png_byte next_frame_dispose_op; ++ png_byte next_frame_blend_op; ++#endif ++ + }; + #endif /* PNGINFO_H */ +diff -Naru libpng-1.6.37.org/pngpread.c libpng-1.6.37/pngpread.c +--- libpng-1.6.37.org/pngpread.c 2019-04-19 07:21:37.399024787 +0900 ++++ libpng-1.6.37/pngpread.c 2019-04-19 07:22:37.850245901 +0900 +@@ -195,6 +195,106 @@ + + chunk_name = png_ptr->chunk_name; + ++#ifdef PNG_READ_APNG_SUPPORTED ++ if (png_ptr->num_frames_read > 0 && ++ png_ptr->num_frames_read < info_ptr->num_frames) ++ { ++ if (chunk_name == png_IDAT) ++ { ++ /* Discard trailing IDATs for the first frame */ ++ if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1) ++ png_error(png_ptr, "out of place IDAT"); ++ ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; ++ return; ++ } ++ else if (chunk_name == png_fdAT) ++ { ++ if (png_ptr->buffer_size < 4) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_ensure_sequence_number(png_ptr, 4); ++ ++ if (!(png_ptr->mode & PNG_HAVE_fcTL)) ++ { ++ /* Discard trailing fdATs for frames other than the first */ ++ if (png_ptr->num_frames_read < 2) ++ png_error(png_ptr, "out of place fdAT"); ++ ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; ++ return; ++ } ++ ++ else ++ { ++ /* frame data follows */ ++ png_ptr->idat_size = png_ptr->push_length - 4; ++ png_ptr->mode |= PNG_HAVE_IDAT; ++ png_ptr->process_mode = PNG_READ_IDAT_MODE; ++ ++ return; ++ } ++ } ++ ++ else if (chunk_name == png_fcTL) ++ { ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_read_reset(png_ptr); ++ png_ptr->mode &= ~PNG_HAVE_fcTL; ++ ++ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); ++ ++ if (!(png_ptr->mode & PNG_HAVE_fcTL)) ++ png_error(png_ptr, "missing required fcTL chunk"); ++ ++ png_read_reinit(png_ptr, info_ptr); ++ png_progressive_read_reset(png_ptr); ++ ++ if (png_ptr->frame_info_fn != NULL) ++ (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read); ++ ++ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; ++ ++ return; ++ } ++ ++ else ++ { ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ png_warning(png_ptr, "Skipped (ignored) a chunk " ++ "between APNG chunks"); ++ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; ++ return; ++ } ++ ++ return; ++ } ++#endif /* PNG_READ_APNG_SUPPORTED */ ++ + if (chunk_name == png_IDAT) + { + if ((png_ptr->mode & PNG_AFTER_IDAT) != 0) +@@ -261,6 +361,9 @@ + + else if (chunk_name == png_IDAT) + { ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_have_info(png_ptr, info_ptr); ++#endif + png_ptr->idat_size = png_ptr->push_length; + png_ptr->process_mode = PNG_READ_IDAT_MODE; + png_push_have_info(png_ptr, info_ptr); +@@ -406,6 +509,30 @@ + png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + } + #endif ++#ifdef PNG_READ_APNG_SUPPORTED ++ else if (chunk_name == png_acTL) ++ { ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length); ++ } ++ ++ else if (chunk_name == png_fcTL) ++ { ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ ++ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length); ++ } ++ ++#endif /* PNG_READ_APNG_SUPPORTED */ + + else + { +@@ -539,7 +666,11 @@ + png_byte chunk_tag[4]; + + /* TODO: this code can be commoned up with the same code in push_read */ ++#ifdef PNG_READ_APNG_SUPPORTED ++ PNG_PUSH_SAVE_BUFFER_IF_LT(12) ++#else + PNG_PUSH_SAVE_BUFFER_IF_LT(8) ++#endif + png_push_fill_buffer(png_ptr, chunk_length, 4); + png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); +@@ -547,17 +678,64 @@ + png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); + png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; + ++#ifdef PNG_READ_APNG_SUPPORTED ++ if (png_ptr->chunk_name != png_fdAT && png_ptr->num_frames_read > 0) ++ { ++ if (png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) ++ { ++ png_ptr->process_mode = PNG_READ_CHUNK_MODE; ++ if (png_ptr->frame_end_fn != NULL) ++ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); ++ png_ptr->num_frames_read++; ++ return; ++ } ++ else ++ { ++ if (png_ptr->chunk_name == png_IEND) ++ png_error(png_ptr, "Not enough image data"); ++ if (png_ptr->push_length + 4 > png_ptr->buffer_size) ++ { ++ png_push_save_buffer(png_ptr); ++ return; ++ } ++ png_warning(png_ptr, "Skipping (ignoring) a chunk between " ++ "APNG chunks"); ++ png_crc_finish(png_ptr, png_ptr->push_length); ++ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; ++ return; ++ } ++ } ++ else ++#endif ++#ifdef PNG_READ_APNG_SUPPORTED ++ if (png_ptr->chunk_name != png_IDAT && png_ptr->num_frames_read == 0) ++#else + if (png_ptr->chunk_name != png_IDAT) ++#endif + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0) + png_error(png_ptr, "Not enough compressed data"); + ++#ifdef PNG_READ_APNG_SUPPORTED ++ if (png_ptr->frame_end_fn != NULL) ++ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read); ++ png_ptr->num_frames_read++; ++#endif ++ + return; + } + + png_ptr->idat_size = png_ptr->push_length; ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++ if (png_ptr->num_frames_read > 0) ++ { ++ png_ensure_sequence_number(png_ptr, 4); ++ png_ptr->idat_size -= 4; ++ } ++#endif + } + + if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0) +@@ -631,6 +809,15 @@ + if (!(buffer_length > 0) || buffer == NULL) + png_error(png_ptr, "No IDAT data (internal error)"); + ++#ifdef PNG_READ_APNG_SUPPORTED ++ /* If the app is not APNG-aware, decode only the first frame */ ++ if (!(png_ptr->apng_flags & PNG_APNG_APP) && png_ptr->num_frames_read > 0) ++ { ++ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; ++ return; ++ } ++#endif ++ + /* This routine must process all the data it has been given + * before returning, calling the row callback as required to + * handle the uncompressed results. +@@ -1085,6 +1272,18 @@ + png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); + } + ++#ifdef PNG_READ_APNG_SUPPORTED ++void PNGAPI ++png_set_progressive_frame_fn(png_structp png_ptr, ++ png_progressive_frame_ptr frame_info_fn, ++ png_progressive_frame_ptr frame_end_fn) ++{ ++ png_ptr->frame_info_fn = frame_info_fn; ++ png_ptr->frame_end_fn = frame_end_fn; ++ png_ptr->apng_flags |= PNG_APNG_APP; ++} ++#endif ++ + png_voidp PNGAPI + png_get_progressive_ptr(png_const_structrp png_ptr) + { +diff -Naru libpng-1.6.37.org/pngpriv.h libpng-1.6.37/pngpriv.h +--- libpng-1.6.37.org/pngpriv.h 2019-04-19 07:21:37.399024787 +0900 ++++ libpng-1.6.37/pngpriv.h 2019-04-19 07:22:37.850245901 +0900 +@@ -637,6 +637,10 @@ + #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000U /* Have another chunk after IDAT */ + /* 0x4000U (unused) */ + #define PNG_IS_READ_STRUCT 0x8000U /* Else is a write struct */ ++#ifdef PNG_APNG_SUPPORTED ++#define PNG_HAVE_acTL 0x10000U ++#define PNG_HAVE_fcTL 0x20000U ++#endif + + /* Flags for the transformations the PNG library does on the image data */ + #define PNG_BGR 0x0001U +@@ -873,6 +877,16 @@ + #define png_tRNS PNG_U32(116, 82, 78, 83) + #define png_zTXt PNG_U32(122, 84, 88, 116) + ++#ifdef PNG_APNG_SUPPORTED ++#define png_acTL PNG_U32( 97, 99, 84, 76) ++#define png_fcTL PNG_U32(102, 99, 84, 76) ++#define png_fdAT PNG_U32(102, 100, 65, 84) ++ ++/* For png_struct.apng_flags: */ ++#define PNG_FIRST_FRAME_HIDDEN 0x0001U ++#define PNG_APNG_APP 0x0002U ++#endif ++ + /* The following will work on (signed char*) strings, whereas the get_uint_32 + * macro will fail on top-bit-set values because of the sign extension. + */ +@@ -1644,6 +1658,47 @@ + */ + #endif + ++#ifdef PNG_APNG_SUPPORTED ++PNG_INTERNAL_FUNCTION(void,png_ensure_fcTL_is_valid,(png_structp png_ptr, ++ png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, ++ png_byte dispose_op, png_byte blend_op), PNG_EMPTY); ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++PNG_INTERNAL_FUNCTION(void,png_handle_acTL,(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 length),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_handle_fcTL,(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 length),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_handle_fdAT,(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 length),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_have_info,(png_structp png_ptr, png_infop info_ptr),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_ensure_sequence_number,(png_structp png_ptr, ++ png_uint_32 length),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_read_reset,(png_structp png_ptr),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_read_reinit,(png_structp png_ptr, ++ png_infop info_ptr),PNG_EMPTY); ++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED ++PNG_INTERNAL_FUNCTION(void,png_progressive_read_reset,(png_structp png_ptr),PNG_EMPTY); ++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ ++#endif /* PNG_READ_APNG_SUPPORTED */ ++ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++PNG_INTERNAL_FUNCTION(void,png_write_acTL,(png_structp png_ptr, ++ png_uint_32 num_frames, png_uint_32 num_plays),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_write_fcTL,(png_structp png_ptr, ++ png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, ++ png_byte dispose_op, png_byte blend_op),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_write_fdAT,(png_structp png_ptr, ++ png_const_bytep data, png_size_t length),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_write_reset,(png_structp png_ptr),PNG_EMPTY); ++PNG_INTERNAL_FUNCTION(void,png_write_reinit,(png_structp png_ptr, ++ png_infop info_ptr, png_uint_32 width, png_uint_32 height),PNG_EMPTY); ++#endif /* PNG_WRITE_APNG_SUPPORTED */ ++#endif /* PNG_APNG_SUPPORTED */ ++ + /* Added at libpng version 1.4.0 */ + #ifdef PNG_COLORSPACE_SUPPORTED + /* These internal functions are for maintaining the colorspace structure within +diff -Naru libpng-1.6.37.org/pngread.c libpng-1.6.37/pngread.c +--- libpng-1.6.37.org/pngread.c 2019-04-19 07:21:37.400024774 +0900 ++++ libpng-1.6.37/pngread.c 2019-04-19 07:22:37.851245887 +0900 +@@ -161,6 +161,9 @@ + + else if (chunk_name == png_IDAT) + { ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_have_info(png_ptr, info_ptr); ++#endif + png_ptr->idat_size = length; + break; + } +@@ -255,6 +258,17 @@ + png_handle_iTXt(png_ptr, info_ptr, length); + #endif + ++#ifdef PNG_READ_APNG_SUPPORTED ++ else if (chunk_name == png_acTL) ++ png_handle_acTL(png_ptr, info_ptr, length); ++ ++ else if (chunk_name == png_fcTL) ++ png_handle_fcTL(png_ptr, info_ptr, length); ++ ++ else if (chunk_name == png_fdAT) ++ png_handle_fdAT(png_ptr, info_ptr, length); ++#endif ++ + else + png_handle_unknown(png_ptr, info_ptr, length, + PNG_HANDLE_CHUNK_AS_DEFAULT); +@@ -262,6 +276,72 @@ + } + #endif /* SEQUENTIAL_READ */ + ++#ifdef PNG_READ_APNG_SUPPORTED ++void PNGAPI ++png_read_frame_head(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */ ++ ++ png_debug(0, "Reading frame head"); ++ ++ if (!(png_ptr->mode & PNG_HAVE_acTL)) ++ png_error(png_ptr, "attempt to png_read_frame_head() but " ++ "no acTL present"); ++ ++ /* do nothing for the main IDAT */ ++ if (png_ptr->num_frames_read == 0) ++ return; ++ ++ png_read_reset(png_ptr); ++ png_ptr->flags &= ~PNG_FLAG_ROW_INIT; ++ png_ptr->mode &= ~PNG_HAVE_fcTL; ++ ++ have_chunk_after_DAT = 0; ++ for (;;) ++ { ++ png_uint_32 length = png_read_chunk_header(png_ptr); ++ ++ if (png_ptr->chunk_name == png_IDAT) ++ { ++ /* discard trailing IDATs for the first frame */ ++ if (have_chunk_after_DAT || png_ptr->num_frames_read > 1) ++ png_error(png_ptr, "png_read_frame_head(): out of place IDAT"); ++ png_crc_finish(png_ptr, length); ++ } ++ ++ else if (png_ptr->chunk_name == png_fcTL) ++ { ++ png_handle_fcTL(png_ptr, info_ptr, length); ++ have_chunk_after_DAT = 1; ++ } ++ ++ else if (png_ptr->chunk_name == png_fdAT) ++ { ++ png_ensure_sequence_number(png_ptr, length); ++ ++ /* discard trailing fdATs for frames other than the first */ ++ if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1) ++ png_crc_finish(png_ptr, length - 4); ++ else if(png_ptr->mode & PNG_HAVE_fcTL) ++ { ++ png_ptr->idat_size = length - 4; ++ png_ptr->mode |= PNG_HAVE_IDAT; ++ ++ break; ++ } ++ else ++ png_error(png_ptr, "png_read_frame_head(): out of place fdAT"); ++ } ++ else ++ { ++ png_warning(png_ptr, "Skipped (ignored) a chunk " ++ "between APNG chunks"); ++ png_crc_finish(png_ptr, length); ++ } ++ } ++} ++#endif /* PNG_READ_APNG_SUPPORTED */ ++ + /* Optional call to update the users info_ptr structure */ + void PNGAPI + png_read_update_info(png_structrp png_ptr, png_inforp info_ptr) +diff -Naru libpng-1.6.37.org/pngrutil.c libpng-1.6.37/pngrutil.c +--- libpng-1.6.37.org/pngrutil.c 2019-04-19 07:21:37.401024761 +0900 ++++ libpng-1.6.37/pngrutil.c 2019-04-19 07:22:37.853245862 +0900 +@@ -865,6 +865,11 @@ + filter_type = buf[11]; + interlace_type = buf[12]; + ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_ptr->first_frame_width = width; ++ png_ptr->first_frame_height = height; ++#endif ++ + /* Set internal variables */ + png_ptr->width = width; + png_ptr->height = height; +@@ -2857,6 +2862,179 @@ + } + #endif + ++#ifdef PNG_READ_APNG_SUPPORTED ++void /* PRIVATE */ ++png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) ++{ ++ png_byte data[8]; ++ png_uint_32 num_frames; ++ png_uint_32 num_plays; ++ png_uint_32 didSet; ++ ++ png_debug(1, "in png_handle_acTL"); ++ ++ if (!(png_ptr->mode & PNG_HAVE_IHDR)) ++ { ++ png_error(png_ptr, "Missing IHDR before acTL"); ++ } ++ else if (png_ptr->mode & PNG_HAVE_IDAT) ++ { ++ png_warning(png_ptr, "Invalid acTL after IDAT skipped"); ++ png_crc_finish(png_ptr, length); ++ return; ++ } ++ else if (png_ptr->mode & PNG_HAVE_acTL) ++ { ++ png_warning(png_ptr, "Duplicate acTL skipped"); ++ png_crc_finish(png_ptr, length); ++ return; ++ } ++ else if (length != 8) ++ { ++ png_warning(png_ptr, "acTL with invalid length skipped"); ++ png_crc_finish(png_ptr, length); ++ return; ++ } ++ ++ png_crc_read(png_ptr, data, 8); ++ png_crc_finish(png_ptr, 0); ++ ++ num_frames = png_get_uint_31(png_ptr, data); ++ num_plays = png_get_uint_31(png_ptr, data + 4); ++ ++ /* the set function will do error checking on num_frames */ ++ didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays); ++ if(didSet) ++ png_ptr->mode |= PNG_HAVE_acTL; ++} ++ ++void /* PRIVATE */ ++png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) ++{ ++ png_byte data[22]; ++ png_uint_32 width; ++ png_uint_32 height; ++ png_uint_32 x_offset; ++ png_uint_32 y_offset; ++ png_uint_16 delay_num; ++ png_uint_16 delay_den; ++ png_byte dispose_op; ++ png_byte blend_op; ++ ++ png_debug(1, "in png_handle_fcTL"); ++ ++ png_ensure_sequence_number(png_ptr, length); ++ ++ if (!(png_ptr->mode & PNG_HAVE_IHDR)) ++ { ++ png_error(png_ptr, "Missing IHDR before fcTL"); ++ } ++ else if (png_ptr->mode & PNG_HAVE_IDAT) ++ { ++ /* for any frames other then the first this message may be misleading, ++ * but correct. PNG_HAVE_IDAT is unset before the frame head is read ++ * i can't think of a better message */ ++ png_warning(png_ptr, "Invalid fcTL after IDAT skipped"); ++ png_crc_finish(png_ptr, length-4); ++ return; ++ } ++ else if (png_ptr->mode & PNG_HAVE_fcTL) ++ { ++ png_warning(png_ptr, "Duplicate fcTL within one frame skipped"); ++ png_crc_finish(png_ptr, length-4); ++ return; ++ } ++ else if (length != 26) ++ { ++ png_warning(png_ptr, "fcTL with invalid length skipped"); ++ png_crc_finish(png_ptr, length-4); ++ return; ++ } ++ ++ png_crc_read(png_ptr, data, 22); ++ png_crc_finish(png_ptr, 0); ++ ++ width = png_get_uint_31(png_ptr, data); ++ height = png_get_uint_31(png_ptr, data + 4); ++ x_offset = png_get_uint_31(png_ptr, data + 8); ++ y_offset = png_get_uint_31(png_ptr, data + 12); ++ delay_num = png_get_uint_16(data + 16); ++ delay_den = png_get_uint_16(data + 18); ++ dispose_op = data[20]; ++ blend_op = data[21]; ++ ++ if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0)) ++ { ++ png_warning(png_ptr, "fcTL for the first frame must have zero offset"); ++ return; ++ } ++ ++ if (info_ptr != NULL) ++ { ++ if (png_ptr->num_frames_read == 0 && ++ (width != info_ptr->width || height != info_ptr->height)) ++ { ++ png_warning(png_ptr, "size in first frame's fcTL must match " ++ "the size in IHDR"); ++ return; ++ } ++ ++ /* The set function will do more error checking */ ++ png_set_next_frame_fcTL(png_ptr, info_ptr, width, height, ++ x_offset, y_offset, delay_num, delay_den, ++ dispose_op, blend_op); ++ ++ png_read_reinit(png_ptr, info_ptr); ++ ++ png_ptr->mode |= PNG_HAVE_fcTL; ++ } ++} ++ ++void /* PRIVATE */ ++png_have_info(png_structp png_ptr, png_infop info_ptr) ++{ ++ if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL)) ++ { ++ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; ++ info_ptr->num_frames++; ++ } ++} ++ ++void /* PRIVATE */ ++png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) ++{ ++ png_ensure_sequence_number(png_ptr, length); ++ ++ /* This function is only called from png_read_end(), png_read_info(), ++ * and png_push_read_chunk() which means that: ++ * - the user doesn't want to read this frame ++ * - or this is an out-of-place fdAT ++ * in either case it is safe to ignore the chunk with a warning */ ++ png_warning(png_ptr, "ignoring fdAT chunk"); ++ png_crc_finish(png_ptr, length - 4); ++ PNG_UNUSED(info_ptr) ++} ++ ++void /* PRIVATE */ ++png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length) ++{ ++ png_byte data[4]; ++ png_uint_32 sequence_number; ++ ++ if (length < 4) ++ png_error(png_ptr, "invalid fcTL or fdAT chunk found"); ++ ++ png_crc_read(png_ptr, data, 4); ++ sequence_number = png_get_uint_31(png_ptr, data); ++ ++ if (sequence_number != png_ptr->next_seq_num) ++ png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence " ++ "number found"); ++ ++ png_ptr->next_seq_num++; ++} ++#endif /* PNG_READ_APNG_SUPPORTED */ ++ + #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED + /* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */ + static int +@@ -4165,7 +4343,38 @@ + { + uInt avail_in; + png_bytep buffer; ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_uint_32 bytes_to_skip = 0; ++ ++ while (png_ptr->idat_size == 0 || bytes_to_skip != 0) ++ { ++ png_crc_finish(png_ptr, bytes_to_skip); ++ bytes_to_skip = 0; + ++ png_ptr->idat_size = png_read_chunk_header(png_ptr); ++ if (png_ptr->num_frames_read == 0) ++ { ++ if (png_ptr->chunk_name != png_IDAT) ++ png_error(png_ptr, "Not enough image data"); ++ } ++ else ++ { ++ if (png_ptr->chunk_name == png_IEND) ++ png_error(png_ptr, "Not enough image data"); ++ if (png_ptr->chunk_name != png_fdAT) ++ { ++ png_warning(png_ptr, "Skipped (ignored) a chunk " ++ "between APNG chunks"); ++ bytes_to_skip = png_ptr->idat_size; ++ continue; ++ } ++ ++ png_ensure_sequence_number(png_ptr, png_ptr->idat_size); ++ ++ png_ptr->idat_size -= 4; ++ } ++ } ++#else + while (png_ptr->idat_size == 0) + { + png_crc_finish(png_ptr, 0); +@@ -4177,7 +4386,7 @@ + if (png_ptr->chunk_name != png_IDAT) + png_error(png_ptr, "Not enough image data"); + } +- ++#endif /* PNG_READ_APNG_SUPPORTED */ + avail_in = png_ptr->IDAT_read_size; + + if (avail_in > png_ptr->idat_size) +@@ -4240,6 +4449,9 @@ + + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_ptr->num_frames_read++; ++#endif + + if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0) + png_chunk_benign_error(png_ptr, "Extra compressed data"); +@@ -4678,4 +4890,80 @@ + + png_ptr->flags |= PNG_FLAG_ROW_INIT; + } ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++/* This function is to be called after the main IDAT set has been read and ++ * before a new IDAT is read. It resets some parts of png_ptr ++ * to make them usable by the read functions again */ ++void /* PRIVATE */ ++png_read_reset(png_structp png_ptr) ++{ ++ png_ptr->mode &= ~PNG_HAVE_IDAT; ++ png_ptr->mode &= ~PNG_AFTER_IDAT; ++ png_ptr->row_number = 0; ++ png_ptr->pass = 0; ++} ++ ++void /* PRIVATE */ ++png_read_reinit(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_ptr->width = info_ptr->next_frame_width; ++ png_ptr->height = info_ptr->next_frame_height; ++ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); ++ png_ptr->info_rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, ++ png_ptr->width); ++ if (png_ptr->prev_row) ++ memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); ++} ++ ++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED ++/* same as png_read_reset() but for the progressive reader */ ++void /* PRIVATE */ ++png_progressive_read_reset(png_structp png_ptr) ++{ ++#ifdef PNG_READ_INTERLACING_SUPPORTED ++ /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ ++ ++ /* Start of interlace block */ ++ const int png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; ++ ++ /* Offset to next interlace block */ ++ const int png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; ++ ++ /* Start of interlace block in the y direction */ ++ const int png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; ++ ++ /* Offset to next interlace block in the y direction */ ++ const int png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; ++ ++ if (png_ptr->interlaced) ++ { ++ if (!(png_ptr->transformations & PNG_INTERLACE)) ++ png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - ++ png_pass_ystart[0]) / png_pass_yinc[0]; ++ else ++ png_ptr->num_rows = png_ptr->height; ++ ++ png_ptr->iwidth = (png_ptr->width + ++ png_pass_inc[png_ptr->pass] - 1 - ++ png_pass_start[png_ptr->pass]) / ++ png_pass_inc[png_ptr->pass]; ++ } ++ else ++#endif /* PNG_READ_INTERLACING_SUPPORTED */ ++ { ++ png_ptr->num_rows = png_ptr->height; ++ png_ptr->iwidth = png_ptr->width; ++ } ++ png_ptr->flags &= ~PNG_FLAG_ZSTREAM_ENDED; ++ if (inflateReset(&(png_ptr->zstream)) != Z_OK) ++ png_error(png_ptr, "inflateReset failed"); ++ png_ptr->zstream.avail_in = 0; ++ png_ptr->zstream.next_in = 0; ++ png_ptr->zstream.next_out = png_ptr->row_buf; ++ png_ptr->zstream.avail_out = (uInt)PNG_ROWBYTES(png_ptr->pixel_depth, ++ png_ptr->iwidth) + 1; ++} ++#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ ++#endif /* PNG_READ_APNG_SUPPORTED */ + #endif /* READ */ +diff -Naru libpng-1.6.37.org/pngset.c libpng-1.6.37/pngset.c +--- libpng-1.6.37.org/pngset.c 2019-04-19 07:21:37.401024761 +0900 ++++ libpng-1.6.37/pngset.c 2019-04-19 07:22:37.858245798 +0900 +@@ -288,6 +288,11 @@ + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); + + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); ++ ++#ifdef PNG_APNG_SUPPORTED ++ /* for non-animated png. this may be overwritten from an acTL chunk later */ ++ info_ptr->num_frames = 1; ++#endif + } + + #ifdef PNG_oFFs_SUPPORTED +@@ -1158,6 +1163,147 @@ + } + #endif /* sPLT */ + ++#ifdef PNG_APNG_SUPPORTED ++png_uint_32 PNGAPI ++png_set_acTL(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 num_frames, png_uint_32 num_plays) ++{ ++ png_debug1(1, "in %s storage function", "acTL"); ++ ++ if (png_ptr == NULL || info_ptr == NULL) ++ { ++ png_warning(png_ptr, ++ "Call to png_set_acTL() with NULL png_ptr " ++ "or info_ptr ignored"); ++ return (0); ++ } ++ if (num_frames == 0) ++ { ++ png_warning(png_ptr, ++ "Ignoring attempt to set acTL with num_frames zero"); ++ return (0); ++ } ++ if (num_frames > PNG_UINT_31_MAX) ++ { ++ png_warning(png_ptr, ++ "Ignoring attempt to set acTL with num_frames > 2^31-1"); ++ return (0); ++ } ++ if (num_plays > PNG_UINT_31_MAX) ++ { ++ png_warning(png_ptr, ++ "Ignoring attempt to set acTL with num_plays " ++ "> 2^31-1"); ++ return (0); ++ } ++ ++ info_ptr->num_frames = num_frames; ++ info_ptr->num_plays = num_plays; ++ ++ info_ptr->valid |= PNG_INFO_acTL; ++ ++ return (1); ++} ++ ++/* delay_num and delay_den can hold any 16-bit values including zero */ ++png_uint_32 PNGAPI ++png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, ++ png_byte dispose_op, png_byte blend_op) ++{ ++ png_debug1(1, "in %s storage function", "fcTL"); ++ ++ if (png_ptr == NULL || info_ptr == NULL) ++ { ++ png_warning(png_ptr, ++ "Call to png_set_fcTL() with NULL png_ptr or info_ptr " ++ "ignored"); ++ return (0); ++ } ++ ++ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, ++ delay_num, delay_den, dispose_op, blend_op); ++ ++ if (blend_op == PNG_BLEND_OP_OVER) ++ { ++ if (!(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) && ++ !(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) ++ { ++ png_warning(png_ptr, "PNG_BLEND_OP_OVER is meaningless " ++ "and wasteful for opaque images, ignored"); ++ blend_op = PNG_BLEND_OP_SOURCE; ++ } ++ } ++ ++ info_ptr->next_frame_width = width; ++ info_ptr->next_frame_height = height; ++ info_ptr->next_frame_x_offset = x_offset; ++ info_ptr->next_frame_y_offset = y_offset; ++ info_ptr->next_frame_delay_num = delay_num; ++ info_ptr->next_frame_delay_den = delay_den; ++ info_ptr->next_frame_dispose_op = dispose_op; ++ info_ptr->next_frame_blend_op = blend_op; ++ ++ info_ptr->valid |= PNG_INFO_fcTL; ++ ++ return (1); ++} ++ ++void /* PRIVATE */ ++png_ensure_fcTL_is_valid(png_structp png_ptr, ++ png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, ++ png_byte dispose_op, png_byte blend_op) ++{ ++ if (width == 0 || width > PNG_UINT_31_MAX) ++ png_error(png_ptr, "invalid width in fcTL (> 2^31-1)"); ++ if (height == 0 || height > PNG_UINT_31_MAX) ++ png_error(png_ptr, "invalid height in fcTL (> 2^31-1)"); ++ if (x_offset > PNG_UINT_31_MAX) ++ png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)"); ++ if (y_offset > PNG_UINT_31_MAX) ++ png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)"); ++ if (width + x_offset > png_ptr->first_frame_width || ++ height + y_offset > png_ptr->first_frame_height) ++ png_error(png_ptr, "dimensions of a frame are greater than" ++ "the ones in IHDR"); ++ ++ if (dispose_op != PNG_DISPOSE_OP_NONE && ++ dispose_op != PNG_DISPOSE_OP_BACKGROUND && ++ dispose_op != PNG_DISPOSE_OP_PREVIOUS) ++ png_error(png_ptr, "invalid dispose_op in fcTL"); ++ ++ if (blend_op != PNG_BLEND_OP_SOURCE && ++ blend_op != PNG_BLEND_OP_OVER) ++ png_error(png_ptr, "invalid blend_op in fcTL"); ++ ++ PNG_UNUSED(delay_num) ++ PNG_UNUSED(delay_den) ++} ++ ++png_uint_32 PNGAPI ++png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr, ++ png_byte is_hidden) ++{ ++ png_debug(1, "in png_first_frame_is_hidden()"); ++ ++ if (png_ptr == NULL) ++ return 0; ++ ++ if (is_hidden) ++ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN; ++ else ++ png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN; ++ ++ PNG_UNUSED(info_ptr) ++ ++ return 1; ++} ++#endif /* PNG_APNG_SUPPORTED */ ++ + #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED + static png_byte + check_location(png_const_structrp png_ptr, int location) +diff -Naru libpng-1.6.37.org/pngstruct.h libpng-1.6.37/pngstruct.h +--- libpng-1.6.37.org/pngstruct.h 2019-04-19 07:21:37.401024761 +0900 ++++ libpng-1.6.37/pngstruct.h 2019-04-19 07:22:37.854245849 +0900 +@@ -409,6 +409,27 @@ + png_byte filter_type; + #endif + ++#ifdef PNG_APNG_SUPPORTED ++ png_uint_32 apng_flags; ++ png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */ ++ png_uint_32 first_frame_width; ++ png_uint_32 first_frame_height; ++ ++#ifdef PNG_READ_APNG_SUPPORTED ++ png_uint_32 num_frames_read; /* incremented after all image data of */ ++ /* a frame is read */ ++#ifdef PNG_PROGRESSIVE_READ_SUPPORTED ++ png_progressive_frame_ptr frame_info_fn; /* frame info read callback */ ++ png_progressive_frame_ptr frame_end_fn; /* frame data read callback */ ++#endif ++#endif ++ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ png_uint_32 num_frames_to_write; ++ png_uint_32 num_frames_written; ++#endif ++#endif /* PNG_APNG_SUPPORTED */ ++ + /* New members added in libpng-1.2.0 */ + + /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +diff -Naru libpng-1.6.37.org/pngtest.c libpng-1.6.37/pngtest.c +--- libpng-1.6.37.org/pngtest.c 2019-04-19 07:21:37.401024761 +0900 ++++ libpng-1.6.37/pngtest.c 2019-04-19 07:22:37.854245849 +0900 +@@ -875,6 +875,10 @@ + volatile int num_passes; + int pass; + int bit_depth, color_type; ++#ifdef PNG_APNG_SUPPORTED ++ png_uint_32 num_frames; ++ png_uint_32 num_plays; ++#endif + + row_buf = NULL; + error_parameters.file_name = inname; +@@ -1383,6 +1387,22 @@ + } + } + #endif ++ ++#ifdef PNG_APNG_SUPPORTED ++ if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL)) ++ { ++ if (png_get_acTL(read_ptr, read_info_ptr, &num_frames, &num_plays)) ++ { ++ png_byte is_hidden; ++ pngtest_debug2("Handling acTL chunks (frames %ld, plays %ld)", ++ num_frames, num_plays); ++ png_set_acTL(write_ptr, write_info_ptr, num_frames, num_plays); ++ is_hidden = png_get_first_frame_is_hidden(read_ptr, read_info_ptr); ++ png_set_first_frame_is_hidden(write_ptr, write_info_ptr, is_hidden); ++ } ++ } ++#endif ++ + #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + { + png_unknown_chunkp unknowns; +@@ -1463,6 +1483,110 @@ + t_misc += (t_stop - t_start); + t_start = t_stop; + #endif ++#ifdef PNG_APNG_SUPPORTED ++ if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_acTL)) ++ { ++ png_uint_32 frame; ++ for (frame = 0; frame < num_frames; frame++) ++ { ++ png_uint_32 frame_width; ++ png_uint_32 frame_height; ++ png_uint_32 x_offset; ++ png_uint_32 y_offset; ++ png_uint_16 delay_num; ++ png_uint_16 delay_den; ++ png_byte dispose_op; ++ png_byte blend_op; ++ png_read_frame_head(read_ptr, read_info_ptr); ++ if (png_get_valid(read_ptr, read_info_ptr, PNG_INFO_fcTL)) ++ { ++ png_get_next_frame_fcTL(read_ptr, read_info_ptr, ++ &frame_width, &frame_height, ++ &x_offset, &y_offset, ++ &delay_num, &delay_den, ++ &dispose_op, &blend_op); ++ } ++ else ++ { ++ frame_width = width; ++ frame_height = height; ++ x_offset = 0; ++ y_offset = 0; ++ delay_num = 1; ++ delay_den = 1; ++ dispose_op = PNG_DISPOSE_OP_NONE; ++ blend_op = PNG_BLEND_OP_SOURCE; ++ } ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ png_write_frame_head(write_ptr, write_info_ptr, (png_bytepp)&row_buf, ++ frame_width, frame_height, ++ x_offset, y_offset, ++ delay_num, delay_den, ++ dispose_op, blend_op); ++#endif ++ for (pass = 0; pass < num_passes; pass++) ++ { ++# ifdef calc_pass_height ++ png_uint_32 pass_height; ++ ++ if (num_passes == 7) /* interlaced */ ++ { ++ if (PNG_PASS_COLS(frame_width, pass) > 0) ++ pass_height = PNG_PASS_ROWS(frame_height, pass); ++ ++ else ++ pass_height = 0; ++ } ++ ++ else /* not interlaced */ ++ pass_height = frame_height; ++# else ++# define pass_height frame_height ++# endif ++ ++ pngtest_debug1("Writing row data for pass %d", pass); ++ for (y = 0; y < pass_height; y++) ++ { ++#ifndef SINGLE_ROWBUF_ALLOC ++ pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y); ++ ++ row_buf = (png_bytep)png_malloc(read_ptr, ++ png_get_rowbytes(read_ptr, read_info_ptr)); ++ ++ pngtest_debug2("\t0x%08lx (%lu bytes)", (unsigned long)row_buf, ++ (unsigned long)png_get_rowbytes(read_ptr, read_info_ptr)); ++ ++#endif /* !SINGLE_ROWBUF_ALLOC */ ++ png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1); ++ ++#ifdef PNG_WRITE_SUPPORTED ++#ifdef PNGTEST_TIMING ++ t_stop = (float)clock(); ++ t_decode += (t_stop - t_start); ++ t_start = t_stop; ++#endif ++ png_write_rows(write_ptr, (png_bytepp)&row_buf, 1); ++#ifdef PNGTEST_TIMING ++ t_stop = (float)clock(); ++ t_encode += (t_stop - t_start); ++ t_start = t_stop; ++#endif ++#endif /* PNG_WRITE_SUPPORTED */ ++ ++#ifndef SINGLE_ROWBUF_ALLOC ++ pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y); ++ png_free(read_ptr, row_buf); ++ row_buf = NULL; ++#endif /* !SINGLE_ROWBUF_ALLOC */ ++ } ++ } ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ png_write_frame_tail(write_ptr, write_info_ptr); ++#endif ++ } ++ } ++ else ++#endif + for (pass = 0; pass < num_passes; pass++) + { + # ifdef calc_pass_height +diff -Naru libpng-1.6.37.org/pngwrite.c libpng-1.6.37/pngwrite.c +--- libpng-1.6.37.org/pngwrite.c 2019-04-19 07:21:37.402024748 +0900 ++++ libpng-1.6.37/pngwrite.c 2019-04-19 07:22:37.855245836 +0900 +@@ -128,6 +128,10 @@ + * the application continues writing the PNG. So check the 'invalid' + * flag here too. + */ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ if (info_ptr->valid & PNG_INFO_acTL) ++ png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays); ++#endif + #ifdef PNG_GAMMA_SUPPORTED + # ifdef PNG_WRITE_gAMA_SUPPORTED + if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 && +@@ -370,6 +374,11 @@ + png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); + #endif + ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ if (png_ptr->num_frames_written != png_ptr->num_frames_to_write) ++ png_error(png_ptr, "Not enough frames written"); ++#endif ++ + /* See if user wants us to write information chunks */ + if (info_ptr != NULL) + { +@@ -1461,6 +1470,43 @@ + } + #endif + ++#ifdef PNG_WRITE_APNG_SUPPORTED ++void PNGAPI ++png_write_frame_head(png_structp png_ptr, png_infop info_ptr, ++ png_bytepp row_pointers, png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, ++ png_byte blend_op) ++{ ++ png_debug(1, "in png_write_frame_head"); ++ ++ /* there is a chance this has been set after png_write_info was called, ++ * so it would be set but not written. is there a way to be sure? */ ++ if (!(info_ptr->valid & PNG_INFO_acTL)) ++ png_error(png_ptr, "png_write_frame_head(): acTL not set"); ++ ++ png_write_reset(png_ptr); ++ ++ png_write_reinit(png_ptr, info_ptr, width, height); ++ ++ if ( !(png_ptr->num_frames_written == 0 && ++ (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) ) ++ png_write_fcTL(png_ptr, width, height, x_offset, y_offset, ++ delay_num, delay_den, dispose_op, blend_op); ++ ++ PNG_UNUSED(row_pointers) ++} ++ ++void PNGAPI ++png_write_frame_tail(png_structp png_ptr, png_infop info_ptr) ++{ ++ png_debug(1, "in png_write_frame_tail"); ++ ++ png_ptr->num_frames_written++; ++ ++ PNG_UNUSED(info_ptr) ++} ++#endif /* PNG_WRITE_APNG_SUPPORTED */ + + #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED + /* Initialize the write structure - general purpose utility. */ +diff -Naru libpng-1.6.37.org/pngwutil.c libpng-1.6.37/pngwutil.c +--- libpng-1.6.37.org/pngwutil.c 2019-04-19 07:21:37.402024748 +0900 ++++ libpng-1.6.37/pngwutil.c 2019-04-19 07:22:37.867245682 +0900 +@@ -821,6 +821,11 @@ + /* Write the chunk */ + png_write_complete_chunk(png_ptr, png_IHDR, buf, 13); + ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ png_ptr->first_frame_width = width; ++ png_ptr->first_frame_height = height; ++#endif ++ + if ((png_ptr->do_filter) == PNG_NO_FILTERS) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || +@@ -1002,8 +1007,17 @@ + optimize_cmf(data, png_image_size(png_ptr)); + #endif + +- if (size > 0) +- png_write_complete_chunk(png_ptr, png_IDAT, data, size); ++ if (size > 0) ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ { ++ if (png_ptr->num_frames_written == 0) ++#endif ++ png_write_complete_chunk(png_ptr, png_IDAT, data, size); ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ else ++ png_write_fdAT(png_ptr, data, size); ++ } ++#endif /* PNG_WRITE_APNG_SUPPORTED */ + png_ptr->mode |= PNG_HAVE_IDAT; + + png_ptr->zstream.next_out = data; +@@ -1050,7 +1064,17 @@ + #endif + + if (size > 0) ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ { ++ if (png_ptr->num_frames_written == 0) ++#endif + png_write_complete_chunk(png_ptr, png_IDAT, data, size); ++#ifdef PNG_WRITE_APNG_SUPPORTED ++ else ++ png_write_fdAT(png_ptr, data, size); ++ } ++#endif /* PNG_WRITE_APNG_SUPPORTED */ ++ + png_ptr->zstream.avail_out = 0; + png_ptr->zstream.next_out = NULL; + png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT; +@@ -1885,6 +1909,82 @@ + } + #endif + ++#ifdef PNG_WRITE_APNG_SUPPORTED ++void /* PRIVATE */ ++png_write_acTL(png_structp png_ptr, ++ png_uint_32 num_frames, png_uint_32 num_plays) ++{ ++ png_byte buf[8]; ++ ++ png_debug(1, "in png_write_acTL"); ++ ++ png_ptr->num_frames_to_write = num_frames; ++ ++ if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ++ num_frames--; ++ ++ png_save_uint_32(buf, num_frames); ++ png_save_uint_32(buf + 4, num_plays); ++ ++ png_write_complete_chunk(png_ptr, png_acTL, buf, (png_size_t)8); ++} ++ ++void /* PRIVATE */ ++png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height, ++ png_uint_32 x_offset, png_uint_32 y_offset, ++ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op, ++ png_byte blend_op) ++{ ++ png_byte buf[26]; ++ ++ png_debug(1, "in png_write_fcTL"); ++ ++ if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0)) ++ png_error(png_ptr, "x and/or y offset for the first frame aren't 0"); ++ if (png_ptr->num_frames_written == 0 && ++ (width != png_ptr->first_frame_width || ++ height != png_ptr->first_frame_height)) ++ png_error(png_ptr, "width and/or height in the first frame's fcTL " ++ "don't match the ones in IHDR"); ++ ++ /* more error checking */ ++ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset, ++ delay_num, delay_den, dispose_op, blend_op); ++ ++ png_save_uint_32(buf, png_ptr->next_seq_num); ++ png_save_uint_32(buf + 4, width); ++ png_save_uint_32(buf + 8, height); ++ png_save_uint_32(buf + 12, x_offset); ++ png_save_uint_32(buf + 16, y_offset); ++ png_save_uint_16(buf + 20, delay_num); ++ png_save_uint_16(buf + 22, delay_den); ++ buf[24] = dispose_op; ++ buf[25] = blend_op; ++ ++ png_write_complete_chunk(png_ptr, png_fcTL, buf, (png_size_t)26); ++ ++ png_ptr->next_seq_num++; ++} ++ ++void /* PRIVATE */ ++png_write_fdAT(png_structp png_ptr, ++ png_const_bytep data, png_size_t length) ++{ ++ png_byte buf[4]; ++ ++ png_write_chunk_header(png_ptr, png_fdAT, (png_uint_32)(4 + length)); ++ ++ png_save_uint_32(buf, png_ptr->next_seq_num); ++ png_write_chunk_data(png_ptr, buf, 4); ++ ++ png_write_chunk_data(png_ptr, data, length); ++ ++ png_write_chunk_end(png_ptr); ++ ++ png_ptr->next_seq_num++; ++} ++#endif /* PNG_WRITE_APNG_SUPPORTED */ ++ + /* Initializes the row writing capability of libpng */ + void /* PRIVATE */ + png_write_start_row(png_structrp png_ptr) +@@ -2778,4 +2878,39 @@ + } + #endif /* WRITE_FLUSH */ + } ++ ++#ifdef PNG_WRITE_APNG_SUPPORTED ++void /* PRIVATE */ ++png_write_reset(png_structp png_ptr) ++{ ++ png_ptr->row_number = 0; ++ png_ptr->pass = 0; ++ png_ptr->mode &= ~PNG_HAVE_IDAT; ++} ++ ++void /* PRIVATE */ ++png_write_reinit(png_structp png_ptr, png_infop info_ptr, ++ png_uint_32 width, png_uint_32 height) ++{ ++ if (png_ptr->num_frames_written == 0 && ++ (width != png_ptr->first_frame_width || ++ height != png_ptr->first_frame_height)) ++ png_error(png_ptr, "width and/or height in the first frame's fcTL " ++ "don't match the ones in IHDR"); ++ if (width > png_ptr->first_frame_width || ++ height > png_ptr->first_frame_height) ++ png_error(png_ptr, "width and/or height for a frame greater than" ++ "the ones in IHDR"); ++ ++ png_set_IHDR(png_ptr, info_ptr, width, height, ++ info_ptr->bit_depth, info_ptr->color_type, ++ info_ptr->interlace_type, info_ptr->compression_type, ++ info_ptr->filter_type); ++ ++ png_ptr->width = width; ++ png_ptr->height = height; ++ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); ++ png_ptr->usr_width = png_ptr->width; ++} ++#endif /* PNG_WRITE_APNG_SUPPORTED */ + #endif /* WRITE */ +diff -Naru libpng-1.6.37.org/scripts/symbols.def libpng-1.6.37/scripts/symbols.def +--- libpng-1.6.37.org/scripts/symbols.def 2019-04-19 07:21:37.405024710 +0900 ++++ libpng-1.6.37/scripts/symbols.def 2019-04-19 07:22:37.856245823 +0900 +@@ -253,3 +253,23 @@ + png_set_eXIf @247 + png_get_eXIf_1 @248 + png_set_eXIf_1 @249 ++ png_get_acTL @250 ++ png_set_acTL @251 ++ png_get_num_frames @252 ++ png_get_num_plays @253 ++ png_get_next_frame_fcTL @254 ++ png_set_next_frame_fcTL @255 ++ png_get_next_frame_width @256 ++ png_get_next_frame_height @257 ++ png_get_next_frame_x_offset @258 ++ png_get_next_frame_y_offset @259 ++ png_get_next_frame_delay_num @260 ++ png_get_next_frame_delay_den @261 ++ png_get_next_frame_dispose_op @262 ++ png_get_next_frame_blend_op @263 ++ png_get_first_frame_is_hidden @264 ++ png_set_first_frame_is_hidden @265 ++ png_read_frame_head @266 ++ png_set_progressive_frame_fn @267 ++ png_write_frame_head @268 ++ png_write_frame_tail @269 diff --git a/repo/system/libpng.xibuild b/repo/system/libpng/libpng.xibuild index e40077d..e40077d 100644 --- a/repo/system/libpng.xibuild +++ b/repo/system/libpng/libpng.xibuild diff --git a/repo/system/libpsl.xibuild b/repo/system/libpsl/libpsl.xibuild index 1ac7a34..1ac7a34 100644 --- a/repo/system/libpsl.xibuild +++ b/repo/system/libpsl/libpsl.xibuild diff --git a/repo/system/libptytty.xibuild b/repo/system/libptytty/libptytty.xibuild index bc36364..bc36364 100644 --- a/repo/system/libptytty.xibuild +++ b/repo/system/libptytty/libptytty.xibuild diff --git a/repo/system/libqmi.xibuild b/repo/system/libqmi/libqmi.xibuild index 7439f1f..7439f1f 100644 --- a/repo/system/libqmi.xibuild +++ b/repo/system/libqmi/libqmi.xibuild diff --git a/repo/system/libqrtr.xibuild b/repo/system/libqrtr/libqrtr.xibuild index 7c4de5a..7c4de5a 100644 --- a/repo/system/libqrtr.xibuild +++ b/repo/system/libqrtr/libqrtr.xibuild diff --git a/repo/system/libretls.xibuild b/repo/system/libretls/libretls.xibuild index 97b31af..97b31af 100644 --- a/repo/system/libretls.xibuild +++ b/repo/system/libretls/libretls.xibuild diff --git a/repo/system/libretls/test_program.c b/repo/system/libretls/test_program.c new file mode 100644 index 0000000..f8d7332 --- /dev/null +++ b/repo/system/libretls/test_program.c @@ -0,0 +1,11 @@ +#include <stdlib.h> +#include <assert.h> +#include <tls.h> + +int +main(int argc, const char *argv[]) +{ + assert(tls_init() == 0); + + return EXIT_SUCCESS; +} diff --git a/repo/system/libsasl.xibuild b/repo/system/libsasl/libsasl.xibuild index 5c55e31..5c55e31 100644 --- a/repo/system/libsasl.xibuild +++ b/repo/system/libsasl/libsasl.xibuild diff --git a/repo/system/libseccomp.xibuild b/repo/system/libseccomp/libseccomp.xibuild index 5e05d58..5e05d58 100644 --- a/repo/system/libseccomp.xibuild +++ b/repo/system/libseccomp/libseccomp.xibuild diff --git a/repo/system/libsigsegv.xibuild b/repo/system/libsigsegv/libsigsegv.xibuild index 15fd491..15fd491 100644 --- a/repo/system/libsigsegv.xibuild +++ b/repo/system/libsigsegv/libsigsegv.xibuild diff --git a/repo/system/libssh2.xibuild b/repo/system/libssh2/libssh2.xibuild index ebf8cdf..ebf8cdf 100644 --- a/repo/system/libssh2.xibuild +++ b/repo/system/libssh2/libssh2.xibuild diff --git a/repo/system/libtasn1.xibuild b/repo/system/libtasn1/libtasn1.xibuild index a2394ed..a2394ed 100644 --- a/repo/system/libtasn1.xibuild +++ b/repo/system/libtasn1/libtasn1.xibuild diff --git a/repo/system/libtermkey.xibuild b/repo/system/libtermkey/libtermkey.xibuild index b73a16e..b73a16e 100644 --- a/repo/system/libtermkey.xibuild +++ b/repo/system/libtermkey/libtermkey.xibuild diff --git a/repo/system/libtirpc.xibuild b/repo/system/libtirpc/libtirpc.xibuild index ec4f3b9..ec4f3b9 100644 --- a/repo/system/libtirpc.xibuild +++ b/repo/system/libtirpc/libtirpc.xibuild diff --git a/repo/system/libtool.xibuild b/repo/system/libtool/libtool.xibuild index c97257c..c97257c 100644 --- a/repo/system/libtool.xibuild +++ b/repo/system/libtool/libtool.xibuild diff --git a/repo/system/libunistring.xibuild b/repo/system/libunistring/libunistring.xibuild index 286b0c8..286b0c8 100644 --- a/repo/system/libunistring.xibuild +++ b/repo/system/libunistring/libunistring.xibuild diff --git a/repo/system/libusb.xibuild b/repo/system/libusb/libusb.xibuild index 324b100..324b100 100644 --- a/repo/system/libusb.xibuild +++ b/repo/system/libusb/libusb.xibuild diff --git a/repo/system/libuv.xibuild b/repo/system/libuv/libuv.xibuild index 976b2b9..976b2b9 100644 --- a/repo/system/libuv.xibuild +++ b/repo/system/libuv/libuv.xibuild diff --git a/repo/system/libvterm.xibuild b/repo/system/libvterm/libvterm.xibuild index d212ccc..d212ccc 100644 --- a/repo/system/libvterm.xibuild +++ b/repo/system/libvterm/libvterm.xibuild diff --git a/repo/system/libxcrypt.xibuild b/repo/system/libxcrypt/libxcrypt.xibuild index ec931e1..ec931e1 100644 --- a/repo/system/libxcrypt.xibuild +++ b/repo/system/libxcrypt/libxcrypt.xibuild diff --git a/repo/system/libxml2.xibuild b/repo/system/libxml2/libxml2.xibuild index 9e2fd8a..9e2fd8a 100644 --- a/repo/system/libxml2.xibuild +++ b/repo/system/libxml2/libxml2.xibuild diff --git a/repo/system/libxslt.xibuild b/repo/system/libxslt/libxslt.xibuild index 805925f..805925f 100644 --- a/repo/system/libxslt.xibuild +++ b/repo/system/libxslt/libxslt.xibuild diff --git a/repo/system/ljx.xibuild b/repo/system/ljx/ljx.xibuild index c28cd7b..c28cd7b 100644 --- a/repo/system/ljx.xibuild +++ b/repo/system/ljx/ljx.xibuild diff --git a/repo/system/lua-lpeg/build-static-lib.patch b/repo/system/lua-lpeg/build-static-lib.patch new file mode 100644 index 0000000..d8a8f8c --- /dev/null +++ b/repo/system/lua-lpeg/build-static-lib.patch @@ -0,0 +1,29 @@ +--- a/makefile ++++ b/makefile +@@ -24,12 +24,15 @@ + + CFLAGS = $(CWARNS) $(COPT) -std=c99 -I$(LUADIR) -fPIC + CC = gcc ++AR = ar ++RANLIB = ranlib + + FILES = lpvm.o lpcap.o lptree.o lpcode.o lpprint.o + + # For Linux + linux: + $(MAKE) lpeg.so "DLLFLAGS = -shared -fPIC" ++ $(MAKE) lpeg.a + + # For Mac OS + macosx: +@@ -37,6 +40,10 @@ + + lpeg.so: $(FILES) + env $(CC) $(DLLFLAGS) $(FILES) -o lpeg.so ++ ++lpeg.a: $(FILES) ++ env $(AR) rc lpeg.a $(FILES) ++ env $(RANLIB) lpeg.a + + $(FILES): makefile + diff --git a/repo/system/lua-lpeg.xibuild b/repo/system/lua-lpeg/lua-lpeg.xibuild index f2b3b4d..f2b3b4d 100644 --- a/repo/system/lua-lpeg.xibuild +++ b/repo/system/lua-lpeg/lua-lpeg.xibuild diff --git a/repo/system/lua-lpeg/test-fix-setlocale.patch b/repo/system/lua-lpeg/test-fix-setlocale.patch new file mode 100644 index 0000000..028c18c --- /dev/null +++ b/repo/system/lua-lpeg/test-fix-setlocale.patch @@ -0,0 +1,20 @@ +os.setlocale just calls setlocale() from libc and musl's implementation +behaves a bit differently in comparison with BSD libc or glibc. + +When particular locales for all categories are the same, e.g. "C", +`setlocale(LC_ALL, "")` returns just "C" on BSD libc (tested on macOS) +and glibc, but musl returns "C;C;C;C;C;C". When some locale is different, +e.g. LC_CTYPE, then on macOS you get "C/en_US.UTF-8/C/C/C/C", on glibc +"LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;...", on musl "en_US.UTF-8;C;C;C;C;C". + +--- a/test.lua ++++ b/test.lua +@@ -1428,7 +1428,7 @@ + + + -- testing pre-defined names +-assert(os.setlocale("C") == "C") ++assert(os.setlocale("C"):sub(1, 1) == "C") + + function eqlpeggsub (p1, p2) + local s1 = cs2str(re.compile(p1)) diff --git a/repo/system/lua-mpack/dont-install-busted.patch b/repo/system/lua-mpack/dont-install-busted.patch new file mode 100644 index 0000000..2acb260 --- /dev/null +++ b/repo/system/lua-mpack/dont-install-busted.patch @@ -0,0 +1,13 @@ +Fix Makefile to not try to download and install LuaRocks and busted; use +system-provided busted. +--- a/Makefile ++++ b/Makefile +@@ -61,7 +61,7 @@ + depsclean: + rm -rf $(DEPS_DIR) + +-test: $(BUSTED) $(MPACK) ++test: $(MPACK) + $(BUSTED) -o gtest test.lua + + valgrind: $(BUSTED) $(MPACK) diff --git a/repo/system/lua-mpack.xibuild b/repo/system/lua-mpack/lua-mpack.xibuild index 85c5195..85c5195 100644 --- a/repo/system/lua-mpack.xibuild +++ b/repo/system/lua-mpack/lua-mpack.xibuild diff --git a/repo/system/lua-mpack/skip-memleak-test.patch b/repo/system/lua-mpack/skip-memleak-test.patch new file mode 100644 index 0000000..f89b522 --- /dev/null +++ b/repo/system/lua-mpack/skip-memleak-test.patch @@ -0,0 +1,20 @@ +This test requires binary to be built in debug mode. +--- a/test.lua ++++ b/test.lua +@@ -276,16 +276,6 @@ + end) + end) + +- it('should not leak memory', function() +- -- get the path to the lua interpreter, taken from +- -- http://stackoverflow.com/a/18304231 +- local i_min = 0 +- while arg[ i_min ] do i_min = i_min - 1 end +- i_min = i_min + 1 +- local res = io.popen(arg[i_min]..' leak_test.lua'):read('*a') +- assert.are_same('ok\n', res) +- end) +- + describe('is_bin option', function() + it('controls if strings are serialized to BIN or STR', function() + local isbin = false diff --git a/repo/system/lua.xibuild b/repo/system/lua/lua.xibuild index fdcf8ab..fdcf8ab 100644 --- a/repo/system/lua.xibuild +++ b/repo/system/lua/lua.xibuild diff --git a/repo/system/lua/lua5.4.pc b/repo/system/lua/lua5.4.pc new file mode 100644 index 0000000..06c8abc --- /dev/null +++ b/repo/system/lua/lua5.4.pc @@ -0,0 +1,24 @@ +# lua.pc -- pkg-config data for Lua + +# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' +prefix=/usr +INSTALL_BIN=${prefix}/bin +INSTALL_INC=${prefix}/include +INSTALL_LIB=${prefix}/lib +INSTALL_MAN=${prefix}/man/man1 +INSTALL_LMOD=${prefix}/share/lua/@MAJOR_VER@ +INSTALL_CMOD=${prefix}/lib/lua/@MAJOR_VER@ + +# canonical vars +exec_prefix=${prefix} +libdir=${exec_prefix}/lib/lua@MAJOR_VER@ +includedir=${prefix}/include/lua@MAJOR_VER@ + +Name: Lua +Description: An Extensible Extension Language +Version: @MINOR_VER@ +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} + +# (end of lua@MAJOR_VER@.pc) diff --git a/repo/system/lua5-1/lua-5.1-make.patch b/repo/system/lua5-1/lua-5.1-make.patch new file mode 100644 index 0000000..2db6367 --- /dev/null +++ b/repo/system/lua5-1/lua-5.1-make.patch @@ -0,0 +1,71 @@ +--- ./Makefile.orig ++++ ./Makefile +@@ -126,3 +126,18 @@ + .PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho + + # (end of Makefile) ++ ++# Use libtool for binary installs, etc. ++ ++export V ++export LIBTOOL = ../libtool --quiet --tag=CC ++# See libtool manual about how to set this ++ ++alpine_clean: ++ cd src; $(MAKE) $@ ++ ++alpine_install: ++ mkdir -p $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) ++ cd src; $(LIBTOOL) --mode=install $(INSTALL_EXEC) lua luac $(INSTALL_BIN) ++ cd src; $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) ++ cd src; $(LIBTOOL) --mode=install $(INSTALL_DATA) liblua.la $(INSTALL_LIB) +--- ./src/Makefile.orig ++++ ./src/Makefile +@@ -51,10 +51,10 @@ + $(AR) $@ $(CORE_O) $(LIB_O) # DLL needs all object files + $(RANLIB) $@ + +-$(LUA_T): $(LUA_O) $(LUA_A) ++origin$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +-$(LUAC_T): $(LUAC_O) $(LUA_A) ++origin$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + + clean: +@@ -178,5 +178,34 @@ + lzio.h + print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h lopcodes.h lundump.h ++ ++ ++export LIBTOOL = ../libtool --quiet --tag=CC ++export LIB_VERSION = 0:0:0 ++ ++# The following rules use libtool for compiling and linking in order to ++# provide shared library support. ++ ++LIB_NAME = liblua.la ++LIB_OBJS = $(CORE_O:.o=.lo) $(LIB_O:.o=.lo) ++ ++%.lo %.o: %.c ++ $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< ++ ++$(LIB_NAME): $(LIB_OBJS) ++ $(LIBTOOL) --mode=link $(CC) -version-info $(LIB_VERSION) \ ++ -rpath $(RPATH) $(LDFLAGS) -o $(LIB_NAME) $(LIB_OBJS) $(LIB_LIBS) ++ ++$(LUA_T): $(LUA_O:.o=.lo) $(LIB_NAME) ++ $(LIBTOOL) --mode=link $(CC) -export-dynamic $(LDFLAGS) -o $@ $(LUA_O:.o=.lo) $(LIB_NAME) $(LUA_LIBS) ++ ++$(LUAC_T): $(LUAC_O:.o=.lo) $(LIB_NAME) ++ $(LIBTOOL) --mode=link $(CC) -static $(LDFLAGS) -o $@ $(LUAC_O:.o=.lo) $(LIB_NAME) ++ ++alpine_clean: ++ $(LIBTOOL) --mode=clean $(RM) $(ALL_O:.o=.lo) $(LIB_NAME) lua luac ++ ++alpine_all: $(LIB_NAME) $(LUA_T) $(LUAC_T) ++ + + # (end of Makefile) diff --git a/repo/system/lua5-1/lua-5.1-module_paths.patch b/repo/system/lua5-1/lua-5.1-module_paths.patch new file mode 100644 index 0000000..e67d09f --- /dev/null +++ b/repo/system/lua5-1/lua-5.1-module_paths.patch @@ -0,0 +1,24 @@ +--- a/src/luaconf.h ++++ b/src/luaconf.h +@@ -95,13 +94,19 @@ + + #else + #define LUA_ROOT "/usr/local/" ++#define LUA_ROOT2 "/usr/" + #define LUA_LDIR LUA_ROOT "share/lua/5.1/" ++#define LUA_LDIR2 LUA_ROOT2 "share/lua/5.1/" ++#define LUA_LDIR3 LUA_ROOT2 "share/lua/common/" + #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" ++#define LUA_CDIR2 LUA_ROOT2 "lib/lua/5.1/" + #define LUA_PATH_DEFAULT \ + "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ +- LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" ++ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ ++ LUA_LDIR2"?.lua;" LUA_LDIR2"?/init.lua;" \ ++ LUA_LDIR3"?.lua;" LUA_LDIR3"?/init.lua" + #define LUA_CPATH_DEFAULT \ +- "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" ++ "./?.so;" LUA_CDIR"?.so;" LUA_CDIR2"?.so;" LUA_CDIR"loadall.so" + #endif + + diff --git a/repo/system/lua5-1/lua-5.1-readline.patch b/repo/system/lua5-1/lua-5.1-readline.patch new file mode 100644 index 0000000..f144861 --- /dev/null +++ b/repo/system/lua5-1/lua-5.1-readline.patch @@ -0,0 +1,10 @@ +--- lua-5.1.1.orig/src/luaconf.h 2006-04-10 20:27:23.000000000 +0200 ++++ lua-5.1.1/src/luaconf.h 2006-11-15 14:53:07.000000000 +0100 +@@ -36,7 +36,6 @@ + #if defined(LUA_USE_LINUX) + #define LUA_USE_POSIX + #define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +-#define LUA_USE_READLINE /* needs some extra libraries */ + #endif + + #if defined(LUA_USE_MACOSX) diff --git a/repo/system/lua5-1/lua.pc b/repo/system/lua5-1/lua.pc new file mode 100644 index 0000000..1e78955 --- /dev/null +++ b/repo/system/lua5-1/lua.pc @@ -0,0 +1,32 @@ +# lua.pc -- pkg-config data for Lua + +# vars from install Makefile + +# grep '^V=' ../Makefile +V= 5.1 +# grep '^R=' ../Makefile +R= 5.1.5 + +# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' +prefix= /usr +INSTALL_BIN= ${prefix}/bin +INSTALL_INC= ${prefix}/include +INSTALL_LIB= ${prefix}/lib +INSTALL_MAN= ${prefix}/man/man1 +INSTALL_LMOD= ${prefix}/share/lua/${V} +INSTALL_CMOD= ${prefix}/lib/lua/${V} + +# canonical vars +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Lua +Description: An Extensible Extension Language +Version: ${R} +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} + +# (end of lua.pc) + diff --git a/repo/system/lua5-1.xibuild b/repo/system/lua5-1/lua5-1.xibuild index 5fc5f80..5fc5f80 100644 --- a/repo/system/lua5-1.xibuild +++ b/repo/system/lua5-1/lua5-1.xibuild diff --git a/repo/system/luajit.xibuild b/repo/system/luajit/luajit.xibuild index 09f6015..09f6015 100644 --- a/repo/system/luajit.xibuild +++ b/repo/system/luajit/luajit.xibuild diff --git a/repo/system/luajit/module-paths.patch b/repo/system/luajit/module-paths.patch new file mode 100644 index 0000000..46e8d12 --- /dev/null +++ b/repo/system/luajit/module-paths.patch @@ -0,0 +1,25 @@ +Add /usr/share/lua/common to LUA_PATH. We use this directory for Lua modules +that are compatible with Lua 5.1 and newer. + +--- a/src/luaconf.h ++++ b/src/luaconf.h +@@ -42,8 +42,10 @@ + #ifdef LUA_ROOT + #define LUA_JROOT LUA_ROOT + #define LUA_RLDIR LUA_ROOT "/share" LUA_LUADIR ++#define LUA_RLDIR2 LUA_ROOT "/share/lua/common/" + #define LUA_RCDIR LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR + #define LUA_RLPATH ";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua" ++#define LUA_RLPATH2 ";" LUA_RLDIR2 "?.lua;" LUA_RLDIR2 "?/init.lua" + #define LUA_RCPATH ";" LUA_RCDIR "?.so" + #else + #define LUA_JROOT LUA_LROOT +@@ -58,7 +60,7 @@ + #define LUA_LCPATH1 ";" LUA_LCDIR "?.so" + #define LUA_LCPATH2 ";" LUA_LCDIR "loadall.so" + +-#define LUA_PATH_DEFAULT "./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH ++#define LUA_PATH_DEFAULT "./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH LUA_RLPATH2 + #define LUA_CPATH_DEFAULT "./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2 + #endif + diff --git a/repo/system/lz4.xibuild b/repo/system/lz4/lz4.xibuild index e0bfd68..e0bfd68 100644 --- a/repo/system/lz4.xibuild +++ b/repo/system/lz4/lz4.xibuild diff --git a/repo/system/lzo.xibuild b/repo/system/lzo/lzo.xibuild index 4c24afc..4c24afc 100644 --- a/repo/system/lzo.xibuild +++ b/repo/system/lzo/lzo.xibuild diff --git a/repo/system/menu-cache/menu-cache-1.1.0-0001-Support-gcc10-compilation.patch b/repo/system/menu-cache/menu-cache-1.1.0-0001-Support-gcc10-compilation.patch new file mode 100644 index 0000000..29f8e53 --- /dev/null +++ b/repo/system/menu-cache/menu-cache-1.1.0-0001-Support-gcc10-compilation.patch @@ -0,0 +1,108 @@ +From 1ce739649b4d66339a03fc0ec9ee7a2f7c141780 Mon Sep 17 00:00:00 2001 +From: Mamoru TASAKA <mtasaka@fedoraproject.org> +Date: Fri, 24 Jan 2020 13:33:00 +0900 +Subject: [PATCH] Support gcc10 compilation + +gcc10 now defaults to -fno-common, and with gcc10 menu-cache compilation fails like + +/bin/ld: menu-merge.o:menu-cache-gen/menu-tags.h:167: multiple definition of `DirDirs'; main.o:menu-cache-gen/menu-tags.h:167: first defined here +/bin/ld: menu-merge.o:menu-cache-gen/menu-tags.h:164: multiple definition of `AppDirs'; main.o:menu-cache-gen/menu-tags.h:164: first defined here +/bin/ld: menu-merge.o:menu-cache-gen/menu-tags.h:52: multiple definition of `menuTag_Layout'; main.o:menu-cache-gen/menu-tags.h:52: first defined here +.... + +This patch fixes compilation with gcc10: properly declaring variables in header with "extern", and also removing some unneeded variables in header files. +--- + menu-cache-gen/menu-tags.h | 55 ++++++++++++-------------------------- + 1 file changed, 17 insertions(+), 38 deletions(-) + +diff --git a/menu-cache-gen/menu-tags.h b/menu-cache-gen/menu-tags.h +index f3fd7d3..f71c0bc 100644 +--- a/menu-cache-gen/menu-tags.h ++++ b/menu-cache-gen/menu-tags.h +@@ -22,38 +22,17 @@ + #include <libfm/fm-extra.h> + #include <menu-cache.h> + +-FmXmlFileTag menuTag_Menu; +-FmXmlFileTag menuTag_AppDir; +-FmXmlFileTag menuTag_DefaultAppDirs; +-FmXmlFileTag menuTag_DirectoryDir; +-FmXmlFileTag menuTag_DefaultDirectoryDirs; +-FmXmlFileTag menuTag_Include; +-FmXmlFileTag menuTag_Exclude; +-FmXmlFileTag menuTag_Filename; +-FmXmlFileTag menuTag_Or; +-FmXmlFileTag menuTag_And; +-FmXmlFileTag menuTag_Not; +-FmXmlFileTag menuTag_Category; +-FmXmlFileTag menuTag_MergeFile; +-FmXmlFileTag menuTag_MergeDir; +-FmXmlFileTag menuTag_DefaultMergeDirs; +-FmXmlFileTag menuTag_Directory; +-FmXmlFileTag menuTag_Name; +-FmXmlFileTag menuTag_Deleted; +-FmXmlFileTag menuTag_NotDeleted; +-FmXmlFileTag menuTag_OnlyUnallocated; +-FmXmlFileTag menuTag_NotOnlyUnallocated; +-FmXmlFileTag menuTag_All; +-FmXmlFileTag menuTag_LegacyDir; +-FmXmlFileTag menuTag_KDELegacyDirs; +-FmXmlFileTag menuTag_Move; +-FmXmlFileTag menuTag_Old; +-FmXmlFileTag menuTag_New; +-FmXmlFileTag menuTag_Layout; +-FmXmlFileTag menuTag_DefaultLayout; +-FmXmlFileTag menuTag_Menuname; +-FmXmlFileTag menuTag_Separator; +-FmXmlFileTag menuTag_Merge; ++extern FmXmlFileTag menuTag_AppDir; ++extern FmXmlFileTag menuTag_DirectoryDir; ++extern FmXmlFileTag menuTag_Include; ++extern FmXmlFileTag menuTag_Exclude; ++extern FmXmlFileTag menuTag_Filename; ++extern FmXmlFileTag menuTag_Or; ++extern FmXmlFileTag menuTag_And; ++extern FmXmlFileTag menuTag_Not; ++extern FmXmlFileTag menuTag_Category; ++extern FmXmlFileTag menuTag_All; ++extern FmXmlFileTag menuTag_LegacyDir; + + typedef enum { + MERGE_NONE, /* starting value */ +@@ -152,19 +131,19 @@ typedef struct { + } MenuRule; + + /* requested language(s) */ +-char **languages; ++extern char **languages; + + /* list of menu files to monitor */ +-GSList *MenuFiles; ++extern GSList *MenuFiles; + + /* list of menu dirs to monitor */ +-GSList *MenuDirs; ++extern GSList *MenuDirs; + + /* list of available app dirs */ +-GSList *AppDirs; ++extern GSList *AppDirs; + + /* list of available dir dirs */ +-GSList *DirDirs; ++extern GSList *DirDirs; + + /* parse and merge menu files */ + MenuMenu *get_merged_menu(const char *file, FmXmlFile **xmlfile, GError **error); +@@ -177,7 +156,7 @@ gboolean save_menu_cache(MenuMenu *layout, const char *menuname, const char *fil + void _free_layout_items(GList *data); + + /* verbosity level */ +-gint verbose; ++extern gint verbose; + + #define DBG if (verbose) g_debug + #define VDBG if (verbose > 1) g_debug +-- +2.24.1 + diff --git a/repo/system/menu-cache.xibuild b/repo/system/menu-cache/menu-cache.xibuild index 6183364..6183364 100644 --- a/repo/system/menu-cache.xibuild +++ b/repo/system/menu-cache/menu-cache.xibuild diff --git a/repo/system/mobile-broadband-provider-info.xibuild b/repo/system/mobile-broadband-provider-info/mobile-broadband-provider-info.xibuild index 618feb3..618feb3 100644 --- a/repo/system/mobile-broadband-provider-info.xibuild +++ b/repo/system/mobile-broadband-provider-info/mobile-broadband-provider-info.xibuild diff --git a/repo/system/modemmanager/modemmanager.initd b/repo/system/modemmanager/modemmanager.initd new file mode 100644 index 0000000..29310b3 --- /dev/null +++ b/repo/system/modemmanager/modemmanager.initd @@ -0,0 +1,11 @@ +#!/sbin/openrc-run + +supervisor=supervise-daemon +command=/usr/sbin/ModemManager +command_args="${modemmanager_opts}" + +description="ModemManager Daemon" + +depend() { + need dbus +} diff --git a/repo/system/modemmanager/modemmanager.rules b/repo/system/modemmanager/modemmanager.rules new file mode 100644 index 0000000..1eb7b19 --- /dev/null +++ b/repo/system/modemmanager/modemmanager.rules @@ -0,0 +1,296 @@ +<!DOCTYPE html> +<html lang='en'> +<head> +<title>modemmanager.rules « modemmanager « community - aports - Alpine packages build scripts +</title> +<meta name='generator' content='cgit v1.2.3'/> +<meta name='robots' content='index, nofollow'/> +<link rel='stylesheet' type='text/css' href='/cgit.css'/> +<link rel='shortcut icon' href='//alpinelinux.org/alpine-logo.ico'/> +<link rel='alternate' title='Atom feed' href='http://git.alpinelinux.org/aports/atom/community/modemmanager/modemmanager.rules?h=master' type='application/atom+xml'/> +<link rel='vcs-git' href='https://git.alpinelinux.org/aports' title='aports Git repository'/> +</head> +<body> +<div id='cgit'><table id='header'> +<tr> +<td class='logo' rowspan='2'><a href='/'><img src='//wiki.alpinelinux.org/images/alogo.png' alt='cgit logo'/></a></td> +<td class='main'><a href='/'>index</a> : <a title='aports' href='/aports/'>aports</a></td><td class='form'><form method='get'> +<select name='h' onchange='this.form.submit();'> +<option value='1.10-stable'>1.10-stable</option> +<option value='1.9'>1.9</option> +<option value='2.0-stable'>2.0-stable</option> +<option value='2.1-stable'>2.1-stable</option> +<option value='2.2-stable'>2.2-stable</option> +<option value='2.3-stable'>2.3-stable</option> +<option value='2.4-stable'>2.4-stable</option> +<option value='2.5-stable'>2.5-stable</option> +<option value='2.6-stable'>2.6-stable</option> +<option value='2.7-stable'>2.7-stable</option> +<option value='3.0-stable'>3.0-stable</option> +<option value='3.1-stable'>3.1-stable</option> +<option value='3.10-stable'>3.10-stable</option> +<option value='3.11-stable'>3.11-stable</option> +<option value='3.12-stable'>3.12-stable</option> +<option value='3.13-stable'>3.13-stable</option> +<option value='3.14-stable'>3.14-stable</option> +<option value='3.15-stable'>3.15-stable</option> +<option value='3.2-stable'>3.2-stable</option> +<option value='3.3-stable'>3.3-stable</option> +<option value='3.4-stable'>3.4-stable</option> +<option value='3.5-stable'>3.5-stable</option> +<option value='3.6-stable'>3.6-stable</option> +<option value='3.7-stable'>3.7-stable</option> +<option value='3.8-stable'>3.8-stable</option> +<option value='3.9-stable'>3.9-stable</option> +<option value='cherry-pick-980a8718'>cherry-pick-980a8718</option> +<option value='fs-upgrade-1.10.7'>fs-upgrade-1.10.7</option> +<option value='libcgroup'>libcgroup</option> +<option value='master' selected='selected'>master</option> +<option value='nuspell'>nuspell</option> +<option value='patches/3526'>patches/3526</option> +<option value='patches/3527'>patches/3527</option> +<option value='patches/3530'>patches/3530</option> +<option value='patches/3531'>patches/3531</option> +<option value='patches/3534'>patches/3534</option> +<option value='patches/3535'>patches/3535</option> +<option value='patches/3538'>patches/3538</option> +<option value='patches/3539'>patches/3539</option> +<option value='patches/3540'>patches/3540</option> +<option value='patches/3551'>patches/3551</option> +<option value='patches/3556'>patches/3556</option> +<option value='patches/3558'>patches/3558</option> +<option value='patches/3559'>patches/3559</option> +<option value='patches/3562'>patches/3562</option> +<option value='patches/3563'>patches/3563</option> +<option value='patches/3564'>patches/3564</option> +<option value='patches/3565'>patches/3565</option> +<option value='patches/3567'>patches/3567</option> +<option value='patches/3568'>patches/3568</option> +<option value='patches/3569'>patches/3569</option> +<option value='patches/3574'>patches/3574</option> +<option value='patches/3575'>patches/3575</option> +<option value='patches/3576'>patches/3576</option> +<option value='patches/3577'>patches/3577</option> +<option value='patches/3582'>patches/3582</option> +<option value='patches/3584'>patches/3584</option> +<option value='patches/3590'>patches/3590</option> +<option value='patches/3592'>patches/3592</option> +<option value='patches/3594'>patches/3594</option> +<option value='patches/3598'>patches/3598</option> +<option value='patches/3599'>patches/3599</option> +<option value='patches/3601'>patches/3601</option> +<option value='patches/3603'>patches/3603</option> +<option value='patches/3604'>patches/3604</option> +<option value='patches/3606'>patches/3606</option> +<option value='patches/3607'>patches/3607</option> +<option value='patches/3608'>patches/3608</option> +<option value='patches/3610'>patches/3610</option> +<option value='patches/3612'>patches/3612</option> +<option value='patches/3613'>patches/3613</option> +<option value='patches/3615'>patches/3615</option> +<option value='patches/3616'>patches/3616</option> +<option value='patches/3618'>patches/3618</option> +<option value='patches/3621'>patches/3621</option> +<option value='patches/3622'>patches/3622</option> +<option value='patches/3624'>patches/3624</option> +<option value='patches/3627'>patches/3627</option> +<option value='patches/3632'>patches/3632</option> +<option value='patches/3633'>patches/3633</option> +<option value='patches/3635'>patches/3635</option> +<option value='patches/3636'>patches/3636</option> +<option value='patches/3646'>patches/3646</option> +<option value='patches/3654'>patches/3654</option> +<option value='patches/3656'>patches/3656</option> +<option value='patches/3662'>patches/3662</option> +<option value='patches/3666'>patches/3666</option> +<option value='patches/3670'>patches/3670</option> +<option value='patches/3671'>patches/3671</option> +<option value='patches/3675'>patches/3675</option> +<option value='patches/3687'>patches/3687</option> +<option value='patches/3690'>patches/3690</option> +<option value='patches/3691'>patches/3691</option> +<option value='patches/3692'>patches/3692</option> +<option value='patches/3697'>patches/3697</option> +<option value='patches/3706'>patches/3706</option> +<option value='patches/3707'>patches/3707</option> +<option value='patches/3715'>patches/3715</option> +<option value='patches/3721'>patches/3721</option> +<option value='patches/3722'>patches/3722</option> +<option value='patches/3724'>patches/3724</option> +<option value='patches/3731'>patches/3731</option> +<option value='patches/3756'>patches/3756</option> +<option value='patches/3764'>patches/3764</option> +<option value='patches/3767'>patches/3767</option> +<option value='patches/3770'>patches/3770</option> +<option value='patches/3771'>patches/3771</option> +<option value='patches/3774'>patches/3774</option> +<option value='patches/3775'>patches/3775</option> +<option value='patches/3777'>patches/3777</option> +<option value='patches/3779'>patches/3779</option> +<option value='patches/3787'>patches/3787</option> +<option value='patches/3788'>patches/3788</option> +<option value='patches/3789'>patches/3789</option> +<option value='patches/3790'>patches/3790</option> +<option value='patches/3793'>patches/3793</option> +<option value='patches/3796'>patches/3796</option> +<option value='patches/3797'>patches/3797</option> +<option value='patches/3798'>patches/3798</option> +<option value='patches/3799'>patches/3799</option> +<option value='patches/3800'>patches/3800</option> +<option value='patches/3802'>patches/3802</option> +<option value='patches/3803'>patches/3803</option> +<option value='patches/3804'>patches/3804</option> +<option value='patches/3805'>patches/3805</option> +<option value='patches/3808'>patches/3808</option> +<option value='patches/3811'>patches/3811</option> +<option value='patches/3813'>patches/3813</option> +<option value='patches/3816'>patches/3816</option> +<option value='patches/3818'>patches/3818</option> +<option value='patches/3820'>patches/3820</option> +<option value='patches/3821'>patches/3821</option> +<option value='patches/3822'>patches/3822</option> +<option value='patches/3823'>patches/3823</option> +<option value='patches/3825'>patches/3825</option> +<option value='patches/3827'>patches/3827</option> +<option value='patches/3828'>patches/3828</option> +<option value='patches/3829'>patches/3829</option> +<option value='patches/3830'>patches/3830</option> +<option value='patches/3831'>patches/3831</option> +<option value='patches/3832'>patches/3832</option> +<option value='patches/3833'>patches/3833</option> +<option value='patches/3835'>patches/3835</option> +<option value='patches/3836'>patches/3836</option> +<option value='patches/3837'>patches/3837</option> +<option value='patches/3838'>patches/3838</option> +<option value='patches/3839'>patches/3839</option> +<option value='patches/3843'>patches/3843</option> +<option value='patches/3845'>patches/3845</option> +<option value='patches/3846'>patches/3846</option> +<option value='patches/3847'>patches/3847</option> +<option value='patches/3850'>patches/3850</option> +<option value='patches/3852'>patches/3852</option> +<option value='patches/3853'>patches/3853</option> +<option value='patches/3854'>patches/3854</option> +<option value='patches/3855'>patches/3855</option> +<option value='patches/3858'>patches/3858</option> +<option value='patches/3861'>patches/3861</option> +<option value='patches/3863'>patches/3863</option> +<option value='patches/3864'>patches/3864</option> +<option value='patches/3868'>patches/3868</option> +<option value='patches/3869'>patches/3869</option> +<option value='patches/3870'>patches/3870</option> +<option value='patches/3871'>patches/3871</option> +<option value='patches/3873'>patches/3873</option> +<option value='patches/3878'>patches/3878</option> +<option value='patches/3881'>patches/3881</option> +<option value='patches/3882'>patches/3882</option> +<option value='patches/3883'>patches/3883</option> +<option value='patches/3885'>patches/3885</option> +<option value='patches/3886'>patches/3886</option> +<option value='patches/3887'>patches/3887</option> +<option value='patches/3888'>patches/3888</option> +<option value='patches/3890'>patches/3890</option> +<option value='patches/3891'>patches/3891</option> +<option value='patches/3892'>patches/3892</option> +<option value='patches/3895'>patches/3895</option> +<option value='patches/3896'>patches/3896</option> +<option value='patches/3897'>patches/3897</option> +<option value='patches/3908'>patches/3908</option> +<option value='patches/3909'>patches/3909</option> +<option value='patches/3912'>patches/3912</option> +<option value='patches/3913'>patches/3913</option> +<option value='patches/3914'>patches/3914</option> +<option value='patches/3916'>patches/3916</option> +<option value='patches/3918'>patches/3918</option> +<option value='patches/3920'>patches/3920</option> +<option value='patches/3923'>patches/3923</option> +<option value='patches/3927'>patches/3927</option> +<option value='patches/3933'>patches/3933</option> +<option value='patches/3934'>patches/3934</option> +<option value='patches/3937'>patches/3937</option> +<option value='patches/3940'>patches/3940</option> +<option value='patches/3941'>patches/3941</option> +<option value='patches/3946'>patches/3946</option> +<option value='patches/3947'>patches/3947</option> +<option value='patches/3949'>patches/3949</option> +<option value='patches/3950'>patches/3950</option> +<option value='patches/3953'>patches/3953</option> +<option value='patches/3954'>patches/3954</option> +<option value='patches/3957'>patches/3957</option> +<option value='patches/3958'>patches/3958</option> +<option value='patches/3959'>patches/3959</option> +<option value='patches/3963'>patches/3963</option> +<option value='patches/3969'>patches/3969</option> +<option value='patches/3970'>patches/3970</option> +<option value='patches/3976'>patches/3976</option> +<option value='patches/3977'>patches/3977</option> +<option value='patches/3979'>patches/3979</option> +<option value='patches/3980'>patches/3980</option> +<option value='patches/3981'>patches/3981</option> +<option value='patches/3987'>patches/3987</option> +<option value='patches/3988'>patches/3988</option> +<option value='patches/3989'>patches/3989</option> +<option value='patches/3996'>patches/3996</option> +<option value='wlroots'>wlroots</option> +</select> <input type='submit' value='switch'/></form></td></tr> +<tr><td class='sub'>Alpine packages build scripts +</td><td class='sub right'>uwsgi</td></tr></table> +<table class='tabs'><tr><td> +<a href='/aports/about/'>about</a><a href='/aports/'>summary</a><a href='/aports/refs/'>refs</a><a href='/aports/log/community/modemmanager/modemmanager.rules'>log</a><a class='active' href='/aports/tree/community/modemmanager/modemmanager.rules'>tree</a><a href='/aports/commit/community/modemmanager/modemmanager.rules'>commit</a><a href='/aports/diff/community/modemmanager/modemmanager.rules'>diff</a><a href='/aports/stats/community/modemmanager/modemmanager.rules'>stats</a></td><td class='form'><form class='right' method='get' action='/aports/log/community/modemmanager/modemmanager.rules'> +<select name='qt'> +<option value='grep'>log msg</option> +<option value='author'>author</option> +<option value='committer'>committer</option> +<option value='range'>range</option> +</select> +<input class='txt' type='search' size='10' name='q' value=''/> +<input type='submit' value='search'/> +</form> +</td></tr></table> +<div class='path'>path: <a href='/aports/tree/'>root</a>/<a href='/aports/tree/community'>community</a>/<a href='/aports/tree/community/modemmanager'>modemmanager</a>/<a href='/aports/tree/community/modemmanager/modemmanager.rules'>modemmanager.rules</a></div><div class='content'>blob: 4c56fb7f9ef117068e03d8e6c01d2f51dad066bd (<a href='/aports/plain/community/modemmanager/modemmanager.rules'>plain</a>) (<a href='/aports/blame/community/modemmanager/modemmanager.rules'>blame</a>) +<table summary='blob content' class='blob'> +<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a> +<a id='n2' href='#n2'>2</a> +<a id='n3' href='#n3'>3</a> +<a id='n4' href='#n4'>4</a> +<a id='n5' href='#n5'>5</a> +<a id='n6' href='#n6'>6</a> +<a id='n7' href='#n7'>7</a> +<a id='n8' href='#n8'>8</a> +<a id='n9' href='#n9'>9</a> +<a id='n10' href='#n10'>10</a> +<a id='n11' href='#n11'>11</a> +<a id='n12' href='#n12'>12</a> +<a id='n13' href='#n13'>13</a> +<a id='n14' href='#n14'>14</a> +<a id='n15' href='#n15'>15</a> +<a id='n16' href='#n16'>16</a> +<a id='n17' href='#n17'>17</a> +<a id='n18' href='#n18'>18</a> +<a id='n19' href='#n19'>19</a> +</pre></td> +<td class='lines'><pre><code>// Let users in plugdev group modify ModemManager +polkit.addRule(function(action, subject) { + if ((action.id == "org.freedesktop.ModemManager1.Device.Control" || + action.id == "org.freedesktop.ModemManager1.Contacts" || + action.id == "org.freedesktop.ModemManager1.Messaging" || + action.id == "org.freedesktop.ModemManager1.Location") && + subject.isInGroup("plugdev") && subject.active) { + return "yes"; + } +}); + +// Let geoclue modify ModemManager for location gathering +polkit.addRule(function(action, subject) { + if ((action.id == "org.freedesktop.ModemManager1.Device.Control" || + action.id == "org.freedesktop.ModemManager1.Location") && + subject.isInGroup("geoclue")) { + return "yes"; + } +}); +</code></pre></td></tr></table> +</div> <!-- class=content --> +<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2022-03-31 19:59:28 +0000</div> +</div> <!-- id=cgit --> +</body> +</html> diff --git a/repo/system/modemmanager.xibuild b/repo/system/modemmanager/modemmanager.xibuild index b2d5c5d..b2d5c5d 100644 --- a/repo/system/modemmanager.xibuild +++ b/repo/system/modemmanager/modemmanager.xibuild diff --git a/repo/system/mpfr.xibuild b/repo/system/mpfr/mpfr.xibuild index a0fc726..a0fc726 100644 --- a/repo/system/mpfr.xibuild +++ b/repo/system/mpfr/mpfr.xibuild diff --git a/repo/system/msgpack-c.xibuild b/repo/system/msgpack-c/msgpack-c.xibuild index e0f8b8f..e0f8b8f 100644 --- a/repo/system/msgpack-c.xibuild +++ b/repo/system/msgpack-c/msgpack-c.xibuild diff --git a/repo/system/mtdev.xibuild b/repo/system/mtdev/mtdev.xibuild index 8c463b8..8c463b8 100644 --- a/repo/system/mtdev.xibuild +++ b/repo/system/mtdev/mtdev.xibuild diff --git a/repo/system/musl-fts.xibuild b/repo/system/musl-fts/musl-fts.xibuild index 508f84c..508f84c 100644 --- a/repo/system/musl-fts.xibuild +++ b/repo/system/musl-fts/musl-fts.xibuild diff --git a/repo/system/musl-legacy-compat.xibuild b/repo/system/musl-legacy-compat/musl-legacy-compat.xibuild index 00ecaa1..00ecaa1 100644 --- a/repo/system/musl-legacy-compat.xibuild +++ b/repo/system/musl-legacy-compat/musl-legacy-compat.xibuild diff --git a/repo/system/musl-obstack.xibuild b/repo/system/musl-obstack/musl-obstack.xibuild index bbc014d..bbc014d 100644 --- a/repo/system/musl-obstack.xibuild +++ b/repo/system/musl-obstack/musl-obstack.xibuild diff --git a/repo/system/musl/0001-riscv64-define-ELF_NFPREG.patch b/repo/system/musl/0001-riscv64-define-ELF_NFPREG.patch new file mode 100644 index 0000000..b2f0a0f --- /dev/null +++ b/repo/system/musl/0001-riscv64-define-ELF_NFPREG.patch @@ -0,0 +1,24 @@ +From e5d2823631bbfebacf48e1a34ed28f28d7cb2570 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 11 Jan 2021 09:40:33 -0800 +Subject: [PATCH] riscv64: define ELF_NFPREG + +ELF_NFPREG is used by some userspace applications like gdb +--- + arch/riscv64/bits/user.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/riscv64/bits/user.h b/arch/riscv64/bits/user.h +index 2da743ea..0d37de0b 100644 +--- a/arch/riscv64/bits/user.h ++++ b/arch/riscv64/bits/user.h +@@ -1,5 +1,6 @@ + #include <signal.h> + + #define ELF_NGREG 32 ++#define ELF_NFPREG 33 + typedef unsigned long elf_greg_t, elf_gregset_t[ELF_NGREG]; + typedef union __riscv_mc_fp_state elf_fpregset_t; +-- +2.30.1 + diff --git a/repo/system/musl/change-scheduler-functions-Linux-compatib.patch b/repo/system/musl/change-scheduler-functions-Linux-compatib.patch new file mode 100644 index 0000000..fb63dfd --- /dev/null +++ b/repo/system/musl/change-scheduler-functions-Linux-compatib.patch @@ -0,0 +1,52 @@ +diff -uNr musl-1.2.2.orig/src/sched/sched_getparam.c musl-1.2.2/src/sched/sched_getparam.c +--- musl-1.2.2.orig/src/sched/sched_getparam.c 2021-01-15 02:26:00.000000000 +0000 ++++ musl-1.2.2/src/sched/sched_getparam.c 2021-12-23 00:31:16.590518270 +0000 +@@ -1,8 +1,7 @@ + #include <sched.h> +-#include <errno.h> + #include "syscall.h" + + int sched_getparam(pid_t pid, struct sched_param *param) + { +- return __syscall_ret(-ENOSYS); ++ return syscall(SYS_sched_getparam, pid, param); + } +diff -uNr musl-1.2.2.orig/src/sched/sched_getscheduler.c musl-1.2.2/src/sched/sched_getscheduler.c +--- musl-1.2.2.orig/src/sched/sched_getscheduler.c 2021-01-15 02:26:00.000000000 +0000 ++++ musl-1.2.2/src/sched/sched_getscheduler.c 2021-12-23 00:33:32.949520644 +0000 +@@ -1,8 +1,7 @@ + #include <sched.h> +-#include <errno.h> + #include "syscall.h" + + int sched_getscheduler(pid_t pid) + { +- return __syscall_ret(-ENOSYS); ++ return syscall(SYS_sched_getscheduler, pid); + } +diff -uNr musl-1.2.2.orig/src/sched/sched_setparam.c musl-1.2.2/src/sched/sched_setparam.c +--- musl-1.2.2.orig/src/sched/sched_setparam.c 2021-01-15 02:26:00.000000000 +0000 ++++ musl-1.2.2/src/sched/sched_setparam.c 2021-12-23 00:35:12.277522374 +0000 +@@ -1,8 +1,7 @@ + #include <sched.h> +-#include <errno.h> + #include "syscall.h" + + int sched_setparam(pid_t pid, const struct sched_param *param) + { +- return __syscall_ret(-ENOSYS); ++ return syscall(SYS_sched_setparam, pid, param); + } +diff -uNr musl-1.2.2.orig/src/sched/sched_setscheduler.c musl-1.2.2/src/sched/sched_setscheduler.c +--- musl-1.2.2.orig/src/sched/sched_setscheduler.c 2021-01-15 02:26:00.000000000 +0000 ++++ musl-1.2.2/src/sched/sched_setscheduler.c 2021-12-23 00:36:37.548523859 +0000 +@@ -1,8 +1,7 @@ + #include <sched.h> +-#include <errno.h> + #include "syscall.h" + + int sched_setscheduler(pid_t pid, int sched, const struct sched_param *param) + { +- return __syscall_ret(-ENOSYS); ++ return syscall(SYS_sched_setscheduler, pid, sched, param); + } diff --git a/repo/system/musl/fix-utmp-wtmp-paths.patch b/repo/system/musl/fix-utmp-wtmp-paths.patch new file mode 100644 index 0000000..900abc7 --- /dev/null +++ b/repo/system/musl/fix-utmp-wtmp-paths.patch @@ -0,0 +1,29 @@ +diff -uNr musl-1.2.2.orig/include/paths.h musl-1.2.2/include/paths.h +--- musl-1.2.2.orig/include/paths.h 2021-01-14 20:26:00.000000000 -0600 ++++ musl-1.2.2/include/paths.h 2021-08-26 16:39:31.355618388 -0500 +@@ -18,9 +18,9 @@ + #define _PATH_SHADOW "/etc/shadow" + #define _PATH_SHELLS "/etc/shells" + #define _PATH_TTY "/dev/tty" +-#define _PATH_UTMP "/dev/null/utmp" ++#define _PATH_UTMP "/run/utmps/utmp" + #define _PATH_VI "/usr/bin/vi" +-#define _PATH_WTMP "/dev/null/wtmp" ++#define _PATH_WTMP "/var/log/wtmp" + + #define _PATH_DEV "/dev/" + #define _PATH_TMP "/tmp/" +diff -uNr musl-1.2.2.orig/include/utmp.h musl-1.2.2/include/utmp.h +--- musl-1.2.2.orig/include/utmp.h 2021-01-14 20:26:00.000000000 -0600 ++++ musl-1.2.2/include/utmp.h 2021-08-26 16:37:11.567365982 -0500 +@@ -37,8 +37,8 @@ + + int login_tty(int); + +-#define _PATH_UTMP "/dev/null/utmp" +-#define _PATH_WTMP "/dev/null/wtmp" ++#define _PATH_UTMP "/run/utmps/utmp" ++#define _PATH_WTMP "/var/log/wtmp" + + #define UTMP_FILE _PATH_UTMP + #define WTMP_FILE _PATH_WTMP diff --git a/repo/system/musl/handle-aux-at_base.patch b/repo/system/musl/handle-aux-at_base.patch new file mode 100644 index 0000000..7c9f2dc --- /dev/null +++ b/repo/system/musl/handle-aux-at_base.patch @@ -0,0 +1,46 @@ +This is required to make the gcompat ELF interpreter stub work with some +packed binaries. + +diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c +index b125eb1..616c6a6 100644 +--- a/src/env/__init_tls.c ++++ b/src/env/__init_tls.c +@@ -66,8 +66,10 @@ void *__copy_tls(unsigned char *mem) + } + + #if ULONG_MAX == 0xffffffff ++typedef Elf32_Ehdr Ehdr; + typedef Elf32_Phdr Phdr; + #else ++typedef Elf64_Ehdr Ehdr; + typedef Elf64_Phdr Phdr; + #endif + +@@ -77,15 +79,23 @@ extern const size_t _DYNAMIC[]; + static void static_init_tls(size_t *aux) + { + unsigned char *p; +- size_t n; ++ size_t n, e; + Phdr *phdr, *tls_phdr=0; + size_t base = 0; + void *mem; + +- for (p=(void *)aux[AT_PHDR],n=aux[AT_PHNUM]; n; n--,p+=aux[AT_PHENT]) { ++ if (aux[AT_BASE]) { ++ Ehdr *ehdr = (void *)aux[AT_BASE]; ++ p = (unsigned char *)aux[AT_BASE] + ehdr->e_phoff; ++ n = ehdr->e_phnum; ++ e = ehdr->e_phentsize; ++ } else { ++ p = (void *)aux[AT_PHDR]; ++ n = aux[AT_PHNUM]; ++ e = aux[AT_PHENT]; ++ } ++ for (; n; n--, p+=e) { + phdr = (void *)p; +- if (phdr->p_type == PT_PHDR) +- base = aux[AT_PHDR] - phdr->p_vaddr; + if (phdr->p_type == PT_DYNAMIC && _DYNAMIC) + base = (size_t)_DYNAMIC - phdr->p_vaddr; + if (phdr->p_type == PT_TLS) diff --git a/repo/system/musl.xibuild b/repo/system/musl/musl.xibuild index 6f15382..6f15382 100644 --- a/repo/system/musl.xibuild +++ b/repo/system/musl/musl.xibuild diff --git a/repo/system/musl/qsort_r.patch b/repo/system/musl/qsort_r.patch new file mode 100644 index 0000000..4ea6366 --- /dev/null +++ b/repo/system/musl/qsort_r.patch @@ -0,0 +1,213 @@ +Date: Tue, 9 Mar 2021 18:02:13 -0300 +From: Érico Nogueira <ericonr@...root.org> +To: musl@...ts.openwall.com +Cc: Érico Nogueira <ericonr@...root.org> +Subject: [PATCH v3] add qsort_r and make qsort a wrapper around it + +we make qsort a wrapper by providing a wrapper_cmp function that uses +the extra argument as a function pointer. should be optimized to a tail +call on most architectures, as long as it's built with +-fomit-frame-pointer, so the performance impact should be minimal. + +to keep the git history clean, for now qsort_r is implemented in qsort.c +and qsort is implemented in qsort_nr.c. qsort.c also received a few +trivial cleanups, including replacing (*cmp)() calls with cmp(). +qsort_nr.c contains only wrapper_cmp and qsort as a qsort_r wrapper +itself. +--- + +Following suggestions from IRC, as few changes as possible to the files, +a final clean up commit after this one would involve some git mv's (I +won't make a patch for it). Added weak_alias to force qsort to use +libc's qsort_r. + +If this can't be accepted due to the overhead on some archs (ppc, mips, +arm in some situations?), maybe we could revisit v2 of the patch? + + include/stdlib.h | 1 + + src/include/stdlib.h | 1 + + src/stdlib/qsort.c | 37 ++++++++++++++++++++----------------- + src/stdlib/qsort_nr.c | 14 ++++++++++++++ + 4 files changed, 36 insertions(+), 17 deletions(-) + create mode 100644 src/stdlib/qsort_nr.c + +diff --git a/include/stdlib.h b/include/stdlib.h +index b54a051f..0c0ced5f 100644 +--- a/include/stdlib.h ++++ b/include/stdlib.h +@@ -158,6 +158,7 @@ struct __locale_struct; + float strtof_l(const char *__restrict, char **__restrict, struct __locale_struct *); + double strtod_l(const char *__restrict, char **__restrict, struct __locale_struct *); + long double strtold_l(const char *__restrict, char **__restrict, struct __locale_struct *); ++void qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *); + #endif + + #if defined(_LARGEFILE64_SOURCE) || defined(_BSD_SOURCE) +diff --git a/src/include/stdlib.h b/src/include/stdlib.h +index e9da2015..812b04de 100644 +--- a/src/include/stdlib.h ++++ b/src/include/stdlib.h +@@ -8,6 +8,7 @@ hidden void __env_rm_add(char *, char *); + hidden int __mkostemps(char *, int, int); + hidden int __ptsname_r(int, char *, size_t); + hidden char *__randname(char *); ++hidden void __qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *); + + hidden void *__libc_malloc(size_t); + hidden void *__libc_malloc_impl(size_t); +diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c +index da58fd31..20e40dda 100644 +--- a/src/stdlib/qsort.c ++++ b/src/stdlib/qsort.c +@@ -24,6 +24,7 @@ + /* Smoothsort, an adaptive variant of Heapsort. Memory usage: O(1). + Run time: Worst case O(n log n), close to O(n) in the mostly-sorted case. */ + ++#define _BSD_SOURCE + #include <stdint.h> + #include <stdlib.h> + #include <string.h> +@@ -31,7 +32,7 @@ + #include "atomic.h" + #define ntz(x) a_ctz_l((x)) + +-typedef int (*cmpfun)(const void *, const void *); ++typedef int (*cmpfun)(const void *, const void *, void *); + + static inline int pntz(size_t p[2]) { + int r = ntz(p[0] - 1); +@@ -88,7 +89,7 @@ static inline void shr(size_t p[2], int n) + p[1] >>= n; + } + +-static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size_t lp[]) ++static void sift(unsigned char *head, size_t width, cmpfun cmp, void *arg, int pshift, size_t lp[]) + { + unsigned char *rt, *lf; + unsigned char *ar[14 * sizeof(size_t) + 1]; +@@ -99,10 +100,10 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size + rt = head - width; + lf = head - width - lp[pshift - 2]; + +- if((*cmp)(ar[0], lf) >= 0 && (*cmp)(ar[0], rt) >= 0) { ++ if(cmp(ar[0], lf, arg) >= 0 && cmp(ar[0], rt, arg) >= 0) { + break; + } +- if((*cmp)(lf, rt) >= 0) { ++ if(cmp(lf, rt, arg) >= 0) { + ar[i++] = lf; + head = lf; + pshift -= 1; +@@ -115,7 +116,7 @@ static void sift(unsigned char *head, size_t width, cmpfun cmp, int pshift, size + cycle(width, ar, i); + } + +-static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2], int pshift, int trusty, size_t lp[]) ++static void trinkle(unsigned char *head, size_t width, cmpfun cmp, void *arg, size_t pp[2], int pshift, int trusty, size_t lp[]) + { + unsigned char *stepson, + *rt, *lf; +@@ -130,13 +131,13 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2], + ar[0] = head; + while(p[0] != 1 || p[1] != 0) { + stepson = head - lp[pshift]; +- if((*cmp)(stepson, ar[0]) <= 0) { ++ if(cmp(stepson, ar[0], arg) <= 0) { + break; + } + if(!trusty && pshift > 1) { + rt = head - width; + lf = head - width - lp[pshift - 2]; +- if((*cmp)(rt, stepson) >= 0 || (*cmp)(lf, stepson) >= 0) { ++ if(cmp(rt, stepson, arg) >= 0 || cmp(lf, stepson, arg) >= 0) { + break; + } + } +@@ -150,11 +151,11 @@ static void trinkle(unsigned char *head, size_t width, cmpfun cmp, size_t pp[2], + } + if(!trusty) { + cycle(width, ar, i); +- sift(head, width, cmp, pshift, lp); ++ sift(head, width, cmp, arg, pshift, lp); + } + } + +-void qsort(void *base, size_t nel, size_t width, cmpfun cmp) ++void __qsort_r(void *base, size_t nel, size_t width, cmpfun cmp, void *arg) + { + size_t lp[12*sizeof(size_t)]; + size_t i, size = width * nel; +@@ -173,16 +174,16 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp) + + while(head < high) { + if((p[0] & 3) == 3) { +- sift(head, width, cmp, pshift, lp); ++ sift(head, width, cmp, arg, pshift, lp); + shr(p, 2); + pshift += 2; + } else { + if(lp[pshift - 1] >= high - head) { +- trinkle(head, width, cmp, p, pshift, 0, lp); ++ trinkle(head, width, cmp, arg, p, pshift, 0, lp); + } else { +- sift(head, width, cmp, pshift, lp); ++ sift(head, width, cmp, arg, pshift, lp); + } +- ++ + if(pshift == 1) { + shl(p, 1); + pshift = 0; +@@ -191,12 +192,12 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp) + pshift = 1; + } + } +- ++ + p[0] |= 1; + head += width; + } + +- trinkle(head, width, cmp, p, pshift, 0, lp); ++ trinkle(head, width, cmp, arg, p, pshift, 0, lp); + + while(pshift != 1 || p[0] != 1 || p[1] != 0) { + if(pshift <= 1) { +@@ -208,11 +209,13 @@ void qsort(void *base, size_t nel, size_t width, cmpfun cmp) + pshift -= 2; + p[0] ^= 7; + shr(p, 1); +- trinkle(head - lp[pshift] - width, width, cmp, p, pshift + 1, 1, lp); ++ trinkle(head - lp[pshift] - width, width, cmp, arg, p, pshift + 1, 1, lp); + shl(p, 1); + p[0] |= 1; +- trinkle(head - width, width, cmp, p, pshift, 1, lp); ++ trinkle(head - width, width, cmp, arg, p, pshift, 1, lp); + } + head -= width; + } + } ++ ++weak_alias(__qsort_r, qsort_r); +diff --git a/src/stdlib/qsort_nr.c b/src/stdlib/qsort_nr.c +new file mode 100644 +index 00000000..fe408fb1 +--- /dev/null ++++ b/src/stdlib/qsort_nr.c +@@ -0,0 +1,14 @@ ++#define _BSD_SOURCE ++#include <stdlib.h> ++ ++typedef int (*cmpfun)(const void *, const void *); ++ ++static int wrapper_cmp(const void *v1, const void *v2, void *cmp) ++{ ++ return ((cmpfun)cmp)(v1, v2); ++} ++ ++void qsort(void *base, size_t nel, size_t width, cmpfun cmp) ++{ ++ __qsort_r(base, nel, width, wrapper_cmp, cmp); ++} +-- +2.30.2 diff --git a/repo/system/musl/syscall-cp-epoll.patch b/repo/system/musl/syscall-cp-epoll.patch new file mode 100644 index 0000000..338620a --- /dev/null +++ b/repo/system/musl/syscall-cp-epoll.patch @@ -0,0 +1,16 @@ +diff --git a/src/linux/epoll.c b/src/linux/epoll.c +index deff5b10..93baa814 100644 +--- a/src/linux/epoll.c ++++ b/src/linux/epoll.c +@@ -24,9 +24,9 @@ int epoll_ctl(int fd, int op, int fd2, struct epoll_event *ev) + + int epoll_pwait(int fd, struct epoll_event *ev, int cnt, int to, const sigset_t *sigs) + { +- int r = __syscall(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8); ++ int r = __syscall_cp(SYS_epoll_pwait, fd, ev, cnt, to, sigs, _NSIG/8); + #ifdef SYS_epoll_wait +- if (r==-ENOSYS && !sigs) r = __syscall(SYS_epoll_wait, fd, ev, cnt, to); ++ if (r==-ENOSYS && !sigs) r = __syscall_cp(SYS_epoll_wait, fd, ev, cnt, to); + #endif + return __syscall_ret(r); + } diff --git a/repo/system/ncurses.xibuild b/repo/system/ncurses/ncurses.xibuild index 784ec63..784ec63 100644 --- a/repo/system/ncurses.xibuild +++ b/repo/system/ncurses/ncurses.xibuild diff --git a/repo/system/nettle.xibuild b/repo/system/nettle/nettle.xibuild index a0107c5..a0107c5 100644 --- a/repo/system/nettle.xibuild +++ b/repo/system/nettle/nettle.xibuild diff --git a/repo/system/networkmanager/networkmanager-dispatcher.initd b/repo/system/networkmanager/networkmanager-dispatcher.initd new file mode 100644 index 0000000..552cc15 --- /dev/null +++ b/repo/system/networkmanager/networkmanager-dispatcher.initd @@ -0,0 +1,12 @@ +#!/sbin/openrc-run + +supervisor=supervise-daemon +command=/usr/libexec/nm-dispatcher +command_args_foreground="--persist" + +description="Network Manager Dispatcher Daemon" + +depend() { + need dbus + before networkmanager +} diff --git a/repo/system/networkmanager/networkmanager.conf b/repo/system/networkmanager/networkmanager.conf new file mode 100644 index 0000000..526d2e4 --- /dev/null +++ b/repo/system/networkmanager/networkmanager.conf @@ -0,0 +1,2 @@ +[main] +dhcp=internal diff --git a/repo/system/networkmanager/networkmanager.initd b/repo/system/networkmanager/networkmanager.initd new file mode 100644 index 0000000..4ca6a0d --- /dev/null +++ b/repo/system/networkmanager/networkmanager.initd @@ -0,0 +1,17 @@ +#!/sbin/openrc-run +# Copyright (c) 2008 Saleem Abdulrasool <compnerd@compnerd.org> +# Distributed under the terms of the GNU General Purpose License v2 +# $Header: $ + +supervisor=supervise-daemon +command=/usr/sbin/NetworkManager +command_args_foreground="-n" + +description="Network Manager Daemon" + +depend() { + need dbus + provide net +} + +# vim: set ft=gentoo-init-d ts=3 sw=3 et: diff --git a/repo/system/networkmanager/networkmanager.rules b/repo/system/networkmanager/networkmanager.rules new file mode 100644 index 0000000..66d21d6 --- /dev/null +++ b/repo/system/networkmanager/networkmanager.rules @@ -0,0 +1,9 @@ +// Let users in plugdev group modify NetworkManager +polkit.addRule(function(action, subject) { + if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && + subject.isInGroup("plugdev") && subject.active) { + return "yes"; + } +}); + + diff --git a/repo/system/networkmanager.xibuild b/repo/system/networkmanager/networkmanager.xibuild index 910b601..910b601 100644 --- a/repo/system/networkmanager.xibuild +++ b/repo/system/networkmanager/networkmanager.xibuild diff --git a/repo/system/newt.xibuild b/repo/system/newt/newt.xibuild index 6696f55..6696f55 100644 --- a/repo/system/newt.xibuild +++ b/repo/system/newt/newt.xibuild diff --git a/repo/system/nodejs/disable-running-gyp-on-shared-deps.patch b/repo/system/nodejs/disable-running-gyp-on-shared-deps.patch new file mode 100644 index 0000000..f646201 --- /dev/null +++ b/repo/system/nodejs/disable-running-gyp-on-shared-deps.patch @@ -0,0 +1,20 @@ +From: Jakub Jirutka <jakub@jirutka.cz> +Date: Sat, 26 Nov 2016 01:32:00 +0200 +Subject: Disable running gyp on shared deps + +Author: Stephen Gallagher <sgallagh@redhat.com> + +Modified 2016-11-26 by Jakub Jirutka <jakub@jirutka.cz> to update for +Node.js 7.2.0 + +--- a/Makefile ++++ b/Makefile +@@ -141,7 +141,7 @@ + echo "'test-code-cache' target is a noop" + + out/Makefile: config.gypi common.gypi node.gyp \ +- deps/uv/uv.gyp deps/llhttp/llhttp.gyp deps/zlib/zlib.gyp \ ++ deps/uv/uv.gyp deps/llhttp/llhttp.gyp \ + tools/v8_gypfiles/toolchain.gypi tools/v8_gypfiles/features.gypi \ + tools/v8_gypfiles/inspector.gypi tools/v8_gypfiles/v8.gyp + $(PYTHON) tools/gyp_node.py -f make diff --git a/repo/system/nodejs/fix-build-with-system-c-ares.patch b/repo/system/nodejs/fix-build-with-system-c-ares.patch new file mode 100644 index 0000000..8121891 --- /dev/null +++ b/repo/system/nodejs/fix-build-with-system-c-ares.patch @@ -0,0 +1,535 @@ +From aff98a5667c22794e2eaf658f6dfbee54cdd4a3b Mon Sep 17 00:00:00 2001 +From: Felix Yan <felixonmars@archlinux.org> +Date: Thu, 12 Aug 2021 02:44:43 +0800 +Subject: [PATCH 1/2] deps: fix building with system c-ares on Linux +Patch-Source: https://github.com/nodejs/node/pull/39739 + +The change in #39724 breaks building with system c-ares +(`--shared-cares`): +``` +In file included from ../src/cares_wrap.cc:25: +../src/cares_wrap.h:25:11: fatal error: ares_nameser.h: No such file or +directory + 25 | # include <ares_nameser.h> + | ^~~~~~~~~~~~~~~~ +``` + +Since `ares_nameser.h` isn't available with a default system c-ares +installation, let's copy it as our private header here. + +Tested to build fine on Arch Linux with shared c-ares. +--- + src/ares_nameser.h | 482 +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 482 insertions(+) + create mode 100644 src/ares_nameser.h + +diff --git a/src/ares_nameser.h b/src/ares_nameser.h +new file mode 100644 +index 000000000000..5270e5a3a6a0 +--- /dev/null ++++ b/src/ares_nameser.h +@@ -0,0 +1,482 @@ ++ ++#ifndef ARES_NAMESER_H ++#define ARES_NAMESER_H ++ ++#ifdef HAVE_ARPA_NAMESER_H ++# include <arpa/nameser.h> ++#endif ++#ifdef HAVE_ARPA_NAMESER_COMPAT_H ++# include <arpa/nameser_compat.h> ++#endif ++ ++/* ============================================================================ ++ * arpa/nameser.h may or may not provide ALL of the below defines, so check ++ * each one individually and set if not ++ * ============================================================================ ++ */ ++ ++#ifndef NS_PACKETSZ ++# define NS_PACKETSZ 512 /* maximum packet size */ ++#endif ++ ++#ifndef NS_MAXDNAME ++# define NS_MAXDNAME 256 /* maximum domain name */ ++#endif ++ ++#ifndef NS_MAXCDNAME ++# define NS_MAXCDNAME 255 /* maximum compressed domain name */ ++#endif ++ ++#ifndef NS_MAXLABEL ++# define NS_MAXLABEL 63 ++#endif ++ ++#ifndef NS_HFIXEDSZ ++# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ ++#endif ++ ++#ifndef NS_QFIXEDSZ ++# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ ++#endif ++ ++#ifndef NS_RRFIXEDSZ ++# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ ++#endif ++ ++#ifndef NS_INT16SZ ++# define NS_INT16SZ 2 ++#endif ++ ++#ifndef NS_INADDRSZ ++# define NS_INADDRSZ 4 ++#endif ++ ++#ifndef NS_IN6ADDRSZ ++# define NS_IN6ADDRSZ 16 ++#endif ++ ++#ifndef NS_CMPRSFLGS ++# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ ++#endif ++ ++#ifndef NS_DEFAULTPORT ++# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ ++#endif ++ ++/* ============================================================================ ++ * arpa/nameser.h should provide these enumerations always, so if not found, ++ * provide them ++ * ============================================================================ ++ */ ++#ifndef HAVE_ARPA_NAMESER_H ++ ++typedef enum __ns_class { ++ ns_c_invalid = 0, /* Cookie. */ ++ ns_c_in = 1, /* Internet. */ ++ ns_c_2 = 2, /* unallocated/unsupported. */ ++ ns_c_chaos = 3, /* MIT Chaos-net. */ ++ ns_c_hs = 4, /* MIT Hesiod. */ ++ /* Query class values which do not appear in resource records */ ++ ns_c_none = 254, /* for prereq. sections in update requests */ ++ ns_c_any = 255, /* Wildcard match. */ ++ ns_c_max = 65536 ++} ns_class; ++ ++typedef enum __ns_type { ++ ns_t_invalid = 0, /* Cookie. */ ++ ns_t_a = 1, /* Host address. */ ++ ns_t_ns = 2, /* Authoritative server. */ ++ ns_t_md = 3, /* Mail destination. */ ++ ns_t_mf = 4, /* Mail forwarder. */ ++ ns_t_cname = 5, /* Canonical name. */ ++ ns_t_soa = 6, /* Start of authority zone. */ ++ ns_t_mb = 7, /* Mailbox domain name. */ ++ ns_t_mg = 8, /* Mail group member. */ ++ ns_t_mr = 9, /* Mail rename name. */ ++ ns_t_null = 10, /* Null resource record. */ ++ ns_t_wks = 11, /* Well known service. */ ++ ns_t_ptr = 12, /* Domain name pointer. */ ++ ns_t_hinfo = 13, /* Host information. */ ++ ns_t_minfo = 14, /* Mailbox information. */ ++ ns_t_mx = 15, /* Mail routing information. */ ++ ns_t_txt = 16, /* Text strings. */ ++ ns_t_rp = 17, /* Responsible person. */ ++ ns_t_afsdb = 18, /* AFS cell database. */ ++ ns_t_x25 = 19, /* X_25 calling address. */ ++ ns_t_isdn = 20, /* ISDN calling address. */ ++ ns_t_rt = 21, /* Router. */ ++ ns_t_nsap = 22, /* NSAP address. */ ++ ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ ++ ns_t_sig = 24, /* Security signature. */ ++ ns_t_key = 25, /* Security key. */ ++ ns_t_px = 26, /* X.400 mail mapping. */ ++ ns_t_gpos = 27, /* Geographical position (withdrawn). */ ++ ns_t_aaaa = 28, /* Ip6 Address. */ ++ ns_t_loc = 29, /* Location Information. */ ++ ns_t_nxt = 30, /* Next domain (security). */ ++ ns_t_eid = 31, /* Endpoint identifier. */ ++ ns_t_nimloc = 32, /* Nimrod Locator. */ ++ ns_t_srv = 33, /* Server Selection. */ ++ ns_t_atma = 34, /* ATM Address */ ++ ns_t_naptr = 35, /* Naming Authority PoinTeR */ ++ ns_t_kx = 36, /* Key Exchange */ ++ ns_t_cert = 37, /* Certification record */ ++ ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ ++ ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ ++ ns_t_sink = 40, /* Kitchen sink (experimentatl) */ ++ ns_t_opt = 41, /* EDNS0 option (meta-RR) */ ++ ns_t_apl = 42, /* Address prefix list (RFC3123) */ ++ ns_t_ds = 43, /* Delegation Signer (RFC4034) */ ++ ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */ ++ ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */ ++ ns_t_nsec = 47, /* Next Secure (RFC4034) */ ++ ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */ ++ ns_t_tkey = 249, /* Transaction key */ ++ ns_t_tsig = 250, /* Transaction signature. */ ++ ns_t_ixfr = 251, /* Incremental zone transfer. */ ++ ns_t_axfr = 252, /* Transfer zone of authority. */ ++ ns_t_mailb = 253, /* Transfer mailbox records. */ ++ ns_t_maila = 254, /* Transfer mail agent records. */ ++ ns_t_any = 255, /* Wildcard match. */ ++ ns_t_zxfr = 256, /* BIND-specific, nonstandard. */ ++ ns_t_caa = 257, /* Certification Authority Authorization. */ ++ ns_t_max = 65536 ++} ns_type; ++ ++typedef enum __ns_opcode { ++ ns_o_query = 0, /* Standard query. */ ++ ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ ++ ns_o_status = 2, /* Name server status query (unsupported). */ ++ /* Opcode 3 is undefined/reserved. */ ++ ns_o_notify = 4, /* Zone change notification. */ ++ ns_o_update = 5, /* Zone update message. */ ++ ns_o_max = 6 ++} ns_opcode; ++ ++typedef enum __ns_rcode { ++ ns_r_noerror = 0, /* No error occurred. */ ++ ns_r_formerr = 1, /* Format error. */ ++ ns_r_servfail = 2, /* Server failure. */ ++ ns_r_nxdomain = 3, /* Name error. */ ++ ns_r_notimpl = 4, /* Unimplemented. */ ++ ns_r_refused = 5, /* Operation refused. */ ++ /* these are for BIND_UPDATE */ ++ ns_r_yxdomain = 6, /* Name exists */ ++ ns_r_yxrrset = 7, /* RRset exists */ ++ ns_r_nxrrset = 8, /* RRset does not exist */ ++ ns_r_notauth = 9, /* Not authoritative for zone */ ++ ns_r_notzone = 10, /* Zone of record different from zone section */ ++ ns_r_max = 11, ++ /* The following are TSIG extended errors */ ++ ns_r_badsig = 16, ++ ns_r_badkey = 17, ++ ns_r_badtime = 18 ++} ns_rcode; ++ ++#endif /* HAVE_ARPA_NAMESER_H */ ++ ++ ++/* ============================================================================ ++ * arpa/nameser_compat.h typically sets these. However on some systems ++ * arpa/nameser.h does, but may not set all of them. Lets conditionally ++ * define each ++ * ============================================================================ ++ */ ++ ++#ifndef PACKETSZ ++# define PACKETSZ NS_PACKETSZ ++#endif ++ ++#ifndef MAXDNAME ++# define MAXDNAME NS_MAXDNAME ++#endif ++ ++#ifndef MAXCDNAME ++# define MAXCDNAME NS_MAXCDNAME ++#endif ++ ++#ifndef MAXLABEL ++# define MAXLABEL NS_MAXLABEL ++#endif ++ ++#ifndef HFIXEDSZ ++# define HFIXEDSZ NS_HFIXEDSZ ++#endif ++ ++#ifndef QFIXEDSZ ++# define QFIXEDSZ NS_QFIXEDSZ ++#endif ++ ++#ifndef RRFIXEDSZ ++# define RRFIXEDSZ NS_RRFIXEDSZ ++#endif ++ ++#ifndef INDIR_MASK ++# define INDIR_MASK NS_CMPRSFLGS ++#endif ++ ++#ifndef NAMESERVER_PORT ++# define NAMESERVER_PORT NS_DEFAULTPORT ++#endif ++ ++ ++/* opcodes */ ++#ifndef O_QUERY ++# define O_QUERY 0 /* ns_o_query */ ++#endif ++#ifndef O_IQUERY ++# define O_IQUERY 1 /* ns_o_iquery */ ++#endif ++#ifndef O_STATUS ++# define O_STATUS 2 /* ns_o_status */ ++#endif ++#ifndef O_NOTIFY ++# define O_NOTIFY 4 /* ns_o_notify */ ++#endif ++#ifndef O_UPDATE ++# define O_UPDATE 5 /* ns_o_update */ ++#endif ++ ++ ++/* response codes */ ++#ifndef SERVFAIL ++# define SERVFAIL ns_r_servfail ++#endif ++#ifndef NOTIMP ++# define NOTIMP ns_r_notimpl ++#endif ++#ifndef REFUSED ++# define REFUSED ns_r_refused ++#endif ++#if defined(_WIN32) && !defined(HAVE_ARPA_NAMESER_COMPAT_H) && defined(NOERROR) ++# undef NOERROR /* it seems this is already defined in winerror.h */ ++#endif ++#ifndef NOERROR ++# define NOERROR ns_r_noerror ++#endif ++#ifndef FORMERR ++# define FORMERR ns_r_formerr ++#endif ++#ifndef NXDOMAIN ++# define NXDOMAIN ns_r_nxdomain ++#endif ++/* Non-standard response codes, use numeric values */ ++#ifndef YXDOMAIN ++# define YXDOMAIN 6 /* ns_r_yxdomain */ ++#endif ++#ifndef YXRRSET ++# define YXRRSET 7 /* ns_r_yxrrset */ ++#endif ++#ifndef NXRRSET ++# define NXRRSET 8 /* ns_r_nxrrset */ ++#endif ++#ifndef NOTAUTH ++# define NOTAUTH 9 /* ns_r_notauth */ ++#endif ++#ifndef NOTZONE ++# define NOTZONE 10 /* ns_r_notzone */ ++#endif ++#ifndef TSIG_BADSIG ++# define TSIG_BADSIG 16 /* ns_r_badsig */ ++#endif ++#ifndef TSIG_BADKEY ++# define TSIG_BADKEY 17 /* ns_r_badkey */ ++#endif ++#ifndef TSIG_BADTIME ++# define TSIG_BADTIME 18 /* ns_r_badtime */ ++#endif ++ ++ ++/* classes */ ++#ifndef C_IN ++# define C_IN 1 /* ns_c_in */ ++#endif ++#ifndef C_CHAOS ++# define C_CHAOS 3 /* ns_c_chaos */ ++#endif ++#ifndef C_HS ++# define C_HS 4 /* ns_c_hs */ ++#endif ++#ifndef C_NONE ++# define C_NONE 254 /* ns_c_none */ ++#endif ++#ifndef C_ANY ++# define C_ANY 255 /* ns_c_any */ ++#endif ++ ++ ++/* types */ ++#ifndef T_A ++# define T_A 1 /* ns_t_a */ ++#endif ++#ifndef T_NS ++# define T_NS 2 /* ns_t_ns */ ++#endif ++#ifndef T_MD ++# define T_MD 3 /* ns_t_md */ ++#endif ++#ifndef T_MF ++# define T_MF 4 /* ns_t_mf */ ++#endif ++#ifndef T_CNAME ++# define T_CNAME 5 /* ns_t_cname */ ++#endif ++#ifndef T_SOA ++# define T_SOA 6 /* ns_t_soa */ ++#endif ++#ifndef T_MB ++# define T_MB 7 /* ns_t_mb */ ++#endif ++#ifndef T_MG ++# define T_MG 8 /* ns_t_mg */ ++#endif ++#ifndef T_MR ++# define T_MR 9 /* ns_t_mr */ ++#endif ++#ifndef T_NULL ++# define T_NULL 10 /* ns_t_null */ ++#endif ++#ifndef T_WKS ++# define T_WKS 11 /* ns_t_wks */ ++#endif ++#ifndef T_PTR ++# define T_PTR 12 /* ns_t_ptr */ ++#endif ++#ifndef T_HINFO ++# define T_HINFO 13 /* ns_t_hinfo */ ++#endif ++#ifndef T_MINFO ++# define T_MINFO 14 /* ns_t_minfo */ ++#endif ++#ifndef T_MX ++# define T_MX 15 /* ns_t_mx */ ++#endif ++#ifndef T_TXT ++# define T_TXT 16 /* ns_t_txt */ ++#endif ++#ifndef T_RP ++# define T_RP 17 /* ns_t_rp */ ++#endif ++#ifndef T_AFSDB ++# define T_AFSDB 18 /* ns_t_afsdb */ ++#endif ++#ifndef T_X25 ++# define T_X25 19 /* ns_t_x25 */ ++#endif ++#ifndef T_ISDN ++# define T_ISDN 20 /* ns_t_isdn */ ++#endif ++#ifndef T_RT ++# define T_RT 21 /* ns_t_rt */ ++#endif ++#ifndef T_NSAP ++# define T_NSAP 22 /* ns_t_nsap */ ++#endif ++#ifndef T_NSAP_PTR ++# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */ ++#endif ++#ifndef T_SIG ++# define T_SIG 24 /* ns_t_sig */ ++#endif ++#ifndef T_KEY ++# define T_KEY 25 /* ns_t_key */ ++#endif ++#ifndef T_PX ++# define T_PX 26 /* ns_t_px */ ++#endif ++#ifndef T_GPOS ++# define T_GPOS 27 /* ns_t_gpos */ ++#endif ++#ifndef T_AAAA ++# define T_AAAA 28 /* ns_t_aaaa */ ++#endif ++#ifndef T_LOC ++# define T_LOC 29 /* ns_t_loc */ ++#endif ++#ifndef T_NXT ++# define T_NXT 30 /* ns_t_nxt */ ++#endif ++#ifndef T_EID ++# define T_EID 31 /* ns_t_eid */ ++#endif ++#ifndef T_NIMLOC ++# define T_NIMLOC 32 /* ns_t_nimloc */ ++#endif ++#ifndef T_SRV ++# define T_SRV 33 /* ns_t_srv */ ++#endif ++#ifndef T_ATMA ++# define T_ATMA 34 /* ns_t_atma */ ++#endif ++#ifndef T_NAPTR ++# define T_NAPTR 35 /* ns_t_naptr */ ++#endif ++#ifndef T_KX ++# define T_KX 36 /* ns_t_kx */ ++#endif ++#ifndef T_CERT ++# define T_CERT 37 /* ns_t_cert */ ++#endif ++#ifndef T_A6 ++# define T_A6 38 /* ns_t_a6 */ ++#endif ++#ifndef T_DNAME ++# define T_DNAME 39 /* ns_t_dname */ ++#endif ++#ifndef T_SINK ++# define T_SINK 40 /* ns_t_sink */ ++#endif ++#ifndef T_OPT ++# define T_OPT 41 /* ns_t_opt */ ++#endif ++#ifndef T_APL ++# define T_APL 42 /* ns_t_apl */ ++#endif ++#ifndef T_DS ++# define T_DS 43 /* ns_t_ds */ ++#endif ++#ifndef T_SSHFP ++# define T_SSHFP 44 /* ns_t_sshfp */ ++#endif ++#ifndef T_RRSIG ++# define T_RRSIG 46 /* ns_t_rrsig */ ++#endif ++#ifndef T_NSEC ++# define T_NSEC 47 /* ns_t_nsec */ ++#endif ++#ifndef T_DNSKEY ++# define T_DNSKEY 48 /* ns_t_dnskey */ ++#endif ++#ifndef T_TKEY ++# define T_TKEY 249 /* ns_t_tkey */ ++#endif ++#ifndef T_TSIG ++# define T_TSIG 250 /* ns_t_tsig */ ++#endif ++#ifndef T_IXFR ++# define T_IXFR 251 /* ns_t_ixfr */ ++#endif ++#ifndef T_AXFR ++# define T_AXFR 252 /* ns_t_axfr */ ++#endif ++#ifndef T_MAILB ++# define T_MAILB 253 /* ns_t_mailb */ ++#endif ++#ifndef T_MAILA ++# define T_MAILA 254 /* ns_t_maila */ ++#endif ++#ifndef T_ANY ++# define T_ANY 255 /* ns_t_any */ ++#endif ++#ifndef T_ZXFR ++# define T_ZXFR 256 /* ns_t_zxfr */ ++#endif ++#ifndef T_CAA ++# define T_CAA 257 /* ns_t_caa */ ++#endif ++#ifndef T_MAX ++# define T_MAX 65536 /* ns_t_max */ ++#endif ++ ++ ++#endif /* ARES_NAMESER_H */ + +From db4643979ee676b3a3d6cdf2fb597d399cf8013f Mon Sep 17 00:00:00 2001 +From: Felix Yan <felixonmars@archlinux.org> +Date: Fri, 13 Aug 2021 00:01:59 +0800 +Subject: [PATCH 2/2] build: ignore cpplint for third-party ares_nameser.h + +--- + Makefile | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/Makefile b/Makefile +index ec4c774748cd..c418995c53c1 100644 +--- a/Makefile ++++ b/Makefile +@@ -1289,6 +1289,7 @@ jslint-ci: lint-js-ci + LINT_CPP_ADDON_DOC_FILES_GLOB = test/addons/??_*/*.cc test/addons/??_*/*.h + LINT_CPP_ADDON_DOC_FILES = $(wildcard $(LINT_CPP_ADDON_DOC_FILES_GLOB)) + LINT_CPP_EXCLUDE ?= ++LINT_CPP_EXCLUDE += src/ares_nameser.h + LINT_CPP_EXCLUDE += src/node_root_certs.h + LINT_CPP_EXCLUDE += $(LINT_CPP_ADDON_DOC_FILES) + LINT_CPP_EXCLUDE += $(wildcard test/js-native-api/??_*/*.cc test/js-native-api/??_*/*.h test/node-api/??_*/*.cc test/node-api/??_*/*.h) diff --git a/repo/system/nodejs.xibuild b/repo/system/nodejs/nodejs.xibuild index b4918c8..b4918c8 100644 --- a/repo/system/nodejs.xibuild +++ b/repo/system/nodejs/nodejs.xibuild diff --git a/repo/system/nspr.xibuild b/repo/system/nspr/nspr.xibuild index 30a47da..30a47da 100644 --- a/repo/system/nspr.xibuild +++ b/repo/system/nspr/nspr.xibuild diff --git a/repo/system/nss/nss-config.in b/repo/system/nss/nss-config.in new file mode 100644 index 0000000..f8f893e --- /dev/null +++ b/repo/system/nss/nss-config.in @@ -0,0 +1,145 @@ +#!/bin/sh + +prefix=@prefix@ + +major_version=@MOD_MAJOR_VERSION@ +minor_version=@MOD_MINOR_VERSION@ +patch_version=@MOD_PATCH_VERSION@ + +usage() +{ + cat <<EOF +Usage: nss-config [OPTIONS] [LIBRARIES] +Options: + [--prefix[=DIR]] + [--exec-prefix[=DIR]] + [--includedir[=DIR]] + [--libdir[=DIR]] + [--version] + [--libs] + [--cflags] +Dynamic Libraries: + nss + nssutil + ssl + smime +EOF + exit $1 +} + +if test $# -eq 0; then + usage 1 1>&2 +fi + +lib_ssl=yes +lib_smime=yes +lib_nss=yes +lib_nssutil=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --includedir=*) + includedir=$optarg + ;; + --includedir) + echo_includedir=yes + ;; + --libdir=*) + libdir=$optarg + ;; + --libdir) + echo_libdir=yes + ;; + --version) + echo ${major_version}.${minor_version}.${patch_version} + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + ssl) + lib_ssl=yes + ;; + smime) + lib_smime=yes + ;; + nss) + lib_nss=yes + ;; + nssutil) + lib_nssutil=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +# Set variables that may be dependent upon other variables +if test -z "$exec_prefix"; then + exec_prefix=`pkg-config --variable=exec_prefix nss` +fi +if test -z "$includedir"; then + includedir=`pkg-config --variable=includedir nss` +fi +if test -z "$libdir"; then + libdir=`pkg-config --variable=libdir nss` +fi + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_includedir" = "yes"; then + echo $includedir +fi + +if test "$echo_libdir" = "yes"; then + echo $libdir +fi + +if test "$echo_cflags" = "yes"; then + echo -I$includedir +fi + +if test "$echo_libs" = "yes"; then + libdirs="-Wl,-rpath-link,$libdir -L$libdir" + if test -n "$lib_ssl"; then + libdirs="$libdirs -lssl${major_version}" + fi + if test -n "$lib_smime"; then + libdirs="$libdirs -lsmime${major_version}" + fi + if test -n "$lib_nss"; then + libdirs="$libdirs -lnss${major_version}" + fi + if test -n "$lib_nssutil"; then + libdirs="$libdirs -lnssutil${major_version}" + fi + echo $libdirs +fi + diff --git a/repo/system/nss/nss-softokn.pc.in b/repo/system/nss/nss-softokn.pc.in new file mode 100644 index 0000000..50485ac --- /dev/null +++ b/repo/system/nss/nss-softokn.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS-SOFTOKN +Description: Network Security Services Softoken PKCS #11 Module +Version: %SOFTOKEN_VERSION% +Requires: nspr >= %NSPR_VERSION%, nss-util >= %NSSUTIL_VERSION% +Libs: -lfreebl3 -lnssdbm3 -lsoftokn3 +Cflags: -I${includedir}/private diff --git a/repo/system/nss/nss-util.pc.in b/repo/system/nss/nss-util.pc.in new file mode 100644 index 0000000..1310248 --- /dev/null +++ b/repo/system/nss/nss-util.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS-UTIL +Description: Network Security Services Utility Library +Version: %NSSUTIL_VERSION% +Requires: nspr >= %NSPR_VERSION% +Libs: -L${libdir} -lnssutil3 +Cflags: -I${includedir} diff --git a/repo/system/nss/nss.pc.in b/repo/system/nss/nss.pc.in new file mode 100644 index 0000000..d47b9e1 --- /dev/null +++ b/repo/system/nss/nss.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS +Description: Network Security Services +Version: %NSS_VERSION% +Requires: nspr >= %NSPR_VERSION% +Libs: -lssl3 -lsmime3 -lnss3 -lnssutil3 +Cflags: -I${includedir} diff --git a/repo/system/nss.xibuild b/repo/system/nss/nss.xibuild index 07aa866..07aa866 100644 --- a/repo/system/nss.xibuild +++ b/repo/system/nss/nss.xibuild diff --git a/repo/system/nsss.xibuild b/repo/system/nsss/nsss.xibuild index 2623641..2623641 100644 --- a/repo/system/nsss.xibuild +++ b/repo/system/nsss/nsss.xibuild diff --git a/repo/system/openntpd/libtls-standalone.patch b/repo/system/openntpd/libtls-standalone.patch new file mode 100644 index 0000000..3b5d8e4 --- /dev/null +++ b/repo/system/openntpd/libtls-standalone.patch @@ -0,0 +1,20 @@ +diff --git a/configure.ac b/configure.ac +index 88884c2..b0c0697 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -60,8 +60,13 @@ AM_CONDITIONAL([HAVE_CLOCK_GETRES], [test "x$ac_cv_func_clock_getres" = xyes]) + AM_CONDITIONAL([HAVE_CLOCK_GETTIME], [test "x$ac_cv_func_clock_gettime" = xyes]) + + # check for libtls +-AC_SEARCH_LIBS([tls_config_set_ca_mem],[tls], +- [LIBS="$LIBS -ltls -lssl -lcrypto"],,[-lssl -lcrypto]) ++PKG_CHECK_MODULES([LIBTLS], [libtls],[],[ ++ PKG_CHECK_MODULES([LIBTLS], [libtls-standalone]) ++ ]) ++AC_SEARCH_LIBS([tls_config_set_ca_mem],[tls tls-standalone], ++ [LIBS="$LIBS $LIBTLS_LIBS" ++ CFLAGS="$CFLAGS $LIBTLS_CFLAGS"], ++ ,[$LIBTLS_LIBS]) + AC_CHECK_FUNCS([tls_config_set_ca_mem]) + + # check if libtls uses 3-argument tls_write diff --git a/repo/system/openntpd/ntp-user.patch b/repo/system/openntpd/ntp-user.patch new file mode 100644 index 0000000..200676c --- /dev/null +++ b/repo/system/openntpd/ntp-user.patch @@ -0,0 +1,13 @@ +diff --git a/src/ntpd.h b/src/ntpd.h +index 6403391..cc41d42 100644 +--- a/src/ntpd.h ++++ b/src/ntpd.h +@@ -37,7 +37,7 @@ + #define MAXIMUM(a, b) ((a) > (b) ? (a) : (b)) + + #ifndef NTPD_USER +-#define NTPD_USER "_ntp" ++#define NTPD_USER "ntp" + #endif + + #ifndef SYSCONFDIR diff --git a/repo/system/openntpd/openntpd.confd b/repo/system/openntpd/openntpd.confd new file mode 100644 index 0000000..ec002b7 --- /dev/null +++ b/repo/system/openntpd/openntpd.confd @@ -0,0 +1,3 @@ +# See ntpd(8) man page ... some popular options: +# -s Set the time immediately at startup +#NTPD_OPTS= diff --git a/repo/system/openntpd/openntpd.initd b/repo/system/openntpd/openntpd.initd new file mode 100644 index 0000000..dc9a9ae --- /dev/null +++ b/repo/system/openntpd/openntpd.initd @@ -0,0 +1,14 @@ +#!/sbin/openrc-run + +name="NTP Server" +command=/usr/sbin/ntpd +command_args="-d $NTPD_OPTS" +command_background=yes +pidfile=/run/$RC_SVCNAME.pid +required_files=/etc/ntpd.conf + +depend() { + need net + provide ntp-client + use dns logger +} diff --git a/repo/system/openntpd.xibuild b/repo/system/openntpd/openntpd.xibuild index 5dfd7e9..5dfd7e9 100644 --- a/repo/system/openntpd.xibuild +++ b/repo/system/openntpd/openntpd.xibuild diff --git a/repo/system/openrc/0001-call-sbin-mkmntdirs-in-localmount-OpenRC-service.patch b/repo/system/openrc/0001-call-sbin-mkmntdirs-in-localmount-OpenRC-service.patch new file mode 100644 index 0000000..3d41060 --- /dev/null +++ b/repo/system/openrc/0001-call-sbin-mkmntdirs-in-localmount-OpenRC-service.patch @@ -0,0 +1,25 @@ +From 78245081fe109ed7777b79ba9c99890d56c21272 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Wed, 1 Feb 2017 04:04:52 +0000 +Subject: [PATCH] call /sbin/mkmntdirs in localmount OpenRC service + +--- + init.d/localmount.in | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/init.d/localmount.in b/init.d/localmount.in +index c571504a..14189396 100644 +--- a/init.d/localmount.in ++++ b/init.d/localmount.in +@@ -21,6 +21,8 @@ depend() + + start() + { ++ [ -x /sbin/mkmntdirs ] && mkmntdirs ++ + # Mount local filesystems in /etc/fstab. + # The types variable must start with no, and must be a type + local critical= types="noproc" x= no_netdev= rc= +-- +2.33.1 + diff --git a/repo/system/openrc/0002-fsck-don-t-add-C0-to-busybox-fsck.patch b/repo/system/openrc/0002-fsck-don-t-add-C0-to-busybox-fsck.patch new file mode 100644 index 0000000..1d79818 --- /dev/null +++ b/repo/system/openrc/0002-fsck-don-t-add-C0-to-busybox-fsck.patch @@ -0,0 +1,35 @@ +From b143f35a45d59708365a52e329fd8caa6475a9bb Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Tue, 28 Nov 2017 13:35:10 +0100 +Subject: [PATCH] fsck: don't add -C0 to busybox fsck + +--- + init.d/fsck.in | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/init.d/fsck.in b/init.d/fsck.in +index 7052d808..99a9ae4f 100644 +--- a/init.d/fsck.in ++++ b/init.d/fsck.in +@@ -82,7 +82,7 @@ start() + local skiptypes + skiptypes=$(printf 'no%s,' ${net_fs_list} ${extra_net_fs_list}) + [ "${skiptypes}" = "no," ] && skiptypes="" +- fsck_opts="$fsck_opts -C0 -T -t ${skiptypes}noopts=_netdev" ++ fsck_opts="$fsck_opts -T -t ${skiptypes}noopts=_netdev" + if [ -z "$fsck_passno" -a -z "$fsck_mnt" ]; then + fsck_args=${fsck_args:--A -p} + if echo 2>/dev/null >/.test.$$; then +@@ -90,6 +90,9 @@ start() + fsck_opts="$fsck_opts -R" + fi + fi ++ if [ "$(readlink -f $(which fsck))" != "/bin/busybox" ]; then ++ fsck_opts="$fsck_opts -C0" ++ fi + fi + + trap : INT QUIT +-- +2.33.1 + diff --git a/repo/system/openrc/0003-rc-pull-in-sysinit-and-boot-as-stacked-levels-when-n.patch b/repo/system/openrc/0003-rc-pull-in-sysinit-and-boot-as-stacked-levels-when-n.patch new file mode 100644 index 0000000..546ccb7 --- /dev/null +++ b/repo/system/openrc/0003-rc-pull-in-sysinit-and-boot-as-stacked-levels-when-n.patch @@ -0,0 +1,70 @@ +From 17f33c1968a51484eefdafbfb5b8fef5ac13d215 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Wed, 1 Feb 2017 04:17:14 +0000 +Subject: [PATCH] rc: pull in sysinit and boot as stacked levels when needed + +We need start services from sysinit and boot runlevel, even if the new +runlevel is empty. + +This fixes problem introduced with commit 7716bf31 (Fix stacked runlevel +support), at which the start_services list are no longer used to start +the services. + +This also make sure that all services in sysinit and boot runlevels are +started before switching to next. This was not guaranteed when switching +to a non-empty runlevel. + +Fixes issue #54. +--- + src/rc/rc.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/rc/rc.c b/src/rc/rc.c +index ef46925d..82786074 100644 +--- a/src/rc/rc.c ++++ b/src/rc/rc.c +@@ -729,6 +729,7 @@ int main(int argc, char **argv) + const char *bootlevel = NULL; + char *newlevel = NULL; + const char *systype = NULL; ++ RC_STRINGLIST *runlevel_chain; + RC_STRINGLIST *deporder = NULL; + RC_STRINGLIST *tmplist; + RC_STRING *service; +@@ -986,6 +987,7 @@ int main(int argc, char **argv) + main_hotplugged_services = rc_services_in_state(RC_SERVICE_HOTPLUGGED); + main_start_services = rc_services_in_runlevel_stacked(newlevel ? + newlevel : runlevel); ++ runlevel_chain = rc_runlevel_stacks(newlevel ? newlevel : runlevel); + if (strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SHUTDOWN) != 0 && + strcmp(newlevel ? newlevel : runlevel, RC_LEVEL_SYSINIT) != 0) + { +@@ -1003,6 +1005,7 @@ int main(int argc, char **argv) + tmplist = rc_services_in_runlevel(bootlevel); + TAILQ_CONCAT(main_start_services, tmplist, entries); + free(tmplist); ++ rc_stringlist_add(runlevel_chain, bootlevel); + } + if (main_hotplugged_services) { + TAILQ_FOREACH(service, main_hotplugged_services, +@@ -1011,6 +1014,7 @@ int main(int argc, char **argv) + service->value); + } + } ++ rc_stringlist_add(runlevel_chain, RC_LEVEL_SYSINIT); + } + + parallel = rc_conf_yesno("rc_parallel"); +@@ -1067,9 +1071,6 @@ int main(int argc, char **argv) + + /* If we have a list of services to start then... */ + if (main_start_services) { +- /* Get a list of the chained runlevels which compose the target runlevel */ +- RC_STRINGLIST *runlevel_chain = rc_runlevel_stacks(runlevel); +- + /* Loop through them in reverse order. */ + RC_STRING *rlevel; + TAILQ_FOREACH_REVERSE(rlevel, runlevel_chain, rc_stringlist, entries) +-- +2.33.1 + diff --git a/repo/system/openrc/0004-make-consolefont-service-compatible-with-busyboxs-se.patch b/repo/system/openrc/0004-make-consolefont-service-compatible-with-busyboxs-se.patch new file mode 100644 index 0000000..b92b5ac --- /dev/null +++ b/repo/system/openrc/0004-make-consolefont-service-compatible-with-busyboxs-se.patch @@ -0,0 +1,70 @@ +From 613fb7f437c42e0ed01b2366b597598235e64a2d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net> +Date: Wed, 17 Aug 2016 17:52:58 +0200 +Subject: [PATCH] make consolefont service compatible with busyboxs setfont + applet + +Compared to kdbs setfont program it doesn't support -O and -m. +--- + conf.d/consolefont | 11 ++--------- + init.d/consolefont.in | 7 ++----- + 2 files changed, 4 insertions(+), 14 deletions(-) + +diff --git a/conf.d/consolefont b/conf.d/consolefont +index e01ae842..75544b2f 100644 +--- a/conf.d/consolefont ++++ b/conf.d/consolefont +@@ -3,16 +3,9 @@ + # + # consolefont specifies the default font that you'd like Linux to use on the + # console. You can find a good selection of fonts in /usr/share/consolefonts; +-# you shouldn't specify the trailing ".psf.gz", just the font name below. +-# To use the default console font, comment out the CONSOLEFONT setting below. +-consolefont="default8x16" ++consolefont="default8x16.psf.gz" + + # consoletranslation is the charset map file to use. Leave commented to use + # the default one. Have a look in /usr/share/consoletrans for a selection of + # map files you can use. +-#consoletranslation="8859-1_to_uni" +- +-# unicodemap is the unicode map file to use. Leave commented to use the +-# default one. Have a look in /usr/share/unimaps for a selection of map files +-# you can use. +-#unicodemap="iso01" ++#consoletranslation="8859-1_to_uni.trans" +diff --git a/init.d/consolefont.in b/init.d/consolefont.in +index d65dd14c..ccb6ee87 100644 +--- a/init.d/consolefont.in ++++ b/init.d/consolefont.in +@@ -22,7 +22,6 @@ start() + { + ttyn=${rc_tty_number:-${RC_TTY_NUMBER:-12}} + consolefont=${consolefont:-${CONSOLEFONT}} +- unicodemap=${unicodemap:-${UNICODEMAP}} + consoletranslation=${consoletranslation:-${CONSOLETRANSLATION}} + + if [ -z "$consolefont" ]; then +@@ -43,9 +42,6 @@ start() + if [ -n "$consoletranslation" ]; then + param="$param -m $consoletranslation" + fi +- if [ -n "${unicodemap}" ]; then +- param="$param -u $unicodemap" +- fi + + # Set the console font + ebegin "Setting console font [$consolefont]" +@@ -63,7 +59,8 @@ start() + # Store the font so we can use it ASAP on boot + if [ $retval -eq 0 ] && checkpath -W "$RC_LIBEXECDIR"; then + mkdir -p "$RC_LIBEXECDIR"/console +- setfont -O "$RC_LIBEXECDIR"/console/font ++ zcat "/usr/share/consolefonts/$consolefont" \ ++ > "$RC_LIBEXECDIR"/console/font + fi + + return $retval +-- +2.33.1 + diff --git a/repo/system/openrc/0005-Support-early-loading-of-keymap-if-kbd-is-installed.patch b/repo/system/openrc/0005-Support-early-loading-of-keymap-if-kbd-is-installed.patch new file mode 100644 index 0000000..f25d984 --- /dev/null +++ b/repo/system/openrc/0005-Support-early-loading-of-keymap-if-kbd-is-installed.patch @@ -0,0 +1,31 @@ +From a07970bf087c089f467eefa30c2476f17f6e9536 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net> +Date: Thu, 7 Mar 2019 16:55:53 +0100 +Subject: [PATCH] Support early loading of keymap if kbd is installed + +Early loading of the keymap with busybox was never supported and would +require modifying the save-keymaps services as well. Since no one +complained that it doesn't work with busybox so far just make it work +with kbd for now. +--- + sh/init-early.sh.Linux.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sh/init-early.sh.Linux.in b/sh/init-early.sh.Linux.in +index f304e924..7571ff3d 100644 +--- a/sh/init-early.sh.Linux.in ++++ b/sh/init-early.sh.Linux.in +@@ -48,8 +48,8 @@ if service_present "$RC_DEFAULTLEVEL" consolefont || + fi + + # Try and set a keyboard map as early as possible +-if service_present "$RC_DEFAULTLEVEL" keymaps || +- service_present "$RC_BOOTLEVEL" keymaps; then ++if service_present "$RC_DEFAULTLEVEL" loadkeys || ++ service_present "$RC_BOOTLEVEL" loadkeys; then + kbd_mode $kmode -C "$CONSOLE" 2>/dev/null + if [ -r "$RC_LIBEXECDIR"/console/keymap ]; then + loadkeys -q "$RC_LIBEXECDIR"/console/keymap 2>/dev/null +-- +2.33.1 + diff --git a/repo/system/openrc/0006-Add-support-for-starting-services-in-a-specified-VRF.patch b/repo/system/openrc/0006-Add-support-for-starting-services-in-a-specified-VRF.patch new file mode 100644 index 0000000..6f7ed69 --- /dev/null +++ b/repo/system/openrc/0006-Add-support-for-starting-services-in-a-specified-VRF.patch @@ -0,0 +1,101 @@ +From c250503412b061e69a99cfe12514e47fc06b5885 Mon Sep 17 00:00:00 2001 +From: Ariadne Conill <ariadne@dereferenced.org> +Date: Fri, 14 Feb 2020 16:02:43 +0000 +Subject: [PATCH] Add support for starting services in a specified VRF. + +The venerable iproute2 utility has recently introduced support +for executing programs in specific VRFs which are virtualized +routing tables. These are typically used to isolate different +networking planes from each other, for security or flexibility +reasons. + +Services which use the normal supervisor/start-stop-daemon +pattern can be configured by setting the vrf variable in the +/etc/conf.d tree for the service. + +This allows for things like configuring the sshd service to +run in a management VRF, which is useful for high assurance +environments where the management plane is intended to be +isolated. + +Signed-off-by: Ariadne Conill <ariadne@dereferenced.org> +--- + sh/openrc-run.sh.in | 6 ++++++ + sh/runit.sh | 2 +- + sh/s6.sh | 2 +- + sh/start-stop-daemon.sh | 2 +- + sh/supervise-daemon.sh | 2 +- + 5 files changed, 10 insertions(+), 4 deletions(-) + +diff --git a/sh/openrc-run.sh.in b/sh/openrc-run.sh.in +index 5c84af45..a1f374b0 100644 +--- a/sh/openrc-run.sh.in ++++ b/sh/openrc-run.sh.in +@@ -236,6 +236,12 @@ if ! sourcex -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL"; then + fi + unset _conf_d + ++# If we are configured to run in a VRF, provide a hint for that ++RC_VRF_EXEC="" ++if [ -n "$vrf" ]; then ++ RC_VRF_EXEC="/sbin/ip vrf exec $vrf" ++fi ++ + # load service supervisor functions + sourcex "@LIBEXECDIR@/sh/runit.sh" + sourcex "@LIBEXECDIR@/sh/s6.sh" +diff --git a/sh/runit.sh b/sh/runit.sh +index 5d82c9f6..c0186a43 100644 +--- a/sh/runit.sh ++++ b/sh/runit.sh +@@ -23,7 +23,7 @@ runit_start() + local i=0 retval=1 + # it can take upto 5 seconds for runsv to start + while [ $i -lt 6 ] ; do +- if sv start "${service_link}" > /dev/null 2>&1; then ++ if ${RC_VRF_EXEC} sv start "${service_link}" > /dev/null 2>&1; then + retval=0 + break + fi +diff --git a/sh/s6.sh b/sh/s6.sh +index acbe965b..1f339703 100644 +--- a/sh/s6.sh ++++ b/sh/s6.sh +@@ -37,7 +37,7 @@ s6_start() + ln -sf "${s6_service_path}" "${s6_service_link}" + s6-svscanctl -na "${RC_SVCDIR}"/s6-scan + sleep 1.5 +- s6-svc -u "${s6_service_link}" ++ ${RC_VRF_EXEC} s6-svc -u "${s6_service_link}" + if [ -n "$s6_svwait_options_start" ]; then + s6-svwait ${s6_svwait_options_start} "${s6_service_link}" + fi +diff --git a/sh/start-stop-daemon.sh b/sh/start-stop-daemon.sh +index 2e549ae1..5e7a1b88 100644 +--- a/sh/start-stop-daemon.sh ++++ b/sh/start-stop-daemon.sh +@@ -45,7 +45,7 @@ ssd_start() + #the eval call is necessary for cases like: + # command_args="this \"is a\" test" + # to work properly. +- eval start-stop-daemon --start \ ++ eval ${RC_VRF_EXEC} start-stop-daemon --start \ + --exec $command \ + ${chroot:+--chroot} $chroot \ + ${directory:+--chdir} $directory \ +diff --git a/sh/supervise-daemon.sh b/sh/supervise-daemon.sh +index e403a789..259b8166 100644 +--- a/sh/supervise-daemon.sh ++++ b/sh/supervise-daemon.sh +@@ -24,7 +24,7 @@ supervise_start() + # The eval call is necessary for cases like: + # command_args="this \"is a\" test" + # to work properly. +- eval supervise-daemon "${RC_SVCNAME}" --start \ ++ eval ${RC_VRF_EXEC} supervise-daemon "${RC_SVCNAME}" --start \ + ${retry:+--retry} $retry \ + ${directory:+--chdir} $directory \ + ${chroot:+--chroot} $chroot \ +-- +2.33.1 + diff --git a/repo/system/openrc/0007-Clean-up-staticroute-config-remove-irrelevant-parts-.patch b/repo/system/openrc/0007-Clean-up-staticroute-config-remove-irrelevant-parts-.patch new file mode 100644 index 0000000..34100ef --- /dev/null +++ b/repo/system/openrc/0007-Clean-up-staticroute-config-remove-irrelevant-parts-.patch @@ -0,0 +1,47 @@ +From f406231dc9a49b67ca558983de80513f95078309 Mon Sep 17 00:00:00 2001 +From: Ariadne Conill <ariadne@dereferenced.org> +Date: Wed, 8 Sep 2021 23:51:11 -0600 +Subject: [PATCH] Clean up staticroute config - remove irrelevant parts (for + BSD, Hurd) and suggest that route(8) is legacy. + +--- + conf.d/staticroute | 23 +++-------------------- + 1 file changed, 3 insertions(+), 20 deletions(-) + +diff --git a/conf.d/staticroute b/conf.d/staticroute +index 19d0961f..49d0e0bb 100644 +--- a/conf.d/staticroute ++++ b/conf.d/staticroute +@@ -1,26 +1,9 @@ +-# Static routes are defined differently depending on your operating +-# system, so please be sure to use the correct syntax. + # Do not use this file to define the default route. + # In all settings, multiple routes should be separated using ; or new lines. + +-# Define static routes on Linux using route. See route(8) for syntax. +-#staticroute="net 192.168.0.0 netmask 255.255.255.0 gw 10.73.1.1 +-#net 192.168.1.0 netmask 255.255.255.0 gw 10.73.1.1" +- + # Define static routes on Linux using iproute2. See ip(8) for syntax. + #staticiproute="192.168.0.0/24 via 10.73.1.1; 192.168.1.0/24 via 10.73.1.1" + +-# Define static routes on GNU/Hurd. See route(8) for syntax. +-# /etc/route.conf(5) takes precedence over this configuration. +-# FIXME: "net ..." not supported +-#staticroute="net 192.168.0.0 -netmask 255.255.255.0 --address 10.73.1.1 +-#net 192.168.1.0 -netmask 255.255.255.0 --address 10.73.1.1" +- +-# Define static routes on GNU/KFreeBSD. See route(8) for syntax. +-#staticroute="net 192.168.0.0 10.73.1.1 netmask 255.255.255.0 +-#net 192.168.1.0 10.73.1.1 netmask 255.255.255.0" +- +-# Define static routes on other BSD systems. See route(8) for syntax. +-# /etc/route.conf(5) takes precedence over this configuration. +-#staticroute="net 192.168.0.0 -netmask 255.255.255.0 10.73.1.1 +-#net 192.168.1.0 -netmask 255.255.255.0 10.73.1.1" ++# Or define static routes on Linux using route (legacy). See route(8) for syntax. ++#staticroute="net 192.168.0.0 netmask 255.255.255.0 gw 10.73.1.1 ++#net 192.168.1.0 netmask 255.255.255.0 gw 10.73.1.1" +-- +2.33.1 + diff --git a/repo/system/openrc/0008-bootmisc-switch-wipe_tmp-setting-to-no-by-default.patch b/repo/system/openrc/0008-bootmisc-switch-wipe_tmp-setting-to-no-by-default.patch new file mode 100644 index 0000000..f498d05 --- /dev/null +++ b/repo/system/openrc/0008-bootmisc-switch-wipe_tmp-setting-to-no-by-default.patch @@ -0,0 +1,44 @@ +From a756576ae62e4f24a2ea36e87053187cdfc1be63 Mon Sep 17 00:00:00 2001 +From: Ariadne Conill <ariadne@dereferenced.org> +Date: Wed, 13 Oct 2021 21:12:10 -0600 +Subject: [PATCH] bootmisc: switch wipe_tmp setting to no by default + +When wipe_tmp=yes, an insufficiently bounded rm -rf occurs that, +under specific unknown circumstances, can escape into other filesystems +resulting in data loss. + +See alpine/aports#13070. +--- + conf.d/bootmisc | 2 +- + init.d/bootmisc.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/conf.d/bootmisc b/conf.d/bootmisc +index dd5b08e0..5cf18d33 100644 +--- a/conf.d/bootmisc ++++ b/conf.d/bootmisc +@@ -3,7 +3,7 @@ clean_tmp_dirs="/tmp" + + # Should we wipe the tmp paths completely or just selectively remove known + # locks / files / etc... ? +-wipe_tmp="YES" ++wipe_tmp="NO" + + # Write the initial dmesg log into /var/log/dmesg after boot + # This may be useful if you need the kernel boot log afterwards +diff --git a/init.d/bootmisc.in b/init.d/bootmisc.in +index b1a849a3..8485110a 100644 +--- a/init.d/bootmisc.in ++++ b/init.d/bootmisc.in +@@ -17,7 +17,7 @@ depend() + keyword -prefix -timeout + } + +-: ${wipe_tmp:=${WIPE_TMP:-yes}} ++: ${wipe_tmp:=${WIPE_TMP:-no}} + : ${log_dmesg:=${LOG_DMESG:-yes}} + + cleanup_tmp_dir() +-- +2.33.1 + diff --git a/repo/system/openrc/0009-fix-bootmisc-mv-error.patch b/repo/system/openrc/0009-fix-bootmisc-mv-error.patch new file mode 100644 index 0000000..e87f9bb --- /dev/null +++ b/repo/system/openrc/0009-fix-bootmisc-mv-error.patch @@ -0,0 +1,27 @@ +From: Dermot Bradley <dermot_bradley@yahoo.com> +Date: Sat, 29 Jan 2022 19:28 +0000 +Subject: prevent a bootmisc trying to move a nonexistant file + +During boot if the "previous_dmesg" setting is enabled in +/etc/conf.d/bootmisc then during the 1st boot of a machine the +bootmisc init.d script will attempt to move a nonexistant dmesg +file, so generating an error on the console. + +Modify the script to only move an existing file. + +Upstream has merged this as PR 496 so it will be in the next release. + +--- + +diff -aur a/init.d/bootmisc.in b/init.d/bootmisc.in +--- a/init.d/bootmisc.in ++++ b/init.d/bootmisc.in +@@ -226,7 +226,7 @@ + case "$RC_SYS" in + VSERVER|OPENVZ|LXC|SYSTEMD-NSPAWN) ;; + *) +- if yesno ${previous_dmesg:-no}; then ++ if yesno ${previous_dmesg:-no} && [ -e /var/log/dmesg ]; then + mv /var/log/dmesg /var/log/dmesg.old + fi + dmesg > /var/log/dmesg diff --git a/repo/system/openrc/0010-noexec-devfs.patch b/repo/system/openrc/0010-noexec-devfs.patch new file mode 100644 index 0000000..9a8928c --- /dev/null +++ b/repo/system/openrc/0010-noexec-devfs.patch @@ -0,0 +1,14 @@ +--- a/init.d/devfs.in ++++ b/init.d/devfs.in +@@ -24,8 +24,9 @@ mount_dev() + action=--mount + conf_d_dir="${RC_SERVICE%/*/*}/conf.d" + msg=Mounting +- # Some devices require exec, Bug #92921 +- mountopts="exec,nosuid,mode=0755" ++ # Some devices require exec, https://bugs.gentoo.org/92921 ++ # Users with such requirements can use an fstab entry for /dev ++ mountopts="noexec,nosuid,mode=0755" + if yesno ${skip_mount_dev:-no} ; then + einfo "/dev will not be mounted due to user request" + return 0 diff --git a/repo/system/openrc/firstboot.initd b/repo/system/openrc/firstboot.initd new file mode 100644 index 0000000..eac4ef8 --- /dev/null +++ b/repo/system/openrc/firstboot.initd @@ -0,0 +1,34 @@ +#!/sbin/openrc-run + +# The first boot init service + +# read kernel options +init_KOPT() { + eval "set -- $(cat /proc/cmdline 2>/dev/null)" + for opt; do + case "$opt" in + ssh_*=*) + eval "KOPT_${opt%%=*}='${opt#*=}'" ;; + esac + done +} + +start() { + rm -f /etc/runlevels/*/$RC_SVCNAME + init_KOPT + local rc=0 + ebegin "Starting ${RC_SVCNAME}" + if [ -n "$KOPT_ssh_key" ] && [ ! -f "/root/.ssh/authorized_keys" ]; then + einfo "Fetching ssh keys" + mkdir -pm 700 /root/.ssh + checkpath -fm 0600 /root/.ssh/authorized_keys + case "$KOPT_ssh_key" in + https://*|ftps://*|http://*) + wget -q "$KOPT_ssh_key" -O /root/.ssh/authorized_keys + rc=$?;; + *) echo "$KOPT_ssh_key" > /root/.ssh/authorized_keys;; + esac + fi + eend $rc +} + diff --git a/repo/system/openrc/hostname.initd b/repo/system/openrc/hostname.initd new file mode 100644 index 0000000..4581595 --- /dev/null +++ b/repo/system/openrc/hostname.initd @@ -0,0 +1,18 @@ +#!/sbin/openrc-run + +description="Sets the hostname of the machine." + +depend() { + keyword -prefix -lxc -docker +} + +start() { + if [ -s /etc/hostname ] ; then + name=$(cat /etc/hostname) + else + name="${hostname:-localhost}" + fi + ebegin "Setting hostname" + hostname $name + eend $? +} diff --git a/repo/system/openrc/hwdrivers.initd b/repo/system/openrc/hwdrivers.initd new file mode 100644 index 0000000..80184c9 --- /dev/null +++ b/repo/system/openrc/hwdrivers.initd @@ -0,0 +1,32 @@ +#!/sbin/openrc-run + +depend() { + need sysfs dev + before checkfs fsck + after modloop + keyword -vserver -lxc +} + +# Load hardware drivers +start() { + # check for boot option "nocoldplug" + if get_bootparam noautodetect; then + ewarn "Autodetection of hardware disabled from boot cmdline" + return 0 + fi + + ebegin "Loading hardware drivers" + find /sys -name modalias -type f -print0 | xargs -0 sort -u \ + | xargs modprobe -b -a 2> /dev/null + # we run it twice so we detect all devices + find /sys -name modalias -type f -print0 | xargs -0 sort -u \ + | xargs modprobe -b -a 2> /dev/null + + # check if framebuffer drivers got pulled in + if [ -e /dev/fb0 ] && ! [ -e /sys/module/fbcon ]; then + modprobe -b -q fbcon + fi + + eend 0 +} + diff --git a/repo/system/openrc/machine-id.initd b/repo/system/openrc/machine-id.initd new file mode 100644 index 0000000..bdd0698 --- /dev/null +++ b/repo/system/openrc/machine-id.initd @@ -0,0 +1,17 @@ +#!/sbin/openrc-run + +description="Generate machine-id if needed" + +depend() { + need root dev +} + +start() { + if [ -s /etc/machine-id ] ; then + return 0 + fi + ebegin "Generating machine-id" + dd if=/dev/urandom status=none bs=16 count=1 \ + | md5sum | cut -d' ' -f1 > /etc/machine-id + eend $? +} diff --git a/repo/system/openrc/modloop.confd b/repo/system/openrc/modloop.confd new file mode 100644 index 0000000..6966429 --- /dev/null +++ b/repo/system/openrc/modloop.confd @@ -0,0 +1,6 @@ +# Enable loadable module support when running from RAM +# when OverlayFS support is available in the kernel. +# 0 means default tmpfs size (50% of physical RAM). +# for more information please see kernel documention at: +# https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt +overlay_size=0 diff --git a/repo/system/openrc/modloop.initd b/repo/system/openrc/modloop.initd new file mode 100755 index 0000000..fb7006c --- /dev/null +++ b/repo/system/openrc/modloop.initd @@ -0,0 +1,153 @@ +#!/sbin/openrc-run + +# script that will mount image with modules + +depend() { + after dev-mount + before checkfs fsck hwdrivers modules hwclock dev sysfs + keyword -vserver -lxc +} + +# read kernel options +init_KOPT() { + for opt in $(cat /proc/cmdline 2>/dev/null); do + case "$opt" in + modloop=*|modloop_verify=*) + eval "KOPT_${opt%%=*}='${opt#*=}'" ;; + esac + done +} + +mountdirs() { + awk '$2 !~ /^\/(sys|proc|dev|run)/ && $2 != "/" {print $2}' /proc/mounts +} + +find_modloop() { + local dir="$1" + local kver=$(uname -r) + local oifs="$IFS" + IFS=$'\n' + set -- $(blkid "$dir"/boot/* "$dir"/*) + IFS="$oifs" + for line; do + img=${line%%:*} + verify_modloop "$img" || eerror "Failed to verify signature of $img!" + mount "$img" -o loop,ro /.modloop || continue + if [ -d /.modloop/modules/$kver ]; then + return 0 + fi + umount /.modloop + done + return 1 +} + +verify_modloop() { + local modloop=$1 key= + if ! yesno "${KOPT_modloop_verify:=yes}"; then + return 0 + fi + for key in /etc/apk/keys/*.pub; do + local sig=/var/cache/misc/${modloop##*/}.SIGN.RSA.${key##*/} + if [ -f "$sig" ]; then + if ! command -v openssl > /dev/null; then + ewarn "Missing openssl. Modloop verification disabled!" + return 0 + fi + einfo "Verifying modloop" + openssl dgst -sha1 -verify "$key" -signature "$sig" "$modloop" \ + >/dev/null 2>&1 || return 1 + fi + done +} + +find_backing_file() { + local dir="$1" + local dev=$(df -P "$dir" | tail -1 | awk '{print $1}') + cat /sys/block/${dev#/dev/}/loop/backing_file 2>/dev/null +} + +start() { + local modloop= mount_opts= modloop_dldir="/lib" + init_KOPT + + case "$KOPT_modloop" in + none) return 0;; + http://*|https://*|ftp://*) + modloop=$modloop_dldir/${KOPT_modloop##*/} + if [ ! -f "$modloop" ]; then + mkdir -p "$modloop_dldir" + wget -P "$modloop_dldir" "$KOPT_modloop" || eend 1 + fi + ;; + *) + for dir in $(mountdirs); do + if [ -f "$dir"/$KOPT_modloop ]; then + modloop="$dir/${KOPT_modloop##/}" + alpine_mnt="$dir" + break + fi + done + ;; + esac + + ebegin "Mounting modloop $modloop" + mkdir -p /.modloop + if [ -n "$modloop" ]; then + verify_modloop "$modloop" || eerror "Failed to verify signature of $img!" + mount -o loop,ro $modloop /.modloop + eend $? || return 1 + else + for dir in $(mountdirs); do + if find_modloop "$dir"; then + alpine_mnt="$dir" + break + fi + done + if [ -d /.modloop/modules/$(uname -r) ]; then + eend 0 + else + eend 1 || return 1 + fi + fi + + #use overlayfs if available and configured + if grep -q -w "overlay$" /proc/filesystems && [ ! -z ${unionfs_size+x} ]; then + ewarn "Use of unionfs_size is deprecated use overlay_size instead" + overlay_size="$unionfs_size" + fi + if grep -q -w "overlay$" /proc/filesystems && [ -n "$overlay_size" ]; then + ebegin "OverlayFS detected, mounting modloop rw" + [ "$overlay_size" != 0 ] && mount_ops="-o size=$overlay_size" + mkdir -p /.modoverlayfs /lib/modules + mount -t tmpfs $mount_ops tmpfs /.modoverlayfs + mkdir -p /.modoverlayfs/modules /.modoverlayfs/work + mount -t overlay -o upperdir=/.modoverlayfs/modules,lowerdir=/lib/modules:/.modloop/modules,workdir=/.modoverlayfs/work overlay /lib/modules + depmod -A + eend $? || return 1 + else + rm -rf /lib/modules && ln -sf /.modloop/modules /lib/ + fi + + # copy firmware if there are any + if [ -d $alpine_mnt/firmware ]; then + ebegin "Copying firmware from $alpine_mnt/firmware" + cp -R -a $alpine_mnt/firmware /lib/ + eend $? + elif [ -d /lib/modules/firmware ]; then + rmdir /lib/firmware 2>/dev/null \ + && ln -s /lib/modules/firmware /lib/ + fi + return 0 +} + +stop() { + local ret=0 + local mnt; for mnt in /lib/modules /.modoverlayfs /.modloop; do + if mountinfo --quiet "$mnt"; then + ebegin "Unmounting $mnt" + umount -d "$mnt" || ret=1 + fi + done + eend $ret || return 1 +} + diff --git a/repo/system/openrc/modules.initd b/repo/system/openrc/modules.initd new file mode 100644 index 0000000..3cd141e --- /dev/null +++ b/repo/system/openrc/modules.initd @@ -0,0 +1,80 @@ +#!/sbin/openrc-run + +description="Loads a user defined list of kernel modules." + +depend() +{ + before hwclock hwdrivers + keyword -openvz -prefix -vserver -lxc +} + +start() { + yesno $rc_verbose && verbose=yes + + ebegin "Loading modules" + eindent + for f in /lib/modules-load.d/*.conf \ + /usr/lib/modules-load.d/*.conf; do + + if ! [ -f "$f" ]; then + continue + fi + + if [ -f /etc/modules-load.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /etc/modules-load.d/${f##*/}" + continue + fi + + if [ -f /run/modules-load.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /run/modules-load.d/${f##*/}" + continue + fi + + veinfo "Processing $f" + sed -e 's/\#.*//g' -e '/^[[:space:]]*$/d' < "$f" \ + | while read module args; do + modprobe -q $module $args + done + done + + if [ -f /etc/modules ]; then + veinfo "Processing /etc/modules" + sed -e 's/\#.*//g' -e '/^[[:space:]]*$/d' < /etc/modules \ + | while read module args; do + modprobe -q $module $args + done + fi + + for f in /etc/modules-load.d/*.conf; do + if [ ! -f "$f" ]; then + continue + fi + + if [ -f /run/modules-load.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /run/modules-load.d/${f##*/}" + continue + fi + + veinfo "Processing $f" + sed -e 's/\#.*//g' -e '/^[[:space:]]*$/d' < "$f" \ + | while read module args; do + modprobe -q $module $args + done + done + + for f in /run/modules-load.d/*.conf; do + if [ ! -f "$f" ]; then + continue + fi + + veinfo "Processing $f" + sed -e 's/\#.*//g' -e '/^[[:space:]]*$/d' < "$f" \ + | while read module args; do + modprobe -q $module $args + done + done + eoutdent + + eend $? +} + diff --git a/repo/system/openrc/networking.initd b/repo/system/openrc/networking.initd new file mode 100644 index 0000000..417f4a3 --- /dev/null +++ b/repo/system/openrc/networking.initd @@ -0,0 +1,88 @@ +#!/sbin/openrc-run + +# note that the spoofprotect, syncoockies and ip_forward options are set in +# /etc/sysctl.conf + +: ${cfgfile:="/etc/network/interfaces"} +: ${ifquery:="ifquery"} +: ${ifstate:="/run/ifstate"} + +single_iface="${RC_SVCNAME#*.}" +if [ "$single_iface" = "$RC_SVCNAME" ]; then + single_iface= +fi + +depend() { + need localmount + want dev-settle + after bootmisc hwdrivers modules + provide net + keyword -jail -prefix -vserver -docker +} + +# find interfaces we want to start +find_ifaces() { + if [ -n "$single_iface" ]; then + echo $single_iface + return 0 + fi + + if command -v "$ifquery" >/dev/null; then + $ifquery -i "$cfgfile" --list --auto + return + fi + + # fallback in case ifquery does not exist + awk '$1 == "auto" {for (i = 2; i <= NF; i = i + 1) printf("%s ", $i)}' "$cfgfile" +} + +# return the list of interfaces we should try stop +find_running_ifaces() { + if [ -n "$single_iface" ]; then + echo $single_iface + return 0 + fi + + if command -v "$ifquery" >/dev/null; then + $ifquery --state-file $ifstate -i "$cfgfile" --running + return + fi + + # fallback + awk -F= '{print $2}' $ifstate +} + +start() { + local iface= ret=1 + ebegin "Starting networking" + eindent + for iface in $(find_ifaces); do + local r=0 + ebegin "$iface" + if ! ifup -i "$cfgfile" $iface >/dev/null; then + ifdown -i "$cfgfile" $iface >/dev/null 2>&1 + r=1 + fi + # atleast one interface needs to be started for action + # to be success + eend $r && ret=0 + done + eoutdent + return $ret +} + +stop() { + local iface= + # Don't stop the network at shutdown. + yesno ${keep_network:-YES} && yesno $RC_GOINGDOWN && return 0 + + ebegin "Stopping networking" + eindent + for iface in $(find_running_ifaces); do + ebegin "$iface" + ifdown -i "$cfgfile" -f $iface >/dev/null + eend $? + done + eoutdent + return 0 +} diff --git a/repo/system/openrc/openrc.logrotate b/repo/system/openrc/openrc.logrotate new file mode 100644 index 0000000..5e5e64b --- /dev/null +++ b/repo/system/openrc/openrc.logrotate @@ -0,0 +1,4 @@ +/var/log/rc.log { + missingok + notifempty +} diff --git a/repo/system/openrc/openrc.post-install b/repo/system/openrc/openrc.post-install new file mode 100644 index 0000000..1c27350 --- /dev/null +++ b/repo/system/openrc/openrc.post-install @@ -0,0 +1,38 @@ +#!/bin/sh + +rc_update() { + local svc="$1" + local level="$2" + mkdir -p /etc/runlevels/$level + ln -sf /etc/init.d/$svc /etc/runlevels/$level +} + +if [ ! -d etc/rcS.d ] && [ ! -d etc/rcL.d ]; then + exit 0 +fi + +for i in etc/rc[SL].d/*; do + [ -L "$i" ] || continue + oldsvc=${i##*/S[0-9][0-9]} + # some services are renamed + case "$oldsvc" in + modutils) svc=modules;; + procps) svc=sysctl;; + bootmisc.sh) svc=bootmisc;; + keymap) svc=keymaps;; + rc.local) svc=local;; + *) svc=$oldsvc;; + esac + + # add the service to correct "runlevel" + case "$svc" in + syslog|klogd) + rc_update $svc sysinit;; + hwclock|modules|sysctl|hostname|keymaps|bootmisc) + rc_update $svc boot;; + *) rc_update $svc default;; + esac + + rm $i +done + diff --git a/repo/system/openrc/openrc.post-upgrade b/repo/system/openrc/openrc.post-upgrade new file mode 100644 index 0000000..8884202 --- /dev/null +++ b/repo/system/openrc/openrc.post-upgrade @@ -0,0 +1,35 @@ +#!/bin/sh + +# in 0.8.0-r1 the state dir moved from /libexec/rc/init.d to /lib/rc/init.d +# and with 0.10 it moved to /run/openrc + +mkdir -p /run/openrc +for dir in /libexec /lib; do + [ -d $dir/rc/init.d ] || continue + + for i in $dir/rc/init.d/* ; do + [ -e "$i" ] || continue + if [ -e /run/openrc/${i##*/} ]; then + rm -r $i + else + mv $i /run/openrc/ + fi + done + + rmdir $dir/rc/init.d $dir/rc /libexec 2>/dev/null +done + +# create rc.local compat +if [ -f /etc/rc.local ]; then + cat >/etc/local.d/rc.local-compat.start<<__EOF__ +#!/bin/sh + +# this is only here for compatibility reasons +if [ -f /etc/rc.local ]; then + . /etc/rc.local +fi +__EOF__ + chmod +x /etc/local.d/rc.local-compat.start +fi + +exit 0 diff --git a/repo/system/openrc.xibuild b/repo/system/openrc/openrc.xibuild index fb99da4..fb99da4 100644 --- a/repo/system/openrc.xibuild +++ b/repo/system/openrc/openrc.xibuild diff --git a/repo/system/openrc/rc.conf b/repo/system/openrc/rc.conf new file mode 100644 index 0000000..fdeb653 --- /dev/null +++ b/repo/system/openrc/rc.conf @@ -0,0 +1,313 @@ +# Global OpenRC configuration settings + +# Set to "YES" if you want the rc system to try and start services +# in parallel for a slight speed improvement. When running in parallel we +# prefix the service output with its name as the output will get +# jumbled up. +# WARNING: whilst we have improved parallel, it can still potentially lock +# the boot process. Don't file bugs about this unless you can supply +# patches that fix it without breaking other things! +rc_parallel="YES" + +# Set rc_interactive to "YES" and you'll be able to press the I key during +# boot so you can choose to start specific services. Set to "NO" to disable +# this feature. This feature is automatically disabled if rc_parallel is +# set to YES. +#rc_interactive="YES" + +# If we need to drop to a shell, you can specify it here. +# If not specified we use $SHELL, otherwise the one specified in /etc/passwd, +# otherwise /bin/sh +# Linux users could specify /sbin/sulogin +rc_shell=/bin/sh + +# Do we allow any started service in the runlevel to satisfy the dependency +# or do we want all of them regardless of state? For example, if net.eth0 +# and net.eth1 are in the default runlevel then with rc_depend_strict="NO" +# both will be started, but services that depend on 'net' will work if either +# one comes up. With rc_depend_strict="YES" we would require them both to +# come up. +#rc_depend_strict="YES" + +# rc_hotplug controls which services we allow to be hotplugged. +# A hotplugged service is one started by a dynamic dev manager when a matching +# hardware device is found. +# Hotplugged services appear in the "hotplugged" runlevel. +# If rc_hotplug is set to any value, we compare the name of this service +# to every pattern in the value, from left to right, and we allow the +# service to be hotplugged if it matches a pattern, or if it matches no +# patterns. Patterns can include shell wildcards. +# To disable services from being hotplugged, prefix patterns with "!". +#If rc_hotplug is not set or is empty, all hotplugging is disabled. +# Example - rc_hotplug="net.wlan !net.*" +# This allows net.wlan and any service not matching net.* to be hotplugged. +# Example - rc_hotplug="!net.*" +# This allows services that do not match "net.*" to be hotplugged. + +# rc_logger launches a logging daemon to log the entire rc process to +# /var/log/rc.log +# NOTE: Linux systems require the devfs service to be started before +# logging can take place and as such cannot log the sysinit runlevel. +#rc_logger="NO" + +# Through rc_log_path you can specify a custom log file. +# The default value is: /var/log/rc.log +#rc_log_path="/var/log/rc.log" + +# If you want verbose output for OpenRC, set this to yes. If you want +# verbose output for service foo only, set it to yes in /etc/conf.d/foo. +#rc_verbose=no + +# By default we filter the environment for our running scripts. To allow other +# variables through, add them here. Use a * to allow all variables through. +#rc_env_allow="VAR1 VAR2" + +# By default we assume that all daemons will start correctly. +# However, some do not - a classic example is that they fork and return 0 AND +# then child barfs on a configuration error. Or the daemon has a bug and the +# child crashes. You can set the number of milliseconds start-stop-daemon +# waits to check that the daemon is still running after starting here. +# The default is 0 - no checking. +#rc_start_wait=100 + +# rc_nostop is a list of services which will not stop when changing runlevels. +# This still allows the service itself to be stopped when called directly. +#rc_nostop="" + +# rc will attempt to start crashed services by default. +# However, it will not stop them by default as that could bring down other +# critical services. +#rc_crashed_stop=NO +#rc_crashed_start=YES + +# Set rc_nocolor to yes if you do not want colors displayed in OpenRC +# output. +#rc_nocolor=NO + +############################################################################## +# MISC CONFIGURATION VARIABLES +# There variables are shared between many init scripts + +# Set unicode to YES to turn on unicode support for keyboards and screens. +unicode="YES" + +# This is how long fuser should wait for a remote server to respond. The +# default is 60 seconds, but it can be adjusted here. +#rc_fuser_timeout=60 + +# Below is the default list of network fstypes. +# +# afs ceph cifs coda davfs fuse fuse.sshfs gfs glusterfs lustre ncpfs +# nfs nfs4 ocfs2 shfs smbfs +# +# If you would like to add to this list, you can do so by adding your +# own fstypes to the following variable. +#extra_net_fs_list="" + +############################################################################## +# SERVICE CONFIGURATION VARIABLES +# These variables are documented here, but should be configured in +# /etc/conf.d/foo for service foo and NOT enabled here unless you +# really want them to work on a global basis. +# If your service has characters in its name which are not legal in +# shell variable names and you configure the variables for it in this +# file, those characters should be replaced with underscores in the +# variable names as shown below. + +# Some daemons are started and stopped via start-stop-daemon. +# We can set some things on a per service basis, like the nicelevel. +#SSD_NICELEVEL="-19" +# Or the ionice level. The format is class[:data] , just like the +# --ionice start-stop-daemon parameter. +#SSD_IONICELEVEL="2:2" + +# Pass ulimit parameters +# If you are using bash in POSIX mode for your shell, note that the +# ulimit command uses a block size of 512 bytes for the -c and -f +# options +#rc_ulimit="-u 30" + +# It's possible to define extra dependencies for services like so +#rc_config="/etc/foo" +#rc_need="openvpn" +#rc_use="net.eth0" +#rc_after="clock" +#rc_before="local" +#rc_provide="!net" + +# You can also enable the above commands here for each service. Below is an +# example for service foo. +#rc_foo_config="/etc/foo" +#rc_foo_need="openvpn" +#rc_foo_after="clock" + +# Below is an example for service foo-bar. Note that the '-' is illegal +# in a shell variable name, so we convert it to an underscore. +# example for service foo-bar. +#rc_foo_bar_config="/etc/foo-bar" +#rc_foo_bar_need="openvpn" +#rc_foo_bar_after="clock" + +# You can also remove dependencies. +# This is mainly used for saying which services do NOT provide net. +#rc_net_tap0_provide="!net" + +# This is the subsystem type. +# It is used to match against keywords set by the keyword call in the +# depend function of service scripts. +# +# It should be set to the value representing the environment this file is +# PRESENTLY in, not the virtualization the environment is capable of. +# If it is commented out, automatic detection will be used. +# +# The list below shows all possible settings as well as the host +# operating systems where they can be used and autodetected. +# +# "" - nothing special +# "docker" - Docker container manager (Linux) +# "jail" - Jail (DragonflyBSD or FreeBSD) +# "lxc" - Linux Containers +# "openvz" - Linux OpenVZ +# "prefix" - Prefix +# "rkt" - CoreOS container management system (Linux) +# "subhurd" - Hurd subhurds (to be checked) +# "systemd-nspawn" - Container created by systemd-nspawn (Linux) +# "uml" - Usermode Linux +# "vserver" - Linux vserver +# "xen0" - Xen0 Domain (Linux and NetBSD) +# "xenU" - XenU Domain (Linux and NetBSD) +#rc_sys="" + +# if you use openrc-init, which is currently only available on Linux, +# this is the default runlevel to activate after "sysinit" and "boot" +# when booting. +#rc_default_runlevel="default" + +# on Linux and Hurd, this is the number of ttys allocated for logins +# It is used in the consolefont, keymaps, numlock and termencoding +# service scripts. +rc_tty_number=12 + +############################################################################## +# LINUX CGROUPS RESOURCE MANAGEMENT + +# This sets the mode used to mount cgroups. +# "hybrid" mounts cgroups version 2 on /sys/fs/cgroup/unified and +# cgroups version 1 on /sys/fs/cgroup. +# "legacy" mounts cgroups version 1 on /sys/fs/cgroup +# "unified" mounts cgroups version 2 on /sys/fs/cgroup +#rc_cgroup_mode="hybrid" + +# This is a list of controllers which should be enabled for cgroups version 2 +# when hybrid mode is being used. +# Controllers listed here will not be available for cgroups version 1. +#rc_cgroup_controllers="" + +# This variable contains the cgroups version 2 settings for your services. +# If this is set in this file, the settings will apply to all services. +# If you want different settings for each service, place the settings in +# /etc/conf.d/foo for service foo. +# The format is to specify the setting and value followed by a newline. +# Multiple settings and values can be specified. +# For example, you would use this to set the maximum memory and maximum +# number of pids for a service. +#rc_cgroup_settings=" +#memory.max 10485760 +#pids.max max +#" +# +# For more information about the adjustments that can be made with +# cgroups version 2, see Documentation/cgroups-v2.txt in the linux kernel +# source tree. +#rc_cgroup_settings="" + +# This switch controls whether or not cgroups version 1 controllers are +# individually mounted under +# /sys/fs/cgroup in hybrid or legacy mode. +#rc_controller_cgroups="YES" + +# The following setting turns on the memory.use_hierarchy setting in the +# root memory cgroup for cgroups v1. +# It must be set to yes in this file if you want this functionality. +#rc_cgroup_memory_use_hierarchy="NO" + +# The following settings allow you to set up values for the cgroups version 1 +# controllers for your services. +# They can be set in this file;, however, if you do this, the settings +# will apply to all of your services. +# If you want different settings for each service, place the settings in +# /etc/conf.d/foo for service foo. +# The format is to specify the names of the settings followed by their +# values. Each variable can hold multiple settings. +# For example, you would use this to set the cpu.shares setting in the +# cpu controller to 512 for your service. +# rc_cgroup_cpu=" +# cpu.shares 512 +# " +# +# For more information about the adjustments that can be made with +# cgroups version 1, see Documentation/cgroups-v1/* in the linux kernel +# source tree. + +# Set the blkio controller settings for this service. +#rc_cgroup_blkio="" + +# Set the cpu controller settings for this service. +#rc_cgroup_cpu="" + +# Add this service to the cpuacct controller (any value means yes). +#rc_cgroup_cpuacct="" + +# Set the cpuset controller settings for this service. +#rc_cgroup_cpuset="" + +# Set the devices controller settings for this service. +#rc_cgroup_devices="" + +# Set the hugetlb controller settings for this service. +#rc_cgroup_hugetlb="" + +# Set the memory controller settings for this service. +#rc_cgroup_memory="" + +# Set the net_cls controller settings for this service. +#rc_cgroup_net_cls="" + +# Set the net_prio controller settings for this service. +#rc_cgroup_net_prio="" + +# Set the pids controller settings for this service. +#rc_cgroup_pids="" + +# Set this to YES if you want all of the processes in a service's cgroup +# killed when the service is stopped or restarted. +# Be aware that setting this to yes means all of a service's +# child processes will be killed. Keep this in mind if you set this to +# yes here instead of for the individual services in +# /etc/conf.d/<service>. +# To perform this cleanup manually for a stopped service, you can +# execute cgroup_cleanup with /etc/init.d/<service> cgroup_cleanup or +# rc-service <service> cgroup_cleanup. +# The process followed in this cleanup is the following: +# 1. send stopsig (sigterm if it isn't set) to all processes left in the +# cgroup immediately followed by sigcont. +# 2. Send sighup to all processes in the cgroup if rc_send_sighup is +# yes. +# 3. delay for rc_timeout_stopsec seconds. +# 4. send sigkill to all processes in the cgroup unless disabled by +# setting rc_send_sigkill to no. +# rc_cgroup_cleanup="NO" + +# If this is yes, we will send sighup to the processes in the cgroup +# immediately after stopsig and sigcont. +#rc_send_sighup="NO" + +# This is the amount of time in seconds that we delay after sending sigcont +# and optionally sighup, before we optionally send sigkill to all +# processes in the # cgroup. +# The default is 90 seconds. +#rc_timeout_stopsec="90" + +# If this is set to no, we do not send sigkill to all processes in the +# cgroup. +#rc_send_sigkill="YES" diff --git a/repo/system/openrc/seedrng.patch b/repo/system/openrc/seedrng.patch new file mode 100644 index 0000000..ff61d81 --- /dev/null +++ b/repo/system/openrc/seedrng.patch @@ -0,0 +1,640 @@ +From 076c2552aeff88a27fe275dfaae61dedf4bb4bd5 Mon Sep 17 00:00:00 2001 +From: "Jason A. Donenfeld" <Jason@zx2c4.com> +Date: Thu, 24 Mar 2022 22:07:16 -0600 +Subject: [PATCH] Use seedrng for seeding the random number generator + +The RNG can't actually be seeded from a shell script, due to the +reliance on ioctls. For this reason, the seedrng project provides a +basic script meant to be copy and pasted into projects like OpenRC and +tweaked as needed: https://git.zx2c4.com/seedrng/about/ + +This commit imports it into OpenRC and wires up /etc/init.d/urandom to +call it. It shouldn't be called by other things on the system, so it +lives in rc_sbindir. + +Closes #506. +Closes #507. + +Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> +--- + AUTHORS | 1 + + conf.d/urandom | 9 +- + init.d/urandom.in | 41 ++-- + src/rc/Makefile | 6 +- + src/rc/meson.build | 10 +- + src/rc/seedrng.c | 453 +++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 499 insertions(+), 21 deletions(-) + create mode 100644 src/rc/seedrng.c + +diff --git a/AUTHORS b/AUTHORS +index 0616d5175..ede0f471b 100644 +--- a/AUTHORS ++++ b/AUTHORS +@@ -43,6 +43,7 @@ Ian Stakenvicius <axs@gentoo.org> + Jakob Drexel <jake42@rommel.stw.uni-erlangen.de> + James Le Cuirot <chewi@aura-online.co.uk> + Jan Psota <jasiu@belsznica.pl> ++Jason A. Donenfeld <Jason@zx2c4.com> + Jason Zaman <jason@perfinion.com> + Joe Harvell <jharvell@dogpad.net> + Joe M <joe9mail@gmail.com> +diff --git a/conf.d/urandom b/conf.d/urandom +index f721a2491..744e4f702 100644 +--- a/conf.d/urandom ++++ b/conf.d/urandom +@@ -2,4 +2,11 @@ + # (say for crypt swap), so you will need to customize this + # behavior. If you have /var on a separate partition, then + # make sure this path lives on your root device somewhere. +-urandom_seed="/var/lib/misc/random-seed" ++seed_dir="/var/lib/seedrng" ++lock_file="/var/run/seedrng.lock" ++ ++# Set this to true if you do not want seed files to actually ++# credit the RNG. Set this if you plan to replicate this ++# file system image and do not have the wherewithal to first ++# delete the contents of /var/lib/seedrng. ++skip_credit="false" +diff --git a/init.d/urandom.in b/init.d/urandom.in +index 0d6ab66e0..cda431fdb 100644 +--- a/init.d/urandom.in ++++ b/init.d/urandom.in +@@ -1,5 +1,5 @@ + #!@SBINDIR@/openrc-run +-# Copyright (c) 2007-2015 The OpenRC Authors. ++# Copyright (c) 2007-2022 The OpenRC Authors. + # See the Authors file at the top-level directory of this distribution and + # https://github.com/OpenRC/openrc/blob/HEAD/AUTHORS + # +@@ -9,7 +9,10 @@ + # This file may not be copied, modified, propagated, or distributed + # except according to the terms contained in the LICENSE file. + +-: ${urandom_seed:=${URANDOM_SEED:-/var/lib/misc/random-seed}} ++export SEEDRNG_SEED_DIR="${seed_dir:-/var/lib/seedrng}" ++export SEEDRNG_LOCK_FILE="${lock_file:-/var/run/seedrng.lock}" ++export SEEDRNG_SKIP_CREDIT="${skip_credit:-false}" ++: ${urandom_seed:=${SEEDRNG_SEED_DIR}/../misc/random-seed} + description="Initializes the random number generator." + + depend() +@@ -21,33 +24,35 @@ depend() + + save_seed() + { +- local psz=1 +- +- if [ -e /proc/sys/kernel/random/poolsize ]; then +- : $(( psz = $(cat /proc/sys/kernel/random/poolsize) / 4096 )) +- fi +- + ( # sub shell to prevent umask pollution + umask 077 +- dd if=/dev/urandom of="$urandom_seed" count=${psz} 2>/dev/null ++ dd if=/dev/urandom of="$urandom_seed" count=1 2>/dev/null + ) + } + + start() + { +- [ -c /dev/urandom ] || return +- if [ -f "$urandom_seed" ]; then +- ebegin "Initializing random number generator" +- cat "$urandom_seed" > /dev/urandom +- eend $? "Error initializing random number generator" ++ if [ "$RC_UNAME" = Linux ]; then ++ seedrng ++ else ++ [ -c /dev/urandom ] || return ++ if [ -f "$urandom_seed" ]; then ++ ebegin "Initializing random number generator" ++ cat "$urandom_seed" > /dev/urandom ++ eend $? "Error initializing random number generator" ++ fi ++ rm -f "$urandom_seed" && save_seed + fi +- rm -f "$urandom_seed" && save_seed + return 0 + } + + stop() + { +- ebegin "Saving random seed" +- save_seed +- eend $? "Failed to save random seed" ++ if [ "$RC_UNAME" = Linux ]; then ++ seedrng ++ else ++ ebegin "Saving random seed" ++ save_seed ++ eend $? "Failed to save random seed" ++ fi + } +diff --git a/src/rc/Makefile b/src/rc/Makefile +index fd796d920..62539f134 100644 +--- a/src/rc/Makefile ++++ b/src/rc/Makefile +@@ -15,7 +15,7 @@ endif + + ifeq (${OS},Linux) + SRCS+= kill_all.c openrc-init.c openrc-shutdown.c rc-sysvinit.c broadcast.c \ +- rc-wtmp.c ++ rc-wtmp.c seedrng.c + endif + + CLEANFILES= version.h rc-selinux.o +@@ -47,6 +47,7 @@ RC_SBINPROGS= mark_service_starting mark_service_started \ + + ifeq (${OS},Linux) + RC_BINPROGS+= kill_all ++RC_SBINPROGS+= seedrng + SBINPROGS+= openrc-init openrc-shutdown + endif + +@@ -180,3 +181,6 @@ shell_var: shell_var.o + + swclock: swclock.o _usage.o rc-misc.o + ${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD} ++ ++seedrng: seedrng.o ++ ${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD} +diff --git a/src/rc/meson.build b/src/rc/meson.build +index 8fdf3ac3b..b724c51f2 100644 +--- a/src/rc/meson.build ++++ b/src/rc/meson.build +@@ -268,7 +268,15 @@ if os == 'Linux' + link_with: [libeinfo,librc], + install: true, + install_dir: rc_bindir) +- endif ++ ++ executable('seedrng', ++ ['seedrng.c'], ++ c_args : cc_branding_flags, ++ include_directories: [incdir, einfo_incdir, rc_incdir], ++ link_with: [libeinfo, librc], ++ install: true, ++ install_dir: rc_sbindir) ++endif + + executable('shell_var', + ['shell_var.c'], +diff --git a/src/rc/seedrng.c b/src/rc/seedrng.c +new file mode 100644 +index 000000000..c1f941457 +--- /dev/null ++++ b/src/rc/seedrng.c +@@ -0,0 +1,453 @@ ++/* ++ * seedrng.c ++ * Seed kernel RNG from seed file, based on code from: ++ * https://git.zx2c4.com/seedrng/about/ ++ */ ++ ++/* ++ * Copyright (c) 2022 The OpenRC Authors. ++ * See the Authors file at the top-level directory of this distribution and ++ * https://github.com/OpenRC/openrc/blob/HEAD/AUTHORS ++ * ++ * This file is part of OpenRC. It is subject to the license terms in ++ * the LICENSE file found in the top-level directory of this ++ * distribution and at https://github.com/OpenRC/openrc/blob/HEAD/LICENSE ++ * This file may not be copied, modified, propagated, or distributed ++ * except according to the terms contained in the LICENSE file. ++ */ ++ ++#include <linux/random.h> ++#include <sys/random.h> ++#include <sys/ioctl.h> ++#include <sys/file.h> ++#include <sys/stat.h> ++#include <sys/types.h> ++#include <fcntl.h> ++#include <poll.h> ++#include <unistd.h> ++#include <time.h> ++#include <errno.h> ++#include <endian.h> ++#include <stdbool.h> ++#include <stdint.h> ++#include <string.h> ++#include <stdio.h> ++#include <stdlib.h> ++ ++#include "rc.h" ++#include "einfo.h" ++#include "helpers.h" ++ ++#ifndef GRND_INSECURE ++#define GRND_INSECURE 0x0004 /* Apparently some headers don't ship with this yet. */ ++#endif ++ ++static const char *SEED_DIR; ++static const char *LOCK_FILE; ++static char *CREDITABLE_SEED; ++static char *NON_CREDITABLE_SEED; ++ ++enum blake2s_lengths { ++ BLAKE2S_BLOCK_LEN = 64, ++ BLAKE2S_HASH_LEN = 32, ++ BLAKE2S_KEY_LEN = 32 ++}; ++ ++enum seedrng_lengths { ++ MAX_SEED_LEN = 512, ++ MIN_SEED_LEN = BLAKE2S_HASH_LEN ++}; ++ ++struct blake2s_state { ++ uint32_t h[8]; ++ uint32_t t[2]; ++ uint32_t f[2]; ++ uint8_t buf[BLAKE2S_BLOCK_LEN]; ++ unsigned int buflen; ++ unsigned int outlen; ++}; ++ ++#define le32_to_cpup(a) le32toh(*(a)) ++#define cpu_to_le32(a) htole32(a) ++#ifndef ARRAY_SIZE ++#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++#ifndef DIV_ROUND_UP ++#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) ++#endif ++ ++static inline void cpu_to_le32_array(uint32_t *buf, unsigned int words) ++{ ++ while (words--) { ++ *buf = cpu_to_le32(*buf); ++ ++buf; ++ } ++} ++ ++static inline void le32_to_cpu_array(uint32_t *buf, unsigned int words) ++{ ++ while (words--) { ++ *buf = le32_to_cpup(buf); ++ ++buf; ++ } ++} ++ ++static inline uint32_t ror32(uint32_t word, unsigned int shift) ++{ ++ return (word >> (shift & 31)) | (word << ((-shift) & 31)); ++} ++ ++static const uint32_t blake2s_iv[8] = { ++ 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, ++ 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL ++}; ++ ++static const uint8_t blake2s_sigma[10][16] = { ++ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, ++ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, ++ { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, ++ { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, ++ { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, ++ { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, ++ { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, ++ { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, ++ { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, ++ { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, ++}; ++ ++static void blake2s_set_lastblock(struct blake2s_state *state) ++{ ++ state->f[0] = -1; ++} ++ ++static void blake2s_increment_counter(struct blake2s_state *state, const uint32_t inc) ++{ ++ state->t[0] += inc; ++ state->t[1] += (state->t[0] < inc); ++} ++ ++static void blake2s_init_param(struct blake2s_state *state, const uint32_t param) ++{ ++ int i; ++ ++ memset(state, 0, sizeof(*state)); ++ for (i = 0; i < 8; ++i) ++ state->h[i] = blake2s_iv[i]; ++ state->h[0] ^= param; ++} ++ ++static void blake2s_init(struct blake2s_state *state, const size_t outlen) ++{ ++ blake2s_init_param(state, 0x01010000 | outlen); ++ state->outlen = outlen; ++} ++ ++static void blake2s_compress(struct blake2s_state *state, const uint8_t *block, size_t nblocks, const uint32_t inc) ++{ ++ uint32_t m[16]; ++ uint32_t v[16]; ++ int i; ++ ++ while (nblocks > 0) { ++ blake2s_increment_counter(state, inc); ++ memcpy(m, block, BLAKE2S_BLOCK_LEN); ++ le32_to_cpu_array(m, ARRAY_SIZE(m)); ++ memcpy(v, state->h, 32); ++ v[ 8] = blake2s_iv[0]; ++ v[ 9] = blake2s_iv[1]; ++ v[10] = blake2s_iv[2]; ++ v[11] = blake2s_iv[3]; ++ v[12] = blake2s_iv[4] ^ state->t[0]; ++ v[13] = blake2s_iv[5] ^ state->t[1]; ++ v[14] = blake2s_iv[6] ^ state->f[0]; ++ v[15] = blake2s_iv[7] ^ state->f[1]; ++ ++#define G(r, i, a, b, c, d) do { \ ++ a += b + m[blake2s_sigma[r][2 * i + 0]]; \ ++ d = ror32(d ^ a, 16); \ ++ c += d; \ ++ b = ror32(b ^ c, 12); \ ++ a += b + m[blake2s_sigma[r][2 * i + 1]]; \ ++ d = ror32(d ^ a, 8); \ ++ c += d; \ ++ b = ror32(b ^ c, 7); \ ++} while (0) ++ ++#define ROUND(r) do { \ ++ G(r, 0, v[0], v[ 4], v[ 8], v[12]); \ ++ G(r, 1, v[1], v[ 5], v[ 9], v[13]); \ ++ G(r, 2, v[2], v[ 6], v[10], v[14]); \ ++ G(r, 3, v[3], v[ 7], v[11], v[15]); \ ++ G(r, 4, v[0], v[ 5], v[10], v[15]); \ ++ G(r, 5, v[1], v[ 6], v[11], v[12]); \ ++ G(r, 6, v[2], v[ 7], v[ 8], v[13]); \ ++ G(r, 7, v[3], v[ 4], v[ 9], v[14]); \ ++} while (0) ++ ROUND(0); ++ ROUND(1); ++ ROUND(2); ++ ROUND(3); ++ ROUND(4); ++ ROUND(5); ++ ROUND(6); ++ ROUND(7); ++ ROUND(8); ++ ROUND(9); ++ ++#undef G ++#undef ROUND ++ ++ for (i = 0; i < 8; ++i) ++ state->h[i] ^= v[i] ^ v[i + 8]; ++ ++ block += BLAKE2S_BLOCK_LEN; ++ --nblocks; ++ } ++} ++ ++static void blake2s_update(struct blake2s_state *state, const void *inp, size_t inlen) ++{ ++ const size_t fill = BLAKE2S_BLOCK_LEN - state->buflen; ++ const uint8_t *in = inp; ++ ++ if (!inlen) ++ return; ++ if (inlen > fill) { ++ memcpy(state->buf + state->buflen, in, fill); ++ blake2s_compress(state, state->buf, 1, BLAKE2S_BLOCK_LEN); ++ state->buflen = 0; ++ in += fill; ++ inlen -= fill; ++ } ++ if (inlen > BLAKE2S_BLOCK_LEN) { ++ const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_LEN); ++ blake2s_compress(state, in, nblocks - 1, BLAKE2S_BLOCK_LEN); ++ in += BLAKE2S_BLOCK_LEN * (nblocks - 1); ++ inlen -= BLAKE2S_BLOCK_LEN * (nblocks - 1); ++ } ++ memcpy(state->buf + state->buflen, in, inlen); ++ state->buflen += inlen; ++} ++ ++static void blake2s_final(struct blake2s_state *state, uint8_t *out) ++{ ++ blake2s_set_lastblock(state); ++ memset(state->buf + state->buflen, 0, BLAKE2S_BLOCK_LEN - state->buflen); ++ blake2s_compress(state, state->buf, 1, state->buflen); ++ cpu_to_le32_array(state->h, ARRAY_SIZE(state->h)); ++ memcpy(out, state->h, state->outlen); ++} ++ ++static size_t determine_optimal_seed_len(void) ++{ ++ size_t ret = 0; ++ char poolsize_str[11] = { 0 }; ++ int fd = open("/proc/sys/kernel/random/poolsize", O_RDONLY); ++ ++ if (fd < 0 || read(fd, poolsize_str, sizeof(poolsize_str) - 1) < 0) { ++ ewarn("Unable to determine pool size, falling back to %u bits: %s", MIN_SEED_LEN * 8, strerror(errno)); ++ ret = MIN_SEED_LEN; ++ } else ++ ret = DIV_ROUND_UP(strtoul(poolsize_str, NULL, 10), 8); ++ if (fd >= 0) ++ close(fd); ++ if (ret < MIN_SEED_LEN) ++ ret = MIN_SEED_LEN; ++ else if (ret > MAX_SEED_LEN) ++ ret = MAX_SEED_LEN; ++ return ret; ++} ++ ++static int read_new_seed(uint8_t *seed, size_t len, bool *is_creditable) ++{ ++ ssize_t ret; ++ int urandom_fd; ++ ++ *is_creditable = false; ++ ret = getrandom(seed, len, GRND_NONBLOCK); ++ if (ret == (ssize_t)len) { ++ *is_creditable = true; ++ return 0; ++ } ++ if (ret == -1 && errno == ENOSYS) { ++ struct pollfd random_fd = { ++ .fd = open("/dev/random", O_RDONLY), ++ .events = POLLIN ++ }; ++ if (random_fd.fd < 0) ++ return -errno; ++ *is_creditable = poll(&random_fd, 1, 0) == 1; ++ close(random_fd.fd); ++ } else if (getrandom(seed, len, GRND_INSECURE) == (ssize_t)len) ++ return 0; ++ urandom_fd = open("/dev/urandom", O_RDONLY); ++ if (urandom_fd < 0) ++ return -errno; ++ ret = read(urandom_fd, seed, len); ++ if (ret == (ssize_t)len) ++ ret = 0; ++ else ++ ret = -errno ? -errno : -EIO; ++ close(urandom_fd); ++ return ret; ++} ++ ++static int seed_rng(uint8_t *seed, size_t len, bool credit) ++{ ++ struct { ++ int entropy_count; ++ int buf_size; ++ uint8_t buffer[MAX_SEED_LEN]; ++ } req = { ++ .entropy_count = credit ? len * 8 : 0, ++ .buf_size = len ++ }; ++ int random_fd, ret; ++ ++ if (len > sizeof(req.buffer)) ++ return -EFBIG; ++ memcpy(req.buffer, seed, len); ++ ++ random_fd = open("/dev/random", O_RDWR); ++ if (random_fd < 0) ++ return -errno; ++ ret = ioctl(random_fd, RNDADDENTROPY, &req); ++ if (ret) ++ ret = -errno ? -errno : -EIO; ++ close(random_fd); ++ return ret; ++} ++ ++static int seed_from_file_if_exists(const char *filename, bool credit, struct blake2s_state *hash) ++{ ++ uint8_t seed[MAX_SEED_LEN]; ++ ssize_t seed_len; ++ int fd, dfd, ret = 0; ++ ++ fd = open(filename, O_RDONLY); ++ if (fd < 0 && errno == ENOENT) ++ return 0; ++ else if (fd < 0) { ++ ret = -errno; ++ eerror("Unable to open seed file: %s", strerror(errno)); ++ return ret; ++ } ++ dfd = open(SEED_DIR, O_DIRECTORY | O_RDONLY); ++ if (dfd < 0) { ++ ret = -errno; ++ close(fd); ++ eerror("Unable to open seed directory: %s", strerror(errno)); ++ return ret; ++ } ++ seed_len = read(fd, seed, sizeof(seed)); ++ if (seed_len < 0) { ++ ret = -errno; ++ eerror("Unable to read seed file: %s", strerror(errno)); ++ } ++ close(fd); ++ if (ret) { ++ close(dfd); ++ return ret; ++ } ++ if ((unlink(filename) < 0 || fsync(dfd) < 0) && seed_len) { ++ ret = -errno; ++ eerror("Unable to remove seed after reading, so not seeding: %s", strerror(errno)); ++ } ++ close(dfd); ++ if (ret) ++ return ret; ++ if (!seed_len) ++ return 0; ++ ++ blake2s_update(hash, &seed_len, sizeof(seed_len)); ++ blake2s_update(hash, seed, seed_len); ++ ++ einfo("Seeding %zd bits %s crediting", seed_len * 8, credit ? "and" : "without"); ++ ret = seed_rng(seed, seed_len, credit); ++ if (ret < 0) ++ eerror("Unable to seed: %s", strerror(-ret)); ++ return ret; ++} ++ ++static void populate_global_paths(void) ++{ ++ SEED_DIR = getenv("SEEDRNG_SEED_DIR"); ++ if (!SEED_DIR || !*SEED_DIR) ++ SEED_DIR = "/var/lib/seedrng"; ++ LOCK_FILE = getenv("SEEDRNG_LOCK_FILE"); ++ if (!LOCK_FILE || !*LOCK_FILE) ++ LOCK_FILE = "/var/run/seedrng.lock"; ++ xasprintf(&CREDITABLE_SEED, "%s/seed.credit", SEED_DIR); ++ xasprintf(&NON_CREDITABLE_SEED, "%s/seed.no-credit", SEED_DIR); ++} ++ ++int main(int argc _unused, char *argv[] _unused) ++{ ++ static const char seedrng_prefix[] = "SeedRNG v1 Old+New Prefix"; ++ static const char seedrng_failure[] = "SeedRNG v1 No New Seed Failure"; ++ int ret, fd, lock, program_ret = 0; ++ uint8_t new_seed[MAX_SEED_LEN]; ++ size_t new_seed_len; ++ bool new_seed_creditable; ++ struct timespec realtime = { 0 }, boottime = { 0 }; ++ struct blake2s_state hash; ++ ++ umask(0077); ++ if (getuid()) ++ eerrorx("This rc helper program requires root"); ++ ++ populate_global_paths(); ++ blake2s_init(&hash, BLAKE2S_HASH_LEN); ++ blake2s_update(&hash, seedrng_prefix, strlen(seedrng_prefix)); ++ clock_gettime(CLOCK_REALTIME, &realtime); ++ clock_gettime(CLOCK_BOOTTIME, &boottime); ++ blake2s_update(&hash, &realtime, sizeof(realtime)); ++ blake2s_update(&hash, &boottime, sizeof(boottime)); ++ ++ if (mkdir(SEED_DIR, 0700) < 0 && errno != EEXIST) ++ eerrorx("Unable to create \"%s\" directory: %s", SEED_DIR, strerror(errno)); ++ ++ lock = open(LOCK_FILE, O_WRONLY | O_CREAT, 0000); ++ if (lock < 0 || flock(lock, LOCK_EX) < 0) ++ eerrorx("Unable to open lock file: %s", strerror(errno)); ++ ++ ret = seed_from_file_if_exists(NON_CREDITABLE_SEED, false, &hash); ++ if (ret < 0) ++ program_ret |= 1 << 1; ++ ret = seed_from_file_if_exists(CREDITABLE_SEED, !rc_yesno(getenv("SEEDRNG_SKIP_CREDIT")), &hash); ++ if (ret < 0) ++ program_ret |= 1 << 2; ++ ++ new_seed_len = determine_optimal_seed_len(); ++ ret = read_new_seed(new_seed, new_seed_len, &new_seed_creditable); ++ if (ret < 0) { ++ eerror("Unable to read new seed: %s", strerror(-ret)); ++ new_seed_len = BLAKE2S_HASH_LEN; ++ strncpy((char *)new_seed, seedrng_failure, new_seed_len); ++ program_ret |= 1 << 3; ++ } ++ blake2s_update(&hash, &new_seed_len, sizeof(new_seed_len)); ++ blake2s_update(&hash, new_seed, new_seed_len); ++ blake2s_final(&hash, new_seed + new_seed_len - BLAKE2S_HASH_LEN); ++ ++ einfo("Saving %zu bits of %s seed for next boot", new_seed_len * 8, new_seed_creditable ? "creditable" : "non-creditable"); ++ fd = open(NON_CREDITABLE_SEED, O_WRONLY | O_CREAT | O_TRUNC, 0400); ++ if (fd < 0) { ++ eerror("Unable to open seed file for writing: %s", strerror(errno)); ++ program_ret |= 1 << 4; ++ goto out; ++ } ++ if (write(fd, new_seed, new_seed_len) != (ssize_t)new_seed_len || fsync(fd) < 0) { ++ eerror("Unable to write seed file: %s", strerror(errno)); ++ program_ret |= 1 << 5; ++ goto out; ++ } ++ if (new_seed_creditable && rename(NON_CREDITABLE_SEED, CREDITABLE_SEED) < 0) { ++ ewarn("Unable to make new seed creditable: %s", strerror(errno)); ++ program_ret |= 1 << 6; ++ } ++out: ++ close(fd); ++ close(lock); ++ return program_ret; ++} diff --git a/repo/system/openrc/sysctl.initd b/repo/system/openrc/sysctl.initd new file mode 100644 index 0000000..befdb91 --- /dev/null +++ b/repo/system/openrc/sysctl.initd @@ -0,0 +1,87 @@ +#!/sbin/openrc-run + +depend() +{ + after clock + before bootmisc logger + keyword -prefix -systemd-nspawn -vserver +} + +start() +{ + local quiet retval=0 status + ebegin "Configuring kernel parameters" + + yesno $rc_verbose || quiet=-q + + eindent + + for f in /lib/sysctl.d/*.conf \ + /usr/lib/sysctl.d/*.conf; do + + if [ -f /etc/sysctl.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /etc/sysctl.d/${f##*/}" + continue + fi + + if [ -f /run/sysctl.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /run/sysctl.d/${f##*/}" + continue + fi + + if [ -f "$f" ]; then + vebegin "applying $f" + sysctl $quiet -p "$f" + status=$? + if [ $status -gt 0 ]; then + # Don't change retval= since we expect some package/distro provided + # sysctl configurations to break, so just warn when the user wants + # verbose messages + vewarn "Unable to configure kernel parameters from $f" + fi + fi + done + + for f in /etc/sysctl.d/*.conf; do + + if [ -f /run/sysctl.d/"${f##*/}" ]; then + veinfo "Ignoring $f due to /run/sysctl.d/${f##*/}" + continue + fi + + if [ -f "$f" ]; then + vebegin "applying $f" + sysctl $quiet -p "$f" + status=$? + if [ $status -gt 0 ]; then + retval=$(( $retval + $status )) + eerror "Unable to configure kernel parameters from $f" + fi + fi + done + + if [ -f /etc/sysctl.conf ]; then + vebegin "applying /etc/sysctl.conf" + sysctl $quiet -p /etc/sysctl.conf + status=$? + if [ $status -gt 0 ]; then + retval=$(( $retval + $status )) + eerror "Unable to configure kernel parameters from /etc/sysctl.conf" + fi + fi + + for f in /run/sysctl.d/*.conf; do + if [ -f "$f" ]; then + vebegin "applying $f" + sysctl $quiet -p "$f" + status=$? + if [ $status -gt 0 ]; then + retval=$(( $retval + $status )) + eerror "Unable to configure kernel parameters from $f" + fi + fi + done + eoutdent + + eend $retval +} diff --git a/repo/system/openrc/sysfsconf.initd b/repo/system/openrc/sysfsconf.initd new file mode 100644 index 0000000..433e51d --- /dev/null +++ b/repo/system/openrc/sysfsconf.initd @@ -0,0 +1,66 @@ +#!/sbin/openrc-run + +description="Set sysfs variables from /etc/sysfs.conf and /etc/sysfs.d/*.conf" +conffile=/etc/sysfs.conf +confdir=/etc/sysfs.d + +depend() { + need sysfs +} + +setval() { + local value="$1" attrib="$2" + # Some fields need a terminating newline, others + # need the terminating newline to be absent :-( + echo -n "$value" > "$attrib" 2>/dev/null \ + || echo "$value" > "$attrib" +} + +load_conffile() { + local file="$1" + while read line; do + local line=${line%%#*} + local cmd= attrib= value= + set -- $line + if [ $# -eq 0 ]; then + continue + fi + case "$1$3" in + mode=) cmd=chmod + attrib="$2" + value="$4" + ;; + owner=) cmd=chown + attrib="$2" + value="$4" + ;; + *) if [ "$2" = "=" ]; then + cmd=setval + attrib="$1" + value="$3" + fi + ;; + esac + if ! [ -e "/sys/$attrib" ]; then + eerror "$attrib: unknown attribute" + continue + fi + if [ -z "$attrib" ] || [ -z "$value" ]; then + eerror "syntax error in $file: '$line'" + continue + fi + $cmd "$value" "/sys/$attrib" + done < "$file" +} + +start() { + [ -r "$conffile" -o -d "$confdir" ] || return 0 + ebegin "Setting sysfs variables" + for file in $confdir/*.conf $conffile; do + [ -r "$file" ] || continue + load_conffile "$file" || return 1 + done + eend 0 + +} + diff --git a/repo/system/openrc/test-networking.sh b/repo/system/openrc/test-networking.sh new file mode 100644 index 0000000..5e5f70b --- /dev/null +++ b/repo/system/openrc/test-networking.sh @@ -0,0 +1,65 @@ +#!/bin/sh + +# unit tests for find_ifaces and find_running_ifaces in networking.initd + +cfgfile=/tmp/openrc-test-network.$$ +sourcefile=$cfgfile.source +sourcedir=$cfgfile.d +ifstate=$cfgfile.state + +cat >$cfgfile<<EOF +auto eth0 +iface eth0 inet dhcp + +source $sourcefile + +source-directory $sourcedir +EOF + +cat >$sourcefile<<EOF +auto eth1 +iface eth1 inet dhcp +EOF + +mkdir -p $sourcedir +cat >$sourcedir/a<<EOF +auto eth2 +iface eth2 inet dhcp +EOF + +cat >$ifstate<<EOF +eth4=eth4 1 +EOF + +errors=0 +fail() { + echo "$@" + errors=$(( $errors + 1)) +} + +# test fallback, when ifquery does not exist +ifquery=does-not-exist +. ./networking.initd + +find_ifaces | grep -q -w eth0 || fail "Did not find eth0" +find_ifaces | grep -q -E '(eth1|eth2)' && fail "Unexpectedly found eth1 or eth2" + +# test that ifquery finds source and source-directory +unset ifquery +. ./networking.initd +for i in eth0 eth1 eth2; do + find_ifaces | grep -q -w "$i" || fail "Did not find $i" +done + +# test that ifquery picks up the running state file +find_running_ifaces | grep -q -w "eth4" || fail "Did not detect eth4 running" + + +# test /etc/init.d/net.eth5 +RC_SVCNAME=net.eth5 +. ./networking.initd +find_ifaces | grep -q -w "eth5" || fail "Did not detect eth5" +find_running_ifaces | grep -q -w "eth5" || fail "Did not detect eth5 running" + +rm -rf $cfgfile $sourcefile $sourcedir $ifstate +exit $errors diff --git a/repo/system/openssl.xibuild b/repo/system/openssl/openssl.xibuild index b30ea90..b30ea90 100644 --- a/repo/system/openssl.xibuild +++ b/repo/system/openssl/openssl.xibuild diff --git a/repo/system/pahole.xibuild b/repo/system/pahole/pahole.xibuild index 6b57291..6b57291 100644 --- a/repo/system/pahole.xibuild +++ b/repo/system/pahole/pahole.xibuild diff --git a/repo/system/pam/other.pamd b/repo/system/pam/other.pamd new file mode 100644 index 0000000..20bdb74 --- /dev/null +++ b/repo/system/pam/other.pamd @@ -0,0 +1,11 @@ + +auth required pam_warn.so +auth required pam_deny.so +account required pam_warn.so +account required pam_deny.so +password required pam_warn.so +password required pam_deny.so +session required pam_warn.so +session required pam_deny.so + + diff --git a/repo/system/pam.xibuild b/repo/system/pam/pam.xibuild index 366ec3c..366ec3c 100644 --- a/repo/system/pam.xibuild +++ b/repo/system/pam/pam.xibuild diff --git a/repo/system/pam/system-account.pamd b/repo/system/pam/system-account.pamd new file mode 100644 index 0000000..b36f26d --- /dev/null +++ b/repo/system/pam/system-account.pamd @@ -0,0 +1 @@ +account required pam_unix.so diff --git a/repo/system/pam/system-auth.pamd b/repo/system/pam/system-auth.pamd new file mode 100644 index 0000000..5f85baf --- /dev/null +++ b/repo/system/pam/system-auth.pamd @@ -0,0 +1,2 @@ +auth required pam_unix.so + diff --git a/repo/system/pam/system-password.pamd b/repo/system/pam/system-password.pamd new file mode 100644 index 0000000..56d5122 --- /dev/null +++ b/repo/system/pam/system-password.pamd @@ -0,0 +1,3 @@ +# basic PAM configuration for Alpine. + +password required pam_unix.so nullok md5 sha512 shadow try_first_pass diff --git a/repo/system/pam/system-session.pamd b/repo/system/pam/system-session.pamd new file mode 100644 index 0000000..5e25d29 --- /dev/null +++ b/repo/system/pam/system-session.pamd @@ -0,0 +1,3 @@ + +session required pam_unix.so + diff --git a/repo/system/pcre.xibuild b/repo/system/pcre/pcre.xibuild index dc86f46..dc86f46 100644 --- a/repo/system/pcre.xibuild +++ b/repo/system/pcre/pcre.xibuild diff --git a/repo/system/pcre2.xibuild b/repo/system/pcre2/pcre2.xibuild index 46e35e9..46e35e9 100644 --- a/repo/system/pcre2.xibuild +++ b/repo/system/pcre2/pcre2.xibuild diff --git a/repo/system/pcsc-lite.xibuild b/repo/system/pcsc-lite/pcsc-lite.xibuild index 86d86d1..86d86d1 100644 --- a/repo/system/pcsc-lite.xibuild +++ b/repo/system/pcsc-lite/pcsc-lite.xibuild diff --git a/repo/system/perl-xml-parser.xibuild b/repo/system/perl-xml-parser/perl-xml-parser.xibuild index bd73b3f..bd73b3f 100644 --- a/repo/system/perl-xml-parser.xibuild +++ b/repo/system/perl-xml-parser/perl-xml-parser.xibuild diff --git a/repo/system/perl/musl-locale.patch b/repo/system/perl/musl-locale.patch new file mode 100644 index 0000000..65839f1 --- /dev/null +++ b/repo/system/perl/musl-locale.patch @@ -0,0 +1,37 @@ +diff --git a/locale.c b/locale.c +index 7653340..7243cb1 100644 +--- a/locale.c ++++ b/locale.c +@@ -581,6 +581,10 @@ S_emulate_setlocale(const int category, + + return (char *) querylocale(mask, cur_obj); + ++# elif defined(_NL_LOCALE_NAME) ++ ++ return (char *) nl_langinfo_l(_NL_LOCALE_NAME(category), cur_obj); ++ + # else + + /* If this assert fails, adjust the size of curlocales in intrpvar.h */ +@@ -737,7 +741,7 @@ S_emulate_setlocale(const int category, + + /* Here, we are switching locales. */ + +-# ifndef HAS_QUERYLOCALE ++# if !defined(HAS_QUERYLOCALE) && !defined(_NL_LOCALE_NAME) + + if (strEQ(locale, "")) { + +@@ -1094,6 +1098,12 @@ S_emulate_setlocale(const int category, + locale = querylocale(mask, new_obj); + } + ++# elif defined(_NL_LOCALE_NAME) ++ ++ if (strEQ(locale, "")) { ++ locale = nl_langinfo_l(_NL_LOCALE_NAME(category), new_obj); ++ } ++ + # else + + /* Here, 'locale' is the return value */ diff --git a/repo/system/perl/musl-skip-dst-test.patch b/repo/system/perl/musl-skip-dst-test.patch new file mode 100644 index 0000000..d217ecc --- /dev/null +++ b/repo/system/perl/musl-skip-dst-test.patch @@ -0,0 +1,13 @@ +diff --git a/cpan/Time-Piece/t/02core_dst.t b/cpan/Time-Piece/t/02core_dst.t +index 3f54fff..4b1faa8 100644 +--- a/cpan/Time-Piece/t/02core_dst.t ++++ b/cpan/Time-Piece/t/02core_dst.t +@@ -119,7 +119,7 @@ cmp_ok($t->month_last_day, '==', 31); # test more + + + SKIP: { +- skip "Extra tests for Linux, BSD only.", 8 unless $is_linux or $is_mac or $is_bsd; ++ skip "Extra tests for Linux, BSD only.", 8 unless $is_mac or $is_bsd; + + local $ENV{TZ} = "EST5EDT4"; + Time::Piece::_tzset(); diff --git a/repo/system/perl/musl-stack-size.patch b/repo/system/perl/musl-stack-size.patch new file mode 100644 index 0000000..08a9ef0 --- /dev/null +++ b/repo/system/perl/musl-stack-size.patch @@ -0,0 +1,16 @@ +Tests fails on s390x due to low thread stack size +upstream report: https://github.com/Perl/perl5/issues/18160 + +diff --git a/t/thread_it.pl b/t/thread_it.pl +index f38a580..e8c450a 100644 +--- a/t/thread_it.pl ++++ b/t/thread_it.pl +@@ -36,7 +36,7 @@ my $curr = threads->create({ + stack_size => $^O eq 'hpux' ? 524288 : + $^O eq 'darwin' ? 2000000: + $^O eq 'VMS' ? 150000 : +- $^O eq 'aix' ? 1500000 : 0, ++ $^O eq 'aix' ? 1500000 : 256*1024, + }, sub { + run_tests(); + return defined &curr_test ? curr_test() : () diff --git a/repo/system/perl.xibuild b/repo/system/perl/perl.xibuild index 494b9f1..494b9f1 100644 --- a/repo/system/perl.xibuild +++ b/repo/system/perl/perl.xibuild diff --git a/repo/system/perl/skip-test-due-to-busybox-ps.patch b/repo/system/perl/skip-test-due-to-busybox-ps.patch new file mode 100644 index 0000000..ac3becc --- /dev/null +++ b/repo/system/perl/skip-test-due-to-busybox-ps.patch @@ -0,0 +1,13 @@ +diff --git a/t/op/magic.t b/t/op/magic.t +index 27c1d43..91882f4 100644 +--- a/t/op/magic.t ++++ b/t/op/magic.t +@@ -408,7 +408,7 @@ EOP + # argv[0] assignment and by calling prctl() + { + SKIP: { +- skip "We don't have prctl() here, or we're on Android", 2 unless $Config{d_prctl_set_name} && $^O ne 'android'; ++ skip "Skip test to avoid external ps(1) dependency", 2; + + # We don't really need these tests. prctl() is tested in the + # Kernel, but test it anyway for our sanity. If something doesn't diff --git a/repo/system/perl/zlib-test.patch b/repo/system/perl/zlib-test.patch new file mode 100644 index 0000000..1cb8f5e --- /dev/null +++ b/repo/system/perl/zlib-test.patch @@ -0,0 +1,80 @@ +diff --git a/cpan/Compress-Raw-Zlib/t/02zlib.t b/cpan/Compress-Raw-Zlib/t/02zlib.t +index 64c8944..9b2e9cb 100644 +--- a/cpan/Compress-Raw-Zlib/t/02zlib.t ++++ b/cpan/Compress-Raw-Zlib/t/02zlib.t +@@ -13,6 +13,7 @@ use bytes; + use Test::More ; + use CompTestUtils; + ++use constant ZLIB_1_2_12_0 => 0x12C0; + + BEGIN + { +@@ -490,7 +491,16 @@ SKIP: + last if $status == Z_STREAM_END or $status != Z_OK ; + } + +- cmp_ok $status, '==', Z_DATA_ERROR ; ++ # Z_STREAM_END returned by 1.12.2, Z_DATA_ERROR for older zlib ++ if (ZLIB_VERNUM >= ZLIB_1_2_12_0) ++ { ++ cmp_ok $status, '==', Z_STREAM_END ; ++ } ++ else ++ { ++ cmp_ok $status, '==', Z_DATA_ERROR ; ++ } ++ + is $GOT, $goodbye ; + + +@@ -514,7 +524,17 @@ SKIP: + is length($rest), $len2, "expected compressed output"; + + $GOT = ''; +- cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR, "inflate returns Z_DATA_ERROR"; ++ $status = $k->inflate($rest, $GOT); ++ # Z_STREAM_END returned by 1.12.2, Z_DATA_ERROR for older zlib ++ if (ZLIB_VERNUM >= ZLIB_1_2_12_0) ++ { ++ cmp_ok $status, '==', Z_STREAM_END ; ++ } ++ else ++ { ++ cmp_ok $status, '==', Z_DATA_ERROR ; ++ } ++ + is $GOT, $goodbye ; + } + +diff --git a/cpan/IO-Compress/t/cz-03zlib-v1.t b/cpan/IO-Compress/t/cz-03zlib-v1.t +index 9b75f9b..41734d0 100644 +--- a/cpan/IO-Compress/t/cz-03zlib-v1.t ++++ b/cpan/IO-Compress/t/cz-03zlib-v1.t +@@ -14,6 +14,8 @@ use Test::More ; + use CompTestUtils; + use Symbol; + ++use constant ZLIB_1_2_12_0 => 0x12C0; ++ + BEGIN + { + # use Test::NoWarnings, if available +@@ -700,7 +702,16 @@ EOM + + ($GOT, $status) = $k->inflate($rest) ; + +- ok $status == Z_DATA_ERROR ; ++ # Z_STREAM_END returned by 1.12.2, Z_DATA_ERROR for older zlib ++ if (ZLIB_VERNUM >= ZLIB_1_2_12_0) ++ { ++ cmp_ok $status, '==', Z_STREAM_END ; ++ } ++ else ++ { ++ cmp_ok $status, '==', Z_DATA_ERROR ; ++ } ++ + ok $Z . $GOT eq $goodbye ; + } + diff --git a/repo/system/polkit/files/polkit-1 b/repo/system/polkit/files/polkit-1 new file mode 100644 index 0000000..df1b69a --- /dev/null +++ b/repo/system/polkit/files/polkit-1 @@ -0,0 +1,9 @@ +# Begin /etc/pam.d/polkit-1 + +auth include system-auth +account include system-account +password include system-password +session include system-session + +# End /etc/pam.d/polkit-1 + diff --git a/repo/system/polkit/patches/CVE-2021-4034.patch b/repo/system/polkit/patches/CVE-2021-4034.patch new file mode 100644 index 0000000..a06300a --- /dev/null +++ b/repo/system/polkit/patches/CVE-2021-4034.patch @@ -0,0 +1,79 @@ +From a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Mon Sep 17 00:00:00 2001 +From: Jan Rybar <jrybar@redhat.com> +Date: Tue, 25 Jan 2022 17:21:46 +0000 +Subject: [PATCH] pkexec: local privilege escalation (CVE-2021-4034) + +--- + src/programs/pkcheck.c | 5 +++++ + src/programs/pkexec.c | 23 ++++++++++++++++++++--- + 2 files changed, 25 insertions(+), 3 deletions(-) + +diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c +index f1bb4e1..768525c 100644 +--- a/src/programs/pkcheck.c ++++ b/src/programs/pkcheck.c +@@ -363,6 +363,11 @@ main (int argc, char *argv[]) + local_agent_handle = NULL; + ret = 126; + ++ if (argc < 1) ++ { ++ exit(126); ++ } ++ + /* Disable remote file access from GIO. */ + setenv ("GIO_USE_VFS", "local", 1); + +diff --git a/src/programs/pkexec.c b/src/programs/pkexec.c +index 7698c5c..84e5ef6 100644 +--- a/src/programs/pkexec.c ++++ b/src/programs/pkexec.c +@@ -488,6 +488,15 @@ main (int argc, char *argv[]) + pid_t pid_of_caller; + gpointer local_agent_handle; + ++ ++ /* ++ * If 'pkexec' is called THIS wrong, someone's probably evil-doing. Don't be nice, just bail out. ++ */ ++ if (argc<1) ++ { ++ exit(127); ++ } ++ + ret = 127; + authority = NULL; + subject = NULL; +@@ -614,10 +623,10 @@ main (int argc, char *argv[]) + + path = g_strdup (pwstruct.pw_shell); + if (!path) +- { ++ { + g_printerr ("No shell configured or error retrieving pw_shell\n"); + goto out; +- } ++ } + /* If you change this, be sure to change the if (!command_line) + case below too */ + command_line = g_strdup (path); +@@ -636,7 +645,15 @@ main (int argc, char *argv[]) + goto out; + } + g_free (path); +- argv[n] = path = s; ++ path = s; ++ ++ /* argc<2 and pkexec runs just shell, argv is guaranteed to be null-terminated. ++ * /-less shell shouldn't happen, but let's be defensive and don't write to null-termination ++ */ ++ if (argv[n] != NULL) ++ { ++ argv[n] = path; ++ } + } + if (access (path, F_OK) != 0) + { +-- +GitLab + diff --git a/repo/system/polkit/patches/make-innetgr-optional.patch b/repo/system/polkit/patches/make-innetgr-optional.patch new file mode 100644 index 0000000..8459c67 --- /dev/null +++ b/repo/system/polkit/patches/make-innetgr-optional.patch @@ -0,0 +1,239 @@ +See https://gitlab.freedesktop.org/polkit/polkit/merge_requests/10 + +From 778bb45e0e0cbabe2b04adf67a500af1dab09768 Mon Sep 17 00:00:00 2001 +From: "A. Wilcox" <AWilcox@Wilcox-Tech.com> +Date: Wed, 11 Jul 2018 04:54:26 -0500 +Subject: [PATCH] make netgroup support optional + +On at least Linux/musl and Linux/uclibc, netgroup support is not +available. PolKit fails to compile on these systems for that reason. + +This change makes netgroup support conditional on the presence of the +setnetgrent(3) function which is required for the support to work. If +that function is not available on the system, an error will be returned +to the administrator if unix-netgroup: is specified in configuration. + +Fixes bug 50145. + +Closes polkit/polkit#14. + +Signed-off-by: A. Wilcox <AWilcox@Wilcox-Tech.com> +--- +diff --git a/configure.ac b/configure.ac +index 4ac2219..ca478df 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -100,7 +100,7 @@ AC_CHECK_LIB(expat,XML_ParserCreate,[EXPAT_LIBS="-lexpat"], + [AC_MSG_ERROR([Can't find expat library. Please install expat.])]) + AC_SUBST(EXPAT_LIBS) + +-AC_CHECK_FUNCS(clearenv fdatasync) ++AC_CHECK_FUNCS(clearenv fdatasync setnetgrent) + + if test "x$GCC" = "xyes"; then + LDFLAGS="-Wl,--as-needed $LDFLAGS" +diff --git a/src/polkit/polkitidentity.c b/src/polkit/polkitidentity.c +index 3aa1f7f..10e9c17 100644 +--- a/src/polkit/polkitidentity.c ++++ b/src/polkit/polkitidentity.c +@@ -182,7 +182,15 @@ polkit_identity_from_string (const gchar *str, + } + else if (g_str_has_prefix (str, "unix-netgroup:")) + { ++#ifndef HAVE_SETNETGRENT ++ g_set_error (error, ++ POLKIT_ERROR, ++ POLKIT_ERROR_FAILED, ++ "Netgroups are not available on this machine ('%s')", ++ str); ++#else + identity = polkit_unix_netgroup_new (str + sizeof "unix-netgroup:" - 1); ++#endif + } + + if (identity == NULL && (error != NULL && *error == NULL)) +@@ -344,6 +352,13 @@ polkit_identity_new_for_gvariant (GVariant *variant, + GVariant *v; + const char *name; + ++#ifndef HAVE_SETNETGRENT ++ g_set_error (error, ++ POLKIT_ERROR, ++ POLKIT_ERROR_FAILED, ++ "Netgroups are not available on this machine"); ++ goto out; ++#else + v = lookup_asv (details_gvariant, "name", G_VARIANT_TYPE_STRING, error); + if (v == NULL) + { +@@ -353,6 +368,7 @@ polkit_identity_new_for_gvariant (GVariant *variant, + name = g_variant_get_string (v, NULL); + ret = polkit_unix_netgroup_new (name); + g_variant_unref (v); ++#endif + } + else + { +diff --git a/src/polkit/polkitunixnetgroup.c b/src/polkit/polkitunixnetgroup.c +index 8a2b369..83f8d4a 100644 +--- a/src/polkit/polkitunixnetgroup.c ++++ b/src/polkit/polkitunixnetgroup.c +@@ -194,6 +194,9 @@ polkit_unix_netgroup_set_name (PolkitUnixNetgroup *group, + PolkitIdentity * + polkit_unix_netgroup_new (const gchar *name) + { ++#ifndef HAVE_SETNETGRENT ++ g_assert_not_reached(); ++#endif + g_return_val_if_fail (name != NULL, NULL); + return POLKIT_IDENTITY (g_object_new (POLKIT_TYPE_UNIX_NETGROUP, + "name", name, +diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c +index 056d9a8..36c2f3d 100644 +--- a/src/polkitbackend/polkitbackendinteractiveauthority.c ++++ b/src/polkitbackend/polkitbackendinteractiveauthority.c +@@ -2233,25 +2233,26 @@ get_users_in_net_group (PolkitIdentity *group, + GList *ret; + + ret = NULL; ++#ifdef HAVE_SETNETGRENT + name = polkit_unix_netgroup_get_name (POLKIT_UNIX_NETGROUP (group)); + +-#ifdef HAVE_SETNETGRENT_RETURN ++# ifdef HAVE_SETNETGRENT_RETURN + if (setnetgrent (name) == 0) + { + g_warning ("Error looking up net group with name %s: %s", name, g_strerror (errno)); + goto out; + } +-#else ++# else + setnetgrent (name); +-#endif ++# endif /* HAVE_SETNETGRENT_RETURN */ + + for (;;) + { +-#if defined(HAVE_NETBSD) || defined(HAVE_OPENBSD) ++# if defined(HAVE_NETBSD) || defined(HAVE_OPENBSD) + const char *hostname, *username, *domainname; +-#else ++# else + char *hostname, *username, *domainname; +-#endif ++# endif /* defined(HAVE_NETBSD) || defined(HAVE_OPENBSD) */ + PolkitIdentity *user; + GError *error = NULL; + +@@ -2282,6 +2283,7 @@ get_users_in_net_group (PolkitIdentity *group, + + out: + endnetgrent (); ++#endif /* HAVE_SETNETGRENT */ + return ret; + } + +diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp +index ca17108..da95180 100644 +--- a/src/polkitbackend/polkitbackendjsauthority.cpp ++++ b/src/polkitbackend/polkitbackendjsauthority.cpp +@@ -1520,6 +1520,7 @@ js_polkit_user_is_in_netgroup (JSContext *cx, + + JS::CallArgs args = JS::CallArgsFromVp (argc, vp); + ++#ifdef HAVE_SETNETGRENT + JS::RootedString usrstr (authority->priv->cx); + usrstr = args[0].toString(); + user = JS_EncodeStringToUTF8 (cx, usrstr); +@@ -1534,6 +1535,7 @@ js_polkit_user_is_in_netgroup (JSContext *cx, + { + is_in_netgroup = true; + } ++ #endif + + ret = true; + +diff --git a/test/polkit/polkitidentitytest.c b/test/polkit/polkitidentitytest.c +index e91967b..e829aaa 100644 +--- a/test/polkit/polkitidentitytest.c ++++ b/test/polkit/polkitidentitytest.c +@@ -19,6 +19,7 @@ + * Author: Nikki VonHollen <vonhollen@google.com> + */ + ++#include "config.h" + #include "glib.h" + #include <polkit/polkit.h> + #include <polkit/polkitprivate.h> +@@ -145,11 +146,15 @@ struct ComparisonTestData comparison_test_data [] = { + {"unix-group:root", "unix-group:jane", FALSE}, + {"unix-group:jane", "unix-group:jane", TRUE}, + ++#ifdef HAVE_SETNETGRENT + {"unix-netgroup:foo", "unix-netgroup:foo", TRUE}, + {"unix-netgroup:foo", "unix-netgroup:bar", FALSE}, ++#endif + + {"unix-user:root", "unix-group:root", FALSE}, ++#ifdef HAVE_SETNETGRENT + {"unix-user:jane", "unix-netgroup:foo", FALSE}, ++#endif + + {NULL}, + }; +@@ -181,11 +186,13 @@ main (int argc, char *argv[]) + g_test_add_data_func ("/PolkitIdentity/group_string_2", "unix-group:jane", test_string); + g_test_add_data_func ("/PolkitIdentity/group_string_3", "unix-group:users", test_string); + ++#ifdef HAVE_SETNETGRENT + g_test_add_data_func ("/PolkitIdentity/netgroup_string", "unix-netgroup:foo", test_string); ++ g_test_add_data_func ("/PolkitIdentity/netgroup_gvariant", "unix-netgroup:foo", test_gvariant); ++#endif + + g_test_add_data_func ("/PolkitIdentity/user_gvariant", "unix-user:root", test_gvariant); + g_test_add_data_func ("/PolkitIdentity/group_gvariant", "unix-group:root", test_gvariant); +- g_test_add_data_func ("/PolkitIdentity/netgroup_gvariant", "unix-netgroup:foo", test_gvariant); + + add_comparison_tests (); + +diff --git a/test/polkit/polkitunixnetgrouptest.c b/test/polkit/polkitunixnetgrouptest.c +index 3701ba1..e3352eb 100644 +--- a/test/polkit/polkitunixnetgrouptest.c ++++ b/test/polkit/polkitunixnetgrouptest.c +@@ -19,6 +19,7 @@ + * Author: Nikki VonHollen <vonhollen@google.com> + */ + ++#include "config.h" + #include "glib.h" + #include <polkit/polkit.h> + #include <string.h> +@@ -69,7 +70,9 @@ int + main (int argc, char *argv[]) + { + g_test_init (&argc, &argv, NULL); ++#ifdef HAVE_SETNETGRENT + g_test_add_func ("/PolkitUnixNetgroup/new", test_new); + g_test_add_func ("/PolkitUnixNetgroup/set_name", test_set_name); ++#endif + return g_test_run (); + } +diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c +index f97e0e0..fc52149 100644 +--- a/test/polkitbackend/test-polkitbackendjsauthority.c ++++ b/test/polkitbackend/test-polkitbackendjsauthority.c +@@ -137,12 +137,14 @@ test_get_admin_identities (void) + "unix-group:users" + } + }, ++#ifdef HAVE_SETNETGRENT + { + "net.company.action3", + { + "unix-netgroup:foo" + } + }, ++#endif + }; + guint n; + diff --git a/repo/system/polkit.xibuild b/repo/system/polkit/polkit.xibuild index eb236bc..eb236bc 100644 --- a/repo/system/polkit.xibuild +++ b/repo/system/polkit/polkit.xibuild diff --git a/repo/system/popt.xibuild b/repo/system/popt/popt.xibuild index 31796a7..31796a7 100644 --- a/repo/system/popt.xibuild +++ b/repo/system/popt/popt.xibuild diff --git a/repo/system/psmisc.xibuild b/repo/system/psmisc/psmisc.xibuild index 61d767f..61d767f 100644 --- a/repo/system/psmisc.xibuild +++ b/repo/system/psmisc/psmisc.xibuild diff --git a/repo/system/queue-standalone.xibuild b/repo/system/queue-standalone/queue-standalone.xibuild index c58dec8..c58dec8 100644 --- a/repo/system/queue-standalone.xibuild +++ b/repo/system/queue-standalone/queue-standalone.xibuild diff --git a/repo/system/re2.xibuild b/repo/system/re2/re2.xibuild index 4dd0e5d..4dd0e5d 100644 --- a/repo/system/re2.xibuild +++ b/repo/system/re2/re2.xibuild diff --git a/repo/system/readline.xibuild b/repo/system/readline/readline.xibuild index 5b93318..5b93318 100644 --- a/repo/system/readline.xibuild +++ b/repo/system/readline/readline.xibuild diff --git a/repo/system/rtmpdump.xibuild b/repo/system/rtmpdump/rtmpdump.xibuild index cac7356..cac7356 100644 --- a/repo/system/rtmpdump.xibuild +++ b/repo/system/rtmpdump/rtmpdump.xibuild diff --git a/repo/system/sbase.xibuild b/repo/system/sbase/sbase.xibuild index a380c9e..a380c9e 100644 --- a/repo/system/sbase.xibuild +++ b/repo/system/sbase/sbase.xibuild diff --git a/repo/system/sed.xibuild b/repo/system/sed/sed.xibuild index ddb7102..ddb7102 100644 --- a/repo/system/sed.xibuild +++ b/repo/system/sed/sed.xibuild diff --git a/repo/system/sh.xibuild b/repo/system/sh/sh.xibuild index db37812..db37812 100644 --- a/repo/system/sh.xibuild +++ b/repo/system/sh/sh.xibuild diff --git a/repo/system/shadow/chage.pamd b/repo/system/shadow/chage.pamd new file mode 100644 index 0000000..3f277f8 --- /dev/null +++ b/repo/system/shadow/chage.pamd @@ -0,0 +1,11 @@ +# Begin /etc/pam.d/chage + +# always allow root +auth sufficient pam_rootok.so + +# include system auth and account settings +auth include system-auth +account include system-account + +# End /etc/pam.d/chage + diff --git a/repo/system/shadow/chpasswd.pamd b/repo/system/shadow/chpasswd.pamd new file mode 100644 index 0000000..81afbee --- /dev/null +++ b/repo/system/shadow/chpasswd.pamd @@ -0,0 +1,12 @@ +# Begin /etc/pam.d/newusers + +# always allow root +auth sufficient pam_rootok.so + +# include system auth and account settings +auth include system-auth +account include system-account +password include system-password + +# End /etc/pam.d/newusers + diff --git a/repo/system/shadow/login.pamd b/repo/system/shadow/login.pamd new file mode 100644 index 0000000..c6410c1 --- /dev/null +++ b/repo/system/shadow/login.pamd @@ -0,0 +1,46 @@ +# Begin /etc/pam.d/login + +# Set failure delay before next prompt to 3 seconds +auth optional pam_faildelay.so delay=3000000 + +# Check to make sure that the user is allowed to login +auth requisite pam_nologin.so + +# Check to make sure that root is allowed to login +# Disabled by default. You will need to create /etc/securetty +# file for this module to function. See man 5 securetty. +#auth required pam_securetty.so + +# Additional group memberships - disabled by default +#auth optional pam_group.so + +# include system auth settings +auth include system-auth + +# check access for the user +account required pam_access.so + +# include system account settings +account include system-account + +# Set default environment variables for the user +session required pam_env.so + +# Set resource limits for the user +session required pam_limits.so + +# Display date of last login - Disabled by default +#session optional pam_lastlog.so + +# Display the message of the day - Disabled by default +#session optional pam_motd.so + +# Check user's mail - Disabled by default +#session optional pam_mail.so standard quiet + +# include system session and password settings +session include system-session +password include system-password + +# End /etc/pam.d/login + diff --git a/repo/system/shadow/newusers.pamd b/repo/system/shadow/newusers.pamd new file mode 100644 index 0000000..57f5cfa --- /dev/null +++ b/repo/system/shadow/newusers.pamd @@ -0,0 +1,12 @@ +# Begin /etc/pam.d/chpasswd + +# always allow root +auth sufficient pam_rootok.so + +# include system auth and account settings +auth include system-auth +account include system-account +password include system-password + +# End /etc/pam.d/chpasswd + diff --git a/repo/system/shadow/passwd.pamd b/repo/system/shadow/passwd.pamd new file mode 100644 index 0000000..83459e3 --- /dev/null +++ b/repo/system/shadow/passwd.pamd @@ -0,0 +1,6 @@ +# Begin /etc/pam.d/passwd + +password include system-password + +# End /etc/pam.d/passwd + diff --git a/repo/system/shadow.xibuild b/repo/system/shadow/shadow.xibuild index 22bd2f1..22bd2f1 100644 --- a/repo/system/shadow.xibuild +++ b/repo/system/shadow/shadow.xibuild diff --git a/repo/system/shadow/su.pamd b/repo/system/shadow/su.pamd new file mode 100644 index 0000000..ca6ab90 --- /dev/null +++ b/repo/system/shadow/su.pamd @@ -0,0 +1,27 @@ +# Begin /etc/pam.d/su + +# always allow root +auth sufficient pam_rootok.so + +# Allow users in the wheel group to execute su without a password +# disabled by default +#auth sufficient pam_wheel.so trust use_uid + +# include system auth settings +auth include system-auth + +# limit su to users in the wheel group +# disabled by default +#auth required pam_wheel.so use_uid + +# include system account settings +account include system-account + +# Set default environment variables for the service user +session required pam_env.so + +# include system session settings +session include system-session + +# End /etc/pam.d/su + diff --git a/repo/system/shared-mime-info.xibuild b/repo/system/shared-mime-info/shared-mime-info.xibuild index cb6b887..cb6b887 100644 --- a/repo/system/shared-mime-info.xibuild +++ b/repo/system/shared-mime-info/shared-mime-info.xibuild diff --git a/repo/system/skalibs.xibuild b/repo/system/skalibs/skalibs.xibuild index 0833b6c..0833b6c 100644 --- a/repo/system/skalibs.xibuild +++ b/repo/system/skalibs/skalibs.xibuild diff --git a/repo/system/slang.xibuild b/repo/system/slang/slang.xibuild index b480936..b480936 100644 --- a/repo/system/slang.xibuild +++ b/repo/system/slang/slang.xibuild diff --git a/repo/system/snappy/cmakelists.patch b/repo/system/snappy/cmakelists.patch new file mode 100644 index 0000000..d6576a8 --- /dev/null +++ b/repo/system/snappy/cmakelists.patch @@ -0,0 +1,76 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -213,19 +219,28 @@ + "snappy-stubs-public.h.in" + "${PROJECT_BINARY_DIR}/snappy-stubs-public.h") + ++# When BUILD_SHARED_LIBS is: ++# ON it will generate a SHARED library ++# OFF it will generate a STATIC library + add_library(snappy "") +-target_sources(snappy +- PRIVATE ++ ++# Used to generate both lib types ++if (BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) ++ add_library(snappy_static STATIC "") ++ set_target_properties(snappy_static PROPERTIES OUTPUT_NAME snappy) ++ install(TARGETS snappy_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) ++endif () ++ ++set(SNAPPY_SOURCE_PRIVATE + "snappy-internal.h" + "snappy-stubs-internal.h" + "snappy-c.cc" + "snappy-sinksource.cc" + "snappy-stubs-internal.cc" + "snappy.cc" +- "${PROJECT_BINARY_DIR}/config.h" ++ "${PROJECT_BINARY_DIR}/config.h") + +- # Only CMake 3.3+ supports PUBLIC sources in targets exported by "install". +- $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC> ++set(SNAPPY_SOURCE_PUBLIC + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-c.h> + $<INSTALL_INTERFACE:include/snappy-c.h> + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-sinksource.h> +@@ -233,18 +248,32 @@ + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy.h> + $<INSTALL_INTERFACE:include/snappy.h> + $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/snappy-stubs-public.h> +- $<INSTALL_INTERFACE:include/snappy-stubs-public.h> +-) +-target_include_directories(snappy +- PUBLIC ++ $<INSTALL_INTERFACE:include/snappy-stubs-public.h>) ++ ++set(SNAPPY_INCLUDE_DIRS + $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> +- $<INSTALL_INTERFACE:include> +-) ++ $<INSTALL_INTERFACE:include>) ++ ++# Only CMake 3.3+ supports PUBLIC sources in targets exported by "install". ++target_sources(snappy PRIVATE ${SNAPPY_SOURCE_PRIVATE} ++ $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC> ${SNAPPY_SOURCE_PUBLIC}) ++ ++target_include_directories(snappy PUBLIC ${SNAPPY_INCLUDE_DIRS}) ++ ++target_compile_definitions(snappy PRIVATE -DHAVE_CONFIG_H) ++ ++# Only CMake 3.3+ supports PUBLIC sources in targets exported by "install". ++target_sources(snappy_static PRIVATE ${SNAPPY_SOURCE_PRIVATE} ++ $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC> ${SNAPPY_SOURCE_PUBLIC}) ++ ++target_include_directories(snappy_static PUBLIC ${SNAPPY_INCLUDE_DIRS}) ++ ++target_compile_definitions(snappy_static PRIVATE -DHAVE_CONFIG_H) ++ + set_target_properties(snappy + PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) + +-target_compile_definitions(snappy PRIVATE -DHAVE_CONFIG_H) + if(BUILD_SHARED_LIBS) + set_target_properties(snappy PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + endif(BUILD_SHARED_LIBS) diff --git a/repo/system/snappy/fix-inline.patch b/repo/system/snappy/fix-inline.patch new file mode 100644 index 0000000..96484e0 --- /dev/null +++ b/repo/system/snappy/fix-inline.patch @@ -0,0 +1,13 @@ +Patch-Source: https://github.com/google/snappy/pull/128 + +--- a/snappy.cc ++++ b/snappy.cc +@@ -1014,7 +1014,7 @@ + } + + SNAPPY_ATTRIBUTE_ALWAYS_INLINE +-size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) { ++inline size_t AdvanceToNextTag(const uint8_t** ip_p, size_t* tag) { + const uint8_t*& ip = *ip_p; + // This section is crucial for the throughput of the decompression loop. + // The latency of an iteration is fundamentally constrained by the diff --git a/repo/system/snappy/rtti.patch b/repo/system/snappy/rtti.patch new file mode 100644 index 0000000..80f89ff --- /dev/null +++ b/repo/system/snappy/rtti.patch @@ -0,0 +1,56 @@ +From f73b11e87dfbe1cb4862b8ee489679d99534f40b Mon Sep 17 00:00:00 2001 +From: Tim Serong <tserong@suse.com> +Date: Wed, 27 Oct 2021 18:49:04 +1100 +Subject: [PATCH] Re-enable RTTI (needed in order to subclass Source, etc.) + +Commit c98344f in snappy 1.1.9 disabled RTTI, which means the +snappy library no longer exports typeinfo for snappy::Source, +snappy::Sink, ..., so users of the library can't subclass these +classes anymore. + +Here's a trivial reproducer: + + #include <snappy-sinksource.h> + class MySource : snappy::Source { + public: + size_t Available() const override { return 0; } + const char *Peek(size_t *len) override { return NULL; } + void Skip(size_t n) override {} + }; + int main(int argc, char **argv) { + MySource m; + return 0; + } + +Try `g++ -o snappy-test ./snappy-test.cc -lsnappy` with the above +and the linker will fail with "undefined reference to `typeinfo +for snappy::Source'" if RTTI was disabled in the snappy build. +--- + CMakeLists.txt | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 6eef485..755605d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -51,10 +51,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + string(REGEX REPLACE "/EH[a-z]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHs-c-") + add_definitions(-D_HAS_EXCEPTIONS=0) +- +- # Disable RTTI. +- string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") + else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # Use -Wall for clang and gcc. + if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") +@@ -77,9 +73,6 @@ else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + string(REGEX REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") + +- # Disable RTTI. +- string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") + endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + + # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make diff --git a/repo/system/snappy.xibuild b/repo/system/snappy/snappy.xibuild index e266327..e266327 100644 --- a/repo/system/snappy.xibuild +++ b/repo/system/snappy/snappy.xibuild diff --git a/repo/system/sqlite3.xibuild b/repo/system/sqlite3/sqlite3.xibuild index 12f7210..12f7210 100644 --- a/repo/system/sqlite3.xibuild +++ b/repo/system/sqlite3/sqlite3.xibuild diff --git a/repo/system/startup-notification.xibuild b/repo/system/startup-notification/startup-notification.xibuild index 08d7a85..08d7a85 100644 --- a/repo/system/startup-notification.xibuild +++ b/repo/system/startup-notification/startup-notification.xibuild diff --git a/repo/system/sysklogd/sysklogd.initd b/repo/system/sysklogd/sysklogd.initd new file mode 100644 index 0000000..74b13bd --- /dev/null +++ b/repo/system/sysklogd/sysklogd.initd @@ -0,0 +1,3 @@ +#!/sbin/openrc-run + +command=/bin/syslogd diff --git a/repo/system/sysklogd.xibuild b/repo/system/sysklogd/sysklogd.xibuild index 87370e4..87370e4 100644 --- a/repo/system/sysklogd.xibuild +++ b/repo/system/sysklogd/sysklogd.xibuild diff --git a/repo/system/syslinux/0018-prevent-pow-optimization.patch b/repo/system/syslinux/0018-prevent-pow-optimization.patch new file mode 100644 index 0000000..0c42c7b --- /dev/null +++ b/repo/system/syslinux/0018-prevent-pow-optimization.patch @@ -0,0 +1,36 @@ +From: Lukas Schwaighofer <lukas@schwaighofer.name> +Date: Tue, 26 Feb 2019 23:13:58 +0100 +Subject: Prevent optimizing the pow() function + +With the current GCC 8.2.0 from Debian, a section of code calling pow() in +zzjson_parse.c is turned into a sequence calling exp(). Since no exp() +implementation is available in syslinux those optimizations need to be +disabled. +--- + com32/gpllib/zzjson/zzjson_parse.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/com32/gpllib/zzjson/zzjson_parse.c b/com32/gpllib/zzjson/zzjson_parse.c +index ecb6f61..e66a9d8 100644 +--- a/com32/gpllib/zzjson/zzjson_parse.c ++++ b/com32/gpllib/zzjson/zzjson_parse.c +@@ -138,6 +138,10 @@ static ZZJSON *parse_string2(ZZJSON_CONFIG *config) { + return zzjson; + } + ++static double __attribute__((optimize("O0"))) pow_noopt(double x, double y) { ++ return pow(x, y); ++} ++ + static ZZJSON *parse_number(ZZJSON_CONFIG *config) { + ZZJSON *zzjson; + unsigned long long ival = 0, expo = 0; +@@ -213,7 +217,7 @@ skipexpo: + if (dbl) { + dval = sign * (long long) ival; + dval += sign * frac; +- dval *= pow(10.0, (double) signexpo * expo); ++ dval *= pow_noopt(10.0, (double) signexpo * expo); + } + + zzjson = config->calloc(1, sizeof(ZZJSON)); diff --git a/repo/system/syslinux/fix-sysmacros.patch b/repo/system/syslinux/fix-sysmacros.patch new file mode 100644 index 0000000..dd622e8 --- /dev/null +++ b/repo/system/syslinux/fix-sysmacros.patch @@ -0,0 +1,12 @@ +diff --git a/extlinux/main.c b/extlinux/main.c +index a7ebd49..69bb164 100644 +--- a/extlinux/main.c ++++ b/extlinux/main.c +@@ -41,6 +41,7 @@ + #include <sys/types.h> + #include <sys/mount.h> + #include <sys/vfs.h> ++#include <sys/sysmacros.h> + + #include "linuxioctl.h" + diff --git a/repo/system/syslinux/gcc-10.patch b/repo/system/syslinux/gcc-10.patch new file mode 100644 index 0000000..b5bbad0 --- /dev/null +++ b/repo/system/syslinux/gcc-10.patch @@ -0,0 +1,109 @@ +From 951928f2cad5682c2844e6bd0f7201236c5d9b66 Mon Sep 17 00:00:00 2001 +From: Merlin Mathesius <mmathesi@redhat.com> +Date: Wed, 13 May 2020 08:02:27 -0500 +Subject: [PATCH] Workaround multiple definition of symbol errors + +--- + com32/cmenu/Makefile | 2 +- + com32/elflink/ldlinux/Makefile | 2 +- + com32/gpllib/Makefile | 2 +- + com32/hdt/Makefile | 2 +- + core/Makefile | 2 +- + dos/Makefile | 2 +- + efi/Makefile | 2 +- + 7 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/com32/cmenu/Makefile b/com32/cmenu/Makefile +index b81b68ed..2ae989c4 100644 +--- a/com32/cmenu/Makefile ++++ b/com32/cmenu/Makefile +@@ -49,7 +49,7 @@ makeoutputdirs: + @mkdir -p $(OBJ)/libmenu + + libmenu/libmenu.elf: $(LIBMENU) +- $(LD) -shared $(LDFLAGS) -soname $(patsubst %.elf,%.c32,$(@F)) \ ++ $(LD) -shared $(LDFLAGS) -z muldefs -soname $(patsubst %.elf,%.c32,$(@F)) \ + -o $@ $^ + + tidy dist: +diff --git a/com32/elflink/ldlinux/Makefile b/com32/elflink/ldlinux/Makefile +index 87c0d362..2be2a01a 100644 +--- a/com32/elflink/ldlinux/Makefile ++++ b/com32/elflink/ldlinux/Makefile +@@ -33,7 +33,7 @@ endif + all: $(BTARGET) ldlinux_lnx.a + + ldlinux.elf : $(OBJS) +- $(LD) $(LDFLAGS) -soname $(SONAME) -o $@ $^ $(LIBS) ++ $(LD) $(LDFLAGS) -z muldefs -soname $(SONAME) -o $@ $^ $(LIBS) + + LNXCFLAGS += -D__export='__attribute__((visibility("default")))' + LNXLIBOBJS = get_key.lo +diff --git a/com32/gpllib/Makefile b/com32/gpllib/Makefile +index 1fec9145..2d764d0b 100644 +--- a/com32/gpllib/Makefile ++++ b/com32/gpllib/Makefile +@@ -24,7 +24,7 @@ makeoutputdirs: + $(addprefix $(OBJ),$(sort $(dir $(LIBOBJS)))),$(b)) + + libgpl.elf : $(LIBOBJS) +- $(LD) -shared $(LDFLAGS) -soname $(patsubst %.elf,%.c32,$(@F)) -o $@ $^ ++ $(LD) -shared $(LDFLAGS) -z muldefs -soname $(patsubst %.elf,%.c32,$(@F)) -o $@ $^ + + tidy dist clean: + find . \( -name \*.o -o -name .\*.d -o -name \*.tmp \) -print0 | \ +diff --git a/com32/hdt/Makefile b/com32/hdt/Makefile +index 61736d05..1d947857 100644 +--- a/com32/hdt/Makefile ++++ b/com32/hdt/Makefile +@@ -52,7 +52,7 @@ QEMU ?= qemu-kvm + all: $(MODULES) $(TESTFILES) + + hdt.elf : $(OBJS) $(LIBS) $(C_LIBS) +- $(LD) $(LDFLAGS) -o $@ $^ ++ $(LD) $(LDFLAGS) -z muldefs -o $@ $^ + + memtest: + -[ ! -f $(FLOPPY_DIR)/$(MEMTEST) ] && $(WGET) $(MEMTEST_URL) -O $(FLOPPY_DIR)/$(MEMTEST) +diff --git a/core/Makefile b/core/Makefile +index 46cb037c..f0cfcbe9 100644 +--- a/core/Makefile ++++ b/core/Makefile +@@ -156,7 +156,7 @@ LDSCRIPT = $(SRC)/$(ARCH)/syslinux.ld + NASM_ELF = elf + + %.elf: %.o $(LIBDEP) $(LDSCRIPT) $(AUXLIBS) +- $(LD) $(LDFLAGS) -pie -Bsymbolic \ ++ $(LD) $(LDFLAGS) -z muldefs -pie -Bsymbolic \ + -T $(LDSCRIPT) \ + --unresolved-symbols=report-all \ + -E --hash-style=gnu -M -o $@ $< \ +diff --git a/dos/Makefile b/dos/Makefile +index 4c930d19..5d1c72ca 100644 +--- a/dos/Makefile ++++ b/dos/Makefile +@@ -19,7 +19,7 @@ include $(MAKEDIR)/embedded.mk + CFLAGS += -D__MSDOS__ -mregparm=3 -DREGPARM=3 + # CFLAGS += -DDEBUG + +-LDFLAGS = -T $(SRC)/dosexe.ld ++LDFLAGS = -T $(SRC)/dosexe.ld -z muldefs + OPTFLAGS = -g + INCLUDES = -include code16.h -nostdinc -iwithprefix include \ + -I$(SRC) -I$(SRC)/.. -I$(SRC)/../libfat \ +diff --git a/efi/Makefile b/efi/Makefile +index bbf23f24..3dd922d5 100644 +--- a/efi/Makefile ++++ b/efi/Makefile +@@ -69,7 +69,7 @@ $(OBJS): | $(OBJ)/$(ARCH) + BTARGET = syslinux.efi + + syslinux.so: $(OBJS) $(CORE_OBJS) $(LIB_OBJS) +- $(LD) $(LDFLAGS) --strip-debug -o $@ $^ -lgnuefi -lefi ++ $(LD) $(LDFLAGS) -z muldefs --strip-debug -o $@ $^ -lgnuefi -lefi + + # We need to rename the .hash section because the EFI firmware + # linker really doesn't like it. +-- +2.25.1 + diff --git a/repo/system/syslinux/syslinux.post-upgrade b/repo/system/syslinux/syslinux.post-upgrade new file mode 100644 index 0000000..9038866 --- /dev/null +++ b/repo/system/syslinux/syslinux.post-upgrade @@ -0,0 +1,61 @@ +#!/bin/sh + +# find given append opt +get_append_opt() { + awk -v search="$1" ' + $1 == "append" || $1 == "APPEND" { + split($0, a); + for (i in a) { + if (index(a[i], search) == 1) { + print a[i]; + } + } + }' /boot/extlinux.conf | sort | uniq +} + +# print default kernel options +get_default_opts() { + awk ' + $1 == "append" || $1 == "APPEND" { + opts=""; + space=""; + split($0, a); + for (i in a) { + if (i != 1 \ + && (index(a[i], "root=") != 1) \ + && (index(a[i], "initrd=") != 1) \ + && (index(a[i], "modules=") != 1)) { + opts = opts space a[i]; + space = " "; + } + } + print opts; + } + ' /boot/extlinux.conf | sort | uniq +} + +if ! [ -f /boot/extlinux.conf ]; then + exit 0 +fi + +# check if we already have a generated extlinux.conf +if grep -q '^# Generated by update-extlinux' /boot/extlinux.conf; then + exit 0 +fi + +# try fish out the kernel opts from extlinuix.conf's append line +root=$(get_append_opt 'root=' | head -n 1) +modules=$(get_append_opt 'modules=' | head -n 1) +opts=$(get_default_opts | head -n 1) + +# populate update-extlinux.conf with the info we know +if [ -n "$root" ]; then + sed -i -e "/^root=/s|.*|$root|g" /etc/update-extlinux.conf +fi +if [ -n "$modules" ]; then + sed -i -e "/^modules=/s|.*|$modules|g" /etc/update-extlinux.conf +fi +if [ -n "$opts" ]; then + sed -i -e "/^default_kernel_opts=/s|.*|default_kernel_opts=\"$opts\"|g" /etc/update-extlinux.conf +fi + diff --git a/repo/system/syslinux/syslinux.trigger b/repo/system/syslinux/syslinux.trigger new file mode 100644 index 0000000..fe91f43 --- /dev/null +++ b/repo/system/syslinux/syslinux.trigger @@ -0,0 +1,3 @@ +#!/bin/sh + +update-extlinux --warn-only diff --git a/repo/system/syslinux.xibuild b/repo/system/syslinux/syslinux.xibuild index 19edc66..19edc66 100644 --- a/repo/system/syslinux.xibuild +++ b/repo/system/syslinux/syslinux.xibuild diff --git a/repo/system/syslinux/update-extlinux b/repo/system/syslinux/update-extlinux new file mode 100644 index 0000000..4799cd3 --- /dev/null +++ b/repo/system/syslinux/update-extlinux @@ -0,0 +1,284 @@ +#!/bin/sh + +version= +default=0 +timeout=5 +verbose=0 + +conf=/boot/extlinux.conf +myconf=/etc/update-extlinux.conf + +# read in extlinux settings +if [ -f "$myconf" ]; then + . $myconf +fi + +everbose() { + if [ "$verbose" = "0" ]; then + return + fi + + echo $* +} + +ewarn() { + echo "WARNING:" $@ >&2 +} + +eerror() { + echo "ERROR:" $@ >&2 + return 1 +} + +usage() { + echo "usage: $0 [-v|--verbose] [--warn-only]" +} + +while [ $# -gt 0 ]; do + opt="$1" + shift + case "$opt" in + -v|--verbose) + verbose=1 + ;; + --warn-only) + warn_only=1 + ;; + --) + break + ;; + -*) + usage + exit 1 + ;; + esac +done + +everbose "Updating extlinux configuration." + +if [ "x$root" = "x" ]; then + ewarn "Root device is not specified in $myconf." + blkid_export=$(blkid -o export /dev/root) + if [ -n "$blkid_export" ]; then + export $blkid_export + fi + if [ -z "$UUID" ]; then + # try parse /proc/mount for mounted / + dev=$(awk '$2 == "/" {dev=$1} END {print dev}' /proc/mounts) + if [ -n "$dev" ]; then + blkid_export=$(blkid -o export $dev) + if [ -n "$blkid_export" ]; then + export "$blkid_export" + fi + fi + fi + if [ -z "$UUID" ]; then + if [ -z "$dev" ]; then + if [ -n "$warn_only" ]; then + ewarn "Failed to detect root device. extlinux.conf is not updated" + exit 0 + else + eerror "Failed to detect root device" + exit 1 + fi + else + root=$dev + fi + else + root=UUID=$UUID + fi + everbose "Root device is: $root" +fi + +rtimeout=$(( ${timeout} * 10 )) +syslinux_menu=menu.c32 +menu_hidden= + +# vesa menu has been requested? +if [ "$vesa_menu" = "1" ]; then + syslinux_menu=vesamenu.c32 +fi + +umask 0022 +rm -f $conf.new +echo "# Generated by update-extlinux $version" > $conf.new +if [ -n "$serial_port" ]; then + echo "SERIAL $serial_port ${serial_baud:-115200}" >> $conf.new +fi +echo "DEFAULT $syslinux_menu" >> $conf.new +echo "PROMPT 0" >> $conf.new +echo "MENU TITLE XiLinux/$(uname -s) Boot Menu" >> $conf.new +if [ "$hidden" = "1" ]; then + echo "MENU HIDDEN" >> $conf.new +fi +echo "MENU AUTOBOOT XiLinux will be booted automatically in # seconds." >> $conf.new +echo "TIMEOUT $rtimeout" >> $conf.new + +lst=0 +if [ -f "/boot/xen.gz" ]; then + for kernel in $(find /boot -name "vmlinuz-*" -type f); do + tag=$(basename $kernel | cut -b9-) + everbose "Found Xen hypervisor: /boot/xen.gz, kernel: $kernel" + + if [ -f "/boot/initramfs-$tag" ]; then + everbose "Found initramfs: /boot/initramfs-$tag" + initramfs="initramfs-$tag" + else + initramfs= + fi + initramfs_stage="${initramfs:+---} $initramfs" + + if [ -f "/boot/amd-ucode.img" ]; then + everbose "Found microcode for AMD CPUs: /boot/amd-ucode.img" + ucode_image_amd="amd-ucode.img" + case "$xen_opts" in + *ucode=scan* ) ;; + * ) xen_opts="$xen_opts ucode=scan" ;; + esac + fi + if [ -f "/boot/intel-ucode.img" ]; then + everbose "Found microcode for Intel CPUs: /boot/intel-ucode.img" + ucode_image_intel="intel-ucode.img" + case "$xen_opts" in + *ucode=scan* ) ;; + * ) xen_opts="$xen_opts ucode=scan" ;; + esac + fi + ucode_image_stage="${ucode_image_amd:+---} $ucode_image_amd ${ucode_image_intel:+---} $ucode_image_intel" + + label=xen-$(grep -w -l $tag /usr/share/kernel/*/kernel.release \ + | cut -d/ -f5) + if [ "$label" = "xen-" ]; then + label=xen-$lst + fi + + dom0_kernel_stage="--- $(basename $kernel) root=$root modules=${modules}${TYPE:+,$TYPE} $default_kernel_opts" + + echo "LABEL $label" >> $conf.new + if [ "$label" = "$default" ]; then + echo " MENU DEFAULT" >> $conf.new + fi + echo " MENU LABEL Xen + Linux $tag" >> $conf.new + echo " COM32 mboot.c32" >> $conf.new + echo " APPEND xen.gz $xen_opts $dom0_kernel_stage $initramfs_stage $ucode_image_stage" >> $conf.new + echo "" >> $conf.new + lst=$(($lst + 1)) + done +fi + +for kernel in $(find /boot -name "vmlinuz*" -type f); do + case $kernel in + *vmlinuz) tag=vanilla;; + *vmlinuz-*) tag=$(basename $kernel | cut -b9-);; + *) continue;; + esac + everbose "Found kernel: $kernel" + label=$(grep -w -l $tag /usr/share/kernel/*/kernel.release | cut -d/ -f5) + if [ -z "$label" ]; then + if [ "$tag" = vanilla ]; then + label="vanilla" + else + label=$lst + fi + fi + echo "LABEL $label" >> $conf.new + if [ "$label" = "$default" ]; then + echo " MENU DEFAULT" >> $conf.new + fi + echo " MENU LABEL Linux $tag" >> $conf.new + echo " LINUX $(basename $kernel)" >> $conf.new + initrd= + if [ -f "/boot/initramfs-$tag" ]; then + everbose "Found initramfs: /boot/initramfs-$tag" + initrd="initramfs-$tag" + fi + if [ -f "/boot/amd-ucode.img" ]; then + everbose "Found microcode for AMD CPUs: /boot/amd-ucode.img" + initrd="amd-ucode.img${initrd:+,}${initrd}" + fi + if [ -f "/boot/intel-ucode.img" ]; then + everbose "Found microcode for Intel CPUs: /boot/intel-ucode.img" + initrd="intel-ucode.img${initrd:+,}${initrd}" + fi + echo " INITRD ${initrd}" >> $conf.new + echo " APPEND root=$root modules=${modules}${TYPE:+,$TYPE} $default_kernel_opts" >> $conf.new + echo "" >> $conf.new + lst=$(($lst + 1)) +done + +if [ -n "$password" ]; then + echo "NOESCAPE 1" >> $conf.new + echo "MENU MASTER PASSWD $password" >> $conf.new + echo "" >> $conf.new + chmod o-r $conf.new +fi + +everbose "$lst entries found." + +for entry in /etc/update-extlinux.d/*; do + [ -f "$entry" ] && { cat $entry; echo ""; } >> $conf.new +done + +echo "MENU SEPARATOR" >> $conf.new +echo "" >> $conf.new + +if [ -f "/boot/hdt.c32" ]; then + everbose "Found Hardware Detection Tool: /boot/hdt.c32" + echo "LABEL hdt" >> $conf.new + echo " MENU LABEL Hardware info" >> $conf.new + if [ -n "$password" ]; then + echo " MENU PASSWD" >> $conf.new + fi + echo " COM32 hdt.c32" >> $conf.new + if [ -f "/boot/memtest" ]; then + everbose "Found memtest86+: /boot/memtest" + echo " APPEND memtest=memtest" >> $conf.new + fi + echo "" >> $conf.new +elif [ -f "/boot/memtest" ]; then + everbose "Found memtest86+: /boot/memtest" + echo "LABEL memtest" >> $conf.new + echo " MENU LABEL Memtest86+" >> $conf.new + echo " KERNEL memtest" >> $conf.new + echo "" >> $conf.new +fi + +for i in reboot poweroff; do + [ -f "/boot/$i.c32" ] || continue + everbose "Found $i" + # make first char capital + cap=$( echo $i | awk '{sub(".", substr(toupper($0),1,1), $0); print}' ) + echo "LABEL $i" >> $conf.new + echo " MENU LABEL $cap" >> $conf.new + echo " COM32 $i.c32" >> $conf.new + echo "" >> $conf.new +done + +if cmp -s $conf.new $conf; then + everbose "Configuration unchanged." + rm $conf.new +fi + +if [ "$overwrite" != "1" ]; then + exit 0 +elif [ -f "$conf.new" ]; then + # keep a backup just in case + if [ -f "$conf" ]; then + mv $conf $conf.old + fi + + mv $conf.new $conf +fi + +everbose "Installing libutil.c32 libcom32.c32 mboot.c32 menu.c32 vesamenu.c32 to /boot." +cp /usr/share/syslinux/libutil.c32 \ + /usr/share/syslinux/libcom32.c32 \ + /usr/share/syslinux/mboot.c32 \ + /usr/share/syslinux/menu.c32 \ + /usr/share/syslinux/vesamenu.c32 \ + /boot + +case "$(findmnt -n -o FSTYPE -T /boot)" in +ext*) extlinux --update /boot || [ -n "$warn_only" ];; +esac + diff --git a/repo/system/syslinux/update-extlinux.conf b/repo/system/syslinux/update-extlinux.conf new file mode 100644 index 0000000..1dddff2 --- /dev/null +++ b/repo/system/syslinux/update-extlinux.conf @@ -0,0 +1,74 @@ +# configuration for extlinux config builder + +# overwrite +# Overwrite current /boot/extlinux.conf. If this is not '1' we will only +# write to /boot/extlinux.conf.new +overwrite=1 + +# vesa_menu +# use fancy vesa menu (vesamenu.c32) menus, won't work with serial +vesa_menu=0 + +# default_kernel_opts +# default kernel options +default_kernel_opts=quiet + +# modules +# modules which should be loaded before pivot_root +modules=sd-mod,usb-storage,ext4 + +# root +# root device - if not specified, will be guessed using +# blkid -o export /dev/root +root= + +# verbose +# if set to non-zero, update-extlinux will be a lot more verbose. +verbose=0 + +# hidden +# if set to non-zero, the boot menu will be hidden by default. +hidden=1 + +# timeout +# number of seconds to wait before booting default +timeout=3 + +# default +# default kernel to boot +default=lts + +# serial_port +# serial port number - if not specified, serial console will be disabled +serial_port= + +# serial_baud +# the baudrate for the serial port. Will use 115200 if unset +serial_baud=115200 + +# xen_opts +# options to hand to xen hypervisor, useful ones are: +# dom0_mem=384M (give domain-0 environment 384M ram) +xen_opts=dom0_mem=384M + +# if you copy /usr/share/syslinux/reboot.c32 to /boot/, a menu entry +# will be auto-generated for it + +# if you copy hdt.c32, libgpl.c32, and libmenu.c32 from /usr/share/syslinux/ +# to /boot/, a menu entry will be auto-generated for HDT + +# if you download and install /boot/memtest, then if HDT is present it +# will use it, else a separate menu entry will be auto-generated for +# memtest + +# optional password +# you can generate a SHA512 password using: mkpasswd +# +# if you assign a password, you should make this file world-unreadable +# +# if a password is assigned, the menu entries can't be edited at boot +# time, and HDT if present is password-protected +# +# you can also include "MENU PASSWD" in any custom entries you have in +# /etc/update-extlinux.d/ +password='' diff --git a/repo/system/tar.xibuild b/repo/system/tar/tar.xibuild index 28c2da3..28c2da3 100644 --- a/repo/system/tar.xibuild +++ b/repo/system/tar/tar.xibuild diff --git a/repo/system/tcl.xibuild b/repo/system/tcl/tcl.xibuild index 6495948..6495948 100644 --- a/repo/system/tcl.xibuild +++ b/repo/system/tcl/tcl.xibuild diff --git a/repo/system/tomlc99.xibuild b/repo/system/tomlc99/tomlc99.xibuild index 6387c96..6387c96 100644 --- a/repo/system/tomlc99.xibuild +++ b/repo/system/tomlc99/tomlc99.xibuild diff --git a/repo/system/tree-sitter.xibuild b/repo/system/tree-sitter/tree-sitter.xibuild index ccd2b77..ccd2b77 100644 --- a/repo/system/tree-sitter.xibuild +++ b/repo/system/tree-sitter/tree-sitter.xibuild diff --git a/repo/system/tzdata/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch b/repo/system/tzdata/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch new file mode 100644 index 0000000..c4ae70b --- /dev/null +++ b/repo/system/tzdata/0001-posixtz-ensure-the-file-offset-we-pass-to-lseek-is-o.patch @@ -0,0 +1,27 @@ +From e6765bd363d2dd1dcaeeae5117cc25aae53fb944 Mon Sep 17 00:00:00 2001 +From: William Pitcock <nenolod@dereferenced.org> +Date: Thu, 28 Apr 2011 02:56:42 -0500 +Subject: [PATCH 1/2] posixtz: ensure the file offset we pass to lseek is off_t + +on 32-bit systems, sizeof(off_t) is 4, on 64-bit sizeof(off_t) is 8 +causing a word masking issue. +--- + posixtz.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/posixtz.c b/posixtz.c +index cddcb3e..972ca31 100644 +--- a/posixtz-0.5/posixtz.c ++++ b/posixtz-0.5/posixtz.c +@@ -36,7 +36,7 @@ char *posix_tz(const char *filename) + if (r != TZ_BUFLEN + || strncmp(buf, "TZif", 4) != 0 + || (unsigned char)buf[4] < 2 +- || lseek(fd, -TZ_BUFLEN, SEEK_END) < 0 ++ || lseek(fd, (off_t) -TZ_BUFLEN, SEEK_END) < 0 + ) + goto ERROR; + +-- +2.16.2 + diff --git a/repo/system/tzdata/0002-fix-implicit-declaration-warnings-by-including-strin.patch b/repo/system/tzdata/0002-fix-implicit-declaration-warnings-by-including-strin.patch new file mode 100644 index 0000000..6f61b25 --- /dev/null +++ b/repo/system/tzdata/0002-fix-implicit-declaration-warnings-by-including-strin.patch @@ -0,0 +1,28 @@ +From 89d4aece7ba679703060393ac95086fd514c7fc7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net> +Date: Tue, 27 Mar 2018 19:09:44 +0200 +Subject: [PATCH 2/2] fix implicit declaration warnings by including string.h + and unistd.h + +string.h is needed for strncmp(3) and unistd.h is needed for read(3), +close(3) and lseek(3). +--- + posixtz.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/posixtz.c b/posixtz.c +index 972ca31..4a36e10 100644 +--- a/posixtz-0.5/posixtz.c ++++ b/posixtz-0.5/posixtz.c +@@ -14,6 +14,8 @@ + #include <fcntl.h> + #include <limits.h> + #include <stdio.h> ++#include <string.h> ++#include <unistd.h> + + #include "posixtz.h" + +-- +2.16.2 + diff --git a/repo/system/tzdata.xibuild b/repo/system/tzdata/tzdata.xibuild index 0813733..0813733 100644 --- a/repo/system/tzdata.xibuild +++ b/repo/system/tzdata/tzdata.xibuild diff --git a/repo/system/ubase.xibuild b/repo/system/ubase/ubase.xibuild index 0fd1258..0fd1258 100644 --- a/repo/system/ubase.xibuild +++ b/repo/system/ubase/ubase.xibuild diff --git a/repo/system/udev-rules.xibuild b/repo/system/udev-rules/udev-rules.xibuild index 9eda445..9eda445 100644 --- a/repo/system/udev-rules.xibuild +++ b/repo/system/udev-rules/udev-rules.xibuild diff --git a/repo/system/unibilium.xibuild b/repo/system/unibilium/unibilium.xibuild index 9c170f7..9c170f7 100644 --- a/repo/system/unibilium.xibuild +++ b/repo/system/unibilium/unibilium.xibuild diff --git a/repo/system/utmps/btmpd.initd b/repo/system/utmps/btmpd.initd new file mode 100644 index 0000000..b9acc72 --- /dev/null +++ b/repo/system/utmps/btmpd.initd @@ -0,0 +1,24 @@ +#!/sbin/openrc-run +# Copyright 2020-2021 Laurent Bercot for Alpine Linux +# Distributed under the terms of the ISC License. +# +name=btmpd +description="utmps daemon for the btmp service" + +command=/bin/s6-ipcserver +command_args="/run/utmps/.btmpd-socket utmps-wtmpd btmp" +command_user=utmp +command_background=yes +directory=/var/log/btmpd +pidfile=/run/utmps/btmpd.pid + +depend() { + need localmount utmp-prepare + after bootmisc + before networking +} + +start_pre() { + checkpath -d -o utmp:utmp -m 0755 /run/utmps + checkpath -d -o utmp:utmp -m 2755 /var/log/btmpd +} diff --git a/repo/system/utmps/btmpd.logrotate b/repo/system/utmps/btmpd.logrotate new file mode 100644 index 0000000..b681d90 --- /dev/null +++ b/repo/system/utmps/btmpd.logrotate @@ -0,0 +1,6 @@ +/var/log/btmpd/btmp { + missingok + monthly + create 0644 utmp utmp + rotate 3 +} diff --git a/repo/system/utmps/utmp-init.initd b/repo/system/utmps/utmp-init.initd new file mode 100644 index 0000000..acb4dbe --- /dev/null +++ b/repo/system/utmps/utmp-init.initd @@ -0,0 +1,21 @@ +#!/sbin/openrc-run +# Copyright 2020-2022 Laurent Bercot for Alpine Linux +# Distributed under the terms of the ISC License. +# +description="clearing and initialization of the utmp database" + +depend() { + need utmp-prepare utmpd wtmpd + before networking + after clock +} + +start() { + # Create an empty utmp file + checkpath -F -f -m 0644 -o utmp:utmp /run/utmps/utmp + + # Write the initial records as sysvinit/busybox init would do. + # 20018 = 256 * 'N' + '2'. Don't ask. + utmps-write -t 2000 -uw -l reboot -p 0 -h "$(uname -r)" -- '~~' BOOT_TIME '~' + utmps-write -t 2000 -uw -l runlevel -p 20018 -h "$(uname -r)" -- '~~' RUN_LVL '~' +} diff --git a/repo/system/utmps/utmp-prepare.initd b/repo/system/utmps/utmp-prepare.initd new file mode 100644 index 0000000..9f61249 --- /dev/null +++ b/repo/system/utmps/utmp-prepare.initd @@ -0,0 +1,25 @@ +#!/sbin/openrc-run +# Copyright 2020-2022 Laurent Bercot for Alpine Linux +# Distributed under the terms of the ISC License. +# +description="preparation of the utmp databases" + +depend() { + before networking + after clock +} + +start() { + if ! test -L /var/log/utmp || test "$(readlink /var/log/utmp)" != /run/utmps/utmp ; then + rm -f /var/log/utmp + ln -s /run/utmps/utmp /var/log/utmp + fi + if ! test -L /var/log/wtmp || test "$(readlink /var/log/wtmp)" != wtmpd/wtmp ; then + rm -f /var/log/wtmp + ln -s wtmpd/wtmp /var/log/wtmp + fi + if ! test -L /var/log/btmp || test "$(readlink /var/log/btmp)" != btmpd/btmp ; then + rm -f /var/log/btmp + ln -s btmpd/btmp /var/log/btmp + fi +} diff --git a/repo/system/utmps/utmpd.initd b/repo/system/utmps/utmpd.initd new file mode 100644 index 0000000..d04c6b9 --- /dev/null +++ b/repo/system/utmps/utmpd.initd @@ -0,0 +1,23 @@ +#!/sbin/openrc-run +# Copyright 2020-2021 Laurent Bercot for Alpine Linux +# Distributed under the terms of the ISC License. +# +name="utmpd" +description="utmps daemon for the utmp service" + +command=/bin/s6-ipcserver +command_args="/run/utmps/.utmpd-socket utmps-utmpd" +command_user=utmp +command_background=yes +directory=/run/utmps +pidfile=/run/utmps/utmpd.pid + +depend() { + need utmp-prepare + after bootmisc + before networking +} + +start_pre() { + checkpath -d -o utmp:utmp -m 0755 /run/utmps +} diff --git a/repo/system/utmps.xibuild b/repo/system/utmps/utmps.xibuild index 900aae8..900aae8 100644 --- a/repo/system/utmps.xibuild +++ b/repo/system/utmps/utmps.xibuild diff --git a/repo/system/utmps/wtmpd.initd b/repo/system/utmps/wtmpd.initd new file mode 100644 index 0000000..8d3f624 --- /dev/null +++ b/repo/system/utmps/wtmpd.initd @@ -0,0 +1,24 @@ +#!/sbin/openrc-run +# Copyright 2020-2021 Laurent Bercot for Alpine Linux +# Distributed under the terms of the ISC License. +# +name=wtmpd +description="utmps daemon for the wtmp service" + +command=/bin/s6-ipcserver +command_args="/run/utmps/.wtmpd-socket utmps-wtmpd wtmp" +command_user=utmp +command_background=yes +directory=/var/log/wtmpd +pidfile=/run/utmps/wtmpd.pid + +depend() { + need localmount utmp-prepare + after bootmisc + before networking +} + +start_pre() { + checkpath -d -o utmp:utmp -m 0755 /run/utmps + checkpath -d -o utmp:utmp -m 2755 /var/log/wtmpd +} diff --git a/repo/system/utmps/wtmpd.logrotate b/repo/system/utmps/wtmpd.logrotate new file mode 100644 index 0000000..bb23536 --- /dev/null +++ b/repo/system/utmps/wtmpd.logrotate @@ -0,0 +1,6 @@ +/var/log/wtmpd/wtmp { + missingok + monthly + create 0644 utmp utmp + rotate 3 +} diff --git a/repo/system/xxhash.xibuild b/repo/system/xxhash/xxhash.xibuild index 6691fd9..6691fd9 100644 --- a/repo/system/xxhash.xibuild +++ b/repo/system/xxhash/xxhash.xibuild diff --git a/repo/system/xz.xibuild b/repo/system/xz/xz.xibuild index a1d4e17..a1d4e17 100644 --- a/repo/system/xz.xibuild +++ b/repo/system/xz/xz.xibuild diff --git a/repo/system/zip.xibuild b/repo/system/zip/zip.xibuild index e356b10..e356b10 100644 --- a/repo/system/zip.xibuild +++ b/repo/system/zip/zip.xibuild diff --git a/repo/system/zlib.xibuild b/repo/system/zlib/zlib.xibuild index 15dbe59..15dbe59 100644 --- a/repo/system/zlib.xibuild +++ b/repo/system/zlib/zlib.xibuild diff --git a/repo/system/zstd.xibuild b/repo/system/zstd/zstd.xibuild index 827025e..827025e 100644 --- a/repo/system/zstd.xibuild +++ b/repo/system/zstd/zstd.xibuild diff --git a/repo/util/acpi.xibuild b/repo/util/acpi/acpi.xibuild index 6e40c3a..6e40c3a 100644 --- a/repo/util/acpi.xibuild +++ b/repo/util/acpi/acpi.xibuild diff --git a/repo/util/base64.xibuild b/repo/util/base64/base64.xibuild index ead717f..ead717f 100644 --- a/repo/util/base64.xibuild +++ b/repo/util/base64/base64.xibuild diff --git a/repo/util/bash.xibuild b/repo/util/bash/bash.xibuild index 63626b5..63626b5 100644 --- a/repo/util/bash.xibuild +++ b/repo/util/bash/bash.xibuild diff --git a/repo/util/cpio.xibuild b/repo/util/cpio/cpio.xibuild index 2c3a41d..2c3a41d 100644 --- a/repo/util/cpio.xibuild +++ b/repo/util/cpio/cpio.xibuild diff --git a/repo/util/curl.xibuild b/repo/util/curl/curl.xibuild index 957311b..957311b 100644 --- a/repo/util/curl.xibuild +++ b/repo/util/curl/curl.xibuild diff --git a/repo/util/dash.xibuild b/repo/util/dash/dash.xibuild index a63eb4d..a63eb4d 100644 --- a/repo/util/dash.xibuild +++ b/repo/util/dash/dash.xibuild diff --git a/repo/util/diffutils.xibuild b/repo/util/diffutils/diffutils.xibuild index 2a3d0cd..2a3d0cd 100644 --- a/repo/util/diffutils.xibuild +++ b/repo/util/diffutils/diffutils.xibuild diff --git a/repo/util/dosfstools.xibuild b/repo/util/dosfstools/dosfstools.xibuild index 81e30a1..81e30a1 100644 --- a/repo/util/dosfstools.xibuild +++ b/repo/util/dosfstools/dosfstools.xibuild diff --git a/repo/util/dracut.xibuild b/repo/util/dracut/dracut.xibuild index 3bc9e0a..3bc9e0a 100644 --- a/repo/util/dracut.xibuild +++ b/repo/util/dracut/dracut.xibuild diff --git a/repo/util/dracut/fix-sbase-coreutils.patch b/repo/util/dracut/fix-sbase-coreutils.patch new file mode 100644 index 0000000..0ff740f --- /dev/null +++ b/repo/util/dracut/fix-sbase-coreutils.patch @@ -0,0 +1,41 @@ +diff -rNu a/Makefile b/Makefile +--- a/Makefile 2021-05-27 13:34:19.000000000 +0100 ++++ b/Makefile 2022-03-09 16:32:58.455844674 +0000 +@@ -158,7 +158,7 @@ + ln -fs dracut-functions.sh $(DESTDIR)$(pkglibdir)/dracut-functions + install -m 0755 dracut-logger.sh $(DESTDIR)$(pkglibdir)/dracut-logger.sh + install -m 0755 dracut-initramfs-restore.sh $(DESTDIR)$(pkglibdir)/dracut-initramfs-restore +- cp -arx modules.d $(DESTDIR)$(pkglibdir) ++ cp -ar modules.d $(DESTDIR)$(pkglibdir) + ifneq ($(enable_documentation),no) + for i in $(man1pages); do install -m 0644 $$i $(DESTDIR)$(mandir)/man1/$${i##*/}; done + for i in $(man5pages); do install -m 0644 $$i $(DESTDIR)$(mandir)/man5/$${i##*/}; done +--- a/src/install/dracut-install.c 2021-05-27 13:34:19.000000000 +0100 ++++ b/src/install/dracut-install.c 2022-03-29 21:40:51.220267462 +0100 +@@ -324,10 +324,10 @@ + pid = fork(); + if (pid == 0) { + if (geteuid() == 0 && no_xattr == false) +- execlp("cp", "cp", "--reflink=auto", "--sparse=auto", "--preserve=mode,xattr,timestamps", "-fL", ++ execlp("cp", "cp", "-fL", + src, dst, NULL); + else +- execlp("cp", "cp", "--reflink=auto", "--sparse=auto", "--preserve=mode,timestamps", "-fL", src, ++ execlp("cp", "cp", "-fL", src, + dst, NULL); + _exit(EXIT_FAILURE); + } +@@ -336,10 +336,10 @@ + if (errno != EINTR) { + ret = -1; + if (geteuid() == 0 && no_xattr == false) +- log_error("Failed: cp --reflink=auto --sparse=auto --preserve=mode,xattr,timestamps -fL %s %s", ++ log_error("Failed: cp -fL %s %s", + src, dst); + else +- log_error("Failed: cp --reflink=auto --sparse=auto --preserve=mode,timestamps -fL %s %s", ++ log_error("Failed: cp -fL %s %s", + src, dst); + break; + } + diff --git a/repo/util/e2fsprogs.xibuild b/repo/util/e2fsprogs/e2fsprogs.xibuild index 641d5ff..641d5ff 100644 --- a/repo/util/e2fsprogs.xibuild +++ b/repo/util/e2fsprogs/e2fsprogs.xibuild diff --git a/repo/util/file.xibuild b/repo/util/file/file.xibuild index d658076..d658076 100644 --- a/repo/util/file.xibuild +++ b/repo/util/file/file.xibuild diff --git a/repo/util/fzf.xibuild b/repo/util/fzf/fzf.xibuild index 6926f2f..6926f2f 100644 --- a/repo/util/fzf.xibuild +++ b/repo/util/fzf/fzf.xibuild diff --git a/repo/util/gawk.xibuild b/repo/util/gawk/gawk.xibuild index c2f3d05..c2f3d05 100644 --- a/repo/util/gawk.xibuild +++ b/repo/util/gawk/gawk.xibuild diff --git a/repo/util/genfstab.xibuild b/repo/util/genfstab/genfstab.xibuild index 267906c..267906c 100644 --- a/repo/util/genfstab.xibuild +++ b/repo/util/genfstab/genfstab.xibuild diff --git a/repo/util/genfstab/remove-extra-flags.patch b/repo/util/genfstab/remove-extra-flags.patch new file mode 100644 index 0000000..7adfc49 --- /dev/null +++ b/repo/util/genfstab/remove-extra-flags.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile b/Makefile +index 50f319a..018fa8b 100644 +--- a/Makefile ++++ b/Makefile +@@ -44,7 +44,7 @@ install: all + install -Dm644 $$comp $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$${comp%%.*}; \ + done; + for manfile in $(MANS); do \ +- install -Dm644 $$manfile -t $(DESTDIR)$(PREFIX)/share/man/man$${manfile##*.}; \ ++ install -Dm644 $$manfile $(DESTDIR)$(PREFIX)/share/man/man$${manfile##*.}; \ + done; + + .PHONY: all clean install uninstall diff --git a/repo/util/graphviz.xibuild b/repo/util/graphviz/graphviz.xibuild index cc87d95..cc87d95 100644 --- a/repo/util/graphviz.xibuild +++ b/repo/util/graphviz/graphviz.xibuild diff --git a/repo/util/grep.xibuild b/repo/util/grep/grep.xibuild index 52cd6f7..52cd6f7 100644 --- a/repo/util/grep.xibuild +++ b/repo/util/grep/grep.xibuild diff --git a/repo/util/groff.xibuild b/repo/util/groff/groff.xibuild index 5ee99cf..5ee99cf 100644 --- a/repo/util/groff.xibuild +++ b/repo/util/groff/groff.xibuild diff --git a/repo/util/htop.xibuild b/repo/util/htop/htop.xibuild index c2918f5..c2918f5 100644 --- a/repo/util/htop.xibuild +++ b/repo/util/htop/htop.xibuild diff --git a/repo/util/iftop.xibuild b/repo/util/iftop/iftop.xibuild index aade527..aade527 100644 --- a/repo/util/iftop.xibuild +++ b/repo/util/iftop/iftop.xibuild diff --git a/repo/util/ifupdown-ng.xibuild b/repo/util/ifupdown-ng/ifupdown-ng.xibuild index c65430b..c65430b 100644 --- a/repo/util/ifupdown-ng.xibuild +++ b/repo/util/ifupdown-ng/ifupdown-ng.xibuild diff --git a/repo/util/inetutils.xibuild b/repo/util/inetutils/inetutils.xibuild index 6e7ed88..6e7ed88 100644 --- a/repo/util/inetutils.xibuild +++ b/repo/util/inetutils/inetutils.xibuild diff --git a/repo/util/iproute2.xibuild b/repo/util/iproute2/iproute2.xibuild index 3d0062d..3d0062d 100644 --- a/repo/util/iproute2.xibuild +++ b/repo/util/iproute2/iproute2.xibuild diff --git a/repo/util/iw.xibuild b/repo/util/iw/iw.xibuild index 212a612..212a612 100644 --- a/repo/util/iw.xibuild +++ b/repo/util/iw/iw.xibuild diff --git a/repo/util/iwd/iwd.confd b/repo/util/iwd/iwd.confd new file mode 100644 index 0000000..9fed1e0 --- /dev/null +++ b/repo/util/iwd/iwd.confd @@ -0,0 +1,24 @@ +# Configuration for /etc/init.d/iwd + +# A comma-separated list of patterns specifying the network interfaces that +# iwd is allowed to manage. Defaults to any wireless interfaces. +#allowed_interfaces= + +# A comma-separated list of patterns specifying the network interfaces that +# iwd should ignore. +#ignored_interfaces= + +# Extra options for iwd(8). +#command_args= + +# Log messages are redirected to syslog. Set to empty string to disable. +#error_logger="logger -t iwd -p daemon.info" + +# Number of milliseconds to wait after starting and check that daemon is +# still running. Set to empty string to disable. +# NOTE: If you use iwd together with ConnMan and ConnMan crashes when started +# right after iwd, increase this period to e.g. 200 ms. +#start_wait=50 + +# Uncomment to use process supervisor. +#supervisor="supervise-daemon" diff --git a/repo/util/iwd/iwd.initd b/repo/util/iwd/iwd.initd new file mode 100644 index 0000000..df5cfb5 --- /dev/null +++ b/repo/util/iwd/iwd.initd @@ -0,0 +1,25 @@ +#!/sbin/openrc-run + +description="iNet wireless daemon" + +: ${error_logger="logger -t iwd -p daemon.info"} +: ${start_wait=50} # milliseconds + +command="/usr/libexec/iwd" +command_background="yes" +command_args=" + ${allowed_interfaces:+"--interfaces \"$allowed_interfaces\""} + ${ignored_interfaces:+"--nointerfaces \"$ignored_interfaces\""} + ${command_args:-} + " +start_stop_daemon_args=" + ${start_wait:+--wait $start_wait} + ${start_stop_daemon_args:-} + " +pidfile="/run/$RC_SVCNAME.pid" + +depend() { + need dbus + before net + keyword -shutdown +} diff --git a/repo/util/iwd.xibuild b/repo/util/iwd/iwd.xibuild index 05e10ee..05e10ee 100644 --- a/repo/util/iwd.xibuild +++ b/repo/util/iwd/iwd.xibuild diff --git a/repo/util/iwd/main.conf b/repo/util/iwd/main.conf new file mode 100644 index 0000000..69670ec --- /dev/null +++ b/repo/util/iwd/main.conf @@ -0,0 +1,7 @@ +[General] +EnableNetworkConfiguration=true + +[Network] +EnableIPv6=true +NameResolvingService=resolvconf + diff --git a/repo/util/keyutils.xibuild b/repo/util/keyutils/keyutils.xibuild index d966a89..d966a89 100644 --- a/repo/util/keyutils.xibuild +++ b/repo/util/keyutils/keyutils.xibuild diff --git a/repo/util/less.xibuild b/repo/util/less/less.xibuild index 394bf91..394bf91 100644 --- a/repo/util/less.xibuild +++ b/repo/util/less/less.xibuild diff --git a/repo/util/lm-sensors.xibuild b/repo/util/lm-sensors/lm-sensors.xibuild index c301161..c301161 100644 --- a/repo/util/lm-sensors.xibuild +++ b/repo/util/lm-sensors/lm-sensors.xibuild diff --git a/repo/util/man-db.xibuild b/repo/util/man-db/man-db.xibuild index 5d0e76c..5d0e76c 100644 --- a/repo/util/man-db.xibuild +++ b/repo/util/man-db/man-db.xibuild diff --git a/repo/util/mandoc.xibuild b/repo/util/mandoc/mandoc.xibuild index d74e6c8..d74e6c8 100644 --- a/repo/util/mandoc.xibuild +++ b/repo/util/mandoc/mandoc.xibuild diff --git a/repo/util/mksh.xibuild b/repo/util/mksh/mksh.xibuild index d946695..d946695 100644 --- a/repo/util/mksh.xibuild +++ b/repo/util/mksh/mksh.xibuild diff --git a/repo/util/mpd-mpc.xibuild b/repo/util/mpd-mpc/mpd-mpc.xibuild index 2018d33..2018d33 100644 --- a/repo/util/mpd-mpc.xibuild +++ b/repo/util/mpd-mpc/mpd-mpc.xibuild diff --git a/repo/util/neofetch.xibuild b/repo/util/neofetch/neofetch.xibuild index a450f78..a450f78 100644 --- a/repo/util/neofetch.xibuild +++ b/repo/util/neofetch/neofetch.xibuild diff --git a/repo/util/net-tools/git.patch b/repo/util/net-tools/git.patch new file mode 100644 index 0000000..eb35885 --- /dev/null +++ b/repo/util/net-tools/git.patch @@ -0,0 +1,26170 @@ +diff --git a/.cvsignore b/.cvsignore +index 1d4a063..ff65062 100644 +--- a/.cvsignore ++++ b/.cvsignore +@@ -1,2 +1,3 @@ + arp hostname ifconfig ipmaddr iptunnel netstat plipconfig rarp route slattach + version.h config.make config.status config.h nameif mii-tool ++.git +diff --git a/.gitignore b/.gitignore +new file mode 100644 +index 0000000..9184162 +--- /dev/null ++++ b/.gitignore +@@ -0,0 +1,36 @@ ++*.o ++ ++*.diff ++*.patch ++*.rej ++*.orig ++ ++.gdb_history ++.gdbinit ++core ++*.gdb ++ ++/config.h ++/config.make ++/config.status ++ ++/net-tools-*.tar* ++ ++/lib/libnet-tools.a ++ ++/po/*.mo ++ ++/version.h ++ ++/arp ++/hostname ++/ifconfig ++/ipmaddr ++/iptunnel ++/mii-tool ++/nameif ++/netstat ++/plipconfig ++/rarp ++/route ++/slattach +diff --git a/COPYING b/COPYING +index a43ea21..d159169 100644 +--- a/COPYING ++++ b/COPYING +@@ -1,12 +1,12 @@ +- GNU GENERAL PUBLIC LICENSE +- Version 2, June 1991 ++ GNU GENERAL PUBLIC LICENSE ++ Version 2, June 1991 + +- Copyright (C) 1989, 1991 Free Software Foundation, Inc. +- 675 Mass Ave, Cambridge, MA 02139, USA ++ Copyright (C) 1989, 1991 Free Software Foundation, Inc., ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +- Preamble ++ Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public +@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by +-the GNU Library General Public License instead.) You can apply it to ++the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not +@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. +- +- GNU GENERAL PUBLIC LICENSE ++ ++ GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions: + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) +- ++ + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in +@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. +- ++ + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is +@@ -225,7 +225,7 @@ impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. +- ++ + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License +@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + +- NO WARRANTY ++ NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + +- END OF TERMS AND CONDITIONS +- +- Appendix: How to Apply These Terms to Your New Programs ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it +@@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> +- Copyright (C) 19yy <name of author> ++ Copyright (C) <year> <name of author> + + 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 +@@ -303,16 +303,16 @@ the "copyright" line and a pointer to where the full notice is found. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Also add information on how to contact you by electronic and paper mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + +- Gnomovision version 69, Copyright (C) 19yy name of author ++ Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. +@@ -335,5 +335,5 @@ necessary. Here is a sample; alter the names: + This General Public License does not permit incorporating your program into + proprietary programs. If your program is a subroutine library, you may + consider it more useful to permit linking proprietary applications with the +-library. If this is what you want to do, use the GNU Library General ++library. If this is what you want to do, use the GNU Lesser General + Public License instead of this License. +diff --git a/INSTALLING b/INSTALLING +index c49f21f..f6180c8 100644 +--- a/INSTALLING ++++ b/INSTALLING +@@ -27,7 +27,7 @@ of the other options should work as well. + + + COMPILE +-------- ++------- + To compile simply use "make". + + There should be no warnings or errors. +diff --git a/Makefile b/Makefile +index 8fcc55c..edf80ec 100644 +--- a/Makefile ++++ b/Makefile +@@ -5,14 +5,10 @@ + # NET-3 Networking Distribution for the LINUX operating + # system. + # +-# Version: 2001-02-13 +-# + # Author: Bernd Eckenfels <net-tools@lina.inka.de> + # Copyright 1995-1996 Bernd Eckenfels, Germany + # +-# URLs: ftp://ftp.inka.de/pub/comp/Linux/networking/NetTools/ +-# ftp://ftp.linux.org.uk/pub/linux/Networking/PROGRAMS/NetTools/ +-# http://www.inka.de/sites/lina/linux/NetTools/index_en.html ++# URLs: http://net-tools.sourceforge.net/ + # + # Based on: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + # Copyright 1988-1993 MicroWalt Corporation +@@ -22,55 +18,16 @@ + # Alan Cox <A.Cox@swansea.ac.uk> + # Copyright 1993-1994 Swansea University Computer Society + # +-# Be careful! ++# Be careful! + # This Makefile doesn't describe complete dependencies for all include files. +-# If you change include files you might need to do make clean. +-# +-# {1.20} Bernd Eckenfels: Even more modifications for the new +-# package layout +-# {1.21} Bernd Eckenfels: Check if config.in is newer than +-# config.status +-# {1.22} Bernd Eckenfels: Include ypdomainname and nisdomainame +-# +-# 1.3.50-BETA6 private Release +-# +-#960125 {1.23} Bernd Eckenfels: Peter Tobias' rewrite for +-# makefile-based installation +-# 1.3.50-BETA6a private Release +-# +-#960201 {1.24} Bernd Eckenfels: net-features.h added +-# +-#960201 1.3.50-BETA6b private Release +-# +-#960203 1.3.50-BETA6c private Release +-# +-#960204 1.3.50-BETA6d private Release +-# +-#960204 {1.25} Bernd Eckenfels: DISTRIBUTION added +-# +-#960205 1.3.50-BETA6e private Release +-# +-#960206 {1.26} Bernd Eckenfels: afrt.o removed (cleaner solution) +-# +-#960215 1.3.50-BETA6f Release +-# +-#960216 {1.30} Bernd Eckenfels: net-lib support +-#960322 {1.31} Bernd Eckenfels: moveable netlib, TOPDIR +-#960424 {1.32} Bernd Eckenfels: included the URLs in the Comment +-# +-#960514 1.31-alpha release +-# +-#960518 {1.33} Bernd Eckenfels: -I/usr/src/linux/include comment added +-# +-# 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 Free Software +-# Foundation; either version 2 of the License, or (at +-# your option) any later version. ++# If you change include files you might need to do make clean. + # + +-# set the base of the Installation ++# set the base of the Installation + # BASEDIR = /mnt ++BASEDIR ?= $(DESTDIR) ++BINDIR ?= /bin ++SBINDIR ?= /sbin + + # path to the net-lib support library. Default: lib + NET_LIB_PATH = lib +@@ -88,20 +45,26 @@ endif + + # Compiler and Linker Options + # You may need to uncomment and edit these if you are using libc5 and IPv6. +-COPTS = -D_GNU_SOURCE -O2 -Wall -g # -I/usr/inet6/include +-ifeq ($(origin LOPTS), undefined) +-LOPTS = +-endif ++CFLAGS ?= -O2 -g ++CFLAGS += -Wall ++CFLAGS += -fno-strict-aliasing # code needs a lot of work before strict aliasing is safe ++CPPFLAGS += -D_GNU_SOURCE + RESLIB = # -L/usr/inet6/lib -linet6 + + ifeq ($(HAVE_AFDECnet),1) + DNLIB = -ldnet + endif + ++ifeq ($(origin CC), undefined) ++CC = gcc ++endif ++LD = $(CC) ++PKG_CONFIG ?= pkg-config ++ + # -------- end of user definitions -------- + +-MAINTAINER = Philip.Blundell@pobox.com +-RELEASE = 1.60 ++MAINTAINER = net-tools-devel@lists.sourceforge.net ++RELEASE = 2.10-alpha + + .EXPORT_ALL_VARIABLES: + +@@ -113,22 +76,22 @@ endif + + NET_LIB = $(NET_LIB_PATH)/lib$(NET_LIB_NAME).a + +-CFLAGS = $(COPTS) -I. -idirafter ./include/ -I$(NET_LIB_PATH) +-LDFLAGS = $(LOPTS) -L$(NET_LIB_PATH) ++ifeq ($(HAVE_SELINUX),1) ++SE_PC_CFLAGS := $(shell $(PKG_CONFIG) --cflags libselinux) ++SE_PC_LIBS := $(shell $(PKG_CONFIG) --libs libselinux || echo -lselinux) ++SELIB = $(SE_PC_LIBS) ++CPPFLAGS += $(SE_PC_CFLAGS) ++endif + +-SUBDIRS = man/ $(NET_LIB_PATH)/ ++CPPFLAGS += -I. -I$(TOPDIR)/include -I$(NET_LIB_PATH) ++LDFLAGS += -L$(NET_LIB_PATH) + +-ifeq ($(origin CC), undefined) +-CC = gcc +-endif +-LD = $(CC) ++SUBDIRS = man/ $(NET_LIB_PATH)/ + + NLIB = -l$(NET_LIB_NAME) + +-MDEFINES = COPTS='$(COPTS)' LOPTS='$(LOPTS)' TOPDIR='$(TOPDIR)' +- +-%.o: %.c config.h version.h intl.h net-features.h $< +- $(CC) $(CFLAGS) -c $< ++%.o: %.c config.h version.h intl.h lib/net-features.h $< ++ $(CC) $(CFLAGS) $(CPPFLAGS) -c $< + + all: config.h version.h subdirs $(PROGS) + +@@ -154,12 +117,21 @@ clobber: clean + @for i in $(SUBDIRS); do (cd $$i && $(MAKE) clobber) ; done + + +-dist: clobber +- @echo Creating net-tools-$(RELEASE) in .. +- @tar -cvz -f ../net-tools-$(RELEASE).tar.gz -C .. net-tools ++dist: ++ rm -rf net-tools-$(RELEASE) ++ git archive --prefix=net-tools-$(RELEASE)/ HEAD | tar xf - ++ $(MAKE) -C net-tools-$(RELEASE)/po $@ ++ tar cf - net-tools-$(RELEASE)/ | xz > net-tools-$(RELEASE).tar.xz ++ rm -rf net-tools-$(RELEASE) + ++distcheck: dist ++ tar xf net-tools-$(RELEASE).tar.xz ++ yes "" | $(MAKE) -C net-tools-$(RELEASE) config ++ $(MAKE) -C net-tools-$(RELEASE) ++ rm -rf net-tools-$(RELEASE) ++ @printf "\nThe tarball is ready to go:\n%s\n" "`du -b net-tools-$(RELEASE).tar.xz`" + +-config.h: config.in Makefile ++config.h: config.in Makefile + @echo "Configuring the Linux net-tools (NET-3 Base Utilities)..." ; echo + @if [ config.status -nt config.in ]; \ + then ./configure.sh config.status; \ +@@ -175,85 +147,91 @@ $(NET_LIB): config.h version.h intl.h libdir + + i18n.h: i18ndir + +-libdir: +- @$(MAKE) -C $(NET_LIB_PATH) $(MDEFINES) ++libdir: version.h ++ @$(MAKE) -C $(NET_LIB_PATH) + + i18ndir: + @$(MAKE) -C po + +-subdirs: +- @for i in $(SUBDIRS); do $(MAKE) -C $$i $(MDEFINES) ; done ++# use libdir target for lib/ to avoid parallel build issues ++subdirs: libdir ++ @for i in $(SUBDIRS:$(NET_LIB_PATH)/=); do $(MAKE) -C $$i || exit $$? ; done + + ifconfig: $(NET_LIB) ifconfig.o +- $(CC) $(LDFLAGS) -o ifconfig ifconfig.o $(NLIB) $(RESLIB) +- +-nameif: nameif.o +- $(CC) $(LDFLAGS) -o nameif nameif.o ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ ifconfig.o $(NLIB) $(RESLIB) ++ ++nameif: $(NET_LIB) nameif.o ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ nameif.o $(NLIB) $(RESLIB) + + hostname: hostname.o +- $(CC) $(LDFLAGS) -o hostname hostname.o $(DNLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ hostname.o $(DNLIB) + + route: $(NET_LIB) route.o +- $(CC) $(LDFLAGS) -o route route.o $(NLIB) $(RESLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ route.o $(NLIB) $(RESLIB) + + arp: $(NET_LIB) arp.o +- $(CC) $(LDFLAGS) -o arp arp.o $(NLIB) $(RESLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ arp.o $(NLIB) $(RESLIB) + + rarp: $(NET_LIB) rarp.o +- $(CC) $(LDFLAGS) -o rarp rarp.o $(NLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ rarp.o $(NLIB) + + slattach: $(NET_LIB) slattach.o +- $(CC) $(LDFLAGS) -o slattach slattach.o $(NLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ slattach.o $(NLIB) + + plipconfig: $(NET_LIB) plipconfig.o +- $(CC) $(LDFLAGS) -o plipconfig plipconfig.o $(NLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ plipconfig.o $(NLIB) + + netstat: $(NET_LIB) netstat.o statistics.o +- $(CC) $(LDFLAGS) -o netstat netstat.o statistics.o $(NLIB) $(RESLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ netstat.o statistics.o $(NLIB) $(RESLIB) $(SELIB) + + iptunnel: $(NET_LIB) iptunnel.o +- $(CC) $(LDFLAGS) -o iptunnel iptunnel.o $(NLIB) $(RESLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ iptunnel.o $(NLIB) $(RESLIB) + + ipmaddr: $(NET_LIB) ipmaddr.o +- $(CC) $(LDFLAGS) -o ipmaddr ipmaddr.o $(NLIB) $(RESLIB) ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ ipmaddr.o $(NLIB) $(RESLIB) + +-mii-tool: mii-tool.o +- $(CC) $(LDFLAGS) -o mii-tool mii-tool.o ++mii-tool: $(NET_LIB) mii-tool.o ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ mii-tool.o $(NLIB) $(RESLIB) + + installbin: +- install -m 0755 -d ${BASEDIR}/sbin +- install -m 0755 -d ${BASEDIR}/bin +- install -m 0755 arp ${BASEDIR}/sbin +- install -m 0755 hostname ${BASEDIR}/bin +- install -m 0755 ifconfig ${BASEDIR}/sbin +- install -m 0755 nameif ${BASEDIR}/sbin +- install -m 0755 netstat ${BASEDIR}/bin +- install -m 0755 plipconfig $(BASEDIR)/sbin +- install -m 0755 rarp ${BASEDIR}/sbin +- install -m 0755 route ${BASEDIR}/sbin +- install -m 0755 slattach $(BASEDIR)/sbin ++ @echo ++ @echo "######################################################" ++ @echo "Notice: ifconfig and route are now installed into /bin" ++ @echo "######################################################" ++ @echo ++ install -m 0755 -d ${BASEDIR}${SBINDIR} ++ install -m 0755 -d ${BASEDIR}${BINDIR} ++ install -m 0755 arp ${BASEDIR}${SBINDIR} ++ install -m 0755 hostname ${BASEDIR}${BINDIR} ++ install -m 0755 ifconfig ${BASEDIR}${BINDIR} ++ install -m 0755 nameif ${BASEDIR}${SBINDIR} ++ install -m 0755 netstat ${BASEDIR}${BINDIR} ++ install -m 0755 plipconfig $(BASEDIR)${SBINDIR} ++ install -m 0755 rarp ${BASEDIR}${SBINDIR} ++ install -m 0755 route ${BASEDIR}${BINDIR} ++ install -m 0755 slattach $(BASEDIR)${SBINDIR} + ifeq ($(HAVE_IP_TOOLS),1) +- install -m 0755 ipmaddr $(BASEDIR)/sbin +- install -m 0755 iptunnel $(BASEDIR)/sbin ++ install -m 0755 ipmaddr $(BASEDIR)${SBINDIR} ++ install -m 0755 iptunnel $(BASEDIR)${SBINDIR} + endif + ifeq ($(HAVE_MII),1) +- install -m 0755 mii-tool $(BASEDIR)/sbin ++ install -m 0755 mii-tool $(BASEDIR)${SBINDIR} + endif +- ln -fs hostname $(BASEDIR)/bin/dnsdomainname +- ln -fs hostname $(BASEDIR)/bin/ypdomainname +- ln -fs hostname $(BASEDIR)/bin/nisdomainname +- ln -fs hostname $(BASEDIR)/bin/domainname ++ ln -fs hostname $(BASEDIR)${BINDIR}/dnsdomainname ++ ln -fs hostname $(BASEDIR)${BINDIR}/ypdomainname ++ ln -fs hostname $(BASEDIR)${BINDIR}/nisdomainname ++ ln -fs hostname $(BASEDIR)${BINDIR}/domainname + ifeq ($(HAVE_AFDECnet),1) +- ln -fs hostname $(BASEDIR)/bin/nodename ++ ln -fs hostname $(BASEDIR)${BINDIR}/nodename + endif + + savebin: +- @for i in ${BASEDIR}/sbin/arp ${BASEDIR}/sbin/ifconfig \ +- ${BASEDIR}/bin/netstat \ +- ${BASEDIR}/sbin/rarp ${BASEDIR}/sbin/route \ +- ${BASEDIR}/bin/hostname ${BASEDIR}/bin/ypdomainname \ +- ${BASEDIR}/bin/dnsdomainname ${BASEDIR}/bin/nisdomainname \ +- ${BASEDIR}/bin/domainname ; do \ ++ @for i in ${BASEDIR}${SBINDIR}/arp ${BASEDIR}${SBINDIR}/ifconfig \ ++ ${BASEDIR}${BINDIR}/netstat \ ++ ${BASEDIR}${SBINDIR}/rarp ${BASEDIR}${SBINDIR}/route \ ++ ${BASEDIR}${BINDIR}/hostname ${BASEDIR}${BINDIR}/ypdomainname \ ++ ${BASEDIR}${BINDIR}/dnsdomainname ${BASEDIR}${BINDIR}/nisdomainname \ ++ ${BASEDIR}${BINDIR}/domainname ; do \ + [ -f $$i ] && cp -f $$i $$i.old ; done ; echo Saved. + + installdata: +diff --git a/README b/README +index 4e35868..aa6cc9a 100644 +--- a/README ++++ b/README +@@ -10,29 +10,35 @@ This package includes the important tools for controlling the network + subsystem of the Linux kernel. This includes arp, hostname, ifconfig, + netstat, rarp and route. Additionally, this package contains + utilities relating to particular network hardware types (plipconfig, +-slattach) and advanced aspects of IP configuration (iptunnel, ++slattach, mii-tool) and advanced aspects of IP configuration (iptunnel, + ipmaddr). + + Please include the output of "program --version" when reporting bugs. + + + Contents: +- ++ + README This file. + + README.ipv6 Notes for people hacking IPv6. + + INSTALLING Installation instructions. + +- COPYING Your free copy of the GNU Public License. ++ COPYING Your free copy of the GNU General Public License. + + TODO Some things that need to be done. + ++The Homepage (including Git repository, release downloads, bug tracker and ++mailing list) is hosted by SourceForge.net. Please consider to ++join the project if you want to contribute: ++ ++ https://sourceforge.net/projects/net-tools/ ++ + + Notes + ----- + +-This is net-tools 1.60. ++This is net-tools 1.6x. + + You need kernel 2.0 or later to use these programs. These programs + should compile cleanly with both glibc (version 2.0 or 2.1) and libc5, +@@ -59,6 +65,8 @@ all common environments but some of the more esoteric hardware and + protocol families may be more touchy. Feel free to send patches if + you have problems. + ++For this release, the localized man pages are installed with UTF-8 encoding. ++ + Phil Blundell + philb@gnu.org + +diff --git a/RPM/net-tools.spec b/RPM/net-tools.spec +index 86b45db..b12f785 100644 +--- a/RPM/net-tools.spec ++++ b/RPM/net-tools.spec +@@ -34,7 +34,7 @@ make BASEDIR=$RPM_BUILD_ROOT install + strip arp ifconfig rarp route slattach plipconfig ipmaddr iptunnel + cd ../bin + strip hostname netstat +-) ++) + + %clean + rm -rf $RPM_BUILD_ROOT +@@ -92,7 +92,7 @@ rm -rf $RPM_BUILD_ROOT + * Fri Feb 27 1998 Jason Spangler <jasons@usemail.com> + - changed to net-tools 1.432 + - removed old glibc 2.1 patch +- ++ + * Wed Oct 22 1997 Erik Troan <ewt@redhat.com> + - added extra patches for glibc 2.1 + +diff --git a/TODO b/TODO +index ec6aae8..c8a10dc 100644 +--- a/TODO ++++ b/TODO +@@ -23,7 +23,7 @@ TODO for net-tools + [ ] supply some informations about new features to HOWTOs + [ ] Config file only works with bash not ash. + [ ] Token ring is almost totally untested. +-[ ] additional tools for IPX, AX.25 etc be bundled [ipxripd004, ipx_* tools ++[ ] additional tools for IPX, AX.25 etc be bundled [ipxripd004, ipx_* tools + from caldera, axattach] into existing bins + [ ] "SIOCAX25OPTRT" [Joerg (DL1BKE)]. 1.3.75 + [ ] dummy NOARP?! (2. default route for preveting hostunreachables on linedrop) +diff --git a/arp.c b/arp.c +index 509a804..5db71a7 100644 +--- a/arp.c ++++ b/arp.c +@@ -8,7 +8,7 @@ + * NET-3 Networking Distribution for the LINUX operating + * system. + * +- * Version: $Id: arp.c,v 1.20 2001/04/08 17:05:05 pb Exp $ ++ * Version: $Id: arp.c,v 1.27 2009/09/06 22:50:11 vapier Exp $ + * + * Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de> + * +@@ -20,14 +20,14 @@ + * Andrew Tridgell : proxy arp netmasks + * Bernd Eckenfels : -n option + * Bernd Eckenfels : Use only /proc for display +- * {1.60} Bernd Eckenfels : new arpcode (-i) for 1.3.42 but works ++ * {1.60} Bernd Eckenfels : new arpcode (-i) for 1.3.42 but works + * with 1.2.x, too + * {1.61} Bernd Eckenfels : more verbose messages + * {1.62} Bernd Eckenfels : check -t for hw adresses and try to + * explain EINVAL (jeff) + *970125 {1.63} Bernd Eckenfels : -a print hardwarename instead of tiltle + *970201 {1.64} Bernd Eckenfels : net-features.h support +- *970203 {1.65} Bernd Eckenfels : "#define" in "#if", ++ *970203 {1.65} Bernd Eckenfels : "#define" in "#if", + * -H|-A additional to -t|-p + *970214 {1.66} Bernd Eckenfels : Fix optarg required for -H and -A + *970412 {1.67} Bernd Eckenfels : device=""; is default +@@ -35,7 +35,7 @@ + *970517 {1.69} Bernd Eckenfels : usage() fixed + *970622 {1.70} Bernd Eckenfels : arp -d priv + *970106 {1.80} Bernd Eckenfels : new syntax without -D and with "dev <If>", +- * ATF_MAGIC, ATF_DONTPUB support. ++ * ATF_MAGIC, ATF_DONTPUB support. + * Typo fix (Debian Bug#5728 Giuliano Procida) + *970803 {1.81} Bernd Eckenfels : removed junk comment line 1 + *970925 {1.82} Bernd Eckenfels : include fix for libc6 +@@ -80,7 +80,7 @@ + #define FEATURE_ARP + #include "lib/net-features.h" + +-char *Release = RELEASE, *Version = "arp 1.88 (2001-04-04)"; ++static char *Release = RELEASE; + + int opt_n = 0; /* do not resolve addresses */ + int opt_N = 0; /* use symbolic names */ +@@ -100,9 +100,10 @@ static int arp_del(char **args) + { + char host[128]; + struct arpreq req; +- struct sockaddr sa; ++ struct sockaddr_storage ss; ++ struct sockaddr *sa; + int flags = 0; +- int err; ++ int deleted = 0; + + memset((char *) &req, 0, sizeof(req)); + +@@ -112,12 +113,13 @@ static int arp_del(char **args) + return (-1); + } + safe_strncpy(host, *args, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { ++ sa = (struct sockaddr *)&ss; ++ if (ap->input(0, host, sa) < 0) { + ap->herror(host); + return (-1); + } + /* If a host has more than one address, use the correct one! */ +- memcpy((char *) &req.arp_pa, (char *) &sa, sizeof(struct sockaddr)); ++ memcpy((char *) &req.arp_pa, (char *) sa, sizeof(struct sockaddr)); + + if (hw_set) + req.arp_ha.sa_family = hw->type; +@@ -148,7 +150,7 @@ static int arp_del(char **args) + continue; + } + if (!strcmp(*args, "dontpub")) { +-#ifdef HAVE_ATF_DONTPUB ++#ifdef ATF_DONTPUB + req.arp_flags |= ATF_DONTPUB; + #else + ENOSUPP("arp", "ATF_DONTPUB"); +@@ -157,7 +159,7 @@ static int arp_del(char **args) + continue; + } + if (!strcmp(*args, "auto")) { +-#ifdef HAVE_ATF_MAGIC ++#ifdef ATF_MAGIC + req.arp_flags |= ATF_MAGIC; + #else + ENOSUPP("arp", "ATF_MAGIC"); +@@ -176,12 +178,12 @@ static int arp_del(char **args) + if (*++args == NULL) + usage(); + if (strcmp(*args, "255.255.255.255") != 0) { +- strcpy(host, *args); +- if (ap->input(0, host, &sa) < 0) { ++ safe_strncpy(host, *args, (sizeof host)); ++ if (ap->input(0, host, sa) < 0) { + ap->herror(host); + return (-1); + } +- memcpy((char *) &req.arp_netmask, (char *) &sa, ++ memcpy((char *) &req.arp_netmask, (char *) sa, + sizeof(struct sockaddr)); + req.arp_flags |= ATF_NETMASK; + } +@@ -190,35 +192,41 @@ static int arp_del(char **args) + } + usage(); + } ++ ++ // if neighter priv nor pub is given, work on both + if (flags == 0) + flags = 3; + +- strcpy(req.arp_dev, device); ++ safe_strncpy(req.arp_dev, device, sizeof(req.arp_dev)); + +- err = -1; ++ /* unfortuatelly the kernel interface does not allow us to ++ delete private entries anlone, so we need this hack ++ to avoid "not found" errors if we try both. */ ++ deleted = 0; + + /* Call the kernel. */ + if (flags & 2) { + if (opt_v) +- fprintf(stderr, "arp: SIOCDARP(nopub)\n"); +- if ((err = ioctl(sockfd, SIOCDARP, &req) < 0)) { +- if (errno == ENXIO) { ++ fprintf(stderr, "arp: SIOCDARP(dontpub)\n"); ++ if (ioctl(sockfd, SIOCDARP, &req) < 0) { ++ if ((errno == ENXIO) || (errno == ENOENT)) { + if (flags & 1) +- goto nopub; ++ goto dontpub; + printf(_("No ARP entry for %s\n"), host); + return (-1); + } +- perror("SIOCDARP(priv)"); ++ perror("SIOCDARP(dontpub)"); + return (-1); +- } ++ } else ++ deleted = 1; + } +- if ((flags & 1) && (err)) { +- nopub: ++ if (!deleted && (flags & 1)) { ++ dontpub: + req.arp_flags |= ATF_PUBL; + if (opt_v) + fprintf(stderr, "arp: SIOCDARP(pub)\n"); + if (ioctl(sockfd, SIOCDARP, &req) < 0) { +- if (errno == ENXIO) { ++ if ((errno == ENXIO) || (errno == ENOENT)) { + printf(_("No ARP entry for %s\n"), host); + return (-1); + } +@@ -235,7 +243,7 @@ static int arp_getdevhw(char *ifname, struct sockaddr *sa, struct hwtype *hw) + struct ifreq ifr; + struct hwtype *xhw; + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) { + fprintf(stderr, _("arp: cant get HW-Address for `%s': %s.\n"), ifname, strerror(errno)); + return (-1); +@@ -260,7 +268,8 @@ static int arp_set(char **args) + { + char host[128]; + struct arpreq req; +- struct sockaddr sa; ++ struct sockaddr_storage ss; ++ struct sockaddr *sa; + int flags; + + memset((char *) &req, 0, sizeof(req)); +@@ -271,12 +280,13 @@ static int arp_set(char **args) + return (-1); + } + safe_strncpy(host, *args++, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { ++ sa = (struct sockaddr *)&ss; ++ if (ap->input(0, host, sa) < 0) { + ap->herror(host); + return (-1); + } + /* If a host has more than one address, use the correct one! */ +- memcpy((char *) &req.arp_pa, (char *) &sa, sizeof(struct sockaddr)); ++ memcpy((char *) &req.arp_pa, (char *) sa, sizeof(struct sockaddr)); + + /* Fetch the hardware address. */ + if (*args == NULL) { +@@ -317,7 +327,7 @@ static int arp_set(char **args) + continue; + } + if (!strcmp(*args, "dontpub")) { +-#ifdef HAVE_ATF_DONTPUB ++#ifdef ATF_DONTPUB + flags |= ATF_DONTPUB; + #else + ENOSUPP("arp", "ATF_DONTPUB"); +@@ -326,7 +336,7 @@ static int arp_set(char **args) + continue; + } + if (!strcmp(*args, "auto")) { +-#ifdef HAVE_ATF_MAGIC ++#ifdef ATF_MAGIC + flags |= ATF_MAGIC; + #else + ENOSUPP("arp", "ATF_MAGIC"); +@@ -345,12 +355,12 @@ static int arp_set(char **args) + if (*++args == NULL) + usage(); + if (strcmp(*args, "255.255.255.255") != 0) { +- strcpy(host, *args); +- if (ap->input(0, host, &sa) < 0) { ++ safe_strncpy(host, *args, (sizeof host)); ++ if (ap->input(0, host, sa) < 0) { + ap->herror(host); + return (-1); + } +- memcpy((char *) &req.arp_netmask, (char *) &sa, ++ memcpy((char *) &req.arp_netmask, (char *) sa, + sizeof(struct sockaddr)); + flags |= ATF_NETMASK; + } +@@ -363,7 +373,7 @@ static int arp_set(char **args) + /* Fill in the remainder of the request. */ + req.arp_flags = flags; + +- strcpy(req.arp_dev, device); ++ safe_strncpy(req.arp_dev, device, sizeof(req.arp_dev)); + + /* Call the kernel. */ + if (opt_v) +@@ -424,7 +434,7 @@ static int arp_file(char *name) + + + /* Print the contents of an ARP request block. */ +-static void arp_disp_2(char *name, int type, int arp_flags, char *hwa, char *mask, char *dev) ++static void arp_disp_2(const char *name, int type, int arp_flags, const char *hwa, const char *mask, const char *dev) + { + static int title = 0; + struct hwtype *xhw; +@@ -445,11 +455,11 @@ static void arp_disp_2(char *name, int type, int arp_flags, char *hwa, char *mas + strcat(flags, "M"); + if (arp_flags & ATF_PUBL) + strcat(flags, "P"); +-#ifdef HAVE_ATF_MAGIC ++#ifdef ATF_MAGIC + if (arp_flags & ATF_MAGIC) + strcat(flags, "A"); + #endif +-#ifdef HAVE_ATF_DONTPUB ++#ifdef ATF_DONTPUB + if (arp_flags & ATF_DONTPUB) + strcat(flags, "!"); + #endif +@@ -463,7 +473,7 @@ static void arp_disp_2(char *name, int type, int arp_flags, char *hwa, char *mas + + if (!(arp_flags & ATF_COM)) { + if (arp_flags & ATF_PUBL) +- printf("%-8.8s%-20.20s", "*", "*"); ++ printf("%-8.8s%-20.20s", "*", _("<from_interface>")); + else + printf("%-8.8s%-20.20s", "", _("(incomplete)")); + } else { +@@ -474,7 +484,7 @@ static void arp_disp_2(char *name, int type, int arp_flags, char *hwa, char *mas + } + + /* Print the contents of an ARP request block. */ +-static void arp_disp(char *name, char *ip, int type, int arp_flags, char *hwa, char *mask, char *dev) ++static void arp_disp(const char *name, const char *ip, int type, int arp_flags, const char *hwa, const char *mask, const char *dev) + { + struct hwtype *xhw; + +@@ -486,7 +496,7 @@ static void arp_disp(char *name, char *ip, int type, int arp_flags, char *hwa, c + + if (!(arp_flags & ATF_COM)) { + if (arp_flags & ATF_PUBL) +- printf("* "); ++ printf("<from_interface> "); + else + printf(_("<incomplete> ")); + } else { +@@ -499,12 +509,12 @@ static void arp_disp(char *name, char *ip, int type, int arp_flags, char *hwa, c + if (arp_flags & ATF_PERM) + printf("PERM "); + if (arp_flags & ATF_PUBL) +- printf("PUP "); +-#ifdef HAVE_ATF_MAGIC ++ printf("PUB "); ++#ifdef ATF_MAGIC + if (arp_flags & ATF_MAGIC) + printf("AUTO "); + #endif +-#ifdef HAVE_ATF_DONTPUB ++#ifdef ATF_DONTPUB + if (arp_flags & ATF_DONTPUB) + printf("DONTPUB "); + #endif +@@ -519,7 +529,8 @@ static void arp_disp(char *name, char *ip, int type, int arp_flags, char *hwa, c + static int arp_show(char *name) + { + char host[100]; +- struct sockaddr sa; ++ struct sockaddr_storage ss; ++ struct sockaddr *sa; + char ip[100]; + char hwa[100]; + char mask[100]; +@@ -527,19 +538,20 @@ static int arp_show(char *name) + char dev[100]; + int type, flags; + FILE *fp; +- char *hostname; ++ const char *hostname; + int num, entries = 0, showed = 0; + + host[0] = '\0'; + ++ sa = (struct sockaddr *)&ss; + if (name != NULL) { + /* Resolve the host name. */ + safe_strncpy(host, name, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { ++ if (ap->input(0, host, sa) < 0) { + ap->herror(host); + return (-1); + } +- safe_strncpy(host, ap->sprint(&sa, 1), sizeof(host)); ++ safe_strncpy(host, ap->sprint(sa, 1), sizeof(host)); + } + /* Open the PROCps kernel table. */ + if ((fp = fopen(_PATH_PROCNET_ARP, "r")) == NULL) { +@@ -548,11 +560,11 @@ static int arp_show(char *name) + } + /* Bypass header -- read until newline */ + if (fgets(line, sizeof(line), fp) != (char *) NULL) { +- strcpy(mask, "-"); +- strcpy(dev, "-"); ++ safe_strncpy(mask, "-", sizeof(mask)); ++ safe_strncpy(dev, "-", sizeof(dev)); + /* Read the ARP cache entries. */ + for (; fgets(line, sizeof(line), fp);) { +- num = sscanf(line, "%s 0x%x 0x%x %100s %100s %100s\n", ++ num = sscanf(line, "%s 0x%x 0x%x %99s %99s %99s\n", + ip, &type, &flags, hwa, mask, dev); + if (num < 4) + break; +@@ -575,10 +587,10 @@ static int arp_show(char *name) + if (opt_n) + hostname = "?"; + else { +- if (ap->input(0, ip, &sa) < 0) ++ if (ap->input(0, ip, sa) < 0) + hostname = ip; + else +- hostname = ap->sprint(&sa, opt_n | 0x8000); ++ hostname = ap->sprint(sa, opt_n | 0x8000); + if (strcmp(hostname, ip) == 0) + hostname = "?"; + } +@@ -605,20 +617,20 @@ static int arp_show(char *name) + + static void version(void) + { +- fprintf(stderr, "%s\n%s\n%s\n", Release, Version, Features); ++ fprintf(stderr, "%s\n%s\n", Release, Features); + exit(E_VERSION); + } + + static void usage(void) + { + fprintf(stderr, _("Usage:\n arp [-vn] [<HW>] [-i <if>] [-a] [<hostname>] <-Display ARP cache\n")); +- fprintf(stderr, _(" arp [-v] [-i <if>] -d <hostname> [pub][nopub] <-Delete ARP entry\n")); +- fprintf(stderr, _(" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from file\n")); +- fprintf(stderr, _(" arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [temp][nopub] <-Add entry\n")); +- fprintf(stderr, _(" arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [netmask <nm>] pub <-''-\n")); +- fprintf(stderr, _(" arp [-v] [<HW>] [-i <if>] -Ds <hostname> <if> [netmask <nm>] pub <-''-\n\n")); +- ++ fprintf(stderr, _(" arp [-v] [-i <if>] -d <host> [pub] <-Delete ARP entry\n")); ++ fprintf(stderr, _(" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from file\n")); ++ fprintf(stderr, _(" arp [-v] [<HW>] [-i <if>] -s <host> <hwaddr> [temp] <-Add entry\n")); ++ fprintf(stderr, _(" arp [-v] [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub <-''-\n\n")); ++ + fprintf(stderr, _(" -a display (all) hosts in alternative (BSD) style\n")); ++ fprintf(stderr, _(" -e display (all) hosts in default (Linux) style\n")); + fprintf(stderr, _(" -s, --set set a new ARP entry\n")); + fprintf(stderr, _(" -d, --delete delete a specified entry\n")); + fprintf(stderr, _(" -v, --verbose be verbose\n")); +diff --git a/config.in b/config.in +index f3310d6..e080937 100644 +--- a/config.in ++++ b/config.in +@@ -1,5 +1,5 @@ + # +-# config.in Configure.sh source for the net-tools. ++# config.in configure.sh source for the net-tools. + # This file contains the definition of what the support + # library contains. Most of all, it defines which types + # of address families and hardware we know of. +@@ -46,19 +46,20 @@ bool 'Does your system support GNU gettext?' I18N n + * + * + * Protocol Families. +-* ++* + bool 'UNIX protocol family' HAVE_AFUNIX y + bool 'INET (TCP/IP) protocol family' HAVE_AFINET y +-bool 'INET6 (IPv6) protocol family' HAVE_AFINET6 n ++bool 'INET6 (IPv6) protocol family' HAVE_AFINET6 y + bool 'Novell IPX/SPX protocol family' HAVE_AFIPX y + bool 'Appletalk DDP protocol family' HAVE_AFATALK y + bool 'AX25 (packet radio) protocol family' HAVE_AFAX25 y + bool 'NET/ROM (packet radio) protocol family' HAVE_AFNETROM y +-bool 'Rose (packet radio) protocol family' HAVE_AFROSE n ++bool 'Rose (packet radio) protocol family' HAVE_AFROSE y + bool 'X.25 (CCITT) protocol family' HAVE_AFX25 y +-bool 'Econet protocol family' HAVE_AFECONET n ++bool 'Econet protocol family' HAVE_AFECONET y + bool 'DECnet protocol family' HAVE_AFDECnet n +-bool 'Ash protocol family' HAVE_AFASH n ++bool 'Ash protocol family' HAVE_AFASH y ++bool 'Bluetooth protocol family' HAVE_AFBLUETOOTH n + * + * + * Device Hardware types. +@@ -68,24 +69,27 @@ bool 'ARCnet support' HAVE_HWARC y + bool 'SLIP (serial line) support' HAVE_HWSLIP y + bool 'PPP (serial line) support' HAVE_HWPPP y + bool 'IPIP Tunnel support' HAVE_HWTUNNEL y +-bool 'STRIP (Metricom radio) support' HAVE_HWSTRIP y +-bool 'Token ring (generic) support' HAVE_HWTR y ++bool 'STRIP (Metricom radio) support' HAVE_HWSTRIP n ++bool 'Token ring (generic) support' HAVE_HWTR n + bool 'AX25 (packet radio) support' HAVE_HWAX25 y +-bool 'Rose (packet radio) support' HAVE_HWROSE n ++bool 'Rose (packet radio) support' HAVE_HWROSE y + bool 'NET/ROM (packet radio) support' HAVE_HWNETROM y + bool 'X.25 (generic) support' HAVE_HWX25 y + bool 'DLCI/FRAD (frame relay) support' HAVE_HWFR y +-bool 'SIT (IPv6-in-IPv4) support' HAVE_HWSIT n +-bool 'FDDI (generic) support' HAVE_HWFDDI n +-bool 'HIPPI (generic) support' HAVE_HWHIPPI n +-bool 'Ash hardware support' HAVE_HWASH n +-bool '(Cisco)-HDLC/LAPB support' HAVE_HWHDLCLAPB n ++bool 'SIT (IPv6-in-IPv4) support' HAVE_HWSIT y ++bool 'FDDI (generic) support' HAVE_HWFDDI y ++bool 'HIPPI (generic) support' HAVE_HWHIPPI y ++bool 'Ash hardware support' HAVE_HWASH y ++bool '(Cisco)-HDLC/LAPB support' HAVE_HWHDLCLAPB y + bool 'IrDA support' HAVE_HWIRDA y +-bool 'Econet hardware support' HAVE_HWEC n ++bool 'Econet hardware support' HAVE_HWEC y ++bool 'Generic EUI-64 hardware support' HAVE_HWEUI64 y ++bool 'InfiniBand hardware support' HAVE_HWIB y + * + * + * Other Features. + * +-bool 'IP Masquerading support' HAVE_FW_MASQUERADE n +-bool 'Build iptunnel and ipmaddr' HAVE_IP_TOOLS n +-bool 'Build mii-tool' HAVE_MII n ++bool 'IP Masquerading support' HAVE_FW_MASQUERADE y ++bool 'Build iptunnel and ipmaddr' HAVE_IP_TOOLS y ++bool 'Build mii-tool' HAVE_MII y ++bool 'SELinux support' HAVE_SELINUX n +diff --git a/configure.sh b/configure.sh +index 9859b59..64b594f 100755 +--- a/configure.sh ++++ b/configure.sh +@@ -1,6 +1,6 @@ + #!/usr/bin/env bash + # +-# Configure.sh Generates interactively a config.h from config.in ++# configure.sh Generates interactively a config.h from config.in + # + # net-tools A collection of programs that form the base set of the + # NET-3 Networking Distribution for the LINUX operating +@@ -37,7 +37,15 @@ CONFIG=config.h + MAKECONFIG=config.make + + +-[ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; } ++[ -z "$BASH" ] && { echo "configure.sh requires bash" 1>&2; exit 1; } ++ ++cat <<EOF ++ ++###################################################### ++Notice: ifconfig and route are now installed into /bin ++###################################################### ++ ++EOF + + # Disable filename globbing once and for all. + # Enable function cacheing. +@@ -106,7 +114,7 @@ function int() + } + + # +- # Make sure we start out with a clean slate. ++ # Make sure we start out with a clean state. + # + > config.new + > ${CONFIG} +diff --git a/hostname.c b/hostname.c +index 8793fb9..ae98ca6 100644 +--- a/hostname.c ++++ b/hostname.c +@@ -6,23 +6,22 @@ + * Usage: hostname [-d|-f|-s|-a|-i|-y|-n] + * hostname [-h|-V] + * hostname {name|-F file} +- * dnsdmoainname ++ * dnsdmoainname + * nisdomainname {name|-F file} + * +- * Version: hostname 1.96 (1996-02-18) ++ * Version: hostname 1.101 (2003-10-11) + * + * Author: Peter Tobias <tobias@et-inf.fho-emden.de> + * + * Changes: +- * {1.90} Peter Tobias : Added -a and -i options. +- * {1.91} Bernd Eckenfels : -v,-V rewritten, long_opts +- * (major rewrite), usage. +- *960120 {1.95} Bernd Eckenfels : -y/nisdomainname - support for get/ +- * setdomainname added +- *960218 {1.96} Bernd Eckenfels : netinet/in.h added +- *980629 {1.97} Arnaldo Carvalho de Melo : gettext instead of catgets for i18n +- *20000213 {1.99} Arnaldo Carvalho de Melo : fixed some i18n strings ++ * {1.90} Peter Tobias : Added -a and -i options. ++ * {1.91} Bernd Eckenfels : -v,-V rewritten, long_opts (major rewrite), usage. ++ *19960120 {1.95} Bernd Eckenfels : -y/nisdomainname - support for get/setdomainname added ++ *19960218 {1.96} Bernd Eckenfels : netinet/in.h added ++ *19980629 {1.97} Arnaldo Carvalho de Melo : gettext instead of catgets for i18n ++ *20000213 {1.99} Arnaldo Carvalho de Melo : fixed some i18n strings + *20010404 {1.100} Arnaldo Carvalho de Melo: use setlocale ++ *20031011 {1.101} Maik Broemme: gcc 3.x fixes (default: break) + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General +@@ -31,7 +30,9 @@ + * your option) any later version. + */ + #include <stdio.h> ++#include <stdlib.h> + #include <unistd.h> ++#include <stdlib.h> + #include <getopt.h> + #include <string.h> + #include <netdb.h> +@@ -41,13 +42,19 @@ + #include <arpa/inet.h> + #include "config.h" + #include "version.h" ++#include "net-support.h" + #include "../intl.h" + ++#if HAVE_AFINET6 ++#include <sys/socket.h> /* for PF_INET6 */ ++#include <sys/types.h> /* for inet_ntop */ ++#endif ++ + #if HAVE_AFDECnet + #include <netdnet/dn.h> + #endif + +-char *Release = RELEASE, *Version = "hostname 1.100 (2001-04-14)"; ++static char *Release = RELEASE; + + static char *program_name; + static int opt_v; +@@ -72,12 +79,13 @@ static void setnname(char *nname) + if (setnodename(nname, strlen(nname))) { + switch(errno) { + case EPERM: +- fprintf(stderr, _("%s: you must be root to change the node name\n"), program_name); ++ fprintf(stderr, _("%s: you don't have permission to set the node name\n"), program_name); + break; + case EINVAL: + fprintf(stderr, _("%s: name too long\n"), program_name); + break; + default: ++ break; + } + exit(1); + } +@@ -92,12 +100,11 @@ static void sethname(char *hname) + if (sethostname(hname, strlen(hname))) { + switch (errno) { + case EPERM: +- fprintf(stderr, _("%s: you must be root to change the host name\n"), program_name); ++ fprintf(stderr, _("%s: you don't have permission to set the host name\n"), program_name); + break; + case EINVAL: + fprintf(stderr, _("%s: name too long\n"), program_name); + break; +- default: + } + exit(1); + }; +@@ -111,12 +118,11 @@ static void setdname(char *dname) + if (setdomainname(dname, strlen(dname))) { + switch (errno) { + case EPERM: +- fprintf(stderr, _("%s: you must be root to change the domain name\n"), program_name); ++ fprintf(stderr, _("%s: you don't have permission to set the domain name\n"), program_name); + break; + case EINVAL: + fprintf(stderr, _("%s: name too long\n"), program_name); + break; +- default: + } + exit(1); + }; +@@ -125,15 +131,23 @@ static void setdname(char *dname) + static void showhname(char *hname, int c) + { + struct hostent *hp; ++#if HAVE_AFINET6 ++ struct in6_addr **ip6; ++#endif + register char *p, **alias; + struct in_addr **ip; + + if (opt_v) + fprintf(stderr, _("Resolving `%s' ...\n"), hname); +- if (!(hp = gethostbyname(hname))) { ++ if ( ++#if HAVE_AFINET6 ++ !(hp = gethostbyname2(hname, PF_INET6)) && ++#endif ++ !(hp = gethostbyname(hname))) { + herror(program_name); + exit(1); + } ++ + if (opt_v) { + fprintf(stderr, _("Result: h_name=`%s'\n"), + hp->h_name); +@@ -142,11 +156,28 @@ static void showhname(char *hname, int c) + while (alias[0]) + fprintf(stderr, _("Result: h_aliases=`%s'\n"), + *alias++); +- +- ip = (struct in_addr **) hp->h_addr_list; +- while (ip[0]) +- fprintf(stderr, _("Result: h_addr_list=`%s'\n"), +- inet_ntoa(**ip++)); ++#if HAVE_AFINET6 ++ if (hp->h_addrtype == PF_INET6) { ++ char addr[INET6_ADDRSTRLEN + 1]; ++ addr[INET6_ADDRSTRLEN] = '\0'; ++ ip6 = (struct in6_addr **) hp->h_addr_list; ++ while (ip6[0]) { ++ if (inet_ntop(PF_INET6, *ip6++, addr, INET6_ADDRSTRLEN)) ++ fprintf(stderr, _("Result: h_addr_list=`%s'\n"), addr); ++ else if (errno == EAFNOSUPPORT) ++ fprintf(stderr, _("%s: protocol family not supported\n"), ++ program_name); ++ else if (errno == ENOSPC) ++ fprintf(stderr, _("%s: name too long\n"), program_name); ++ } ++ } else ++#endif ++ { ++ ip = (struct in_addr **) hp->h_addr_list; ++ while (ip[0]) ++ fprintf(stderr, _("Result: h_addr_list=`%s'\n"), ++ inet_ntoa(**ip++)); ++ } + } + if (!(p = strchr(hp->h_name, '.')) && (c == 'd')) + return; +@@ -158,8 +189,29 @@ static void showhname(char *hname, int c) + printf("\n"); + break; + case 'i': +- while (hp->h_addr_list[0]) +- printf("%s ", inet_ntoa(*(struct in_addr *) *hp->h_addr_list++)); ++#if HAVE_AFINET6 ++ if (hp->h_addrtype == PF_INET6) { ++ char addr[INET6_ADDRSTRLEN + 1]; ++ addr[INET6_ADDRSTRLEN] = '\0'; ++ while (hp->h_addr_list[0]) { ++ if (inet_ntop(PF_INET6, (struct in6_addr *)*hp->h_addr_list++, ++ addr, INET6_ADDRSTRLEN)) { ++ printf("%s ", addr); ++ } else if (errno == EAFNOSUPPORT) { ++ fprintf(stderr, _("\n%s: protocol family not supported\n"), ++ program_name); ++ exit(1); ++ } else if (errno == ENOSPC) { ++ fprintf(stderr, _("\n%s: name too long\n"), program_name); ++ exit(1); ++ } ++ } ++ } else ++#endif ++ { ++ while (hp->h_addr_list[0]) ++ printf("%s ", inet_ntoa(*(struct in_addr *)*hp->h_addr_list++)); ++ } + printf("\n"); + break; + case 'd': +@@ -173,7 +225,6 @@ static void showhname(char *hname, int c) + *p = '\0'; + printf("%s\n", hp->h_name); + break; +- default: + } + } + +@@ -215,8 +266,8 @@ static void setfilename(char *name, int what) + + static void version(void) + { +- fprintf(stderr, "%s\n%s\n", Release, Version); +- exit(5); /* E_VERSION */ ++ fprintf(stderr, "%s\n", Release); ++ exit(E_VERSION); + } + + static void usage(void) +@@ -247,7 +298,7 @@ static void usage(void) + " FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n" + " part of the FQDN) in the /etc/hosts file.\n")); + +- exit(4); /* E_USAGE */ ++ exit(E_USAGE); + } + + +@@ -326,11 +377,12 @@ int main(int argc, char **argv) + break; + case 'V': + version(); ++ break; // not reached + case '?': + case 'h': + default: + usage(); +- ++ break; // not reached + }; + + +@@ -371,7 +423,10 @@ int main(int argc, char **argv) + setdname(argv[optind]); + break; + } +- getdomainname(myname, sizeof(myname)); ++ if (getdomainname(myname, sizeof(myname)) < 0) { ++ perror("getdomainname()"); ++ exit(1); ++ } + if (opt_v) + fprintf(stderr, _("getdomainname()=`%s'\n"), myname); + printf("%s\n", myname); +diff --git a/ifconfig.c b/ifconfig.c +index 73a4e9b..df9793a 100644 +--- a/ifconfig.c ++++ b/ifconfig.c +@@ -3,7 +3,7 @@ + * that either displays or sets the characteristics of + * one or more of the system's networking interfaces. + * +- * Version: $Id: ifconfig.c,v 1.50 2001/04/13 18:25:18 pb Exp $ ++ * Version: $Id: ifconfig.c,v 1.59 2011-01-01 03:22:31 ecki Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * and others. Copyright 1993 MicroWalt Corporation +@@ -19,8 +19,8 @@ + * + * {1.34} - 19980630 - Arnaldo Carvalho de Melo <acme@conectiva.com.br> + * - gettext instead of catgets for i18n +- * 10/1998 - Andi Kleen. Use interface list primitives. +- * 20001008 - Bernd Eckenfels, Patch from RH for setting mtu ++ * 10/1998 - Andi Kleen. Use interface list primitives. ++ * 20001008 - Bernd Eckenfels, Patch from RH for setting mtu + * (default AF was wrong) + * 20010404 - Arnaldo Carvalho de Melo, use setlocale + */ +@@ -49,7 +49,7 @@ + #include <asm/types.h> + + +-#ifdef HAVE_HWSLIP ++#if HAVE_HWSLIP + #include <linux/if_slip.h> + #endif + +@@ -85,19 +85,16 @@ struct in6_ifreq { + #include "sockets.h" + #include "util.h" + +-char *Release = RELEASE, *Version = "ifconfig 1.42 (2001-04-13)"; ++static char *Release = RELEASE; + + int opt_a = 0; /* show all interfaces */ +-int opt_i = 0; /* show the statistics */ + int opt_v = 0; /* debugging output flag */ + + int addr_family = 0; /* currently selected AF */ + + /* for ipv4 add/del modes */ +-static int get_nmbc_parent(char *parent, unsigned long *nm, +- unsigned long *bc); +-static int set_ifstate(char *parent, unsigned long ip, +- unsigned long nm, unsigned long bc, ++static int get_nmbc_parent(char *parent, in_addr_t *nm, in_addr_t *bc); ++static int set_ifstate(char *parent, in_addr_t ip, in_addr_t nm, in_addr_t bc, + int flag); + + static int if_print(char *ifname) +@@ -105,7 +102,7 @@ static int if_print(char *ifname) + int res; + + if (ife_short) +- printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); ++ printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); + + if (!ifname) { + res = for_all_interfaces(do_if_print, &opt_a); +@@ -113,11 +110,14 @@ static int if_print(char *ifname) + struct interface *ife; + + ife = lookup_interface(ifname); +- res = do_if_fetch(ife); +- if (res >= 0) ++ if (!ife) { ++ return -1; ++ } ++ res = do_if_fetch(ife); ++ if (res >= 0) + ife_print(ife); + } +- return res; ++ return res; + } + + /* Set a certain interface flag. */ +@@ -127,7 +127,7 @@ static int set_flag(char *ifname, short flag) + + safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) { +- fprintf(stderr, _("%s: unknown interface: %s\n"), ++ fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"), + ifname, strerror(errno)); + return (-1); + } +@@ -159,7 +159,7 @@ static int clr_flag(char *ifname, short flag) + + safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { +- fprintf(stderr, _("%s: unknown interface: %s\n"), ++ fprintf(stderr, _("%s: ERROR while getting interface flags: %s\n"), + ifname, strerror(errno)); + return -1; + } +@@ -172,9 +172,35 @@ static int clr_flag(char *ifname, short flag) + return (0); + } + ++/** test is a specified flag is set */ ++static int test_flag(char *ifname, short flags) ++{ ++ struct ifreq ifr; ++ int fd; ++ ++ if (strchr(ifname, ':')) { ++ /* This is a v4 alias interface. Downing it via a socket for ++ another AF may have bad consequences. */ ++ fd = get_socket_for_af(AF_INET); ++ if (fd < 0) { ++ fprintf(stderr, _("No support for INET on this system.\n")); ++ return -1; ++ } ++ } else ++ fd = skfd; ++ ++ safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ++ if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { ++ fprintf(stderr, _("%s: ERROR while testing interface flags: %s\n"), ++ ifname, strerror(errno)); ++ return -1; ++ } ++ return (ifr.ifr_flags & flags); ++} ++ + static void usage(void) + { +- fprintf(stderr, _("Usage:\n ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n")); ++ fprintf(stderr, _("Usage:\n ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]\n")); + #if HAVE_AFINET + fprintf(stderr, _(" [add <address>[/<prefixlen>]]\n")); + fprintf(stderr, _(" [del <address>[/<prefixlen>]]\n")); +@@ -184,7 +210,7 @@ static void usage(void) + #ifdef SIOCSKEEPALIVE + fprintf(stderr, _(" [outfill <NN>] [keepalive <NN>]\n")); + #endif +- fprintf(stderr, _(" [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n")); ++ fprintf(stderr, _(" [hw <HW> <address>] [mtu <NN>]\n")); + fprintf(stderr, _(" [[-]trailers] [[-]arp] [[-]allmulti]\n")); + fprintf(stderr, _(" [multicast] [[-]promisc]\n")); + fprintf(stderr, _(" [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n")); +@@ -207,38 +233,39 @@ static void usage(void) + + static void version(void) + { +- fprintf(stderr, "%s\n%s\n", Release, Version); +- exit(0); ++ fprintf(stderr, "%s\n", Release); ++ exit(E_VERSION); + } + + static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa) + { + int err = 0; + +- memcpy((char *) &ifr->ifr_netmask, (char *) sa, +- sizeof(struct sockaddr)); ++ memcpy(&ifr->ifr_netmask, sa, sizeof(struct sockaddr)); + if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) { + fprintf(stderr, "SIOCSIFNETMASK: %s\n", + strerror(errno)); + err = 1; + } +- return 0; ++ return err; + } + + int main(int argc, char **argv) + { +- struct sockaddr sa; +- struct sockaddr_in sin; ++ struct sockaddr_storage _sa, _samask; ++ struct sockaddr *sa = (struct sockaddr *)&_sa; ++ struct sockaddr *samask = (struct sockaddr *)&_samask; ++ struct sockaddr_in *sin = (struct sockaddr_in *)sa; + char host[128]; + struct aftype *ap; + struct hwtype *hw; + struct ifreq ifr; +- int goterr = 0, didnetmask = 0; ++ int goterr = 0, didnetmask = 0, neednetmask=0; + char **spp; + int fd; + #if HAVE_AFINET6 + extern struct aftype inet6_aftype; +- struct sockaddr_in6 sa6; ++ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + struct in6_ifreq ifr6; + unsigned long prefix_len; + char *cp; +@@ -248,7 +275,7 @@ int main(int argc, char **argv) + #endif + + #if I18N +- setlocale (LC_ALL, ""); ++ setlocale(LC_ALL, ""); + bindtextdomain("net-tools", "/usr/share/locale"); + textdomain("net-tools"); + #endif +@@ -265,7 +292,7 @@ int main(int argc, char **argv) + + else if (!strcmp(*argv, "-v")) + opt_v = 1; +- ++ + else if (!strcmp(*argv, "-V") || !strcmp(*argv, "-version") || + !strcmp(*argv, "--version")) + version(); +@@ -275,7 +302,7 @@ int main(int argc, char **argv) + usage(); + + else { +- fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"), ++ fprintf(stderr, _("ifconfig: option `%s' not recognised.\n"), + argv[0]); + fprintf(stderr, _("ifconfig: `--help' gives usage information.\n")); + exit(1); +@@ -309,9 +336,9 @@ int main(int argc, char **argv) + /* The next argument is either an address family name, or an option. */ + if ((ap = get_aftype(*spp)) != NULL) + spp++; /* it was a AF name */ +- else ++ else + ap = get_aftype(DFLT_AF); +- ++ + if (ap) { + addr_family = ap->af; + skfd = ap->fd; +@@ -356,7 +383,7 @@ int main(int argc, char **argv) + goterr = 1; + } else { + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { +- perror("port: SIOCGIFMAP"); ++ perror("port: SIOCGIFMAP"); + goterr = 1; + continue; + } +@@ -388,6 +415,8 @@ int main(int argc, char **argv) + } + if (!strcmp(*spp, "-promisc")) { + goterr |= clr_flag(ifr.ifr_name, IFF_PROMISC); ++ if (test_flag(ifr.ifr_name, IFF_PROMISC) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in promisc mode... maybe other application is running?\n"), ifr.ifr_name); + spp++; + continue; + } +@@ -398,6 +427,8 @@ int main(int argc, char **argv) + } + if (!strcmp(*spp, "-multicast")) { + goterr |= clr_flag(ifr.ifr_name, IFF_MULTICAST); ++ if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in MULTICAST mode.\n"), ifr.ifr_name); + spp++; + continue; + } +@@ -408,6 +439,8 @@ int main(int argc, char **argv) + } + if (!strcmp(*spp, "-allmulti")) { + goterr |= clr_flag(ifr.ifr_name, IFF_ALLMULTI); ++ if (test_flag(ifr.ifr_name, IFF_ALLMULTI) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in ALLMULTI mode.\n"), ifr.ifr_name); + spp++; + continue; + } +@@ -430,21 +463,12 @@ int main(int argc, char **argv) + if (!strcmp(*spp, "-dynamic")) { + goterr |= clr_flag(ifr.ifr_name, IFF_DYNAMIC); + spp++; ++ if (test_flag(ifr.ifr_name, IFF_DYNAMIC) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in DYNAMIC mode.\n"), ifr.ifr_name); + continue; + } + #endif + +- if (!strcmp(*spp, "metric")) { +- if (*++spp == NULL) +- usage(); +- ifr.ifr_metric = atoi(*spp); +- if (ioctl(skfd, SIOCSIFMETRIC, &ifr) < 0) { +- fprintf(stderr, "SIOCSIFMETRIC: %s\n", strerror(errno)); +- goterr = 1; +- } +- spp++; +- continue; +- } + if (!strcmp(*spp, "mtu")) { + if (*++spp == NULL) + usage(); +@@ -460,7 +484,7 @@ int main(int argc, char **argv) + if (!strcmp(*spp, "keepalive")) { + if (*++spp == NULL) + usage(); +- ifr.ifr_data = (caddr_t) atoi(*spp); ++ ifr.ifr_data = (caddr_t) (uintptr_t) atoi(*spp); + if (ioctl(skfd, SIOCSKEEPALIVE, &ifr) < 0) { + fprintf(stderr, "SIOCSKEEPALIVE: %s\n", strerror(errno)); + goterr = 1; +@@ -474,7 +498,7 @@ int main(int argc, char **argv) + if (!strcmp(*spp, "outfill")) { + if (*++spp == NULL) + usage(); +- ifr.ifr_data = (caddr_t) atoi(*spp); ++ ifr.ifr_data = (caddr_t) (uintptr_t) atoi(*spp); + if (ioctl(skfd, SIOCSOUTFILL, &ifr) < 0) { + fprintf(stderr, "SIOCSOUTFILL: %s\n", strerror(errno)); + goterr = 1; +@@ -486,20 +510,24 @@ int main(int argc, char **argv) + + if (!strcmp(*spp, "-broadcast")) { + goterr |= clr_flag(ifr.ifr_name, IFF_BROADCAST); ++ if (test_flag(ifr.ifr_name, IFF_BROADCAST) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in BROADCAST mode.\n"), ifr.ifr_name); + spp++; + continue; + } + if (!strcmp(*spp, "broadcast")) { + if (*++spp != NULL) { + safe_strncpy(host, *spp, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { +- ap->herror(host); ++ if (ap->input(0, host, sa) < 0) { ++ if (ap->herror) ++ ap->herror(host); ++ else ++ fprintf(stderr, _("ifconfig: Error resolving '%s' for broadcast\n"), host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr.ifr_broadaddr, (char *) &sa, +- sizeof(struct sockaddr)); ++ memcpy(&ifr.ifr_broadaddr, sa, sizeof(struct sockaddr)); + if (ioctl(ap->fd, SIOCSIFBRDADDR, &ifr) < 0) { + fprintf(stderr, "SIOCSIFBRDADDR: %s\n", + strerror(errno)); +@@ -514,14 +542,16 @@ int main(int argc, char **argv) + if (*++spp == NULL) + usage(); + safe_strncpy(host, *spp, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { +- ap->herror(host); ++ if (ap->input(0, host, sa) < 0) { ++ if (ap->herror) ++ ap->herror(host); ++ else ++ fprintf(stderr, _("ifconfig: Error resolving '%s' for dstaddr\n"), host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr.ifr_dstaddr, (char *) &sa, +- sizeof(struct sockaddr)); ++ memcpy(&ifr.ifr_dstaddr, sa, sizeof(struct sockaddr)); + if (ioctl(ap->fd, SIOCSIFDSTADDR, &ifr) < 0) { + fprintf(stderr, "SIOCSIFDSTADDR: %s\n", + strerror(errno)); +@@ -534,14 +564,17 @@ int main(int argc, char **argv) + if (*++spp == NULL || didnetmask) + usage(); + safe_strncpy(host, *spp, (sizeof host)); +- if (ap->input(0, host, &sa) < 0) { +- ap->herror(host); ++ if (ap->input(0, host, sa) < 0) { ++ if (ap->herror) ++ ap->herror(host); ++ else ++ fprintf(stderr, _("ifconfig: Error resolving '%s' for netmask\n"), host); + goterr = 1; + spp++; + continue; + } + didnetmask++; +- goterr = set_netmask(ap->fd, &ifr, &sa); ++ goterr |= set_netmask(ap->fd, &ifr, sa); + spp++; + continue; + } +@@ -563,8 +596,8 @@ int main(int argc, char **argv) + if (*++spp == NULL) + usage(); + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { +- fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno)); +- spp++; ++ fprintf(stderr, "mem_start: SIOCGIFMAP: %s\n", strerror(errno)); ++ spp++; + goterr = 1; + continue; + } +@@ -580,8 +613,8 @@ int main(int argc, char **argv) + if (*++spp == NULL) + usage(); + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { +- fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno)); +- spp++; ++ fprintf(stderr, "io_addr: SIOCGIFMAP: %s\n", strerror(errno)); ++ spp++; + goterr = 1; + continue; + } +@@ -597,9 +630,9 @@ int main(int argc, char **argv) + if (*++spp == NULL) + usage(); + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { +- fprintf(stderr, "irq: SIOCGIFMAP: %s\n", strerror(errno)); ++ fprintf(stderr, "irq: SIOCGIFMAP: %s\n", strerror(errno)); + goterr = 1; +- spp++; ++ spp++; + continue; + } + ifr.ifr_map.irq = atoi(*spp); +@@ -613,20 +646,24 @@ int main(int argc, char **argv) + if (!strcmp(*spp, "-pointopoint")) { + goterr |= clr_flag(ifr.ifr_name, IFF_POINTOPOINT); + spp++; ++ if (test_flag(ifr.ifr_name, IFF_POINTOPOINT) > 0) ++ fprintf(stderr, _("Warning: Interface %s still in POINTOPOINT mode.\n"), ifr.ifr_name); + continue; + } + if (!strcmp(*spp, "pointopoint")) { + if (*(spp + 1) != NULL) { + spp++; + safe_strncpy(host, *spp, (sizeof host)); +- if (ap->input(0, host, &sa)) { +- ap->herror(host); ++ if (ap->input(0, host, sa)) { ++ if (ap->herror) ++ ap->herror(host); ++ else ++ fprintf(stderr, _("ifconfig: Error resolving '%s' for pointopoint\n"), host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr.ifr_dstaddr, (char *) &sa, +- sizeof(struct sockaddr)); ++ memcpy(&ifr.ifr_dstaddr, sa, sizeof(struct sockaddr)); + if (ioctl(ap->fd, SIOCSIFDSTADDR, &ifr) < 0) { + fprintf(stderr, "SIOCSIFDSTADDR: %s\n", + strerror(errno)); +@@ -652,17 +689,20 @@ int main(int argc, char **argv) + if (*++spp == NULL) + usage(); + safe_strncpy(host, *spp, (sizeof host)); +- if (hw->input(host, &sa) < 0) { ++ if (hw->input(host, sa) < 0) { + fprintf(stderr, _("%s: invalid %s address.\n"), host, hw->name); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr.ifr_hwaddr, (char *) &sa, +- sizeof(struct sockaddr)); ++ memcpy(&ifr.ifr_hwaddr, sa, sizeof(struct sockaddr)); + if (ioctl(skfd, SIOCSIFHWADDR, &ifr) < 0) { +- fprintf(stderr, "SIOCSIFHWADDR: %s\n", +- strerror(errno)); ++ if (errno == EBUSY) ++ fprintf(stderr, "SIOCSIFHWADDR: %s - you may need to down the interface\n", ++ strerror(errno)); ++ else ++ fprintf(stderr, "SIOCSIFHWADDR: %s\n", ++ strerror(errno)); + goterr = 1; + } + spp++; +@@ -681,22 +721,23 @@ int main(int argc, char **argv) + usage(); + *cp = 0; + } else { +- prefix_len = 0; ++ prefix_len = 128; + } + safe_strncpy(host, *spp, (sizeof host)); +- if (inet6_aftype.input(1, host, +- (struct sockaddr *) &sa6) < 0) { +- inet6_aftype.herror(host); ++ if (inet6_aftype.input(1, host, sa) < 0) { ++ if (inet6_aftype.herror) ++ inet6_aftype.herror(host); ++ else ++ fprintf(stderr, _("ifconfig: Error resolving '%s' for add\n"), host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr, +- sizeof(struct in6_addr)); ++ memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr, sizeof(struct in6_addr)); + + fd = get_socket_for_af(AF_INET6); + if (fd < 0) { +- fprintf(stderr, ++ fprintf(stderr, + _("No support for INET6 on this system.\n")); + goterr = 1; + spp++; +@@ -718,11 +759,11 @@ int main(int argc, char **argv) + continue; + } + #endif +-#ifdef HAVE_AFINET ++#if HAVE_AFINET + { /* ipv4 address a.b.c.d */ +- unsigned long ip, nm, bc; ++ in_addr_t ip, nm, bc; + safe_strncpy(host, *spp, (sizeof host)); +- if (inet_aftype.input(0, host, (struct sockaddr *)&sin) < 0) { ++ if (inet_aftype.input(0, host, sa) < 0) { + ap->herror(host); + goterr = 1; + spp++; +@@ -730,15 +771,15 @@ int main(int argc, char **argv) + } + fd = get_socket_for_af(AF_INET); + if (fd < 0) { +- fprintf(stderr, ++ fprintf(stderr, + _("No support for INET on this system.\n")); + goterr = 1; + spp++; + continue; + } + +- memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long)); +- ++ memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip)); ++ + if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) { + fprintf(stderr, _("Interface %s not initialized\n"), + ifr.ifr_name); +@@ -747,7 +788,7 @@ int main(int argc, char **argv) + continue; + } + set_ifstate(ifr.ifr_name, ip, nm, bc, 1); +- ++ + } + spp++; + continue; +@@ -771,22 +812,21 @@ int main(int argc, char **argv) + usage(); + *cp = 0; + } else { +- prefix_len = 0; ++ prefix_len = 128; + } + safe_strncpy(host, *spp, (sizeof host)); +- if (inet6_aftype.input(1, host, +- (struct sockaddr *) &sa6) < 0) { ++ if (inet6_aftype.input(1, host, sa) < 0) { + inet6_aftype.herror(host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr, ++ memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr, + sizeof(struct in6_addr)); +- ++ + fd = get_socket_for_af(AF_INET6); + if (fd < 0) { +- fprintf(stderr, ++ fprintf(stderr, + _("No support for INET6 on this system.\n")); + goterr = 1; + spp++; +@@ -800,6 +840,8 @@ int main(int argc, char **argv) + } + ifr6.ifr6_ifindex = ifr.ifr_ifindex; + ifr6.ifr6_prefixlen = prefix_len; ++ if (opt_v) ++ fprintf(stderr, "now deleting: ioctl(SIOCDIFADDR,{ifindex=%d,prefixlen=%ld})\n",ifr.ifr_ifindex,prefix_len); + if (ioctl(fd, SIOCDIFADDR, &ifr6) < 0) { + fprintf(stderr, "SIOCDIFADDR: %s\n", + strerror(errno)); +@@ -809,12 +851,12 @@ int main(int argc, char **argv) + continue; + } + #endif +-#ifdef HAVE_AFINET ++#if HAVE_AFINET + { + /* ipv4 address a.b.c.d */ +- unsigned long ip, nm, bc; ++ in_addr_t ip, nm, bc; + safe_strncpy(host, *spp, (sizeof host)); +- if (inet_aftype.input(0, host, (struct sockaddr *)&sin) < 0) { ++ if (inet_aftype.input(0, host, sa) < 0) { + ap->herror(host); + goterr = 1; + spp++; +@@ -827,9 +869,11 @@ int main(int argc, char **argv) + spp++; + continue; + } +- +- memcpy(&ip, &sin.sin_addr.s_addr, sizeof(unsigned long)); +- ++ ++ /* Clear "ip" in case sizeof(unsigned long) > sizeof(sin.sin_addr.s_addr) */ ++ ip = 0; ++ memcpy(&ip, &sin->sin_addr.s_addr, sizeof(ip)); ++ + if (get_nmbc_parent(ifr.ifr_name, &nm, &bc) < 0) { + fprintf(stderr, _("Interface %s not initialized\n"), + ifr.ifr_name); +@@ -859,17 +903,16 @@ int main(int argc, char **argv) + usage(); + *cp = 0; + } else { +- prefix_len = 0; ++ prefix_len = 128; + } + safe_strncpy(host, *spp, (sizeof host)); +- if (inet6_aftype.input(1, host, (struct sockaddr *) &sa6) < 0) { ++ if (inet6_aftype.input(1, host, sa) < 0) { + inet6_aftype.herror(host); + goterr = 1; + spp++; + continue; + } +- memcpy((char *) &ifr6.ifr6_addr, (char *) &sa6.sin6_addr, +- sizeof(struct in6_addr)); ++ memcpy(&ifr6.ifr6_addr, &sin6->sin6_addr, sizeof(struct in6_addr)); + + fd = get_socket_for_af(AF_INET6); + if (fd < 0) { +@@ -900,10 +943,10 @@ int main(int argc, char **argv) + /* If the next argument is a valid hostname, assume OK. */ + safe_strncpy(host, *spp, (sizeof host)); + +- /* FIXME: sa is too small for INET6 addresses, inet6 should use that too, ++ /* FIXME: sa is too small for INET6 addresses, inet6 should use that too, + broadcast is unexpected */ + if (ap->getmask) { +- switch (ap->getmask(host, &sa, NULL)) { ++ switch (ap->getmask(host, samask, NULL)) { + case -1: + usage(); + break; +@@ -911,8 +954,8 @@ int main(int argc, char **argv) + if (didnetmask) + usage(); + +- goterr = set_netmask(skfd, &ifr, &sa); +- didnetmask++; ++ // remeber to set the netmask from samask later ++ neednetmask = 1; + break; + } + } +@@ -920,12 +963,14 @@ int main(int argc, char **argv) + fprintf(stderr, _("ifconfig: Cannot set address for this protocol family.\n")); + exit(1); + } +- if (ap->input(0, host, &sa) < 0) { +- ap->herror(host); +- fprintf(stderr, _("ifconfig: `--help' gives usage information.\n")); +- exit(1); ++ if (ap->input(0, host, sa) < 0) { ++ if (ap->herror) ++ ap->herror(host); ++ else ++ fprintf(stderr,_("ifconfig: error resolving '%s' to set address for af=%s\n"), host, ap->name); fprintf(stderr, ++ _("ifconfig: `--help' gives usage information.\n")); exit(1); + } +- memcpy((char *) &ifr.ifr_addr, (char *) &sa, sizeof(struct sockaddr)); ++ memcpy(&ifr.ifr_addr, sa, sizeof(struct sockaddr)); + { + int r = 0; /* to shut gcc up */ + switch (ap->af) { +@@ -965,14 +1010,14 @@ int main(int argc, char **argv) + * end, since it's deleted already! - Roman + * + * Should really use regex.h here, not sure though how well it'll go +- * with the cross-platform support etc. ++ * with the cross-platform support etc. + */ + { + char *ptr; + short int found_colon = 0; + for (ptr = ifr.ifr_name; *ptr; ptr++ ) + if (*ptr == ':') found_colon++; +- ++ + if (!(found_colon && *(ptr - 1) == '-')) + goterr |= set_flag(ifr.ifr_name, (IFF_UP | IFF_RUNNING)); + } +@@ -980,6 +1025,14 @@ int main(int argc, char **argv) + spp++; + } + ++ if (neednetmask) { ++ goterr |= set_netmask(skfd, &ifr, samask); ++ didnetmask++; ++ } ++ ++ if (opt_v && goterr) ++ fprintf(stderr, _("WARNING: at least one error occured. (%d)\n"), goterr); ++ + return (goterr); + } + +@@ -1012,7 +1065,7 @@ static int do_ifcmd(struct interface *x, struct ifcmd *ptr) + char *z, *e; + struct sockaddr_in *sin; + int i; +- ++ + if (do_if_fetch(x) < 0) + return 0; + if (strncmp(x->name, ptr->base, ptr->baselen) != 0) +@@ -1028,13 +1081,13 @@ static int do_ifcmd(struct interface *x, struct ifcmd *ptr) + if (i < 0 || i > 255) + abort(); + searcher[i] = 1; +- ++ + /* copy */ + sin = (struct sockaddr_in *)&x->dstaddr; + if (sin->sin_addr.s_addr != ptr->addr) { + return 0; + } +- ++ + if (ptr->flag) { + /* turn UP */ + if (set_flag(x->name, IFF_UP | IFF_RUNNING) == -1) +@@ -1044,49 +1097,48 @@ static int do_ifcmd(struct interface *x, struct ifcmd *ptr) + if (clr_flag(x->name, IFF_UP) == -1) + return -1; + } +- ++ + return 1; /* all done! */ + } + + + static int get_nmbc_parent(char *parent, +- unsigned long *nm, unsigned long *bc) ++ in_addr_t *nm, in_addr_t *bc) + { + struct interface *i; + struct sockaddr_in *sin; +- ++ + i = lookup_interface(parent); + if (!i) + return -1; + if (do_if_fetch(i) < 0) + return 0; + sin = (struct sockaddr_in *)&i->netmask; +- memcpy(nm, &sin->sin_addr.s_addr, sizeof(unsigned long)); ++ memcpy(nm, &sin->sin_addr.s_addr, sizeof(*nm)); + sin = (struct sockaddr_in *)&i->broadaddr; +- memcpy(bc, &sin->sin_addr.s_addr, sizeof(unsigned long)); ++ memcpy(bc, &sin->sin_addr.s_addr, sizeof(*bc)); + return 0; + } + +-static int set_ifstate(char *parent, unsigned long ip, +- unsigned long nm, unsigned long bc, ++static int set_ifstate(char *parent, in_addr_t ip, in_addr_t nm, in_addr_t bc, + int flag) + { + char buf[IFNAMSIZ]; + struct ifcmd pt; + int i; +- ++ + pt.base = parent; + pt.baselen = strlen(parent); + pt.addr = ip; + pt.flag = flag; + memset(searcher, 0, sizeof(searcher)); +- i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd, ++ i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd, + &pt); + if (i == -1) + return -1; + if (i == 1) + return 0; +- ++ + /* add a new interface */ + for (i = 0; i < 256; i++) + if (searcher[i] == 0) +@@ -1094,7 +1146,7 @@ static int set_ifstate(char *parent, unsigned long ip, + + if (i == 256) + return -1; /* FAILURE!!! out of ip addresses */ +- ++ + if (snprintf(buf, IFNAMSIZ, "%s:%d", parent, i) > IFNAMSIZ) + return -1; + if (set_ip_using(buf, SIOCSIFADDR, ip) == -1) +diff --git a/include/interface.h b/include/interface.h +index f95555c..1b58599 100644 +--- a/include/interface.h ++++ b/include/interface.h +@@ -28,11 +28,10 @@ struct user_net_device_stats { + }; + + struct interface { +- struct interface *next, *prev; ++ struct interface *next, *prev; + char name[IFNAMSIZ]; /* interface name */ + short type; /* if type */ + short flags; /* various flags */ +- int metric; /* routing metric */ + int mtu; /* MTU value */ + int tx_queue_len; /* transmit queue length */ + struct ifmap map; /* hardware setup */ +@@ -64,13 +63,17 @@ struct interface { + extern int if_fetch(struct interface *ife); + + extern int for_all_interfaces(int (*)(struct interface *, void *), void *); +-extern int free_interface_list(void); ++extern int if_cache_free(void); + extern struct interface *lookup_interface(char *name); + extern int if_readlist(void); + + extern int do_if_fetch(struct interface *ife); + extern int do_if_print(struct interface *ife, void *cookie); + ++extern int procnetdev_version(char *buf); ++extern int get_dev_fields(char *bp, struct interface *ife); ++extern char * get_name(char *name, char *p); ++ + extern void ife_print(struct interface *ptr); + + extern int ife_short; +@@ -84,7 +87,7 @@ extern const char *if_port_text[][4]; + #endif + + #if !defined(ifr_qlen) +-/* Actually it is ifru_ivalue, but that is not present in 2.0 kernel headers */ ++/* Actually it is ifru_ivalue, but that is not present in 2.0 kernel headers */ + #define ifr_qlen ifr_ifru.ifru_mtu + #endif + +diff --git a/include/mii.h b/include/mii.h +deleted file mode 100644 +index 1ef7ccc..0000000 +--- a/include/mii.h ++++ /dev/null +@@ -1,86 +0,0 @@ +-/* +- * mii.h 1.4 2000/04/25 22:06:15 +- * +- * Media Independent Interface support: register layout and ioctl's +- * +- * Copyright (C) 2000 David A. Hinds -- dhinds@pcmcia.sourceforge.org +- */ +- +-#ifndef _LINUX_MII_H +-#define _LINUX_MII_H +- +-/* network interface ioctl's for MII commands */ +-#ifndef SIOCGMIIPHY +-#define SIOCGMIIPHY (SIOCDEVPRIVATE) /* Read from current PHY */ +-#define SIOCGMIIREG (SIOCDEVPRIVATE+1) /* Read any PHY register */ +-#define SIOCSMIIREG (SIOCDEVPRIVATE+2) /* Write any PHY register */ +-#define SIOCGPARAMS (SIOCDEVPRIVATE+3) /* Read operational parameters */ +-#define SIOCSPARAMS (SIOCDEVPRIVATE+4) /* Set operational parameters */ +-#endif +- +-#include <linux/types.h> +- +-/* This data structure is used for all the MII ioctl's */ +-struct mii_data { +- __u16 phy_id; +- __u16 reg_num; +- __u16 val_in; +- __u16 val_out; +-}; +- +-/* Basic Mode Control Register */ +-#define MII_BMCR 0x00 +-#define MII_BMCR_RESET 0x8000 +-#define MII_BMCR_LOOPBACK 0x4000 +-#define MII_BMCR_100MBIT 0x2000 +-#define MII_BMCR_AN_ENA 0x1000 +-#define MII_BMCR_ISOLATE 0x0400 +-#define MII_BMCR_RESTART 0x0200 +-#define MII_BMCR_DUPLEX 0x0100 +-#define MII_BMCR_COLTEST 0x0080 +- +-/* Basic Mode Status Register */ +-#define MII_BMSR 0x01 +-#define MII_BMSR_CAP_MASK 0xf800 +-#define MII_BMSR_100BASET4 0x8000 +-#define MII_BMSR_100BASETX_FD 0x4000 +-#define MII_BMSR_100BASETX_HD 0x2000 +-#define MII_BMSR_10BASET_FD 0x1000 +-#define MII_BMSR_10BASET_HD 0x0800 +-#define MII_BMSR_NO_PREAMBLE 0x0040 +-#define MII_BMSR_AN_COMPLETE 0x0020 +-#define MII_BMSR_REMOTE_FAULT 0x0010 +-#define MII_BMSR_AN_ABLE 0x0008 +-#define MII_BMSR_LINK_VALID 0x0004 +-#define MII_BMSR_JABBER 0x0002 +-#define MII_BMSR_EXT_CAP 0x0001 +- +-#define MII_PHY_ID1 0x02 +-#define MII_PHY_ID2 0x03 +- +-/* Auto-Negotiation Advertisement Register */ +-#define MII_ANAR 0x04 +-/* Auto-Negotiation Link Partner Ability Register */ +-#define MII_ANLPAR 0x05 +-#define MII_AN_NEXT_PAGE 0x8000 +-#define MII_AN_ACK 0x4000 +-#define MII_AN_REMOTE_FAULT 0x2000 +-#define MII_AN_ABILITY_MASK 0x07e0 +-#define MII_AN_FLOW_CONTROL 0x0400 +-#define MII_AN_100BASET4 0x0200 +-#define MII_AN_100BASETX_FD 0x0100 +-#define MII_AN_100BASETX_HD 0x0080 +-#define MII_AN_10BASET_FD 0x0040 +-#define MII_AN_10BASET_HD 0x0020 +-#define MII_AN_PROT_MASK 0x001f +-#define MII_AN_PROT_802_3 0x0001 +- +-/* Auto-Negotiation Expansion Register */ +-#define MII_ANER 0x06 +-#define MII_ANER_MULT_FAULT 0x0010 +-#define MII_ANER_LP_NP_ABLE 0x0008 +-#define MII_ANER_NP_ABLE 0x0004 +-#define MII_ANER_PAGE_RX 0x0002 +-#define MII_ANER_LP_AN_ABLE 0x0001 +- +-#endif /* _LINUX_MII_H */ +diff --git a/include/util-ank.h b/include/util-ank.h +index 04ab16c..c8fcd08 100644 +--- a/include/util-ank.h ++++ b/include/util-ank.h +@@ -75,6 +75,6 @@ extern int do_qdisc(int argc, char **argv); + extern int do_class(int argc, char **argv); + extern int do_filter(int argc, char **argv); + +-extern const char *format_host(int af, void *addr, __u8 *abuf, int alen); ++extern const char *format_host(int af, void *addr, char *abuf, int alen); + + #endif /* __UTILS_H__ */ +diff --git a/ipmaddr.c b/ipmaddr.c +index 2134e81..e4ed41d 100644 +--- a/ipmaddr.c ++++ b/ipmaddr.c +@@ -32,6 +32,7 @@ + + #include "config.h" + #include "intl.h" ++#include "util.h" + #include "util-ank.h" + #include "net-support.h" + #include "version.h" +@@ -44,13 +45,11 @@ int filter_family; + #define NEWADDR 1 + #define DELADDR 2 + +-char *Release = RELEASE, +- *Version = "ipmaddr 1.1", +- *Signature = "Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>"; ++static char *Release = RELEASE, *Signature = "Alexey Kuznetsov"; + + static void version(void) + { +- printf("%s\n%s\n%s\n", Release, Version, Signature); ++ printf("%s\n%s\n", Release, Signature); + exit(E_VERSION); + } + +@@ -61,7 +60,7 @@ static void usage(void) + fprintf(stderr, _("Usage: ipmaddr [ add | del ] MULTIADDR dev STRING\n")); + fprintf(stderr, _(" ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n")); + fprintf(stderr, _(" ipmaddr -V | -version\n")); +- exit(-1); ++ exit(E_USAGE); + } + + static void print_lla(FILE *fp, int len, unsigned char *addr) +@@ -75,7 +74,7 @@ static void print_lla(FILE *fp, int len, unsigned char *addr) + } + } + +-static int parse_lla(char *str, unsigned char *addr) ++static int parse_lla(char *str, char *addr) + { + int len=0; + +@@ -159,8 +158,7 @@ void read_dev_mcast(struct ma_info **result_p) + + len = parse_hex(hexa, (unsigned char*)&m.addr.data); + if (len >= 0) { +- struct ma_info *ma = malloc(sizeof(m)); +- ++ struct ma_info *ma = xmalloc(sizeof(m)); + memcpy(ma, &m, sizeof(m)); + ma->addr.bytelen = len; + ma->addr.bitlen = len<<3; +@@ -174,22 +172,21 @@ void read_dev_mcast(struct ma_info **result_p) + + void read_igmp(struct ma_info **result_p) + { +- struct ma_info m; ++ struct ma_info m, *ma = NULL; + char buf[256]; + FILE *fp = fopen(_PATH_PROCNET_IGMP, "r"); + + if (!fp) + return; + memset(&m, 0, sizeof(m)); +- fgets(buf, sizeof(buf), fp); ++ if (fgets(buf, sizeof(buf), fp)) ++ /* eat line */; + + m.addr.family = AF_INET; + m.addr.bitlen = 32; + m.addr.bytelen = 4; + + while (fgets(buf, sizeof(buf), fp)) { +- struct ma_info *ma = malloc(sizeof(m)); +- + if (buf[0] != '\t') { + sscanf(buf, "%d%s", &m.index, m.name); + continue; +@@ -200,7 +197,7 @@ void read_igmp(struct ma_info **result_p) + + sscanf(buf, "%08x%d", (__u32*)&m.addr.data, &m.users); + +- ma = malloc(sizeof(m)); ++ ma = xmalloc(sizeof(m)); + memcpy(ma, &m, sizeof(m)); + maddr_ins(result_p, ma); + } +@@ -231,8 +228,7 @@ void read_igmp6(struct ma_info **result_p) + + len = parse_hex(hexa, (unsigned char*)&m.addr.data); + if (len >= 0) { +- struct ma_info *ma = malloc(sizeof(m)); +- ++ struct ma_info *ma = xmalloc(sizeof(m)); + memcpy(ma, &m, sizeof(m)); + + ma->addr.bytelen = len; +@@ -291,13 +287,15 @@ static void print_mlist(FILE *fp, struct ma_info *list) + static int multiaddr_list(int argc, char **argv) + { + struct ma_info *list = NULL; ++ size_t l; + + while (argc > 0) { + if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); +- if (filter_dev[0]) ++ l = strlen(*argv); ++ if (l <= 0 || l >= sizeof(filter_dev)) + usage(); +- strcpy(filter_dev, *argv); ++ strncpy(filter_dev, *argv, sizeof (filter_dev)); + } else if (strcmp(*argv, "all") == 0) { + filter_family = AF_UNSPEC; + } else if (strcmp(*argv, "ipv4") == 0) { +@@ -307,9 +305,10 @@ static int multiaddr_list(int argc, char **argv) + } else if (strcmp(*argv, "link") == 0) { + filter_family = AF_PACKET; + } else { +- if (filter_dev[0]) ++ l = strlen(*argv); ++ if (l <= 0 || l >= sizeof(filter_dev)) + usage(); +- strcpy(filter_dev, *argv); ++ strncpy(filter_dev, *argv, sizeof (filter_dev)); + } + argv++; argc--; + } +@@ -401,7 +400,7 @@ int main(int argc, char **argv) + basename = argv[0]; + else + basename++; +- ++ + while (argc > 1) { + if (argv[1][0] != '-') + break; +diff --git a/iptunnel.c b/iptunnel.c +index 4943d83..ddf43b2 100644 +--- a/iptunnel.c ++++ b/iptunnel.c +@@ -68,13 +68,11 @@ + + #include "util-ank.h" + +-char *Release = RELEASE, +- *Version = "iptunnel 1.01", +- *Signature = "Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>"; ++static char *Release = RELEASE, *Signature = "Alexey Kuznetsov"; + + static void version(void) + { +- printf("%s\n%s\n%s\n", Release, Version, Signature); ++ printf("%s\n%s\n", Release, Signature); + exit(E_VERSION); + } + +@@ -92,7 +90,7 @@ static void usage(void) + fprintf(stderr, _(" TOS := { NUMBER | inherit }\n")); + fprintf(stderr, _(" TTL := { 1..255 | inherit }\n")); + fprintf(stderr, _(" KEY := { DOTTED_QUAD | NUMBER }\n")); +- exit(-1); ++ exit(E_USAGE); + } + + static int do_ioctl_get_ifindex(char *dev) +@@ -101,11 +99,12 @@ static int do_ioctl_get_ifindex(char *dev) + int fd; + int err; + +- strcpy(ifr.ifr_name, dev); ++ safe_strncpy(ifr.ifr_name, dev, IFNAMSIZ); + fd = socket(AF_INET, SOCK_DGRAM, 0); + err = ioctl(fd, SIOCGIFINDEX, &ifr); + if (err) { + perror("ioctl"); ++ close(fd); + return 0; + } + close(fd); +@@ -118,11 +117,12 @@ static int do_ioctl_get_iftype(char *dev) + int fd; + int err; + +- strcpy(ifr.ifr_name, dev); ++ safe_strncpy(ifr.ifr_name, dev, IFNAMSIZ); + fd = socket(AF_INET, SOCK_DGRAM, 0); + err = ioctl(fd, SIOCGIFHWADDR, &ifr); + if (err) { + perror("ioctl"); ++ close(fd); + return -1; + } + close(fd); +@@ -141,6 +141,7 @@ static char * do_ioctl_get_ifname(int idx) + err = ioctl(fd, SIOCGIFNAME, &ifr); + if (err) { + perror("ioctl"); ++ close(fd); + return NULL; + } + close(fd); +@@ -155,7 +156,7 @@ static int do_get_ioctl(char *basedev, struct ip_tunnel_parm *p) + int fd; + int err; + +- strcpy(ifr.ifr_name, basedev); ++ safe_strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void*)p; + fd = socket(AF_INET, SOCK_DGRAM, 0); + err = ioctl(fd, SIOCGETTUNNEL, &ifr); +@@ -171,7 +172,7 @@ static int do_add_ioctl(int cmd, char *basedev, struct ip_tunnel_parm *p) + int fd; + int err; + +- strcpy(ifr.ifr_name, basedev); ++ safe_strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void*)p; + fd = socket(AF_INET, SOCK_DGRAM, 0); + err = ioctl(fd, cmd, &ifr); +@@ -187,7 +188,7 @@ static int do_del_ioctl(char *basedev, struct ip_tunnel_parm *p) + int fd; + int err; + +- strcpy(ifr.ifr_name, basedev); ++ safe_strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void*)p; + fd = socket(AF_INET, SOCK_DGRAM, 0); + err = ioctl(fd, SIOCDELTUNNEL, &ifr); +@@ -375,7 +376,7 @@ static int do_add(int cmd, int argc, char **argv) + return do_add_ioctl(cmd, "gre0", &p); + case IPPROTO_IPV6: + return do_add_ioctl(cmd, "sit0", &p); +- default: ++ default: + fprintf(stderr, _("cannot determine tunnel mode (ipip, gre or sit)\n")); + return -1; + } +@@ -390,13 +391,13 @@ int do_del(int argc, char **argv) + return -1; + + switch (p.iph.protocol) { +- case IPPROTO_IPIP: ++ case IPPROTO_IPIP: + return do_del_ioctl(p.name[0] ? p.name : "tunl0", &p); +- case IPPROTO_GRE: ++ case IPPROTO_GRE: + return do_del_ioctl(p.name[0] ? p.name : "gre0", &p); +- case IPPROTO_IPV6: ++ case IPPROTO_IPV6: + return do_del_ioctl(p.name[0] ? p.name : "sit0", &p); +- default: ++ default: + return do_del_ioctl(p.name, &p); + } + return -1; +@@ -476,8 +477,10 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) + return -1; + } + +- fgets(buf, sizeof(buf), fp); +- fgets(buf, sizeof(buf), fp); ++ if (fgets(buf, sizeof(buf), fp)) ++ /* eat line */; ++ if (fgets(buf, sizeof(buf), fp)) ++ /* eat line */; + + while (fgets(buf, sizeof(buf), fp) != NULL) { + char *ptr; +@@ -485,9 +488,10 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) + if ((ptr = strchr(buf, ':')) == NULL || + (*ptr++ = 0, sscanf(buf, "%s", name) != 1)) { + fprintf(stderr, _("Wrong format of /proc/net/dev. Sorry.\n")); ++ fclose(fp); + return -1; + } +- if (sscanf(ptr, "%ld%ld%ld%ld%ld%ld%ld%*d%ld%ld%ld%ld%ld%ld%ld", ++ if (sscanf(ptr, "%lu%lu%lu%lu%lu%lu%lu%*u%lu%lu%lu%lu%lu%lu%lu", + &rx_bytes, &rx_packets, &rx_errs, &rx_drops, + &rx_fifo, &rx_frame, &rx_multi, + &tx_bytes, &tx_packets, &tx_errs, &tx_drops, +@@ -521,6 +525,7 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) + tx_packets, tx_bytes, tx_errs, tx_colls, tx_carrier, tx_drops); + } + } ++ fclose(fp); + return 0; + } + +@@ -533,7 +538,7 @@ static int do_show(int argc, char **argv) + return -1; + + switch (p.iph.protocol) { +- case IPPROTO_IPIP: ++ case IPPROTO_IPIP: + err = do_get_ioctl(p.name[0] ? p.name : "tunl0", &p); + break; + case IPPROTO_GRE: +@@ -592,7 +597,7 @@ int main(int argc, char **argv) + basename = argv[0]; + else + basename++; +- ++ + while (argc > 1) { + if (argv[1][0] != '-') + break; +diff --git a/lib/Makefile b/lib/Makefile +index d714b2e..431f258 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -16,7 +16,7 @@ + # + + +-HWOBJS = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o ++HWOBJS = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o eui64.o ib.o + AFOBJS = unix.o inet.o inet6.o ax25.o ipx.o ddp.o ipx.o netrom.o af.o rose.o econet.o x25.o + AFGROBJS = inet_gr.o inet6_gr.o ipx_gr.o ddp_gr.o netrom_gr.o ax25_gr.o rose_gr.o getroute.o x25_gr.o + AFSROBJS = inet_sr.o inet6_sr.o netrom_sr.o ipx_sr.o setroute.o x25_sr.o +@@ -36,7 +36,7 @@ OBJS = $(sort $(VARIA) $(AFOBJS) $(HWOBJS) \ + + # This can be overwritten by the TOPLEVEL Makefile + TOPDIR=.. +-CFLAGS += -I$(TOPDIR) -idirafter $(TOPDIR)/include # -fPIC ++CFLAGS += -I$(TOPDIR) -I$(TOPDIR)/include # -fPIC + SONAME=libnet-tools.so.0 + + .SUFFIXES: .a .so +diff --git a/lib/af.c b/lib/af.c +index 4f002c4..0500a0a 100644 +--- a/lib/af.c ++++ b/lib/af.c +@@ -2,7 +2,7 @@ + * lib/af.c This file contains the top-level part of the protocol + * support functions module for the NET-2 base distribution. + * +- * Version: $Id: af.c,v 1.13 2000/05/20 13:38:10 pb Exp $ ++ * Version: $Id: af.c,v 1.14 2007/12/01 17:49:35 ecki Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +@@ -35,8 +35,10 @@ int flag_netrom; + int flag_inet; + int flag_inet6; + int flag_econet; ++int flag_rose; + int flag_x25 = 0; + int flag_ash; ++int flag_bluetooth; + + + struct aftrans_t { +@@ -58,6 +60,9 @@ struct aftrans_t { + "ipx", "ipx", &flag_ipx + }, + { ++ "rose", "rose", &flag_rose ++ }, ++ { + "appletalk", "ddp", &flag_ddp + }, + { +@@ -88,6 +93,9 @@ struct aftrans_t { + "ash", "ash", &flag_ash + }, + { ++ "bluetooth", "bluetooth", &flag_bluetooth ++ }, ++ { + 0, 0, 0 + } + }; +@@ -193,15 +201,14 @@ void aftrans_def(char *tool, char *argv0, char *dflt) + char *tmp; + char *buf; + +- strcpy(afname, dflt); ++ safe_strncpy(afname, dflt, sizeof(afname)); + + if (!(tmp = strrchr(argv0, '/'))) + tmp = argv0; /* no slash?! */ + else + tmp++; + +- if (!(buf = strdup(tmp))) +- return; ++ buf = xstrdup(tmp); + + if (strlen(tool) >= strlen(tmp)) { + free(buf); +@@ -219,7 +226,7 @@ void aftrans_def(char *tool, char *argv0, char *dflt) + + afname[0] = '\0'; + if (aftrans_opt(buf)) +- strcpy(afname, buf); ++ safe_strncpy(afname, buf, sizeof(afname)); + + free(buf); + } +@@ -296,7 +303,6 @@ int aftrans_opt(const char *arg) + if (tmp2) + *(tmp2++) = '\0'; + +- paft = aftrans; + for (paft = aftrans; paft->alias; paft++) { + if (strcmp(tmp1, paft->alias)) + continue; +@@ -335,7 +341,7 @@ void print_aflist(int type) { + if ((type == 1 && ((*afp)->rprint == NULL)) || ((*afp)->af == 0)) { + afp++; continue; + } +- if ((count % 3) == 0) fprintf(stderr,count?"\n ":" "); ++ if ((count % 3) == 0) fprintf(stderr,count?"\n ":" "); + txt = (*afp)->name; if (!txt) txt = ".."; + fprintf(stderr,"%s (%s) ",txt,(*afp)->title); + count++; +diff --git a/lib/arcnet.c b/lib/arcnet.c +index eb0f46e..9bc3267 100644 +--- a/lib/arcnet.c ++++ b/lib/arcnet.c +@@ -35,7 +35,7 @@ extern struct hwtype arcnet_hwtype; + + + /* Display an ARCnet address in readable format. */ +-static char *pr_arcnet(unsigned char *ptr) ++static const char *pr_arcnet(const char *ptr) + { + static char buff[64]; + +@@ -43,11 +43,16 @@ static char *pr_arcnet(unsigned char *ptr) + return (buff); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + /* Input an ARCnet address and convert to binary. */ + static int in_arcnet(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char c, *orig; + int i, val; + +@@ -66,9 +71,8 @@ static int in_arcnet(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_arcnet(%s): invalid arcnet address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_arcnet(%s): invalid arcnet address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -81,9 +85,8 @@ static int in_arcnet(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_arcnet(%s): invalid arcnet address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_arcnet(%s): invalid arcnet address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -92,28 +95,21 @@ static int in_arcnet(char *bufp, struct sockaddr *sap) + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { +- if (i == ETH_ALEN) { +-#ifdef DEBUG ++ if (_DEBUG && i == ETH_ALEN) + fprintf(stderr, _("in_arcnet(%s): trailing : ignored!\n"), +- orig) +-#endif +- ; /* nothing */ +- } ++ orig); + bufp++; + } + } + + /* That's it. Any trailing junk? */ +- if ((i == ETH_ALEN) && (*bufp != '\0')) { +-#ifdef DEBUG ++ if (_DEBUG && (i == ETH_ALEN) && (*bufp != '\0')) { + fprintf(stderr, _("in_arcnet(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +-#endif + } +-#ifdef DEBUG +- fprintf(stderr, "in_arcnet(%s): %s\n", orig, pr_arcnet(sap->sa_data)); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "in_arcnet(%s): %s\n", orig, pr_arcnet(sap->sa_data)); + + return (0); + } +diff --git a/lib/ash.c b/lib/ash.c +index c64667c..6cfc154 100644 +--- a/lib/ash.c ++++ b/lib/ash.c +@@ -31,8 +31,8 @@ static unsigned char hamming[16] = + }; + + /* Display an Ash address in readable format. */ +-static char * +-pr_ash(unsigned char *ptr) ++static const char * ++pr_ash(const char *ptr) + { + static char buff[128]; + char *p = buff; +@@ -57,10 +57,10 @@ pr_ash(unsigned char *ptr) + + struct hwtype ash_hwtype; + +-static int ++static int + in_ash(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + unsigned int i = 0; + + sap->sa_family = ash_hwtype.type; +@@ -102,7 +102,7 @@ struct hwtype ash_hwtype = + #if HAVE_AFASH + + /* Display an Ash socket address. */ +-static char * ++static const char * + pr_sash(struct sockaddr *sap, int numeric) + { + static char buf[64]; +diff --git a/lib/ax25.c b/lib/ax25.c +index 11521d2..d57abe7 100644 +--- a/lib/ax25.c ++++ b/lib/ax25.c +@@ -47,7 +47,7 @@ static char AX25_errmsg[128]; + + extern struct aftype ax25_aftype; + +-static char *AX25_print(unsigned char *ptr) ++static const char *AX25_print(const char *ptr) + { + static char buff[8]; + int i; +@@ -66,7 +66,7 @@ static char *AX25_print(unsigned char *ptr) + + + /* Display an AX.25 socket address. */ +-static char * ++static const char * + AX25_sprint(struct sockaddr *sap, int numeric) + { + static char buf[64]; +@@ -76,10 +76,15 @@ static char * + return (AX25_print(((struct sockaddr_ax25 *) sap)->sax25_call.ax25_call)); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + static int AX25_input(int type, char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char *orig, c; + int i; + +@@ -95,9 +100,8 @@ static int AX25_input(int type, char *bufp, struct sockaddr *sap) + c = toupper(c); + if (!(isupper(c) || isdigit(c))) { + safe_strncpy(AX25_errmsg, _("Invalid callsign"), sizeof(AX25_errmsg)); +-#ifdef DEBUG +- fprintf(stderr, "ax25_input(%s): %s !\n", AX25_errmsg, orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "ax25_input(%s): %s !\n", AX25_errmsg, orig); + errno = EINVAL; + return (-1); + } +@@ -107,10 +111,9 @@ static int AX25_input(int type, char *bufp, struct sockaddr *sap) + + /* Callsign too long? */ + if ((i == 6) && (*bufp != '-') && (*bufp != '\0')) { +- strcpy(AX25_errmsg, _("Callsign too long")); +-#ifdef DEBUG +- fprintf(stderr, "ax25_input(%s): %s !\n", AX25_errmsg, orig); +-#endif ++ safe_strncpy(AX25_errmsg, _("Callsign too long"), sizeof(AX25_errmsg)); ++ if (_DEBUG) ++ fprintf(stderr, "ax25_input(%s): %s !\n", AX25_errmsg, orig); + errno = E2BIG; + return (-1); + } +@@ -128,12 +131,12 @@ static int AX25_input(int type, char *bufp, struct sockaddr *sap) + } + + /* All done. */ +-#ifdef DEBUG +- fprintf(stderr, "ax25_input(%s): ", orig); +- for (i = 0; i < sizeof(ax25_address); i++) +- fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); +- fprintf(stderr, "\n"); +-#endif ++ if (_DEBUG) { ++ fprintf(stderr, "ax25_input(%s): ", orig); ++ for (i = 0; i < sizeof(ax25_address); i++) ++ fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); ++ fprintf(stderr, "\n"); ++ } + + return (0); + } +diff --git a/lib/ax25_gr.c b/lib/ax25_gr.c +index 4dce92d..46a67ee 100644 +--- a/lib/ax25_gr.c ++++ b/lib/ax25_gr.c +@@ -49,7 +49,8 @@ int AX25_rprint(int options) + } + printf(_("Kernel AX.25 routing table\n")); /* xxx */ + printf(_("Destination Iface Use\n")); /* xxx */ +- fgets(buffer, 256, f); ++ if (fgets(buffer, 256, f)) ++ /* eat line */; + while (fgets(buffer, 256, f)) { + buffer[9] = 0; + buffer[14] = 0; +diff --git a/lib/ddp.c b/lib/ddp.c +index 9b5e829..0a08fd2 100644 +--- a/lib/ddp.c ++++ b/lib/ddp.c +@@ -32,7 +32,7 @@ + #include "util.h" + + /* Display a ddp domain address. */ +-static char *ddp_print(unsigned char *ptr) ++static const char *ddp_print(const char *ptr) + { + static char buff[64]; + struct sockaddr_at *sat = (struct sockaddr_at *) (ptr - 2); +@@ -42,7 +42,7 @@ static char *ddp_print(unsigned char *ptr) + + + /* Display a ddp domain address. */ +-static char *ddp_sprint(struct sockaddr *sap, int numeric) ++static const char *ddp_sprint(struct sockaddr *sap, int numeric) + { + static char buf[64]; + +diff --git a/lib/ddp_gr.c b/lib/ddp_gr.c +index 94169f0..d05c431 100644 +--- a/lib/ddp_gr.c ++++ b/lib/ddp_gr.c +@@ -1,3 +1,20 @@ ++/* ++ * lib/ddp_gr.c Prinbting of DDP (AppleTalk) routing table ++ * used by the NET-LIB. ++ * ++ * NET-LIB ++ * ++ * Version: $Id: ddp_gr.c,v 1.4 2002/06/02 05:25:15 ecki Exp $ ++ * ++ * Author: Ajax <ajax@firest0rm.org> ++ * ++ * Modification: ++ * 2002-06-02 integrated into main source by Bernd Eckenfels ++ * ++ */ ++ ++/* TODO: name lookups (/etc/atalk.names? NBP?) */ ++ + #include "config.h" + + #if HAVE_AFATALK +@@ -16,9 +33,62 @@ + #include "pathnames.h" + #include "intl.h" + ++/* stolen from inet_gr.c */ ++#define flags_decode(i,o) do { \ ++ o[0] = '\0'; \ ++ if (i & RTF_UP) strcat(o, "U"); \ ++ if (i & RTF_GATEWAY) strcat(o, "G"); \ ++ if (i & RTF_REJECT) strcat(o, "!"); \ ++ if (i & RTF_HOST) strcat(o, "H"); \ ++ if (i & RTF_REINSTATE) strcat(o, "R"); \ ++ if (i & RTF_DYNAMIC) strcat(o, "D"); \ ++ if (i & RTF_MODIFIED) strcat(o, "M"); \ ++ if (i & RTF_DEFAULT) strcat(o, "d"); \ ++ if (i & RTF_ALLONLINK) strcat(o, "a"); \ ++ if (i & RTF_ADDRCONF) strcat(o, "c"); \ ++ if (i & RTF_NONEXTHOP) strcat(o, "o"); \ ++ if (i & RTF_EXPIRES) strcat(o, "e"); \ ++ if (i & RTF_CACHE) strcat(o, "c"); \ ++ if (i & RTF_FLOW) strcat(o, "f"); \ ++ if (i & RTF_POLICY) strcat(o, "p"); \ ++ if (i & RTF_LOCAL) strcat(o, "l"); \ ++ if (i & RTF_MTU) strcat(o, "u"); \ ++ if (i & RTF_WINDOW) strcat(o, "w"); \ ++ if (i & RTF_IRTT) strcat(o, "i"); \ ++ if (i & RTF_NOTCACHED) strcat(o, "n"); \ ++ } while (0) ++ + int DDP_rprint(int options) + { +- fprintf(stderr, _("Routing table for `ddp' not yet supported.\n")); +- return (1); ++ FILE *fp; ++ char *dest, *gw, *dev, *flags; ++ char oflags[32]; ++ char *hdr = "Destination Gateway Device Flags"; ++ ++ fp = fopen(_PATH_PROCNET_ATALK_ROUTE, "r"); ++ ++ if (!fp) { ++ perror("Error opening " _PATH_PROCNET_ATALK_ROUTE); ++ fprintf(stderr, "DDP (AppleTalk) not configured on this system.\n"); ++ return 1; ++ } ++ ++ if (fscanf(fp, "%ms %ms %ms %ms\n", &dest, &gw, &flags, &dev)) ++ /* eat line */; ++ free(dest); free(gw); free(flags); free(dev); ++ ++ printf("%s\n", hdr); ++ ++ while (fscanf(fp, "%ms %ms %ms %ms\n", &dest, &gw, &flags, &dev) == 4) { ++ int iflags = atoi(flags); ++ flags_decode(iflags, oflags); ++ printf("%-16s%-16s%-16s%-s\n", dest, gw, dev, oflags); ++ free(dest); free(gw); free(flags); free(dev); ++ } ++ ++ fclose(fp); ++ ++ return 0; ++ + } + #endif +diff --git a/lib/ec_hw.c b/lib/ec_hw.c +index 825e501..088d125 100644 +--- a/lib/ec_hw.c ++++ b/lib/ec_hw.c +@@ -2,7 +2,7 @@ + * lib/ec_hw.c This file contains an implementation of the Econet + * hardware support functions. + * +- * Version: $Id: ec_hw.c,v 1.2 1999/09/27 11:00:46 philip Exp $ ++ * Version: $Id: ec_hw.c,v 1.3 2009/09/06 22:39:20 ecki Exp $ + * + * Author: Philip Blundell <philb@gnu.org> + * +@@ -16,6 +16,7 @@ + + #if HAVE_HWEC + ++#include <stdlib.h> + #include <net/if_arp.h> + #include "net-support.h" + +diff --git a/lib/econet.c b/lib/econet.c +index 1229a28..6cf8a9a 100644 +--- a/lib/econet.c ++++ b/lib/econet.c +@@ -32,8 +32,8 @@ + + + /* Display an Econet address */ +-static char * +-ec_print(unsigned char *ptr) ++static const char * ++ec_print(const char *ptr) + { + static char buff[64]; + struct ec_addr *ec = (struct ec_addr *) ptr; +@@ -43,7 +43,7 @@ ec_print(unsigned char *ptr) + + + /* Display an Econet socket address */ +-static char * ++static const char * + ec_sprint(struct sockaddr *sap, int numeric) + { + struct sockaddr_ec *sec = (struct sockaddr_ec *) sap; +@@ -51,10 +51,10 @@ ec_sprint(struct sockaddr *sap, int numeric) + if (sap->sa_family != AF_ECONET) + return _("[NONE SET]"); + +- return ec_print((unsigned char *) &sec->addr); ++ return ec_print((const char *) &sec->addr); + } + +-static int ++static int + ec_input(int type, char *bufp, struct sockaddr *sap) + { + struct sockaddr_ec *sec = (struct sockaddr_ec *) sap; +diff --git a/lib/ether.c b/lib/ether.c +index a71aed7..dee9c73 100644 +--- a/lib/ether.c ++++ b/lib/ether.c +@@ -2,7 +2,7 @@ + * lib/ether.c This file contains an implementation of the "Ethernet" + * support functions. + * +- * Version: $Id: ether.c,v 1.7 1999/09/27 11:00:47 philip Exp $ ++ * Version: $Id: ether.c,v 1.8 2002/07/30 05:17:29 ecki Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +@@ -35,22 +35,27 @@ extern struct hwtype ether_hwtype; + + + /* Display an Ethernet address in readable format. */ +-static char *pr_ether(unsigned char *ptr) ++static const char *pr_ether(const char *ptr) + { + static char buff[64]; + +- snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", ++ snprintf(buff, sizeof(buff), "%02x:%02x:%02x:%02x:%02x:%02x", + (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), + (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) + ); + return (buff); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + /* Input an Ethernet address and convert to binary. */ + static int in_ether(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char c, *orig; + int i; + unsigned val; +@@ -70,9 +75,8 @@ static int in_ether(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_ether(%s): invalid ether address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_ether(%s): invalid ether address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -87,9 +91,8 @@ static int in_ether(char *bufp, struct sockaddr *sap) + else if (c == ':' || c == 0) + val >>= 4; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_ether(%s): invalid ether address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_ether(%s): invalid ether address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -100,28 +103,21 @@ static int in_ether(char *bufp, struct sockaddr *sap) + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { +- if (i == ETH_ALEN) { +-#ifdef DEBUG ++ if (_DEBUG && i == ETH_ALEN) + fprintf(stderr, _("in_ether(%s): trailing : ignored!\n"), +- orig) +-#endif +- ; /* nothing */ +- } ++ orig); + bufp++; + } + } + + /* That's it. Any trailing junk? */ +- if ((i == ETH_ALEN) && (*bufp != '\0')) { +-#ifdef DEBUG ++ if (_DEBUG && (i == ETH_ALEN) && (*bufp != '\0')) { + fprintf(stderr, _("in_ether(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +-#endif + } +-#ifdef DEBUG +- fprintf(stderr, "in_ether(%s): %s\n", orig, pr_ether(sap->sa_data)); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "in_ether(%s): %s\n", orig, pr_ether(sap->sa_data)); + + return (0); + } +diff --git a/lib/eui64.c b/lib/eui64.c +new file mode 100644 +index 0000000..94831c0 +--- /dev/null ++++ b/lib/eui64.c +@@ -0,0 +1,152 @@ ++/* ++ * lib/eui64.c This file contains support for generic EUI-64 hw addressing ++ * ++ * Version: $Id: eui64.c,v 1.1 2001/11/12 02:12:05 ecki Exp $ ++ * ++ * Author: Daniel Stodden <stodden@in.tum.de> ++ * Copyright 2001 Daniel Stodden ++ * ++ * blueprinted from ether.c ++ * Copyright 1993 MicroWalt Corporation ++ * ++ * 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 Free Software ++ * Foundation; either version 2 of the License, or (at ++ * your option) any later version. ++ */ ++#include "config.h" ++ ++#if HAVE_HWEUI64 ++ ++#include <sys/types.h> ++#include <sys/ioctl.h> ++#include <sys/socket.h> ++#include <net/if_arp.h> ++#include <stdlib.h> ++#include <stdio.h> ++#include <ctype.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <string.h> ++#include <termios.h> ++#include <unistd.h> ++#include "net-support.h" ++#include "pathnames.h" ++#include "intl.h" ++ ++/* ++ * EUI-64 constants ++ */ ++ ++#define EUI64_ALEN 8 ++ ++#ifndef ARPHRD_EUI64 ++#define ARPHRD_EUI64 27 ++#warning "ARPHRD_EUI64 not defined in <net/if_arp.h>. Using private value 27" ++#endif ++ ++struct hwtype eui64_hwtype; ++ ++/* Display an EUI-64 address in readable format. */ ++static const char *pr_eui64(const char *ptr) ++{ ++ static char buff[64]; ++ ++ snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", ++ (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), ++ (ptr[4] & 0377), (ptr[5] & 0377), (ptr[6] & 0377), (ptr[7] & 0377) ++ ); ++ return (buff); ++} ++ ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif ++ ++/* Start the PPP encapsulation on the file descriptor. */ ++static int in_eui64( char *bufp, struct sockaddr *sap ) ++{ ++ char *ptr; ++ char c, *orig; ++ int i; ++ unsigned val; ++ ++ sap->sa_family = eui64_hwtype.type; ++ ptr = sap->sa_data; ++ ++ i = 0; ++ orig = bufp; ++ ++ while ((*bufp != '\0') && (i < EUI64_ALEN)) { ++ val = 0; ++ c = *bufp++; ++ if (isdigit(c)) ++ val = c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ val = c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ val = c - 'A' + 10; ++ else { ++ if (_DEBUG) ++ fprintf( stderr, _("in_eui64(%s): invalid eui64 address!\n"), ++ orig ); ++ errno = EINVAL; ++ return (-1); ++ } ++ ++ val <<= 4; ++ c = *bufp; ++ if (isdigit(c)) ++ val |= c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ val |= c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ val |= c - 'A' + 10; ++ else if (c == ':' || c == 0) ++ val >>= 4; ++ else { ++ if (_DEBUG) ++ fprintf( stderr, _("in_eui64(%s): invalid eui64 address!\n"), ++ orig ); ++ errno = EINVAL; ++ return (-1); ++ } ++ ++ if (c != 0) ++ bufp++; ++ ++ *ptr++ = (unsigned char) (val & 0377); ++ i++; ++ ++ /* We might get a semicolon here - not required. */ ++ if (*bufp == ':') { ++ if (_DEBUG && i == EUI64_ALEN) ++ fprintf(stderr, _("in_eui64(%s): trailing : ignored!\n"), ++ orig); ++ bufp++; ++ } ++ } ++ ++ /* That's it. Any trailing junk? */ ++ if (_DEBUG && (i == EUI64_ALEN) && (*bufp != '\0')) { ++ fprintf(stderr, _("in_eui64(%s): trailing junk!\n"), orig); ++ errno = EINVAL; ++ return (-1); ++ } ++ if (_DEBUG) ++ fprintf(stderr, "in_eui64(%s): %s\n", orig, pr_eui64(sap->sa_data)); ++ ++ return (0); ++} ++ ++struct hwtype eui64_hwtype = ++{ ++ "eui64", NULL, /*"EUI-64 addressing", */ ARPHRD_EUI64, EUI64_ALEN, ++ pr_eui64, in_eui64, NULL, 0 ++}; ++ ++ ++#endif /* HAVE_EUI64 */ +diff --git a/lib/fddi.c b/lib/fddi.c +index f6bf5ca..c18696e 100644 +--- a/lib/fddi.c ++++ b/lib/fddi.c +@@ -46,7 +46,7 @@ extern struct hwtype fddi_hwtype; + + + /* Display an FDDI address in readable format. */ +-static char *pr_fddi(unsigned char *ptr) ++static const char *pr_fddi(const char *ptr) + { + static char buff[64]; + +@@ -57,11 +57,16 @@ static char *pr_fddi(unsigned char *ptr) + return (buff); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + /* Input an FDDI address and convert to binary. */ + static int in_fddi(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char c, *orig; + int i, val; + +@@ -80,9 +85,8 @@ static int in_fddi(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_fddi(%s): invalid fddi address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_fddi(%s): invalid fddi address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -95,9 +99,8 @@ static int in_fddi(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_fddi(%s): invalid fddi address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_fddi(%s): invalid fddi address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -106,28 +109,21 @@ static int in_fddi(char *bufp, struct sockaddr *sap) + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { +- if (i == FDDI_K_ALEN) { +-#ifdef DEBUG ++ if (_DEBUG && i == FDDI_K_ALEN) + fprintf(stderr, _("in_fddi(%s): trailing : ignored!\n"), +- orig) +-#endif +- ; /* nothing */ +- } ++ orig); + bufp++; + } + } + + /* That's it. Any trailing junk? */ +- if ((i == FDDI_K_ALEN) && (*bufp != '\0')) { +-#ifdef DEBUG ++ if (_DEBUG && (i == FDDI_K_ALEN) && (*bufp != '\0')) { + fprintf(stderr, _("in_fddi(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +-#endif + } +-#ifdef DEBUG +- fprintf(stderr, "in_fddi(%s): %s\n", orig, pr_fddi(sap->sa_data)); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "in_fddi(%s): %s\n", orig, pr_fddi(sap->sa_data)); + + return (0); + } +diff --git a/lib/frame.c b/lib/frame.c +index 58d1ad4..ad265d6 100644 +--- a/lib/frame.c ++++ b/lib/frame.c +@@ -37,7 +37,7 @@ + #include "net-support.h" + #include "pathnames.h" + +-char *pr_dlci(unsigned char *ptr) ++static const char *pr_dlci(const char *ptr) + { + static char buf[12]; + +diff --git a/lib/getargs.c b/lib/getargs.c +index 4170097..6952777 100644 +--- a/lib/getargs.c ++++ b/lib/getargs.c +@@ -24,12 +24,13 @@ + #include <unistd.h> + #include "net-support.h" + #include "pathnames.h" ++#include "util.h" + + + /* Split the input string into multiple fields. */ + int getargs(char *string, char *arguments[]) + { +- int len = strlen(string); ++ int len = strlen(string); + char temp[len+1]; + char *sp, *ptr; + int i, argc; +@@ -41,7 +42,7 @@ int getargs(char *string, char *arguments[]) + */ + sp = string; + i = 0; +- strcpy(temp, string); ++ safe_strncpy(temp, string, sizeof(temp)); + ptr = temp; + + /* +diff --git a/lib/hdlclapb.c b/lib/hdlclapb.c +index c4ed074..b7d563e 100644 +--- a/lib/hdlclapb.c ++++ b/lib/hdlclapb.c +@@ -1,11 +1,11 @@ + /* +- * lib/hdlclapb.c ++ * lib/hdlclapb.c + * This file contains the HDLC/LAPB support for the NET-2 base + * distribution. + * + * Version: $Id: hdlclapb.c,v 1.5 2000/03/05 11:26:02 philip Exp $ + * +- * Original Author: ++ * Original Author: + * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation + * +diff --git a/lib/hippi.c b/lib/hippi.c +index 308db00..43e7a79 100644 +--- a/lib/hippi.c ++++ b/lib/hippi.c +@@ -46,7 +46,7 @@ extern struct hwtype hippi_hwtype; + + + /* Display an HIPPI address in readable format. */ +-static char *pr_hippi(unsigned char *ptr) ++static const char *pr_hippi(const char *ptr) + { + static char buff[64]; + +@@ -57,11 +57,16 @@ static char *pr_hippi(unsigned char *ptr) + return (buff); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + /* Input an HIPPI address and convert to binary. */ + static int in_hippi(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char c, *orig; + int i, val; + +@@ -80,9 +85,8 @@ static int in_hippi(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_hippi(%s): invalid hippi address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_hippi(%s): invalid hippi address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -95,9 +99,8 @@ static int in_hippi(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_hippi(%s): invalid hippi address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_hippi(%s): invalid hippi address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -106,27 +109,20 @@ static int in_hippi(char *bufp, struct sockaddr *sap) + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { +- if (i == HIPPI_ALEN) { +-#ifdef DEBUG +- fprintf(stderr, _("in_hippi(%s): trailing : ignored!\n"), orig) +-#endif +- ; /* nothing */ +- } ++ if (_DEBUG && i == HIPPI_ALEN) ++ fprintf(stderr, _("in_hippi(%s): trailing : ignored!\n"), orig); + bufp++; + } + } + + /* That's it. Any trailing junk? */ +- if ((i == HIPPI_ALEN) && (*bufp != '\0')) { +-#ifdef DEBUG ++ if (_DEBUG && (i == HIPPI_ALEN) && (*bufp != '\0')) { + fprintf(stderr, _("in_hippi(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +-#endif + } +-#ifdef DEBUG +- fprintf(stderr, "in_hippi(%s): %s\n", orig, pr_hippi(sap->sa_data)); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "in_hippi(%s): %s\n", orig, pr_hippi(sap->sa_data)); + + return (0); + } +diff --git a/lib/hw.c b/lib/hw.c +index 4989748..71dfcf9 100644 +--- a/lib/hw.c ++++ b/lib/hw.c +@@ -2,7 +2,7 @@ + * lib/hw.c This file contains the top-level part of the hardware + * support functions module. + * +- * Version: $Id: hw.c,v 1.17 2000/05/20 13:38:10 pb Exp $ ++ * Version: $Id: hw.c,v 1.19 2008/10/03 01:52:04 ecki Exp $ + * + * Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de> + * +@@ -73,6 +73,10 @@ extern struct hwtype irda_hwtype; + + extern struct hwtype ec_hwtype; + ++extern struct hwtype ib_hwtype; ++ ++extern struct hwtype eui64_hwtype; ++ + static struct hwtype *hwtypes[] = + { + +@@ -97,7 +101,7 @@ static struct hwtype *hwtypes[] = + #if HAVE_HWTR + &tr_hwtype, + #ifdef ARPHRD_IEEE802_TR +- &tr_hwtype1, ++ &tr_hwtype1, + #endif + #endif + #if HAVE_HWAX25 +@@ -144,6 +148,12 @@ static struct hwtype *hwtypes[] = + #if HAVE_HWX25 + &x25_hwtype, + #endif ++#if HAVE_HWIB ++ &ib_hwtype, ++#endif ++#if HAVE_HWEUI64 ++ &eui64_hwtype, ++#endif + &unspec_hwtype, + NULL + }; +@@ -211,12 +221,18 @@ void hwinit() + #if HAVE_HWTR + tr_hwtype.title = _("16/4 Mbps Token Ring"); + #ifdef ARPHRD_IEEE802_TR +- tr_hwtype1.title = _("16/4 Mbps Token Ring (New)") ; ++ tr_hwtype1.title = _("16/4 Mbps Token Ring (New)") ; + #endif + #endif + #if HAVE_HWEC + ec_hwtype.title = _("Econet"); + #endif ++#if HAVE_HWIB ++ ib_hwtype.title = _("InfiniBand"); ++#endif ++#if HAVE_HWEUI64 ++ eui64_hwtype.title = _("Generic EUI-64"); ++#endif + sVhwinit = 1; + } + +@@ -269,7 +285,7 @@ void print_hwlist(int type) { + if (((type == 1) && ((*hwp)->alen == 0)) || ((*hwp)->type == -1)) { + hwp++; continue; + } +- if ((count % 3) == 0) fprintf(stderr,count?"\n ":" "); ++ if ((count % 3) == 0) fprintf(stderr,count?"\n ":" "); + txt = (*hwp)->name; if (!txt) txt = ".."; + fprintf(stderr,"%s (%s) ",txt,(*hwp)->title); + count++; +diff --git a/lib/ib.c b/lib/ib.c +new file mode 100644 +index 0000000..1eeb7f0 +--- /dev/null ++++ b/lib/ib.c +@@ -0,0 +1,151 @@ ++/* ++ * lib/ib.c This file contains an implementation of the "Infiniband" ++ * support functions. ++ * ++ * Version: $Id: ib.c,v 1.1 2008/10/03 01:52:03 ecki Exp $ ++ * ++ * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> ++ * Copyright 1993 MicroWalt Corporation ++ * Tom Duffy <tduffy@sun.com> ++ * ++ * 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 Free Software ++ * Foundation; either version 2 of the License, or (at ++ * your option) any later version. ++ */ ++#include "config.h" ++ ++#if HAVE_HWIB ++#include <sys/types.h> ++#include <sys/socket.h> ++#include <net/if_arp.h> ++#include <linux/if_infiniband.h> ++#include <stdlib.h> ++#include <stdio.h> ++#include <errno.h> ++#include <ctype.h> ++#include <string.h> ++#include <unistd.h> ++#include "net-support.h" ++#include "pathnames.h" ++#include "intl.h" ++#include "util.h" ++ ++extern struct hwtype ib_hwtype; ++ ++ ++/* Display an InfiniBand address in readable format. */ ++static const char *pr_ib(const char *ptr) ++{ ++ static char buff[128]; ++ char *pos; ++ unsigned int i; ++ ++ pos = buff; ++ for (i = 0; i < INFINIBAND_ALEN; i++) { ++ pos += sprintf(pos, "%02X:", (*ptr++ & 0377)); ++ } ++ buff[strlen(buff) - 1] = '\0'; ++ fprintf(stderr, _("Infiniband hardware address can be incorrect! Please read BUGS section in ifconfig(8).\n")); ++ /* snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", ++ (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), ++ (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) ++ ); ++ */ ++ return (buff); ++} ++ ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif ++ ++/* Input an Infiniband address and convert to binary. */ ++static int in_ib(char *bufp, struct sockaddr *sap) ++{ ++ char *ptr; ++ char c, *orig; ++ int i; ++ unsigned val; ++ ++ sap->sa_family = ib_hwtype.type; ++ ptr = sap->sa_data; ++ ++ i = 0; ++ orig = bufp; ++ while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) { ++ val = 0; ++ c = *bufp++; ++ if (isdigit(c)) ++ val = c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ val = c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ val = c - 'A' + 10; ++ else { ++ if (_DEBUG) ++ fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig); ++ errno = EINVAL; ++ return (-1); ++ } ++ val <<= 4; ++ c = *bufp; ++ if (isdigit(c)) ++ val |= c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ val |= c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ val |= c - 'A' + 10; ++ else if (c == ':' || c == 0) ++ val >>= 4; ++ else { ++#ifdef DEBUG ++ fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig); ++#endif ++ errno = EINVAL; ++ return (-1); ++ } ++ if (c != 0) ++ bufp++; ++ *ptr++ = (unsigned char) (val & 0377); ++ i++; ++ ++ /* We might get a semicolon here - not required. */ ++ if (*bufp == ':') { ++ if (i == INFINIBAND_ALEN) { ++#ifdef DEBUG ++ fprintf(stderr, _("in_ib(%s): trailing : ignored!\n"), ++ orig) ++#endif ++ ; /* nothing */ ++ } ++ bufp++; ++ } ++ } ++ ++ /* That's it. Any trailing junk? */ ++ if ((i == INFINIBAND_ALEN) && (*bufp != '\0')) { ++#ifdef DEBUG ++ fprintf(stderr, _("in_ib(%s): trailing junk!\n"), orig); ++ errno = EINVAL; ++ return (-1); ++#endif ++ } ++#ifdef DEBUG ++ fprintf(stderr, "in_ib(%s): %s\n", orig, pr_ib(sap->sa_data)); ++#endif ++ ++ return (0); ++} ++ ++ ++struct hwtype ib_hwtype = ++{ ++ "infiniband", NULL, ARPHRD_INFINIBAND, INFINIBAND_ALEN, ++ pr_ib, in_ib, NULL ++}; ++ ++ ++#endif /* HAVE_HWIB */ +diff --git a/lib/inet.c b/lib/inet.c +index ae90664..fc23b17 100644 +--- a/lib/inet.c ++++ b/lib/inet.c +@@ -3,7 +3,7 @@ + * support functions for the net-tools. + * (NET-3 base distribution). + * +- * Version: $Id: inet.c,v 1.13 1999/12/11 13:35:56 freitag Exp $ ++ * Version: $Id: inet.c,v 1.14 2003/10/19 11:57:37 pb Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +@@ -14,11 +14,11 @@ + *960203 {1.23} Bernd Eckenfels : net-features support + *960217 {1.24} Bernd Eckenfels : get_sname + *960219 {1.25} Bernd Eckenfels : extern int h_errno +- *960329 {1.26} Bernd Eckenfels : resolve 255.255.255.255 ++ *960329 {1.26} Bernd Eckenfels : resolve 255.255.255.255 + *980101 {1.27} Bernd Eckenfels : resolve raw sockets in /etc/protocols + *990302 {1.28} Phil Blundell : add netmask to INET_rresolve + *991007 Kurt Garloff : rresolve, resolve: may be hosts +- * <garloff@suse.de> store type (host?) in cache ++ * <garloff@suse.de> store type (host?) in cache + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General +@@ -96,9 +96,9 @@ static int INET_resolve(char *name, struct sockaddr_in *sin, int hostfirst) + #ifdef DEBUG + if (hostfirst) fprintf (stderr, "gethostbyname (%s)\n", name); + #endif +- if (hostfirst && ++ if (hostfirst && + (hp = gethostbyname(name)) != (struct hostent *) NULL) { +- memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0], ++ memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0], + sizeof(struct in_addr)); + return 0; + } +@@ -127,24 +127,24 @@ static int INET_resolve(char *name, struct sockaddr_in *sin, int hostfirst) + errno = h_errno; + return -1; + } +- memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0], ++ memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0], + sizeof(struct in_addr)); + + return 0; + } + + +-/* numeric: & 0x8000: default instead of *, +- * & 0x4000: host instead of net, ++/* numeric: & 0x8000: default instead of *, ++ * & 0x4000: host instead of net, + * & 0x0fff: don't resolve + */ +-static int INET_rresolve(char *name, size_t len, struct sockaddr_in *sin, ++static int INET_rresolve(char *name, size_t len, struct sockaddr_in *sin, + int numeric, unsigned int netmask) + { + struct hostent *ent; + struct netent *np; + struct addr *pn; +- unsigned long ad, host_ad; ++ u_int32_t ad, host_ad; + int host = 0; + + /* Grmpf. -FvK */ +@@ -155,24 +155,34 @@ static int INET_rresolve(char *name, size_t len, struct sockaddr_in *sin, + errno = EAFNOSUPPORT; + return (-1); + } +- ad = (unsigned long) sin->sin_addr.s_addr; ++ ad = sin->sin_addr.s_addr; + #ifdef DEBUG +- fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x \n", ad, netmask, numeric); ++ fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x, len %d\n", ad, netmask, numeric, len); + #endif ++ ++ // if no symbolic names are requested we shortcut with ntoa ++ if (numeric & 0x0FFF) { ++ safe_strncpy(name, inet_ntoa(sin->sin_addr), len); ++ return (0); ++ } ++ ++ // we skip getnetbyaddr for 0.0.0.0/0 and 0.0.0.0/~0 + if (ad == INADDR_ANY) { +- if ((numeric & 0x0FFF) == 0) { ++ if (netmask == INADDR_ANY) { ++ // for 0.0.0.0/0 we hardcode symbolic name + if (numeric & 0x8000) + safe_strncpy(name, "default", len); + else + safe_strncpy(name, "*", len); + return (0); ++ } else { ++ // for 0.0.0.0/1 we skip getnetbyname() ++ safe_strncpy(name, "0.0.0.0", len); ++ return (0); + } + } +- if (numeric & 0x0FFF) { +- safe_strncpy(name, inet_ntoa(sin->sin_addr), len); +- return (0); +- } + ++ // it is a host address if flagged or any host bits set + if ((ad & (~netmask)) != 0 || (numeric & 0x4000)) + host = 1; + #if 0 +@@ -183,7 +193,7 @@ static int INET_rresolve(char *name, size_t len, struct sockaddr_in *sin, + if (pn->addr.sin_addr.s_addr == ad && pn->host == host) { + safe_strncpy(name, pn->name, len); + #ifdef DEBUG +- fprintf (stderr, "rresolve: found %s %08lx in cache\n", (host? "host": "net"), ad); ++ fprintf (stderr, "rresolve: found %s %08lx in cache (name=%s, len=%d)\n", (host? "host": "net"), ad, name, len); + #endif + return (0); + } +@@ -210,12 +220,11 @@ static int INET_rresolve(char *name, size_t len, struct sockaddr_in *sin, + } + if ((ent == NULL) && (np == NULL)) + safe_strncpy(name, inet_ntoa(sin->sin_addr), len); +- pn = (struct addr *) malloc(sizeof(struct addr)); ++ pn = (struct addr *) xmalloc(sizeof(struct addr)); + pn->addr = *sin; + pn->next = INET_nn; + pn->host = host; +- pn->name = (char *) malloc(strlen(name) + 1); +- strcpy(pn->name, name); ++ pn->name = xstrdup(name); + INET_nn = pn; + + return (0); +@@ -229,35 +238,35 @@ static void INET_reserror(char *text) + + + /* Display an Internet socket address. */ +-static char *INET_print(unsigned char *ptr) ++static const char *INET_print(const char *ptr) + { + return (inet_ntoa((*(struct in_addr *) ptr))); + } + + + /* Display an Internet socket address. */ +-static char *INET_sprint(struct sockaddr *sap, int numeric) ++static const char *INET_sprint(struct sockaddr *sap, int numeric) + { + static char buff[128]; + + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) + return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff)); + +- if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, ++ if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, + numeric, 0xffffff00) != 0) + return (NULL); + + return (buff); + } + +-char *INET_sprintmask(struct sockaddr *sap, int numeric, ++char *INET_sprintmask(struct sockaddr *sap, int numeric, + unsigned int netmask) + { + static char buff[128]; + + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) + return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff)); +- if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, ++ if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap, + numeric, netmask) != 0) + return (NULL); + return (buff); +@@ -385,10 +394,8 @@ static int read_services(void) + setservent(1); + while ((se = getservent())) { + /* Allocate a service entry. */ +- item = (struct service *) malloc(sizeof(struct service)); +- if (item == NULL) +- perror("netstat"); +- item->name = strdup(se->s_name); ++ item = (struct service *) xmalloc(sizeof(struct service)); ++ item->name = xstrdup(se->s_name); + item->number = se->s_port; + + /* Fill it in. */ +@@ -398,16 +405,17 @@ static int read_services(void) + add2list(&udp_name, item); + } else if (!strcmp(se->s_proto, "raw")) { + add2list(&raw_name, item); ++ } else { /* sctp, ddp, dccp */ ++ free(item->name); ++ free(item); + } + } + endservent(); + setprotoent(1); + while ((pe = getprotoent())) { + /* Allocate a service entry. */ +- item = (struct service *) malloc(sizeof(struct service)); +- if (item == NULL) +- perror("netstat"); +- item->name = strdup(pe->p_name); ++ item = (struct service *) xmalloc(sizeof(struct service)); ++ item->name = xstrdup(pe->p_name); + item->number = htons(pe->p_proto); + add2list(&raw_name, item); + } +@@ -416,35 +424,38 @@ static int read_services(void) + } + + +-char *get_sname(int socknumber, char *proto, int numeric) ++const char *get_sname(int socknumber, const char *proto, int numeric) + { + static char buffer[64], init = 0; + struct service *item; + + if (socknumber == 0) + return ("*"); +- if (numeric) { +- sprintf(buffer, "%d", ntohs(socknumber)); +- return (buffer); +- } ++ if (numeric) ++ goto do_ntohs; ++ + if (!init) { + (void) read_services(); + init = 1; + } + buffer[0] = '\0'; +- if (!strcmp(proto, "tcp")) { +- if ((item = searchlist(tcp_name, socknumber)) != NULL) +- sprintf(buffer, "%s", item->name); +- } else if (!strcmp(proto, "udp")) { +- if ((item = searchlist(udp_name, socknumber)) != NULL) +- sprintf(buffer, "%s", item->name); +- } else if (!strcmp(proto, "raw")) { +- if ((item = searchlist(raw_name, socknumber)) != NULL) +- sprintf(buffer, "%s", item->name); +- ++ if (!strcmp(proto, "tcp")) ++ item = searchlist(tcp_name, socknumber); ++ else if (!strcmp(proto, "udp")) ++ item = searchlist(udp_name, socknumber); ++ else if (!strcmp(proto, "raw")) ++ item = searchlist(raw_name, socknumber); ++ else ++ item = NULL; ++ if (item) { ++ strncpy(buffer, item->name, sizeof(buffer)); ++ buffer[sizeof(buffer) - 1] = '\0'; + } +- if (!buffer[0]) ++ ++ if (!buffer[0]) { ++ do_ntohs: + sprintf(buffer, "%d", ntohs(socknumber)); ++ } + return (buffer); + } + +diff --git a/lib/inet6.c b/lib/inet6.c +index 1f936b3..b428d07 100644 +--- a/lib/inet6.c ++++ b/lib/inet6.c +@@ -3,7 +3,7 @@ + * support functions for the net-tools. + * (most of it copied from lib/inet.c 1.26). + * +- * Version: $Id: inet6.c,v 1.10 2000/10/28 11:04:00 pb Exp $ ++ * Version: $Id: inet6.c,v 1.13 2010-07-05 22:52:00 ecki Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +@@ -44,6 +44,21 @@ + + extern int h_errno; /* some netdb.h versions don't export this */ + ++char * fix_v4_address(char *buf, struct in6_addr *in6) ++{ ++ if (IN6_IS_ADDR_V4MAPPED(in6->s6_addr)) { ++ char *s =strchr(buf, '.'); ++ if (s) { ++ while (s > buf && *s != ':') ++ --s; ++ if (*s == ':') ++s; ++ else s = NULL; ++ } ++ if (s) return s; ++ } ++ return buf; ++} ++ + static int INET6_resolve(char *name, struct sockaddr_in6 *sin6) + { + struct addrinfo req, *ai; +@@ -69,10 +84,9 @@ static int INET6_resolve(char *name, struct sockaddr_in6 *sin6) + #endif + + +-static int INET6_rresolve(char *name, struct sockaddr_in6 *sin6, int numeric) ++static int INET6_rresolve(char *name, size_t namelen, ++ struct sockaddr_in6 *sin6, int numeric) + { +- int s; +- + /* Grmpf. -FvK */ + if (sin6->sin6_family != AF_INET6) { + #ifdef DEBUG +@@ -83,21 +97,20 @@ static int INET6_rresolve(char *name, struct sockaddr_in6 *sin6, int numeric) + return (-1); + } + if (numeric & 0x7FFF) { +- inet_ntop(AF_INET6, &sin6->sin6_addr, name, 80); ++ inet_ntop( AF_INET6, &sin6->sin6_addr, name, namelen); + return (0); + } + if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + if (numeric & 0x8000) +- strcpy(name, "default"); ++ safe_strncpy(name, "default", namelen); + else +- strcpy(name, "*"); ++ safe_strncpy(name, "[::]", namelen); + return (0); + } + +- if ((s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), +- name, 255 /* !! */ , NULL, 0, 0))) { +- fputs("getnameinfo failed\n", stderr); +- return -1; ++ if (getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), ++ name, namelen , NULL, 0, 0)) { ++ inet_ntop( AF_INET6, &sin6->sin6_addr, name, namelen); + } + return (0); + } +@@ -109,41 +122,48 @@ static void INET6_reserror(char *text) + } + + ++ + /* Display an Internet socket address. */ +-static char *INET6_print(unsigned char *ptr) ++static const char *INET6_print(const char *ptr) + { + static char name[80]; + + inet_ntop(AF_INET6, (struct in6_addr *) ptr, name, 80); +- return name; ++ return fix_v4_address(name, (struct in6_addr *)ptr); + } + + + /* Display an Internet socket address. */ + /* dirty! struct sockaddr usually doesn't suffer for inet6 addresses, fst. */ +-static char *INET6_sprint(struct sockaddr *sap, int numeric) ++static const char *INET6_sprint(struct sockaddr *sap, int numeric) + { + static char buff[128]; + + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) + return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff)); +- if (INET6_rresolve(buff, (struct sockaddr_in6 *) sap, numeric) != 0) ++ if (INET6_rresolve(buff, sizeof(buff), ++ (struct sockaddr_in6 *) sap, numeric) != 0) + return safe_strncpy(buff, _("[UNKNOWN]"), sizeof(buff)); +- return (buff); ++ return (fix_v4_address(buff, &((struct sockaddr_in6 *)sap)->sin6_addr)); + } + + + static int INET6_getsock(char *bufp, struct sockaddr *sap) + { + struct sockaddr_in6 *sin6; ++ char *p; + + sin6 = (struct sockaddr_in6 *) sap; + sin6->sin6_family = AF_INET6; + sin6->sin6_port = 0; ++ sin6->sin6_scope_id = 0; ++ sin6->sin6_flowinfo = 0; + + if (inet_pton(AF_INET6, bufp, sin6->sin6_addr.s6_addr) <= 0) + return (-1); +- ++ p = fix_v4_address(bufp, &sin6->sin6_addr); ++ if (p != bufp) ++ memcpy(bufp, p, strlen(p)+1); + return 16; /* ?;) */ + } + +diff --git a/lib/inet6_gr.c b/lib/inet6_gr.c +index 14f32eb..72b4a66 100644 +--- a/lib/inet6_gr.c ++++ b/lib/inet6_gr.c +@@ -1,4 +1,4 @@ +-/* ++ /* + Modifications: + 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets, + snprintf instead of sprintf +@@ -31,6 +31,7 @@ + #include "pathnames.h" + #include "intl.h" + #include "net-features.h" ++#include "util.h" + + /* neighbour discovery from linux-2.4.0/include/net/neighbour.h */ + +@@ -63,7 +64,7 @@ int rprint_fib6(int ext, int numeric) + struct sockaddr_in6 saddr6, snaddr6; + int num, iflags, metric, refcnt, use, prefix_len, slen; + FILE *fp = fopen(_PATH_PROCNET_ROUTE6, "r"); +- ++ + char addr6p[8][5], saddr6p[8][5], naddr6p[8][5]; + + if (!fp) { +@@ -71,14 +72,18 @@ int rprint_fib6(int ext, int numeric) + printf(_("INET6 (IPv6) not configured in this system.\n")); + return 1; + } +- printf(_("Kernel IPv6 routing table\n")); + +- printf(_("Destination " +- "Next Hop " +- "Flags Metric Ref Use Iface\n")); ++ if (numeric & RTF_CACHE) ++ printf(_("Kernel IPv6 routing cache\n")); ++ else ++ printf(_("Kernel IPv6 routing table\n")); ++ ++ printf(_("Destination " ++ "Next Hop " ++ "Flag Met Ref Use If\n")); + + while (fgets(buff, 1023, fp)) { +- num = sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %08x %08x %08x %08x %s\n", ++ num = sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %08x %08x %08x %08x %15s\n", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7], + &prefix_len, +@@ -87,20 +92,24 @@ int rprint_fib6(int ext, int numeric) + &slen, + naddr6p[0], naddr6p[1], naddr6p[2], naddr6p[3], + naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7], +- &metric, &use, &refcnt, &iflags, iface); +-#if 0 +- if (num < 23) +- continue; +-#endif +- if (!(iflags & RTF_UP)) ++ &metric, &refcnt, &use, &iflags, iface); ++ if (0 && num < 23) + continue; ++ if (iflags & RTF_CACHE) { ++ if (!(numeric & RTF_CACHE)) ++ continue; ++ } else { ++ if (numeric & RTF_CACHE) ++ continue; ++ } ++ + /* Fetch and resolve the target address. */ + snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7]); + inet6_aftype.input(1, addr6, (struct sockaddr *) &saddr6); + snprintf(addr6, sizeof(addr6), "%s/%d", +- inet6_aftype.sprint((struct sockaddr *) &saddr6, 1), ++ inet6_aftype.sprint((struct sockaddr *) &saddr6, numeric), + prefix_len); + + /* Fetch and resolve the nexthop address. */ +@@ -109,10 +118,15 @@ int rprint_fib6(int ext, int numeric) + naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7]); + inet6_aftype.input(1, naddr6, (struct sockaddr *) &snaddr6); + snprintf(naddr6, sizeof(naddr6), "%s", +- inet6_aftype.sprint((struct sockaddr *) &snaddr6, 1)); ++ inet6_aftype.sprint((struct sockaddr *) &snaddr6, numeric)); + + /* Decode the flags. */ +- strcpy(flags, "U"); ++ ++ flags[0]=0; ++ if (iflags & RTF_UP) ++ strcat(flags, "U"); ++ if (iflags & RTF_REJECT) ++ strcat(flags, "!"); + if (iflags & RTF_GATEWAY) + strcat(flags, "G"); + if (iflags & RTF_HOST) +@@ -123,9 +137,19 @@ int rprint_fib6(int ext, int numeric) + strcat(flags, "A"); + if (iflags & RTF_CACHE) + strcat(flags, "C"); ++ if (iflags & RTF_ALLONLINK) ++ strcat(flags, "a"); ++ if (iflags & RTF_EXPIRES) ++ strcat(flags, "e"); ++ if (iflags & RTF_MODIFIED) ++ strcat(flags, "m"); ++ if (iflags & RTF_NONEXTHOP) ++ strcat(flags, "n"); ++ if (iflags & RTF_FLOW) ++ strcat(flags, "f"); + + /* Print the info. */ +- printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n", ++ printf("%-30s %-26s %-4s %-3d %-1d%6d %s\n", + addr6, naddr6, flags, metric, refcnt, use, iface); + } + +@@ -138,14 +162,13 @@ int rprint_cache6(int ext, int numeric) + char buff[4096], iface[16], flags[16]; + char addr6[128], haddr[20], statestr[20]; + struct sockaddr_in6 saddr6; +- int type, num, refcnt, prefix_len, location, state, gc; ++ int type, refcnt, prefix_len, location, state, gc; + long tstamp, expire, ndflags, reachable, stale, delete; + FILE *fp = fopen(_PATH_PROCNET_NDISC, "r"); + char addr6p[8][5], haddrp[6][3]; + + if (!fp) { +- ESYSNOT("nd_print", "ND Table"); +- return 1; ++ return rprint_fib6(ext, numeric | RTF_CACHE); + } + printf(_("Kernel IPv6 Neighbour Cache\n")); + +@@ -160,7 +183,7 @@ int rprint_cache6(int ext, int numeric) + + + while (fgets(buff, 1023, fp)) { +- num = sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %08lx %08lx %08lx %04x %04x %04lx %8s %2s%2s%2s%2s%2s%2s\n", ++ sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %08lx %08lx %08lx %04x %04x %04lx %8s %2s%2s%2s%2s%2s%2s\n", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7], + &location, &prefix_len, &type, &state, &expire, &tstamp, &reachable, &gc, &refcnt, +@@ -194,31 +217,31 @@ int rprint_cache6(int ext, int numeric) + /* Decode the state */ + switch (state) { + case NUD_NONE: +- strcpy(statestr, "NONE"); ++ safe_strncpy(statestr, "NONE", sizeof(statestr)); + break; + case NUD_INCOMPLETE: +- strcpy(statestr, "INCOMPLETE"); ++ safe_strncpy(statestr, "INCOMPLETE", sizeof(statestr)); + break; + case NUD_REACHABLE: +- strcpy(statestr, "REACHABLE"); ++ safe_strncpy(statestr, "REACHABLE", sizeof(statestr)); + break; + case NUD_STALE: +- strcpy(statestr, "STALE"); ++ safe_strncpy(statestr, "STALE", sizeof(statestr)); + break; + case NUD_DELAY: +- strcpy(statestr, "DELAY"); ++ safe_strncpy(statestr, "DELAY", sizeof(statestr)); + break; + case NUD_PROBE: +- strcpy(statestr, "PROBE"); ++ safe_strncpy(statestr, "PROBE", sizeof(statestr)); + break; + case NUD_FAILED: +- strcpy(statestr, "FAILED"); ++ safe_strncpy(statestr, "FAILED", sizeof(statestr)); + break; + case NUD_NOARP: +- strcpy(statestr, "NOARP"); ++ safe_strncpy(statestr, "NOARP", sizeof(statestr)); + break; + case NUD_PERMANENT: +- strcpy(statestr, "PERM"); ++ safe_strncpy(statestr, "PERM", sizeof(statestr)); + break; + default: + snprintf(statestr, sizeof(statestr), "UNKNOWN(%02x)", state); +diff --git a/lib/inet6_sr.c b/lib/inet6_sr.c +index fbfe033..1ad9510 100644 +--- a/lib/inet6_sr.c ++++ b/lib/inet6_sr.c +@@ -33,7 +33,7 @@ + #include "pathnames.h" + #include "intl.h" + #include "net-features.h" +- ++#include "util.h" + + + extern struct aftype inet6_aftype; +@@ -63,7 +63,7 @@ static int INET6_setroute(int action, int options, char **args) + if (*args == NULL) + return (usage()); + +- strcpy(target, *args++); ++ safe_strncpy(target, *args++, sizeof(target)); + if (!strcmp(target, "default")) { + prefix_len = 0; + memset(&sa6, 0, sizeof(sa6)); +@@ -112,7 +112,7 @@ static int INET6_setroute(int action, int options, char **args) + return (usage()); + if (rt.rtmsg_flags & RTF_GATEWAY) + return (usage()); +- strcpy(gateway, *args); ++ safe_strncpy(gateway, *args, sizeof(gateway)); + if (inet6_aftype.input(1, gateway, + (struct sockaddr *) &sa6) < 0) { + inet6_aftype.herror(gateway); +@@ -152,7 +152,7 @@ static int INET6_setroute(int action, int options, char **args) + } + if (devname) { + memset(&ifr, 0, sizeof(ifr)); +- strcpy(ifr.ifr_name, devname); ++ safe_strncpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name)); + + if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) { + perror("SIOGIFINDEX"); +diff --git a/lib/inet_gr.c b/lib/inet_gr.c +index d1e5efc..f67e89d 100644 +--- a/lib/inet_gr.c ++++ b/lib/inet_gr.c +@@ -1,5 +1,5 @@ + /* +- $Id: inet_gr.c,v 1.13 2000/10/08 01:00:44 ecki Exp $ ++ $Id: inet_gr.c,v 1.14 2009/07/08 00:24:03 ecki Exp $ + + Modifications: + 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets +@@ -31,14 +31,15 @@ + #include "intl.h" + #include "net-features.h" + #include "proc.h" ++#include "util.h" + extern struct aftype inet_aftype; + +-extern char *INET_sprintmask(struct sockaddr *sap, int numeric, ++extern char *INET_sprintmask(struct sockaddr *sap, int numeric, + unsigned int netmask); + + int rprint_fib(int ext, int numeric) + { +- char buff[1024], iface[16], flags[64]; ++ char buff[1024], iface[17], flags[64]; + char gate_addr[128], net_addr[128]; + char mask_addr[128]; + int num, iflags, metric, refcnt, use, mss, window, irtt; +@@ -68,19 +69,19 @@ int rprint_fib(int ext, int numeric) + mss = 0; + + fmt = proc_gen_fmt(_PATH_PROCNET_ROUTE, 0, fp, +- "Iface", "%16s", +- "Destination", "%128s", +- "Gateway", "%128s", ++ "Iface", "%15s", ++ "Destination", "%127s", ++ "Gateway", "%127s", + "Flags", "%X", + "RefCnt", "%d", + "Use", "%d", + "Metric", "%d", +- "Mask", "%128s", ++ "Mask", "%127s", + "MTU", "%d", + "Window", "%d", + "IRTT", "%d", + NULL); +- /* "%16s %128s %128s %X %d %d %d %128s %d %d %d\n" */ ++ /* "%15s %127s %127s %X %d %d %d %127s %d %d %d\n" */ + + if (!fmt) + return 1; +@@ -104,18 +105,19 @@ int rprint_fib(int ext, int numeric) + + /* Fetch and resolve the genmask. */ + (void) inet_aftype.input(1, mask_addr, &snet_mask); +- ++ + sin_netmask = (struct sockaddr_in *)&snet_mask; +- strcpy(net_addr, INET_sprintmask(&snet_target, ++ safe_strncpy(net_addr, INET_sprintmask(&snet_target, + (numeric | 0x8000 | (iflags & RTF_HOST? 0x4000: 0)), +- sin_netmask->sin_addr.s_addr)); +- net_addr[15] = '\0'; ++ sin_netmask->sin_addr.s_addr), sizeof(net_addr)); ++ net_addr[15] = '\0'; + +- strcpy(gate_addr, inet_aftype.sprint(&snet_gateway, numeric | 0x4000)); +- gate_addr[15] = '\0'; ++ safe_strncpy(gate_addr, inet_aftype.sprint(&snet_gateway, numeric | 0x4000), ++ sizeof(gate_addr)); ++ gate_addr[15] = '\0'; + +- strcpy(mask_addr, inet_aftype.sprint(&snet_mask, 1)); +- mask_addr[15] = '\0'; ++ safe_strncpy(mask_addr, inet_aftype.sprint(&snet_mask, 1), sizeof(mask_addr)); ++ mask_addr[15] = '\0'; + + /* Decode the flags. */ + flags[0] = '\0'; +@@ -125,7 +127,7 @@ int rprint_fib(int ext, int numeric) + strcat(flags, "G"); + #if HAVE_RTF_REJECT + if (iflags & RTF_REJECT) +- strcpy(flags, "!"); ++ safe_strncpy(flags, "!", sizeof(flags)); + #endif + if (iflags & RTF_HOST) + strcat(flags, "H"); +@@ -205,7 +207,7 @@ int rprint_fib(int ext, int numeric) + + int rprint_cache(int ext, int numeric) + { +- char buff[1024], iface[16], flags[64]; ++ char buff[1024], iface[17], flags[64]; + char gate_addr[128], dest_addr[128], specdst[128]; + char src_addr[128]; + struct sockaddr snet; +@@ -221,17 +223,17 @@ int rprint_cache(int ext, int numeric) + return 1; + } + +- /* Okay, first thing we need to know is the format of the rt_cache. ++ /* Okay, first thing we need to know is the format of the rt_cache. + * I am aware of two possible layouts: + * 2.2.0 + * "Iface\tDestination\tGateway \tFlags\t\tRefCnt\tUse\tMetric\tSource\t\tMTU\tWindow\tIRTT\tTOS\tHHRef\tHHUptod\tSpecDst" +- * "%s\t%08lX\t%08lX\t%8X\t%d\t%u\t%d\t%08lX\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X" ++ * "%s\t%08lX\t%08lX\t%8X\t%d\t%u\t%d\t%08lX\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X" + * + * 2.0.36 + * "Iface\tDestination\tGateway \tFlags\tRefCnt\tUse\tMetric\tSource\t\tMTU\tWindow\tIRTT\tHH\tARP" + * "%s\t%08lX\t%08lX\t%02X\t%d\t%u\t%d\t%08lX\t%d\t%lu\t%u\t%d\t%1d" + */ +- ++ + format = proc_guess_fmt(_PATH_PROCNET_RTCACHE, fp, "IRTT",1,"TOS",2,"HHRef",4,"HHUptod",8,"SpecDst",16,"HH",32,"ARP",64,NULL); + + printf(_("Kernel IP routing cache\n")); +@@ -251,7 +253,7 @@ int rprint_cache(int ext, int numeric) + printf("ERROR: proc_guess_fmt(%s,... returned: %d\n",_PATH_PROCNET_RTCACHE, format); + break; + } +- ++ + rewind(fp); + + if (ext == 1) +@@ -268,21 +270,21 @@ int rprint_cache(int ext, int numeric) + "MSS Window irtt HH Arp\n")); + + fmt = proc_gen_fmt(_PATH_PROCNET_RTCACHE, 0, fp, +- "Iface", "%16s", +- "Destination", "%128s", +- "Gateway", "%128s", ++ "Iface", "%15s", ++ "Destination", "%127s", ++ "Gateway", "%127s", + "Flags", "%X", + "RefCnt", "%d", + "Use", "%d", + "Metric", "%d", +- "Source", "%128s", ++ "Source", "%127s", + "MTU", "%d", + "Window", "%d", + "IRTT", "%d", + "HH", "%d", + "ARP", "%d", + NULL); +- /* "%16s %128s %128s %X %d %d %d %128s %d %d %d %d %d\n" */ ++ /* "%15s %127s %127s %X %d %d %d %127s %d %d %d %d %d\n" */ + } + + if (format == 2) { +@@ -291,23 +293,23 @@ int rprint_cache(int ext, int numeric) + "Flags Metric Ref Use Iface " + "MSS Window irtt TOS HHRef HHUptod SpecDst\n")); + fmt = proc_gen_fmt(_PATH_PROCNET_RTCACHE, 0, fp, +- "Iface", "%16s", +- "Destination", "%128s", +- "Gateway", "%128s", ++ "Iface", "%15s", ++ "Destination", "%127s", ++ "Gateway", "%127s", + "Flags", "%X", + "RefCnt", "%d", + "Use", "%d", + "Metric", "%d", +- "Source", "%128s", ++ "Source", "%127s", + "MTU", "%d", + "Window", "%d", + "IRTT", "%d", + "TOS", "%d", + "HHRef", "%d", + "HHUptod", "%d", +- "SpecDst", "%128s", ++ "SpecDst", "%127s", + NULL); +- /* "%16s %128s %128s %X %d %d %d %128s %d %d %d %d %d %128s\n" */ ++ /* "%15s %127s %127s %X %d %d %d %127s %d %d %d %d %d %127s\n" */ + } + + +@@ -333,27 +335,23 @@ int rprint_cache(int ext, int numeric) + if (num < 12) + continue; + } +- ++ + + /* Fetch and resolve the target address. */ + (void) inet_aftype.input(1, dest_addr, &snet); +- strcpy(dest_addr, inet_aftype.sprint(&snet, numeric)); +- dest_addr[15] = '\0'; ++ safe_strncpy(dest_addr, inet_aftype.sprint(&snet, numeric), sizeof(dest_addr)); + + /* Fetch and resolve the gateway address. */ + (void) inet_aftype.input(1, gate_addr, &snet); +- strcpy(gate_addr, inet_aftype.sprint(&snet, numeric)); +- gate_addr[15] = '\0'; ++ safe_strncpy(gate_addr, inet_aftype.sprint(&snet, numeric), sizeof(gate_addr)); + + /* Fetch and resolve the source. */ + (void) inet_aftype.input(1, src_addr, &snet); +- strcpy(src_addr, inet_aftype.sprint(&snet, numeric)); +- src_addr[15] = '\0'; ++ safe_strncpy(src_addr, inet_aftype.sprint(&snet, numeric), sizeof(src_addr)); + + /* Fetch and resolve the SpecDst addrerss. */ + (void) inet_aftype.input(1, specdst, &snet); +- strcpy(specdst, inet_aftype.sprint(&snet, numeric)); +- specdst[15] = '\0'; ++ safe_strncpy(specdst, inet_aftype.sprint(&snet, numeric), sizeof(specdst)); + + /* Decode the flags. */ + flags[0] = '\0'; +@@ -367,7 +365,7 @@ if (format == 1) { + strcat(flags, "G"); + #if HAVE_RTF_REJECT + if (iflags & RTF_REJECT) +- strcpy(flags, "!"); ++ safe_strncpy(flags, "!", sizeof(flags)); + #endif + if (iflags & RTF_REINSTATE) + strcat(flags, "R"); +diff --git a/lib/inet_sr.c b/lib/inet_sr.c +index 6d010d5..1a876ae 100644 +--- a/lib/inet_sr.c ++++ b/lib/inet_sr.c +@@ -3,6 +3,7 @@ + 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets + 1999-10-07 - Kurt Garloff - for -host and gws: prefer host names + over networks (or even reject) ++ 2003-10-11 - Maik Broemme - gcc 3.x warnign fixes (default: break;) + */ + + #include "config.h" +@@ -104,7 +105,6 @@ static int INET_setroute(int action, int options, char **args) + isnet = 1; break; + case 2: + isnet = 0; break; +- default: + } + + /* Fill in the other fields. */ +diff --git a/lib/interface.c b/lib/interface.c +index f4d2a9a..67f0d8f 100644 +--- a/lib/interface.c ++++ b/lib/interface.c +@@ -1,13 +1,13 @@ + /* Code to manipulate interface information, shared between ifconfig and +- netstat. ++ netstat. + +- 10/1998 partly rewriten by Andi Kleen to support an interface list. +- I don't claim that the list operations are efficient @). ++ 10/1998 partly rewriten by Andi Kleen to support an interface list. ++ I don't claim that the list operations are efficient @). + + 8/2000 Andi Kleen make the list operations a bit more efficient. + People are crazy enough to use thousands of aliases now. + +- $Id: interface.c,v 1.14 2001/02/10 19:31:15 pb Exp $ ++ $Id: interface.c,v 1.35 2011-01-01 03:22:31 ecki Exp $ + */ + + #include "config.h" +@@ -23,6 +23,7 @@ + #include <string.h> + #include <unistd.h> + #include <ctype.h> ++#include <string.h> + + #if HAVE_AFIPX + #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) +@@ -36,7 +37,7 @@ + #include <neteconet/ec.h> + #endif + +-#ifdef HAVE_HWSLIP ++#if HAVE_HWSLIP + #include <linux/if_slip.h> + #include <net/if_arp.h> + #endif +@@ -87,49 +88,58 @@ int procnetdev_vsn = 1; + + int ife_short; + ++int if_list_all = 0; /* do we have requested the complete proc list, yet? */ ++ + static struct interface *int_list, *int_last; + + static int if_readlist_proc(char *); + +-static struct interface *add_interface(char *name) ++static struct interface *if_cache_add(char *name) + { + struct interface *ife, **nextp, *new; + ++ if (!int_list) ++ int_last = NULL; ++ ++ /* the cache is sorted, so if we hit a smaller if, exit */ + for (ife = int_last; ife; ife = ife->prev) { +- int n = nstrcmp(ife->name, name); +- if (n == 0) +- return ife; +- if (n < 0) +- break; ++ int n = nstrcmp(ife->name, name); ++ if (n == 0) ++ return ife; ++ if (n < 0) ++ break; + } +- new(new); +- safe_strncpy(new->name, name, IFNAMSIZ); +- nextp = ife ? &ife->next : &int_list; ++ new(new); ++ safe_strncpy(new->name, name, IFNAMSIZ); ++ nextp = ife ? &ife->next : &int_list; // keep sorting + new->prev = ife; +- new->next = *nextp; +- if (new->next) +- new->next->prev = new; ++ new->next = *nextp; ++ if (new->next) ++ new->next->prev = new; + else +- int_last = new; +- *nextp = new; +- return new; ++ int_last = new; ++ *nextp = new; ++ return new; + } + + struct interface *lookup_interface(char *name) + { +- struct interface *ife = NULL; ++ /* if we have read all, use it */ ++ if (if_list_all) ++ return if_cache_add(name); + +- if (if_readlist_proc(name) < 0) +- return NULL; +- ife = add_interface(name); +- return ife; ++ /* otherwise we read a limited list */ ++ if (if_readlist_proc(name) < 0) ++ return NULL; ++ ++ return if_cache_add(name); + } + + int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) + { + struct interface *ife; + +- if (!int_list && (if_readlist() < 0)) ++ if (!if_list_all && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { + int err = doit(ife, cookie); +@@ -139,13 +149,15 @@ int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) + return 0; + } + +-int free_interface_list(void) ++int if_cache_free(void) + { + struct interface *ife; + while ((ife = int_list) != NULL) { + int_list = ife->next; + free(ife); + } ++ int_last = NULL; ++ if_list_all = 0; + return 0; + } + +@@ -158,7 +170,7 @@ static int if_readconf(void) + int skfd; + + /* SIOCGIFCONF currently seems to only work properly on AF_INET sockets +- (as of 2.1.128) */ ++ (as of 2.1.128) */ + skfd = get_socket_for_af(AF_INET); + if (skfd < 0) { + fprintf(stderr, _("warning: no inet socket available: %s\n"), +@@ -180,7 +192,7 @@ static int if_readconf(void) + } + if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { + /* assume it overflowed and try again */ +- numreqs += 10; ++ numreqs *= 2; + continue; + } + break; +@@ -188,7 +200,7 @@ static int if_readconf(void) + + ifr = ifc.ifc_req; + for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) { +- add_interface(ifr->ifr_name); ++ if_cache_add(ifr->ifr_name); + ifr++; + } + err = 0; +@@ -198,7 +210,7 @@ out: + return err; + } + +-static char *get_name(char *name, char *p) ++char *get_name(char *name, char *p) + { + while (isspace(*p)) + p++; +@@ -206,16 +218,19 @@ static char *get_name(char *name, char *p) + if (isspace(*p)) + break; + if (*p == ':') { /* could be an alias */ +- char *dot = p, *dotname = name; +- *name++ = *p++; +- while (isdigit(*p)) +- *name++ = *p++; +- if (*p != ':') { /* it wasn't, backup */ +- p = dot; +- name = dotname; ++ char *dot = p++; ++ while (*p && isdigit(*p)) p++; ++ if (*p == ':') { ++ /* Yes it is, backup and copy it. */ ++ p = dot; ++ *name++ = *p++; ++ while (*p && isdigit(*p)) { ++ *name++ = *p++; ++ } ++ } else { ++ /* No, it isn't */ ++ p = dot; + } +- if (*p == '\0') +- return NULL; + p++; + break; + } +@@ -225,7 +240,7 @@ static char *get_name(char *name, char *p) + return p; + } + +-static int procnetdev_version(char *buf) ++int procnetdev_version(char *buf) + { + if (strstr(buf, "compressed")) + return 3; +@@ -234,12 +249,12 @@ static int procnetdev_version(char *buf) + return 1; + } + +-static int get_dev_fields(char *bp, struct interface *ife) ++int get_dev_fields(char *bp, struct interface *ife) + { + switch (procnetdev_vsn) { + case 3: + sscanf(bp, +- "%llu %llu %lu %lu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu %lu", ++ "%Lu %Lu %lu %lu %lu %lu %lu %lu %Lu %Lu %lu %lu %lu %lu %lu %lu", + &ife->stats.rx_bytes, + &ife->stats.rx_packets, + &ife->stats.rx_errors, +@@ -259,7 +274,7 @@ static int get_dev_fields(char *bp, struct interface *ife) + &ife->stats.tx_compressed); + break; + case 2: +- sscanf(bp, "%llu %llu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu", ++ sscanf(bp, "%Lu %Lu %lu %lu %lu %lu %Lu %Lu %lu %lu %lu %lu %lu", + &ife->stats.rx_bytes, + &ife->stats.rx_packets, + &ife->stats.rx_errors, +@@ -277,7 +292,7 @@ static int get_dev_fields(char *bp, struct interface *ife) + ife->stats.rx_multicast = 0; + break; + case 1: +- sscanf(bp, "%llu %lu %lu %lu %lu %llu %lu %lu %lu %lu %lu", ++ sscanf(bp, "%Lu %lu %lu %lu %lu %Lu %lu %lu %lu %lu %lu", + &ife->stats.rx_packets, + &ife->stats.rx_errors, + &ife->stats.rx_dropped, +@@ -300,25 +315,21 @@ static int get_dev_fields(char *bp, struct interface *ife) + + static int if_readlist_proc(char *target) + { +- static int proc_read; + FILE *fh; + char buf[512]; + struct interface *ife; + int err; + +- if (proc_read) +- return 0; +- if (!target) +- proc_read = 1; +- + fh = fopen(_PATH_PROCNET_DEV, "r"); + if (!fh) { + fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"), +- _PATH_PROCNET_DEV, strerror(errno)); +- return if_readconf(); +- } +- fgets(buf, sizeof buf, fh); /* eat line */ +- fgets(buf, sizeof buf, fh); ++ _PATH_PROCNET_DEV, strerror(errno)); ++ return -2; ++ } ++ if (fgets(buf, sizeof buf, fh)) ++ /* eat line */; ++ if (fgets(buf, sizeof buf, fh)) ++ /* eat line */; + + #if 0 /* pretty, but can't cope with missing fields */ + fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh, +@@ -349,8 +360,8 @@ static int if_readlist_proc(char *target) + err = 0; + while (fgets(buf, sizeof buf, fh)) { + char *s, name[IFNAMSIZ]; +- s = get_name(name, buf); +- ife = add_interface(name); ++ s = get_name(name, buf); ++ ife = if_cache_add(name); + get_dev_fields(s, ife); + ife->statistics_valid = 1; + if (target && !strcmp(target,name)) +@@ -359,7 +370,6 @@ static int if_readlist_proc(char *target) + if (ferror(fh)) { + perror(_PATH_PROCNET_DEV); + err = -1; +- proc_read = 0; + } + + #if 0 +@@ -369,13 +379,23 @@ static int if_readlist_proc(char *target) + return err; + } + +-int if_readlist(void) +-{ +- int err = if_readlist_proc(NULL); +- if (!err) +- err = if_readconf(); +- return err; +-} ++int if_readlist(void) ++{ ++ /* caller will/should check not to call this too often ++ * (i.e. only if if_list_all == 0 ++ */ ++ int proc_err, conf_err; ++ ++ proc_err = if_readlist_proc(NULL); ++ conf_err = if_readconf(); ++ ++ if_list_all = 1; ++ ++ if (proc_err < 0 && conf_err < 0) ++ return -1; ++ else ++ return 0; ++} + + /* Support for fetching an IPX address */ + +@@ -392,14 +412,14 @@ int if_fetch(struct interface *ife) + { + struct ifreq ifr; + int fd; +- char *ifname = ife->name; ++ char *ifname = ife->name; + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) + return (-1); + ife->flags = ifr.ifr_flags; + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) + memset(ife->hwaddr, 0, 32); + else +@@ -407,53 +427,47 @@ int if_fetch(struct interface *ife) + + ife->type = ifr.ifr_hwaddr.sa_family; + +- strcpy(ifr.ifr_name, ifname); +- if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) +- ife->metric = 0; +- else +- ife->metric = ifr.ifr_metric; +- +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0) + ife->mtu = 0; + else + ife->mtu = ifr.ifr_mtu; + +-#ifdef HAVE_HWSLIP ++#if HAVE_HWSLIP + if (ife->type == ARPHRD_SLIP || ife->type == ARPHRD_CSLIP || + ife->type == ARPHRD_SLIP6 || ife->type == ARPHRD_CSLIP6 || + ife->type == ARPHRD_ADAPT) { + #ifdef SIOCGOUTFILL +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGOUTFILL, &ifr) < 0) + ife->outfill = 0; + else +- ife->outfill = (unsigned int) ifr.ifr_data; ++ ife->outfill = (unsigned long) ifr.ifr_data; + #endif + #ifdef SIOCGKEEPALIVE +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGKEEPALIVE, &ifr) < 0) + ife->keepalive = 0; + else +- ife->keepalive = (unsigned int) ifr.ifr_data; ++ ife->keepalive = (unsigned long) ifr.ifr_data; + #endif + } + #endif + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) + memset(&ife->map, 0, sizeof(struct ifmap)); + else + memcpy(&ife->map, &ifr.ifr_map, sizeof(struct ifmap)); + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) + memset(&ife->map, 0, sizeof(struct ifmap)); + else + ife->map = ifr.ifr_map; + + #ifdef HAVE_TXQUEUELEN +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(skfd, SIOCGIFTXQLEN, &ifr) < 0) + ife->tx_queue_len = -1; /* unknown value */ + else +@@ -466,24 +480,24 @@ int if_fetch(struct interface *ife) + /* IPv4 address? */ + fd = get_socket_for_af(AF_INET); + if (fd >= 0) { +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + ifr.ifr_addr.sa_family = AF_INET; + if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { + ife->has_ip = 1; + ife->addr = ifr.ifr_addr; +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFDSTADDR, &ifr) < 0) + memset(&ife->dstaddr, 0, sizeof(struct sockaddr)); + else + ife->dstaddr = ifr.ifr_dstaddr; + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) + memset(&ife->broadaddr, 0, sizeof(struct sockaddr)); + else + ife->broadaddr = ifr.ifr_broadaddr; + +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) + memset(&ife->netmask, 0, sizeof(struct sockaddr)); + else +@@ -497,7 +511,7 @@ int if_fetch(struct interface *ife) + /* DDP address maybe ? */ + fd = get_socket_for_af(AF_APPLETALK); + if (fd >= 0) { +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { + ife->ddpaddr = ifr.ifr_addr; + ife->has_ddp = 1; +@@ -509,22 +523,22 @@ int if_fetch(struct interface *ife) + /* Look for IPX addresses with all framing types */ + fd = get_socket_for_af(AF_IPX); + if (fd >= 0) { +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (!ipx_getaddr(fd, IPX_FRAME_ETHERII, &ifr)) { + ife->has_ipx_bb = 1; + ife->ipxaddr_bb = ifr.ifr_addr; + } +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (!ipx_getaddr(fd, IPX_FRAME_SNAP, &ifr)) { + ife->has_ipx_sn = 1; + ife->ipxaddr_sn = ifr.ifr_addr; + } +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (!ipx_getaddr(fd, IPX_FRAME_8023, &ifr)) { + ife->has_ipx_e3 = 1; + ife->ipxaddr_e3 = ifr.ifr_addr; + } +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (!ipx_getaddr(fd, IPX_FRAME_8022, &ifr)) { + ife->has_ipx_e2 = 1; + ife->ipxaddr_e2 = ifr.ifr_addr; +@@ -536,7 +550,7 @@ int if_fetch(struct interface *ife) + /* Econet address maybe? */ + fd = get_socket_for_af(AF_ECONET); + if (fd >= 0) { +- strcpy(ifr.ifr_name, ifname); ++ safe_strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) { + ife->ecaddr = ifr.ifr_addr; + ife->has_econet = 1; +@@ -548,29 +562,29 @@ int if_fetch(struct interface *ife) + } + + int do_if_fetch(struct interface *ife) +-{ ++{ + if (if_fetch(ife) < 0) { +- char *errmsg; +- if (errno == ENODEV) { +- /* Give better error message for this case. */ +- errmsg = _("Device not found"); +- } else { +- errmsg = strerror(errno); ++ char *errmsg; ++ if (errno == ENODEV) { ++ /* Give better error message for this case. */ ++ errmsg = _("Device not found"); ++ } else { ++ errmsg = strerror(errno); + } + fprintf(stderr, _("%s: error fetching interface information: %s\n"), + ife->name, errmsg); + return -1; + } +- return 0; ++ return 0; + } + + int do_if_print(struct interface *ife, void *cookie) + { + int *opt_a = (int *) cookie; +- int res; ++ int res; + +- res = do_if_fetch(ife); +- if (res >= 0) { ++ res = do_if_fetch(ife); ++ if (res >= 0) { + if ((ife->flags & IFF_UP) || *opt_a) + ife_print(ife); + } +@@ -579,11 +593,11 @@ int do_if_print(struct interface *ife, void *cookie) + + void ife_print_short(struct interface *ptr) + { +- printf("%-5.5s ", ptr->name); +- printf("%5d %3d", ptr->mtu, ptr->metric); ++ printf("%-8.8s ", ptr->name); ++ printf("%5d ", ptr->mtu); + /* If needed, display the interface statistics. */ + if (ptr->statistics_valid) { +- printf("%8llu %6lu %6lu %6lu", ++ printf("%8llu %6lu %6lu %-6lu ", + ptr->stats.rx_packets, ptr->stats.rx_errors, + ptr->stats.rx_dropped, ptr->stats.rx_fifo_errors); + printf("%8llu %6lu %6lu %6lu ", +@@ -636,8 +650,9 @@ void ife_print_long(struct interface *ptr) + int hf; + int can_compress = 0; + unsigned long long rx, tx, short_rx, short_tx; +- char Rext[5]="b"; +- char Text[5]="b"; ++ const char *Rext = "B"; ++ const char *Text = "B"; ++ static char flags[200]; + + #if HAVE_AFIPX + static struct aftype *ipxtype = NULL; +@@ -650,7 +665,7 @@ void ife_print_long(struct interface *ptr) + #endif + #if HAVE_AFINET6 + FILE *f; +- char addr6[40], devname[20]; ++ char addr6[40], devname[21]; + struct sockaddr_in6 sap; + int plen, scope, dad_status, if_idx; + extern struct aftype inet6_aftype; +@@ -663,39 +678,79 @@ void ife_print_long(struct interface *ptr) + + hf = ptr->type; + ++#if HAVE_HWSLIP + if (hf == ARPHRD_CSLIP || hf == ARPHRD_CSLIP6) + can_compress = 1; ++#endif + + hw = get_hwntype(hf); + if (hw == NULL) + hw = get_hwntype(-1); + +- printf(_("%-9.9s Link encap:%s "), ptr->name, hw->title); +- /* For some hardware types (eg Ash, ATM) we don't print the +- hardware address if it's null. */ +- if (hw->print != NULL && (! (hw_null_address(hw, ptr->hwaddr) && +- hw->suppress_null_addr))) +- printf(_("HWaddr %s "), hw->print(ptr->hwaddr)); +-#ifdef IFF_PORTSEL +- if (ptr->flags & IFF_PORTSEL) { +- printf(_("Media:%s"), if_port_text[ptr->map.port][0]); +- if (ptr->flags & IFF_AUTOMEDIA) +- printf(_("(auto)")); +- } ++ sprintf(flags, "flags=%d<", ptr->flags); ++ /* DONT FORGET TO ADD THE FLAGS IN ife_print_short, too */ ++ if (ptr->flags == 0) ++ strcat(flags,">"); ++ if (ptr->flags & IFF_UP) ++ strcat(flags,_("UP,")); ++ if (ptr->flags & IFF_BROADCAST) ++ strcat(flags,_("BROADCAST,")); ++ if (ptr->flags & IFF_DEBUG) ++ strcat(flags,_("DEBUG,")); ++ if (ptr->flags & IFF_LOOPBACK) ++ strcat(flags,_("LOOPBACK,")); ++ if (ptr->flags & IFF_POINTOPOINT) ++ strcat(flags,_("POINTOPOINT,")); ++ if (ptr->flags & IFF_NOTRAILERS) ++ strcat(flags,_("NOTRAILERS,")); ++ if (ptr->flags & IFF_RUNNING) ++ strcat(flags,_("RUNNING,")); ++ if (ptr->flags & IFF_NOARP) ++ strcat(flags,_("NOARP,")); ++ if (ptr->flags & IFF_PROMISC) ++ strcat(flags,_("PROMISC,")); ++ if (ptr->flags & IFF_ALLMULTI) ++ strcat(flags,_("ALLMULTI,")); ++ if (ptr->flags & IFF_SLAVE) ++ strcat(flags,_("SLAVE,")); ++ if (ptr->flags & IFF_MASTER) ++ strcat(flags,_("MASTER,")); ++ if (ptr->flags & IFF_MULTICAST) ++ strcat(flags,_("MULTICAST,")); ++#ifdef HAVE_DYNAMIC ++ if (ptr->flags & IFF_DYNAMIC) ++ strcat(flags,_("DYNAMIC,")); ++#endif ++ /* DONT FORGET TO ADD THE FLAGS IN ife_print_short */ ++ if (flags[strlen(flags)-1] == ',') ++ flags[strlen(flags)-1] = '>'; ++ else ++ flags[strlen(flags)-1] = 0; ++ ++ ++ printf(_("%s: %s mtu %d"), ++ ptr->name, flags, ptr->mtu); ++#ifdef SIOCSKEEPALIVE ++ if (ptr->outfill || ptr->keepalive) ++ printf(_(" outfill %d keepalive %d"), ++ ptr->outfill, ptr->keepalive); + #endif + printf("\n"); + ++ ++ + #if HAVE_AFINET + if (ptr->has_ip) { +- printf(_(" %s addr:%s "), ap->name, ++ printf(_(" %s %s"), ap->name, + ap->sprint(&ptr->addr, 1)); +- if (ptr->flags & IFF_POINTOPOINT) { +- printf(_(" P-t-P:%s "), ap->sprint(&ptr->dstaddr, 1)); +- } ++ printf(_(" netmask %s"), ap->sprint(&ptr->netmask, 1)); + if (ptr->flags & IFF_BROADCAST) { +- printf(_(" Bcast:%s "), ap->sprint(&ptr->broadaddr, 1)); ++ printf(_(" broadcast %s"), ap->sprint(&ptr->broadaddr, 1)); + } +- printf(_(" Mask:%s\n"), ap->sprint(&ptr->netmask, 1)); ++ if (ptr->flags & IFF_POINTOPOINT) { ++ printf(_(" destination %s"), ap->sprint(&ptr->dstaddr, 1)); ++ } ++ printf("\n"); + } + #endif + +@@ -703,7 +758,7 @@ void ife_print_long(struct interface *ptr) + /* FIXME: should be integrated into interface.c. */ + + if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) { +- while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n", ++ while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n", + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7], + &if_idx, &plen, &scope, &dad_status, devname) != EOF) { +@@ -712,29 +767,30 @@ void ife_print_long(struct interface *ptr) + addr6p[0], addr6p[1], addr6p[2], addr6p[3], + addr6p[4], addr6p[5], addr6p[6], addr6p[7]); + inet6_aftype.input(1, addr6, (struct sockaddr *) &sap); +- printf(_(" inet6 addr: %s/%d"), +- inet6_aftype.sprint((struct sockaddr *) &sap, 1), plen); +- printf(_(" Scope:")); +- switch (scope) { +- case 0: +- printf(_("Global")); +- break; +- case IPV6_ADDR_LINKLOCAL: +- printf(_("Link")); +- break; +- case IPV6_ADDR_SITELOCAL: +- printf(_("Site")); +- break; +- case IPV6_ADDR_COMPATv4: +- printf(_("Compat")); +- break; +- case IPV6_ADDR_LOOPBACK: +- printf(_("Host")); +- break; +- default: +- printf(_("Unknown")); ++ printf(_(" %s %s prefixlen %d"), ++ inet6_aftype.name, ++ inet6_aftype.sprint((struct sockaddr *) &sap, 1), ++ plen); ++ printf(_(" scopeid 0x%x"), scope); ++ ++ flags[0] = '<'; flags[1] = 0; ++ if (scope & IPV6_ADDR_COMPATv4) { ++ strcat(flags, _("compat,")); ++ scope -= IPV6_ADDR_COMPATv4; + } +- printf("\n"); ++ if (scope == 0) ++ strcat(flags, _("global,")); ++ if (scope & IPV6_ADDR_LINKLOCAL) ++ strcat(flags, _("link,")); ++ if (scope & IPV6_ADDR_SITELOCAL) ++ strcat(flags, _("site,")); ++ if (scope & IPV6_ADDR_LOOPBACK) ++ strcat(flags, _("host,")); ++ if (flags[strlen(flags)-1] == ',') ++ flags[strlen(flags)-1] = '>'; ++ else ++ flags[strlen(flags)-1] = 0; ++ printf("%s\n", flags); + } + } + fclose(f); +@@ -747,17 +803,17 @@ void ife_print_long(struct interface *ptr) + + if (ipxtype != NULL) { + if (ptr->has_ipx_bb) +- printf(_(" IPX/Ethernet II addr:%s\n"), +- ipxtype->sprint(&ptr->ipxaddr_bb, 1)); ++ printf(_(" %s Ethernet-II %s\n"), ++ ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_bb, 1)); + if (ptr->has_ipx_sn) +- printf(_(" IPX/Ethernet SNAP addr:%s\n"), +- ipxtype->sprint(&ptr->ipxaddr_sn, 1)); ++ printf(_(" %s Ethernet-SNAP %s\n"), ++ ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_sn, 1)); + if (ptr->has_ipx_e2) +- printf(_(" IPX/Ethernet 802.2 addr:%s\n"), +- ipxtype->sprint(&ptr->ipxaddr_e2, 1)); ++ printf(_(" %s Ethernet802.2 %s\n"), ++ ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_e2, 1)); + if (ptr->has_ipx_e3) +- printf(_(" IPX/Ethernet 802.3 addr:%s\n"), +- ipxtype->sprint(&ptr->ipxaddr_e3, 1)); ++ printf(_(" %s Ethernet802.3 %s\n"), ++ ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_e3, 1)); + } + #endif + +@@ -766,7 +822,7 @@ void ife_print_long(struct interface *ptr) + ddptype = get_afntype(AF_APPLETALK); + if (ddptype != NULL) { + if (ptr->has_ddp) +- printf(_(" EtherTalk Phase 2 addr:%s\n"), ddptype->sprint(&ptr->ddpaddr, 1)); ++ printf(_(" %s %s\n"), ddptype->name, ddptype->sprint(&ptr->ddpaddr, 1)); + } + #endif + +@@ -775,53 +831,30 @@ void ife_print_long(struct interface *ptr) + ectype = get_afntype(AF_ECONET); + if (ectype != NULL) { + if (ptr->has_econet) +- printf(_(" econet addr:%s\n"), ectype->sprint(&ptr->ecaddr, 1)); ++ printf(_(" %s %s\n"), ectype->name, ectype->sprint(&ptr->ecaddr, 1)); + } + #endif + +- printf(" "); +- /* DONT FORGET TO ADD THE FLAGS IN ife_print_short, too */ +- if (ptr->flags == 0) +- printf(_("[NO FLAGS] ")); +- if (ptr->flags & IFF_UP) +- printf(_("UP ")); +- if (ptr->flags & IFF_BROADCAST) +- printf(_("BROADCAST ")); +- if (ptr->flags & IFF_DEBUG) +- printf(_("DEBUG ")); +- if (ptr->flags & IFF_LOOPBACK) +- printf(_("LOOPBACK ")); +- if (ptr->flags & IFF_POINTOPOINT) +- printf(_("POINTOPOINT ")); +- if (ptr->flags & IFF_NOTRAILERS) +- printf(_("NOTRAILERS ")); +- if (ptr->flags & IFF_RUNNING) +- printf(_("RUNNING ")); +- if (ptr->flags & IFF_NOARP) +- printf(_("NOARP ")); +- if (ptr->flags & IFF_PROMISC) +- printf(_("PROMISC ")); +- if (ptr->flags & IFF_ALLMULTI) +- printf(_("ALLMULTI ")); +- if (ptr->flags & IFF_SLAVE) +- printf(_("SLAVE ")); +- if (ptr->flags & IFF_MASTER) +- printf(_("MASTER ")); +- if (ptr->flags & IFF_MULTICAST) +- printf(_("MULTICAST ")); +-#ifdef HAVE_DYNAMIC +- if (ptr->flags & IFF_DYNAMIC) +- printf(_("DYNAMIC ")); +-#endif +- /* DONT FORGET TO ADD THE FLAGS IN ife_print_short */ +- printf(_(" MTU:%d Metric:%d"), +- ptr->mtu, ptr->metric ? ptr->metric : 1); +-#ifdef SIOCSKEEPALIVE +- if (ptr->outfill || ptr->keepalive) +- printf(_(" Outfill:%d Keepalive:%d"), +- ptr->outfill, ptr->keepalive); ++ /* For some hardware types (eg Ash, ATM) we don't print the ++ hardware address if it's null. */ ++ if (hw->print != NULL && (! (hw_null_address(hw, ptr->hwaddr) && ++ hw->suppress_null_addr))) ++ printf(_(" %s %s"), hw->name, hw->print(ptr->hwaddr)); ++ else ++ printf(_(" %s"), hw->name); ++ if (ptr->tx_queue_len != -1) ++ printf(_(" txqueuelen %d"), ptr->tx_queue_len); ++ printf(" (%s)\n", hw->title); ++ ++#ifdef IFF_PORTSEL ++ if (ptr->flags & IFF_PORTSEL) { ++ printf(_(" media %s"), if_port_text[ptr->map.port][0]); ++ if (ptr->flags & IFF_AUTOMEDIA) ++ printf(_("autoselect")); ++ printf("\n"); ++ } + #endif +- printf("\n"); ++ + + /* If needed, display the interface statistics. */ + +@@ -830,55 +863,87 @@ void ife_print_long(struct interface *ptr) + * not for the aliases, although strictly speaking they're shared + * by all addresses. + */ +- printf(" "); +- +- printf(_("RX packets:%llu errors:%lu dropped:%lu overruns:%lu frame:%lu\n"), +- ptr->stats.rx_packets, ptr->stats.rx_errors, +- ptr->stats.rx_dropped, ptr->stats.rx_fifo_errors, +- ptr->stats.rx_frame_errors); +- if (can_compress) +- printf(_(" compressed:%lu\n"), ptr->stats.rx_compressed); +- +- rx = ptr->stats.rx_bytes; ++ rx = ptr->stats.rx_bytes; ++ short_rx = rx * 10; ++ if (rx > 1125899906842624ull) { ++ short_rx /= 1125899906842624ull; ++ Rext = "PiB"; ++ } else if (rx > 1099511627776ull) { ++ short_rx /= 1099511627776ull; ++ Rext = "TiB"; ++ } else if (rx > 1073741824ull) { ++ short_rx /= 1073741824ull; ++ Rext = "GiB"; ++ } else if (rx > 1048576) { ++ short_rx /= 1048576; ++ Rext = "MiB"; ++ } else if (rx > 1024) { ++ short_rx /= 1024; ++ Rext = "KiB"; ++ } + tx = ptr->stats.tx_bytes; +- short_rx = rx * 10; + short_tx = tx * 10; +- if (rx > 1048576) { short_rx /= 1048576; strcpy(Rext, "Mb"); } +- else if (rx > 1024) { short_rx /= 1024; strcpy(Rext, "Kb"); } +- if (tx > 1048576) { short_tx /= 1048576; strcpy(Text, "Mb"); } +- else if (tx > 1024) { short_tx /= 1024; strcpy(Text, "Kb"); } ++ if (tx > 1125899906842624ull) { ++ short_tx /= 1125899906842624ull; ++ Text = "PiB"; ++ } else if (tx > 1099511627776ull) { ++ short_tx /= 1099511627776ull; ++ Text = "TiB"; ++ } else if (tx > 1073741824ull) { ++ short_tx /= 1073741824ull; ++ Text = "GiB"; ++ } else if (tx > 1048576) { ++ short_tx /= 1048576; ++ Text = "MiB"; ++ } else if (tx > 1024) { ++ short_tx /= 1024; ++ Text = "KiB"; ++ } + +- printf(" "); +- printf(_("TX packets:%llu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n"), +- ptr->stats.tx_packets, ptr->stats.tx_errors, ++ printf(" "); ++ printf(_("RX packets %llu bytes %llu (%lu.%lu %s)\n"), ++ ptr->stats.rx_packets, ++ rx, (unsigned long)(short_rx / 10), ++ (unsigned long)(short_rx % 10), Rext); ++ if (can_compress) { ++ printf(" "); ++ printf(_("RX compressed:%lu\n"), ptr->stats.rx_compressed); ++ } ++ printf(" "); ++ printf(_("RX errors %lu dropped %lu overruns %lu frame %lu\n"), ++ ptr->stats.rx_errors, ptr->stats.rx_dropped, ++ ptr->stats.rx_fifo_errors, ptr->stats.rx_frame_errors); ++ ++ ++ printf(" "); ++ printf(_("TX packets %llu bytes %llu (%lu.%lu %s)\n"), ++ ptr->stats.tx_packets, ++ tx, (unsigned long)(short_tx / 10), ++ (unsigned long)(short_tx % 10), Text); ++ if (can_compress) { ++ printf(" "); ++ printf(_("TX compressed %lu\n"), ptr->stats.tx_compressed); ++ } ++ printf(" "); ++ printf(_("TX errors %lu dropped %lu overruns %lu carrier %lu collisions %lu\n"), ++ ptr->stats.tx_errors, + ptr->stats.tx_dropped, ptr->stats.tx_fifo_errors, +- ptr->stats.tx_carrier_errors); +- printf(_(" collisions:%lu "), ptr->stats.collisions); +- if (can_compress) +- printf(_("compressed:%lu "), ptr->stats.tx_compressed); +- if (ptr->tx_queue_len != -1) +- printf(_("txqueuelen:%d "), ptr->tx_queue_len); +- printf("\n "); +- printf(_("RX bytes:%llu (%lu.%lu %s) TX bytes:%llu (%lu.%lu %s)\n"), +- rx, (unsigned long)(short_rx / 10), +- (unsigned long)(short_rx % 10), Rext, +- tx, (unsigned long)(short_tx / 10), +- (unsigned long)(short_tx % 10), Text); ++ ptr->stats.tx_carrier_errors, ptr->stats.collisions); + } + + if ((ptr->map.irq || ptr->map.mem_start || ptr->map.dma || +- ptr->map.base_addr)) { +- printf(" "); ++ ptr->map.base_addr >= 0x100)) { ++ printf(" device "); + if (ptr->map.irq) +- printf(_("Interrupt:%d "), ptr->map.irq); +- if (ptr->map.base_addr >= 0x100) /* Only print devices using it for ++ printf(_("interrupt %d "), ptr->map.irq); ++ if (ptr->map.base_addr >= 0x100) /* Only print devices using it for + I/O maps */ +- printf(_("Base address:0x%x "), ptr->map.base_addr); ++ printf(_("base 0x%x "), ptr->map.base_addr); + if (ptr->map.mem_start) { +- printf(_("Memory:%lx-%lx "), ptr->map.mem_start, ptr->map.mem_end); ++ printf(_("memory 0x%lx-%lx "), ptr->map.mem_start, ptr->map.mem_end); + } + if (ptr->map.dma) +- printf(_("DMA chan:%x "), ptr->map.dma); ++ printf(_(" dma 0x%x"), ptr->map.dma); + printf("\n"); + } + printf("\n"); +diff --git a/lib/ipx.c b/lib/ipx.c +index 0e760a3..837788c 100644 +--- a/lib/ipx.c ++++ b/lib/ipx.c +@@ -42,7 +42,7 @@ + #endif + + /* Display a ipx domain address. */ +-static char *IPX_print(unsigned char *ptr) ++static const char *IPX_print(const char *ptr) + { + static char buff[64]; + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) (ptr - 2); +@@ -73,7 +73,7 @@ static char *IPX_print(unsigned char *ptr) + + + /* Display a ipx domain address. */ +-static char *IPX_sprint(struct sockaddr *sap, int numeric) ++static const char *IPX_sprint(struct sockaddr *sap, int numeric) + { + static char buf[64]; + +@@ -87,12 +87,10 @@ static int IPX_getsock(char *bufp, struct sockaddr *sap) + { + char *sp = bufp, *bp; + unsigned int i; +- unsigned char val; + struct sockaddr_ipx *sipx = (struct sockaddr_ipx *) sap; + + sipx->sipx_port = 0; + +- val = 0; + bp = (char *) sipx->sipx_node; + for (i = 0; i < sizeof(sipx->sipx_node); i++) { + *sp = toupper(*sp); +@@ -133,6 +131,9 @@ static int IPX_input(int type, char *bufp, struct sockaddr *sap) + char *ep; + int nbo; + ++ if (!sai) ++ return (-1); ++ + sai->sipx_family = AF_IPX; + sai->sipx_network = htonl(0); + sai->sipx_node[0] = sai->sipx_node[1] = sai->sipx_node[2] = +diff --git a/lib/ipx_gr.c b/lib/ipx_gr.c +index 3d7ef1d..09c8dcd 100644 +--- a/lib/ipx_gr.c ++++ b/lib/ipx_gr.c +@@ -27,6 +27,7 @@ + #include "net-support.h" + #include "pathnames.h" + #include "intl.h" ++#include "util.h" + + /* UGLY */ + +@@ -38,25 +39,32 @@ int IPX_rprint(int options) + char net[128], router_net[128]; + char router_node[128]; + int num; +- FILE *fp = fopen(_PATH_PROCNET_IPX_ROUTE, "r"); ++ FILE *fp; + struct aftype *ap; + struct sockaddr sa; + +- if ((ap = get_afntype(AF_IPX)) == NULL) { +- EINTERN("lib/ipx_rt.c", "AF_IPX missing"); +- return (-1); ++ fp = fopen(_PATH_PROCNET_IPX_ROUTE1, "r"); ++ ++ if (!fp) { ++ fp = fopen(_PATH_PROCNET_IPX_ROUTE2, "r"); + } + + if (!fp) { +- perror(_PATH_PROCNET_IPX_ROUTE); +- printf(_("IPX not configured in this system.\n")); ++ perror(NULL); ++ printf(_("IPX routing not in file %s or %s found.\n"), _PATH_PROCNET_IPX_ROUTE1, _PATH_PROCNET_IPX_ROUTE2); + return 1; + } + ++ if ((ap = get_afntype(AF_IPX)) == NULL) { ++ EINTERN("lib/ipx_rt.c", "AF_IPX missing"); ++ return (-1); ++ } ++ + printf(_("Kernel IPX routing table\n")); /* xxx */ + printf(_("Destination Router Net Router Node\n")); + +- fgets(buff, 1023, fp); ++ if (fgets(buff, 1023, fp)) ++ /* eat line */; + + while (fgets(buff, 1023, fp)) { + num = sscanf(buff, "%s %s %s", net, router_net, router_node); +@@ -65,15 +73,15 @@ int IPX_rprint(int options) + + /* Fetch and resolve the Destination */ + (void) ap->input(5, net, &sa); +- strcpy(net, ap->sprint(&sa, numeric)); ++ safe_strncpy(net, ap->sprint(&sa, numeric), sizeof(net)); + + /* Fetch and resolve the Router Net */ + (void) ap->input(5, router_net, &sa); +- strcpy(router_net, ap->sprint(&sa, numeric)); ++ safe_strncpy(router_net, ap->sprint(&sa, numeric), sizeof(router_net)); + + /* Fetch and resolve the Router Node */ + (void) ap->input(2, router_node, &sa); +- strcpy(router_node, ap->sprint(&sa, numeric)); ++ safe_strncpy(router_node, ap->sprint(&sa, numeric), sizeof(router_node)); + + printf("%-25s %-25s %-25s\n", net, router_net, router_node); + } +diff --git a/lib/irda.c b/lib/irda.c +index fa147fe..3658673 100644 +--- a/lib/irda.c ++++ b/lib/irda.c +@@ -1,29 +1,31 @@ + /********************************************************************* +- * ++ * + * Filename: irda.c +- * Version: 0.1 +- * Description: A first attempt to make ifconfig understand IrDA ++ * Version: 0.2 ++ * Description: A second attempt to make ifconfig understand IrDA + * Status: Experimental. + * Author: Dag Brattli <dagb@cs.uit.no> + * Created at: Wed Apr 21 09:03:09 1999 + * Modified at: Wed Apr 21 09:17:05 1999 + * Modified by: Dag Brattli <dagb@cs.uit.no> +- * +- * 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 Free Software Foundation; either version 2 of ++ * Modified at: Wed May 1 11:51:44 CEST 2002 ++ * Modified by: Christoph Bartelmus <christoph@bartelmus.de> ++ * ++ * 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 Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. +- * ++ * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * ++ * + ********************************************************************/ + + #include "config.h" +@@ -57,11 +59,11 @@ + * Print hardware address of interface + * + */ +-static char *irda_print(unsigned char *ptr) ++static const char *irda_print(const char *ptr) + { +- static char buff[8]; ++ static char buff[12]; + +- sprintf(&buff[strlen(buff)], "%02x:%02x:%02x:%02x", ptr[3], ptr[2], ++ snprintf(buff, 12, "%02x:%02x:%02x:%02x", ptr[3], ptr[2], + ptr[1], ptr[0]); + + return (buff); +diff --git a/lib/loopback.c b/lib/loopback.c +index 0f08ac2..1b7e9cc 100644 +--- a/lib/loopback.c ++++ b/lib/loopback.c +@@ -32,7 +32,7 @@ + #include "util.h" + + /* Display an UNSPEC address. */ +-static char *pr_unspec(unsigned char *ptr) ++static const char *pr_unspec(const char *ptr) + { + static char buff[64]; + char *pos; +diff --git a/lib/masq_info.c b/lib/masq_info.c +index 45ca689..3a97a98 100644 +--- a/lib/masq_info.c ++++ b/lib/masq_info.c +@@ -6,7 +6,7 @@ + * NET-3 Networking Distribution for the LINUX operating + * system. (net-tools, net-drivers) + * +- * Version: $Id: masq_info.c,v 1.7 2000/10/08 01:00:44 ecki Exp $ ++ * Version: $Id: masq_info.c,v 1.8 2009/09/06 22:52:01 vapier Exp $ + * + * Author: Bernd 'eckes' Eckenfels <net-tools@lina.inka.de> + * Copyright 1999 Bernd Eckenfels, Germany +@@ -119,7 +119,9 @@ static int read_masqinfo(FILE * f, struct masq *mslist, int nmslist) + ms->src.sin_family = AF_INET; + ms->dst.sin_family = AF_INET; + +- if (strcmp("TCP", buf) == 0) ++ if (strcmp("IP", buf) == 0) ++ ms->proto = "ip"; ++ else if (strcmp("TCP", buf) == 0) + ms->proto = "tcp"; + else if (strcmp("UDP", buf) == 0) + ms->proto = "udp"; +@@ -206,10 +208,9 @@ int ip_masq_info(int numeric_host, int numeric_port, int ext) + } + for (i = 0; i < ntotal; i++) + print_masq(&(mslist[i]), numeric_host, numeric_port, ext); +- if (mslist) +- free(mslist); +- + } ++ ++ free(mslist); + return 0; + } + #endif +diff --git a/lib/net-features.h b/lib/net-features.h +index 0de2730..569f4a5 100644 +--- a/lib/net-features.h ++++ b/lib/net-features.h +@@ -20,7 +20,7 @@ + * your option) any later version. + */ + +-/* ++/* + * This needs to be included AFTER the KErnel Header Files + * one of the FEATURE_ should be defined to get the Feature Variable + * definition included +@@ -117,6 +117,9 @@ static char *Features = + "-I18N" + #endif /* I18N */ + ++#if HAVE_SELINUX ++" +SELINUX" ++#endif + + "\nAF: " + #ifdef DFLT_AF +@@ -183,6 +186,12 @@ static char *Features = + "-" + #endif + "ROSE " ++#if HAVE_AFBLUETOOTH ++"+" ++#else ++"-" ++#endif ++"BLUETOOTH" + + "\nHW: " + +@@ -295,6 +304,13 @@ static char *Features = + "-" + #endif + "HDLC/LAPB " ++ ++#if HAVE_HWEUI64 ++"+" ++#else ++"-" ++#endif ++"EUI64 " + ; + + +diff --git a/lib/net-support.h b/lib/net-support.h +index 568fe81..0841170 100644 +--- a/lib/net-support.h ++++ b/lib/net-support.h +@@ -38,15 +38,15 @@ struct aftype { + char *title; + int af; + int alen; +- char *(*print) (unsigned char *); +- char *(*sprint) (struct sockaddr *, int numeric); ++ const char *(*print) (const char *); ++ const char *(*sprint) (struct sockaddr *, int numeric); + int (*input) (int type, char *bufp, struct sockaddr *); + void (*herror) (char *text); + int (*rprint) (int options); + int (*rinput) (int typ, int ext, char **argv); + + /* may modify src */ +- int (*getmask) (char *src, struct sockaddr * mask, char *name); ++ int (*getmask) (char *src, struct sockaddr *mask, char *name); + + int fd; + char *flag_file; +@@ -60,7 +60,7 @@ struct hwtype { + char *title; + int type; + int alen; +- char *(*print) (unsigned char *); ++ const char *(*print) (const char *); + int (*input) (char *, struct sockaddr *); + int (*activate) (int fd); + int suppress_null_addr; +@@ -119,11 +119,12 @@ extern int IPX_rinput(int action, int flags, char **argv); + extern int NETROM_rinput(int action, int flags, char **argv); + extern int AX25_rinput(int action, int flags, char **argv); + extern int X25_rinput(int action, int flags, char **argv); ++extern int ROSE_rinput(int action, int flags, char **argv); + + extern int aftrans_opt(const char *arg); + extern void aftrans_def(char *tool, char *argv0, char *dflt); + +-extern char *get_sname(int socknumber, char *proto, int numeric); ++extern const char *get_sname(int socknumber, const char *proto, int numeric); + + extern int flag_unx; + extern int flag_ipx; +@@ -131,14 +132,16 @@ extern int flag_ax25; + extern int flag_ddp; + extern int flag_netrom; + extern int flag_x25; ++extern int flag_rose; + extern int flag_inet; + extern int flag_inet6; ++extern int flag_bluetooth; + +-extern char afname[]; ++extern char afname[256]; + + #define AFTRANS_OPTS \ + {"ax25", 0, 0, 1}, \ +- {"x25", 0, 0, 1}, \ ++ {"x25", 0, 0, 1}, \ + {"ip", 0, 0, 1}, \ + {"ipx", 0, 0, 1}, \ + {"appletalk", 0, 0, 1}, \ +@@ -146,9 +149,11 @@ extern char afname[]; + {"inet", 0, 0, 1}, \ + {"inet6", 0, 0, 1}, \ + {"ddp", 0, 0, 1}, \ ++ {"rose", 0, 0, 1}, \ + {"unix", 0, 0, 1}, \ ++ {"bluetooth", 0, 0, 1}, \ + {"tcpip", 0, 0, 1} +-#define AFTRANS_CNT 11 ++#define AFTRANS_CNT 12 + + #define EINTERN(file, text) fprintf(stderr, \ + _("%s: Internal Error `%s'.\n"),file,text); +@@ -163,8 +168,8 @@ extern char afname[]; + #define E_NOTFOUND 8 + #define E_SOCK 7 + #define E_LOOKUP 6 +-#define E_VERSION 5 +-#define E_USAGE 4 ++#define E_VERSION EXIT_SUCCESS ++#define E_USAGE EXIT_SUCCESS + #define E_OPTERR 3 + #define E_INTERN 2 + #define E_NOSUPP 1 +@@ -234,7 +239,7 @@ extern char afname[]; + /* this is a 2.0.36 flag from /usr/src/linux/include/linux/route.h */ + #define RTF_NOTCACHED 0x0400 /* this route isn't cached */ + +-#ifdef HAVE_AFECONET ++#if HAVE_AFECONET + #ifndef AF_ECONET + #define AF_ECONET 19 /* Acorn Econet */ + #endif +diff --git a/lib/netrom.c b/lib/netrom.c +index 1de9dc3..dfe1ae3 100644 +--- a/lib/netrom.c ++++ b/lib/netrom.c +@@ -11,7 +11,7 @@ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +- * ++ * + * Changes: + * 980701 {1.21} Arnaldo Carvalho de Melo - GNU gettext instead of catgets, + * strncpy instead of strcpy for +@@ -52,7 +52,7 @@ static char netrom_errmsg[128]; + + extern struct aftype netrom_aftype; + +-static char *NETROM_print(unsigned char *ptr) ++static const char *NETROM_print(const char *ptr) + { + static char buff[8]; + int i; +@@ -71,7 +71,7 @@ static char *NETROM_print(unsigned char *ptr) + + + /* Display an AX.25 socket address. */ +-static char *NETROM_sprint(struct sockaddr *sap, int numeric) ++static const char *NETROM_sprint(struct sockaddr *sap, int numeric) + { + char buf[64]; + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) +@@ -79,10 +79,15 @@ static char *NETROM_sprint(struct sockaddr *sap, int numeric) + return (NETROM_print(((struct sockaddr_ax25 *) sap)->sax25_call.ax25_call)); + } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + static int NETROM_input(int type, char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char *orig, c; + unsigned int i; + +@@ -98,9 +103,8 @@ static int NETROM_input(int type, char *bufp, struct sockaddr *sap) + c = toupper(c); + if (!(isupper(c) || isdigit(c))) { + safe_strncpy(netrom_errmsg, _("Invalid callsign"), sizeof(netrom_errmsg)); +-#ifdef DEBUG +- fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig); + errno = EINVAL; + return (-1); + } +@@ -111,9 +115,8 @@ static int NETROM_input(int type, char *bufp, struct sockaddr *sap) + /* Callsign too long? */ + if ((i == 6) && (*bufp != '-') && (*bufp != '\0')) { + safe_strncpy(netrom_errmsg, _("Callsign too long"), sizeof(netrom_errmsg)); +-#ifdef DEBUG +- fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "netrom_input(%s): %s !\n", netrom_errmsg, orig); + errno = E2BIG; + return (-1); + } +@@ -131,12 +134,12 @@ static int NETROM_input(int type, char *bufp, struct sockaddr *sap) + } + + /* All done. */ +-#ifdef DEBUG +- fprintf(stderr, "netrom_input(%s): ", orig); +- for (i = 0; i < sizeof(ax25_address); i++) +- fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); +- fprintf(stderr, "\n"); +-#endif ++ if (_DEBUG) { ++ fprintf(stderr, "netrom_input(%s): ", orig); ++ for (i = 0; i < sizeof(ax25_address); i++) ++ fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); ++ fprintf(stderr, "\n"); ++ } + + return (0); + } +diff --git a/lib/netrom_gr.c b/lib/netrom_gr.c +index adf54b2..ec82fe8 100644 +--- a/lib/netrom_gr.c ++++ b/lib/netrom_gr.c +@@ -10,7 +10,7 @@ + * + * Changes: + * 980701 {0.02} Arnaldo Carvalho de Melo GNU gettext instead of catgets +- * ++ * + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General +@@ -39,9 +39,7 @@ int NETROM_rprint(int options) + /*int ext = options & FLAG_EXT; + int numeric = options & FLAG_NUM_HOST; */ + +- f1 = fopen(_PATH_PROCNET_NR_NODES, "r"); + if (!f1) perror(_PATH_PROCNET_NR_NODES); +- f2 = fopen(_PATH_PROCNET_NR_NEIGH, "r"); + if (!f2) perror(_PATH_PROCNET_NR_NEIGH); + + if (f1 == NULL || f2 == NULL) { +@@ -50,7 +48,8 @@ int NETROM_rprint(int options) + } + printf(_("Kernel NET/ROM routing table\n")); + printf(_("Destination Mnemonic Quality Neighbour Iface\n")); +- fgets(buffer, 256, f1); ++ if (fgets(buffer, 256, f1)) ++ /* eat line */; + while (fgets(buffer, 256, f1)) { + buffer[9] = 0; + buffer[17] = 0; +@@ -60,7 +59,8 @@ int NETROM_rprint(int options) + qual = atoi(buffer + 24 + 15 * w); + n = atoi(buffer + 32 + 15 * w); + rewind(f2); +- fgets(buffer, 256, f2); ++ if (fgets(buffer, 256, f2)) ++ /* eat line */; + while (fgets(buffer, 256, f2)) { + if (atoi(buffer) == n) { + buffer[15] = 0; +diff --git a/lib/nstrcmp.c b/lib/nstrcmp.c +index 8b1ff30..e05c778 100644 +--- a/lib/nstrcmp.c ++++ b/lib/nstrcmp.c +@@ -1,34 +1,190 @@ + /* Copyright 1998 by Andi Kleen. Subject to the GPL. */ +-/* $Id: nstrcmp.c,v 1.2 1998/11/15 20:11:38 freitag Exp $ */ ++/* rewritten by bernd eckenfels because of complicated alias semantic */ ++/* $Id: nstrcmp.c,v 1.4 2004/06/03 22:49:17 ecki Exp $ */ + #include <ctype.h> + #include <stdlib.h> ++#include <string.h> + #include "util.h" + +-/* like strcmp(), but knows about numbers */ +-int nstrcmp(const char *astr, const char *b) ++ ++/* return numerical :999 suffix or null. sideeffect: replace ':' with \0 */ ++char* cutalias(char* name) ++{ ++ int digit = 0; ++ int pos; ++ ++ for(pos=strlen(name); pos>0; pos--) ++ { ++ if (name[pos-1]==':' && digit) ++ { ++ name[pos-1]='\0'; ++ return name+pos; ++ } ++ if (!isdigit(name[pos-1])) ++ break; ++ digit = 1; ++ } ++ return NULL; ++} ++ ++ ++/* return index of last non digit or -1 if it does not end with digits */ ++int rindex_nondigit(char *name) ++{ ++ int pos = strlen(name); ++ ++ for(pos=strlen(name); pos>0; pos--) ++ { ++ if (!isdigit(name[pos-1])) ++ return pos; ++ } ++ return 0; ++} ++ ++ ++/* like strcmp(), but knows about numbers and ':' alias suffix */ ++int nstrcmp(const char *ap, const char *bp) ++{ ++ char *a = xstrdup(ap); ++ char *b = xstrdup(bp); ++ char *an, *bn; ++ int av = 0, bv = 0; ++ char *aalias=cutalias(a); ++ char *balias=cutalias(b); ++ int aindex=rindex_nondigit(a); ++ int bindex=rindex_nondigit(b); ++ int complen=(aindex<bindex)?aindex:bindex; ++ int res = strncmp(a, b, complen); ++ ++ if (res != 0) { ++ goto out; ++ } ++ ++ if (aindex > bindex) { ++ res = 1; ++ goto out; ++ } ++ ++ if (aindex < bindex) { ++ res = -1; ++ goto out; ++ } ++ ++ an = a+aindex; ++ bn = b+bindex; ++ ++ av = atoi(an); ++ bv = atoi(bn); ++ ++ if (av < bv) { ++ res = -1; ++ goto out; ++ } ++ ++ if (av > bv) { ++ res = 1; ++ goto out; ++ } ++ ++ res = strcmp(a, b); ++ if (res != 0) { ++ goto out; ++ } ++ ++ av = -1; ++ if (aalias != NULL) ++ av = atoi(aalias); ++ ++ bv = -1; ++ if (balias != NULL) ++ bv = atoi(balias); ++ ++ if (av < bv) { ++ res = -1; ++ goto out; ++ } ++ ++ if (av > bv) { ++ res = 1; ++ goto out; ++ } ++ ++ if (aalias && balias) { ++ res = strcmp(aalias, balias); ++ } ++ ++out: ++ ++ free(a); free(b); ++ ++ return res; ++} ++ ++ ++#ifdef NSTRCMP_TEST ++ ++int cs(int s) ++{ ++ if (s < 0) return -1; ++ if (s > 0) return 1; ++ return 0; ++} ++ ++ ++int dotest(char* a, char* b, int exp) ++{ ++ int res = nstrcmp(a, b); ++ int err = (cs(res) != cs(exp)); ++ printf("nstrcmp(\"%s\", \"%s\")=%d %d %s\n", a, b, res, exp, err?"WRONG":"OK"); ++ return err; ++} ++ ++int main() + { +- const char *a = astr; +- +- while (*a == *b) { +- if (*a == '\0') +- return 0; +- a++; +- b++; +- } +- if (isdigit(*a)) { +- if (!isdigit(*b)) +- return -1; +- while (a > astr) { +- a--; +- if (!isdigit(*a)) { +- a++; +- break; +- } +- if (!isdigit(*b)) +- return -1; +- b--; +- } +- return atoi(a) > atoi(b) ? 1 : -1; +- } +- return *a - *b; ++ int err = 0; ++ ++ err |= dotest("eth1", "eth1", 0); ++ err |= dotest("eth0:1", "eth0:1", 0); ++ err |= dotest("lan", "lan", 0); ++ err |= dotest("100", "100", 0); ++ err |= dotest("", "", 0); ++ err |= dotest(":", ":", 0); ++ err |= dotest("a:b:c", "a:b:c", 0); ++ err |= dotest("a:", "a:", 0); ++ err |= dotest(":a", ":a", 0); ++ ++ err |= dotest("a", "aa", -1); ++ err |= dotest("eth0", "eth1", -1); ++ err |= dotest("eth1", "eth20", -1); ++ err |= dotest("eth20", "eth100", -1); ++ err |= dotest("eth1", "eth13", -1); ++ err |= dotest("eth", "eth2", -1); ++ err |= dotest("eth0:1", "eth0:2", -1); ++ err |= dotest("eth1:10", "eth13:10", -1); ++ err |= dotest("eth1:1", "eth1:13", -1); ++ err |= dotest("a", "a:", -1); ++ ++ err |= dotest("aa", "a", 1); ++ err |= dotest("eth2", "eth1", 1); ++ err |= dotest("eth13", "eth1", 1); ++ err |= dotest("eth2", "eth", 1); ++ err |= dotest("eth2:10", "eth2:1", 1); ++ err |= dotest("eth2:5", "eth2:4", 1); ++ err |= dotest("eth3:2", "eth2:3", 1); ++ err |= dotest("eth13:1", "eth1:0", 1); ++ err |= dotest("a:", "a", 1); ++ err |= dotest("a1b12", "a1b2", 1); ++ ++ err |= dotest("eth1", "eth01", 1); ++ err |= dotest("eth01", "eth1", -1); ++ err |= dotest("eth1:1", "eth01:1", 1); ++ err |= dotest("eth01:1", "eth1:1", -1); ++ err |= dotest("eth1:1", "eth01:01", 1); ++ err |= dotest("eth1:01", "eth01:1", 1); ++ err |= dotest("eth01:1", "eth1:01", -1); ++ err |= dotest("eth01:01", "eth1:1", -1); ++ ++ return err; + } ++ ++#endif +diff --git a/lib/pathnames.h b/lib/pathnames.h +index 1f7fefb..14b051c 100644 +--- a/lib/pathnames.h ++++ b/lib/pathnames.h +@@ -1,9 +1,8 @@ +- + /* +- * lib/pathnames.h This file contains the definitions of the path ++ * lib/pathnames.h This file contains the definitions of the path + * names used by the NET-LIB. + * +- * NET-LIB ++ * NET-LIB + * + * Version: lib/pathnames.h 1.37 (1997-08-23) + * +@@ -17,6 +16,12 @@ + #define _PATH_PROCNET_TCP6 "/proc/net/tcp6" + #define _PATH_PROCNET_UDP "/proc/net/udp" + #define _PATH_PROCNET_UDP6 "/proc/net/udp6" ++#define _PATH_PROCNET_UDPLITE "/proc/net/udplite" ++#define _PATH_PROCNET_UDPLITE6 "/proc/net/udplite6" ++#define _PATH_PROCNET_SCTPEPTS "/proc/net/sctp/eps" ++#define _PATH_PROCNET_SCTP6EPTS "/proc/net/sctp6/eps" ++#define _PATH_PROCNET_SCTPASSOCS "/proc/net/sctp/assocs" ++#define _PATH_PROCNET_SCTP6ASSOCS "/proc/net/sctp6/assocs" + #define _PATH_PROCNET_RAW "/proc/net/raw" + #define _PATH_PROCNET_RAW6 "/proc/net/raw6" + #define _PATH_PROCNET_UNIX "/proc/net/unix" +@@ -29,8 +34,10 @@ + #define _PATH_PROCNET_NR_NODES "/proc/net/nr_nodes" + #define _PATH_PROCNET_ARP "/proc/net/arp" + #define _PATH_PROCNET_AX25 "/proc/net/ax25" +-#define _PATH_PROCNET_IPX "/proc/net/ipx" +-#define _PATH_PROCNET_IPX_ROUTE "/proc/net/ipx_route" ++#define _PATH_PROCNET_IPX_SOCKET1 "/proc/net/ipx/socket" ++#define _PATH_PROCNET_IPX_SOCKET2 "/proc/net/ipx" ++#define _PATH_PROCNET_IPX_ROUTE1 "/proc/net/ipx/route" ++#define _PATH_PROCNET_IPX_ROUTE2 "/proc/net/ipx_route" + #define _PATH_PROCNET_ATALK "/proc/net/appletalk" + #define _PATH_PROCNET_IP_BLK "/proc/net/ip_block" + #define _PATH_PROCNET_IP_FWD "/proc/net/ip_forward" +@@ -42,9 +49,12 @@ + #define _PATH_PROCNET_RARP "/proc/net/rarp" + #define _PATH_ETHERS "/etc/ethers" + #define _PATH_PROCNET_ROSE_ROUTE "/proc/net/rose_routes" +-#define _PATH_PROCNET_X25 "/proc/net/x25" +-#define _PATH_PROCNET_X25_ROUTE "/proc/net/x25_routes" ++#define _PATH_PROCNET_X25 "/proc/net/x25" ++#define _PATH_PROCNET_X25_ROUTE "/proc/net/x25/route" + #define _PATH_PROCNET_DEV_MCAST "/proc/net/dev_mcast" ++#define _PATH_PROCNET_ATALK_ROUTE "/proc/net/atalk_route" ++#define _PATH_SYS_BLUETOOTH_L2CAP "/sys/class/bluetooth/l2cap" ++#define _PATH_SYS_BLUETOOTH_RFCOMM "/sys/class/bluetooth/rfcomm" + + /* pathname for the netlink device */ + #define _PATH_DEV_ROUTE "/dev/route" +diff --git a/lib/ppp.c b/lib/ppp.c +index 8bf1499..27d660c 100644 +--- a/lib/ppp.c ++++ b/lib/ppp.c +@@ -8,7 +8,7 @@ + * Copyright 1993 MicroWalt Corporation + * + * Modified by Alan Cox, May 94 to cover NET-3 +- * ++ * + * Changes: + * 980701 {1.12} Arnaldo Carvalho de Melo - GNU gettext instead of catgets + * +diff --git a/lib/proc.c b/lib/proc.c +index bf34dbe..8e4711d 100644 +--- a/lib/proc.c ++++ b/lib/proc.c +@@ -1,11 +1,14 @@ + /* Tolerant /proc file parser. Copyright 1998 Andi Kleen */ +-/* $Id: proc.c,v 1.4 1999/01/05 20:54:00 philip Exp $ */ +-/* Fixme: cannot currently cope with removed fields */ ++/* $Id: proc.c,v 1.5 2007/12/01 18:44:57 ecki Exp $ */ ++/* Fixme: cannot currently cope with removed fields */ + + #include <string.h> + #include <stdarg.h> + #include <stdio.h> ++#include <stdlib.h> + #include <ctype.h> ++#include <unistd.h> ++#include "util.h" + + /* Caller must free return string. */ + +@@ -46,10 +49,10 @@ char *proc_gen_fmt(char *name, int more, FILE * fh,...) + name, title); + return NULL; + } +- return strdup(format); ++ return xstrdup(format); + } + +-/* ++/* + * this will generate a bitmask of present/missing fields in the header of + * a /proc file. + */ +@@ -72,3 +75,22 @@ int proc_guess_fmt(char *name, FILE *fh, ...) + va_end(ap); + return flag; + } ++ ++ ++FILE *proc_fopen(const char *name) ++{ ++ static char *buffer; ++ static size_t pagesz; ++ FILE *fd = fopen(name, "r"); ++ ++ if (fd == NULL) ++ return NULL; ++ ++ if (!buffer) { ++ pagesz = getpagesize(); ++ buffer = malloc(pagesz); ++ } ++ ++ setvbuf(fd, buffer, _IOFBF, pagesz); ++ return fd; ++} +diff --git a/lib/proc.h b/lib/proc.h +index 91f803c..379de23 100644 +--- a/lib/proc.h ++++ b/lib/proc.h +@@ -1,5 +1,7 @@ +- +- +-/* Generate a suitable scanf format for a column title line */ ++/* ++ * prototypes for proc.c ++ */ + char *proc_gen_fmt(char *name, int more, FILE * fh,...); + int proc_guess_fmt(char *name, FILE* fh,...); ++FILE *proc_fopen(const char *name); ++ +diff --git a/lib/rose.c b/lib/rose.c +index 381226b..6286cb1 100644 +--- a/lib/rose.c ++++ b/lib/rose.c +@@ -34,6 +34,7 @@ + #include "net-support.h" + #include "pathnames.h" + #include "intl.h" ++#include "util.h" + + #ifndef _NETROSE_ROSE_H + #include <linux/ax25.h> +@@ -53,8 +54,8 @@ static char ROSE_errmsg[128]; + + extern struct aftype rose_aftype; + +-static char * +- ROSE_print(unsigned char *ptr) ++static const char * ++ ROSE_print(const char *ptr) + { + static char buff[12]; + +@@ -64,7 +65,7 @@ static char * + } + + /* Display a ROSE socket address. */ +-static char * ++static const char * + ROSE_sprint(struct sockaddr *sap, int numeric) + { + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) +@@ -73,7 +74,6 @@ static char * + return (ROSE_print(((struct sockaddr_rose *) sap)->srose_addr.rose_addr)); + } + +- + static int ROSE_input(int type, char *bufp, struct sockaddr *sap) + { + char *ptr; +@@ -84,10 +84,7 @@ static int ROSE_input(int type, char *bufp, struct sockaddr *sap) + + /* Node address the correct length ? */ + if (strlen(bufp) != 10) { +- strcpy(ROSE_errmsg, _("Node address must be ten digits")); +-#ifdef DEBUG +- fprintf(stderr, "rose_input(%s): %s !\n", ROSE_errmsg, orig); +-#endif ++ safe_strncpy(ROSE_errmsg, _("Node address must be ten digits"), sizeof(ROSE_errmsg)); + errno = EINVAL; + return (-1); + } +@@ -98,13 +95,6 @@ static int ROSE_input(int type, char *bufp, struct sockaddr *sap) + } + + /* All done. */ +-#ifdef DEBUG +- fprintf(stderr, "rose_input(%s): ", orig); +- for (i = 0; i < sizeof(rose_address); i++) +- fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); +- fprintf(stderr, "\n"); +-#endif +- + return (0); + } + +diff --git a/lib/rose_gr.c b/lib/rose_gr.c +index cf0a60a..a0858fd 100644 +--- a/lib/rose_gr.c ++++ b/lib/rose_gr.c +@@ -53,7 +53,8 @@ int ROSE_rprint(int options) + } + printf(_("Kernel ROSE routing table\n")); + printf(_("Destination Iface Use\n")); +- fgets(buffer, 256, f); ++ if (fgets(buffer, 256, f)) ++ /* eat line */; + while (fgets(buffer, 256, f)) { + buffer[9] = 0; + buffer[14] = 0; +diff --git a/lib/strip.c b/lib/strip.c +index fd396ba..ced2325 100644 +--- a/lib/strip.c ++++ b/lib/strip.c +@@ -38,8 +38,8 @@ + + extern struct hwtype strip_hwtype; + +-static char * +-pr_strip(unsigned char *ptr) ++static const char * ++pr_strip(const char *ptr) + { + static char buff[64]; + if(ptr[1]) +diff --git a/lib/tr.c b/lib/tr.c +index 8d86aa7..c5314da 100644 +--- a/lib/tr.c ++++ b/lib/tr.c +@@ -2,7 +2,7 @@ + * lib/tr.c This file contains an implementation of the "Tokenring" + * support functions. + * +- * Version: $Id: tr.c,v 1.8 2000/02/02 08:56:30 freitag Exp $ ++ * Version: $Id: tr.c,v 1.9 2005/05/16 03:15:12 ecki Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation +@@ -30,10 +30,16 @@ + #include "net-support.h" + #include "pathnames.h" + #include "intl.h" ++#include "util.h" + ++ ++/* actual definition at the end of file */ + extern struct hwtype tr_hwtype; ++#ifdef ARPHRD_IEEE802_TR ++extern struct hwtype tr_hwtype1; ++#endif + +-static char *pr_tr(unsigned char *ptr) ++static const char *pr_tr(const char *ptr) + { + static char buff[64]; + +@@ -42,16 +48,31 @@ static char *pr_tr(unsigned char *ptr) + (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) + ); + return (buff); +-} ++ } + ++#ifdef DEBUG ++#define _DEBUG 1 ++#else ++#define _DEBUG 0 ++#endif + + static int in_tr(char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char c, *orig; + int i, val; + ++#ifdef ARPHRD_IEEE802_TR ++ if (kernel_version() < KRELEASE(2,3,30)) { ++ sap->sa_family = tr_hwtype.type; ++ } else { ++ sap->sa_family = tr_hwtype1.type; ++ } ++#else + sap->sa_family = tr_hwtype.type; ++ #warning "Limited functionality, no support for ARPHRD_IEEE802_TR (old kernel headers?)" ++#endif ++ + ptr = sap->sa_data; + + i = 0; +@@ -66,9 +87,8 @@ static int in_tr(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_tr(%s): invalid token ring address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_tr(%s): invalid token ring address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -81,9 +101,8 @@ static int in_tr(char *bufp, struct sockaddr *sap) + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else { +-#ifdef DEBUG +- fprintf(stderr, _("in_tr(%s): invalid token ring address!\n"), orig); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, _("in_tr(%s): invalid token ring address!\n"), orig); + errno = EINVAL; + return (-1); + } +@@ -92,28 +111,21 @@ static int in_tr(char *bufp, struct sockaddr *sap) + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { +- if (i == TR_ALEN) { +-#ifdef DEBUG ++ if (_DEBUG && i == TR_ALEN) + fprintf(stderr, _("in_tr(%s): trailing : ignored!\n"), +- orig) +-#endif +- ; /* nothing */ +- } ++ orig); + bufp++; + } + } + + /* That's it. Any trailing junk? */ +- if ((i == TR_ALEN) && (*bufp != '\0')) { +-#ifdef DEBUG ++ if (_DEBUG && (i == TR_ALEN) && (*bufp != '\0')) { + fprintf(stderr, _("in_tr(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +-#endif + } +-#ifdef DEBUG +- fprintf(stderr, "in_tr(%s): %s\n", orig, pr_tr(sap->sa_data)); +-#endif ++ if (_DEBUG) ++ fprintf(stderr, "in_tr(%s): %s\n", orig, pr_tr(sap->sa_data)); + + return (0); + } +diff --git a/lib/tunnel.c b/lib/tunnel.c +index 19606c1..8a160bf 100644 +--- a/lib/tunnel.c ++++ b/lib/tunnel.c +@@ -21,7 +21,7 @@ + + extern struct hwtype ether_hwtype; + +-static char *pr_tunnel(unsigned char *ptr) ++static const char *pr_tunnel(const char *ptr) + { + return (""); + } +diff --git a/lib/unix.c b/lib/unix.c +index fb4dcce..936cd48 100644 +--- a/lib/unix.c ++++ b/lib/unix.c +@@ -32,7 +32,7 @@ + + + /* Display an UNSPEC address. */ +-static char *UNSPEC_print(unsigned char *ptr) ++static const char *UNSPEC_print(const char *ptr) + { + static char buff[64]; + char *pos; +@@ -48,7 +48,7 @@ static char *UNSPEC_print(unsigned char *ptr) + + + /* Display an UNSPEC socket address. */ +-static char *UNSPEC_sprint(struct sockaddr *sap, int numeric) ++static const char *UNSPEC_sprint(struct sockaddr *sap, int numeric) + { + static char buf[64]; + +@@ -61,14 +61,14 @@ static char *UNSPEC_sprint(struct sockaddr *sap, int numeric) + #if HAVE_AFUNIX + + /* Display a UNIX domain address. */ +-static char *UNIX_print(unsigned char *ptr) ++static const char *UNIX_print(const char *ptr) + { + return (ptr); + } + + + /* Display a UNIX domain address. */ +-static char *UNIX_sprint(struct sockaddr *sap, int numeric) ++static const char *UNIX_sprint(struct sockaddr *sap, int numeric) + { + static char buf[64]; + +diff --git a/lib/util-ank.c b/lib/util-ank.c +index 43a7f1c..b077f35 100644 +--- a/lib/util-ank.c ++++ b/lib/util-ank.c +@@ -293,7 +293,7 @@ int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits) + return 0; + } + +-const char *format_host(int af, void *addr, __u8 *abuf, int alen) ++const char *format_host(int af, void *addr, char *abuf, int alen) + { + #ifdef RESOLVE_HOSTNAMES + if (resolve_hosts) { +diff --git a/lib/util.c b/lib/util.c +index ac932f4..0397f1e 100644 +--- a/lib/util.c ++++ b/lib/util.c +@@ -1,4 +1,4 @@ +-/* Copyright 1998 by Andi Kleen. Subject to the GPL. */ ++/* Copyright 1998 by Andi Kleen. Subject to the GPL. */ + /* $Id: util.c,v 1.4 1998/11/17 15:17:02 freitag Exp $ */ + #include <stdio.h> + #include <stdlib.h> +@@ -22,6 +22,15 @@ void *xmalloc(size_t sz) + return p; + } + ++/* Like strdup, but oom() instead of NULL */ ++char *xstrdup(const char *s) ++{ ++ char *d = strdup(s); ++ if (!d) ++ oom(); ++ return d; ++} ++ + void *xrealloc(void *oldp, size_t sz) + { + void *p = realloc(oldp, sz); +@@ -33,19 +42,19 @@ void *xrealloc(void *oldp, size_t sz) + int kernel_version(void) + { + struct utsname uts; +- int major, minor, patch; ++ int major, minor, patch=0; + + if (uname(&uts) < 0) + return -1; +- if (sscanf(uts.release, "%d.%d.%d", &major, &minor, &patch) != 3) ++ if (sscanf(uts.release, "%d.%d.%d", &major, &minor, &patch) < 2) + return -1; + return KRELEASE(major, minor, patch); + } + + +-/* Like strncpy but make sure the resulting string is always 0 terminated. */ ++/* Like strncpy but make sure the resulting string is always 0 terminated. */ + char *safe_strncpy(char *dst, const char *src, size_t size) +-{ ++{ + dst[size-1] = '\0'; +- return strncpy(dst,src,size-1); ++ return strncpy(dst,src,size-1); + } +diff --git a/lib/util.h b/lib/util.h +index 6acb158..b7598e8 100644 +--- a/lib/util.h ++++ b/lib/util.h +@@ -2,6 +2,7 @@ + + void *xmalloc(size_t sz); + void *xrealloc(void *p, size_t sz); ++char *xstrdup(const char *src); + + #define new(p) ((p) = xmalloc(sizeof(*(p)))) + +@@ -12,5 +13,8 @@ int kernel_version(void); + + int nstrcmp(const char *, const char *); + +-char *safe_strncpy(char *dst, const char *src, size_t size); ++char *safe_strncpy(char *dst, const char *src, size_t size); + ++ ++#define netmin(a,b) ((a)<(b) ? (a) : (b)) ++#define netmax(a,b) ((a)>(b) ? (a) : (b)) +diff --git a/lib/x25.c b/lib/x25.c +index 1ffb569..45de5af 100644 +--- a/lib/x25.c ++++ b/lib/x25.c +@@ -38,6 +38,7 @@ + #include "net-locale.h" + #endif + #include "intl.h" ++#include "util.h" + + static char X25_errmsg[128]; + +@@ -50,8 +51,8 @@ extern struct aftype x25_aftype; + #endif + + +-static char * +-X25_print(unsigned char *ptr) ++static const char * ++X25_print(const char *ptr) + { + static char buff[X25_ADDR_LEN+1]; + +@@ -63,7 +64,7 @@ X25_print(unsigned char *ptr) + + + /* Display an X.25 socket address. */ +-static char * ++static const char * + X25_sprint(struct sockaddr *sap, int numeric) + { + if (sap->sa_family == 0xFFFF || sap->sa_family == 0) +@@ -78,7 +79,7 @@ X25_sprint(struct sockaddr *sap, int numeric) + static int + X25_input(int type, char *bufp, struct sockaddr *sap) + { +- unsigned char *ptr; ++ char *ptr; + char *p; + unsigned int sigdigits; + +@@ -88,9 +89,11 @@ X25_input(int type, char *bufp, struct sockaddr *sap) + + /* Address the correct length ? */ + if (strlen(bufp)>18) { +- strcpy(X25_errmsg, _("Address can't exceed eighteen digits with sigdigits")); ++ safe_strncpy(X25_errmsg, ++ _("Address can't exceed eighteen digits with sigdigits"), ++ sizeof(X25_errmsg)); + #ifdef DEBUG +- fprintf(stderr, "x25_input(%s): %s !\n", X25_errmsg, orig); ++ fprintf(stderr, "x25_input(%s): %s !\n", bufp, X25_errmsg); + #endif + errno = EINVAL; + return(-1); +@@ -105,10 +108,11 @@ X25_input(int type, char *bufp, struct sockaddr *sap) + } + + if (strlen(bufp) < 1 || strlen(bufp) > 15 || sigdigits > strlen(bufp)) { +- *p = '/'; +- strcpy(X25_errmsg, _("Invalid address")); ++ if (p != NULL) ++ *p = '/'; ++ safe_strncpy(X25_errmsg, _("Invalid address"), sizeof(X25_errmsg)); + #ifdef DEBUG +- fprintf(stderr, "x25_input(%s): %s !\n", X25_errmsg, orig); ++ fprintf(stderr, "x25_input(%s): %s !\n", bufp, X25_errmsg); + #endif + errno = EINVAL; + return(-1); +@@ -118,10 +122,7 @@ X25_input(int type, char *bufp, struct sockaddr *sap) + + /* All done. */ + #ifdef DEBUG +- fprintf(stderr, "x25_input(%s): ", orig); +- for (i = 0; i < sizeof(x25_address); i++) +- fprintf(stderr, "%02X ", sap->sa_data[i] & 0377); +- fprintf(stderr, "\n"); ++ fprintf(stderr, "x25_input(%s)\n", bufp); + #endif + + return sigdigits; +@@ -152,7 +153,7 @@ struct hwtype x25_hwtype = { + }; + + struct aftype x25_aftype = +-{ ++{ + "x25", NULL, /*"CCITT X.25", */ AF_X25, X25_ADDR_LEN, + X25_print, X25_sprint, X25_input, X25_herror, + X25_rprint, X25_rinput, NULL /* getmask */, +diff --git a/lib/x25_gr.c b/lib/x25_gr.c +index 187fc05..79682e0 100644 +--- a/lib/x25_gr.c ++++ b/lib/x25_gr.c +@@ -37,6 +37,7 @@ + #include <string.h> + #include "net-support.h" + #include "pathnames.h" ++#include "proc.h" + #define EXTERN + #if 0 + #include "net-locale.h" +@@ -48,9 +49,18 @@ + #define X25_ADDR_LEN 16 + #endif + ++static FILE *proc_fopen_x25_route(void) ++{ ++ FILE *ret = proc_fopen(_PATH_PROCNET_X25_ROUTE); ++ if (ret) ++ return ret; ++ /* try old linux-2.4 name */ ++ return proc_fopen("/proc/net/x25_routes"); ++} ++ + int X25_rprint(int options) + { +- FILE *f=fopen(_PATH_PROCNET_X25_ROUTE, "r"); ++ FILE *f=proc_fopen_x25_route(); + char buffer[256]; + char *p; + int digits; +@@ -62,7 +72,8 @@ int X25_rprint(int options) + } + printf( _("Kernel X.25 routing table\n")); /* xxx */ + printf( _("Destination Iface\n")); /* xxx */ +- fgets(buffer,256,f); ++ if (fgets(buffer,256,f)) ++ /* eat line */; + while(fgets(buffer,256,f)) + { + p = strchr(buffer,'\n'); +diff --git a/lib/x25_sr.c b/lib/x25_sr.c +index 8637c98..fde79dc 100644 +--- a/lib/x25_sr.c ++++ b/lib/x25_sr.c +@@ -38,6 +38,7 @@ + #include "net-locale.h" + #endif + #include "intl.h" ++#include "util.h" + + #include "net-features.h" + +@@ -64,10 +65,10 @@ static int X25_setroute(int action, int options, char **args) + if (*args == NULL) + return(usage()); + +- strcpy(target, *args++); ++ safe_strncpy(target, *args++, sizeof(target)); + + /* Clean out the x25_route_struct structure. */ +- memset((char *) &rt, 0, sizeof(struct x25_route_struct)); ++ memset((char *) &rt, 0, sizeof(rt)); + + + if ((sigdigits = x25_aftype.input(0, target, (struct sockaddr *)&sx25)) < 0) { +@@ -76,8 +77,8 @@ static int X25_setroute(int action, int options, char **args) + } + rt.sigdigits=sigdigits; + +- /* x25_route_struct.address isn't type struct sockaddr_x25, Why? */ +- memcpy(&rt.address, &sx25.sx25_addr, sizeof(x25_address)); ++ /* this works with 2.4 and 2.6 headers struct x25_address vs. typedef */ ++ memcpy(&rt.address, &sx25.sx25_addr, sizeof(sx25.sx25_addr)); + + while (*args) { + if (!strcmp(*args,"device") || !strcmp(*args,"dev")) { +@@ -89,7 +90,7 @@ static int X25_setroute(int action, int options, char **args) + return(usage()); + if (rt.device[0]) + return(usage()); +- strcpy(rt.device, *args); ++ safe_strncpy(rt.device, *args, sizeof(rt.device)); + args++; + } + if (rt.device[0]=='\0') +@@ -111,7 +112,7 @@ static int X25_setroute(int action, int options, char **args) + perror("socket"); + return(E_SOCK); + } +- ++ + /* Tell the kernel to accept this route. */ + if (action==RTACTION_DEL) { + if (ioctl(skfd, SIOCDELRT, &rt) < 0) { +@@ -137,14 +138,14 @@ int X25_rinput(int action, int options, char **args) + if (action == RTACTION_FLUSH) { + fprintf(stderr,"Flushing `x25' routing table not supported\n"); + return(usage()); +- } ++ } + if (options & FLAG_CACHE) { + fprintf(stderr,"Modifying `x25' routing cache not supported\n"); + return(usage()); +- } ++ } + if ((*args == NULL) || (action == RTACTION_HELP)) + return(usage()); +- ++ + return(X25_setroute(action, options, args)); + } + #endif /* HAVE_AFX25 */ +diff --git a/man/Makefile b/man/Makefile +index 4ef1af8..23f5468 100644 +--- a/man/Makefile ++++ b/man/Makefile +@@ -29,9 +29,14 @@ mandir=/usr/share/man + + -include ../config.make + ifeq ($(I18N),1) +-LANGS=`ls -d * | grep -v Makefile` ++ALL_LANGS = $(filter-out Makefile,$(wildcard *)) ++ifeq ($(LINGUAS),) ++LANGS = $(ALL_LANGS) + else +-LANGS=en_US ++LANGS = $(sort $(filter $(LINGUAS),$(ALL_LANGS)) en_US) ++endif ++else ++LANGS = en_US + endif + + all: +@@ -43,7 +48,7 @@ clean: + clobber: clean + + install: +- LANGS=$(LANGS) ; \ ++ LANGS='$(LANGS)' ; \ + for LANG in $$LANGS; do \ + cd $$LANG; \ + for SECTION in 1 5 8; do \ +diff --git a/man/de_DE/arp.8 b/man/de_DE/arp.8 +index debd879..79abfc7 100644 +--- a/man/de_DE/arp.8 ++++ b/man/de_DE/arp.8 +@@ -1,149 +1,145 @@ +-.TH ARP 8 "6. M\(:arz 1999" "net-tools" "Handbuch f\(:ur Linuxprogrammierer" ++.TH ARP 8 "17. Oktober 2012" "net-tools" "Handbuch f\(:ur Linuxprogrammierer" + .SH NAME + arp \- Manipulation des ARP-Caches + .SH SYNOPSIS +-.B arp +-.RB [ \-vn ] +-.RB [ "\-H Typ" ] +-.RB [ "-i Schnittstelle" ] +-.B -a ++.B arp ++.RB [ \-vn ] ++.RB [ "\-H Typ" ] ++.RB [ "-i Schnittstelle" ] ++.B -a + .RB [ Rechnername ] + .PP +-.B arp ++.B arp + .RB [ \-v ] +-.RB [ "\-i if" ] ++.RB [ "\-i Schnittstelle" ] + .B "\-d Rechnername" + .RB [ pub ] + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H Typ" ] +-.RB [ "\-i Schnittstelle" ] ++.B arp ++.RB [ \-v ] ++.RB [ "\-H Typ" ] ++.RB [ "\-i Schnittstelle" ] + .B -s Rechnername hw_adr +-.RB [ temp ] ++.RB [ temp ] + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H Typ" ] +-.RB [ "\-i Interface" ] ++.B arp ++.RB [ \-v ] ++.RB [ "\-H Typ" ] ++.RB [ "\-i Interface" ] + .B -s Rechnername hw_adr +-.RB [ "netmask nm" ] ++.RB [ "netmask Maske" ] + .B pub + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H Typ" ] +-.RB [ "\-i Schnittstelle" ] +-.B -Ds Rechnername ifa +-.RB [ "netmask nm" ] ++.B arp ++.RB [ \-v ] ++.RB [ "\-H Typ" ] ++.RB [ "\-i Schnittstelle" ] ++.B -Ds Rechnername Schnittstelle2 ++.RB [ "netmask Maske" ] + .B pub + .PP +-.B arp ++.B arp + .RB [ \-vnD ] +-.RB [ "\-H Typ" ] ++.RB [ "\-H Typ" ] + .RB [ "-i Schnittstelle" ] + .B -f [Dateiname] + + .SH BESCHREIBUNG + .B Arp + kann den ARP-Cache des Kernels auf verschiedene Arten manipulieren. Die +-haupts\(:achliche Verwendung ist es Adresszuordnungseintr\(:age zu ++haupts\(:achliche Verwendung ist es, Adresszuordnungseintr\(:age zu + l\(:oschen und von Hand neue zu erzeugen. Zum Zweck der Fehlersuche ist +-moeglich mit dem +-.B arp +-Programm den Inhalt des ARP-Caches vollst\(:andig auszugeben. ++es m\(:oglich, mit dem ++.BR arp -Programm ++den Inhalt des ARP-Caches vollst\(:andig auszugeben. ++ ++.B ARP ++steht f\(:ur Address Resolution Protocol, welches dazu verwendet wird, \(:uber ++die IPv4-Adresse die MAC-Adresse von Nachbarn im Netzwerk zu finden. + .SH OPTIONEN + .TP + .B "\-v, \-\-verbose" + Ausf\(:uhrlichere Ausgaben. + .TP + .B "\-n, \-\-numeric" +-macht numerische Adressausgaben anstatt zu versuche, den symbolischen Rechner-, ++Numerische Adressausgaben anstatt zu versuchen, den symbolischen Rechner-, + Port- oder Benutzernamen zu ermitteln. + .TP +-.B "\-H type, \-\-hw-type type" ++.B "\-H Typ, \-\-hw-type Typ" + Beim Setzen oder Auslesen des ARP-Caches schr\(:ankt diese Option +-ein, auf welcher Klasse von Eintr\(:agen ++ein, auf welcher Klasse von Eintr\(:agen + .B arp + operieren soll. Der Standardwert dieses Arguments ist + .B ether + (d.h. Hardwarecode 0x01 f\(:ur IEEE 802.3 10Mbps Ethernet). + Andere m\(:ogliche Werte sind Netzwerkstechnologien so wie z.B. +-.RB "ARCnet (" arcnet ")" +-, +-.RB "PROnet (" pronet ")" +-, +-.RB "AX.25 (" ax25 ")" +-and +-.RB "NET/ROM (" netrom ")." ++.RB "ARCnet (" arcnet "), PROnet (" pronet "), AX.25 (" ax25 ") und NET/ROM (" netrom ")." + .TP + .B "\-a [Rechnername], \-\-display [Rechnername]" + Zeigt die Eintr\(:age der angegebenen Rechner an. Wird kein +-.B hostname +-Argument verwendet, so werden alle Eintr\(:age aufgelistet. ++.BR hostname -Argument ++verwendet, so werden alle Eintr\(:age aufgelistet. + .TP + .B "\-d Rechnername, \-\-delete Rechnername" +-Alle Eintr\(:age f\(:ur den angegebenen Host entfernen. Dies kann z.B. +-benutzt werden, wenn ein System angehalten wird. ++Alle Eintr\(:age f\(:ur den angegebenen Host entfernen. Dies kann z.B. benutzt ++werden, wenn ein System angehalten wird. + .TP + .B "\-D, \-\-use-device" + Die Hardwareadresse der Netzwerksschnittstelle +-.B ifa ++.B Schnittstelle2 + verwenden. + .TP +-.B "\-i If, \-\-device Schnittstelle" ++.B "\-i Schnittstelle, \-\-device Schnittstelle" + Eine Netzwerksschnittstelle ausw\(:ahlen. Es werden nur Eintr\(:age +-f\(:ur die angegebene Schnittstelle ausgedruckt. Beim Setzen von von ++f\(:ur die angegebene Schnittstelle ausgegeben. Beim Setzen von + permanenten oder tempor\(:aren Eintr\(:agen wird diese Schnittstelle mit + dem Eintrag assoziiert. Wird diese Option nicht verwendet, so versucht der +-Kernel auf Basis der Routentabelle eine Schnittstelle auszuw\(:ahlen. F\(:ur +-.B pub +-Eintr\(:age ist die angegebene Schnittstelle diejenige, auf der ARP-Anfragen ++Kernel, auf Basis der Routentabelle eine Schnittstelle auszuw\(:ahlen. F\(:ur ++.BR pub -Eintr\(:age ++ist die angegebene Schnittstelle diejenige, auf der ARP-Anfragen + beantwortet werden. + .br + .B ANMERKUNG: +-Diese Schnittstelle mu\(ss eine andere sein als die, auf die die IP-Datagramme ++Diese Schnittstelle mu\(ss eine andere sein als die, auf welche die IP-Datagramme + weitergeleitet werden. + .TP +-.B "\-s Rechnername hw_addr, \-\-set Rechnername" +-Erzeugt manuel einen ARP Adresseintrag f\(:ur den Rechner +-.B Rechnername ++.B "\-s Rechnername hw_addr, \-\-set Rechnername hw_addr" ++Erzeugt manuell einen ARP-Adresseintrag f\(:ur den Rechner ++.BR Rechnername , + in dem die Hardwareadresse auf + .B hw_addr + gesetzt ist. Das genaue Format der Hardwareadresse ist abh\(:angig von der +-Hardwareklasse aber f\(:ur die meisten Klassen kann man davon ausgehen, da\(ss ++Hardwareklasse, aber f\(:ur die meisten Klassen kann man davon ausgehen, da\(ss + die \(:ubliche Darstellung verwendet wird. F\(:ur die Ethernetklasse sind +-dies sechs hexadezimale, von Doppelpunkten getrennte Bytes. Beim Zuf\(:ugen +-von Proxy-ARP-Entr\(:agen (das sind die mit der gesetzten +-.BR pub lizieren +-Flagge) kann +-.B Netmaske ++dies sechs hexadezimale, durch Doppelpunkte getrennte Bytes. Beim Zuf\(:ugen ++von Proxy-ARP-Entr\(:agen (das sind die mit dem gesetzten ++.BR pub lished-Flag) ++kann die ++.B Maske + f\(:ur ARP-Eintr\(:age f\(:ur ganze Subnetze angegeben werde. Von dieser + Praxis wird abgeraten. Sie wird von \(:alteren Kerneln unterst\(:utzt, da +-sie gelegentlich n\(:utzlich ist. Wird die +-If the +-.B temp +-Flagge nicht angegeben, so werden die erzeugten Eintr\(:age nicht dauerhaft +-in den ARP-Cache eingetragen. ++sie gelegentlich n\(:utzlich ist. ++Der Eintrag wird permanent im ARP-Cache gespeichert, ++wenn das \fBtemp\fR-Flag nicht angegeben wird. + .br + .B ANMERKUNG: +-Ab der Kernelversion 2.2.0 ist es nicht mehr m\(:oglich ARP-Eintr\(:age f\(:ur +-ganze Teilnetze zu erzeugen. Statt dessen wird automatisches Proxy ARP ++Ab der Kernelversion 2.2.0 ist es nicht mehr m\(:oglich, ARP-Eintr\(:age f\(:ur ++ganze Teilnetze zu erzeugen. Stattdessen wird automatisches Proxy ARP + durchgef\(:uhrt, d.h. wenn eine Route existiert und Forwarding eingeschaltet +-ist wird automatisch ein tempor\(:arer Proxyarpeintrag erzeugt. ++ist, wird automatisch ein tempor\(:arer Proxyarpeintrag erzeugt. + Siehe auch + .BR arp (7) + f\(:ur mehr Details. + .TP +-.B "\-f Dateiname, \-\-file Dateiname" ++.B "\-f [Dateiname], \-\-file [Dateiname]" + \(:Ahnlich der + .B \-s + Option, au\(sser, da\(ss diesmal die Adressinformation aus der Datei + .B Dateiname + verwendet wird. Dies kann verwendet werden, wenn ARP-Eintr\(:age f\(:ur + etliche Rechner erzeugt werden m\(:ussen. Der Name dieser Datei ist oft +-.IR /etc/ethers , +-aber dies ist nicht offizieil standardisiert. Wenn kein Dateinamen ++.IR /etc/ethers , ++aber dies ist nicht offizieil standardisiert. Wenn kein Dateinamen + angeben ist wird /etc/ethers benutzt. + .sp 1 + Das Format der Datei ist einfach; es enth\(:alt nur ASCII-Textzeilen, die +@@ -158,16 +154,28 @@ erwartet wird, kann auch eine + .B "IP-Adresse" + in Form eines durch Punkte getrennten Dezimalquadrupels angegeben werden. + .P +-Aus Kompatiblit\(:atsgr\(:unden k\(:onnen Rechnername und die ++Aus Kompatiblit\(:atsgr\(:unden k\(:onnen Rechnername und die + Hardwareadresse auch vertauscht werden. +-.LP +-Jeder vollst\(:andige Eintrag wird im ARP-Cache mit der +-.B C +-Flagge markiert. Permanente Eintr\(:age werden mit ++.LP ++Jeder vollst\(:andige Eintrag wird im ARP-Cache mit dem ++.BR C -Flag ++markiert. Permanente Eintr\(:age werden mit + .B M +-und zu publizierende Eintr\(:age mit der ++und zu publizierende Eintr\(:age mit + .B P +-Flagge. ++markiert. ++.SH BEISPIELE ++.B /usr/sbin/arp -i eth0 -Ds 10.0.0.2 eth1 pub ++ ++Beantwortet ARP-Anfragen f\(:ur 10.0.0.2 die auf der Schnittstelle eth0 ++empfangen werden mit der MAC-Adresse f\(:ur eth1. ++ ++.B /usr/sbin/arp -i eth1 -d 10.0.0.1 ++ ++Entfernt den ARP-Eintrag f\(:ur 10.0.0.1 auf der Schnittstelle ++.BR eth1 . ++Dies betrifft sowohl publizierte Proxy-ARP-Einträge als auch auf permanente ARP-Eintr\(:age. ++ + .SH DATEIEN + .I /proc/net/arp, + .br +@@ -176,10 +184,12 @@ Flagge. + .I /etc/hosts + .br + .I /etc/ethers ++ + .SH SIEHE AUCH + ethers(5), rarp(8), route(8), ifconfig(8), netstat(8) ++ + .SH AUTOREN +-Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> mit vielen Verbesserungen vom +-Verwalter der Net-Tools Bernd Eckenfels <net-tools@lina.inka.de>. ++Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>, Bernd Eckenfels <net-tools@lina.inka.de>. ++ + .SH \(:Ubersetzung +-Ralf B\(:achle <ralf@gnu.org> ++Ralf B\(:achle <ralf@gnu.org>, Simon A. Eugster <simon.eu@gmail.com> +diff --git a/man/de_DE/ifconfig.8 b/man/de_DE/ifconfig.8 +index aa2a4a0..9713965 100644 +--- a/man/de_DE/ifconfig.8 ++++ b/man/de_DE/ifconfig.8 +@@ -73,9 +73,6 @@ Modus. Ist er eingeschaltet, so werden alle Multicastpakete vom Netzwerk + empfangen unabh\(:angig davon, ob sie an die Schnittstelle adressiert sind + oder nicht. + .TP +-.B "metric N" +-Dieses Argument setzt den Metrik-Wert f\(:ur die Schnittstelle auf N. +-.TP + .B "mtu N" + Dieses Argument setzt die Maximum Transfer Unit (MTU) der Schnittstelle, + das ist das gr\(:o\(sste Paket, dass gesendet werden kann. +@@ -98,7 +95,7 @@ F\(:ugt der Schnittstelle eine IPv6-Adresse zu. + .B "del addr/prefixlen" + Entfernt eine IPv6-Adresse von der Schnittstelle. + .TP +-.B "tunnel aa.bb.cc.dd" ++.B "tunnel ::aa.bb.cc.dd" + Erzeugt ein neues SIT (IPv6-in-IPv4) Ger\(:at, das Pakete zum angegebenen + Ziel tunnelt. + .TP +@@ -180,12 +177,10 @@ Seit Kernel Version 2.2 gibt es keine expliziten Statistiken f\(:ur + Schnittstellenaliase mehr. Die Statistiken f\(:ur die Originaladresse werden + mit allen Aliasen auf das gleiche Ger\(:at geteilt. Um Statistiken per + Adresse zu erhalten sollte explizite EIntr\(:age f\(:ur die Adresse mit dem +-.BR ipchains(8) ++.BR iptables(8) + Kommando gemacht werden. + + .SH DATEIEN +-.I /proc/net/socket +-.br + .I /proc/net/dev + .br + .I /proc/net/if_inet6 +@@ -193,7 +188,7 @@ Kommando gemacht werden. + W\(:ahrend AppleTalk DDP und IPX Adressen angezeigt werden, k\(:onnen sie mit + diesem Kommando nicht ge\(:andert werden. + .SH SIEHE AUCH +-route(8), netstat(8), arp(8), rarp(8), ipchains(8) ++route(8), netstat(8), arp(8), rarp(8), iptables(8) + .SH AUTOREN + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + .br +diff --git a/man/de_DE/netstat.8 b/man/de_DE/netstat.8 +index f59aec0..fdb76c9 100644 +--- a/man/de_DE/netstat.8 ++++ b/man/de_DE/netstat.8 +@@ -9,7 +9,7 @@ + .\" Modified: Tuan Hoang tuan@optimus.mitre.org + .\" + .\" +-.TH NETSTAT 8 "6. M\(:arz 1999" "net-tools" "Handbuch f\(:ur Linuxprogrammierer" ++.TH NETSTAT 8 "2007-12-02" "net-tools" "Handbuch f\(:ur Linuxprogrammierer" + + .SH NAME + netstat \- Anzeige von Netzwerksverbindungen, Routentabellen, Schnittstellenstatistiken, maskierten Verbindungen, Netlink-Nachrichten und Mitgliedschaft in Multicastgruppen +@@ -20,6 +20,8 @@ netstat \- Anzeige von Netzwerksverbindungen, Routentabellen, Schnittstellenstat + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-groups | \-g ] + .RB [ \-\-unix | \-x ] +@@ -44,7 +46,6 @@ netstat \- Anzeige von Netzwerksverbindungen, Routentabellen, Schnittstellenstat + .B netstat + .RB [ \-veenpac ] + .RB { \-\-interfaces | \-i } +-.RI [ Schnittstelle ] + + .PP + +@@ -68,6 +69,8 @@ netstat \- Anzeige von Netzwerksverbindungen, Routentabellen, Schnittstellenstat + .SH BESCHREIBUNG + .B Netstat + zeigt Informationen des Linux Netzwerkssystems an. ++.PP ++.B Bitte beachten Sie, dass der Inhalt der deutschen man-page nicht vollst\(:andig ist, im Moment. + + .SS "(no option)" + Ohne Optionen zeigt +@@ -103,18 +106,17 @@ benutzt das Ausgabeformat von + Wegen Details siehe + .BR route (8). + +-.SS "\-i, \-\-interface \fISchnittstelle\fI" ++.SS "\-i, \-\-interfaces" + Wird die + .BR -i ", " --interfaces +-Option verwendet, so wird eine Tabelle aller (oder der angegebenen +-.IR Schnittstellen ) ++Option verwendet, so wird eine Tabelle aller Schnittstellen + ausgedruckt. Die Ausgabe ist im Format von + .B "ifconfig -e" + und wird in + .BR ifconfig (8) + beschrieben. + .B "netstat -ei" +-druckt eine Tabelle oder einen Eintrag f\(:ur einen einzelnes Interface wie ++druckt eine Tabelle f\(:ur Interfaces wie + .BR ifconfig . + Die + .B -a +@@ -182,7 +184,7 @@ Dies hat den gleichen Effekt wie die Langoptionen + und + .BR \-\-ddp. + +-.SS "\-c, \-\-continous" ++.SS "\-c, \-\-continuous" + Mit dieser Option wiederholt + .B netstat + im Sekundenabstand die Ausgabe, bis es abgebrochen wird. +@@ -414,7 +416,7 @@ werden.) + Seit der Kern Version 2.2 zeigt netstat -i keine Schnittstellenstatistiken + von Schnittstellenaliasen mehr an. Um Statistiken per Schnittstelle zur + erhalten, m\(:ussen jetzt mit dem +-.BR ipchains(8) ++.BR iptables(8) + Befehl explizite Regeln zugef\(:ugt werden. + + .SH DATEIEN +@@ -477,10 +479,7 @@ Befehl explizite Regeln zugef\(:ugt werden. + .SH SIEHE AUCH + .BR route (8), + .BR ifconfig (8), +-.BR ipfw (4), +-.BR ipfw (8), +-.BR ipfwadm (8) +-.BR ipchains (8) ++.BR iptables (8) + + .PP + .SH PROBLEME +diff --git a/man/de_DE/route.8 b/man/de_DE/route.8 +index a28c9d1..1a32712 100644 +--- a/man/de_DE/route.8 ++++ b/man/de_DE/route.8 +@@ -55,7 +55,7 @@ Schnittstelle] + .SH BESCHREIBUNG + .B Route + wird zum \(:Andern der IP-Routing-Tabelle der Kernels verwendet. Seine +-prim\(:are Verwendung ist statische Routen f\*:ur bestimmte Rechner oder ++prim\(:are Verwendung ist statische Routen f\(:ur bestimmte Rechner oder + Netzwerke \(:uber eine Schnittstelle einzutragen, nachdem diese mit dem + Programm + .BR ifconfig (8) +diff --git a/man/en_US/arp.8 b/man/en_US/arp.8 +index d859b46..c065e22 100644 +--- a/man/en_US/arp.8 ++++ b/man/en_US/arp.8 +@@ -1,56 +1,111 @@ +-.TH ARP 8 "5 Jan 1999" "net-tools" "Linux Programmer's Manual" ++.TH ARP 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + arp \- manipulate the system ARP cache + .SH SYNOPSIS +-.B arp +-.RB [ \-vn ] +-.RB [ "\-H type" ] +-.RB [ "-i if" ] +-.B -a +-.RB [ hostname ] ++.B arp ++.RB [ \-vn ] ++.RB [ \-H ++.IR type ] ++.RB [ \-i ++.IR if ] ++.RB [ \-ae ] ++.RI [ hostname ] + .PP +-.B arp ++.B arp + .RB [ \-v ] +-.RB [ "\-i if" ] +-.B "\-d hostname" ++.RB [ \-i ++.IR if ] ++.B \-d ++.I hostname + .RB [ pub ] + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H type" ] +-.RB [ "\-i if" ] +-.B -s hostname hw_addr +-.RB [ temp ] ++.B arp ++.RB [ \-v ] ++.RB [ \-H ++.IR type ] ++.RB [ \-i ++.IR if ] ++.B \-s ++.I hostname hw_addr ++.RB [ temp ] + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H type" ] +-.RB [ "\-i if" ] +-.B -s hostname hw_addr +-.RB [ "netmask nm" ] ++.B arp ++.RB [ \-v ] ++.RB [ \-H ++.IR type ] ++.RB [ \-i ++.IR if ] ++.B \-s ++.I hostname hw_addr ++.RB [ netmask ++.IR nm ] + .B pub + .PP +-.B arp +-.RB [ \-v ] +-.RB [ "\-H type" ] +-.RB [ "\-i if" ] +-.B -Ds hostname ifa +-.RB [ "netmask nm" ] ++.B arp ++.RB [ \-v ] ++.RB [ \-H ++.IR type ] ++.RB [ \-i ++.IR if ] ++.B \-Ds ++.I hostname ++.I ifname ++.RB [ netmask ++.IR nm ] + .B pub + .PP +-.B arp ++.B arp + .RB [ \-vnD ] +-.RB [ "\-H type" ] +-.RB [ "-i if" ] +-.B -f [filename] ++.RB [ \-H ++.IR type ] ++.RB [ \-i ++.IR if ] ++.B \-f ++.RI [ filename ] + + .SH DESCRIPTION + .B Arp +-manipulates the kernel's ARP cache in various ways. The primary options +-are clearing an address mapping entry and manually setting up one. For +-debugging purposes, the ++manipulates or displays the kernel's IPv4 network neighbour cache. It can add ++entries to the table, delete one or display the current content. ++ ++.B ARP ++stands for Address Resolution Protocol, which is used to find the media ++access control address of a network neighbour for a given IPv4 Address. ++.SH MODES + .B arp +-program also allows a complete dump of the ARP cache. ++with no mode specifier will print the current content of the table. It is ++possible to limit the number of entries printed, by specifying an hardware ++address type, interface name or host address. ++ ++.B arp -d ++.I address ++will delete a ARP table entry. Root or netadmin privilege is required to do ++this. The entry is found by IP address. If a hostname is given, it will be ++resolved before looking up the entry in the ARP table. ++ ++.B arp -s ++.I address hw_addr ++is used to set up a new table entry. The format of the ++.I hw_addr ++parameter is dependent on the hardware class, but for most classes one can ++assume that the usual presentation can be used. For the Ethernet class, ++this is 6 bytes in hexadecimal, separated by colons. When adding proxy arp ++entries (that is those with the ++.BR pub lish ++flag set) a ++.B netmask ++may be specified to proxy arp for entire subnets. This is not good ++practice, but is supported by older kernels because it can be ++useful. If the ++.B temp ++flag is not supplied entries will be permanent stored into the ARP ++cache. To simplify setting up entries for one of your own network interfaces, you can use the ++.B "arp \-Ds" ++.I address ifname ++form. In that case the hardware address is taken from the interface with the ++specified name. ++ ++.br + .SH OPTIONS + .TP + .B "\-v, \-\-verbose" +@@ -60,7 +115,7 @@ Tell the user what is going on by being verbose. + shows numerical addresses instead of trying to determine symbolic host, port + or user names. + .TP +-.B "\-H type, \-\-hw-type type" ++\fB\-H\fI type\fR, \fB\-\-hw\-type\fI type\fR, \fB\-t\fI type\fR + When setting or reading the ARP cache, this optional parameter tells + .B arp + which class of entries it should check for. The default value of +@@ -76,23 +131,18 @@ Other values might include network technologies such as + and + .RB "NET/ROM (" netrom ")." + .TP +-.B "\-a [hostname], \-\-display [hostname]" +-Shows the entries of the specified hosts. If the +-.B hostname +-parameter is not used, +-.B all +-entries will be displayed. ++.B \-a ++Use alternate BSD style output format (with no fixed columns). + .TP +-.B "\-d hostname, \-\-delete hostname" +-Remove any entry for the specified host. This can be used if the +-indicated host is brought down, for example. ++.B \-e ++Use default Linux style output format (with fixed columns). + .TP + .B "\-D, \-\-use-device" +-Use the interface +-.BR ifa "'s" +-hardware address. ++Instead of a hw_addr, the given argument is the name of an interface. ++.B arp ++will use the MAC address of that interface for the table entry. This is usually the best option to set up a proxy ARP entry to yourself. + .TP +-.B "\-i If, \-\-device If" ++\fB\-i\fI If\fR, \fB\-\-device\fI If\fR + Select an interface. When dumping the ARP cache only entries matching + the specified interface will be printed. When setting a permanent or + .B temp +@@ -101,53 +151,36 @@ option is not used, the kernel will guess based on the routing + table. For + .B pub + entries the specified interface is the interface on which ARP requests will +-be answered. ++be answered. + .br + .B NOTE: + This has to be different from the interface to which the IP + datagrams will be routed. +-.TP +-.B "\-s hostname hw_addr, \-\-set hostname" +-Manually create an ARP address mapping entry for host +-.B hostname +-with hardware address set to +-.B hw_addr +-. The format of the hardware address is dependent on the hardware +-class, but for most classes one can assume that the usual presentation +-can be used. For the Ethernet class, this is 6 bytes in hexadecimal, +-separated by colons. When adding proxy arp entries (that is those with +-the +-.BR pub lish +-flag set a +-.B netmask +-may be specified to proxy arp for entire subnets. This is not good +-practice, but is supported by older kernels because it can be +-useful. If the +-.B temp +-flag is not supplied entries will be permanent stored into the ARP +-cache. +-.br + .B NOTE: +-As of kernel 2.2.0 it is no longer possible to set an ARP entry for an ++As of kernel 2.2.0 it is no longer possible to set an ARP entry for an + entire subnet. Linux instead does automagic proxy arp when a route +-exists and it is forwarding. See ++exists and it is forwarding. See + .BR arp (7) +-for details. ++for details. Also the ++.B dontpub ++option which is available for delete and set operations cannot be ++used with 2.4 and newer kernels. + .TP +-.B "\-f filename, \-\-file filename" ++\fB\-f\fI filename\fR, \fB\-\-file\fI filename\fR + Similar to the + .B \-s + option, only this time the address info is taken from file +-.B filename +-. This can be used if ARP entries for a lot of hosts have to be ++.IR filename . ++This can be used if ARP entries for a lot of hosts have to be + set up. The name of the data file is very often +-.IR /etc/ethers , +-but this is not official. If no filename is specified /etc/ethers ++.IR /etc/ethers , ++but this is not official. If no filename is specified ++.I /etc/ethers + is used as default. + .sp 1 + The format of the file is simple; it + only contains ASCII text lines with a hostname, and a hardware +-address separated by whitespace. Additionally the ++address separated by whitespace. Additionally the + .BR "pub" , " temp" " and" " netmask" + flags can be used. + .LP +@@ -157,9 +190,9 @@ is expected, one can also enter an + .B "IP address" + in dotted-decimal notation. + .P +-As a special case for compatibility the order of the hostname and ++As a special case for compatibility the order of the hostname and + the hardware address can be exchanged. +-.LP ++.LP + Each complete entry in the ARP cache will be marked with the + .B C + flag. Permanent entries are marked with +@@ -167,8 +200,18 @@ flag. Permanent entries are marked with + and published entries have the + .B P + flag. ++.SH EXAMPLES ++.B /usr/sbin/arp -i eth0 -Ds 10.0.0.2 eth1 pub ++ ++This will answer ARP requests for 10.0.0.2 on eth0 with the MAC address for ++eth1. ++ ++.B /usr/sbin/arp -i eth1 -d 10.0.0.1 ++ ++Delete the ARP table entry for 10.0.0.1 on interface eth1. This will match ++published proxy ARP entries and permanent entries. + .SH FILES +-.I /proc/net/arp, ++.I /proc/net/arp + .br + .I /etc/networks + .br +@@ -178,5 +221,4 @@ flag. + .SH SEE ALSO + rarp(8), route(8), ifconfig(8), netstat(8) + .SH AUTHORS +-Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> with a lot of improvements +-from net-tools Maintainer Bernd Eckenfels <net-tools@lina.inka.de>. ++Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>, Bernd Eckenfels <net\-tools@lina.inka.de>. +diff --git a/man/en_US/ethers.5 b/man/en_US/ethers.5 +index f3ba116..5a02892 100644 +--- a/man/en_US/ethers.5 ++++ b/man/en_US/ethers.5 +@@ -1,4 +1,4 @@ +-.TH ETHERS 5 "April 26th, 1996" "" "File formats" ++.TH ETHERS 5 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME \"{{{roff}}}\"{{{ + ethers \- Ethernet address to IP number database + .\"}}} +@@ -7,17 +7,17 @@ ethers \- Ethernet address to IP number database + IP numbers, one line for each IP number: + .sp + .RS +-\fIEthernet-address\fP \fIIP-number\fP ++\fIEthernet\-address\fP \fIIP\-number\fP + .RE + .sp +-The two items are separated by any number of SPACE and/or TAB char +-acters. A \fB#\fP at the beginning of a line starts a comment +-which extends to the end of the line. The \fIEthernet-address\fP is ++The two items are separated by any number of SPACE and/or TAB characters. ++A \fB#\fP at the beginning of a line starts a comment ++which extends to the end of the line. The \fIEthernet\-address\fP is + written as + .IR x : x : x : x : x : x , + where \fIx\fP is a hexadecimal number between \fB0\fP and \fBff\fP + which represents one byte of the address, which is in network byte +-order (big-endian). The \fIIP-number\fP may be a hostname which ++order (big-endian). The \fIIP\-number\fP may be a hostname which + can be resolved by DNS or a dot separated number. + .\"}}} + .SH EXAMPLES \"{{{ +diff --git a/man/en_US/hostname.1 b/man/en_US/hostname.1 +index cea3f6e..c45b7b6 100644 +--- a/man/en_US/hostname.1 ++++ b/man/en_US/hostname.1 +@@ -1,66 +1,60 @@ +-.TH HOSTNAME 1 "28 Jan 1996" "net-tools" "Linux Programmer's Manual" ++.TH HOSTNAME 1 "2013\-08\-29" "net\-tools" "Linux System Administrator's Manual" + + .SH NAME + hostname \- show or set the system's host name + .br +-domainname \- show or set the system's NIS/YP domain name +-.br + dnsdomainname \- show the system's DNS domain name + .br +-nisdomainname \- show or set system's NIS/YP domain name ++domainname \- show or set the system's NIS/YP domain name + .br +-ypdomainname \- show or set the system's NIS/YP domain name ++nisdomainname \- show or set system's NIS/YP domain name + .br + nodename \- show or set the system's DECnet node name ++.br ++ypdomainname \- show or set the system's NIS/YP domain name + + .SH SYNOPSIS + .B hostname + .RB [ \-v ] +-.RB [ \-a ] +-.RB [ \-\-alias ] +-.RB [ \-d ] +-.RB [ \-\-domain ] +-.RB [ \-f ] +-.RB [ \-\-fqdn ] +-.RB [ \-i ] +-.RB [ \-\-ip-address ] +-.RB [ \-\-long ] +-.RB [ \-s ] +-.RB [ \-\-short ] +-.RB [ \-y ] +-.RB [ \-\-yp ] +-.RB [ \-\-nis ] +-.RB [ \-n ] +-.RB [ \-\-node ] ++.RB [ \-s | \-\-short ] ++ ++.PP ++.B hostname ++.RB [ \-v ] ++.RB [ \-a | \-\-alias ] ++.RB [ \-d | \-\-domain ] ++.RB [ \-f | \-\-fqdn | \-\-long ] ++.RB [ \-i | \-\-ip\-address ] ++ ++.PP ++.B hostname ++.RB [ \-v ] ++.RB [ \-y | \-\-yp | \-\-nis ] ++.RB [ \-n | \-\-node ] + + .PP + .B hostname + .RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ hostname ] ++.RB [ \-F\ filename | \-\-file\ filename ] ++.RI [ newname ] + + .PP + .B domainname + .RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ name ] ++.RB [ \-F\ filename | \-\-file\ filename ] ++.RI [ newname ] + + .PP + .B nodename + .RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ name ] ++.RB [ \-F\ filename | \-\-file\ filename ] ++.RI [ newname ] + + .PP + .B hostname +-.RB [ \-v ] +-.RB [ \-h ] +-.RB [ \-\-help ] +-.RB [ \-V ] +-.RB [ \-\-version ] ++.RB [ \-v | \-\-verbose ] ++.RB [ \-h | \-\-help ] ++.RB [ \-V | \-\-version ] + + .PP + .B dnsdomainname +@@ -124,12 +118,8 @@ command (see + below). + + .LP +-The host name is usually set once at system startup in +-.I /etc/rc.d/rc.inet1 +-or +-.I /etc/init.d/boot +-(normally by reading the contents of a file which contains +-the host name, e.g. ++The host name is usually set once at system startup by reading the ++contents of a file which contains the host name, e.g. + .IR /etc/hostname ). + + .SS THE FQDN +@@ -142,16 +132,17 @@ with this command. The FQDN of the system is the name that the + returns for the host name. + + .LP +-Technically: The FQDN is the name +-.BR gethostbyname (2) +-returns for the host name returned by +-.BR gethostname (2). +-The DNS domain name is the part after the first dot. ++Technically: The FQDN is the canonical name returned by ++.BR gethostbyname2 (2) ++when resolving the result of the ++.BR gethostname (2) ++name. The DNS domain name is the part after the first dot. + .LP + Therefore it depends on the configuration (usually in + .IR /etc/host.conf ) +-how you can change it. Usually (if the hosts file is parsed before DNS or +-NIS) you can change it in ++how you can change it. If ++.B hosts ++is the first lookup method, you can change the FQDN in + .IR /etc/hosts . + + +@@ -161,27 +152,23 @@ NIS) you can change it in + Display the alias name of the host (if used). + .TP + .I "\-d, \-\-domain" +-Display the name of the DNS domain. Don't use the command +-.B domainname +-to get the DNS domain name because it will show the NIS domain name and +-not the DNS domain name. Use ++Display the name of the DNS domain (this is the FQDN without the segment up ++to the first dot). This is equivalent to using the + .B dnsdomainname +-instead. ++command. + .TP + .I "\-F, \-\-file filename" +-Read the host name from the specified file. Comments (lines starting with ++Read the new host name from the specified file. Comments (lines starting with + a `#') are ignored. + .TP + .I "\-f, \-\-fqdn, \-\-long" +-Display the FQDN (Fully Qualified Domain Name). A FQDN consists of a +-short host name and the DNS domain name. Unless you are using bind or NIS +-for host lookups you can change the FQDN and the DNS domain name (which is +-part of the FQDN) in the \fI/etc/hosts\fR file. ++Display the FQDN (Fully Qualified Domain Name). A FQDN consists of name ++including the DNS domain. + .TP + .I "\-h, \-\-help" + Print a usage message and exit. + .TP +-.I "\-i, \-\-ip-address" ++.I "\-i, \-\-ip\-address" + Display the IP address(es) of the host. + .TP + .I "\-n, \-\-node" +@@ -203,11 +190,13 @@ Display the NIS domain name. If a parameter is given (or + .B \-\-file name + ) then root can also set a new NIS domain. + .SH FILES ++.B /etc/hostname + .B /etc/hosts ++.B /etc/host.conf ++ + .SH AUTHOR +-Peter Tobias, <tobias@et-inf.fho-emden.de> ++Peter Tobias, <tobias@et\-inf.fho\-emden.de> + .br +-Bernd Eckenfels, <net-tools@lina.inka.de> (NIS and manpage). ++Bernd Eckenfels, <net\-tools@lina.inka.de> (NIS and manpage). + .br + Steve Whitehouse, <SteveW@ACM.org> (DECnet support and manpage). +- +diff --git a/man/en_US/ifconfig.8 b/man/en_US/ifconfig.8 +index e75cf59..0243be3 100644 +--- a/man/en_US/ifconfig.8 ++++ b/man/en_US/ifconfig.8 +@@ -1,10 +1,10 @@ +-.TH IFCONFIG 8 "14 August 2000" "net-tools" "Linux Programmer's Manual" ++.TH IFCONFIG 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + ifconfig \- configure a network interface + .SH SYNOPSIS +-.B "ifconfig [interface]" ++.B "ifconfig [-v] [-a] [-s] [interface]" + .br +-.B "ifconfig interface [aftype] options | address ..." ++.B "ifconfig [-v] interface [aftype] options | address ..." + .SH DESCRIPTION + .B Ifconfig + is used to configure the kernel-resident network interfaces. It is +@@ -18,7 +18,7 @@ a single + .B interface + argument is given, it displays the status of the given interface + only; if a single +-.B -a ++.B \-a + argument is given, it displays the status of all interfaces, even + those that are down. Otherwise, it configures an interface. + +@@ -39,13 +39,34 @@ supported address families include + (Novell IPX) and + .B netrom + (AMPR Packet radio). ++All numbers supplied as parts in IPv4 dotted decimal notation may be decimal, ++octal, or hexadecimal, as specified in the ISO C standard (that is, a leading 0x ++or 0X implies hexadecimal; otherwise, a leading '0' implies octal; otherwise, ++the number is interpreted as decimal). Use of hexadecimal and octal numbers ++is not RFC-compliant and therefore its use is discouraged. + .SH OPTIONS + .TP ++.B -a ++display all interfaces which are currently available, even if down ++.TP ++.B -s ++display a short list (like netstat -i) ++.TP ++.B -v ++be more verbose for some error conditions ++.TP + .B interface + The name of the interface. This is usually a driver name followed by + a unit number, for example + .B eth0 +-for the first Ethernet interface. ++for the first Ethernet interface. If your kernel supports alias interfaces, ++you can specify them with ++.B eth0:0 ++for the first alias of eth0. You can use them to assign a second address. To ++delete an alias interface use ++.BR "ifconfig eth0:0 down" . ++Note: for every scope (i.e. same net with address/netmask combination) all ++aliases are deleted, if you delete the first (primary). + .TP + .B up + This flag causes the interface to be activated. It is implicitly +@@ -69,9 +90,6 @@ Enable or disable + mode. If selected, all multicast packets on the network will be + received by the interface. + .TP +-.B "metric N" +-This parameter sets the interface metric. +-.TP + .B "mtu N" + This parameter sets the Maximum Transfer Unit (MTU) of an interface. + .TP +@@ -92,7 +110,7 @@ Add an IPv6 address to an interface. + .B "del addr/prefixlen" + Remove an IPv6 address from an interface. + .TP +-.B "tunnel aa.bb.cc.dd" ++.B "tunnel ::aa.bb.cc.dd" + Create a new SIT (IPv6-in-IPv4) device, tunnelling to the given destination. + .TP + .B "irq addr" +@@ -122,13 +140,13 @@ are + can be used to tell the driver to auto-sense the media. Again, not + all drivers can do this. + .TP +-.B "[-]broadcast [addr]" ++.B "[\-]broadcast [addr]" + If the address argument is given, set the protocol broadcast + address for this interface. Otherwise, set (or clear) the + .B IFF_BROADCAST + flag for the interface. + .TP +-.B "[-]pointopoint [addr]" ++.B "[\-]pointopoint [addr]" + This keyword enables the + .B point-to-point + mode of an interface, meaning that it is a direct link between two +@@ -173,23 +191,40 @@ alias interfaces anymore. The statistics printed for the original address + are shared with all alias addresses on the same device. If you want per-address + statistics you should add explicit accounting + rules for the address using the +-.BR ipchains(8) ++.BR iptables (8) + command. + .LP +-Interrupt problems with Ethernet device drivers fail with EAGAIN. See +-.I http://cesdis.gsfc.nasa.gov/linux/misc/irq-conflict.html ++Since net\-tools 1.60\-4 ifconfig is printing byte counters and human readable ++counters with IEC 60027-2 units. So 1 KiB are 2^10 byte. Note, the numbers ++are truncated to one decimal (which can by quite a large error if you ++consider 0.1 PiB is 112.589.990.684.262 bytes :) ++.LP ++Interrupt problems with Ethernet device drivers fail with EAGAIN ++.I (SIOCSIIFLAGS: Resource temporarily unavailable) ++it is most likely a interrupt conflict. See ++.I http://www.scyld.com/expert/irq\-conflict.html + for more information. + .SH FILES +-.I /proc/net/socket +-.br + .I /proc/net/dev + .br + .I /proc/net/if_inet6 + .SH BUGS ++Ifconfig uses the ioctl access method to get the full address information, ++which limits hardware addresses to 8 bytes. ++Because Infiniband hardware address has 20 bytes, ++only the first 8 bytes are displayed correctly. ++Please use ++.B ip link ++command from ++.B iproute2 ++package to display link layer informations including the hardware address. ++.LP + While appletalk DDP and IPX addresses will be displayed they cannot be + altered by this command. + .SH SEE ALSO +-route(8), netstat(8), arp(8), rarp(8), ipchains(8) ++route(8), netstat(8), arp(8), rarp(8), iptables(8), ifup(8), interfaces(5). ++.br ++http://physics.nist.gov/cuu/Units/binary.html - Prefixes for binary multiples + .SH AUTHORS + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + .br +@@ -198,3 +233,5 @@ Alan Cox, <Alan.Cox@linux.org> + Phil Blundell, <Philip.Blundell@pobox.com> + .br + Andi Kleen ++.br ++Bernd Eckenfels, <net\-tools@lina.inka.de> +diff --git a/man/en_US/mii-tool.8 b/man/en_US/mii-tool.8 +index 6b773ec..7decaac 100644 +--- a/man/en_US/mii-tool.8 ++++ b/man/en_US/mii-tool.8 +@@ -1,13 +1,12 @@ + .\" Copyright (C) 2000 David A. Hinds -- dhinds@pcmcia.sourceforge.org +-.\" mii-tool.8 1.5 2000/04/25 22:58:19 + .\" +-.TH MII-TOOL 8 "2000/04/25 22:58:19" "net-tools" ++.TH MII\-TOOL 8 "2013\-02\-15" "net\-tools" "Linux System Administrator's Manual" + + .SH NAME +-mii-tool \- view, manipulate media-independent interface status ++mii\-tool \- view, manipulate media-independent interface status + + .SH SYNOPSIS +-.B mii-tool ++.B mii\-tool + [\fB\-v\fR, \fB\-\-verbose\fR] + [\fB\-V\fR, \fB\-\-version\fR] + [\fB\-R\fR, \fB\-\-reset\fR] +@@ -16,7 +15,8 @@ mii-tool \- view, manipulate media-independent interface status + [\fB\-l\fR, \fB\-\-log\fR] + [\fB\-A\fR, \fB\-\-advertise=\fImedia,...\fR] + [\fB\-F\fR, \fB\-\-force=\fImedia\fR] +-.RI [ "interface\ ..." ] ++[\fB\-p\fR, \fB\-\-phy=\fIaddr\fR] ++.RI "interface\ ..." + + .SH DESCRIPTION + This utility checks or sets the status of a network interface's Media +@@ -32,18 +32,21 @@ single-speed hubs, are unable to autonegotiate. To handle such + devices, the MII protocol also allows for establishing a link by + simply detecting either a 10baseT or 100baseT link beat. The \fB\-F\fR + or \fB\-\-force\fR options can be used to force the MII to operate in +-one mode, instead of autonegotiating. The \fB\-A\fR and \fB-F\fR ++one mode, instead of autonegotiating. The \fB\-A\fR and \fB\-F\fR + options are mutually exclusive. + .PP + The default short output reports the negotiated link speed and link +-status for each interface. If an interface or interfaces are not +-specified on the command line, then \fBmii-tool\fR will check any +-available interfaces from \fBeth0\fR through \fBeth7\fR. ++status for each interface. + .SH OPTIONS + .TP + \fB\-v\fR, \fB\-\-verbose\fR + Display more detailed MII status information. If used twice, also + display raw MII register contents. ++.br ++\fBAlert:\fR If used three times, will force reading all MII ++registers, including non standard ones. It's not guaranteed any ++valid answer from PHY while PHY communication can even hang. ++With driver e1000e will fail while reading register 0x07. + .TP + \fB\-V\fR, \fB\-\-version\fR + Display program version information. +@@ -59,7 +62,7 @@ Watch interface(s) and report changes in link status. The MII + interfaces are polled at one second intervals. + .TP + \fB\-l\fR, \fB\-\-log\fR +-Used with \fB-w\fR, records link status changes in the system log ++Used with \fB\-w\fR, records link status changes in the system log + instead of printing on standard output. + .TP + \fB\-F\fI media\fR, \fB\-\-force=\fImedia\fR +@@ -71,8 +74,31 @@ Enable and restart autonegotiation, and advertise only the specified + media technologies. Multiple technologies should be separated by + commas. Valid media are \fB100baseT4\fR, \fB100baseTx-FD\fR, + \fB100baseTx-HD\fR, \fB10baseT-FD\fR, and \fB10baseT-HD\fR. ++.TP ++\fB\-p\fI addr\fR, \fB\-\-phy=\fIaddr\fR ++Override the MII address provided by kernel with value \fBaddr\fR. ++ ++.SH DIAGNOSTICS ++.TP ++SIOCGMIIPHY on 'eth?' failed: Invalid argument ++If the interface is not running (up), kernel will refuse to report its link state. ++.TP ++SIOCGMIIPHY on 'eth?' failed: Operation not permitted ++Most kernels restrict access to root. ++.TP ++SIOCGMIIPHY on 'eth?' failed: No such device ++This error is shown, if the kernel does not know about the named device. ++.TP ++SIOCGMIIPHY on 'eth?' failed: Operation not supported ++The interface in question does not support MII queries. Most likely, it does not have ++MII transceivers, at all. + + .SH AUTHORS + David Hinds \- dhinds@pcmcia.sourceforge.org + .br + Donald Becker \- becker@scyld.com ++.br ++Bernd Eckenfels \- net-tools@lina.inka.de ++ ++.SH SEE ALSO ++http://net-tools.sourceforge.net \- Homepage of the net-tools project +diff --git a/man/en_US/nameif.8 b/man/en_US/nameif.8 +index ff2430f..195304d 100644 +--- a/man/en_US/nameif.8 ++++ b/man/en_US/nameif.8 +@@ -1,10 +1,10 @@ +-.TH NAMEIF 8 "18 Oct 2000" "net-tools" "Linux's Administrator's Manual" ++.TH NAMEIF 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + nameif \- name network interfaces based on MAC addresses + .SH SYNOPSIS +-.B "nameif [-c configfile] [-s]" ++.B "nameif [\-c configfile] [\-s]" + .br +-.B "nameif [-c configfile] [-s] {interface macaddress}" ++.B "nameif [\-c configfile] [\-s] {interface macaddress}" + .SH DESCRIPTION + .B nameif + renames network interfaces based on mac addresses. When no arguments are +@@ -18,11 +18,11 @@ looks for the interface with the given MAC address and renames it to the + name given. + + When the +-.I -s ++.I \-s + argument is given all error messages go to the syslog. + + When the +-.I -c ++.I \-c + argument is given with a file name that file is read instead of /etc/mactab. + + .SH NOTES +diff --git a/man/en_US/netstat.8 b/man/en_US/netstat.8 +index b33996a..3157dc4 100644 +--- a/man/en_US/netstat.8 ++++ b/man/en_US/netstat.8 +@@ -6,9 +6,10 @@ + .\" Modified: Bernd.Eckenfels@inka.de + .\" Modified: Andi Kleen ak@muc.de + .\" Modified: Tuan Hoang tqhoang@bigfoot.com ++.\" Modified: Brian Micek bmicek@gmail.com + .\" + .\" +-.TH NETSTAT 8 "19 December 2000" "net-tools" "Linux Programmer's Manual" ++.TH NETSTAT 8 "2012\-09\-15" "net\-tools" "Linux System Administrator's Manual" + + .SH NAME + netstat \- Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships +@@ -19,17 +20,20 @@ netstat \- Print network connections, routing tables, interface statistics, masq + .RI [ address_family_options ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-listening | \-l ] + .RB [ \-\-all | \-a ] + .RB [ \-\-numeric | \-n ] +-.RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] ++.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-symbolic | \-N ] + .RB [ \-\-extend | \-e [ \-\-extend | \-e] ] + .RB [ \-\-timers | \-o ] + .RB [ \-\-program | \-p ] + .RB [ \-\-verbose | \-v ] + .RB [ \-\-continuous | \-c] ++.RB [ \-\-wide | \-W] + .P + .B netstat + .RB { \-\-route | \-r } +@@ -37,37 +41,38 @@ netstat \- Print network connections, routing tables, interface statistics, masq + .RB [ \-\-extend | \-e [ \-\-extend | \-e] ] + .RB [ \-\-verbose | \-v ] + .RB [ \-\-numeric | \-n ] +-.RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] ++.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] + .P + .B netstat + .RB { \-\-interfaces | \-i } +-.RI [ iface ] + .RB [ \-\-all | \-a ] + .RB [ \-\-extend | \-e [ \-\-extend | \-e] ] + .RB [ \-\-verbose | \-v ] + .RB [ \-\-program | \-p ] + .RB [ \-\-numeric | \-n ] +-.RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] ++.RB [ \-\-numeric-hosts "] [" \-\-numeric-ports "] [" \-\-numeric-users ] + .RB [ \-\-continuous | \-c] + .P + .B netstat + .RB { \-\-groups | \-g } + .RB [ \-\-numeric | \-n ] +-.RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] ++.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] + .P + .B netstat + .RB { \-\-masquerade | \-M } + .RB [ \-\-extend | \-e ] + .RB [ \-\-numeric | \-n ] +-.RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] ++.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] + .P + .B netstat + .RB { \-\-statistics | -s } + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .P + .B netstat +@@ -78,13 +83,26 @@ netstat \- Print network connections, routing tables, interface statistics, masq + .P + .IR address_family_options : + .PP +-.RB [ \-\-protocol= { inet , unix , ipx , ax25 , netrom , ddp }[, ...] ] ++.RB [ -4 | \-\-inet ] ++.RB [ -6 | \-\-inet6 ] ++.RB [ \-\-protocol= { inet , inet6 , unix , ipx , ax25 , netrom , ddp ", ... } ]" + .RB [ \-\-unix | \-x ] +-.RB [ \-\-inet | \-\-ip ] ++.RB [ \-\-inet | \-\-ip | \-\-tcpip ] + .RB [ \-\-ax25 ] ++.RB [ \-\-x25 ] ++.RB [ \-\-rose ] ++.RB [ \-\-ash ] + .RB [ \-\-ipx ] + .RB [ \-\-netrom ] +-.RB [ \-\-ddp ] ++.RB [ \-\-ddp | \-\-appletalk ] ++.RB [ \-\-econet | \-\-ec ] ++ ++.SH NOTES ++This program is obsolete. ++Replacement for \fBnetstat\fR is \fBss\fR. ++Replacement for \fBnetstat -r\fR is \fBip route\fR. ++Replacement for \fBnetstat -i\fR is \fBip -s link\fR. ++Replacement for \fBnetstat -g\fR is \fBip maddr\fR. + + .SH DESCRIPTION + .B Netstat +@@ -98,12 +116,17 @@ displays a list of open sockets. If you don't specify any + address families, then the active sockets of all configured address + families will be printed. + .SS "\-\-route , \-r" +-Display the kernel routing tables. ++Display the kernel routing tables. See the description in ++.BR route (8) ++for details. ++.B netstat -r ++and ++.B route -e ++produce the same output. + .SS "\-\-groups , \-g" + Display multicast group membership information for IPv4 and IPv6. +-.SS "\-\-interface=\fIiface \fR, \fB\-i" +-Display a table of all network interfaces, or the specified +-.IR iface ) . ++.SS "\-\-interfaces, \-i" ++Display a table of all network interfaces. + .SS "\-\-masquerade , \-M" + Display a list of masqueraded connections. + .SS "\-\-statistics , \-s" +@@ -112,16 +135,19 @@ Display summary statistics for each protocol. + .SS "\-\-verbose , \-v" + Tell the user what is going on by being verbose. Especially print some + useful information about unconfigured address families. ++.SS "\-\-wide , \-W" ++Do not truncate IP addresses by using output as wide as needed. This is ++optional for now to not break existing scripts. + .SS "\-\-numeric , \-n" + Show numerical addresses instead of trying to determine symbolic host, port + or user names. +-.SS "\-\-numeric-hosts" ++.SS "\-\-numeric\-hosts" + shows numerical host addresses but does not affect the resolution of + port or user names. +-.SS "\-\-numeric-ports" ++.SS "\-\-numeric\-ports" + shows numerical port numbers but does not affect the resolution of + host or user names. +-.SS "\-\-numeric-users" ++.SS "\-\-numeric\-users" + shows numerical user IDs but does not affect the resolution of host or + port names. + +@@ -131,15 +157,18 @@ protocols) for which connections are to be shown. + .I family + is a comma (',') separated list of address family keywords like + .BR inet , ++.BR inet6 , + .BR unix , + .BR ipx , + .BR ax25 , + .BR netrom , ++.BR econet , + and + .BR ddp . + This has the same effect as using the +-.BR \-\-inet , +-.BR \-\-unix " (" \-x ), ++.BR \-\-inet | -4 , ++.BR \-\-inet6 | -6 , ++.BR \-\-unix | -x , + .BR \-\-ipx , + .BR \-\-ax25 , + .BR \-\-netrom , +@@ -149,7 +178,7 @@ options. + .P + The address family + .B inet +-includes raw, udp and tcp protocol sockets. ++(Iv4) includes raw, udp, udplite and tcp protocol sockets. + .SS "\-c, \-\-continuous" + This will cause + .B netstat +@@ -164,23 +193,24 @@ Show the PID and name of the program to which each socket belongs. + Show only listening sockets. (These are omitted by default.) + .SS "\-a, \-\-all" + Show both listening and non-listening sockets. With the +-.B --interfaces +-option, show interfaces that are not marked ++.B \-\-interfaces ++option, show interfaces that are not up + .SS "\-F" + Print routing information from the FIB. (This is the default.) + .SS "\-C" + Print routing information from the route cache. +-.IR UP . + .P + .SH OUTPUT + .P +-.SS Active Internet connections \fR(TCP, UDP, raw)\fR ++.SS Active Internet connections \fR(TCP, UDP, UDPLite, raw)\fR + .SS "Proto" +-The protocol (tcp, udp, raw) used by the socket. +-.SS "Recv-Q" +-The count of bytes not copied by the user program connected to this socket. +-.SS "Send-Q" +-The count of bytes not acknowledged by the remote host. ++The protocol (tcp, udp, udpl, raw) used by the socket. ++.SS "Recv\-Q" ++Established: The count of bytes not copied by the user program connected to this socket. ++Listening: Since Kernel 2.6.18 this column contains the current syn backlog. ++.SS "Send\-Q" ++Established: The count of bytes not acknowledged by the remote host. ++Listening: Since Kernel 2.6.18 this column contains the maximum size of the syn backlog. + .SS "Local Address" + Address and port number of the local end of the socket. Unless the + .BR \-\-numeric " (" \-n ) +@@ -192,7 +222,7 @@ Address and port number of the remote end of the socket. + Analogous to "Local Address." + .SS "State" + The state of the socket. Since there are no states in raw mode and usually no +-states used in UDP, this column may be left blank. Normally this can be one ++states used in UDP and UDPLite, this column may be left blank. Normally this can be one + of several values: + .TP + .I +@@ -221,7 +251,7 @@ TIME_WAIT + The socket is waiting after close to handle packets still in the network. + .TP + .I +-CLOSED ++CLOSE + The socket is not being used. + .TP + .I +@@ -255,7 +285,7 @@ The username or the user id (UID) of the owner of the socket. + .SS "PID/Program name" + Slash-separated pair of the process id (PID) and process name of the + process that owns the socket. +-.B --program ++.B \-\-program + causes this column to be included. You will also need + .I superuser + privileges to see this information on sockets you don't own. This +@@ -356,13 +386,6 @@ to the socket. + .SS Active AX.25 sockets + (this needs to be done by somebody who knows it) + .PP +-.SH NOTES +-Starting with Linux release 2.2 +-.B netstat -i +-does not show interface statistics for alias interfaces. To get per +-alias interface counters you need to setup explicit rules using the +-.BR ipchains(8) +-command. + + .SH FILES + .ta +@@ -385,6 +408,9 @@ status information via the following files. + .I /proc/net/udp + -- UDP socket information + ++.I /proc/net/udplite ++-- UDPLite socket information ++ + .I /proc/net/igmp + -- IGMP multicast information + +@@ -428,9 +454,10 @@ status information via the following files. + .SH SEE ALSO + .BR route (8), + .BR ifconfig (8), +-.BR ipchains (8), + .BR iptables (8), + .BR proc (5) ++.BR ss (8) ++.BR ip (8) + .P + .SH BUGS + Occasionally strange information may appear if a socket changes +@@ -438,12 +465,10 @@ as it is viewed. This is unlikely to occur. + .P + .SH AUTHORS + The netstat user interface was written by Fred Baumgarten +-<dc6iq@insu1.etec.uni-karlsruhe.de> the man page basically ++<dc6iq@insu1.etec.uni\-karlsruhe.de>, the man page basically + by Matt Welsh <mdw@tc.cornell.edu>. It was updated by +-Alan Cox <Alan.Cox@linux.org> but could do with a bit more +-work. It was updated again by Tuan Hoang +-<tqhoang@bigfoot.com>. +-.br +-The man page and the command included in the net-tools +-package is totally rewritten by Bernd Eckenfels +-<ecki@linux.de>. ++Alan Cox <Alan.Cox@linux.org>, updated again by Tuan Hoang ++<tqhoang@bigfoot.com>. The man page and the command included ++in the net\-tools package is totally rewritten by Bernd Eckenfels ++<ecki@linux.de>. UDPLite options were added by Brian Micek ++<bmicek@gmail.com> +diff --git a/man/en_US/plipconfig.8 b/man/en_US/plipconfig.8 +index c6d2567..d42a0bc 100644 +--- a/man/en_US/plipconfig.8 ++++ b/man/en_US/plipconfig.8 +@@ -1,10 +1,18 @@ +-.TH PLIPCONFIG 8 "17 February 1995" "" "" ++.TH PLIPCONFIG 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + plipconfig \- fine tune PLIP device parameters + .SH SYNOPSIS +-.B "plipconfig interface" ++.B plipconfig interface ++.RB [ nibble ++.IR NN ] ++.RB [ trigger ++.IR NN ] + .br +-.B "plipconfig interface [nibble NN] [trigger NN] [unit NN]" ++.B plipconfig ++.RB [ \-V ] ++.RB [ \-\-version ] ++.RB [ \-h ] ++.RB [ \-\-help ] + .SH DESCRIPTION + .B Plipconfig + is used to (hopefully) improve PLIP performance by changing the default +diff --git a/man/en_US/rarp.8 b/man/en_US/rarp.8 +index e462799..d9d31f9 100644 +--- a/man/en_US/rarp.8 ++++ b/man/en_US/rarp.8 +@@ -1,20 +1,20 @@ +-.TH RARP 8 "4 August 1997" "net-tools" "Linux Programmer's Manual" ++.TH RARP 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + rarp \- manipulate the system RARP table + .SH SYNOPSIS +-.B "rarp [-V] [--version] [-h] [--help]" ++.B "rarp [\-V] [\-\-version] [\-h] [\-\-help]" + .br +-.B "rarp -a" ++.B "rarp \-a" + .br +-.B "rarp [-v] -d hostname ..." ++.B "rarp [\-v] \-d hostname ..." + .br +-.B "rarp [-v] [-t type] -s hostname hw_addr" ++.B "rarp [\-v] [\-t type] \-s hostname hw_addr" + .SH NOTE + .P + This program is obsolete. From version 2.3, the Linux kernel + no longer contains RARP support. For a replacement RARP daemon, see + .I +-ftp://ftp.dementia.org/pub/net-tools ++ftp://ftp.dementia.org/pub/net\-tools + .SH DESCRIPTION + .B Rarp + manipulates the kernel's RARP table in various ways. The primary options +@@ -61,8 +61,8 @@ Remove all RARP entries for the specified host. + Create a RARP address mapping entry for host + .B hostname + with hardware address set to +-.B hw_addr +-. The format of the hardware address is dependent on the hardware ++.BR hw_addr . ++The format of the hardware address is dependent on the hardware + class, but for most classes one can assume that the usual presentation + can be used. For the Ethernet class, this is 6 bytes in hexadecimal, + separated by colons. +diff --git a/man/en_US/route.8 b/man/en_US/route.8 +index f59c074..19895e9 100644 +--- a/man/en_US/route.8 ++++ b/man/en_US/route.8 +@@ -1,57 +1,62 @@ +-.TH ROUTE 8 "2 January 2000" "net-tools" "Linux Programmer's Manual" ++.TH ROUTE 8 "2014\-02\-17" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + route \- show / manipulate the IP routing table + .SH SYNOPSIS + .B route +-.RB [ \-CFvnee ] ++.RB [ \-CFvnNee ] ++.RB [ \-A ++family ++.RB | \-4 | \-6 ] + .TP + .B route + .RB [ \-v ] + .RB [ \-A +-family] ++family ++.RB | \-4 | \-6 ] + .B add + .RB [ \-net | \-host ] +-target ++.I target + .RB [ netmask +-Nm] ++.IR Nm ] + .RB [ gw +-Gw] ++.IR Gw ] + .RB [ metric +-N] ++.IR N ] + .RB [ mss +-M] ++.IR M ] + .RB [ window +-W] ++.IR W ] + .RB [ irtt +-I] ++.IR I ] + .RB [ reject ] + .RB [ mod ] + .RB [ dyn ] + .RB [ reinstate ] + .RB [[ dev ] +-If] ++.IR If ] + .TP + .B route + .RB [ \-v ] + .RB [ \-A +-family] ++.I family ++.RB | \-4 | \-6 ] + .B del + .RB [ \-net | \-host ] +-target ++.I target + .RB [ gw +-Gw] ++.IR Gw ] + .RB [ netmask +-Nm] ++.IR Nm ] + .RB [ metric +-N] ++.IR M ] + .RB [[ dev ] +-If] ++.IR If ] + .TP + .B route + .RB [ \-V ] + .RB [ \-\-version ] + .RB [ \-h ] +-.RB [ \--help ] ++.RB [ \-\-help ] + .SH DESCRIPTION + .B Route + manipulates the kernel's IP routing tables. Its primary use is to set +@@ -72,19 +77,27 @@ displays the current contents of the routing tables. + + .SH OPTIONS + .TP +-.B \-A family +-use the specified address family (eg `inet'; use `route --help' for a full +-list). ++\fB\-A \fIfamily\fR ++use the specified address family (eg `inet'). Use ++.B route \-\-help ++for a full list. You can use ++.B \-6 ++as an alias for ++.B \-\-inet6 ++and ++.B \-4 ++as an alias for ++.B \-A inet ++. + + .TP +-.B -F ++.B \-F + operate on the kernel's FIB (Forwarding Information Base) routing + table. + This is the default. + .TP +-.B -C ++.B \-C + operate on the kernel's routing cache. +- + .TP + .B \-v + select verbose operation. +@@ -96,11 +109,10 @@ nameserver has vanished. + .TP + .B \-e + use +-.BR netstat (8)-format ++.BR netstat (8)\-format + for displaying the routing table. + .B \-ee + will generate a very long line with all parameters from the routing table. +- + .TP + .B del + delete a route. +@@ -108,25 +120,27 @@ delete a route. + .B add + add a new route. + .TP +-.B target +-the destination network or host. You can provide IP addresses in dotted +-decimal or host/network names. ++.I target ++the destination network or host. You can provide an addresses or symbolic ++network or host name. Optionally you can use \fB/\fIprefixlen\fR notation ++instead of using the \fBnetmask\fR option. + .TP + .B \-net + the +-.B target ++.I target + is a network. + .TP +-.B -host ++.B \-host + the +-.B target ++.I target + is a host. + .TP +-.B netmask NM ++\fBnetmask \fINM\fR + when adding a network route, the netmask to be used. + .TP +-.B gw GW ++\fBgw \fIGW\fR + route packets via a gateway. ++.br + .B NOTE: + The specified gateway must be reachable first. This usually means that + you have to set up a static route to the gateway beforehand. If you specify +@@ -134,91 +148,94 @@ the address of one of your local interfaces, it will be used to decide about + the interface to which the packets should be routed to. This is a BSDism + compatibility hack. + .TP +-.B metric M +-set the metric field in the routing table (used by routing daemons) to M. ++\fBmetric \fIM\fR ++set the metric field in the routing table (used by routing daemons) to \fIM\fR. If this option is not specified the metric for inet6 (IPv6) address family defaults to '1', for inet (IPv4) it defaults to '0'. You should always specify an explicit metric value to not rely on those defaults - they also differ from iproute2. + .TP +-.B mss M +-set the TCP Maximum Segment Size (MSS) for connections over this route +-to M bytes. +-The default is the device MTU minus headers, or a lower MTU when path mtu +-discovery occured. This setting can be used to force smaller TCP packets on the +-other end when path mtu discovery does not work (usually because of +-misconfigured firewalls that block ICMP Fragmentation Needed) ++\fBmss \fIM\fR ++sets MTU (Maximum Transmission Unit) of the route to \fIM\fR bytes. ++Note that the current implementation of the route command does not allow ++the option to set the Maximum Segment Size (MSS). + .TP +-.B window W +-set the TCP window size for connections over this route to W ++\fBwindow \fIW\fR ++set the TCP window size for connections over this route to \fIW\fR + bytes. This is typically only used on AX.25 networks and with drivers + unable to handle back to back frames. + .TP +-.B irtt I ++\fBirtt \fII\fR + set the initial round trip time (irtt) for TCP connections over this +-route to I milliseconds (1-12000). This is typically only used on ++route to \fII\fR milliseconds (1-12000). This is typically only used on + AX.25 networks. If omitted the RFC 1122 default of 300ms is used. + .TP + .B reject + install a blocking route, which will force a route lookup to fail. + This is for example used to mask out networks before using the default +-route. This is NOT for firewalling. ++route. This is NOT for firewalling. + .TP + .B mod, dyn, reinstate + install a dynamic or modified route. These flags are for diagnostic + purposes, and are generally only set by routing daemons. + .TP +-.B dev If ++\fBdev \fIIf\fR + force the route to be associated with the specified device, as the + kernel will otherwise try to determine the device on its own (by + checking already existing routes and device specifications, and where + the route is added to). In most normal networks you won't need this. + +-If +-.B dev If ++If \fBdev \fIIf\fR + is the last option on the command line, the word + .B dev + may be omitted, as it's the default. Otherwise the order of the route +-modifiers (metric - netmask - gw - dev) doesn't matter. ++modifiers (\fBmetric netmask gw dev\fR) doesn't matter. + + .SH EXAMPLES + .TP +-.B route add -net 127.0.0.0 +-adds the normal loopback entry, using netmask 255.0.0.0 (class A net, +-determined from the destination address) and associated with the +-"lo" device (assuming this device was prviously set up correctly with ++.B route add \-net 127.0.0.0 netmask 255.0.0.0 metric 1024 dev lo ++adds the normal loopback entry, using netmask 255.0.0.0 and associated with the ++"lo" device (assuming this device was previously set up correctly with + .BR ifconfig (8)). + + .TP +-.B route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 +-adds a route to the network 192.56.76.x via +-"eth0". The Class C netmask modifier is not really necessary here because +-192.* is a Class C IP address. The word "dev" can be omitted here. ++.B route add \-net 192.56.76.0 netmask 255.255.255.0 metric 1024 dev eth0 ++adds a route to the local network 192.56.76.x via ++"eth0". The word "dev" can be omitted here. + + .TP +-.B route add default gw mango-gw ++.B route del default ++deletes the current default route, which is labeled "default" or 0.0.0.0 ++in the destination field of the current routing table. ++ ++.TP ++.B route add default gw mango + adds a default route (which will be used if no other route matches). +-All packets using this route will be gatewayed through "mango-gw". The ++All packets using this route will be gatewayed through the address of a node ++named "mango". The + device which will actually be used for that route depends on how we +-can reach "mango-gw" - the static route to "mango-gw" will have to be +-set up before. ++can reach "mango" - "mango" must be on directly reachable route. + + .TP +-.B route add ipx4 sl0 +-Adds the route to the "ipx4" host via the SLIP interface (assuming that +-"ipx4" is the SLIP host). ++.B route add mango sl0 ++Adds the route to the host named "mango" via the SLIP interface (assuming that ++"mango" is the SLIP host). + + .TP +-.B route add -net 192.57.66.0 netmask 255.255.255.0 gw ipx4 ++.B route add \-net 192.57.66.0 netmask 255.255.255.0 gw mango + This command adds the net "192.57.66.x" to be gatewayed through the former + route to the SLIP interface. + + .TP +-.B route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 ++.B route add \-net 224.0.0.0 netmask 240.0.0.0 dev eth0 + This is an obscure one documented so people know how to do it. This sets + all of the class D (multicast) IP routes to go via "eth0". This is the + correct normal configuration line with a multicasting kernel. + + .TP +-.B route add -net 10.0.0.0 netmask 255.0.0.0 reject ++.B route add \-net 10.0.0.0 netmask 255.0.0.0 metric 1024 reject + This installs a rejecting route for the private network "10.x.x.x." + ++.TP ++.B route -6 add 2001:0002::/48 metric 1 dev eth0 ++This adds a IPv6 route with the specified metric to be directly reachable via eth0. ++ + .LP + .SH OUTPUT + The output of the kernel routing table is organized in the following columns +@@ -275,21 +292,20 @@ entry) + route) + .TP + .B Metric +-The 'distance' to the target (usually counted in hops). It is not used by +-recent kernels, but may be needed by routing daemons. ++The 'distance' to the target (usually counted in hops). + .TP + .B Ref + Number of references to this route. (Not used in the Linux kernel.) + .TP + .B Use +-Count of lookups for the route. Depending on the use of -F and -C this will +-be either route cache misses (-F) or hits (-C). ++Count of lookups for the route. Depending on the use of \-F and \-C this will ++be either route cache misses (\-F) or hits (\-C). + .TP + .B Iface + Interface to which packets for this route will be sent. + .TP + .B MSS +-Default maximum segement size for TCP connections over this route. ++Default maximum segment size for TCP connections over this route. + .TP + .B Window + Default window size for TCP connections over this route. +@@ -313,8 +329,12 @@ Whether or not the hardware address for the cached route is up to date. + .br + .I /proc/net/rt_cache + .LP +-.SH SEE ALSO +-.I ifconfig(8), netstat(8), arp(8), rarp(8) ++.SH "SEE ALSO" ++.IR ifconfig (8), ++.IR netstat (8), ++.IR arp (8), ++.IR rarp (8), ++.IR ip (8) + .LP + .SH HISTORY + .B Route +@@ -323,4 +343,4 @@ for Linux was originally written by Fred N. van Kempen, + Linus Torvalds for pl15. Alan Cox added the mss and window options for + Linux 1.1.22. irtt support and merged with netstat from Bernd Eckenfels. + .SH AUTHOR +-Currently maintained by Phil Blundell <Philip.Blundell@pobox.com>. ++Currently maintained by Phil Blundell <Philip.Blundell@pobox.com> and Bernd Eckenfels <net-tools@lina.inka.de>. +diff --git a/man/en_US/slattach.8 b/man/en_US/slattach.8 +index 0c4c863..0e2cfcc 100644 +--- a/man/en_US/slattach.8 ++++ b/man/en_US/slattach.8 +@@ -1,8 +1,8 @@ +-.TH SLATTACH 8 "12 Feb 1994" "" "" ++.TH SLATTACH 8 "2011\-12\-31" "net\-tools" "Linux System Administrator's Manual" + .SH NAME + slattach \- attach a network interface to a serial line + .SH SYNOPSIS +-.B "slattach [-dehlLmnqv] [-c command] [-p proto] [-s speed] [tty]" ++.B "slattach [\-dehlLmnqv] [\-c command] [\-p proto] [\-s speed] [tty]" + .br + .SH DESCRIPTION + .B Slattach +@@ -11,47 +11,53 @@ is a tiny little program that can be used to put a normal terminal + you to use it for point-to-point links to other computers. + .SH OPTIONS + .TP +-.B "[-c command]" ++.B tty ++Path to a serial device like ++.IR /dev/ttyS* ", " /dev/cua* " or " /dev/ptmx ++to spawn a new pseudo tty. ++.TP ++.B "[\-c command]" + Execute + .B command + when the line is hung up. This can be used to run scripts or re-establish + connections when a link goes down. + .TP +-.B "[-d]" ++.B "[\-d]" + Enable debugging output. Useful when determining why a given + setup doesn't work. + .TP +-.B "[-h]" ++.B "[\-h]" + Exit when the carrier is lost. This works on both /dev/tty and /dev/cua + devices by directly monitoring the carrier status every 15 seconds. +-.B "[-v]" ++.TP ++.B "[\-v]" + Enable verbose output. Useful in shell scripts. + .TP +-.B "[-q]" ++.B "[\-q]" + Operate in quiet mode - no messages at all. + .TP +-.B "[-l]" ++.B "[\-l]" + Create an UUCP-style lockfile for the device in /var/lock. + .TP +-.B "[-n]" ++.B "[\-n]" + Equivalent to the "mesg n" command. + .TP +-.B "[-m]" ++.B "[\-m]" + Do \fBnot\fP initialize the line into 8 bits raw mode. + .TP +-.B "[-e]" ++.B "[\-e]" + Exit right after initializing device, instead of waiting for the +-line to hangup. ++line to hang up. + .TP +-.B "[-L]" ++.B "[\-L]" + Enable 3 wire operation. The terminal is moved into CLOCAL mode, + carrier watching is disabled. + .TP +-.B "[-p proto]" ++.B "[\-p proto]" + Set a specific kind of protocol to use on the line. The default + is set to +-.B "cslip" +-, i.e. compressed SLIP. Other possible values are ++.BR "cslip" , ++i.e. compressed SLIP. Other possible values are + .B "slip" + (normal SLIP), + .B "adaptive" +@@ -70,14 +76,14 @@ to be active on the line. For kiss connections the + .B axattach + program should be used. + .TP +-.B "[-s speed]" ++.B "[\-s speed]" + Set a specific line speed, other than the default. + .PP + If no arguments are given, the current terminal line (usually: the + login device) is used. Otherwise, an attempt is made to claim the + indicated terminal port, lock it, and open it. + .SH FILES +-.I /dev/cua* /var/lock/LCK.* ++.I /dev/cua* /var/lock/LCK.* /dev/ttyS* /dev/ptmx + .SH BUGS + None known. + .SH SEE ALSO +diff --git a/man/fr_FR/arp.8 b/man/fr_FR/arp.8 +index df37e8b..a669469 100644 +--- a/man/fr_FR/arp.8 ++++ b/man/fr_FR/arp.8 +@@ -1,32 +1,32 @@ +-.TH ARP 8 "5 Jan 1999" "net-tools" "Linux Programmer's Manual" ++.TH ARP 8 "5 Jan 1999" "net-tools" "Linux Administrator's Manual" + .SH NOM +-arp \- manipule la table ARP du systme ++arp \- manipule la table ARP du système + .SH SYNOPSIS + .B arp + .RB [ \-vn ] + .RB [ "\-H type" ] + .RB [ "-i if" ] + .B -a +-.RB [ nom_hte ] ++.RB [ nom_hôte ] + .PP + .B arp + .RB [ \-v ] + .RB [ "\-i if" ] +-.B "\-d nom_hte" ++.B "\-d nom_hôte" + .RB [ pub ] + .PP + .B arp + .RB [ \-v ] + .RB [ "\-H type" ] + .RB [ "\-i if" ] +-.B -s nom_hte hw_addr ++.B -s nom_hôte hw_addr + .RB [ temp ] + .PP + .B arp + .RB [ \-v ] + .RB [ "\-H type" ] + .RB [ "\-i if" ] +-.B -s nom_hte hw_addr ++.B -s nom_hôte hw_addr + .RB [ "netmask nm" ] + .B pub + .PP +@@ -34,7 +34,7 @@ arp \- manipule la table ARP du syst + .RB [ \-v ] + .RB [ "\-H type" ] + .RB [ "\-i if" ] +-.B -Ds nom_hte ifa ++.B -Ds nom_hôte ifa + .RB [ "netmask nm" ] + .B pub + .PP +@@ -46,33 +46,33 @@ arp \- manipule la table ARP du syst + + .SH DESCRIPTION + .B Arp +-manipule la table ARP du noyau de diffrentes faons. Les options principales +-permettent d'effacer une correspondance d'adresses et d'en dfinir ++manipule la table ARP du noyau de différentes façons. Les options principales ++permettent d'effacer une correspondance d'adresses et d'en définir + une manuellement. +-Pour les besoins de dbogage, le programme ++Pour les besoins de débogage, le programme + .B arp + permet aussi d'effectuer un dump complet de la table ARP. + .SH OPTIONS + .TP + .B "\-v, \-\-verbose" +-Dit l'utilisateur ce qui se passe en tant verbeux. ++Dit à l'utilisateur ce qui se passe en étant verbeux. + .TP + .B "\-n, \-\-numeric" +-Affiche les adresses numriques au lieu d'essayer de dterminer les nom +-d'htes symboliques. ++Affiche les adresses numériques au lieu d'essayer de déterminer les nom ++d'hôtes symboliques. + .TP + .B "\-H type, \-\-hw-type type" +-En positionnant ou lisant les entres ARP, ce paramtre optionnel indique +- ++En positionnant ou lisant les entrées ARP, ce paramètre optionnel indique ++à + .B arp +-les classes d'entres qu'il doit contrler. La valeur par dfaut de +-ce paramtre est ++les classes d'entrées qu'il doit contrôler. La valeur par défaut de ++ce paramètre est + .B ether +-(i.e. code de matriel ++(i.e. code de matériel + .B 0x01 + pour + .B "IEEE 802.3 10Mbps Ethernet". +-D'autres valeurs doivent correspondre des technologies rseaux telles que ++D'autres valeurs doivent correspondre à des technologies réseaux telles que + .RB "ARCnet (" arcnet ")" + , + .RB "PROnet (" pronet ")" +@@ -81,89 +81,89 @@ D'autres valeurs doivent correspondre + and + .RB "NET/ROM (" netrom ")." + .TP +-.B "\-a [nom_d_hte], \-\-display [nom_d_hte]" +-Affiche les entres concernant l'hte spcifi. Si le paramtre +-.B nom_d_hte +-n'est pas utilis, ++.B "\-a [nom_d_hôte], \-\-display [nom_d_hôte]" ++Affiche les entrées concernant l'hôte spécifié. Si le paramètre ++.B nom_d_hôte ++n'est pas utilisé, + .B toutes +-les entres seront affiches. ++les entrées seront affichées. + .TP +-.B "\-d nom_d_hte, \-\-delete nom_d_hte" +-Enlve une entre pour l'hte spcifi. Ceci peut tre +-utilis si l'hte concern ne fonctionne plus, par exemple. ++.B "\-d nom_d_hôte, \-\-delete nom_d_hôte" ++Enlève une entrée pour l'hôte spécifié. Ceci peut être ++utilisé si l'hôte concerné ne fonctionne plus, par exemple. + .TP + .B "\-D, \-\-use-device" +-Utilise l'adresse matrielle de l'interface ++Utilise l'adresse matérielle de l'interface + .BR ifa + . + .TP + .B "\-i If, \-\-device If" +-Slectionne une interface. Lors du dump du cache ARP, seules les entres +-correspondant l'interface spcifie seront affiches. Lorsque l'on dfinit +-une entre permanente ou une entre ++Sélectionne une interface. Lors du dump du cache ARP, seules les entrées ++correspondant à l'interface spécifiée seront affichées. Lorsque l'on définit ++une entrée permanente ou une entrée + .B temp +-, cette interface lui sera associe; si cette option n'est pas utilise, +-le noyau fera des tentatives de rsolution selon la table de routage. Pour +-les entres ++, cette interface lui sera associée; si cette option n'est pas utilisée, ++le noyau fera des tentatives de résolution selon la table de routage. Pour ++les entrées + .B pub +-l'interface spcifie est celle pour laquelle les requtes ARP auront trouv +-une rponse. ++l'interface spécifiée est celle pour laquelle les requêtes ARP auront trouvé ++une réponse. + .br + .B NOTE: +-Ceci est diffrent de l'interface vers laquelle les datagrammes IP seront routs. ++Ceci est différent de l'interface vers laquelle les datagrammes IP seront routés. + .TP +-.B "\-s nom_d_hte hw_addr, \-\-set hostname hw_addr" +-Cre manuellement une correspondance d'adresses ARP pour l'hte +-.B nom_d_hte +-avec l'adresse matrielle positionne ++.B "\-s nom_d_hôte hw_addr, \-\-set hostname hw_addr" ++Crée manuellement une correspondance d'adresses ARP pour l'hôte ++.B nom_d_hôte ++avec l'adresse matérielle positionnée à + .B hw_addr. +-Le format de l'adresse matrielle est dpendant de la classe du matriel, +-mais pour la plupart on peut considrer que la prsentation classique +-peut tre utilise. Pour la classe Ethernet, c'est 6 octets en hexadcimal, +-spars par des double-points. Pour ajouter des entres proxy-arp ++Le format de l'adresse matérielle est dépendant de la classe du matériel, ++mais pour la plupart on peut considérer que la présentation classique ++peut être utilisée. Pour la classe Ethernet, c'est 6 octets en hexadécimal, ++séparés par des double-points. Pour ajouter des entrées proxy-arp + (Ce sont celles avec l'indicateur + .BR pub lish +-positionn) +-un masque rseau ( ++positionné) ++un masque réseau ( + .B netmask +-) peut tre spcifi au proxy-arp pour le +-sous-rseau entier. Ceci n'est pas trs recommand, mais est support par ++) peut être spécifié au proxy-arp pour le ++sous-réseau entier. Ceci n'est pas très recommandé, mais est supporté par + les anciens noyaux, car c'est utile dans certains cas. Si l'indicateur + .B temp +-n'est pas fourni, les entres ARP seront permanentes. ++n'est pas fourni, les entrées ARP seront permanentes. + .br + .B NOTE: +-A partir du noyau 2.2.0 il n'est plus possible de dfinir des entres ARP +-pour un sous rseau entier. ++A partir du noyau 2.2.0 il n'est plus possible de définir des entrées ARP ++pour un sous réseau entier. + .TP + .B "\-f nom_de_fichier, \-\-file nom_de_fichier" +-Similaire l'option ++Similaire à l'option + .B \-s + , mais cette fois les informations d'adresses sont prises dans le fichier +-.B nom_de_fichier +-. Ceci peut tre utilis si les entres ARP configurer sont +-nombreuses. Le nom du fichier de donnes est trs souvent nomm ++.BR nom_de_fichier . ++Ceci peut être utilisé si les entrées ARP à configurer sont ++nombreuses. Le nom du fichier de données est très souvent nommé + .B /etc/ethers + , mais ce n'est pas officiel. + .sp 1 + Le format du fichier est simple; Il contient +-seulement des lignes de texte ASCII avec sur chaque ligne un nom d'hte et +-une adresse matrielle, spars par des espaces. Les indicateurs ++seulement des lignes de texte ASCII avec sur chaque ligne un nom d'hôte et ++une adresse matérielle, séparés par des espaces. Les indicateurs + .BR "pub" , " temp" " et" " netmask" +-peuvent galement tre utiliss. ++peuvent également être utilisés. + .LP +-A tous les endroits o un +-.B nom d'hte ++A tous les endroits où un ++.B nom d'hôte + est attendu, on peut aussi entrer une + .B "addresse IP" +-en notation dcimale pointe. ++en notation décimale pointée. + .LP +-Chaque entre complte se trouvant dans le cache ARP est marque de ++Chaque entrée complète se trouvant dans le cache ARP est marquée de + l'indicateur +-.B C +-. Les entres permanentes sont marques de l'indicateur ++.BR C . ++Les entrées permanentes sont marquées de l'indicateur + .B M +-et les entres 'pub' ont l'indicateur ++et les entrées 'pub' ont l'indicateur + .B P + . + .SH FICHIERS +@@ -177,8 +177,8 @@ et les entr + .SH VOIR AUSSI + rarp(8), route(8), ifconfig(8), netstat(8) + .SH AUTEUR +-Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> avec les amliorations +-apportes par le mainteneur des net-tools Bernd Eckenfels ++Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> avec les améliorations ++apportées par le mainteneur des net-tools Bernd Eckenfels + <net-tools@lina.inka.de>. + .SH TRADUCTION + Jean Michel VANSTEENE (vanstee@worldnet.fr) +diff --git a/man/fr_FR/ethers.5 b/man/fr_FR/ethers.5 +index 5e70929..030fdf6 100644 +--- a/man/fr_FR/ethers.5 ++++ b/man/fr_FR/ethers.5 +@@ -5,7 +5,7 @@ + .\" + .TH ETHERS 5 "26 Avril 1996" "" "Formats de fichiers" + .SH NOM \"{{{roff}}}\"{{{ +-ethers \- Base de donnes adresses Ethernet - adresses IP ++ethers \- Base de données adresses Ethernet - adresses IP + .\"}}} + .SH DESCRIPTION \"{{{ + \fB/etc/ethers\fP contient des adresses Ethernet sur 48 bits et leur +@@ -15,14 +15,14 @@ adresse IP correspondante, une ligne par adresses IP: + \fIAdresse-Ethernet\fP \fIAdresse-IP\fP + .RE + .sp +-Les deux items sont spars par un ou plusieurs espaces et/ou tabulations. +-Un \fB#\fP en dbut de ligne est un commentaire pour tout le reste de la ligne. +-L'\fIadresse-Ethernet\fP est crite sous la forme ++Les deux items sont séparés par un ou plusieurs espaces et/ou tabulations. ++Un \fB#\fP en début de ligne est un commentaire pour tout le reste de la ligne. ++L'\fIadresse-Ethernet\fP est écrite sous la forme + .IR x : x : x : x : x : x , +-o \fIx\fP est une valeur hxadecimale comprise entre \fB0\fP et \fBff\fP +-reprsentant un octet de l'adresse, dans l'ordre du rseau (big-endian). +-L'\fIAdresse-IP\fP peut tre soit un nom d'hte rsolu par DNS ou une adresse +-en notation dcimale pointe. ++où \fIx\fP est une valeur héxadecimale comprise entre \fB0\fP et \fBff\fP ++représentant un octet de l'adresse, dans l'ordre du réseau (big-endian). ++L'\fIAdresse-IP\fP peut être soit un nom d'hôte résolu par DNS ou une adresse ++en notation décimale pointée. + .\"}}} + .SH EXEMPLES \"{{{ + 08:00:20:00:61:CA pal +diff --git a/man/fr_FR/hostname.1 b/man/fr_FR/hostname.1 +index c4cd412..3adaf4b 100644 +--- a/man/fr_FR/hostname.1 ++++ b/man/fr_FR/hostname.1 +@@ -1,16 +1,16 @@ + .TH HOSTNAME 1 "15 Mars 1999" "net-tools" "Linux Programmer's Manual" + .SH NOM +-hostname \- affiche ou dfinit le nom d'hte du systme ++hostname \- affiche ou définit le nom d'hôte du système + .br +-domainname \- affiche le nom de domaine NIS/YP du systme ++domainname \- affiche le nom de domaine NIS/YP du système + .br +-dnsdomainname \- affiche le nom de domaine du systme ++dnsdomainname \- affiche le nom de domaine du système + .br +-nisdomainname \- affiche ou dfinit le nom de domaine NIS/YP du systme ++nisdomainname \- affiche ou définit le nom de domaine NIS/YP du système + .br +-ypdomainname \- affiche ou dfinit le nom de domaine NIS/YP du systme ++ypdomainname \- affiche ou définit le nom de domaine NIS/YP du système + .br +-nodename \- affiche ou dfinit le nom de domaine DECnet du systme ++nodename \- affiche ou définit le nom de domaine DECnet du système + + .SH SYNOPSIS + .B hostname +@@ -73,45 +73,45 @@ nodename \- affiche ou d + + .SH DESCRIPTION + .B Hostname +-est le programme utilis soit pour dfinir le nom d'hte, soit +-pour visualiser le nom d'hte ou de domaine du systme. Ce nom est +-utilis par diffrents programmes rseaux pour identifier la machine. Le +-nom de domaine est galement utilis par les NIS/YP. ++est le programme utilisé soit pour définir le nom d'hôte, soit ++pour visualiser le nom d'hôte ou de domaine du système. Ce nom est ++utilisé par différents programmes réseaux pour identifier la machine. Le ++nom de domaine est également utilisé par les NIS/YP. + + .SS "OBTENTION DU NOM" +-Appel sans argument, le programme affiche les noms courants: ++Appelé sans argument, le programme affiche les noms courants: + + .LP + .B hostname +-fournit le nom du systme tel qu'il est retourn par la fonction +-.BR getdomainname (2) +-. Ceci est connu comme nom de domaine YP/NIS du systme. ++fournit le nom du système tel qu'il est retourné par la fonction ++.BR getdomainname (2). ++Ceci est connu comme nom de domaine YP/NIS du système. + + + .LP + .B nodename +-fournit le nom de noeud DECnet du systme tel qu'il est retourn par la ++fournit le nom de noeud DECnet du système tel qu'il est retourné par la + fonction + .BR getnodename (2) + . + + .LP + .B dnsdomainname +-fournit la partie domaine du nom compltement qualifi - FQDN (Fully +-Qualified Domain Name). Le nom FQDN du systme est retourn par la commande ++fournit la partie domaine du nom complètement qualifié - FQDN (Fully ++Qualified Domain Name). Le nom FQDN du système est retourné par la commande + .BR "hostname \-\-fqdn" . + + .SS "SET NAME" +-Appel avec un argument ou avec l'option ++Appelé avec un argument ou avec l'option + .B \-\-file +-, la commande dfinit le nom d'hte, le nom de domaine NIS/YP ou ++, la commande définit le nom d'hôte, le nom de domaine NIS/YP ou + le nom de noeud. + + .LP + Notez que seul le super-utilisateur peut changer les noms. + + .LP +-Il n'est pas possible de dfinir le nom FQDN ou le nom de domaine DNS avec ++Il n'est pas possible de définir le nom FQDN ou le nom de domaine DNS avec + la commande + .B dnsdomainname + (voir +@@ -119,8 +119,8 @@ la commande + ci-dessous). + + .LP +-Le nom d'hte est gnrallement dfinit une seule fois, au +-dmarrage du systme, par le script de configuration ++Le nom d'hôte est générallement définit une seule fois, au ++démarrage du système, par le script de configuration + .I /etc/rc.d/rc.inet1. + ou + .I /etc/init.d/boot +@@ -132,45 +132,45 @@ Vous pouvez modifier le FQDN (tel que fourni par la commande + .BR "hostname \-\-fqdn" ) + ou le nom de domaine DNS (tel que fourni par la commande + .BR "dnsdomainname" ) +-avec cette commande. Le FQDN du systme est le nom que le resolveur ( ++avec cette commande. Le FQDN du système est le nom que le resolveur ( + .BR resolver (3) +- ) retourne comme nom d'hte. ++ ) retourne comme nom d'hôte. + + .LP + Techniquement: Le FQDN est le nom fourni par + .BR gethostbyname (2) +- partir du nom d'hte retourn par ++à partir du nom d'hôte retourné par + .BR gethostname (2). + Le nom de domaine DNS est la partie suivant le premier point. + .LP +-La faon dont vous pouvez le changer dpend de la configuration ++La façon dont vous pouvez le changer dépend de la configuration + (habituellement dans +-.IR /etc/host.conf ) +-. Si le fichier 'hosts' est analys avant d'interroger le DNS ou ++.IR /etc/host.conf ). ++Si le fichier 'hosts' est analysé avant d'interroger le DNS ou + NIS) vous pouvez le changer dans le fichier + .IR /etc/hosts . + + .SH OPTIONS + .TP + .I "\-a, \-\-alias" +-Affiche l'alias de l'hte (si utilis). ++Affiche l'alias de l'hôte (si utilisé). + .TP + .I "\-d, \-\-domain" + Affiche le nom du domaine DNS. Ne pas utiliser la commande + .B domainname +-pour obtenir le nom de domaine DNS car vous obtiendrez en ralit le +-nom de domaine NIS. Utilisez plutt la commande ++pour obtenir le nom de domaine DNS car vous obtiendrez en réalité le ++nom de domaine NIS. Utilisez plutôt la commande + .B dnsdomainname + . + .TP + .I "\-F, \-\-file nom_fichier" +-Lit le nom d'hte partir du fichier spcifi. Les commentaires (lignes commenant +-par un `#') sont ignors. ++Lit le nom d'hôte à partir du fichier spécifié. Les commentaires (lignes commençant ++par un `#') sont ignorés. + .TP + .I "\-f, \-\-fqdn, \-\-long" +-Affiche le nom pleinement qualifi - FQDN (Fully Qualified Domain Name). un +-FQDN consiste en un nom d'hte court et un nom de domaine. A moins que vous +-utilisiez 'bind' ou les NIS pour la recherche d'htes, vous pouvez changer ++Affiche le nom pleinement qualifié - FQDN (Fully Qualified Domain Name). un ++FQDN consiste en un nom d'hôte court et un nom de domaine. A moins que vous ++utilisiez 'bind' ou les NIS pour la recherche d'hôtes, vous pouvez changer + le nom FQDN et le nom de domaine (qui fait partie du FQDN) dans le fichier + \fI/etc/hosts\fR. + .TP +@@ -178,15 +178,15 @@ le nom FQDN et le nom de domaine (qui fait partie du FQDN) dans le fichier + Affiche un message d'aide et se termine. + .TP + .I "\-i, \-\-ip-address" +-Affiche la (les) adresse(s) IP de l'hte. ++Affiche la (les) adresse(s) IP de l'hôte. + .TP + .I "\-n, \-\-node" +-Affiche le nom de noeud DECnet. Si un paramtre est fourni (ou ++Affiche le nom de noeud DECnet. Si un paramètre est fourni (ou + .B \-\-file nom_fichier +-) le super-utilisateur peut galement dfinir un nouveau nom de neud. ++) le super-utilisateur peut également définir un nouveau nom de neud. + .TP + .I "\-s, \-\-short" +-Affiche le nom d'hte en format court. Il s'agit du nom d'hte coup au ++Affiche le nom d'hôte en format court. Il s'agit du nom d'hôte coupé au + premier point. + .TP + .I "\-V, \-\-version" +@@ -197,9 +197,9 @@ termine correctement. + Mode verbeux. + .TP + .I "\-y, \-\-yp, \-\-nis" +-Affiche le nom de domaine NIS. Si un paramtre est fourni (ou ++Affiche le nom de domaine NIS. Si un paramètre est fourni (ou + .B \-\-file nom_fichier +-) le super-utilisateur peut galement dfinir un nouveau nom de domaine NIS. ++) le super-utilisateur peut également définir un nouveau nom de domaine NIS. + .SH FICHIERS + .B /etc/hosts + .SH AUTEURS +diff --git a/man/fr_FR/ifconfig.8 b/man/fr_FR/ifconfig.8 +index 0c29eb0..821f164 100644 +--- a/man/fr_FR/ifconfig.8 ++++ b/man/fr_FR/ifconfig.8 +@@ -1,160 +1,178 @@ +-.TH IFCONFIG 8 "4 August 1997" "net-tools" "Linux Programmer's Manual" ++.\" ++.\" Traduction : Jean Michel VANSTEENE <vanstee@worldnet.fr> ++.\" zz/08/1997 ++.\" Màj zz/08/2004 net-tools-1.60 Guillaume Audirac ++.\" Màj 17/08/2006 net-tools-1.65 Alain Portal ++.\" ++.TH IFCONFIG 8 "30 juin 2005" "net-tools" "Manuel de l'administrateur Linux" + .SH NOM +-ifconfig \- configure une interface rseau ++ifconfig \- Configurer une interface réseau. + .SH SYNOPSIS +-.B "ifconfig [interface]" ++.B "ifconfig [\-v] [\-a] [\-s] [interface]" + .br +-.B "ifconfig interface [aftype] options | adresse ..." ++.B "ifconfig [\-v] interface [aftype] options | adresse ..." + .SH DESCRIPTION +-.B Ifconfig +-est utilis pour configurer (et maintenir ensuite) les interfaces +-rseau rsidentes dans le noyau. Il est utilis lors du boot pour +-configurer la plupart d'entre-elles et ainsi rendre le systme +-oprationnel. Aprs, ce n'est quasiment plus utilis que pour +-le dbogage ou pour des rglages si ncessaire. ++.B ifconfig ++permet de configurer les interfaces réseau présentes dans le noyau. ++On peut les configurer lors du démarrage quand c'est nécessaire. Ensuite, ++on l'utilise généralement pour le débogage ou pour d'éventuels réglages. + .LP +-Si aucun argument n'est donn, ++Si aucun argument n'est donné, + .B ifconfig +-affiche simplement l'tat des interfaces actuellement dfinies. Si +-seul le paramtre ++affiche l'état des interfaces actives. Si seul le paramètre + .B interface +-est donn, il affiche seulement l'tat de l'interface correspondante; +-si seul le paramtre +-.B -a +-est fourni, il affiche l'tat de toutes les interfaces, mme celles qui +-ne sont pas actives. +-Autrement, il considre qu'il faut positionner de nouvelles valeurs. +- +-.SH Familles d'adresses +-Si le premier argument aprs le nom de l'interface est reconnu comme +-tant un nom de famille d'adresses support, cette famille d'adresses +-est utilise pour dcoder et afficher toutes les adresses +-protocolaires. Les familles d'adresses actuellement supportes comprennent ++est donné, il affiche seulement l'état de l'interface correspondante\ ; ++si seul le paramètre ++.B \-a ++est fourni, il affiche l'état de toutes les interfaces, même celles ++qui sont inactives. Autrement, il permet de configurer une interface. ++.SH Familles d'Adresses ++Si le premier argument après le nom d'interface est reconnu comme ++le nom d'une famille d'adresses prise en charge, alors cette famille ++d'adresses est utilisée pour décoder et afficher toutes les adresses ++du protocole. Les familles d'adresses actuellement prises en charge ++comprennent + .B inet +-(TCP/IP, default) ++(TCP/IP, par défaut), ++.B inet6 ++(IPv6), + .B ax25 +-(AMPR Packet Radio.) ++(AMPR Packet Radio), + .B ddp +-(Appletalk Phase 2) and ++(Appletalk Phase 2), + .B ipx +-(Novell IPX). ++(Novell IPX) et ++.B netrom ++(AMPR Packet Radio). + .SH OPTIONS + .TP ++.B \-a ++Afficher toutes les interfaces actuellement disponibles, même celles ++qui sont inactives. ++.TP ++.B \-s ++Afficher un résumé (comme netstat \-i). ++.TP ++.B \-v ++Mode volubile pour certains types d'erreurs. ++.TP + .B interface +-Le nom de l'interface rseau. C'est gnralement un nom de pilote suivi +-d'un numro d'ordre comme ++Correspond au nom de l'interface de réseau. C'est généralement un nom de ++pilote suivi d'un chiffre, comme + .B eth0 +-pour la premire interface Ethernet. ++pour la première interface Ethernet. Si votre noyau accepte les alias ++d'interfaces, vous pouvez les spécifier avec ++.B eth0:0 ++pour le premier alias de eth0. On peut les utiliser pour les affecter ++à une seconde adresse. Pour supprimer un alias d'interface, utilisez ++.BR "ifconfig eth0:0 down" . ++Note\ : pour chaque groupe (un même noeud donné par une combinaison ++adresse/masque de réseau), si vous supprimez le premier alias (le ++principal), tous les alias sont supprimés. + .TP + .B up +-Cette option active l'interface. Elle est implicitement spcifie +-si une nouvelle adresse est affecte l'interface (voir plus loin). ++Activer l'interface donnée. Cette option est implicite si une adresse est ++affectée à l'interface. + .TP + .B down +-Cette option arrte le fonctionnement du pilote pour cette interface, et +-est utilise lorsque les choses commencent aller mal. ++Désactiver le pilote pour l'interface donnée. + .TP + .B "[\-]arp" +-Valide ou invalide l'utilisation du protocole ARP sur cette interface. Si +-le signe moins (\-) est prsent, l'option est invalide. ++Activer ou désactiver l'utilisation du protocole ARP sur une interface. + .TP + .B "[\-]promisc" +-Valide ou invalide le mode +-.B promiscuous +-. S'il est valid, tous les paquets circulant sur le rseau +-seront reus sur cette interface. ++Activer ou désactiver le mode ++.BR promiscuous . ++S'il est activé, tous les paquets circulant sur le réseau seront reçus ++par l'interface. + .TP + .B "[\-]allmulti" +-Valide ou invalide le fonctionnement de l'interface en mode +-.B all-multicast +-. S'il est valid, tous les paquets multicast circulant sur le rseau +-seront reus sur cette interface. ++Activer ou désactiver le mode ++.BR all-multicast . ++S'il est activé, l'interface recevra tous les paquets de multidiffusion ++circulant sur le réseau. + .TP + .B "metric N" +-Ce paramtre dfinit la mtrique de l'interface. Il n'est pour +-l'instant pas implment, mais le sera prochainement. ++Définir la métrique de l'interface. + .TP + .B "mtu N" +-Ce paramtre dfinit le MTU (Maximum Transfer Unit) d'une +-interface. ++Définir l'unité de transfert maximum ou MTU («\ Maximum Transfer Unit\ ») ++d'une interface. + .TP +-.B "dstaddr adr" +-Dfinit l'adresse IP de "l'autre bout" dans le cas d'un lien +-point--point, comme PPP. Ce paramtre est obsolte; utilisez plutt +-le paramtre +-.B pointopoint. ++.B "dstaddr adresse" ++Définir l'adresse IP distante dans le cas d'un lien point-à-point ++(comme PPP). Cette option est obsolète\ ; utilisez à la place l'option ++.BR pointopoint . + .TP +-.B "netmask adr" +-Dfinit le masque de rseau IP pour cette interface. La valeur par +-dfaut de cette valeur correspond au masque rseau usuel pour les +-classes A, B ou C (dduite de l'adresse IP), mais toute autre valeur peut +-tre dfinie selon les besoins en sous-rseaux. ++.B "netmask adresse" ++Définir le masque de réseau IP pour cette interface. La valeur par ++défaut correspond au masque de réseau usuel pour les classes A, B ou C ++(déduite de l'adresse IP), mais une autre valeur peut être définie. + .TP +-.B "add adr/lg_prefix" +-Ajoute une adresse IPv6 une interface. ++.B "add adresse/long_préfixe" ++Ajouter une adresse IPv6 à une interface. + .TP +-.B "del adr/lg_prefix" +-Supprime une adresse IPv6 d'une interface. ++.B "del adresse/long_préfixe" ++Supprimer une adresse IPv6 d'une interface. + .TP + .B "tunnel aa.bb.cc.dd" +-Cre un nouveau priphrique SIT (IPv6-dans-IPv4), en mode +-tunnel jusqu' la destination. ++Créer un nouveau périphérique SIT (IPv6-dans-IPv4), fonctionnant en mode ++tunnel jusqu'à la destination donnée. + .TP +-.B "irq adr" +-Dfinit la ligne d'interruption utilise par ce +-priphrique. Certains priphriques ne supportent pas le +-changement dynamique de l'IRQ. ++.B "irq adresse" ++Définir la ligne d'interruption utilisée par un périphérique. ++Certains périphériques ne sont pas capables de changer ++dynamiquement d'IRQ. + .TP +-.B "io_addr adr" +-Dfinit pour ce priphrique, l'adresse de dbut dans l'espace +-d'entre-sortie I/O. ++.B "io_addr adresse" ++Définir l'adresse de début dans l'espace d'entrée-sortie pour un ++périphérique. + .TP +-.B "mem_start adr" +-Dfinit l'adresse de dbut de mmoire partage pour ce priphrique. Seuls +-quelques priphriques ont besoin de ce paramtre. ++.B "mem_start adresse" ++Définir l'adresse de début de la mémoire partagée utilisée par un ++périphérique. Peu de périphériques ont besoin de ce paramètre. + .TP + .B "media type" +-Dfinit le port physique ou le type de medium utilis par ce priphrique. +-Tous les priphriques ne peuvent pas changer de configuration et les +-valeurs supportes varient de l'un l'autre. Les valeur typiques sont ++Définir le port physique ou le type de médium utilisé par le périphérique. ++Tous les périphériques ne peuvent pas changer cette configuration et les ++types acceptés varient de l'un à l'autre. Les valeurs habituelles du ++.B type ++sont + .B 10base2 + (Ethernet fin), + .B 10baseT +-(10Mbps Ethernet paire torsade), +-.B AUI +-(transceiver externe) etc. Le type ++(Ethernet 10Mbps en paire torsadée), ++.B AUI ++(émetteur-récepteur externe), etc. Le médium spécial de type + .B auto +-permet d'indiquer au pilote de dtecter automatiquement le medium +-utilis. Une fois de plus, tous les priphriques ne supportent pas cette +-option. +-.TP +-.B "[-]broadcast [adr]" +-Si l'adresse est galement donne, dfinit l'adresse broadcast +-protocolaire pour cette interface. Autrement, il permet d'armer (ou dsarmer) +-l'indicateur ++permet d'indiquer au pilote de détecter automatiquement le médium utilisé. ++Une fois de plus, tous les pilotes n'acceptent pas cette option. ++.TP ++.B "[\-]broadcast [adresse]" ++Si l'adresse est donnée, elle définit l'adresse de diffusion du ++protocole pour cette interface. Autrement, on arme ++(ou désarme) l'indicateur + .B IFF_BROADCAST + de l'interface. + .TP +-.B "[-]pointopoint [adr]" +-Ce mot cl valide le mode +-.B point--point +-d'une interface, signifiant qu'il existe un lien direct entre 2 machines, +-sans que personne d'autre ne puisse tre l'coute. ++.B "[\-]pointopoint [adresse]" ++Valider le mode ++.B point-à-point ++d'une interface, signifiant qu'il existe un lien direct entre 2\ machines, ++sans que personne d'autre ne puisse être à l'écoute. + .br +-Si l'argument d'adresse est galement donn, il dfinit l'adresse +-de l'autre machine, de la mme manire que le paramtre obsolte +-.B dstaddr +-. +-Autrement il arme (ou dsarme) l'indicateur ++Si l'adresse est également donnée, cela définit l'adresse de ++protocole de l'autre machine, de la même manière que l'option obsolète ++.BR dstaddr . ++Autrement, il arme (ou désarme) l'indicateur + .B IFF_POINTOPOINT + de l'interface. + .TP + .B hw classe adresse +-Dfinit l'adresse matrielle de l'interface, si le pilote du +-priphrique supporte cette opration. Le mot cl doit tre +-suivi du nom de la classe matrielle et de l'adresse matrielle en +-caractres imprimables ASCII. Les classes matrielles actuellement +-supportes comprennent ++Définir l'adresse matérielle de l'interface, si le pilote du périphérique ++accepte cette opération. L'option doit être suivie du nom de la classe ++matérielle et de l'adresse matérielle en caractères ASCII affichables. ++Les classes matérielles actuellement prises en charge comprennent + .B ether + (Ethernet), + .B ax25 +@@ -165,45 +183,82 @@ et + (AMPR NET/ROM). + .TP + .B multicast +-Positionne l'indicateur multicast sur l'interface. Elle n'est +-gnralement pas ncessaire puisque les pilotes positionnent +-l'option correcte eux mme. ++Positionner l'indicateur de multidiffusion sur l'interface. Ce n'est ++généralement pas nécessaire puisque les pilotes positionnent correctement ++l'option eux-mêmes. + .TP + .B adresse +-L'adresse IP de cette interface. ++Correspond à l'adresse IP affectée à cette interface. + .TP +-.B txqueuelen length +-Set the length of the transmit queue of the device. It is useful to set this +-to small values for slower devices with a high latency (modem links, ISDN) +-to prevent fast bulk transfers from disturbing interactive traffic like +-telnet too much. ++.B txqueuelen longueur ++Définir la longueur de la file d'attente de transmission du périphérique. ++Il est utile de la fixer à des valeurs faibles pour les périphériques ++lents avec un temps d'attente important (modems, ISDN), pour empêcher ++d'être perturbé par de rapides transferts de masse issus des trafics ++interactifs, comme ++.BR telnet . + .SH NOTES +-Depuis le noyau 2.2 il n'y a plus de statistiques d'interface explicite +-pour les interfaces en alias. Les statistiques affiches pour la vritable +-adresse sont partages avec toutes les adresses alias du mme priphrique. +-Si vous voulez des adresses par interface, vous devez ajouter des rgles de +-comptabilit particulires pour l'adresse en utilisant la commande +-.BR ipchains(8) +-. +- ++Depuis la version 2.2 du noyau, il n'y a plus de statistiques d'interface ++explicites pour les alias d'interfaces. Les statistiques affichées pour la ++véritable adresse sont partagées avec toutes les adresses d'alias du même ++périphérique. Pour avoir des statistiques par adresse, il faut ajouter ++des règles de comptabilité particulières pour l'adresse en utilisant ++la commande ++.BR ipchains (8) ++ou ++.BR iptables (8). ++.LP ++Depuis net-tools 1.61, ++.B ifconfig ++affiche les compteurs d'octets et ceux lisibles par un utilisateur en ++unités IEC\ 60027-2. Ainsi, 1\ KiB vaut 2^10 octets. Notez que les nombres ++sont tronqués à la première décimale (ce qui peut être une erreur importante ++si vous considérez que 0,1\ PiB vaut 112.589.990.684.262\ octets\ :) ++.LP ++Des problèmes d'interruption avec les pilotes de périphériques Ethernet ++apparaissent avec EAGAIN ++(\fISIOCSIIFLAGS\ : Ressource temporairement indisponible\fR) ++il s'agit sûrement d'un conflit d'interruptions. Voir ++.I http://www.scyld.com/expert/irq-conflict.html ++pour plus d'informations. + .SH FICHIERS +-.I /proc/net/socket ++.I /proc/net/socket + .br + .I /proc/net/dev + .br + .I /proc/net/if_inet6 +-.SH BUGS +-Mme si les adresses appletalk DDP et IPX peuvent tre affiches, +-elles ne peuvent tre modifies avec cette commande. ++.SH BOGUES ++Même si les adresses appletalk DDP et IPX peuvent être affichées, ++elles ne peuvent être modifiées avec cette commande. + .SH VOIR AUSSI +-route(8), netstat(8), arp(8), rarp(8), ipchains(8) +-.SH AUTHORS ++.BR route (8), ++.BR netstat (8), ++.BR arp (8), ++.BR rarp (8), ++.BR ipchains (8), ++.BR iptables (8) ++.br ++http://physics.nist.gov/cuu/Units/binary.html \- Préfixes ++pour les multiples binaires. ++.SH AUTEURS + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + .br + Alan Cox, <Alan.Cox@linux.org> + .br + Phil Blundell, <Philip.Blundell@pobox.com> + .br +-Andi Kleen, ++Andi Kleen, ++.br ++Bernd Eckenfels, <net-tools@lina.inka.de> + .SH TRADUCTION +-Jean-Michel VANSTEENE (vanstee@worldnet.fr) ++.PP ++Ce document est une traduction réalisée par Jean Michel Vansteene ++<vanstee\ AT\ worldnet\ DOT\ fr> en août\ 1997, ++mise à jour par Guillaume Audirac en août 2004 ++et révisée le 17\ août\ 2006. ++.PP ++L'équipe de traduction a fait le maximum pour réaliser une adaptation ++française de qualité. La version anglaise la plus à jour de ce document est ++toujours consultable via la commande\ : «\ \fBLANG=C\ man\ 8\ ifconfig\fR\ ». ++N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute ++erreur dans cette page de manuel. +diff --git a/man/fr_FR/netstat.8 b/man/fr_FR/netstat.8 +index bf16bc6..c65d0be 100644 +--- a/man/fr_FR/netstat.8 ++++ b/man/fr_FR/netstat.8 +@@ -8,11 +8,11 @@ + .\" Modified: Tuan Hoang tuan@optimus.mitre.org + .\" + .\" +-.TH NETSTAT 8 "25 Fv 1999" "net-tools" "Linux Programmer's Manual" ++.TH NETSTAT 8 "2007-12-02" "net-tools" "Linux Administrator's Manual" + + .SH NAME +-netstat \- Affiche les connexions rseau, les tables de routage, les +-statistiques des interfaces, les connexions masques, les messages netlink, ++netstat \- Affiche les connexions réseau, les tables de routage, les ++statistiques des interfaces, les connexions masquées, les messages netlink, + et les membres multicast. + + .SH SYNOPSIS +@@ -21,6 +21,8 @@ et les membres multicast. + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-groups | \-g ] + .RB [ \-\-unix | \-x ] +@@ -68,34 +70,34 @@ et les membres multicast. + .PP + .SH DESCRIPTION + .B Netstat +-affiche les informations du sous-systme rseau de Linux ++affiche les informations du sous-système réseau de Linux + + .SS "(no option)" +-Vous pouvez voir l'tat des connexions rseau en listant les sockets +-ouvertes. C'est l'option par dfaut : si vous ne spcifiez aucune famille ++Vous pouvez voir l'état des connexions réseau en listant les sockets ++ouvertes. C'est l'option par défaut : si vous ne spécifiez aucune famille + d'adresses, les sockets actives de toutes les familles d'adresses seront +-affiches. +-Avec le paramtre ++affichées. ++Avec le paramètre + .B -e +-vous obtenez quelques informations supplmentaires (userid). Avec le paramtre ++vous obtenez quelques informations supplémentaires (userid). Avec le paramètre + .B -v +-vous pouvez demander netstat de signaler des familles d'adresses connues +-non supportes par le noyau. Le paramtre ++vous pouvez demander à netstat de signaler des familles d'adresses connues ++non supportées par le noyau. Le paramètre + .B -o +-affiche des informations supplmentaires sur les timers rseau. En donnant +-le paramtre ++affiche des informations supplémentaires sur les timers réseau. En donnant ++le paramètre + .B -p +-vous verrez le PID et le nom du processus qui appartient la socket. Le paramtre ++vous verrez le PID et le nom du processus à qui appartient la socket. Le paramètre + .B -a +-affiche toutes les sockets, y compris les sockets d'coute des serveurs. La famille ++affiche toutes les sockets, y compris les sockets d'écoute des serveurs. La famille + d'adresses + .B inet + affiche les sockets raw, udp et tcp. + + .SS "\-r, \-\-route" +-Avec le paramtre ++Avec le paramètre + .BR \-r ", " \-\-route +-vous pouvez visualiser les tables de routage dans le mme format qu'avec la ++vous pouvez visualiser les tables de routage dans le même format qu'avec la + commande + .B "route -e" + . +@@ -104,44 +106,44 @@ utilisera le format de la commande + .BR route . + Veuillez consulter + .BR route (8) +-pour plus de dtails. ++pour plus de détails. + +-.SS "\-i, \-\-interface \fIiface\fI" ++.SS "\-i, \-\-interfaces \fIiface\fI" + Si vous utilisez l'option + .BR -i ", " --interfaces + , une table de toutes (ou de l'interface + .IR iface +-spcifie) les interfaces rseau sera affiche. Le format de sortie est le +-mme que celui de la commande ++spécifiée) les interfaces réseau sera affichée. Le format de sortie est le ++même que celui de la commande + .B "ifconfig -e" +-, et est dcrit dans ++, et est décrit dans + .BR ifconfig (8). + .B "netstat -ei" +-affiche une table ou une seule entre d'interface comme la commande +-.B ifconfig +-. Avec le paramtre ++affiche une table ou une seule entrée d'interface comme la commande ++.BR ifconfig . ++Avec le paramètre + .B -a +-, vous pouvez inclure les interfaces qui ne sont pas configures (c.a.d qui ++, vous pouvez inclure les interfaces qui ne sont pas configurées (c.a.d qui + n'ont pas l'indicateur + .BR U = UP +-arm). ++armé). + + .SS "\-M, \-\-masquerade" + +-Permet de voir les sessions ayant de l'IP-masquerade. Avec le paramtre ++Permet de voir les sessions ayant de l'IP-masquerade. Avec le paramètre + .B -e +-vous pouvez inclure quelques informations concernant les numros de +-squence et les deltas causs par des rcritures de donnes sur des +-sessions FTP (commande PORT). Le support de l'IP-Masquerade est utilis +-pour cacher au monde extrieur des htes appartenant un rseau (et ayant +-des adresses) non officiel, tel que dcrit dans +-.BR ipfw (4), ipfwadm "(8) et " ipfw (8). ++vous pouvez inclure quelques informations concernant les numéros de ++séquence et les deltas causés par des réécritures de données sur des ++sessions FTP (commande PORT). Le support de l'IP-Masquerade est utilisé ++pour cacher au monde extérieur des hôtes appartenant à un réseau (et ayant ++des adresses) non officiel, tel que décrit dans ++.BR iptables (8). + + .SS "\-N, \-\-netlink" + +-Les noyaux rcents supportent une communication avec l'utilisateur appele +-netlink. Vous pouvez obtenir des messages relatifs la cration, la +-suppression d'interfaces ou de routes partir de ++Les noyaux récents supportent une communication avec l'utilisateur appelée ++netlink. Vous pouvez obtenir des messages relatifs à la création, la ++suppression d'interfaces ou de routes à partir de + .I /dev/route + (36,0). + +@@ -149,23 +151,23 @@ suppression d'interfaces ou de routes + .SH OPTIONS + .SS "\-v, \-\-verbose" + active le mode verbeux. Affiche quelques informations utiles concernant les +-familles d'adresses non configures. ++familles d'adresses non configurées. + + .SS "\-n, \-\-numeric" +-affiche les adresses en format numrique au lieu d'essayer de dterminer le +-nom symbolique d'hte, de port ou d'utilisateur. ++affiche les adresses en format numérique au lieu d'essayer de déterminer le ++nom symbolique d'hôte, de port ou d'utilisateur. + + .SS "\-p, \-\-programs" +-affiche le nom et le PID des processus propritaires de chaque socket +-dcrite. Vous devez tre le propritaire d'un processus pour visualiser les +-sockets qui lui appartiennent ou tre l'utilisateur ++affiche le nom et le PID des processus propriétaires de chaque socket ++décrite. Vous devez être le propriétaire d'un processus pour visualiser les ++sockets qui lui appartiennent ou être l'utilisateur + .B root + pour disposer de toutes les informations. + + .SS "\-A, \-\-af \fIfamille\fI" +-utilise une mthode diffrente pour affecter les familles d'adresses. ++utilise une méthode différente pour affecter les familles d'adresses. + .I famille +-est une liste de familles d'adresses spares par des (',') telles que ++est une liste de familles d'adresses séparées par des (',') telles que + .BR inet , + .BR unix , + .BR ipx , +@@ -173,7 +175,7 @@ est une liste de familles d'adresses s + .B netrom + et + .BR ddp . +-L'utilisation des options longues suivantes a le mme effet ++L'utilisation des options longues suivantes a le même effet + .BR \-\-inet , + .BR \-\-unix , + .BR \-\-ipx , +@@ -183,9 +185,9 @@ et + .BR \-\-ddp. + + .SS "\-c, \-\-continous" +-Demandera ++Demandera à + .B netstat +-d'afficher la table slectionne chaque seconde jusqu' ce que vous ++d'afficher la table sélectionnée chaque seconde jusqu'à ce que vous + l'interrompiez. + + .PP +@@ -195,102 +197,102 @@ l'interrompiez. + .SS Connexions Internet actives \fR(TCP, UDP, RAW)\fR + + .SS "Proto" +-Le protocole (TCP, UDP, RAW) utilis par la socket. ++Le protocole (TCP, UDP, RAW) utilisé par la socket. + + .SS "Recv-Q" +-Le nombre d'octets non encore lus par le programme utilisateur connect +- cette socket. ++Le nombre d'octets non encore lus par le programme utilisateur connecté ++à cette socket. + + .SS "Send-Q" +-Le nombre d'octets non encore acquitts par l'hte distant. ++Le nombre d'octets non encore acquittés par l'hôte distant. + + .SS "Local Address (Adresse locale)" +-L'adresse locale (nom d'hte local) et numro de port de la ++L'adresse locale (nom d'hôte local) et numéro de port de la + socket. Sauf si l'option + .B -n +-est donne, l'adresse de la prise est traduite en nom d'hte, +-et le numro de port est traduit en nom de service correspondant. ++est donnée, l'adresse de la prise est traduite en nom d'hôte, ++et le numéro de port est traduit en nom de service correspondant. + + .SS "Foreign Address (Adresse distante)" +-L'adresse distante (nom d'hte distant) et le numro de port de +-la prise. Comme pour l'adresse locale et le numro de port, l'option ++L'adresse distante (nom d'hôte distant) et le numéro de port de ++la prise. Comme pour l'adresse locale et le numéro de port, l'option + .B -n +-invalide la traduction du nom d'hte et de service. ++invalide la traduction du nom d'hôte et de service. + + .SS "State (Etat)" +-L'tat de la socket. Puisqu'il n'y a pas d'tat dans le mode RAW +-et gnralement pas d'tat utilis en UDP, cette colonne ++L'état de la socket. Puisqu'il n'y a pas d'état dans le mode RAW ++et généralement pas d'état utilisé en UDP, cette colonne + peut se trouver vierge. Normalement, on trouvera une des valeur suivante: + + .TP + .I + ESTABLISHED +-La socket a une connexion tablie. ++La socket a une connexion établie. + .TP + .I + SYN_SENT +-La socket attend activement d'tablir une connexion. ++La socket attend activement d'établir une connexion. + .TP + .I + SYN_RECV +-Une requte de connexion a t reue du rseau. ++Une requête de connexion a été reçue du réseau. + .TP + .I + FIN_WAIT1 +-La socket est ferme, et la connexion est en cours de terminaison. ++La socket est fermée, et la connexion est en cours de terminaison. + .TP + .I + FIN_WAIT2 +-La connexion est ferme, et la socket attend une terminaison du distant. ++La connexion est fermée, et la socket attend une terminaison du distant. + .TP + .I + TIME_WAIT +-La socket attend le traitement de tous les paquets encore sur le rseau ++La socket attend le traitement de tous les paquets encore sur le réseau + avant d'entreprendre la fermeture. + .TP + .I +-CLOSED +-La socket n'est pas utilise. ++CLOSE ++La socket n'est pas utilisée. + .TP + .I + CLOSE_WAIT +-Le distant a arrt, attendant la fermeture de la socket. ++Le distant a arrêté, attendant la fermeture de la socket. + .TP + .I + LAST_ACK +-Le distant termine, et la socket est ferme. Attente d'acquittement. ++Le distant termine, et la socket est fermée. Attente d'acquittement. + .TP + .I + LISTEN +-La socket est l'coute de connexions entrantes. Ces sockets ne sont +-affiches que si le paramtre ++La socket est à l'écoute de connexions entrantes. Ces sockets ne sont ++affichées que si le paramètre + .BR -a , --listening + est fourni. + .TP + .I + CLOSING +-Les deux prises sont arrtes mais toutes les donnes locales n'ont +-pas encore t envoyes. ++Les deux prises sont arrêtées mais toutes les données locales n'ont ++pas encore été envoyées. + .TP + .I + UNKNOWN +-L'tat de la prise est inconnu. ++L'état de la prise est inconnu. + + .SS "User (Utilisateur)" +-Le nom d'utilisateur ou l'UID du propritaire de la socket. ++Le nom d'utilisateur ou l'UID du propriétaire de la socket. + + .SS "PID/Program name (PID/Nom de Programme)" +-Le PID et le nom du programme (spars par un slash) propritaire de la +-socket. Le paramtre ++Le PID et le nom du programme (séparés par un slash) propriétaire de la ++socket. Le paramètre + .B -p + active l'affichage de cette colonne. Vous devez avoir les droits de + .B root +-puisque vous devez avoir les droits d'accs aux processus pour visualiser ++puisque vous devez avoir les droits d'accès aux processus pour visualiser + les sockets qui lui correspondent. Ces informations ne sont pas disponibles + avec les sockets IPX. + + .SS "Timer" +-(Ceci doit tre rdig) ++(Ceci doit être rédigé) + + + .PP +@@ -298,28 +300,28 @@ avec les sockets IPX. + + + .SS "Proto" +-Le protocole (habituellement UNIX) utilis par la socket. ++Le protocole (habituellement UNIX) utilisé par la socket. + + .SS "RefCnt" +-Le nombre de rfrences (i.e. processus attachs via cette socket). ++Le nombre de références (i.e. processus attachés via cette socket). + + .SS "Flags (indicateurs)" +-Les indicateurs affiche sont SO_ACCEPTON (affich ++Les indicateurs affichée sont SO_ACCEPTON (affiché + .BR ACC ), + SO_WAITDATA + .RB ( W ) + ou SO_NOSPACE + .RB ( N ). +-SO_ACCECPTON est utilis pour les sockets +-non-connectes si les processus correspondant sont en attente de +-demande de connexion. Les autres indicateurs sont d'un intrt limit. ++SO_ACCECPTON est utilisé pour les sockets ++non-connectées si les processus correspondant sont en attente de ++demande de connexion. Les autres indicateurs sont d'un intérêt limité. + + .SS "Type" +-Il y a diffrents types d'accs aux sockets : ++Il y a différents types d'accès aux sockets : + .TP + .I + SOCK_DGRAM +-La prise est utilise en mode Datagram (sans connexion). ++La prise est utilisée en mode Datagram (sans connexion). + .TP + .I + SOCK_STREAM +@@ -327,90 +329,89 @@ C'est une socket `stream' (connexion). + .TP + .I + SOCK_RAW +-La prise est utilise en mode `raw'. ++La prise est utilisée en mode `raw'. + .TP + .I + SOCK_RDM +-Celle-ci est utilise pour les messages dlivre de manire fiable. ++Celle-ci est utilisée pour les messages délivrée de manière fiable. + .TP + .I + SOCK_SEQPACKET +-C'est une socket en mode paquets squentiels. ++C'est une socket en mode paquets séquentiels. + .TP + .I + SOCK_PACKET +-Prise d'accs l'interface RAW. ++Prise d'accès à l'interface RAW. + .TP + .I + UNKNOWN +-Qui sait ce que l'avenir nous rserve - Juste remplir ici :-) ++Qui sait ce que l'avenir nous réserve - Juste à remplir ici :-) + + .PP + .SS "State (Etat)" +-Ce champ contient un des mots cls suivants : ++Ce champ contient un des mots clés suivants : + .TP + .I + FREE +-La socket n'est pas alloue ++La socket n'est pas allouée + .TP + .I + LISTENING +-La socket est l'coute de demandes de connexions. Ces sockets ne sont +-affiches que si le paramtre ++La socket est à l'écoute de demandes de connexions. Ces sockets ne sont ++affichées que si le paramètre + .BR -a , --listening + est fourni. + .TP + .I + CONNECTING +-La prise est en cours d'tablissement de connexion. ++La prise est en cours d'établissement de connexion. + .TP + .I + CONNECTED +-La socket est connecte. ++La socket est connectée. + .TP + .I + DISCONNECTING +-La socket est en cours de dconnexion. ++La socket est en cours de déconnexion. + .TP + .I + (empty) +-La socket n'est connecte aucune autre. ++La socket n'est connectée à aucune autre. + .TP + .I + UNKNOWN +-Cet tat ne devrait pas apparatre. ++Cet état ne devrait pas apparaître. + + .SS "PID/Program name (PID/Nom de programme" +-Le PID et le nom du programme propritaire de la socket. Plus ++Le PID et le nom du programme propriétaire de la socket. Plus + d'informations sont disponibles dans la section + .B "Connexions Internet actives" + ci-dessus. + + .SS "Path (chemin)" +-Affiche le chemin correspondant l'attachement des processus la socket. ++Affiche le chemin correspondant à l'attachement des processus à la socket. + + .PP + .SS Sockets IPX actives + +-( faire par quelqu'un qui connat) ++(à faire par quelqu'un qui connaît) + + .PP + .SS Sockets NET/ROM actives + +-( faire par quelqu'un qui connat) ++(à faire par quelqu'un qui connaît) + + .PP + .SS Sockets AX.25 actives + +-( faire par quelqu'un qui connat) ++(à faire par quelqu'un qui connaît) + + .PP + .SH NOTES + Depuis la version 2.2 du noyau, netstat -i n'affiche plus les statistiques + des interfaces alias. Pour obtenir les compteurs par interface alias, vous +-devez dfinir des rgles spcifiques l'aide de la commande +-.BR ipchains(8) +-. ++devez définir des règles spécifiques à l'aide de la commande ++.BR iptables(8). + + .SH FICHIERS + .ta +@@ -418,7 +419,7 @@ devez d + -- Le fichier de correspondance des services + + .I /proc/net/dev +--- informations priphriques ++-- informations périphériques + + .I /proc/net/raw + -- informations sockets RAW +@@ -471,31 +472,28 @@ devez d + .SH VOIR AUSSI + .BR route (8), + .BR ifconfig (8), +-.BR ipfw (4), +-.BR ipfw (8), +-.BR ipfwadm (8) +-.BR ipchains (8) ++.BR iptables (8) + + .PP + .SH BUGS +-Des informations tranges peuvent apparaitre occasionnellement +-si une socket change d'tat au moment ou elle est visualise. ++Des informations étranges peuvent apparaitre occasionnellement ++si une socket change d'état au moment ou elle est visualisée. + Ceci est peut probable. + .br +-Le paramtre ++Le paramètre + .B netstat -i +-est dcrit tel qu'il fonctionnera lorsque le code de la version BETA du +-paquetage net-tools aura t nettoy. ++est décrit tel qu'il fonctionnera lorsque le code de la version BETA du ++paquetage net-tools aura été nettoyé. + + .PP + .SH AUTEURS +-L'interface utilisateur de netstat a t dveloppe par ++L'interface utilisateur de netstat a été développée par + Fred Baumgarten <dc6iq@insu1.etec.uni-karlsruhe.de>. Les pages du +-manuel essentiellement crites par Matt Welsh +-<mdw@tc.cornell.edu>. Mis jour par Alan Cox <Alan.Cox@linux.org>. ++manuel essentiellement écrites par Matt Welsh ++<mdw@tc.cornell.edu>. Mis à jour par Alan Cox <Alan.Cox@linux.org>. + .br + La page de manuel et la commande incluse dans le paquetage net-tools +-a t totallement rcrite par Bernd Eckenfels ++a été totallement réécrite par Bernd Eckenfels + <ecki@linux.de>. + .SH TRADUCTION + Jean Michel VANSTEENE (vanstee@worldnet.fr) +diff --git a/man/fr_FR/plipconfig.8 b/man/fr_FR/plipconfig.8 +index cd44449..4d17ea2 100644 +--- a/man/fr_FR/plipconfig.8 ++++ b/man/fr_FR/plipconfig.8 +@@ -1,44 +1,44 @@ + .TH PLIPCONFIG 8 "17 February 1995" "" "" + .SH NOM +-plipconfig \- rglage fin des paramtres du priphrique PLIP ++plipconfig \- réglage fin des paramètres du périphérique PLIP + .SH SYNOPSIS + .B "plipconfig interface" + .br + .B "plipconfig interface [nibble NN] [trigger NN] [unit NN]" + .SH DESCRIPTION + .B Plipconfig +-est utilis pour amliorer (esprons-le) les performances PLIP +-en changeant les timings par dfaut utiliss par le protocole PLIP. Les +-rsultats dpendent du port parallle +-utilis, du cable, et de la vitesse CPU de chaque machine +- chaque bout du lien PLIP. ++est utilisé pour améliorer (espérons-le) les performances PLIP ++en changeant les timings par défaut utilisés par le protocole PLIP. Les ++résultats dépendent du port parallèle ++utilisé, du cable, et de la vitesse CPU de chaque machine ++à chaque bout du lien PLIP. + .LP + Si le seul argument est l' + .B interface + , + .B plipconfig +-affiche seulement l'tat de cette interface. Autrement, il essaiera de +-positionner les options donnes. ++affiche seulement l'état de cette interface. Autrement, il essaiera de ++positionner les options données. + .SH OPTIONS + .TP + .B "nibble NN" +-Dfinit la valeur d'attente des digits en microsecondes. Par dfault : 3000. ++Définit la valeur d'attente des digits en microsecondes. Par défault : 3000. + .TP + .B "trigger NN" +-Dfinit le dlai de dclenchement en microsecondes. Par dfault : 500. ++Définit le délai de déclenchement en microsecondes. Par défault : 500. + .LP +-La vitesse de PLIP peut, dans certains cas, tre amliore en +-diminuant les valeurs par dfaut. ++La vitesse de PLIP peut, dans certains cas, être améliorée en ++diminuant les valeurs par défaut. + Les valeurs trop petites peuvent engendrer une utilisation excessive de CPU, +-et un temps de rponse aux interruptions mauvais, dont le rsultat est +-la perte de caractres lus sur le port, ou de paquets PLIP. ++et un temps de réponse aux interruptions mauvais, dont le résultat est ++la perte de caractères lus sur le port, ou de paquets PLIP. + La modification du MTU PLIP peut aussi affecter la vitesse PLIP. + .SH NOTE +-Si vous n'obtenez aucune rponse, il est fort probable que l'IRQ configure +-soit mauvaise, et qu'elle ncessite une configuration avec ifconfig. +-Les quelques cas pour lesquels les timings par dfaut sont trop courts, +-arrivent lorque l'on utilise de longs cables. Quelque chose ne pas faire, +-puisque le port parallle n'est pas fait pour fonctionner avec de longs cables. ++Si vous n'obtenez aucune réponse, il est fort probable que l'IRQ configurée ++soit mauvaise, et qu'elle nécessite une configuration avec ifconfig. ++Les quelques cas pour lesquels les timings par défaut sont trop courts, ++arrivent lorque l'on utilise de longs cables. Quelque chose à ne pas faire, ++puisque le port parallèle n'est pas fait pour fonctionner avec de longs cables. + .SH VOIR AUSSI + .I ifconfig(8) + .SH BUGS +diff --git a/man/fr_FR/rarp.8 b/man/fr_FR/rarp.8 +index 73e9328..e68730f 100644 +--- a/man/fr_FR/rarp.8 ++++ b/man/fr_FR/rarp.8 +@@ -1,6 +1,6 @@ +-.TH RARP 8 "4 Aot 1997" "net-tools" "Linux Programmer's Manual" ++.TH RARP 8 "4 Août 1997" "net-tools" "Linux Administrator's Manual" + .SH NOM +-rarp \- manipule la table systme RARP ++rarp \- manipule la table système RARP + .SH SYNOPSIS + .B "rarp [-V] [--version] [-h] [--help]" + .br +@@ -11,30 +11,30 @@ rarp \- manipule la table syst + .B "rarp [-v] [-t type] -s nom_d_hote adr_materiel" + .SH DESCRIPTION + .B Rarp +-manipule la table RARP du noyau de diffrentes faons. Les options de base +-permettent d'effacer une entre de correspondance d'adresses et d'en +-redfinir une manuellement. Pour des besoins de dbogage, le programme ++manipule la table RARP du noyau de différentes façons. Les options de base ++permettent d'effacer une entrée de correspondance d'adresses et d'en ++redéfinir une manuellement. Pour des besoins de débogage, le programme + .B rarp +-permet aussi de vider compltement la table RARP. ++permet aussi de vider complètement la table RARP. + .SH OPTIONS + .TP + .B \-V +-Affiche la version de RARP utilis. ++Affiche la version de RARP utilisé. + .TP + .B \-v +-Dit l'utilisateur ce qui se passe, en tant verbeux. ++Dit à l'utilisateur ce qui se passe, en étant verbeux. + .TP + .B "\-t type" +-En dfinissant ou lisant la table RARP, ce paramtre optionnel dit ++En définissant ou lisant la table RARP, ce paramètre optionnel dit à + .B rarp +-quelles classes d'entres il doit contrler. La valeur par dfaut de +-ce paramtre est ++quelles classes d'entrées il doit contrôler. La valeur par défaut de ++ce paramètre est + .B ether +-(i.e. code matriel ++(i.e. code matériel + .B 0x01 + pour + .B "IEEE 802.3 10Mbps Ethernet". +-D'autres valeurs doivent correspondre des technologies rseaux telles que ++D'autres valeurs doivent correspondre à des technologies réseaux telles que + .B AX.25 (ax25). + et + .B NET/ROM (netrom). +@@ -42,31 +42,31 @@ et + .B "\-a" + .TP + .B "\-\-list" +-Liste les entres de la table RARP. ++Liste les entrées de la table RARP. + .TP + .B "\-d nom_d_hote" + .TP + .B "\-\-delete nom_d_hote" +-Supprime toutes les entres RARP relatives l'hte spcifi. ++Supprime toutes les entrées RARP relatives à l'hôte spécifié. + .TP + .B "\-s nom_d_hote adr_materielle" + .TP + .B "\-\-set nom_d_hote adr_materielle" +-Cre manuellement une correspondance d'adresses RARP pour l'hte +-.B nom_d_hte +-avec l'adresse matrielle +-.B adr_materielle +-. Le format de l'adresse matrielle est dpendant du matriel, +-mais pour la plupart on peut considrer que la prsentation classique +-peut tre utilise. Pour la classe Ethernet, c'est 6 octets en hexadcimal, +-spars par des double-points. ++Crée manuellement une correspondance d'adresses RARP pour l'hôte ++.B nom_d_hôte ++avec l'adresse matérielle ++.BR adr_materielle . ++Le format de l'adresse matérielle est dépendant du matériel, ++mais pour la plupart on peut considérer que la présentation classique ++peut être utilisée. Pour la classe Ethernet, c'est 6 octets en hexadécimal, ++séparés par des double-points. + + .SH ATTENTION +-Certains systmes (notamment des vieux Sun's) supposent que l'hte +-rpondant une requte RARP peut aussi fournir d'autres services +-de boot distance. Par consquent n'ajoutez jamais +-d'entres RARP la lgre moins que vous souhaitiez affronter la +-colre de votre administrateur rseau. ++Certains systèmes (notamment des vieux Sun's) supposent que l'hôte ++répondant à une requête RARP peut aussi fournir d'autres services ++de boot à distance. Par conséquent n'ajoutez jamais ++d'entrées RARP à la légère à moins que vous souhaitiez affronter la ++colère de votre administrateur réseau. + .SH FICHIERS + .I /proc/net/rarp, + .SH VOIR AUSSI +diff --git a/man/fr_FR/route.8 b/man/fr_FR/route.8 +index 9109e8d..986faf9 100644 +--- a/man/fr_FR/route.8 ++++ b/man/fr_FR/route.8 +@@ -1,4 +1,4 @@ +-.TH ROUTE 8 "8 Aot 1997" "net-tools" "Linux Programmer's Manual" ++.TH ROUTE 8 "8 Août 1997" "net-tools" "Linux Administrator's Manual" + .SH NAME + route \- affiche / manipule la table de routage IP + .SH SYNOPSIS +@@ -54,9 +54,9 @@ If] + .RB [ \--help ] + .SH DESCRIPTION + .B Route +-manipule la table de routage IP du noyau. Son utilisation premire +-consiste configurer des routes statiques vers des htes ou des rseaux +-via une interface, aprs sa configuration par le programme ++manipule la table de routage IP du noyau. Son utilisation première ++consiste à configurer des routes statiques vers des hôtes ou des réseaux ++via une interface, après sa configuration par le programme + .B ifconfig(8). + + .SH OPTIONS +@@ -66,12 +66,12 @@ Active le mode verbeux. + + .TP + .B \-A famille +-Utilise la famille d'adresses spcifie (p.ex. `inet', `inet6'). ++Utilise la famille d'adresses spécifiée (p.ex. `inet', `inet6'). + + .TP + .B \-n +-Affiche les adresses numriques, au lieu +-d'essayer de dterminer les noms d'htes. C'est utile si vous essayer de ++Affiche les adresses numériques, au lieu ++d'essayer de déterminer les noms d'hôtes. C'est utile si vous essayer de + savoir pourquoi la route vers votre serveur de nom a disparu. + + .TP +@@ -80,24 +80,24 @@ utilise + .BR netstat (8)-format + pour l'affichage de la table de routage. + .B \-ee +-Gnre une trs longue ligne avec tous les paramtres partir de la table ++Génère une très longue ligne avec tous les paramètres à partir de la table + de routage. + + .TP + .B \-net + la + .B cible +-est un rseau. ++est un réseau. + + .TP + .B -host + la + .B cible +-est un hte. ++est un hôte. + + .TP + .B -F +-affiche la table de routage FIB du noyau. L'organisation peut tre change avec ++affiche la table de routage FIB du noyau. L'organisation peut être changée avec + .B \-e + et + .B \-ee +@@ -117,131 +117,131 @@ ajoute une route. + + .TP + .B cible +-L'hte ou le rseau destination. Vous pouvez fournir une adresse IP en +-notation dcimale pointe ou un nom d'hte ou de rseau. ++L'hôte ou le réseau destination. Vous pouvez fournir une adresse IP en ++notation décimale pointée ou un nom d'hôte ou de réseau. + + .TP + .B netmask Nm +-spcifie le masque rseau de la route ajouter. ++spécifie le masque réseau de la route à ajouter. + + .TP + .B gw Gw +-signifie que tout paquet IP envoy cette adresse sera rout par +-la passerelle spcifie. ++signifie que tout paquet IP envoyé à cette adresse sera routé par ++la passerelle spécifiée. + .B NOTE: +-La passerelle concerne doit pouvoir tre atteinte. Ceci signifie +-qu'une route statique vers cette passerelle doit pralablement exister. +-Si vous spcifiez l'adresse de l'une de vos interfaces locales, elle sera +-utilise pour dcider de l'interface vers laquelle les paquets seront +-envoys. Ceci est une bidouille permettant d'tre compatible BSD. ++La passerelle concernée doit pouvoir être atteinte. Ceci signifie ++qu'une route statique vers cette passerelle doit préalablement exister. ++Si vous spécifiez l'adresse de l'une de vos interfaces locales, elle sera ++utilisée pour décider de l'interface vers laquelle les paquets seront ++envoyés. Ceci est une bidouille permettant d'être compatible BSD. + + .TP + .B metric M +-Affecte la valeur M au champ mtrique de la table de routage (utilis par +-les dmons de routage). ++Affecte la valeur M au champ métrique de la table de routage (utilisé par ++les démons de routage). + + .TP + .B mss M +-Spcifie le MSS (Maximum Segment Size, Taille maximum de segment) de TCP, +-pour les connexions empreintant cette route. Ce n'est normalement utilis ++Spécifie le MSS (Maximum Segment Size, Taille maximum de segment) de TCP, ++pour les connexions empreintant cette route. Ce n'est normalement utilisé + que pour des optimisations fines des configurations de routage. + + + .TP + .B window W +-Dfinit la taille de fentre TCP W octets pour les connexions relatives +- cette route. C'est en gnral uniquement utilis sur les rseaux AX.25 et +-avec les pilotes incapables de manipuler les trames dos dos. ++Définit la taille de fenêtre TCP à W octets pour les connexions relatives ++à cette route. C'est en général uniquement utilisé sur les réseaux AX.25 et ++avec les pilotes incapables de manipuler les trames dos à dos. + + .TP + .B irtt I +-Dfinit le iRTT initial (round trip time) pour les connexions TCP sur cette +-route I millisecondes (1-12000). C'est en gnral uniquement utilis sur +-les rseaux AX.25. Si omis, la valeur par dfaut (300 ms selon le RFC 1122) +-est utilise. ++Définit le iRTT initial (round trip time) pour les connexions TCP sur cette ++route à I millisecondes (1-12000). C'est en général uniquement utilisé sur ++les réseaux AX.25. Si omis, la valeur par défaut (300 ms selon le RFC 1122) ++est utilisée. + + .TP + .B reject +-Installe une route bloquante, qui forcera l'chec d'une recherche. +-C'est par exemple utilis pour masquer les rseaux avant d'utiliser la +-route par dfaut. Ce n'est pas une fonction de pare-feu. ++Installe une route bloquante, qui forcera l'échec d'une recherche. ++C'est par exemple utilisé pour masquer les réseaux avant d'utiliser la ++route par défaut. Ce n'est pas une fonction de pare-feu. + + .TP + .B mod, dyn, reinstate +-Installe une route dynamique ou modifie. Les deux indicateurs ne sont en +-gnral positionns que par le dmon de routage. Cela ne sert que pour des ++Installe une route dynamique ou modifiée. Les deux indicateurs ne sont en ++général positionnés que par le démon de routage. Cela ne sert que pour des + besoins de diagnostics. + + .TP + .B dev If +-Force la route tre associe au priphrique spcifi, sinon le noyau +-tentera de le dterminer par lui-mme (en consultant les routes existantes +-et les spcifications de priphriques). Dans la plupart des rseaux ++Force la route à être associée au périphérique spécifié, sinon le noyau ++tentera de le déterminer par lui-même (en consultant les routes existantes ++et les spécifications de périphériques). Dans la plupart des réseaux + normaux, vous n'aurez pas besoin de ceci. + + If + .B dev If +-est la dernire option de la ligne de commande, le mot ++est la dernière option de la ligne de commande, le mot + .B dev +-peut tre omis, puisque c'est la valeur par dfaut. Autrement l'ordre des ++peut être omis, puisque c'est la valeur par défaut. Autrement l'ordre des + modificateurs de route (metric - netmask - gw - dev) n'a pas d'importance. + + .SH EXEMPLES + .TP + .B route add -net 127.0.0.0 +-ajoute l'entre loopback normale, en utilisant le masque 255.0.0.0 (rseau +-de classe A, selon l'adresse de destination) et associe avec l'interface +-"lo" (en supposant que ce priphrique a t correctement configur avec ++ajoute l'entrée loopback normale, en utilisant le masque 255.0.0.0 (réseau ++de classe A, selon l'adresse de destination) et associée avec l'interface ++"lo" (en supposant que ce périphérique a été correctement configuré avec + .BR ifconfig (8)). + + .TP + .B route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 +-ajoute une route vers le rseau 192.56.76.x via +-"eth0". Le masque de classe C n'est pas vraiment ncessaire ici car +-192.* est une adresse IP de classe C. Le mot "dev" peut tre omis. ++ajoute une route vers le réseau 192.56.76.x via ++"eth0". Le masque de classe C n'est pas vraiment nécessaire ici car ++192.* est une adresse IP de classe C. Le mot "dev" peut être omis. + + .TP + .B route add default gw mango-gw +-ajoute une route par dfaut (qui sera utilise si aucune autre route ne ++ajoute une route par défaut (qui sera utilisée si aucune autre route ne + convient). Tous les paquets empreintant cette route passeront par +-"mango-gw". Le priphrique qui sera effectivement utilis pour cette route +-dpend de la faon dont on atteint "mango-gw" - la route statique vers +-"mango-gw" devra tre pralablement configure. ++"mango-gw". Le périphérique qui sera effectivement utilisé pour cette route ++dépend de la façon dont on atteint "mango-gw" - la route statique vers ++"mango-gw" devra être préalablement configurée. + + .TP + .B route add ipx4 sl0 +-ajoute une route vers l'hte "ipx4" via l'interface SLIP (en supposant que +-"ipx4" est l'hte SLIP). ++ajoute une route vers l'hôte "ipx4" via l'interface SLIP (en supposant que ++"ipx4" est l'hôte SLIP). + + .TP + .B route add -net 192.57.66.0 netmask 255.255.255.0 gw ipx4 +-Cette commande route le rseau "192.57.66.x" par l'ancienne route vers l'interface SLIP. ++Cette commande route le réseau "192.57.66.x" par l'ancienne route vers l'interface SLIP. + + .TP + .B route add 224.0.0.0 netmask 240.0.0.0 dev eth0 +-Ceci est une commande mal documente et les gens savent ce qu'il faut +-faire? Ceci force toutes les routes IP des classes D (multicast) ++Ceci est une commande mal documentée et les gens savent ce qu'il faut ++faire? Ceci force toutes les routes IP des classes D (multicast) à + passer par "eth0". C'est la configuration correcte, normale pour un noyau + supportant le multicast. + + .TP + .B route add 10.0.0.0 netmask 255.0.0.0 reject +-Installe une route 'rejete' pour le rseau priv "10.x.x.x." ++Installe une route 'rejetée' pour le réseau privé "10.x.x.x." + + .LP + .SH RESULTATS +-Le contenu des tables de routage du noyaus est affich en colonnes comme ++Le contenu des tables de routage du noyaus est affiché en colonnes comme + suit + .TP + .B Destination +-Le rseau ou hte destination. ++Le réseau ou hôte destination. + .TP + .B Gateway +-L'adresse de la passerelle ou '*' si indfini. ++L'adresse de la passerelle ou '*' si indéfini. + .TP + .B Genmask +-Le masque de rseau pour le rseau destinataire; '255.255.255.255' pour un hte +-et '0.0.0.0' pour la route par dfaut ( ++Le masque de réseau pour le réseau destinataire; '255.255.255.255' pour un hôte ++et '0.0.0.0' pour la route par défaut ( + .B default + ). + .TP +@@ -254,63 +254,63 @@ Les indicateurs possibles sont + .br + .B H + (la cible est un +-.BR hte ) ++.BR hôte ) + .br + .B G + (utilise comme + .BR passerelle ) + .br + .B R +-.RB ( rtablit ++.RB ( rétablit + la route pour le routage dynamique) + .br + .B D + .RB ( dynamiquement +-configure par le dmon ou par redirect) ++configurée par le démon ou par redirect) + .br + .B M +-.RB ( modifie +-par le dmon de routage ou par redirect) ++.RB ( modifiée ++par le démon de routage ou par redirect) + .br + .B ! +-.RB ( rejte ++.RB ( rejète + la route) + .TP + .B Metric +-La 'distance' la cible (habituellement compte en hops). Ce n'est pas +-utilis par les noyaux rcents, mais peut-tre requis par certains dmons ++La 'distance' à la cible (habituellement comptée en hops). Ce n'est pas ++utilisé par les noyaux récents, mais peut-être requis par certains démons + de routage. + .TP + .B Ref +-Nombre de rfrences cette route. (Pas utilis dans le noyau Linux.) ++Nombre de références à cette route. (Pas utilisé dans le noyau Linux.) + .TP + .B Use + Count of lookups for the route. Depending on the use of -F and -C this will + be either route cache misses (-F) or hits (-C). + .TP + .B Iface +-Interface vers laquelle les paquets empruntant cette route seront envoys. ++Interface vers laquelle les paquets empruntant cette route seront envoyés. + .TP + .B MSS +-Taille de segment maximum par dfaut pour les connexions TCP sur cette ++Taille de segment maximum par défaut pour les connexions TCP sur cette + route. + .TP + .B Window +-Taille de fentre par dfaut pour les connexions TCP sur cette route. ++Taille de fenêtre par défaut pour les connexions TCP sur cette route. + .TP + .B irtt + RTT Initial (Round Trip Time). Le noyau utilise ceci pour essayer les +-meilleurs paramtres protocolaires TCP sans attendre de rponse +-(ventuellement tardive). ++meilleurs paramètres protocolaires TCP sans attendre de réponse ++(éventuellement tardive). + .TP +-.B HH (seulement cach) +-Le nombre d'entres ARP et de routes caches faisant rfrence au cache +-d'en-tte matriel pour la route en cache. Ce sera la valeur \-1 si aucune adresse +-matrielle n'est ncessaire pour l'interface de la route cache (p.ex. lo). ++.B HH (seulement caché) ++Le nombre d'entrées ARP et de routes cachées faisant référence au cache ++d'en-tête matériel pour la route en cache. Ce sera la valeur \-1 si aucune adresse ++matérielle n'est nécessaire pour l'interface de la route cachée (p.ex. lo). + .TP +-.B Arp (seulement cach) +-Indique si oui ou non l'adresse matrielle pour la route en cache est encore +- jour. ++.B Arp (seulement caché) ++Indique si oui ou non l'adresse matérielle pour la route en cache est encore ++à jour. + .LP + .SH FICHIERS + .I /proc/net/ipv6_route +@@ -324,11 +324,11 @@ Indique si oui ou non l'adresse mat + .LP + .SH HISTORIQUE + .B Route +-pour Linux a t originellement crit par Fred N. van Kempen, +-<waltje@uwalt.nl.mugnet.org> puis modifi par Johannes Stille et +-Linus Torvalds pour pl15. Alan Cox a ajout les options concernant +-la gestion des fentres et MSS pour Linux 1.1.22. Le support de irtt +-et la fusion avec netstat ont t raliss par Bernd Eckenfels. ++pour Linux a été originellement écrit par Fred N. van Kempen, ++<waltje@uwalt.nl.mugnet.org> puis modifié par Johannes Stille et ++Linus Torvalds pour pl15. Alan Cox a ajouté les options concernant ++la gestion des fenêtres et MSS pour Linux 1.1.22. Le support de irtt ++et la fusion avec netstat ont été réalisés par Bernd Eckenfels. + .SH AUTEUR + Maintenu par Phil Blundell <Philip.Blundell@pobox.com>. + .SH TRADUCTION +diff --git a/man/fr_FR/slattach.8 b/man/fr_FR/slattach.8 +index 512d514..d21d0d7 100644 +--- a/man/fr_FR/slattach.8 ++++ b/man/fr_FR/slattach.8 +@@ -1,87 +1,87 @@ + .TH SLATTACH 8 "12 Feb 1994" "" "" + .SH NOM +-slattach \- attache une interface rseau une ligne srie ++slattach \- attache une interface réseau à une ligne série + .SH SYNOPSIS + .B "slattach [-dehlLmnqv] [-c commande] [-p proto] [-s vitesse] [tty]" + .br + .SH DESCRIPTION + .B Slattach +-est un minuscule programme qui peut tre utilis pour attacher +-un terminal normal ("srie") dans un des diffrents modes "rseau", +-ceci vous permettant de l'utiliser pour des liaisons point--point +-vers d'autres systmes. ++est un minuscule programme qui peut être utilisé pour attacher ++un terminal normal ("série") dans un des différents modes "réseau", ++ceci vous permettant de l'utiliser pour des liaisons point-à-point ++vers d'autres systèmes. + .SH OPTIONS + .TP + .B "[-c commande]" +-Excute ++Exécute + .B `commande' +-lorsque la ligne est suspendue. Ceci peut tre utilis pour lancer +-des scripts ou rtablir des connexions quand un lien tombe. ++lorsque la ligne est suspendue. Ceci peut être utilisé pour lancer ++des scripts ou réétablir des connexions quand un lien tombe. + .TP + .B "[-d]" +-Valide le dbogage. Utile pour dterminer pourquoi une configuration ++Valide le débogage. Utile pour déterminer pourquoi une configuration + ne fonctionne pas. + .TP + .B "[-h]" +-Termine lorsque la porteuse est perdue. Ceci fonctionne la fois sur +-les priphriques /dev/tty et /dev/cua en contrlant directement +-l'tat de la porteuse toutes les 15 secondes. ++Termine lorsque la porteuse est perdue. Ceci fonctionne à la fois sur ++les périphériques /dev/tty et /dev/cua en contrôlant directement ++l'état de la porteuse toutes les 15 secondes. + .TP + .B "[-v]" + Valide le mode verbeux. Utile pour les shell scripts. + .TP + .B "[-q]" +-Opre en mode silencieux - pas de messages du tout. ++Opère en mode silencieux - pas de messages du tout. + .TP + .B "[-l]" +-Cre un fichier de vrouillage pour le priphrique comme ++Crée un fichier de vérouillage pour le périphérique comme + pour UUCP dans /var/lock. + .TP + .B "[-n]" +-Equivalent la commande "mesg n". ++Equivalent à la commande "mesg n". + .TP + .B "[-m]" + \fBn'\fPinitialise \fBpas\fP la ligne en mode raw 8 bits. + .TP + .B "[-e]" +-Termine correctement aprs l'initialisation du priphrique, ++Termine correctement après l'initialisation du périphérique, + au lieu d'attendre que la ligne soit suspendue. + .TP + .B "[-L]" +-Valide les oprations 3 lignes. Le terminal est mis en mode CLOCAL, +-la surveillance de porteuse est invalide. ++Valide les opérations 3 lignes. Le terminal est mis en mode CLOCAL, ++la surveillance de porteuse est invalidée. + .TP + .B "[-p proto]" +-Dfinit le protocole spcifique utiliser sur la ligne. +-La valeur par dfaut est ++Définit le protocole spécifique à utiliser sur la ligne. ++La valeur par défaut est + .B "cslip" +-, c'est--dire SLIP compress. Les autres valeurs possibles sont : ++, c'est-à-dire SLIP compressé. Les autres valeurs possibles sont : + .B "slip" + (SLIP normal), + .B "adaptive" + (CSLIP/SLIP adaptatifs), + .B "ppp" +-(Protocole Point--Point) ++(Protocole Point-à-Point) + et + .B "kiss" +-(un protocole utilis pour communiquer avec des controleurs AX.25 paquets radios). +-L'argument spcifique ++(un protocole utilisé pour communiquer avec des controleurs AX.25 paquets radios). ++L'argument spécifique + .B "tty" +-peut tre utilis pour refaire passer le priphrique en +-fonctionnement srie normal. L'utilisation du mode 'ppp' n'est en +-principe pas utile puisque ppp ncessite le dmon additionnel ++peut être utilisé pour refaire passer le périphérique en ++fonctionnement série normal. L'utilisation du mode 'ppp' n'est en ++principe pas utile puisque ppp nécessite le démon additionnel + .B pppd +-pour tre actif sur la ligne. Pour les connexions `kiss', le programme ++pour être actif sur la ligne. Pour les connexions `kiss', le programme + .B axattach +-doit tre utilis. ++doit être utilisé. + .TP + .B "[-s vitesse]" +-Dfinit la vitesse de la ligne, diffrente de la valeur par dfaut. ++Définit la vitesse de la ligne, différente de la valeur par défaut. + .PP +-Si aucun argument n'est donn, la ligne courante du terminal +-(habituellement lie au login) est utilise. Autrement, une tentative +-est effectue pour obtenir le port du terminal indiqu, puis il est +-vrouill et ouvert. ++Si aucun argument n'est donné, la ligne courante du terminal ++(habituellement liée au login) est utilisée. Autrement, une tentative ++est effectuée pour obtenir le port du terminal indiqué, puis il est ++vérouillé et ouvert. + .SH FICHIERS + .I /dev/cua* /var/lock/LCK.* + .SH BUGS +diff --git a/man/pt_BR/arp.8 b/man/pt_BR/arp.8 +index 41c8fd6..6c1e7f7 100644 +--- a/man/pt_BR/arp.8 ++++ b/man/pt_BR/arp.8 +@@ -7,12 +7,12 @@ arp \- manipula o cache ARP do sistema + .RB [ "\-H tipo" ] + .RB [ "-i if" ] + .B -a +-.RB [ mquina ] ++.RB [ máquina ] + .PP + .B arp + .RB [ \-v ] + .RB [ "\-i if" ] +-.B "\-d mquina" ++.B "\-d máquina" + .RB [ pub ] + .RB [ nopub ] + .PP +@@ -20,7 +20,7 @@ arp \- manipula o cache ARP do sistema + .RB [ \-v ] + .RB [ "\-H tipo" ] + .RB [ "\-i if" ] +-.B -s mquina endereo_hardware ++.B -s máquina endereço_hardware + .RB [ temp ] + .RB [ nopub ] + .PP +@@ -28,7 +28,7 @@ arp \- manipula o cache ARP do sistema + .RB [ \-v ] + .RB [ "\-H tipo" ] + .RB [ "\-i if" ] +-.B -s mquina endereo_hardware ++.B -s máquina endereço_hardware + .RB [ "netmask nm" ] + .B pub + .PP +@@ -36,7 +36,7 @@ arp \- manipula o cache ARP do sistema + .RB [ \-v ] + .RB [ "\-H tipo" ] + .RB [ "\-i if" ] +-.B -Ds mquina ifa ++.B -Ds máquina ifa + .RB [ "netmask nm" ] + .B pub + .PP +@@ -46,28 +46,28 @@ arp \- manipula o cache ARP do sistema + .RB [ "-i if" ] + .B -f arquivo + +-.SH DESCRIO ++.SH DESCRIÇÃO + .B arp +-manipula o cache ARP do kernel de vrias maneiras. As principais opes +-so remoo de uma entrada de mapeamento de endereo e configurao manual +-de um endereo. Para propsitos de depurao, o programa ++manipula o cache ARP do kernel de várias maneiras. As principais opções ++são remoção de uma entrada de mapeamento de endereço e configuração manual ++de um endereço. Para propósitos de depuração, o programa + .B arp +-tambm permite um dump completo do cache ARP. +-.SH OPES ++também permite um dump completo do cache ARP. ++.SH OPÇÕES + .TP + .B "\-v, \-\-verbose" +-Mostra ao usurio o que est acontecendo, de modo detalhado. ++Mostra ao usuário o que está acontecendo, de modo detalhado. + .TP + .B "\-n, \-\-numeric" +-mostra endereos numricos, ao invs de tentar determinar os nomes simblicos da +-mquina, porta e usurio. ++mostra endereços numéricos, ao invés de tentar determinar os nomes simbólicos da ++máquina, porta e usuário. + .TP + .B "\-H type, \-\-hw-type type" +-Quando configurando ou lendo o cache ARP, este parmetro opcional informa ao ++Quando configurando ou lendo o cache ARP, este parâmetro opcional informa ao + .B arp +-que classe de entradas devem ser verificadas. O valor padro deste parmetro ++que classe de entradas devem ser verificadas. O valor padrão deste parâmetro é + .B ether +-(i.e. cdigo de hardware 0x01 para Ethernet IEEE 802.3 10Mbps). ++(i.e. código de hardware 0x01 para Ethernet IEEE 802.3 10Mbps). + Outros valores podem incluir tecnologias de rede como + .RB "ARCnet (" arcnet ")" + , +@@ -77,86 +77,86 @@ Outros valores podem incluir tecnologias de rede como + e + .RB "NET/ROM (" netrom ")." + .TP +-.B "\-a [mquina], \-\-display [mquina]" +-Mostra as entradas das mquinas especificadas. Se o parmetro +-.B mquina +-no for usado, ++.B "\-a [máquina], \-\-display [máquina]" ++Mostra as entradas das máquinas especificadas. Se o parâmetro ++.B máquina ++não for usado, + .B todas +-as entradas sero mostradas. ++as entradas serão mostradas. + .TP +-.B "\-d mquina, \-\-delete mquina" +-Remove quaisquer entradas para a mquina especificada. Isto pode ser +-usado se a mquina indicada for desligada, por exemplo. Nos kernels ++.B "\-d máquina, \-\-delete máquina" ++Remove quaisquer entradas para a máquina especificada. Isto pode ser ++usado se a máquina indicada for desligada, por exemplo. Nos kernels + mais recentes o + .BR arp (1) +-suporta a especificao de ++suporta a especificação de + .B pub + ou + .B nopub +-para decidir se uma entrada pblica ou privada deve ser removida. Se voc +-no informar uma destas flags as duas entradas sero removidas. ++para decidir se uma entrada pública ou privada deve ser removida. Se você ++não informar uma destas flags as duas entradas serão removidas. + .TP + .B "\-D, \-\-use-device" +-Usa o endereo de hardware da interface ++Usa o endereço de hardware da interface + .BR ifa + .TP + .B "\-i If, \-\-device If" + Seleciona uma interface. Quando mostrando o cache ARP somente entradas iguais +- interface sero mostradas. Configura uma entrada ARP permanente ou +-temporria que ser usada no dispositivo especificado. Se nenhum dispositivo for ++à interface serão mostradas. Configura uma entrada ARP permanente ou ++temporária que será usada no dispositivo especificado. Se nenhum dispositivo for + informado, o kernel descobre o dispositivo a partir da tabela de roteamento. + Para entradas + .B pub +-a interface especificada a interface na qual as requisies ARP sero ++a interface especificada é a interface na qual as requisições ARP serão + respondidas. + .br + .B NOTA: +-Deve ser diferente da interface para a qual os pacotes IP sero roteados. ++Deve ser diferente da interface para a qual os pacotes IP serão roteados. + .TP +-.B "\-s mquina endereo_hardware, \-\-set mquina" +-Cria manualmente uma entrada de mapeamento de endereo ARP para a mquina +-.B mquina +-com endereo de hardware configurado para +-.B endereo_hardware. +-O formato do endereo de hardware depende da classe de hardware, mas +-para a maioria das classes pode-se assumir que a apresentao usual pode +-ser usada. Para a classe Ethernet, so 6 bytes em hexadecimal, separados +-por dois pontos (:). Quando adicionando entradas proxy arp (isto , aquelas ++.B "\-s máquina endereço_hardware, \-\-set máquina" ++Cria manualmente uma entrada de mapeamento de endereço ARP para a máquina ++.B máquina ++com endereço de hardware configurado para ++.B endereço_hardware. ++O formato do endereço de hardware depende da classe de hardware, mas ++para a maioria das classes pode-se assumir que a apresentação usual pode ++ser usada. Para a classe Ethernet, são 6 bytes em hexadecimal, separados ++por dois pontos (:). Quando adicionando entradas proxy arp (isto é, aquelas + com a flag +-.BR pb lico ++.BR púb lico + setadas) uma + .B netmask + pode ser especificada para o proxy arp de uma subrede inteira. +-Proxy arp para rotear redes inteiras no um bom protocolo, mas algumas +-vezes til, ento suportado. Se a flag ++Proxy arp para rotear redes inteiras não é um bom protocolo, mas algumas ++vezes é útil, então é suportado. Se a flag + .B temp +-no for fornecida, as entradas sero permanentemente armazenadas no cache ARP. ++não for fornecida, as entradas serão permanentemente armazenadas no cache ARP. + .TP + .B "\-f arquivo, \-\-file arquivo" +-Similar opo ++Similar à opção + .B \-s +-s que desta vez as informaes de endereos so obtidas a partir do arquivo ++só que desta vez as informações de endereços são obtidas a partir do arquivo + .B arquivo. +-Isto pode ser usado se entradas ARP para muitas mquinas tiverem que ser +-configuradas. O nome do arquivo de dados freqentemente ++Isto pode ser usado se entradas ARP para muitas máquinas tiverem que ser ++configuradas. O nome do arquivo de dados é freqüentemente + .IR /etc/ethers , +-mas isto no oficial. ++mas isto não é oficial. + .sp 1 +-O formato deste arquivo simples; ele somente contm linhas de texto ASCII com +-um nome de mquina e um endereo de hardware separados por um espao em branco. ++O formato deste arquivo é simples; ele somente contém linhas de texto ASCII com ++um nome de máquina e um endereço de hardware separados por um espaço em branco. + Adicionalmente as flags + .BR "pub" , " nopub" , " temp" " and" " netmask" + podem ser usadas. + .LP + Em todos os lugares onde uma +-.B mquina +- esperada, voc tambm pode informar um +-.B "endereo IP" +-em notao decimal separada por pontos. ++.B máquina ++é esperada, você também pode informar um ++.B "endereço IP" ++em notação decimal separada por pontos. + .LP +-Cada entrada completa no cache ARP ser marcada com uma flag ++Cada entrada completa no cache ARP será marcada com uma flag + .BR C . +-Entradas permanentes so marcadas com um ++Entradas permanentes são marcadas com um + .B M + e entradas publicadas tem uma flag + .BR P . +@@ -171,7 +171,7 @@ e entradas publicadas tem uma flag + .SH AUTOR + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> com muitas melhorias + feitas pelo mantenedor do net-tools, Bernd Eckenfels <net-tools@lina.inka.de>. +-Traduo para a lngua portuguesa feita por ++Tradução para a língua portuguesa feita por + Arnaldo Carvalho de Melo <acme@conectiva.com.br> em 11/abril/1998. + Revisado por + Jorge Luiz Godoy Filho <jorge@bestway.com.br> em 15/abril/1998. +diff --git a/man/pt_BR/hostname.1 b/man/pt_BR/hostname.1 +index fe00879..5880fc8 100644 +--- a/man/pt_BR/hostname.1 ++++ b/man/pt_BR/hostname.1 +@@ -1,15 +1,15 @@ + .TH HOSTNAME 1 "28 de janeiro de 1996" "net-tools" "Manual do Programador Linux" + + .SH NOME +-hostname \- mostra ou configura o nome da mquina ++hostname \- mostra ou configura o nome da máquina + .BR +-domainname \- mostra ou configura o nome do domnio NIS/YP ++domainname \- mostra ou configura o nome do domínio NIS/YP + .BR +-dnsdomainname \- mostra o nome do domnio DNS ++dnsdomainname \- mostra o nome do domínio DNS + .BR +-nisdomainname \- mostra ou configura o nome do domnio NIS/YP ++nisdomainname \- mostra ou configura o nome do domínio NIS/YP + .BR +-ypdomainname \- mostra ou configura o nome do domnio NIS/YP ++ypdomainname \- mostra ou configura o nome do domínio NIS/YP + + .SH SINOPSE + .B hostname +@@ -34,7 +34,7 @@ ypdomainname \- mostra ou configura o nome do dom + .RB [ \-v ] + .RB [ \-F\ arquivo ] + .RB [ \-\-file\ arquivo ] +-.RB [ mquina ] ++.RB [ máquina ] + + .PP + .B domainname +@@ -61,11 +61,11 @@ ypdomainname \- mostra ou configura o nome do dom + .B ypdomainname + .RB [ \-v ] + +-.SH DESCRIO ++.SH DESCRIÇÃO + .B hostname +- o programa usado para configurar ou mostrar o nome corrente da mquina +-ou o domnio do sistema. Este nome usado por muitos dos programas de +-rede para identificar a mquina. O nome do domnio tambm usado pelo ++é o programa usado para configurar ou mostrar o nome corrente da máquina ++ou o domínio do sistema. Este nome é usado por muitos dos programas de ++rede para identificar a máquina. O nome do domínio também é usado pelo + NIS/YP. + + .SS "OBTER NOME" +@@ -73,119 +73,119 @@ Quando chamado sem argumentos o programa mostra os nomes correntes: + + .LP + .B hostname +-mostrar o nome do sistema conforme retornado pela funo ++mostrará o nome do sistema conforme retornado pela função + .BR gethostname (2). + + + .LP + .B "domainname, nisdomainname, ypdomainname" +-mostrar o nome do sistema conforme retornado pela funo ++mostrará o nome do sistema conforme retornado pela função + .BR getdomainname (2). +-Isto tambm conhecido como o nome de domnio YP/NIS do sistema. ++Isto também é conhecido como o nome de domínio YP/NIS do sistema. + + .LP + .B dnsdomainname +-mostrara a parte do domnio do FQDN (Nome de domnio completamente qualificado). +-O FQDN do sistema retornado pelo comando ++mostrara a parte do domínio do FQDN (Nome de domínio completamente qualificado). ++O FQDN do sistema é retornado pelo comando + .BR "hostname \-\-fqdn" . + + .SS "CONFIGURAR NOME" +-Quando chamado com um argumento ou com a opo ++Quando chamado com um argumento ou com a opção + .B \-\-file +-, o comando configura o nome da mquina ou do domnio NIS/YP. ++, o comando configura o nome da máquina ou do domínio NIS/YP. + + .LP +-Note que somente o super usurio pode mudar os nomes. ++Note que somente o super usuário pode mudar os nomes. + + .LP +-Nao possvel configurar o FQDN ou o nome do domnio DNS com o comando ++Nao é possível configurar o FQDN ou o nome do domínio DNS com o comando + .B dnsdomainname + (veja + .B "O FQDN" + abaixo). + + .LP +-O nome da mquina normalmente configurado durante a inicializao do sistema, ++O nome da máquina é normalmente configurado durante a inicialização do sistema, + em + .I /etc/rc.d/rc.inet1 + ou + .I /etc/init.d/boot +-(normalmente lendo o contedo de um arquivo que contm o nome da mquina, ex.: ++(normalmente lendo o conteúdo de um arquivo que contém o nome da máquina, ex.: + .IR /etc/hostname ). + + .SS O FQDN +-Voc no pode mudar o FQDN (conforme retornado por ++Você não pode mudar o FQDN (conforme retornado por + .BR "hostname \-\-fqdn" ) +-ou o nome do domnio DNS (conforme retornado por ++ou o nome do domínio DNS (conforme retornado por + .BR "dnsdomainname" ) +-com este comando. O FQDN do sistema o nome que o ++com este comando. O FQDN do sistema é o nome que o + .BR resolver (3) +-retorna para o nome da mquina. ++retorna para o nome da máquina. + + .LP +-Tecnicamente: O FQDN o nome retornado pelo ++Tecnicamente: O FQDN é o nome retornado pelo + .BR gethostbyname (2) + para o nome retornado pelo + .BR gethostname (2). +-O nome do domnio DNS a parte aps o primeiro ponto. ++O nome do domínio DNS é a parte após o primeiro ponto. + .LP +-Portanto isto depende da configurao (normalmente em ++Portanto isto depende da configuração (normalmente em + .IR /etc/host.conf ) +-para que voc possa mud-lo. Normalmente (se o arquivo hosts for lido antes +-do DNS ou NIS) voc pode mud-lo em ++para que você possa mudá-lo. Normalmente (se o arquivo hosts for lido antes ++do DNS ou NIS) você pode mudá-lo em + .IR /etc/hosts . + + +-.SH OPES ++.SH OPÇÕES + .TP + .I "\-a, \-\-alias" +-Mostra o alias da mquina (se usado). ++Mostra o alias da máquina (se usado). + .TP + .I "\-d, \-\-domain" +-Mostra o nome do domnio DNS. No use o comando ++Mostra o nome do domínio DNS. Não use o comando + .B domainname +-para obter o nome do domnio DNS porque ele mostrar o nome do domnio NIS e +-no o nome do domnio DNS. Use ++para obter o nome do domínio DNS porque ele mostrará o nome do domínio NIS e ++não o nome do domínio DNS. Use + .BR dnsdomainname . + .TP + .I "\-F, \-\-file arquivo" +-Leia o nome da mquina a partir do arquivo especificado. Comentrios (linhas +-comeando com um `#') so ignorados. ++Leia o nome da máquina a partir do arquivo especificado. Comentários (linhas ++começando com um `#') são ignorados. + .TP + .I "\-f, \-\-fqdn, \-\-long" +-Mostra o FQDN (Nome de Domnio Completamente Qualificado). Um FQDN consiste de +-um nome curto de mquina e do nome do domnio DNS. A menos que voc esteja +-usando bind ou NIS para resoluo de nomes voc pode mudar o FQDN e o nome +-do domnio DNS (que parte do FQDN) no arquivo \fI/etc/hosts\fR. ++Mostra o FQDN (Nome de Domínio Completamente Qualificado). Um FQDN consiste de ++um nome curto de máquina e do nome do domínio DNS. A menos que você esteja ++usando bind ou NIS para resolução de nomes você pode mudar o FQDN e o nome ++do domínio DNS (que é parte do FQDN) no arquivo \fI/etc/hosts\fR. + .TP + .I "\-h, \-\-help" + Mostra uma mensagem sobre como utilizar o comando e termina. + .TP + .I "\-i, \-\-ip-address" +-Mostra o(s) endereo(s) IP da mquina. ++Mostra o(s) endereço(s) IP da máquina. + .TP + .I "\-s, \-\-short" +-Mostra o nome curto da mquina. o nome da mquina at o primeiro ponto. ++Mostra o nome curto da máquina. É o nome da máquina até o primeiro ponto. + .TP + .I "\-V, \-\-version" +-Mostra informao de verso na sada padro e termina com sucesso. ++Mostra informação de versão na saída padrão e termina com sucesso. + .TP + .I "\-v, \-\-verbose" +-Mostra uma sada detalhada do que est acontecendo. ++Mostra uma saída detalhada do que está acontecendo. + .TP + .I "\-y, \-\-yp, \-\-nis" +-Mostra o nome do domnio NIS. Se um parmetro for especificado (ou ++Mostra o nome do domínio NIS. Se um parâmetro for especificado (ou + .B \-\-file arquivo +-) ento o root tambm pode configurar um novo domnio NIS. ++) então o root também pode configurar um novo domínio NIS. + .SH ARQUIVOS + .B /etc/hosts + .SH AUTOR + Peter Tobias, <tobias@et-inf.fho-emden.de> + .BR +-Bernd Eckenfels, <net-tools@lina.inka.de> (NIS e pgina man). ++Bernd Eckenfels, <net-tools@lina.inka.de> (NIS e página man). + .BR +-Arnaldo Carvalho de Melo, <acme@conectiva.com.br> Traduo para a lngua ++Arnaldo Carvalho de Melo, <acme@conectiva.com.br> Tradução para a língua + portuguesa. + .BR +-Jorge Luiz Godoy Filho, <jorge@bestway.com.br> Reviso. ++Jorge Luiz Godoy Filho, <jorge@bestway.com.br> Revisão. + .BR +diff --git a/man/pt_BR/ifconfig.8 b/man/pt_BR/ifconfig.8 +index 0a97683..1432dc5 100644 +--- a/man/pt_BR/ifconfig.8 ++++ b/man/pt_BR/ifconfig.8 +@@ -4,13 +4,13 @@ ifconfig \- configura uma interface de rede + .SH SINOPSE + .B "ifconfig [interface]" + .br +-.B "ifconfig interface [aftype] opes | endereos ..." +-.SH DESCRIO ++.B "ifconfig interface [aftype] opções | endereços ..." ++.SH DESCRIÇÃO + .B ifconfig +- usado para configurar (e posteriormente manter) as interfaces de +-rede. usado durante o boot para configurar a maioria delas para +-um estado usvel. Depois disto, normalmente somente necessrio +-durante depuraes ou quando for necessria uma configurao fina ++é usado para configurar (e posteriormente manter) as interfaces de ++rede. É usado durante o boot para configurar a maioria delas para ++um estado usável. Depois disto, é normalmente somente necessário ++durante depurações ou quando for necessária uma configuração fina + do sistema. + .LP + Se nenhum argumento for informado, +@@ -19,12 +19,12 @@ somente mostra o estado das interfaces correntemente definidas. Se + um argumento + .B interface + for informado, ele mostra somente o estado da interface informada. De +-outra forma ele assume que os parmetros devem ser configurados. +-.SH Famlias de Endereamento +-Se o primeiro argumento aps o nome da interface for reconhecido +-como um nome de uma famlia de endereamento suportada, esta famlia +-de endereamento usada na decodificao e apresentao de todos +-os endereos de protocolos. Atualmente as famlias de endereamento ++outra forma ele assume que os parâmetros devem ser configurados. ++.SH Famílias de Endereçamento ++Se o primeiro argumento após o nome da interface for reconhecido ++como um nome de uma família de endereçamento suportada, esta família ++de endereçamento é usada na decodificação e apresentação de todos ++os endereços de protocolos. Atualmente as famílias de endereçamento + suportadas incluem + .B inet + (TCP/IP, default) +@@ -36,95 +36,91 @@ suportadas incluem + (Novell IPX) and + .B netrom + (AMPR Packet radio). +-.SH OPES ++.SH OPÇÕES + .TP + .B interface +-O nome da interface de rede. Usualmente um nome como ++O nome da interface de rede. Usualmente é um nome como + .B eth0 + , + .B sl3 + ou algo parecido: um nome de driver de dispositivo seguido por um +-nmero. ++número. + .TP + .B up +-Esta flag causa a ativao da interface. especificada +-implicitamente se a interface receber um novo endereo (veja ++Esta flag causa a ativação da interface. É especificada ++implicitamente se a interface receber um novo endereço (veja + abaixo). + .TP + .B down +-Esta flag desativa o driver desta interface, til quando alguma +-coisa comear a ter problemas. ++Esta flag desativa o driver desta interface, é útil quando alguma ++coisa começar a ter problemas. + .TP + .B "[\-]arp" + Habilita ou desabilita o uso do protocolo ARP para esta interface. Se +-o sinal de menos (\-) estiver presente a opo desligada. ++o sinal de menos (\-) estiver presente a opção é desligada. + .TP + .B "[\-]trailers" +-Habilita ou desabilita o uso de trailer em frames Ethernet. No +-utilizada na implementao atual do pacote net-tools. ++Habilita ou desabilita o uso de trailer em frames Ethernet. Não é ++utilizada na implementação atual do pacote net-tools. + .TP + .B "[\-]allmulti" + Habilita ou desabilita o modo + .B promiscuous +-da interface. Isto significa que todos os frames passaro pela camada +-de rede do kernel, permitindo monitorao da rede. +-.TP +-.B "metric N" +-Este parmetro configura a mtrica da interface. No usado atualmente, +-mas ser implementado no futuro. ++da interface. Isto significa que todos os frames passarão pela camada ++de rede do kernel, permitindo monitoração da rede. + .TP + .B "mtu N" +-Este parmetro configura a Unidade Mxima de Transferncia (MTU) de uma +-interface. Para Ethernet um nmero entre 1000-2000 (o padro +-1500). Para SLIP, use algo entre 200 e 4096. Note que a implementao +-atual no manipula fragmentao IP ainda, ento melhor configurar ++Este parâmetro configura a Unidade Máxima de Transferência (MTU) de uma ++interface. Para Ethernet é um número entre 1000-2000 (o padrão é ++1500). Para SLIP, use algo entre 200 e 4096. Note que a implementação ++atual não manipula fragmentação IP ainda, então é melhor configurar + a MTU com um tamanho adequado! + .TP + .B "dstaddr addr" +-Configura o endereo IP do "outro lado" no caso de um link Ponto-A-Ponto, ++Configura o endereço IP do "outro lado" no caso de um link Ponto-A-Ponto, + como PPP. Esta palavra-chave tornou-se obsoleta e deve ser usada a nova + palavra-chave + .BR pointopoint . + .TP + .B "netmask addr" +-Configura a mscara de rede IP para esta interface. Este valor assume o +-padro usual das classes A, B ou C (deduzindo-o a partir do endereo ++Configura a máscara de rede IP para esta interface. Este valor assume o ++padrão usual das classes A, B ou C (deduzindo-o a partir do endereço + IP da interface), mas pode ser configurado para qualquer valor para o + uso de sub-redes. + + .TP + .B "irq addr" +-Configura a linha de interrupo (IRQ) usada por este dispositivo. Muitos +-dispositivos no suportam configurao dinmica de IRQ. ++Configura a linha de interrupção (IRQ) usada por este dispositivo. Muitos ++dispositivos não suportam configuração dinâmica de IRQ. + .TP +-.B "[-]broadcast [endereo]" +-Se o argumento endereo for informado, configura o endereo de protocolo ++.B "[-]broadcast [endereço]" ++Se o argumento endereço for informado, configura o endereço de protocolo + broadcast para esta interface. De outra forma ele somente configura a flag + .B IFF_BROADCAST + da interface. Se a palavra-chave for precedida por um sinal de menos + .B (-) +-, ento a flag removida. ++, então a flag é removida. + .TP +-.B "[-]pointopoint [endereo]" ++.B "[-]pointopoint [endereço]" + Esta palavra-chave habilita o modo + .B ponto-a-ponto +-da interface, significando que ela um link direto entre duas mquinas +-sem ningum ouvindo (ou, pelo menos ns esperamos que este seja o caso ++da interface, significando que ela é um link direto entre duas máquinas ++sem ninguém ouvindo (ou, pelo menos nós esperamos que este seja o caso + :-) + .BR +-Se o argumento endereo for informado, configura o endereo de protocolo ++Se o argumento endereço for informado, configura o endereço de protocolo + do outro lado do link, exatamente como a palavra-chave obsoleta + .B dstaddr + faz. De outra forma, ela somente configura a flag + .B IFF_POINTOPOINT + da interface. Se a palavra-chave for precedida por um sinal de menos + .B (-) +-, ento a flag removida. ++, então a flag é removida. + .TP + .B "hw" +-Configura o endereo de hardware para esta interface, se o driver do +-dispositivo suportar esta operao. A palavra-chave deve ser seguida +-pelo nome da classe do hardware e o equivalente em ASCII do endereo ++Configura o endereço de hardware para esta interface, se o driver do ++dispositivo suportar esta operação. A palavra-chave deve ser seguida ++pelo nome da classe do hardware e o equivalente em ASCII do endereço + de hardware. As classes de hardware atualmente suportadas incluem + .B ether + (Ethernet), +@@ -136,45 +132,34 @@ e + (AMPR NET/ROM). + .TP + .B multicast +-Inicializa a flag de multicast para a interface. Normalmente, isto no ser +-necessrio j que os drivers ajustam as flags corretas por si s. ++Inicializa a flag de multicast para a interface. Normalmente, isto não será ++necessário já que os drivers ajustam as flags corretas por si só. + .TP +-.B endereo +-O nome ou endereo IP da mquina (um nome de mquina ser traduzido para +-um endereo IP) da interface. Este parmetro necessrio, apesar +-da sintaxe atualmente no requisit-lo. ++.B endereço ++O nome ou endereço IP da máquina (um nome de máquina será traduzido para ++um endereço IP) da interface. Este parâmetro é necessário, apesar ++da sintaxe atualmente não requisitá-lo. + .SH NOTAS +- +-+Since kernel release 2.2 there are no explicit interface statistics for +-+alias interfaces anymore. The statistics printed for the original address +-+are shared with all alias addresses on the same device. If you want per-address +-+statistics you should add explicit accounting +-+rules for the address using the +-+.BR ipchains(8) +-+command. +- +-Deste o kernel 2.2 no existem mais estatsticas explcitas para os apelidos (aliases) +-de interfaces. As estatsticas mostradas para o endereo original so compartilhadas +-como todos os endereos associados ao mesmo dispositivo. Se desejar estatsticas +-por endereo voc deve explicitamente adicionar regras de contabilizao para os +-endereos usando o comando +-.BR ipchains(8) ++Deste o kernel 2.2 não existem mais estatísticas explícitas para os apelidos (aliases) ++de interfaces. As estatísticas mostradas para o endereço original são compartilhadas ++como todos os endereços associados ao mesmo dispositivo. Se desejar estatísticas ++por endereço você deve explicitamente adicionar regras de contabilização para os ++endereços usando o comando ++.BR iptables(8) + . + + .SH ARQUIVOS +-.I /proc/net/socket +-.br + .I /proc/net/dev + .SH BUGS +-Os endereos appletalk DDP e IPX sero mostrados, mas no podem ser alterados ++Os endereços appletalk DDP e IPX serão mostrados, mas não podem ser alterados + com este comando. +-.SH VEJA TAMBM +-route(8), netstat(8), arp(8), rarp(8), ipchains(8) ++.SH VEJA TAMBÉM ++route(8), netstat(8), arp(8), rarp(8), iptables(8) + .SH AUTORES + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + Alan Cox, <Alan.Cox@linux.org> +-.SH TRADUO E REVISO PARA A LNGUA PORTUGUESA +-Arnaldo Carvalho de Melo <acme@conectiva.com.br> (traduo) ++.SH TRADUÇÃO E REVISÃO PARA A LÍNGUA PORTUGUESA ++Arnaldo Carvalho de Melo <acme@conectiva.com.br> (tradução) + .BR +-Jorge Luiz Godoy Filho <jorge@bestway.com.br> (reviso) ++Jorge Luiz Godoy Filho <jorge@bestway.com.br> (revisão) + +diff --git a/man/pt_BR/netstat.8 b/man/pt_BR/netstat.8 +index b9b359a..d2d04ef 100644 +--- a/man/pt_BR/netstat.8 ++++ b/man/pt_BR/netstat.8 +@@ -5,13 +5,13 @@ + .\" + .\" Modificado por: Bernd.Eckenfels@inka.de + .\" Modificado por: Andi Kleen ak@muc.de +-.\" Traduzido para portugus por Arnaldo Carvalho de Melo <acme@conectiva.com.br> ++.\" Traduzido para português por Arnaldo Carvalho de Melo <acme@conectiva.com.br> + .\" Revisado por Jorge Luiz Godoy Filho <jorge@bestway.com.br> + .\" +-.TH NETSTAT 8 "19 de maio de 1997" "net-tools" "Manual do Programador Linux" ++.TH NETSTAT 8 "2007-12-02" "net-tools" "Manual do Programador Linux" + + .SH NOME +-netstat \- Mostra conexes de rede, tabelas de roteamento, estatsticas de interface e conexes ++netstat \- Mostra conexões de rede, tabelas de roteamento, estatísticas de interface e conexões + mascaradas. + .SH SINOPSE + +@@ -19,6 +19,8 @@ mascaradas. + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-unix | \-x ] + .RB [ \-\-inet | \-\-ip ] +@@ -63,90 +65,90 @@ mascaradas. + .RB { \-h | \-\-help } + + .PP +-.SH DESCRIO ++.SH DESCRIÇÃO + .B netstat +-mostra informaes do subsistema de rede do Linux. ++mostra informações do subsistema de rede do Linux. + +-.SS "(sem opes)" +-Voc pode ver o estado das conexes de rede atravs da listagem dos sockets +-abertos. Esta a operao padro: se voc no especificar nenhuma +-famlia de endereos, os sockets ativos de todas as famlias de endereos +-configuradas sero mostrados. Com ++.SS "(sem opções)" ++Você pode ver o estado das conexões de rede através da listagem dos sockets ++abertos. Esta é a operação padrão: se você não especificar nenhuma ++família de endereços, os sockets ativos de todas as famílias de endereços ++configuradas serão mostrados. Com + .B -e +-voc obter informaes adicionais (userid). Com a chave ++você obterá informações adicionais (userid). Com a chave + .B -v +-voc poder fazer com que o netstat reclame sobre famlias de endereos +-conhecidas que no sejam suportadas pelo kernel. A opo ++você poderá fazer com que o netstat reclame sobre famílias de endereços ++conhecidas que não sejam suportadas pelo kernel. A opção + .B -o +-mostra algumas informaes adicionais sobre temporizadores de rede. ++mostra algumas informações adicionais sobre temporizadores de rede. + .B -a +-mostra todos os sockets, incluindo sockets de servidores. A famlia de +-endereos ++mostra todos os sockets, incluindo sockets de servidores. A família de ++endereços + .B inet +-mostrar sockets raw, udp e tcp. ++mostrará sockets raw, udp e tcp. + + .SS "\-r, \-\-route" +-Com a opo ++Com a opção + .BR \-r ", " \-\-route +-voc obter as tabelas de roteamento do kernel no mesmo formato usado por ++você obterá as tabelas de roteamento do kernel no mesmo formato usado por + .BR "route -e" . + .B "netstat -er" +-usar o formato de apresentao do comando ++usará o formato de apresentação do comando + .BR route . + Por favor veja + .BR route (8) + para maiores detalhes. + +-.SS "\-i, \-\-interface \fIiface\fI" +-Se voc usar a opo ++.SS "\-i, \-\-interfaces \fIiface\fI" ++Se você usar a opção + .BR -i ", " --interfaces + , uma tabela de todas (ou da + .IR iface +-especificada) as interfaces de rede ser mostrada. A sada usa o formato ++especificada) as interfaces de rede será mostrada. A saída usa o formato + .B "ifconfig -e" +-, e descrita em ++, e é descrita em + .BR ifconfig (8). + .B "netstat -ei" +-mostrar uma tabela ou uma entrada de interface como ++mostrará uma tabela ou uma entrada de interface como + .B ifconfig + mostra. Com a chave + .B -a +-, voc pode incluir interfaces que no estejam configuradas (i.e. no tem ++, você pode incluir interfaces que não estejam configuradas (i.e. não tem + a flag + .BR U = UP + configurada). + + .SS "\-M, \-\-masquerade" + +-Uma lista de todas as sesses mascaradas tambm pode ser vista. Com a chave ++Uma lista de todas as sessões mascaradas também pode ser vista. Com a chave + .B -e +-voc pode incluir mais algumas informaes sobre numerao sequencial e deltas +-, causados por reescritas de dados em sesses FTP (comando PORT). +-O suporte a mascaramento usado para esconder mquinas em endereos de +-rede no oficiais do resto do mundo, como descrito em +-.BR ipfw (4), ipfwadm "(8) e ipfw (8). ++você pode incluir mais algumas informações sobre numeração sequencial e deltas ++, causados por reescritas de dados em sessões FTP (comando PORT). ++O suporte a mascaramento é usado para esconder máquinas em endereços de ++rede não oficiais do resto do mundo, como descrito em ++.BR iptables (8). + + .SS "\-s, \-\-statistics" + +-Mostra estatsticas sobre o subsistema de rede do kernel do Linux, que +-so lidas a partir de ++Mostra estatísticas sobre o subsistema de rede do kernel do Linux, que ++são lidas a partir de + .IR /proc/net/snmp . + + .PP +-.SH OPES ++.SH OPÇÕES + .SS "\-v, \-\-verbose" +-Informa ao usurio o que est ocorrendo, sendo detalhado. Especialmente +-mostra algumas informaes teis sobre famlias de endereos no ++Informa ao usuário o que está ocorrendo, sendo detalhado. Especialmente ++mostra algumas informações úteis sobre famílias de endereços não + configuradas. + + .SS "\-n, \-\-numeric" +-Mostra endereos numricos, sem tentar resolver os nomes da mquina, porta ou +-usurio. ++Mostra endereços numéricos, sem tentar resolver os nomes da máquina, porta ou ++usuário. + +-.SS "\-A, \-\-af \fIfamlia\fI" +-Usa um mtodo diferente para configurar as famlias de endereos. +-.I famlia +- uma lista de palavras-chave de famlias de endereos separadas por vrgulas ++.SS "\-A, \-\-af \fIfamília\fI" ++Usa um método diferente para configurar as famílias de endereços. ++.I família ++é uma lista de palavras-chave de famílias de endereços separadas por vírgulas + (',') como + .BR inet , + .BR unix , +@@ -155,7 +157,7 @@ Usa um m + .B netrom + e + .BR ddp . +-Tem o mesmo efeito de usar as opes longas ++Tem o mesmo efeito de usar as opções longas + .BR \-\-inet , + .BR \-\-unix , + .BR \-\-ipx , +@@ -165,99 +167,99 @@ e + .BR \-\-ddp. + + .SS "\-c, \-\-continuous" +-Isto far com que ++Isto fará com que + .B netstat +-mostre a tabela selecionada a cada segundo, continuamente na tela at que +-voc o interrompa. ++mostre a tabela selecionada a cada segundo, continuamente na tela até que ++você o interrompa. + + .PP +-.SH SADA ++.SH SAÍDA + + .PP +-.SS Conexes Internet Ativas \fR(TCP, UDP, RAW)\fR ++.SS Conexões Internet Ativas \fR(TCP, UDP, RAW)\fR + + .SS "Proto" + O protocolo (tcp, udp, raw) usado pelo socket. + + .SS "Recv-Q" +-O contador de bytes no copiados pelo programa conectado a este socket. ++O contador de bytes não copiados pelo programa conectado a este socket. + + .SS "Send-Q" +-O contador de bytes no confirmados pela mquina remota. ++O contador de bytes não confirmados pela máquina remota. + +-.SS "Endereo Local" +-O endereo local (nome da mquina local) e o numero da porta do socket. A menos ++.SS "Endereço Local" ++O endereço local (nome da máquina local) e o numero da porta do socket. A menos + que a chave + .B -n +-seja especificada o endereo do socket ser resolvido para seu nome de mquina +-cannico e o nmero da porta ser traduzido para o servio correspondente. ++seja especificada o endereço do socket será resolvido para seu nome de máquina ++canônico e o número da porta será traduzido para o serviço correspondente. + +-.SS "Endereo Remoto" +-O endereo remoto (nome da mquina remota) e o nmero da porta do socket. Como +-com o endereo local, a chave ++.SS "Endereço Remoto" ++O endereço remoto (nome da máquina remota) e o número da porta do socket. Como ++com o endereço local, a chave + .B -n +-desliga a resoluo do nome da mquina e do servio. ++desliga a resolução do nome da máquina e do serviço. + + .SS "Estado" +-O estado do socket. Uma vez que no existem estados no modo RAW e normalmente +-nenhum estado usado em UDP, esta linha pode ser deixada em branco. Normalmente +-ele pode assumir um de vrios valores: ++O estado do socket. Uma vez que não existem estados no modo RAW e normalmente ++nenhum estado é usado em UDP, esta linha pode ser deixada em branco. Normalmente ++ele pode assumir um de vários valores: + .TP + .I + ESTABELECIDO +-O socket tem uma conexo estabelecida. ++O socket tem uma conexão estabelecida. + .TP + .I + SYN_SENT +-O socket est ativamente tentando estabelecer uma conexo. ++O socket está ativamente tentando estabelecer uma conexão. + .TP + .I + SYN_RECV +-Uma requisio de conexo foi recebida da rede. ++Uma requisição de conexão foi recebida da rede. + .TP + .I + FIN_WAIT1 +-O socket est fechado e a conexo est terminando. ++O socket está fechado e a conexão está terminando. + .TP + .I + FIN_WAIT2 +-A conexo est fechada e o socket est esperando por uma terminao pela +-mquina remota. ++A conexão está fechada e o socket está esperando por uma terminação pela ++máquina remota. + .TP + .I + TIME_WAIT +-O socket est esperando aps o fechamento para tratar os pacotes ainda na rede. ++O socket está esperando após o fechamento para tratar os pacotes ainda na rede. + .TP + .I + FECHADO +-O socket no est sendo usado. ++O socket não está sendo usado. + .TP + .I + CLOSE_WAIT + O lado remoto terminou, esperando pelo fechamento do socket. + .TP + .I +-LTIMO_ACK +-O lado remoto terminou, e o socket est fechado. Esperando por uma +-confirmao. ++ÚLTIMO_ACK ++O lado remoto terminou, e o socket está fechado. Esperando por uma ++confirmação. + .TP + .I + OUVINDO +-O socket est ouvindo por conexes. Estes socket so somente mostrados se ++O socket está ouvindo por conexões. Estes socket são somente mostrados se + a chave + .BR -a , --listening + for especificada. + .TP + .I + FECHANDO +-Ambos os sockets esto terminados mas ns ainda no enviamos todos os nossos ++Ambos os sockets estão terminados mas nós ainda não enviamos todos os nossos + dados. + .TP + .I + DESCONHECIDO +-O estado do socket desconhecido. ++O estado do socket é desconhecido. + +-.SS "Usurio" ++.SS "Usuário" + O nome ou UID do dono do socket. + + .SS "Temporizador" +@@ -272,198 +274,195 @@ O nome ou UID do dono do socket. + O protocolo (normalmente unix) usado pelo socket. + + .SS "CntRef" +-O contador de referncias (i.e. processos conectados via este socket). ++O contador de referências (i.e. processos conectados via este socket). + + .SS "Flags" +-As flags mostradas so SO_ACCEPTON (mostrada como ++As flags mostradas são SO_ACCEPTON (mostrada como + .BR ACC ), + SO_WAITDATA + .RB ( W ) + ou SO_NOSPACE + .RB ( N ). + SO_ACCECPTON +- usada para sockets no-conectados se seus processos correspondentes +-estiverem esperando por uma solicitao de conexo. As demais flags no +-so de interesse comum. ++é usada para sockets não-conectados se seus processos correspondentes ++estiverem esperando por uma solicitação de conexão. As demais flags não ++são de interesse comum. + + .SS "Tipos" +-H diversos tipos de acesso a sockets: ++Há diversos tipos de acesso a sockets: + .TP + .I + SOCK_DGRAM +-O socket usado no modo de Datagramas (sem conexo). ++O socket é usado no modo de Datagramas (sem conexão). + .TP + .I + SOCK_STREAM +- um socket usado quando h conexes (stream socket). ++É um socket usado quando há conexões (stream socket). + .TP + .I + SOCK_RAW +- usado como o socket bsico (raw socket). ++É usado como o socket básico (raw socket). + .TP + .I + SOCK_RDM +-Este usado para confirmao de entrega de mensagens. ++Este é usado para confirmação de entrega de mensagens. + .TP + .I + SOCK_SEQPACKET +- um socket para um pacote sequencial. ++É um socket para um pacote sequencial. + .TP + .I + SOCK_PACKET +-Socket para acesso da interface BSICA. ++Socket para acesso da interface BÁSICA. + .TP + .I + UNKNOWN +-Quem sabe o que nos trar o futuro? Preencha aqui :-) ++Quem sabe o que nos trará o futuro? Preencha aqui :-) + + .PP + .SS "Estados" +-Este campo conter uma das seguintes palavras-chave: ++Este campo conterá uma das seguintes palavras-chave: + .TP + .I + FREE +-Este socket no est alocado. ++Este socket não está alocado. + .TP + .I + LISTENING +-O socket est aguardando por uma solicitao de conexo. So mostrados +-apenas se as opes ++O socket está aguardando por uma solicitação de conexão. São mostrados ++apenas se as opções + .BR -a , --listening + forem selecionadas. + .TP + .I + CONNECTING +-O socket est por estabelecer uma conexo. ++O socket está por estabelecer uma conexão. + .TP + .I + CONNECTED +-O socket est conectado. ++O socket está conectado. + .TP + .I + DISCONNECTING +-O socket est desconectado. ++O socket está desconectado. + .TP + .I + (nada) +-O socket no est conectado a nenhum outro. ++O socket não está conectado a nenhum outro. + .TP + .I + UNKNOWN +-Isto no deve acontecer nunca. ++Isto não deve acontecer nunca. + + .SS "Path" +-Mostra o caminho (path) do processo do qual est tratando esse socket. ++Mostra o caminho (path) do processo do qual está tratando esse socket. + + .PP + .SS Sockets IPX ativos + +-(Isso precisa ser feito por algum que saiba faz-lo.) ++(Isso precisa ser feito por alguém que saiba fazê-lo.) + + .PP + .SS Sockets NET/ROM ativos + +-(Isso precisa ser feito por algum que saiba faz-lo.) ++(Isso precisa ser feito por alguém que saiba fazê-lo.) + + .PP + .SS Sockets AX.25 ativos + +-(Isso precisa ser feito por algum que saiba faz-lo.) ++(Isso precisa ser feito por alguém que saiba fazê-lo.) + + .PP + .SH NOTAS +-Desde o kernel 2.2 o netstat -i no mostra estatsticas para apelidos (aliases) +-de interfaces. Para obter contadores por apelido de interface voc precisa +-configurar regras explcitas usando o comando +-+.BR ipchains(8) ++Desde o kernel 2.2 o netstat -i não mostra estatísticas para apelidos (aliases) ++de interfaces. Para obter contadores por apelido de interface você precisa ++configurar regras explícitas usando o comando +++.BR iptables(8) + . + .SH FILES + .ta + .I /etc/services +--- O arquivo de "traduo" (correspondncia) entre socket e servio. ++-- O arquivo de "tradução" (correspondência) entre socket e serviço. + + .I /proc/net/dev +--- Informaes de dispositivos. ++-- Informações de dispositivos. + + .I /proc/net/snmp +--- Estatsticas da rede. ++-- Estatísticas da rede. + + .I /proc/net/raw +--- Informao sobre o socket BSICO (RAW). ++-- Informação sobre o socket BÁSICO (RAW). + + .I /proc/net/tcp +--- Informao sobre o socket TCP. ++-- Informação sobre o socket TCP. + + .I /proc/net/udp +--- Informao sobre o socket UDP. ++-- Informação sobre o socket UDP. + + .I /proc/net/unix +--- Informao sobre o socket de domnio Unix. ++-- Informação sobre o socket de domínio Unix. + + .I /proc/net/ipx +--- Informao sobre o socket IPX. ++-- Informação sobre o socket IPX. + + .I /proc/net/ax25 +--- Informao sobre o socket AX25. ++-- Informação sobre o socket AX25. + + .I /proc/net/appletalk +--- Informao sobre o socket DDP (Appletalk). ++-- Informação sobre o socket DDP (Appletalk). + + .I /proc/net/nr +--- Informao sobre o socket NET/ROM. ++-- Informação sobre o socket NET/ROM. + + .I /proc/net/route +--- Informao sobre os roteamentos IP realizados pelo kernel ++-- Informação sobre os roteamentos IP realizados pelo kernel + + .I /proc/net/ax25_route +--- Informao sobre os roteamentos AX25 realizados pelo kernel ++-- Informação sobre os roteamentos AX25 realizados pelo kernel + + .I /proc/net/ipx_route +--- Informao sobre os roteamentos IPX realizados pelo kernel ++-- Informação sobre os roteamentos IPX realizados pelo kernel + + .I /proc/net/nr_nodes +--- Lista de ns NET/ROM do kernel ++-- Lista de nós NET/ROM do kernel + + .I /proc/net/nr_neigh + -- "Vizinhos" NET/ROM do kernel + + .I /proc/net/ip_masquerade +--- Conexes mascaradas do kernel ++-- Conexões mascaradas do kernel + + .fi + + .PP +-.SH VEJA TAMBM ++.SH VEJA TAMBÉM + .BR route (8), + .BR ifconfig (8), +-.BR ipfw (4), +-.BR ipfw (8), +-.BR ipfwadm (8) +-.BR ipchains (8) ++.BR iptables (8) + + .PP + .SH BUGS +-Ocasionalmente informaes estranhas podem surgir se um socket mudar +-enquanto visualizado. Isso incomum. ++Ocasionalmente informações estranhas podem surgir se um socket mudar ++enquanto é visualizado. Isso é incomum. + .br +-As opes descritas para ++As opções descritas para + .B netstat -i +-foram descritas como devero funcionar aps alguma limpeza da liberao ++foram descritas como deverão funcionar após alguma limpeza da liberação + BETA do pacote net-tools. + + .PP + .SH AUTORES +-A interface com o usurio foi escrita por Fred Baumgarten +-<dc6iq@insu1.etec.uni-karlsruhe.de> a pgina do manual basicamente ++A interface com o usuário foi escrita por Fred Baumgarten ++<dc6iq@insu1.etec.uni-karlsruhe.de> a página do manual basicamente + por Matt Welsh <mdw@tc.cornell.edu>. Foi atualizada por + Alan Cox <Alan.Cox@linux.org> mas poderia ter sido feita com um pouco + mais de trabalho. + .BR + .LP +-A pgina do manual e os comandos includos no pacote net-tools ++A página do manual e os comandos incluídos no pacote net-tools + foram totalmente reescritos desde Bernd Eckenfels + <ecki@linux.de>. + .BR +-.SH TRADUO E REVISO PARA PORTUGUS +-Traduzido para o portugus por Arnaldo Carvalho de Melo ++.SH TRADUÇÃO E REVISÃO PARA PORTUGUÊS ++Traduzido para o português por Arnaldo Carvalho de Melo + <acme@conectiva.com.br> e Jorge Luiz Godoy Filho <jorge@bestway.com.br>. +diff --git a/man/pt_BR/rarp.8 b/man/pt_BR/rarp.8 +index de31931..b19f1b7 100644 +--- a/man/pt_BR/rarp.8 ++++ b/man/pt_BR/rarp.8 +@@ -2,30 +2,30 @@ + .SH NOME + rarp \- manipula a tabela RARP do sistema + .SH SINOPSE +-.B "rarp [-v] [-t tipo] -a [mquina]" ++.B "rarp [-v] [-t tipo] -a [máquina]" + .br +-.B "rarp [-v] -d mquina ..." ++.B "rarp [-v] -d máquina ..." + .br +-.B "rarp [-v] [-t tipo] -s mquina endereo_hardware" +-.SH DESCRIO ++.B "rarp [-v] [-t tipo] -s máquina endereço_hardware" ++.SH DESCRIÇÃO + .B Rarp +-manipula as tabelas RARP do kernel de varias formas. As opes principais +-so limpar uma entrada de mapeamento de endereos e manualmente configurar uma. +-Para propsitos de depurao, o programa ++manipula as tabelas RARP do kernel de varias formas. As opções principais ++são limpar uma entrada de mapeamento de endereços e manualmente configurar uma. ++Para propósitos de depuração, o programa + .B rarp +-tambm permite um dump completo da tabela RARP. +-.SH OPES ++também permite um dump completo da tabela RARP. ++.SH OPÇÕES + .TP + .B \-v +-Informe o usurio o que esta acontecendo, sendo detalhado. ++Informe o usuário o que esta acontecendo, sendo detalhado. + .TP + .B "\-t tipo" +-quando configurando ou lendo a tabela RARP, este parmetro opcional informa ao ++quando configurando ou lendo a tabela RARP, este parâmetro opcional informa ao + .B rarp +-que classe de entradas devem ser verificadas. O valor default para este parmetro +- ++que classe de entradas devem ser verificadas. O valor default para este parâmetro ++é + .B ether +-(i.e. cdigo de hardware ++(i.e. código de hardware + .B 0x01 + para + .B "IEEE 802.3 10Mbps Ethernet". +@@ -34,31 +34,31 @@ Outros valores podem incluir tecnologias de rede como + e + .B NET/ROM (netrom). + .TP +-.B "\-a [mquina]" +-Mostra as entradas dos mquinas especificadas. Se o +-Mostra as entradas das mquinas especificadas. Se o parmetro +-.B mquina +-no for usado ++.B "\-a [máquina]" ++Mostra as entradas dos máquinas especificadas. Se o ++Mostra as entradas das máquinas especificadas. Se o parâmetro ++.B máquina ++não for usado + .B todas +-as entradas sero mostradas. ++as entradas serão mostradas. + .TP +-.B "\-d mquina" +-Remove a(s) entrada(s) para a mquina especificada. Isto pode ser usado se a +-mquina indicada for desligada, por exemplo. ++.B "\-d máquina" ++Remove a(s) entrada(s) para a máquina especificada. Isto pode ser usado se a ++máquina indicada for desligada, por exemplo. + .TP +-.B "\-s mquina endereo_hardware" +-Cria um mapeamento de endereos RARP para a mquina +-.B mquina +-com endereo de hardware configurado para +-.B endereo_hardware +-. O formato do endereo de hardware depende da classe do hardware, mas +-para a maioria das classes voc pode assumir que a apresentao usual pode +-ser usada. Para a classe Ethernet, so 6 bytes em hexadecimal, separados ++.B "\-s máquina endereço_hardware" ++Cria um mapeamento de endereços RARP para a máquina ++.B máquina ++com endereço de hardware configurado para ++.B endereço_hardware. ++O formato do endereço de hardware depende da classe do hardware, mas ++para a maioria das classes você pode assumir que a apresentação usual pode ++ser usada. Para a classe Ethernet, são 6 bytes em hexadecimal, separados + por dois pontos (:). +-.SH ATENO +-Alguns arquivos (principalmente Suns velhas) assumem que a mquina respondendo +-ao query ARP tambm podem oferecer outros servios de boot remoto. Portanto +-nunca adiciona gratuitamente entradas rarp a menos que deseje encontrar a fria ++.SH ATENÇÃO ++Alguns arquivos (principalmente Suns velhas) assumem que a máquina respondendo ++ao query ARP também podem oferecer outros serviços de boot remoto. Portanto ++nunca adiciona gratuitamente entradas rarp a menos que deseje encontrar a fúria + do administrador da rede. + .SH ARQUIVOS + .I /proc/net/rarp, +@@ -66,5 +66,5 @@ do administrador da rede. + Ross D. Martin, <martin@trcsun3.eas.asu.edu> + .br + Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> +-.SH TRADUO ++.SH TRADUÇÃO + Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 13/04/1998 +diff --git a/man/pt_BR/route.8 b/man/pt_BR/route.8 +index c440974..eb152e2 100644 +--- a/man/pt_BR/route.8 ++++ b/man/pt_BR/route.8 +@@ -50,44 +50,44 @@ If] + .RB [ \--help ] + .SH DESCRICAO + .B Route +-manipula a tabela de roteamento IP do kernel. Seu principal uso +-configurar rotas estticas para hosts ou redes especificadas atravs de +-uma interface, aps a mesma ter sido configurada com o programa ++manipula a tabela de roteamento IP do kernel. Seu principal uso é ++configurar rotas estáticas para hosts ou redes especificadas através de ++uma interface, após a mesma ter sido configurada com o programa + .BR ifconfig (8) + . + +-.SH OPES ++.SH OPÇÕES + .TP + .B \-v +-flag para detalhamento (no usada). ++flag para detalhamento (não usada). + + .TP + .B \-n +-mostra endereos numricos, sem tentar resolver o nomes simblicos das +-mquinas. til se voc esta tentando determinar por que a rota para o seu ++mostra endereços numéricos, sem tentar resolver o nomes simbólicos das ++máquinas. Útil se você esta tentando determinar por que a rota para o seu + servidor de nomes sumiu. + + .TP + .B \-e + use o formato + .BR netstat (8) +-na apresentao da tabela de roteamento. ++na apresentação da tabela de roteamento. + .B \-ee +-produzira uma linha bem grande com todos os parmetros da tabela de roteamento. ++produzira uma linha bem grande com todos os parâmetros da tabela de roteamento. + + .TP + .B \-net + o + .B Alvo +- o endereo de uma rede (encontrado no arquivo ++é o endereço de uma rede (encontrado no arquivo + .I /etc/networks +-pela funo ++pela função + .BR getnetbyname (2) + ). + + .TP + .B -host +- o endereo de uma mquina (descoberto com a funo ++é o endereço de uma máquina (descoberto com a função + .BR gethostbyname (2) + ). + +@@ -110,150 +110,150 @@ adiciona uma rota. + + .TP + .B Alvo +-A mquina ou rede destino. Voc pode fornecer endereos IP em formato +-decimal separado por pontos ou nomes de mquinas/redes. ++A máquina ou rede destino. Você pode fornecer endereços IP em formato ++decimal separado por pontos ou nomes de máquinas/redes. + + .TP + .B netmask Nm + modificador para especificar a mascara de rede da rota a ser adicionada. +-Somente faz sentido para uma rota para uma rede e quanto o endereo ++Somente faz sentido para uma rota para uma rede e quanto o endereço + .B Alvo +- valido com relao a mascara especificada. Se nenhuma mascara de rede ++é valido com relação a mascara especificada. Se nenhuma mascara de rede + for especificada, o comando + .B route +-descobre-a, desta forma, para a maioria das configuraes normais voc no ++descobre-a, desta forma, para a maioria das configurações normais você não + precisa especificar uma mascara de rede. + + .TP + .B gw Gw +-Quaisquer pacotes IP para a rede/mquina destino sero roteadas atravs ++Quaisquer pacotes IP para a rede/máquina destino serão roteadas através + do gateway/roteador especificado. + .B NOTA: +-O gateway especificado deve ser alcanvel antes deste comando. Isto +-normalmente significa que voc ter que configurar uma rota esttica para +-o gateway antes de emitir este comando. Se voc especificar o endereo +-de uma de suas interfaces locais, isto ser usado para decidir sobre +-qual interface deve ser usada para rotear os pacotes. Isto esta disponvel ++O gateway especificado deve ser alcançável antes deste comando. Isto ++normalmente significa que você terá que configurar uma rota estática para ++o gateway antes de emitir este comando. Se você especificar o endereço ++de uma de suas interfaces locais, isto será usado para decidir sobre ++qual interface deve ser usada para rotear os pacotes. Isto esta disponível + para manter compatibilidade com os sistemas baseados em BSD. + + .TP + .B metric M +-Configura o campo de mtrica na tabela de roteamento, usado em daemons +-para roteamento dinmico. ++Configura o campo de métrica na tabela de roteamento, usado em daemons ++para roteamento dinâmico. + + .TP + .B mss M +-Especifica o Tamanho Mximo do Segmento TCP em Bytes (MSS) para conexes +-TCP atravs desta rota. Isto normalmente usado somente para otimizao +-fina de configuraes de roteamento. ++Especifica o Tamanho Máximo do Segmento TCP em Bytes (MSS) para conexões ++TCP através desta rota. Isto é normalmente usado somente para otimização ++fina de configurações de roteamento. + + .TP + .B window W +-Especifica o tamanho da janela TCP para conexes TCP atravs desta rota. ++Especifica o tamanho da janela TCP para conexões TCP através desta rota. + Tipicamente somente usado para redes AX.25 e em drivers incapazes de + de tratar frames back to back. + + .TP + .B irtt I +-Especifica o tempo de ida e volta inicial (irtt) para conexes TCP atravs +-desta rota. Tipicamente usado somente em redes AX.25. O numero especificado +-em milisegundos (1-12000). Se omitido o default da RFC 1122 de 300ms usado. ++Especifica o tempo de ida e volta inicial (irtt) para conexões TCP através ++desta rota. Tipicamente usado somente em redes AX.25. O numero é especificado ++em milisegundos (1-12000). Se omitido o default da RFC 1122 de 300ms é usado. + + .TP + .B reject +-Instala uma rota de bloqueio, que forar falha na procura por esta rota. +-Exemplo de utilizao: bloquear rotas antes do uso da rota default. +-Isto no firewalling. ++Instala uma rota de bloqueio, que forçará falha na procura por esta rota. ++Exemplo de utilização: bloquear rotas antes do uso da rota default. ++Isto não é firewalling. + + .TP + .B mod, dyn, reinstate +-Instala uma rota modificada ou dinmica. Ambas as flags so geralmente somente +-configuradas por um daemon de roteamento. Somente para propsitos de diagnostico. ++Instala uma rota modificada ou dinâmica. Ambas as flags são geralmente somente ++configuradas por um daemon de roteamento. Somente para propósitos de diagnostico. + + .TP + .B dev If +-Fora a associao da rota com o dispositivo especificado, pois o kernel +-de outra forma tentara determinar o dispositivo por conta prpria +-(atravs da checagem de rotas e especificaes de dispositivos j existentes ++Força a associação da rota com o dispositivo especificado, pois o kernel ++de outra forma tentara determinar o dispositivo por conta própria ++(através da checagem de rotas e especificações de dispositivos já existentes + e onde a rota esta adicionada). + + If + .B dev If +- a ltima opo na linha de comando, a palavra ++é a última opção na linha de comando, a palavra + .B dev +-pode ser omitida, pois o default. De outra forma a ordem dos outros +-modificadores do route (metric - netmask - gw - dev) no importa. ++pode ser omitida, pois é o default. De outra forma a ordem dos outros ++modificadores do route (metric - netmask - gw - dev) não importa. + + .SH EXEMPLOS + .TP + .B route add -net 127.0.0.0 + Adiciona a entrada para a interface loopback normal, usando mascara igual +-a 255.0.0.0 (rede classe A, determinada a partir do endereo de destino), ++a 255.0.0.0 (rede classe A, determinada a partir do endereço de destino), + associada ao dispositivo "lo" (assumindo que este dispositivo tenha sido + previamente configurado com o + .BR ifconfig (8)). + + .TP + .B route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 +-Adiciona uma rota para a rede 192.56.76.x atravs da interface "eth0". O +-modificador de mascara classe C no realmente necessrio aqui por que +-192.* um endereo IP de classe C. A palavra "dev" pode ser omitida aqui. ++Adiciona uma rota para a rede 192.56.76.x através da interface "eth0". O ++modificador de mascara classe C não é realmente necessário aqui por que ++192.* é um endereço IP de classe C. A palavra "dev" pode ser omitida aqui. + + .TP + .B route add default gw mango-gw +-Adiciona uma rota default (que ser usada se nenhuma outra rota for encontrada). +-Todos os pacotes que usarem esta rota sero passados para a mquina "mango-gw". +-O dispositivo que ser utilizado para esta rota depende de como possvel +-alcanar "mango-gw" - a rota esttica para "mango-gw" ter que ser configurada ++Adiciona uma rota default (que será usada se nenhuma outra rota for encontrada). ++Todos os pacotes que usarem esta rota serão passados para a máquina "mango-gw". ++O dispositivo que será utilizado para esta rota depende de como é possível ++alcançar "mango-gw" - a rota estática para "mango-gw" terá que ser configurada + previamente. + + .TP + .B route add ipx4 sl0 +-Adiciona uma rota para a mquina "ipx4" atravs da interface SLIP (assumindo +-que "ipx4" a mquina SLIP). ++Adiciona uma rota para a máquina "ipx4" através da interface SLIP (assumindo ++que "ipx4" é a máquina SLIP). + + .TP + .B route add -net 192.57.66.0 netmask 255.255.255.0 gw ipx4 +-Este comando adiciona a rede "192.57.66.x" para ser alcanada atravs da +-rota anterior atravs da interface SLIP. ++Este comando adiciona a rede "192.57.66.x" para ser alcançada através da ++rota anterior através da interface SLIP. + + .TP + .B route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 +-Isto bem obscura, documentada para que as pessoas saibam como us-la. +-Configura para que todas as rotas IP classe D (multicast) vo atravs da +-interface "eth0". Esta a linha de configurao normal a ser usada com ++Isto é bem obscura, documentada para que as pessoas saibam como usá-la. ++Configura para que todas as rotas IP classe D (multicast) vão através da ++interface "eth0". Esta é a linha de configuração normal a ser usada com + um kernel multicast. + + .TP + .B route add 10.0.0.0 netmask 255.0.0.0 reject +-Esta instala uma rota de rejeio para a rede privada "10.x.x.x" ++Esta instala uma rota de rejeição para a rede privada "10.x.x.x" + + .LP +-.SH SADA +-A sada da tabela de roteamento do kernel organizada nas seguintes colunas ++.SH SAÍDA ++A saída da tabela de roteamento do kernel é organizada nas seguintes colunas + .TP + .B Destino +-A rede ou mquina de destino. ++A rede ou máquina de destino. + .TP + .B Roteador +-A mquina roteador ou '*' se nenhuma estiver configurada. ++A máquina roteador ou '*' se nenhuma estiver configurada. + .TP +-.B Mascara Genrica +-A mascara para a rede destino. '255.255.255.255' para uma mquina de destino, +-'0.0.0.0' para a rota ++.B Mascara Genérica ++A mascara para a rede destino. '255.255.255.255' para uma máquina de ++destino, '0.0.0.0' para a rota + .B default + . + .TP + .B Flags +-Os flags possveis so ++Os flags possíveis são + .br + .B U + (rota esta + .BR Up ) + .br + .B H +-(alvo uma +-.BR mquina ) ++(alvo é uma ++.BR máquina ) + .br + .B G + (use +@@ -261,7 +261,7 @@ Os flags poss + .br + .B R + .RB ( reinstate +-rota para roteamento dinmico) ++rota para roteamento dinâmico) + .br + .B D + Instalada +@@ -278,29 +278,29 @@ Rota + ) + .TP + .B Metric +-A 'distncia' at o alvo (geralmente contada em hops). No utilizada pelos ++A 'distância' até o alvo (geralmente contada em hops). Não é utilizada pelos + kernels recentes, somente daemons de roteamento podem usa-la. + .TP + .B Ref +-Numero de referncias a esta rota. No usado no kernel do Linux, sempre 0. ++Numero de referências a esta rota. Não usado no kernel do Linux, sempre 0. + .TP + .B Uso +-Contagem de procuras por esta rota. Nos kernels recentes estes nmeros so +-bem baixos, pois os sockets tem seu prprio cache e no precisam procurar ++Contagem de procuras por esta rota. Nos kernels recentes estes números são ++bem baixos, pois os sockets tem seu próprio cache e não precisam procurar + por rotas. + .TP + .B Iface +-Interface atravs da qual os pacotes IP sero enviados. ++Interface através da qual os pacotes IP serão enviados. + .TP + .B MSS +-Tamanho mximo de segmento default para conexes TCP atravs desta rota. ++Tamanho máximo de segmento default para conexões TCP através desta rota. + .TP + .B Window +-Tamanho de janela default para conexes TCP atravs desta rota. ++Tamanho de janela default para conexões TCP através desta rota. + .TP + .B irtt + RTT (Tempo de Ida e Volta) Inicial. O kernel usa isto para inferir os melhores +-parmetros do protocolo TCP sem esperar por respostas (possivelmente lentas). ++parâmetros do protocolo TCP sem esperar por respostas (possivelmente lentas). + .LP + .SH ARQUIVOS + .I /proc/net/route +@@ -311,17 +311,17 @@ par + .br + .I /etc/init.d/network + .LP +-.SH VEJA TAMBM ++.SH VEJA TAMBÉM + .I ifconfig(8), netstat(8), arp(8) + .LP +-.SH HISTRICO ++.SH HISTÓRICO + .B Route + para o linux foi originalmente escrito por Fred N. van Kempen, + <waltje@uwalt.nl.mugnet.org> e depois modificado por Johannes Stille e +-Linus Torvalds para a verso pl15. Alan Cox adicionou as opes para ++Linus Torvalds para a versão pl15. Alan Cox adicionou as opções para + mss e window no kernel 1.1.22. O suporte a irtt (compartilhado com o + netstat) foi feito por Bernd Eckenfels. +-.SH TRADUO ++.SH TRADUÇÃO + Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 13/04/1998 + .SH BUGS + nenhum :) +diff --git a/mii-tool.c b/mii-tool.c +index ef2d48a..1cfecc2 100644 +--- a/mii-tool.c ++++ b/mii-tool.c +@@ -29,8 +29,6 @@ + http://www.national.com/pf/DP/DP83840.html + */ + +-static char version[] = +-"mii-tool.c 1.9 2000/04/28 00:56:08 (David Hinds)\n"; + + #include <unistd.h> + #include <stdlib.h> +@@ -46,16 +44,25 @@ static char version[] = + #include <sys/socket.h> + #include <sys/ioctl.h> + #include <net/if.h> ++#include <linux/sockios.h> ++ + #ifndef __GLIBC__ + #include <linux/if_arp.h> + #include <linux/if_ether.h> + #endif +-#include "mii.h" ++#include <linux/mii.h> ++#include <linux/sockios.h> ++#include "version.h" ++#include "net-support.h" ++#include "util.h" ++ ++static char *Release = RELEASE, *Signature = "David Hinds based on Donald Becker's mii-diag"; + + #define MAX_ETH 8 /* Maximum # of interfaces */ ++#define LPA_ABILITY_MASK 0x07e0 + + /* Table of known MII's */ +-static struct { ++static const struct { + u_short id1, id2; + char *name; + } mii_id[] = { +@@ -64,16 +71,25 @@ static struct { + { 0x0000, 0x6b90, "AMD 79C901A HomePNA" }, + { 0x0000, 0x6b70, "AMD 79C901A 10baseT" }, + { 0x0181, 0xb800, "Davicom DM9101" }, +- { 0x0043, 0x7411, "Enable EL40-331" }, ++ { 0x0043, 0x7410, "Enable EL40-331" }, ++ { 0x0243, 0x0c50, "ICPlus IP101A" }, + { 0x0015, 0xf410, "ICS 1889" }, + { 0x0015, 0xf420, "ICS 1890" }, + { 0x0015, 0xf430, "ICS 1892" }, + { 0x02a8, 0x0150, "Intel 82555" }, + { 0x7810, 0x0000, "Level One LXT970/971" }, ++ { 0x0022, 0x1510, "Micrel KSZ8041" }, ++ { 0x0022, 0x1610, "Micrel KSZ9021" }, + { 0x2000, 0x5c00, "National DP83840A" }, ++ { 0x2000, 0x5c70, "National DP83865" }, + { 0x0181, 0x4410, "Quality QS6612" }, + { 0x0282, 0x1c50, "SMSC 83C180" }, ++ { 0x0203, 0x8460, "STMicroelectronics ST802RT" }, ++ { 0x1c04, 0x0010, "STMicroelectronics STE100P" }, + { 0x0300, 0xe540, "TDK 78Q2120" }, ++ { 0x0141, 0x0c20, "Yukon 88E1011" }, ++ { 0x0141, 0x0cc0, "Yukon-EC 88E1111" }, ++ { 0x0141, 0x0c90, "Yukon-2 88E1112" }, + }; + #define NMII (sizeof(mii_id)/sizeof(mii_id[0])) + +@@ -81,10 +97,10 @@ static struct { + + struct option longopts[] = { + /* { name has_arg *flag val } */ +- {"advertise", 1, 0, 'A'}, /* Change capabilities advertised. */ +- {"force", 1, 0, 'F'}, /* Change capabilities advertised. */ ++ {"advertise", 1, 0, 'A'}, /* Advertise only specified media. */ ++ {"force", 1, 0, 'F'}, /* Force specified media technology. */ + {"phy", 1, 0, 'p'}, /* Set PHY (MII address) to report. */ +- {"log", 0, 0, 'l'}, /* Set PHY (MII address) to report. */ ++ {"log", 0, 0, 'l'}, /* With --watch, write events to syslog. */ + {"restart", 0, 0, 'r'}, /* Restart link negotiation */ + {"reset", 0, 0, 'R'}, /* Reset the transceiver. */ + {"verbose", 0, 0, 'v'}, /* Report each action taken. */ +@@ -112,7 +128,7 @@ static struct ifreq ifr; + + static int mdio_read(int skfd, int location) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + mii->reg_num = location; + if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) { + fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, +@@ -124,7 +140,7 @@ static int mdio_read(int skfd, int location) + + static void mdio_write(int skfd, int location, int value) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + mii->reg_num = location; + mii->val_in = value; + if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) { +@@ -137,40 +153,48 @@ static void mdio_write(int skfd, int location, int value) + + const struct { + char *name; +- u_short value; ++ u_short value[2]; + } media[] = { + /* The order through 100baseT4 matches bits in the BMSR */ +- { "10baseT-HD", MII_AN_10BASET_HD }, +- { "10baseT-FD", MII_AN_10BASET_FD }, +- { "100baseTx-HD", MII_AN_100BASETX_HD }, +- { "100baseTx-FD", MII_AN_100BASETX_FD }, +- { "100baseT4", MII_AN_100BASET4 }, +- { "100baseTx", MII_AN_100BASETX_FD | MII_AN_100BASETX_HD }, +- { "10baseT", MII_AN_10BASET_FD | MII_AN_10BASET_HD }, ++ { "10baseT-HD", {LPA_10HALF} }, ++ { "10baseT-FD", {LPA_10FULL} }, ++ { "100baseTx-HD", {LPA_100HALF} }, ++ { "100baseTx-FD", {LPA_100FULL} }, ++ { "100baseT4", {LPA_100BASE4} }, ++ { "100baseTx", {LPA_100FULL | LPA_100HALF} }, ++ { "10baseT", {LPA_10FULL | LPA_10HALF} }, ++ ++ { "1000baseT-HD", {0, ADVERTISE_1000HALF} }, ++ { "1000baseT-FD", {0, ADVERTISE_1000FULL} }, ++ { "1000baseT", {0, ADVERTISE_1000HALF|ADVERTISE_1000FULL} }, + }; + #define NMEDIA (sizeof(media)/sizeof(media[0])) +- ++ + /* Parse an argument list of media types */ +-static int parse_media(char *arg) ++static int parse_media(char *arg, unsigned *bmcr2) + { + int mask, i; + char *s; + mask = strtoul(arg, &s, 16); + if ((*arg != '\0') && (*s == '\0')) { +- if ((mask & MII_AN_ABILITY_MASK) && +- !(mask & ~MII_AN_ABILITY_MASK)) +- return mask; ++ if ((mask & LPA_ABILITY_MASK) && ++ !(mask & ~LPA_ABILITY_MASK)) { ++ *bmcr2 = 0; ++ return mask; ++ } + goto failed; +- } else { +- mask = 0; +- s = strtok(arg, ", "); +- do { ++ } ++ mask = 0; ++ *bmcr2 = 0; ++ s = strtok(arg, ", "); ++ do { + for (i = 0; i < NMEDIA; i++) +- if (strcasecmp(media[i].name, s) == 0) break; ++ if (s && strcasecmp(media[i].name, s) == 0) break; + if (i == NMEDIA) goto failed; +- mask |= media[i].value; +- } while ((s = strtok(NULL, ", ")) != NULL); +- } ++ mask |= media[i].value[0]; ++ *bmcr2 |= media[i].value[1]; ++ } while ((s = strtok(NULL, ", ")) != NULL); ++ + return mask; + failed: + fprintf(stderr, "Invalid media specification '%s'.\n", arg); +@@ -179,11 +203,25 @@ failed: + + /*--------------------------------------------------------------------*/ + +-static char *media_list(int mask, int best) ++static const char *media_list(unsigned mask, unsigned mask2, int best) + { + static char buf[100]; + int i; + *buf = '\0'; ++ ++ if (mask & BMCR_SPEED1000) { ++ if (mask2 & ADVERTISE_1000HALF) { ++ strcat(buf, " "); ++ strcat(buf, "1000baseT-HD"); ++ if (best) goto out; ++ } ++ if (mask2 & ADVERTISE_1000FULL) { ++ strcat(buf, " "); ++ strcat(buf, "1000baseT-FD"); ++ if (best) goto out; ++ } ++ } ++ + mask >>= 5; + for (i = 4; i >= 0; i--) { + if (mask & (1<<i)) { +@@ -192,6 +230,7 @@ static char *media_list(int mask, int best) + if (best) break; + } + } ++ out: + if (mask & (1<<5)) + strcat(buf, " flow-control"); + return buf; +@@ -199,49 +238,82 @@ static char *media_list(int mask, int best) + + int show_basic_mii(int sock, int phy_id) + { +- char buf[100]; ++ char buf[200]; + int i, mii_val[32]; +- int bmcr, bmsr, advert, lkpar; ++ unsigned bmcr, bmsr, advert, lkpar, bmcr2, lpa2; + + /* Some bits in the BMSR are latched, but we can't rely on being + the only reader, so only the current values are meaningful */ + mdio_read(sock, MII_BMSR); +- for (i = 0; i < ((verbose > 1) ? 32 : 8); i++) +- mii_val[i] = mdio_read(sock, i); ++ for (i = 0; i < ((verbose > 1) ? 32 : (MII_STAT1000+1)); i++) ++ switch (i & 0x1F) { ++ case MII_BMCR: ++ case MII_BMSR: ++ case MII_PHYSID1: ++ case MII_PHYSID2: ++ case MII_ADVERTISE: ++ case MII_LPA: ++ case MII_EXPANSION: ++ case MII_CTRL1000: ++ case MII_STAT1000: ++ case MII_ESTATUS: ++ case MII_DCOUNTER: ++ case MII_FCSCOUNTER: ++ case MII_NWAYTEST: ++ case MII_RERRCOUNTER: ++ case MII_SREVISION: ++ case MII_RESV1: ++ case MII_LBRERROR: ++ case MII_PHYADDR: ++ case MII_RESV2: ++ case MII_TPISTATUS: ++ case MII_NCONFIG: ++ mii_val[i] = mdio_read(sock, i); ++ break; ++ default: ++ if (verbose > 2) ++ mii_val[i] = mdio_read(sock, i); ++ else ++ mii_val[i] = 0; ++ break; ++ } + +- if (mii_val[MII_BMCR] == 0xffff) { ++ if (mii_val[MII_BMCR] == 0xffff || mii_val[MII_BMSR] == 0x0000) { + fprintf(stderr, " No MII transceiver present!.\n"); + return -1; + } + + /* Descriptive rename. */ + bmcr = mii_val[MII_BMCR]; bmsr = mii_val[MII_BMSR]; +- advert = mii_val[MII_ANAR]; lkpar = mii_val[MII_ANLPAR]; ++ advert = mii_val[MII_ADVERTISE]; lkpar = mii_val[MII_LPA]; ++ bmcr2 = mii_val[MII_CTRL1000]; lpa2 = mii_val[MII_STAT1000]; + + sprintf(buf, "%s: ", ifr.ifr_name); +- if (bmcr & MII_BMCR_AN_ENA) { +- if (bmsr & MII_BMSR_AN_COMPLETE) { ++ if (bmcr & BMCR_ANENABLE) { ++ if (bmsr & BMSR_ANEGCOMPLETE) { + if (advert & lkpar) { +- strcat(buf, (lkpar & MII_AN_ACK) ? ++ strcat(buf, (lkpar & LPA_LPACK) ? + "negotiated" : "no autonegotiation,"); +- strcat(buf, media_list(advert & lkpar, 1)); ++ strcat(buf, media_list(advert & lkpar, bmcr2 & lpa2>>2, 1)); + strcat(buf, ", "); + } else { + strcat(buf, "autonegotiation failed, "); + } +- } else if (bmcr & MII_BMCR_RESTART) { ++ } else if (bmcr & BMCR_ANRESTART) { + strcat(buf, "autonegotiation restarted, "); + } + } else { + sprintf(buf+strlen(buf), "%s Mbit, %s duplex, ", +- (bmcr & MII_BMCR_100MBIT) ? "100" : "10", +- (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); ++ ((bmcr2 & (ADVERTISE_1000HALF | ADVERTISE_1000FULL)) & lpa2 >> 2) ++ ? "1000" ++ : (bmcr & BMCR_SPEED100) ? "100" : "10", ++ (bmcr & BMCR_FULLDPLX) ? "full" : "half"); + } +- strcat(buf, (bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); ++ strcat(buf, (bmsr & BMSR_LSTATUS) ? "link ok" : "no link"); + + if (opt_watch) { + if (opt_log) { +- syslog(LOG_INFO, buf); ++ syslog(LOG_INFO, "%s", buf); + } else { + char s[20]; + time_t t = time(NULL); +@@ -273,35 +345,36 @@ int show_basic_mii(int sock, int phy_id) + ((mii_val[2]<<6)|(mii_val[3]>>10))&0xff, + (mii_val[3]>>4)&0x3f, mii_val[3]&0x0f); + printf(" basic mode: "); +- if (bmcr & MII_BMCR_RESET) ++ if (bmcr & BMCR_RESET) + printf("software reset, "); +- if (bmcr & MII_BMCR_LOOPBACK) ++ if (bmcr & BMCR_LOOPBACK) + printf("loopback, "); +- if (bmcr & MII_BMCR_ISOLATE) ++ if (bmcr & BMCR_ISOLATE) + printf("isolate, "); +- if (bmcr & MII_BMCR_COLTEST) ++ if (bmcr & BMCR_CTST) + printf("collision test, "); +- if (bmcr & MII_BMCR_AN_ENA) { ++ if (bmcr & BMCR_ANENABLE) { + printf("autonegotiation enabled\n"); + } else { + printf("%s Mbit, %s duplex\n", +- (bmcr & MII_BMCR_100MBIT) ? "100" : "10", +- (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); ++ (bmcr & BMCR_SPEED100) ? "100" : "10", ++ (bmcr & BMCR_FULLDPLX) ? "full" : "half"); + } + printf(" basic status: "); +- if (bmsr & MII_BMSR_AN_COMPLETE) ++ if (bmsr & BMSR_ANEGCOMPLETE) + printf("autonegotiation complete, "); +- else if (bmcr & MII_BMCR_RESTART) ++ else if (bmcr & BMCR_ANRESTART) + printf("autonegotiation restarted, "); +- if (bmsr & MII_BMSR_REMOTE_FAULT) ++ if (bmsr & BMSR_RFAULT) + printf("remote fault, "); +- printf((bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); +- printf("\n capabilities:%s", media_list(bmsr >> 6, 0)); +- printf("\n advertising: %s", media_list(advert, 0)); +- if (lkpar & MII_AN_ABILITY_MASK) +- printf("\n link partner:%s", media_list(lkpar, 0)); ++ printf((bmsr & BMSR_LSTATUS) ? "link ok" : "no link"); ++ printf("\n capabilities:%s", media_list(bmsr >> 6, bmcr2, 0)); ++ printf("\n advertising: %s", media_list(advert, bmcr2, 0)); ++ if (lkpar & LPA_ABILITY_MASK) ++ printf("\n link partner:%s", media_list(lkpar, lpa2 >> 2, 0)); + printf("\n"); + } ++ fflush(stdout); + return 0; + } + +@@ -309,10 +382,10 @@ int show_basic_mii(int sock, int phy_id) + + static int do_one_xcvr(int skfd, char *ifname, int maybe) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + + /* Get the vitals from the interface. */ +- strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ++ safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) { + if (!maybe || (errno != ENODEV)) + fprintf(stderr, "SIOCGMIIPHY on '%s' failed: %s\n", +@@ -327,23 +400,23 @@ static int do_one_xcvr(int skfd, char *ifname, int maybe) + + if (opt_reset) { + printf("resetting the transceiver...\n"); +- mdio_write(skfd, MII_BMCR, MII_BMCR_RESET); ++ mdio_write(skfd, MII_BMCR, BMCR_RESET); + } +- if (nway_advertise) { +- mdio_write(skfd, MII_ANAR, nway_advertise | 1); ++ if (nway_advertise > 0) { ++ mdio_write(skfd, MII_ADVERTISE, nway_advertise | 1); + opt_restart = 1; + } + if (opt_restart) { + printf("restarting autonegotiation...\n"); + mdio_write(skfd, MII_BMCR, 0x0000); +- mdio_write(skfd, MII_BMCR, MII_BMCR_AN_ENA|MII_BMCR_RESTART); ++ mdio_write(skfd, MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART); + } + if (fixed_speed) { + int bmcr = 0; +- if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_100BASETX_HD)) +- bmcr |= MII_BMCR_100MBIT; +- if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_10BASET_FD)) +- bmcr |= MII_BMCR_DUPLEX; ++ if (fixed_speed & (LPA_100FULL|LPA_100HALF)) ++ bmcr |= BMCR_SPEED100; ++ if (fixed_speed & (LPA_100FULL|LPA_10FULL)) ++ bmcr |= BMCR_FULLDPLX; + mdio_write(skfd, MII_BMCR, bmcr); + } + +@@ -357,12 +430,12 @@ static int do_one_xcvr(int skfd, char *ifname, int maybe) + + static void watch_one_xcvr(int skfd, char *ifname, int index) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + static int status[MAX_ETH] = { 0, /* ... */ }; + int now; + + /* Get the vitals from the interface. */ +- strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ++ safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) { + if (errno != ENODEV) + fprintf(stderr, "SIOCGMIIPHY on '%s' failed: %s\n", +@@ -379,27 +452,38 @@ static void watch_one_xcvr(int skfd, char *ifname, int index) + /*--------------------------------------------------------------------*/ + + const char *usage = +-"usage: %s [-VvRrwl] [-A media,... | -F media] [interface ...] +- -V, --version display version information +- -v, --verbose more verbose output +- -R, --reset reset MII to poweron state +- -r, --restart restart autonegotiation +- -w, --watch monitor for link status changes +- -l, --log with -w, write events to syslog +- -A, --advertise=media,... advertise only specified media +- -F, --force=media force specified media technology +-media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD, +- (to advertise both HD and FD) 100baseTx, 10baseT\n"; ++"usage: %s [-VvRrwl] [-A media,... | -F media] [-p addr] <interface ...>\n" ++" -V, --version display version information\n" ++" -v, --verbose more verbose output\n" ++" -R, --reset reset MII to poweron state\n" ++" -r, --restart restart autonegotiation\n" ++" -w, --watch monitor for link status changes\n" ++" -l, --log with -w, write events to syslog\n" ++" -A, --advertise=media,... advertise only specified media\n" ++" -F, --force=media force specified media technology\n" ++" -p, --phy=addr set PHY (MII address) to report\n" ++"media: 1000baseTx-HD, 1000baseTx-FD,\n" ++" 100baseT4, 100baseTx-FD, 100baseTx-HD,\n" ++" 10baseT-FD, 10baseT-HD,\n" ++" (to advertise both HD and FD) 1000baseTx, 100baseTx, 10baseT\n"; ++ ++ ++static void version(void) ++{ ++ fprintf(stderr, "%s\n%s\n", Release, Signature); ++ exit(E_VERSION); ++} ++ + + int main(int argc, char **argv) + { + int i, c, ret, errflag = 0; +- char s[6]; +- ++ unsigned ctrl1000 = 0; ++ + while ((c = getopt_long(argc, argv, "A:F:p:lrRvVw?", longopts, 0)) != EOF) + switch (c) { +- case 'A': nway_advertise = parse_media(optarg); break; +- case 'F': fixed_speed = parse_media(optarg); break; ++ case 'A': nway_advertise = parse_media(optarg, &ctrl1000); break; ++ case 'F': fixed_speed = parse_media(optarg, &ctrl1000); break; + case 'p': override_phy = atoi(optarg); break; + case 'r': opt_restart++; break; + case 'R': opt_reset++; break; +@@ -411,6 +495,10 @@ int main(int argc, char **argv) + } + /* Check for a few inappropriate option combinations */ + if (opt_watch) verbose = 0; ++ ++ if ((nway_advertise < 0) || (fixed_speed < 0)) ++ return 2; ++ + if (errflag || (fixed_speed & (fixed_speed-1)) || + (fixed_speed && (opt_restart || nway_advertise))) { + fprintf(stderr, usage, argv[0]); +@@ -418,7 +506,7 @@ int main(int argc, char **argv) + } + + if (opt_version) +- printf(version); ++ version(); + + /* Open a basic socket. */ + if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { +@@ -426,15 +514,15 @@ int main(int argc, char **argv) + exit(-1); + } + ++ if (verbose > 1) ++ printf("Using SIOCGMIIPHY=0x%x\n", SIOCGMIIPHY); ++ + /* No remaining args means show all interfaces. */ + if (optind == argc) { +- ret = 1; +- for (i = 0; i < MAX_ETH; i++) { +- sprintf(s, "eth%d", i); +- ret &= do_one_xcvr(skfd, s, 1); +- } +- if (ret) +- fprintf(stderr, "no MII interfaces found\n"); ++ fprintf(stderr, "No interface specified\n"); ++ fprintf(stderr, usage, argv[0]); ++ close(skfd); ++ return 2; + } else { + ret = 0; + for (i = optind; i < argc; i++) { +@@ -445,15 +533,8 @@ int main(int argc, char **argv) + if (opt_watch && (ret == 0)) { + while (1) { + sleep(1); +- if (optind == argc) { +- for (i = 0; i < MAX_ETH; i++) { +- sprintf(s, "eth%d", i); +- watch_one_xcvr(skfd, s, i); +- } +- } else { +- for (i = optind; i < argc; i++) ++ for (i = optind; i < argc; i++) + watch_one_xcvr(skfd, argv[i], i-optind); +- } + } + } + +diff --git a/nameif.c b/nameif.c +index 8d79b50..b280e59 100644 +--- a/nameif.c ++++ b/nameif.c +@@ -1,11 +1,11 @@ +-/* ++/* + * Name Interfaces based on MAC address. + * Writen 2000 by Andi Kleen. +- * Subject to the Gnu Public License, version 2. ++ * Subject to the Gnu Public License, version 2. + * TODO: make it support token ring etc. +- * $Id: nameif.c,v 1.1 2000/10/18 17:26:29 ak Exp $ +- */ +-#ifndef _GNU_SOURCE ++ * $Id: nameif.c,v 1.4 2003/09/11 03:46:49 ak Exp $ ++ */ ++#ifndef _GNU_SOURCE + #define _GNU_SOURCE + #endif + #include <stdio.h> +@@ -21,73 +21,68 @@ + #include <net/if.h> + #include <linux/sockios.h> + #include <errno.h> +-#include "intl.h" +- +-const char default_conf[] = "/etc/mactab"; +-const char *fname = default_conf; +-int use_syslog; +-int ctl_sk = -1; +- +-void err(char *msg) +-{ +- if (use_syslog) { +- syslog(LOG_ERR,"%s: %m", msg); +- } else { +- perror(msg); +- } +- exit(1); ++#include "intl.h" ++#include "net-support.h" ++#include "util.h" ++ ++const char default_conf[] = "/etc/mactab"; ++const char *fname = default_conf; ++int use_syslog; ++int ctl_sk = -1; ++ ++void err(char *msg) ++{ ++ if (use_syslog) { ++ syslog(LOG_ERR,"%s: %m", msg); ++ } else { ++ perror(msg); ++ } ++ exit(1); + } + +-void complain(char *fmt, ...) +-{ ++void complain(char *fmt, ...) ++{ + va_list ap; + va_start(ap,fmt); +- if (use_syslog) { ++ if (use_syslog) { + vsyslog(LOG_ERR,fmt,ap); + } else { + vfprintf(stderr,fmt,ap); +- fputc('\n',stderr); ++ fputc('\n',stderr); + } +- va_end(ap); ++ va_end(ap); + exit(1); +-} ++} + +-void warning(char *fmt, ...) +-{ ++void warning(char *fmt, ...) ++{ + va_list ap; + va_start(ap,fmt); +- if (use_syslog) { ++ if (use_syslog) { + vsyslog(LOG_ERR,fmt,ap); + } else { + vfprintf(stderr,fmt,ap); +- fputc('\n',stderr); ++ fputc('\n',stderr); + } +- va_end(ap); +-} ++ va_end(ap); ++} + + int parsemac(char *str, unsigned char *mac) +-{ +- char *s; +- while ((s = strsep(&str, ":")) != NULL) { ++{ ++ char *s; ++ while ((s = strsep(&str, ":")) != NULL) { + unsigned byte; +- if (sscanf(s,"%x", &byte)!=1 || byte > 0xff) ++ if (sscanf(s,"%x", &byte)!=1 || byte > 0xff) + return -1; +- *mac++ = byte; +- } ++ *mac++ = byte; ++ } + return 0; +-} +- +-void *xmalloc(unsigned sz) +-{ +- void *p = calloc(sz,1); +- if (!p) errno=ENOMEM, err("xmalloc"); +- return p; +-} ++} + + void opensock(void) + { +- if (ctl_sk < 0) +- ctl_sk = socket(PF_INET,SOCK_DGRAM,0); ++ if (ctl_sk < 0) ++ ctl_sk = socket(PF_INET,SOCK_DGRAM,0); + } + + #ifndef ifr_newname +@@ -97,10 +92,10 @@ void opensock(void) + int setname(char *oldname, char *newname) + { + struct ifreq ifr; +- opensock(); ++ opensock(); + memset(&ifr,0,sizeof(struct ifreq)); +- strcpy(ifr.ifr_name, oldname); +- strcpy(ifr.ifr_newname, newname); ++ safe_strncpy(ifr.ifr_name, oldname, IFNAMSIZ); ++ safe_strncpy(ifr.ifr_newname, newname, IFNAMSIZ); + return ioctl(ctl_sk, SIOCSIFNAME, &ifr); + } + +@@ -108,118 +103,118 @@ int getmac(char *name, unsigned char *mac) + { + int r; + struct ifreq ifr; +- opensock(); ++ opensock(); + memset(&ifr,0,sizeof(struct ifreq)); +- strcpy(ifr.ifr_name, name); ++ safe_strncpy(ifr.ifr_name, name, IFNAMSIZ); + r = ioctl(ctl_sk, SIOCGIFHWADDR, &ifr); +- memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); +- return r; ++ memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); ++ return r; + } + +-struct change { +- struct change *next,**pprev; ++struct change { ++ struct change *next; ++ int found; + char ifname[IFNAMSIZ+1]; + unsigned char mac[6]; +-}; ++}; + struct change *clist; + +-struct change *lookupmac(unsigned char *mac) +-{ ++struct change *lookupmac(unsigned char *mac) ++{ + struct change *ch; +- for (ch = clist;ch;ch = ch->next) ++ for (ch = clist;ch;ch = ch->next) + if (!memcmp(ch->mac, mac, 6)) + return ch; +- return NULL; +-} ++ return NULL; ++} + + int addchange(char *p, struct change *ch, char *pos) + { + if (strchr(ch->ifname, ':')) +- warning(_("alias device %s at %s probably has no mac"), +- ch->ifname, pos); +- if (parsemac(p,ch->mac) < 0) +- complain(_("cannot parse MAC `%s' at %s"), p, pos); +- if (clist) +- clist->pprev = &ch->next; ++ warning(_("alias device %s at %s probably has no mac"), ++ ch->ifname, pos); ++ if (parsemac(p,ch->mac) < 0) ++ complain(_("cannot parse MAC `%s' at %s"), p, pos); + ch->next = clist; +- ch->pprev = &clist; + clist = ch; +- return 0; ++ return 0; + } + + void readconf(void) + { +- char *line; +- size_t linel; +- int linenum; ++ char *line; ++ size_t linel; ++ int linenum; + FILE *ifh; + char *p; + int n; ++ struct change *ch = NULL; + + ifh = fopen(fname, "r"); +- if (!ifh) +- complain(_("opening configuration file %s: %s"),fname,strerror(errno)); ++ if (!ifh) ++ complain(_("opening configuration file %s: %s"),fname,strerror(errno)); + +- line = NULL; ++ line = NULL; + linel = 0; +- linenum = 1; ++ linenum = 1; + while (getdelim(&line, &linel, '\n', ifh) > 0) { +- struct change *ch = xmalloc(sizeof(struct change)); +- char pos[20]; ++ char pos[20]; + +- sprintf(pos, _("line %d"), linenum); ++ sprintf(pos, _("line %d"), linenum); + + if ((p = strchr(line,'#')) != NULL) + *p = '\0'; +- p = line; ++ p = line; + while (isspace(*p)) +- ++p; ++ ++p; + if (*p == '\0') +- continue; +- n = strcspn(p, " \t"); +- if (n > IFNAMSIZ) +- complain(_("interface name too long at line %d"), line); +- memcpy(ch->ifname, p, n); +- ch->ifname[n] = 0; +- p += n; +- p += strspn(p, " \t"); +- n = strspn(p, "0123456789ABCDEFabcdef:"); +- p[n] = 0; ++ continue; ++ n = strcspn(p, " \t"); ++ if (n > IFNAMSIZ-1) ++ complain(_("interface name too long at line %d"), line); ++ ch = xmalloc(sizeof(struct change)); ++ memcpy(ch->ifname, p, n); ++ ch->ifname[n] = 0; ++ p += n; ++ p += strspn(p, " \t"); ++ n = strspn(p, "0123456789ABCDEFabcdef:"); ++ p[n] = 0; + addchange(p, ch, pos); + linenum++; +- } +- fclose(ifh); ++ } ++ fclose(ifh); + } + +-struct option lopt[] = { ++struct option lopt[] = { + {"syslog", 0, NULL, 's' }, + {"config-file", 1, NULL, 'c' }, +- {"help", 0, NULL, '?' }, +- {NULL}, +-}; ++ {"help", 0, NULL, '?' }, ++ {NULL}, ++}; + + void usage(void) + { +- fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}")); +- exit(1); ++ fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}\n")); ++ exit(E_USAGE); + } + +-int main(int ac, char **av) +-{ +- FILE *ifh; ++int main(int ac, char **av) ++{ ++ FILE *ifh; + char *p; + int n; +- int linenum; ++ int linenum; + char *line = NULL; + size_t linel = 0; ++ int ret = 0; + + for (;;) { + int c = getopt_long(ac,av,"c:s",lopt,NULL); + if (c == -1) break; +- switch (c) { ++ switch (c) { + default: + case '?': +- usage(); ++ usage(); + case 'c': + fname = optarg; + break; +@@ -229,74 +224,76 @@ int main(int ac, char **av) + } + } + +- if (use_syslog) ++ if (use_syslog) + openlog("nameif",0,LOG_LOCAL0); +- +- while (optind < ac) { +- struct change *ch = xmalloc(sizeof(struct change)); ++ ++ while (optind < ac) { ++ struct change *ch = xmalloc(sizeof(struct change)); + char pos[30]; + +- if ((ac-optind) & 1) ++ if ((ac-optind) & 1) + usage(); +- if (strlen(av[optind])+1>IFNAMSIZ) ++ if (strlen(av[optind])+1>IFNAMSIZ) + complain(_("interface name `%s' too long"), av[optind]); +- strcpy(ch->ifname, av[optind]); +- optind++; +- sprintf(pos,_("argument %d"),optind); +- addchange(av[optind], ch, pos); +- optind++; +- } ++ safe_strncpy(ch->ifname, av[optind], sizeof(ch->ifname)); ++ optind++; ++ sprintf(pos,_("argument %d"),optind); ++ addchange(av[optind], ch, pos); ++ optind++; ++ } + +- if (!clist || fname != default_conf) +- readconf(); ++ if (!clist || fname != default_conf) ++ readconf(); + +- ifh = fopen("/proc/net/dev", "r"); +- if (!ifh) complain(_("open of /proc/net/dev: %s"), strerror(errno)); ++ ifh = fopen("/proc/net/dev", "r"); ++ if (!ifh) complain(_("open of /proc/net/dev: %s"), strerror(errno)); + + + linenum = 0; + while (getdelim(&line, &linel, '\n', ifh) > 0) { +- struct change *ch; ++ struct change *ch; + unsigned char mac[6]; + +- if (linenum++ < 2) ++ if (linenum++ < 2) + continue; +- +- p = line; +- while (isspace(*p)) ++ ++ p = line; ++ while (isspace(*p)) + ++p; +- n = strcspn(p, ": \t"); +- p[n] = 0; +- +- if (n > IFNAMSIZ-1) +- complain(_("interface name `%s' too long"), p); +- +- if (getmac(p, mac) < 0) ++ n = strcspn(p, ": \t"); ++ p[n] = 0; ++ ++ if (n > IFNAMSIZ-1) ++ complain(_("interface name `%s' too long"), p); ++ ++ if (getmac(p, mac) < 0) + continue; +- +- ch = lookupmac(mac); +- if (!ch) ++ ++ ch = lookupmac(mac); ++ if (!ch) + continue; +- +- *ch->pprev = ch->next; +- if (strcmp(p, ch->ifname)) { +- if (setname(p, ch->ifname) < 0) ++ ++ ch->found = 1; ++ if (strcmp(p, ch->ifname)) { ++ if (setname(p, ch->ifname) < 0) + complain(_("cannot change name of %s to %s: %s"), +- p, ch->ifname, strerror(errno)); +- } +- free(ch); +- } +- fclose(ifh); +- +- while (clist) { ++ p, ch->ifname, strerror(errno)); ++ } ++ } ++ fclose(ifh); ++ ++ while (clist) { + struct change *ch = clist; + clist = clist->next; +- warning(_("interface '%s' not found"), ch->ifname); +- free(ch); ++ if (!ch->found){ ++ warning(_("interface '%s' not found"), ch->ifname); ++ ret = 1; ++ } ++ free(ch); + } + + if (use_syslog) + closelog(); +- return 0; +-} ++ return ret; ++} + +diff --git a/netstat.c b/netstat.c +index 1ef790e..d0c364f 100644 +--- a/netstat.c ++++ b/netstat.c +@@ -6,7 +6,7 @@ + * NET-3 Networking Distribution for the LINUX operating + * system. + * +- * Version: $Id: netstat.c,v 1.43 2001/04/15 14:41:17 pb Exp $ ++ * Version: $Id: netstat.c,v 1.73 2011-04-20 01:35:22 ecki Exp $ + * + * Authors: Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de> + * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> +@@ -23,24 +23,24 @@ + * Modified: + * + *960116 {1.01} Bernd Eckenfels: verbose, cleanups +- *960204 {1.10} Bernd Eckenfels: aftrans, usage, new route_info, ++ *960204 {1.10} Bernd Eckenfels: aftrans, usage, new route_info, + * DLFT_AF + *960204 {1.11} Bernd Eckenfels: netlink support + *960204 {1.12} Bernd Eckenfels: route_init() + *960215 {1.13} Bernd Eckenfels: netlink_print honors HAVE_ +- *960217 {1.14} Bernd Eckenfels: masq_info from Jos Vos and ++ *960217 {1.14} Bernd Eckenfels: masq_info from Jos Vos and + * ax25_info from Jonathan Naylor. + *960218 {1.15} Bernd Eckenfels: ipx_info rewritten, -e for tcp/ipx + *960220 {1.16} Bernd Eckenfels: minor output reformats, -a for -x + *960221 {1.17} Bernd Eckenfels: route_init->getroute_init + *960426 {1.18} Bernd Eckenfels: new RTACTION, SYM/NUM, FIB/CACHE +- *960517 {1.19} Bernd Eckenfels: usage() spelling fix and --unix inode, ++ *960517 {1.19} Bernd Eckenfels: usage() spelling fix and --unix inode, + * ':' is part of sock_addr for --inet + *960822 {x.xx} Frank Strauss: INET6 support + * + *970406 {1.33} Philip Copeland Added snmp reporting support module -s + * code provided by Andi Kleen +- * (relly needs to be kernel hooked but ++ * (relly needs to be kernel hooked but + * this will do in the meantime) + * minor header file misplacement tidy up. + *980815 {1.xx} Stephane Fillod: X.25 support +@@ -58,6 +58,8 @@ + * + *990420 {1.38} Tuan Hoang removed a useless assignment from igmp_do_one() + *20010404 {1.39} Arnaldo Carvalho de Melo - use setlocale ++ *20081201 {1.42} Brian Micek added -L|--udplite options for RFC 3828 ++ *20020722 {1.51} Thomas Preusser added SCTP over IPv4 support + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General +@@ -83,6 +85,7 @@ + #include <arpa/inet.h> + #include <netinet/in.h> + #include <sys/ioctl.h> ++#include <sys/stat.h> + #include <net/if.h> + #include <dirent.h> + +@@ -94,8 +97,18 @@ + #include "sockets.h" + #include "interface.h" + #include "util.h" ++#include "proc.h" ++ ++#if HAVE_SELINUX ++#include <selinux/selinux.h> ++#endif ++ ++#if HAVE_AFBLUETOOTH ++#include <bluetooth/bluetooth.h> ++#endif + + #define PROGNAME_WIDTH 20 ++#define SELINUX_WIDTH 50 + + #if !defined(s6_addr32) && defined(in6a_words) + #define s6_addr32 in6a_words /* libinet6 */ +@@ -104,6 +117,8 @@ + /* prototypes for statistics.c */ + void parsesnmp(int, int, int); + void inittab(void); ++void parsesnmp6(int, int, int); ++void inittab6(void); + + typedef enum { + SS_FREE = 0, /* not allocated */ +@@ -122,7 +137,7 @@ typedef enum { + #define FEATURE_NETSTAT + #include "lib/net-features.h" + +-char *Release = RELEASE, *Version = "netstat 1.42 (2001-04-15)", *Signature = "Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang and others"; ++static char *Release = RELEASE, *Signature = "Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others"; + + + #define E_READ -1 +@@ -142,18 +157,24 @@ int flag_cf = 0; + int flag_opt = 0; + int flag_raw = 0; + int flag_tcp = 0; ++int flag_sctp= 0; + int flag_udp = 0; ++int flag_udplite = 0; + int flag_igmp= 0; + int flag_rom = 0; + int flag_exp = 1; ++int flag_wide= 0; + int flag_prg = 0; + int flag_arg = 0; + int flag_ver = 0; ++int flag_l2cap = 0; ++int flag_rfcomm = 0; ++int flag_selinux = 0; + + FILE *procinfo; + +-#define INFO_GUTS1(file,name,proc) \ +- procinfo = fopen((file), "r"); \ ++#define INFO_GUTS1(file,name,proc,prot) \ ++ procinfo = proc_fopen((file)); \ + if (procinfo == NULL) { \ + if (errno != ENOENT) { \ + perror((file)); \ +@@ -166,58 +187,63 @@ FILE *procinfo; + } else { \ + do { \ + if (fgets(buffer, sizeof(buffer), procinfo)) \ +- (proc)(lnr++, buffer); \ ++ (proc)(lnr++, buffer,prot); \ + } while (!feof(procinfo)); \ + fclose(procinfo); \ + } + + #if HAVE_AFINET6 +-#define INFO_GUTS2(file,proc) \ ++#define INFO_GUTS2(file,proc,prot) \ + lnr = 0; \ +- procinfo = fopen((file), "r"); \ ++ procinfo = proc_fopen((file)); \ + if (procinfo != NULL) { \ + do { \ + if (fgets(buffer, sizeof(buffer), procinfo)) \ +- (proc)(lnr++, buffer); \ ++ (proc)(lnr++, buffer,prot); \ + } while (!feof(procinfo)); \ + fclose(procinfo); \ + } + #else +-#define INFO_GUTS2(file,proc) ++#define INFO_GUTS2(file,proc,prot) + #endif + + #define INFO_GUTS3 \ + return rc; + +-#define INFO_GUTS6(file,file6,name,proc) \ ++#define INFO_GUTS6(file,file6,name,proc,prot4,prot6) \ + char buffer[8192]; \ + int rc = 0; \ + int lnr = 0; \ + if (!flag_arg || flag_inet) { \ +- INFO_GUTS1(file,name,proc) \ ++ INFO_GUTS1(file,name,proc,prot4) \ + } \ + if (!flag_arg || flag_inet6) { \ +- INFO_GUTS2(file6,proc) \ ++ INFO_GUTS2(file6,proc,prot6) \ + } \ + INFO_GUTS3 + +-#define INFO_GUTS(file,name,proc) \ ++#define INFO_GUTS(file,name,proc,prot) \ + char buffer[8192]; \ + int rc = 0; \ + int lnr = 0; \ +- INFO_GUTS1(file,name,proc) \ ++ INFO_GUTS1(file,name,proc,prot) \ + INFO_GUTS3 + + #define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH) + #define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s) + #define PROGNAME_WIDTH2(s) #s + ++#define SELINUX_WIDTHs SELINUX_WIDTH1(SELINUX_WIDTH) ++#define SELINUX_WIDTH1(s) SELINUX_WIDTH2(s) ++#define SELINUX_WIDTH2(s) #s ++ + #define PRG_HASH_SIZE 211 + + static struct prg_node { + struct prg_node *next; +- int inode; ++ unsigned long inode; + char name[PROGNAME_WIDTH]; ++ char scon[SELINUX_WIDTH]; + } *prg_hash[PRG_HASH_SIZE]; + + static char prg_cache_loaded = 0; +@@ -225,8 +251,11 @@ static char prg_cache_loaded = 0; + #define PRG_HASHIT(x) ((x) % PRG_HASH_SIZE) + + #define PROGNAME_BANNER "PID/Program name" ++#define SELINUX_BANNER "Security Context" ++ ++#define print_progname_banner() do { if (flag_prg) printf(" %-" PROGNAME_WIDTHs "s",PROGNAME_BANNER); } while (0) + +-#define print_progname_banner() do { if (flag_prg) printf("%-" PROGNAME_WIDTHs "s"," " PROGNAME_BANNER); } while (0) ++#define print_selinux_banner() do { if (flag_selinux) printf("%-" SELINUX_WIDTHs "s"," " SELINUX_BANNER); } while (0) + + #define PRG_LOCAL_ADDRESS "local_address" + #define PRG_INODE "inode" +@@ -246,40 +275,57 @@ static char prg_cache_loaded = 0; + #define PATH_PROC_X_FD PATH_PROC "/%s/" PATH_FD_SUFF + #define PATH_CMDLINE "cmdline" + #define PATH_CMDLINEl strlen(PATH_CMDLINE) +-/* NOT working as of glibc-2.0.7: */ +-#undef DIRENT_HAVE_D_TYPE_WORKS + +-static void prg_cache_add(int inode, char *name) ++static void prg_cache_add(unsigned long inode, char *name, const char *scon) + { + unsigned hi = PRG_HASHIT(inode); + struct prg_node **pnp,*pn; + +- prg_cache_loaded=2; +- for (pnp=prg_hash+hi;(pn=*pnp);pnp=&pn->next) { +- if (pn->inode==inode) { ++ prg_cache_loaded = 2; ++ for (pnp = prg_hash + hi; (pn = *pnp); pnp = &pn->next) { ++ if (pn->inode == inode) { + /* Some warning should be appropriate here + as we got multiple processes for one i-node */ + return; + } + } +- if (!(*pnp=malloc(sizeof(**pnp)))) ++ if (!(*pnp = malloc(sizeof(**pnp)))) + return; +- pn=*pnp; +- pn->next=NULL; +- pn->inode=inode; +- if (strlen(name)>sizeof(pn->name)-1) +- name[sizeof(pn->name)-1]='\0'; +- strcpy(pn->name,name); ++ pn = *pnp; ++ pn->next = NULL; ++ pn->inode = inode; ++ safe_strncpy(pn->name, name, sizeof(pn->name)); ++ ++ { ++ int len = (strlen(scon) - sizeof(pn->scon)) + 1; ++ if (len > 0) ++ safe_strncpy(pn->scon, &scon[len + 1], sizeof(pn->scon)); ++ else ++ safe_strncpy(pn->scon, scon, sizeof(pn->scon)); ++ } ++ ++} ++ ++static const char *prg_cache_get(unsigned long inode) ++{ ++ unsigned hi = PRG_HASHIT(inode); ++ struct prg_node *pn; ++ ++ for (pn = prg_hash[hi]; pn; pn = pn->next) ++ if (pn->inode == inode) ++ return (pn->name); ++ return ("-"); + } + +-static const char *prg_cache_get(int inode) ++static const char *prg_cache_get_con(unsigned long inode) + { +- unsigned hi=PRG_HASHIT(inode); ++ unsigned hi = PRG_HASHIT(inode); + struct prg_node *pn; + +- for (pn=prg_hash[hi];pn;pn=pn->next) +- if (pn->inode==inode) return(pn->name); +- return("-"); ++ for (pn = prg_hash[hi]; pn; pn = pn->next) ++ if (pn->inode == inode) ++ return (pn->scon); ++ return ("-"); + } + + static void prg_cache_clear(void) +@@ -287,143 +333,164 @@ static void prg_cache_clear(void) + struct prg_node **pnp,*pn; + + if (prg_cache_loaded == 2) +- for (pnp=prg_hash;pnp<prg_hash+PRG_HASH_SIZE;pnp++) +- while ((pn=*pnp)) { +- *pnp=pn->next; ++ for (pnp = prg_hash; pnp < prg_hash + PRG_HASH_SIZE; pnp++) ++ while ((pn = *pnp)) { ++ *pnp = pn->next; + free(pn); + } +- prg_cache_loaded=0; ++ prg_cache_loaded = 0; ++} ++ ++static void wait_continous(void) ++{ ++ fflush(stdout); ++ sleep(1); + } + +-static void extract_type_1_socket_inode(const char lname[], long * inode_p) { ++static int extract_type_1_socket_inode(const char lname[], unsigned long * inode_p) { + + /* If lname is of the form "socket:[12345]", extract the "12345" + as *inode_p. Otherwise, return -1 as *inode_p. + */ + +- if (strlen(lname) < PRG_SOCKET_PFXl+3) *inode_p = -1; +- else if (memcmp(lname, PRG_SOCKET_PFX, PRG_SOCKET_PFXl)) *inode_p = -1; +- else if (lname[strlen(lname)-1] != ']') *inode_p = -1; +- else { ++ if (strlen(lname) < PRG_SOCKET_PFXl+3) return(-1); ++ ++ if (memcmp(lname, PRG_SOCKET_PFX, PRG_SOCKET_PFXl)) return(-1); ++ if (lname[strlen(lname)-1] != ']') return(-1); ++ ++ { + char inode_str[strlen(lname + 1)]; /* e.g. "12345" */ + const int inode_str_len = strlen(lname) - PRG_SOCKET_PFXl - 1; + char *serr; + + strncpy(inode_str, lname+PRG_SOCKET_PFXl, inode_str_len); + inode_str[inode_str_len] = '\0'; +- *inode_p = strtol(inode_str,&serr,0); +- if (!serr || *serr || *inode_p < 0 || *inode_p >= INT_MAX) +- *inode_p = -1; ++ *inode_p = strtoul(inode_str, &serr, 0); ++ if (!serr || *serr || *inode_p == ~0) ++ return(-1); + } ++ return(0); + } + + + +-static void extract_type_2_socket_inode(const char lname[], long * inode_p) { ++static int extract_type_2_socket_inode(const char lname[], unsigned long * inode_p) { + + /* If lname is of the form "[0000]:12345", extract the "12345" + as *inode_p. Otherwise, return -1 as *inode_p. + */ + +- if (strlen(lname) < PRG_SOCKET_PFX2l+1) *inode_p = -1; +- else if (memcmp(lname, PRG_SOCKET_PFX2, PRG_SOCKET_PFX2l)) *inode_p = -1; +- else { ++ if (strlen(lname) < PRG_SOCKET_PFX2l+1) return(-1); ++ if (memcmp(lname, PRG_SOCKET_PFX2, PRG_SOCKET_PFX2l)) return(-1); ++ ++ { + char *serr; + +- *inode_p=strtol(lname + PRG_SOCKET_PFX2l,&serr,0); +- if (!serr || *serr || *inode_p < 0 || *inode_p >= INT_MAX) +- *inode_p = -1; ++ *inode_p = strtoul(lname + PRG_SOCKET_PFX2l, &serr, 0); ++ if (!serr || *serr || *inode_p == ~0) ++ return(-1); + } ++ return(0); + } + + + ++ + static void prg_cache_load(void) + { +- char line[LINE_MAX],eacces=0; +- int procfdlen,fd,cmdllen,lnamelen; +- char lname[30],cmdlbuf[512],finbuf[PROGNAME_WIDTH]; +- long inode; +- const char *cs,*cmdlp; +- DIR *dirproc=NULL,*dirfd=NULL; +- struct dirent *direproc,*direfd; ++ char line[LINE_MAX], eacces=0; ++ int procfdlen, fd, cmdllen, lnamelen; ++ char lname[30], cmdlbuf[512], finbuf[PROGNAME_WIDTH]; ++ unsigned long inode; ++ const char *cs, *cmdlp; ++ DIR *dirproc = NULL, *dirfd = NULL; ++ struct dirent *direproc, *direfd; ++#if HAVE_SELINUX ++ security_context_t scon = NULL; ++#endif + + if (prg_cache_loaded || !flag_prg) return; +- prg_cache_loaded=1; +- cmdlbuf[sizeof(cmdlbuf)-1]='\0'; ++ prg_cache_loaded = 1; ++ cmdlbuf[sizeof(cmdlbuf) - 1] = '\0'; + if (!(dirproc=opendir(PATH_PROC))) goto fail; +- while (errno=0,direproc=readdir(dirproc)) { +-#ifdef DIRENT_HAVE_D_TYPE_WORKS +- if (direproc->d_type!=DT_DIR) continue; +-#endif +- for (cs=direproc->d_name;*cs;cs++) +- if (!isdigit(*cs)) ++ while (errno = 0, direproc = readdir(dirproc)) { ++ for (cs = direproc->d_name; *cs; cs++) ++ if (!isdigit(*cs)) + break; +- if (*cs) ++ if (*cs) + continue; +- procfdlen=snprintf(line,sizeof(line),PATH_PROC_X_FD,direproc->d_name); +- if (procfdlen<=0 || procfdlen>=sizeof(line)-5) ++ procfdlen = snprintf(line,sizeof(line),PATH_PROC_X_FD,direproc->d_name); ++ if (procfdlen <= 0 || procfdlen >= sizeof(line) - 5) + continue; +- errno=0; +- dirfd=opendir(line); ++ errno = 0; ++ dirfd = opendir(line); + if (! dirfd) { +- if (errno==EACCES) +- eacces=1; ++ if (errno == EACCES) ++ eacces = 1; + continue; + } + line[procfdlen] = '/'; + cmdlp = NULL; + while ((direfd = readdir(dirfd))) { +-#ifdef DIRENT_HAVE_D_TYPE_WORKS +- if (direfd->d_type!=DT_LNK) +- continue; +-#endif +- if (procfdlen+1+strlen(direfd->d_name)+1>sizeof(line)) ++ /* Skip . and .. */ ++ if (!isdigit(direfd->d_name[0])) ++ continue; ++ if (procfdlen + 1 + strlen(direfd->d_name) + 1 > sizeof(line)) + continue; + memcpy(line + procfdlen - PATH_FD_SUFFl, PATH_FD_SUFF "/", +- PATH_FD_SUFFl+1); +- strcpy(line + procfdlen + 1, direfd->d_name); +- lnamelen=readlink(line,lname,sizeof(lname)-1); ++ PATH_FD_SUFFl + 1); ++ safe_strncpy(line + procfdlen + 1, direfd->d_name, ++ sizeof(line) - procfdlen - 1); ++ lnamelen = readlink(line, lname, sizeof(lname) - 1); ++ if (lnamelen == -1) ++ continue; + lname[lnamelen] = '\0'; /*make it a null-terminated string*/ + +- extract_type_1_socket_inode(lname, &inode); +- +- if (inode < 0) extract_type_2_socket_inode(lname, &inode); +- +- if (inode < 0) continue; ++ if (extract_type_1_socket_inode(lname, &inode) < 0) ++ if (extract_type_2_socket_inode(lname, &inode) < 0) ++ continue; + + if (!cmdlp) { +- if (procfdlen - PATH_FD_SUFFl + PATH_CMDLINEl >= +- sizeof(line) - 5) ++ if (procfdlen - PATH_FD_SUFFl + PATH_CMDLINEl >= ++ sizeof(line) - 5) + continue; +- strcpy(line + procfdlen-PATH_FD_SUFFl, PATH_CMDLINE); ++ safe_strncpy(line + procfdlen - PATH_FD_SUFFl, PATH_CMDLINE, ++ sizeof(line) - procfdlen + PATH_FD_SUFFl); + fd = open(line, O_RDONLY); +- if (fd < 0) ++ if (fd < 0) + continue; + cmdllen = read(fd, cmdlbuf, sizeof(cmdlbuf) - 1); +- if (close(fd)) ++ if (close(fd)) + continue; +- if (cmdllen == -1) ++ if (cmdllen == -1) + continue; +- if (cmdllen < sizeof(cmdlbuf) - 1) ++ if (cmdllen < sizeof(cmdlbuf) - 1) + cmdlbuf[cmdllen]='\0'; +- if ((cmdlp = strrchr(cmdlbuf, '/'))) ++ if (cmdlbuf[0] == '/' && (cmdlp = strrchr(cmdlbuf, '/'))) + cmdlp++; +- else ++ else + cmdlp = cmdlbuf; + } + + snprintf(finbuf, sizeof(finbuf), "%s/%s", direproc->d_name, cmdlp); +- prg_cache_add(inode, finbuf); ++#if HAVE_SELINUX ++ if (getpidcon(atoi(direproc->d_name), &scon) == -1) { ++ scon=xstrdup("-"); ++ } ++ prg_cache_add(inode, finbuf, scon); ++ freecon(scon); ++#else ++ prg_cache_add(inode, finbuf, "-"); ++#endif + } +- closedir(dirfd); ++ closedir(dirfd); + dirfd = NULL; + } +- if (dirproc) ++ if (dirproc) + closedir(dirproc); +- if (dirfd) ++ if (dirfd) + closedir(dirfd); +- if (!eacces) ++ if (!eacces) + return; + if (prg_cache_loaded == 1) { + fail: +@@ -450,7 +517,7 @@ static int netrom_info(void) + char buffer[256], dev[16]; + int st, vs, vr, sendq, recvq, ret; + +- f = fopen(_PATH_PROCNET_NR, "r"); ++ f = proc_fopen(_PATH_PROCNET_NR); + if (f == NULL) { + if (errno != ENOENT) { + perror(_PATH_PROCNET_NR); +@@ -465,7 +532,8 @@ static int netrom_info(void) + } + printf(_("Active NET/ROM sockets\n")); + printf(_("User Dest Source Device State Vr/Vs Send-Q Recv-Q\n")); +- fgets(buffer, 256, f); ++ if (fgets(buffer, 256, f)) ++ /* eat line */; + + while (fgets(buffer, 256, f)) { + buffer[9] = 0; +@@ -527,19 +595,22 @@ static void finish_this_one(int uid, unsigned long inode, const char *timers) + + if (flag_exp > 1) { + if (!(flag_not & FLAG_NUM_USER) && ((pw = getpwuid(uid)) != NULL)) +- printf("%-10s ", pw->pw_name); ++ printf(" %-10s ", pw->pw_name); + else +- printf("%-10d ", uid); +- printf("%-10ld ",inode); ++ printf(" %-10d ", uid); ++ printf("%-10lu",inode); + } + if (flag_prg) +- printf("%-" PROGNAME_WIDTHs "s",prg_cache_get(inode)); ++ printf(" %-" PROGNAME_WIDTHs "s",prg_cache_get(inode)); ++ if (flag_selinux) ++ printf(" %-" SELINUX_WIDTHs "s",prg_cache_get_con(inode)); ++ + if (flag_opt) +- printf("%s", timers); ++ printf(" %s", timers); + putchar('\n'); + } + +-static void igmp_do_one(int lnr, const char *line) ++static void igmp_do_one(int lnr, const char *line,const char *prot) + { + char mcast_addr[128]; + #if HAVE_AFINET6 +@@ -598,8 +669,8 @@ static void igmp_do_one(int lnr, const char *line) + ((struct sockaddr *) &mcastaddr)->sa_family); + return; + } +- safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, +- flag_not), sizeof(mcast_addr)); ++ safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, ++ flag_not & FLAG_NUM_HOST), sizeof(mcast_addr)); + printf("%-15s %-6d %s\n", device, refcnt, mcast_addr); + #endif + } else { /* IPV4 */ +@@ -630,14 +701,14 @@ static void igmp_do_one(int lnr, const char *line) + fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); + return; + } +- ++ + if ((ap = get_afntype(((struct sockaddr *) &mcastaddr)->sa_family)) == NULL) { + fprintf(stderr, _("netstat: unsupported address family %d !\n"), + ((struct sockaddr *) &mcastaddr)->sa_family); + return; + } +- safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, +- flag_not), sizeof(mcast_addr)); ++ safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr, ++ flag_not & FLAG_NUM_HOST), sizeof(mcast_addr)); + printf("%-15s %-6d %s\n", device, refcnt, mcast_addr ); + #endif + } /* IPV4 */ +@@ -646,7 +717,7 @@ static void igmp_do_one(int lnr, const char *line) + #if HAVE_AFX25 + static int x25_info(void) + { +- FILE *f=fopen(_PATH_PROCNET_X25, "r"); ++ FILE *f=proc_fopen(_PATH_PROCNET_X25); + char buffer[256],dev[16]; + int st,vs,vr,sendq,recvq,lci; + static char *x25_state[5]= +@@ -657,7 +728,7 @@ static int x25_info(void) + "ESTABLISHED", + "RECOVERY" + }; +- if(!(f=fopen(_PATH_PROCNET_X25, "r"))) ++ if(!f) + { + if (errno != ENOENT) { + perror(_PATH_PROCNET_X25); +@@ -673,7 +744,8 @@ static int x25_info(void) + printf( _("Active X.25 sockets\n")); + /* IMHO, Vr/Vs is not very usefull --SF */ + printf( _("Dest Source Device LCI State Vr/Vs Send-Q Recv-Q\n")); +- fgets(buffer,256,f); ++ if (fgets(buffer,256,f)) ++ /* eat line */; + while(fgets(buffer,256,f)) + { + buffer[10]=0; +@@ -690,21 +762,206 @@ static int x25_info(void) + vr,vs,sendq,recvq); + } + fclose(f); +- return 0; ++ return 0; + } + #endif + + static int igmp_info(void) + { + INFO_GUTS6(_PATH_PROCNET_IGMP, _PATH_PROCNET_IGMP6, "AF INET (igmp)", +- igmp_do_one); ++ igmp_do_one, "igmp", "igmp6"); ++} ++ ++static int ip_parse_dots(uint32_t *addr, char const *src) { ++ unsigned a, b, c, d; ++ unsigned ret = 4-sscanf(src, "%u.%u.%u.%u", &a, &b, &c, &d); ++ *addr = htonl((a << 24)|(b << 16)|(c << 8)|d); ++ return ret; ++} ++ ++static void print_ip_service(struct sockaddr_in *addr, char const *protname, ++ char *buf, unsigned size) { ++ struct aftype *ap; ++ ++ if(size == 0) return; ++ ++ /* print host */ ++ if((ap = get_afntype(addr->sin_family)) == NULL) { ++ fprintf(stderr, _("netstat: unsupported address family %d !\n"), ++ addr->sin_family); ++ return; ++ } ++ safe_strncpy(buf, ap->sprint((struct sockaddr*)addr, flag_not), size); ++ ++ /* print service */ ++ if(flag_all || (flag_lst && !addr->sin_port) || (!flag_lst && addr->sin_port)) { ++ char bfs[32]; ++ ++ snprintf(bfs, sizeof(bfs), "%s", ++ get_sname(addr->sin_port, (char*)protname, flag_not & FLAG_NUM_PORT)); ++ ++ /* check if we must cut on host and/or service name */ ++ { ++ unsigned const bufl = strlen(buf); ++ unsigned const bfsl = strlen(bfs); ++ ++ if(bufl+bfsl+2 > size) { ++ unsigned const half = (size-2)>>1; ++ if(bufl > half) { ++ if(bfsl > half) { ++ buf[size-2-half] = '\0'; ++ bfs[half+1] = '\0'; ++ } ++ else buf[size-2-bfsl] = '\0'; ++ } ++ else bfs[size-2-bufl] = '\0'; ++ } ++ } ++ strcat(buf, ":"); ++ strcat(buf, bfs); ++ } ++} ++ ++/* process single SCTP endpoint */ ++static void sctp_do_ept(int lnr, char const *line, const char *prot) ++{ ++ struct sockaddr_in laddr, raddr; ++ unsigned uid, inode; ++ ++ char l_addr[23], r_addr[23]; ++ ++ /* fill sockaddr_in structures */ ++ { ++ unsigned lport; ++ unsigned ate; ++ ++ if(lnr == 0) return; ++ if(sscanf(line, "%*X %*X %*u %*u %*u %u %u %u %n", ++ &lport, &uid, &inode, &ate) < 3) goto err; ++ ++ /* decode IP address */ ++ if(ip_parse_dots(&laddr.sin_addr.s_addr, line+ate)) goto err; ++ raddr.sin_addr.s_addr = htonl(0); ++ laddr.sin_family = raddr.sin_family = AF_INET; ++ laddr.sin_port = htons(lport); ++ raddr.sin_port = htons(0); ++ } ++ ++ /* print IP:service to l_addr and r_addr */ ++ print_ip_service(&laddr, prot, l_addr, sizeof(l_addr)); ++ print_ip_service(&raddr, prot, r_addr, sizeof(r_addr)); ++ ++ /* Print line */ ++ printf("%-4s %6d %6d %-*s %-*s %-11s", ++ prot, 0, 0, ++ (int)netmax(23,strlen(l_addr)), l_addr, ++ (int)netmax(23,strlen(r_addr)), r_addr, ++ _(tcp_state[TCP_LISTEN])); ++ finish_this_one(uid, inode, ""); ++ return; ++ err: ++ fprintf(stderr, "SCTP error in line: %d\n", lnr); ++} ++ ++/* process single SCTP association */ ++static void sctp_do_assoc(int lnr, char const *line, const char *prot) ++{ ++ struct sockaddr_in laddr, raddr; ++ unsigned long rxq, txq; ++ unsigned uid, inode; ++ ++ char l_addr[23], r_addr[23]; ++ ++ /* fill sockaddr_in structures */ ++ { ++ unsigned lport, rport; ++ unsigned ate; ++ char const *addr; ++ ++ if(lnr == 0) return; ++ if(sscanf(line, "%*X %*X %*u %*u %*u %*u %*u %lu %lu %u %u %u %u %n", ++ &txq, &rxq, &uid, &inode, &lport, &rport, &ate) < 6) goto err; ++ ++ /* decode IP addresses */ ++ addr = strchr(line+ate, '*'); ++ if(addr == 0) goto err; ++ if(ip_parse_dots(&laddr.sin_addr.s_addr, ++addr)) goto err; ++ addr = strchr(addr, '*'); ++ if(addr == 0) goto err; ++ if(ip_parse_dots(&raddr.sin_addr.s_addr, ++addr)) goto err; ++ ++ /* complete sockaddr_in structures */ ++ laddr.sin_family = raddr.sin_family = AF_INET; ++ laddr.sin_port = htons(lport); ++ raddr.sin_port = htons(rport); ++ } ++ ++ /* print IP:service to l_addr and r_addr */ ++ print_ip_service(&laddr, prot, l_addr, sizeof(l_addr)); ++ print_ip_service(&raddr, prot, r_addr, sizeof(r_addr)); ++ ++ /* Print line */ ++ printf("%-4s %6ld %6ld %-*s %-*s %-11s", ++ prot, rxq, txq, ++ (int)netmax(23,strlen(l_addr)), l_addr, ++ (int)netmax(23,strlen(r_addr)), r_addr, ++ _(tcp_state[TCP_ESTABLISHED])); ++ finish_this_one(uid, inode, ""); ++ return; ++ err: ++ fprintf(stderr, "SCTP error in line: %d\n", lnr); ++} ++ ++static int sctp_info_epts(void) { ++ INFO_GUTS6(_PATH_PROCNET_SCTPEPTS, _PATH_PROCNET_SCTP6EPTS, "AF INET (sctp)", ++ sctp_do_ept, "sctp", "sctp6"); ++} ++ ++static int sctp_info_assocs(void) { ++ INFO_GUTS6(_PATH_PROCNET_SCTPASSOCS, _PATH_PROCNET_SCTP6ASSOCS, "AF INET (sctp)", ++ sctp_do_assoc, "sctp", "sctp6"); ++} ++ ++static int sctp_info(void) { ++ int res; ++ res = sctp_info_epts(); ++ if(res) return res; ++ return sctp_info_assocs(); ++} ++ ++static void addr_do_one(char *buf, size_t buf_len, size_t short_len, struct aftype *ap, ++#if HAVE_AFINET6 ++ struct sockaddr_in6 *addr, ++#else ++ struct sockaddr_in *addr, ++#endif ++ int port, const char *proto ++) ++{ ++ const char *sport, *saddr; ++ size_t port_len, addr_len; ++ ++ saddr = ap->sprint((struct sockaddr *)addr, flag_not & FLAG_NUM_HOST); ++ sport = get_sname(htons(port), proto, flag_not & FLAG_NUM_PORT); ++ addr_len = strlen(saddr); ++ port_len = strlen(sport); ++ if (!flag_wide && (addr_len + port_len > short_len)) { ++ /* Assume port name is short */ ++ port_len = netmin(port_len, short_len - 4); ++ addr_len = short_len - port_len; ++ strncpy(buf, saddr, addr_len); ++ buf[addr_len] = '\0'; ++ strcat(buf, ":"); ++ strncat(buf, sport, port_len); ++ } else ++ snprintf(buf, buf_len, "%s:%s", saddr, sport); + } + +-static void tcp_do_one(int lnr, const char *line) ++static void tcp_do_one(int lnr, const char *line, const char *prot) + { + unsigned long rxq, txq, time_len, retr, inode; + int num, local_port, rem_port, d, state, uid, timer_run, timeout; +- char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512]; ++ char rem_addr[128], local_addr[128], timers[64]; + struct aftype *ap; + #if HAVE_AFINET6 + struct sockaddr_in6 localaddr, remaddr; +@@ -719,9 +976,17 @@ static void tcp_do_one(int lnr, const char *line) + return; + + num = sscanf(line, +- "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n", ++ "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %*s\n", + &d, local_addr, &local_port, rem_addr, &rem_port, &state, +- &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); ++ &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode); ++ ++ if (num < 11) { ++ fprintf(stderr, _("warning, got bogus tcp line.\n")); ++ return; ++ } ++ ++ if (!flag_all && ((flag_lst && rem_port) || (!flag_lst && !rem_port))) ++ return; + + if (strlen(local_addr) > 8) { + #if HAVE_AFINET6 +@@ -748,45 +1013,16 @@ static void tcp_do_one(int lnr, const char *line) + ((struct sockaddr *) &remaddr)->sa_family = AF_INET; + } + +- if (num < 11) { +- fprintf(stderr, _("warning, got bogus tcp line.\n")); +- return; +- } + if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) { + fprintf(stderr, _("netstat: unsupported address family %d !\n"), + ((struct sockaddr *) &localaddr)->sa_family); + return; + } +- if (state == TCP_LISTEN) { +- time_len = 0; +- retr = 0L; +- rxq = 0L; +- txq = 0L; +- } +- safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, +- flag_not), sizeof(local_addr)); +- safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not), +- sizeof(rem_addr)); +- if (flag_all || (flag_lst && !rem_port) || (!flag_lst && rem_port)) { +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(local_port), "tcp", +- flag_not & FLAG_NUM_PORT)); +- +- if ((strlen(local_addr) + strlen(buffer)) > 22) +- local_addr[22 - strlen(buffer)] = '\0'; +- +- strcat(local_addr, ":"); +- strcat(local_addr, buffer); +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT)); +- +- if ((strlen(rem_addr) + strlen(buffer)) > 22) +- rem_addr[22 - strlen(buffer)] = '\0'; +- +- strcat(rem_addr, ":"); +- strcat(rem_addr, buffer); +- timers[0] = '\0'; + ++ addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localaddr, local_port, "tcp"); ++ addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remaddr, rem_port, "tcp"); ++ ++ timers[0] = '\0'; + if (flag_opt) + switch (timer_run) { + case 0: +@@ -813,23 +1049,23 @@ static void tcp_do_one(int lnr, const char *line) + timer_run, (double) time_len / HZ, retr, timeout); + break; + } +- printf("tcp %6ld %6ld %-23s %-23s %-12s", +- rxq, txq, local_addr, rem_addr, _(tcp_state[state])); ++ ++ printf("%-4s %6ld %6ld %-*s %-*s %-11s", ++ prot, rxq, txq, (int)netmax(23,strlen(local_addr)), local_addr, (int)netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state])); + + finish_this_one(uid,inode,timers); +- } + } + + static int tcp_info(void) + { + INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)", +- tcp_do_one); ++ tcp_do_one, "tcp", "tcp6"); + } + +-static void udp_do_one(int lnr, const char *line) ++static void udp_do_one(int lnr, const char *line,const char *prot) + { +- char buffer[8192], local_addr[64], rem_addr[64]; +- char *udp_state, timers[64], more[512]; ++ char local_addr[64], rem_addr[64]; ++ char *udp_state, timers[64]; + int num, local_port, rem_port, d, state, timer_run, uid, timeout; + #if HAVE_AFINET6 + struct sockaddr_in6 localaddr, remaddr; +@@ -845,12 +1081,16 @@ static void udp_do_one(int lnr, const char *line) + if (lnr == 0) + return; + +- more[0] = '\0'; + num = sscanf(line, +- "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n", ++ "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %*s\n", + &d, local_addr, &local_port, + rem_addr, &rem_port, &state, +- &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); ++ &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode); ++ ++ if (num < 10) { ++ fprintf(stderr, _("warning, got bogus udp line.\n")); ++ return; ++ } + + if (strlen(local_addr) > 8) { + #if HAVE_AFINET6 +@@ -877,13 +1117,7 @@ static void udp_do_one(int lnr, const char *line) + } + + retr = 0L; +- if (!flag_opt) +- more[0] = '\0'; + +- if (num < 10) { +- fprintf(stderr, _("warning, got bogus udp line.\n")); +- return; +- } + if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) { + fprintf(stderr, _("netstat: unsupported address family %d !\n"), + ((struct sockaddr *) &localaddr)->sa_family); +@@ -917,24 +1151,8 @@ static void udp_do_one(int lnr, const char *line) + + if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst)) + { +- safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, +- flag_not), sizeof(local_addr)); +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(local_port), "udp", +- flag_not & FLAG_NUM_PORT)); +- if ((strlen(local_addr) + strlen(buffer)) > 22) +- local_addr[22 - strlen(buffer)] = '\0'; +- strcat(local_addr, ":"); +- strcat(local_addr, buffer); +- +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(rem_port), "udp", flag_not & FLAG_NUM_PORT)); +- safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, +- flag_not), sizeof(rem_addr)); +- if ((strlen(rem_addr) + strlen(buffer)) > 22) +- rem_addr[22 - strlen(buffer)] = '\0'; +- strcat(rem_addr, ":"); +- strcat(rem_addr, buffer); ++ addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localaddr, local_port, "udp"); ++ addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remaddr, rem_port, "udp"); + + timers[0] = '\0'; + if (flag_opt) +@@ -953,8 +1171,8 @@ static void udp_do_one(int lnr, const char *line) + retr, timeout); + break; + } +- printf("udp %6ld %6ld %-23s %-23s %-12s", +- rxq, txq, local_addr, rem_addr, udp_state); ++ printf("%-5s %6ld %6ld %-23s %-23s %-11s", ++ prot, rxq, txq, local_addr, rem_addr, udp_state); + + finish_this_one(uid,inode,timers); + } +@@ -963,13 +1181,19 @@ static void udp_do_one(int lnr, const char *line) + static int udp_info(void) + { + INFO_GUTS6(_PATH_PROCNET_UDP, _PATH_PROCNET_UDP6, "AF INET (udp)", +- udp_do_one); ++ udp_do_one, "udp", "udp6"); + } + +-static void raw_do_one(int lnr, const char *line) ++static int udplite_info(void) + { +- char buffer[8192], local_addr[64], rem_addr[64]; +- char timers[64], more[512]; ++ INFO_GUTS6(_PATH_PROCNET_UDPLITE, _PATH_PROCNET_UDPLITE6, ++ "AF INET (udplite)", udp_do_one, "udpl", "udpl6" ); ++} ++ ++static void raw_do_one(int lnr, const char *line,const char *prot) ++{ ++ char local_addr[64], rem_addr[64]; ++ char timers[64]; + int num, local_port, rem_port, d, state, timer_run, uid, timeout; + #if HAVE_AFINET6 + struct sockaddr_in6 localaddr, remaddr; +@@ -985,11 +1209,15 @@ static void raw_do_one(int lnr, const char *line) + if (lnr == 0) + return; + +- more[0] = '\0'; + num = sscanf(line, +- "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n", ++ "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %*s\n", + &d, local_addr, &local_port, rem_addr, &rem_port, &state, +- &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more); ++ &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode); ++ ++ if (num < 10) { ++ fprintf(stderr, _("warning, got bogus raw line.\n")); ++ return; ++ } + + if (strlen(local_addr) > 8) { + #if HAVE_AFINET6 +@@ -1026,34 +1254,10 @@ static void raw_do_one(int lnr, const char *line) + } + #endif + +- if (!flag_opt) +- more[0] = '\0'; +- +- if (num < 10) { +- fprintf(stderr, _("warning, got bogus raw line.\n")); +- return; +- } +- + if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst)) + { +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(local_port), "raw", +- flag_not & FLAG_NUM_PORT)); +- safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, +- flag_not), sizeof(local_addr)); +- if ((strlen(local_addr) + strlen(buffer)) > 22) +- local_addr[22 - strlen(buffer)] = '\0'; +- strcat(local_addr, ":"); +- strcat(local_addr, buffer); +- +- snprintf(buffer, sizeof(buffer), "%s", +- get_sname(htons(rem_port), "raw", flag_not & FLAG_NUM_PORT)); +- safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, +- flag_not), sizeof(rem_addr)); +- if ((strlen(rem_addr) + strlen(buffer)) > 22) +- rem_addr[22 - strlen(buffer)] = '\0'; +- strcat(rem_addr, ":"); +- strcat(rem_addr, buffer); ++ addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localaddr, local_port, "raw"); ++ addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remaddr, rem_port, "raw"); + + timers[0] = '\0'; + if (flag_opt) +@@ -1074,8 +1278,8 @@ static void raw_do_one(int lnr, const char *line) + retr, timeout); + break; + } +- printf("raw %6ld %6ld %-23s %-23s %-12d", +- rxq, txq, local_addr, rem_addr, state); ++ printf("%-4s %6ld %6ld %-23s %-23s %-11d", ++ prot, rxq, txq, local_addr, rem_addr, state); + + finish_this_one(uid,inode,timers); + } +@@ -1084,7 +1288,7 @@ static void raw_do_one(int lnr, const char *line) + static int raw_info(void) + { + INFO_GUTS6(_PATH_PROCNET_RAW, _PATH_PROCNET_RAW6, "AF INET (raw)", +- raw_do_one); ++ raw_do_one, "raw", "raw6"); + } + + #endif +@@ -1094,14 +1298,14 @@ static int raw_info(void) + + #define HAS_INODE 1 + +-static void unix_do_one(int nr, const char *line) ++static void unix_do_one(int nr, const char *line, const char *prot) + { + static int has = 0; + char path[MAXPATHLEN], ss_flags[32]; + char *ss_proto, *ss_state, *ss_type; +- int num, state, type, inode; ++ int num, state, type; + void *d; +- unsigned long refcnt, proto, flags; ++ unsigned long refcnt, proto, flags, inode; + + if (nr == 0) { + if (strstr(line, "Inode")) +@@ -1109,14 +1313,14 @@ static void unix_do_one(int nr, const char *line) + return; + } + path[0] = '\0'; +- num = sscanf(line, "%p: %lX %lX %lX %X %X %d %s", ++ num = sscanf(line, "%p: %lX %lX %lX %X %X %lu %s", + &d, &refcnt, &proto, &flags, &type, &state, &inode, path); + if (num < 6) { + fprintf(stderr, _("warning, got bogus unix line.\n")); + return; + } + if (!(has & HAS_INODE)) +- snprintf(path,sizeof(path),"%d",inode); ++ snprintf(path,sizeof(path),"%lu",inode); + + if (!flag_all) { + if ((state == SS_UNCONNECTED) && (flags & SO_ACCEPTCON)) { +@@ -1195,7 +1399,7 @@ static void unix_do_one(int nr, const char *line) + ss_state = _("UNKNOWN"); + } + +- strcpy(ss_flags, "[ "); ++ safe_strncpy(ss_flags, "[ ", sizeof(ss_flags)); + if (flags & SO_ACCEPTCON) + strcat(ss_flags, "ACC "); + if (flags & SO_WAITDATA) +@@ -1208,12 +1412,15 @@ static void unix_do_one(int nr, const char *line) + printf("%-5s %-6ld %-11s %-10s %-13s ", + ss_proto, refcnt, ss_flags, ss_type, ss_state); + if (has & HAS_INODE) +- printf("%-6d ",inode); ++ printf("%-8lu",inode); + else +- printf("- "); ++ printf("- "); + if (flag_prg) +- printf("%-" PROGNAME_WIDTHs "s",(has & HAS_INODE?prg_cache_get(inode):"-")); +- puts(path); ++ printf(" %-" PROGNAME_WIDTHs "s",(has & HAS_INODE?prg_cache_get(inode):"-")); ++ if (flag_selinux) ++ printf(" %-" SELINUX_WIDTHs "s",(has & HAS_INODE?prg_cache_get_con(inode):"-")); ++ ++ printf(" %s\n", path); + } + + static int unix_info(void) +@@ -1229,12 +1436,13 @@ static int unix_info(void) + printf(_("(w/o servers)")); + } + +- printf(_("\nProto RefCnt Flags Type State I-Node")); ++ printf(_("\nProto RefCnt Flags Type State I-Node ")); + print_progname_banner(); ++ print_selinux_banner(); + printf(_(" Path\n")); /* xxx */ + + { +- INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one); ++ INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one, "unix"); + } + } + #endif +@@ -1256,7 +1464,7 @@ static int ax25_info(void) + N_("ESTABLISHED"), + N_("RECOVERY") + }; +- if (!(f = fopen(_PATH_PROCNET_AX25, "r"))) { ++ if (!(f = proc_fopen(_PATH_PROCNET_AX25))) { + if (errno != ENOENT) { + perror(_PATH_PROCNET_AX25); + return (-1); +@@ -1350,18 +1558,37 @@ static int ipx_info(void) + char sad[50], dad[50]; + struct sockaddr sa; + unsigned sport = 0, dport = 0; +- +- if (!(f = fopen(_PATH_PROCNET_IPX, "r"))) { +- if (errno != ENOENT) { +- perror(_PATH_PROCNET_IPX); +- return (-1); +- } +- if (flag_arg || flag_ver) +- ESYSNOT("netstat", "AF IPX"); +- if (flag_arg) +- return (1); +- else +- return (0); ++ struct stat s; ++ ++ f = proc_fopen(_PATH_PROCNET_IPX_SOCKET1); ++ if (!f) { ++ if (errno != ENOENT) { ++ perror(_PATH_PROCNET_IPX_SOCKET1); ++ return (-1); ++ } ++ f = proc_fopen(_PATH_PROCNET_IPX_SOCKET2); ++ ++ /* We need to check for directory */ ++ if (f) { ++ if (fstat (fileno(f), &s) == -1 || ++ !S_ISREG(s.st_mode)) { ++ fclose(f); ++ f=NULL; ++ } ++ } ++ ++ if (!f) { ++ if (errno != ENOENT) { ++ perror(_PATH_PROCNET_IPX_SOCKET2); ++ return (-1); ++ } ++ if (flag_arg || flag_ver) ++ ESYSNOT("netstat", "AF IPX"); ++ if (flag_arg) ++ return (1); ++ else ++ return (0); ++ } + } + printf(_("Active IPX sockets\nProto Recv-Q Send-Q Local Address Foreign Address State")); /* xxx */ + if (flag_exp > 1) +@@ -1369,19 +1596,22 @@ static int ipx_info(void) + printf("\n"); + if ((ap = get_afntype(AF_IPX)) == NULL) { + EINTERN("netstat.c", "AF_IPX missing"); ++ fclose(f); + return (-1); + } +- fgets(buf, 255, f); ++ if (fgets(buf, 255, f)) ++ /* eat line */; + + while (fgets(buf, 255, f) != NULL) { +- sscanf(buf, "%s %s %lX %lX %d %d", ++ sscanf(buf, "%s %s %lX %lX %u %u", + sad, dad, &txq, &rxq, &state, &uid); + if ((st = rindex(sad, ':'))) { + *st++ = '\0'; + sscanf(st, "%X", &sport); /* net byt order */ + sport = ntohs(sport); + } else { +- EINTERN("netstat.c", _PATH_PROCNET_IPX " sport format error"); ++ EINTERN("netstat.c", "ipx socket format error in source port"); ++ fclose(f); + return (-1); + } + nc = 0; +@@ -1391,7 +1621,8 @@ static int ipx_info(void) + sscanf(st, "%X", &dport); /* net byt order */ + dport = ntohs(dport); + } else { +- EINTERN("netstat.c", _PATH_PROCNET_IPX " dport format error"); ++ EINTERN("netstat.c", "ipx socket format error in destination port"); ++ fclose(f); + return (-1); + } + } else +@@ -1413,16 +1644,16 @@ static int ipx_info(void) + + /* Fetch and resolve the Source */ + (void) ap->input(4, sad, &sa); +- safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf)); ++ safe_strncpy(buf, ap->sprint(&sa, flag_not & FLAG_NUM_HOST), sizeof(buf)); + snprintf(sad, sizeof(sad), "%s:%04X", buf, sport); + + if (!nc) { + /* Fetch and resolve the Destination */ + (void) ap->input(4, dad, &sa); +- safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf)); ++ safe_strncpy(buf, ap->sprint(&sa, flag_not & FLAG_NUM_HOST), sizeof(buf)); + snprintf(dad, sizeof(dad), "%s:%04X", buf, dport); + } else +- strcpy(dad, "-"); ++ safe_strncpy(dad, "-", sizeof(dad)); + + printf("IPX %6ld %6ld %-26s %-26s %-5s", txq, rxq, sad, dad, st); + if (flag_exp > 1) { +@@ -1438,6 +1669,116 @@ static int ipx_info(void) + } + #endif + ++#if HAVE_AFBLUETOOTH ++const char *bluetooth_state(int state) ++{ ++ switch (state) { ++ case BT_CONNECTED: ++ return _("CONNECTED"); ++ case BT_OPEN: ++ return _("OPEN"); ++ case BT_BOUND: ++ return _("BOUND"); ++ case BT_LISTEN: ++ return _("LISTEN"); ++ case BT_CONNECT: ++ return _("CONNECT"); ++ case BT_CONNECT2: ++ return _("CONNECT2"); ++ case BT_CONFIG: ++ return _("CONFIG"); ++ case BT_DISCONN: ++ return _("DISCONN"); ++ case BT_CLOSED: ++ return _("CLOSED"); ++ default: ++ return _("UNKNOWN"); ++ } ++} ++ ++static void l2cap_do_one(int nr, const char *line, const char *prot) ++{ ++ char daddr[18], saddr[18]; ++ unsigned state, psm, dcid, scid, imtu, omtu, sec_level; ++ int num; ++ const char *bt_state, *bt_sec_level; ++ ++ num = sscanf(line, "%17s %17s %d %d 0x%04x 0x%04x %d %d %d", ++ daddr, saddr, &state, &psm, &dcid, &scid, &imtu, &omtu, &sec_level); ++ ++ if (num < 9) { ++ fprintf(stderr, _("warning, got bogus l2cap line.\n")); ++ return; ++ } ++ ++ if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND)) ++ return; ++ if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND)) ++ return; ++ ++ bt_state = bluetooth_state(state); ++ switch (sec_level) { ++ case BT_SECURITY_SDP: ++ bt_sec_level = _("SDP"); ++ break; ++ case BT_SECURITY_LOW: ++ bt_sec_level = _("LOW"); ++ break; ++ case BT_SECURITY_MEDIUM: ++ bt_sec_level = _("MEDIUM"); ++ break; ++ case BT_SECURITY_HIGH: ++ bt_sec_level = _("HIGH"); ++ break; ++ default: ++ bt_sec_level = _("UNKNOWN"); ++ } ++ ++ printf("l2cap %-17s %-17s %-9s %7d 0x%04x 0x%04x %7d %7d %-7s\n", ++ (strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr), ++ (strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr), ++ bt_state, psm, dcid, scid, imtu, omtu, bt_sec_level); ++} ++ ++static int l2cap_info(void) ++{ ++ printf("%-6s %-17s %-17s %-9s %7s %-6s %-6s %7s %7s %-7s\n", ++ "Proto", "Destination", "Source", "State", "PSM", "DCID", "SCID", "IMTU", "OMTU", "Security"); ++ INFO_GUTS(_PATH_SYS_BLUETOOTH_L2CAP, "AF BLUETOOTH", l2cap_do_one, "l2cap"); ++} ++ ++static void rfcomm_do_one(int nr, const char *line, const char *prot) ++{ ++ char daddr[18], saddr[18]; ++ unsigned state, channel; ++ int num; ++ const char *bt_state; ++ ++ num = sscanf(line, "%17s %17s %d %d", daddr, saddr, &state, &channel); ++ if (num < 4) { ++ fprintf(stderr, _("warning, got bogus rfcomm line.\n")); ++ return; ++ } ++ ++ if (flag_lst && !(state == BT_LISTEN || state == BT_BOUND)) ++ return; ++ if (!(flag_all || flag_lst) && (state == BT_LISTEN || state == BT_BOUND)) ++ return; ++ ++ bt_state = bluetooth_state(state); ++ printf("rfcomm %-17s %-17s %-9s %7d\n", ++ (strcmp (daddr, "00:00:00:00:00:00") == 0 ? "*" : daddr), ++ (strcmp (saddr, "00:00:00:00:00:00") == 0 ? "*" : saddr), ++ bt_state, channel); ++} ++ ++static int rfcomm_info(void) ++{ ++ printf("%-6s %-17s %-17s %-9s %7s\n", "Proto", "Destination", "Source", "State", "Channel"); ++ INFO_GUTS(_PATH_SYS_BLUETOOTH_RFCOMM, "AF BLUETOOTH", rfcomm_do_one, "rfcomm"); ++} ++#endif ++ + static int iface_info(void) + { + if (skfd < 0) { +@@ -1449,7 +1790,7 @@ static int iface_info(void) + } + if (flag_exp < 2) { + ife_short = 1; +- printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); ++ printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); + } + + if (for_all_interfaces(do_if_print, &flag_all) < 0) { +@@ -1457,7 +1798,7 @@ static int iface_info(void) + exit(1); + } + if (flag_cnt) +- free_interface_list(); ++ if_cache_free(); + else { + close(skfd); + skfd = -1; +@@ -1469,16 +1810,16 @@ static int iface_info(void) + + static void version(void) + { +- printf("%s\n%s\n%s\n%s\n", Release, Version, Signature, Features); ++ printf("%s\n%s\n%s\n", Release, Signature, Features); + exit(E_VERSION); + } + + + static void usage(void) + { +- fprintf(stderr, _("usage: netstat [-veenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}\n")); +- fprintf(stderr, _(" netstat [-vnNcaeol] [<Socket> ...]\n")); +- fprintf(stderr, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n\n")); ++ fprintf(stderr, _("usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}\n")); ++ fprintf(stderr, _(" netstat [-vWnNcaeol] [<Socket> ...]\n")); ++ fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n\n")); + + fprintf(stderr, _(" -r, --route display routing table\n")); + fprintf(stderr, _(" -i, --interfaces display interface table\n")); +@@ -1487,7 +1828,9 @@ static void usage(void) + #if HAVE_FW_MASQUERADE + fprintf(stderr, _(" -M, --masquerade display masqueraded connections\n\n")); + #endif ++ + fprintf(stderr, _(" -v, --verbose be verbose\n")); ++ fprintf(stderr, _(" -W, --wide don't truncate IP addresses\n")); + fprintf(stderr, _(" -n, --numeric don't resolve names\n")); + fprintf(stderr, _(" --numeric-hosts don't resolve host names\n")); + fprintf(stderr, _(" --numeric-ports don't resolve port names\n")); +@@ -1495,15 +1838,19 @@ static void usage(void) + fprintf(stderr, _(" -N, --symbolic resolve hardware names\n")); + fprintf(stderr, _(" -e, --extend display other/more information\n")); + fprintf(stderr, _(" -p, --programs display PID/Program name for sockets\n")); ++ fprintf(stderr, _(" -o, --timers display timers\n")); + fprintf(stderr, _(" -c, --continuous continuous listing\n\n")); + fprintf(stderr, _(" -l, --listening display listening server sockets\n")); +- fprintf(stderr, _(" -a, --all, --listening display all sockets (default: connected)\n")); +- fprintf(stderr, _(" -o, --timers display timers\n")); ++ fprintf(stderr, _(" -a, --all display all sockets (default: connected)\n")); + fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n")); +- fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n")); ++ fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n")); ++#if HAVE_SELINUX ++ fprintf(stderr, _(" -Z, --context display SELinux security context for sockets\n")); ++#endif + +- fprintf(stderr, _(" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n")); +- fprintf(stderr, _(" <AF>=Use '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF); ++ fprintf(stderr, _("\n <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); ++ fprintf(stderr, _(" {-x|--unix} --ax25 --ipx --netrom\n")); ++ fprintf(stderr, _(" <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF); + fprintf(stderr, _(" List of possible address families (which support routing):\n")); + print_aflist(1); /* 1 = routeable */ + exit(E_USAGE); +@@ -1514,7 +1861,7 @@ int main + (int argc, char *argv[]) { + int i; + int lop; +- struct option longopts[] = ++ static struct option longopts[] = + { + AFTRANS_OPTS, + {"version", 0, 0, 'V'}, +@@ -1526,9 +1873,13 @@ int main + #endif + {"protocol", 1, 0, 'A'}, + {"tcp", 0, 0, 't'}, ++ {"sctp", 0, 0, 'S'}, + {"udp", 0, 0, 'u'}, ++ {"udplite", 0, 0, 'U'}, + {"raw", 0, 0, 'w'}, + {"unix", 0, 0, 'x'}, ++ {"l2cap", 0, 0, '2'}, ++ {"rfcomm", 0, 0, 'f'}, + {"listening", 0, 0, 'l'}, + {"all", 0, 0, 'a'}, + {"timers", 0, 0, 'o'}, +@@ -1537,6 +1888,7 @@ int main + {"programs", 0, 0, 'p'}, + {"verbose", 0, 0, 'v'}, + {"statistics", 0, 0, 's'}, ++ {"wide", 0, 0, 'W'}, + {"numeric", 0, 0, 'n'}, + {"numeric-hosts", 0, 0, '!'}, + {"numeric-ports", 0, 0, '@'}, +@@ -1545,6 +1897,7 @@ int main + {"cache", 0, 0, 'C'}, + {"fib", 0, 0, 'F'}, + {"groups", 0, 0, 'g'}, ++ {"context", 0, 0, 'Z'}, + {NULL, 0, 0, 0} + }; + +@@ -1556,7 +1909,7 @@ int main + getroute_init(); /* Set up AF routing support */ + + afname[0] = '\0'; +- while ((i = getopt_long(argc, argv, "MCFA:acdegphinNorstuVv?wxl", longopts, &lop)) != EOF) ++ while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStuUvVWwx64?Z", longopts, &lop)) != EOF) + switch (i) { + case -1: + break; +@@ -1600,6 +1953,9 @@ int main + case 'i': + flag_int++; + break; ++ case 'W': ++ flag_wide++; ++ break; + case 'n': + flag_not |= FLAG_NUM; + break; +@@ -1624,6 +1980,14 @@ int main + case 'o': + flag_opt++; + break; ++ case '6': ++ if (aftrans_opt("inet6")) ++ exit(1); ++ break; ++ case '4': ++ if (aftrans_opt("inet")) ++ exit(1); ++ break; + case 'V': + version(); + /*NOTREACHED */ +@@ -1633,21 +1997,45 @@ int main + case 'r': + flag_rou++; + break; +- + case 't': + flag_tcp++; + break; +- ++ case 'S': ++ flag_sctp++; ++ break; + case 'u': + flag_udp++; + break; ++ case 'U': ++ flag_udplite++; ++ break; + case 'w': + flag_raw++; + break; ++ case '2': ++ flag_l2cap++; ++ break; ++ case 'f': ++ flag_rfcomm++; ++ break; + case 'x': + if (aftrans_opt("unix")) + exit(1); + break; ++ case 'Z': ++#if HAVE_SELINUX ++ if (is_selinux_enabled() <= 0) { ++ fprintf(stderr, _("SELinux is not enabled on this machine.\n")); ++ exit(1); ++ } ++ flag_prg++; ++ flag_selinux++; ++#else ++ fprintf(stderr, _("SELinux is not enabled for this application.\n")); ++ exit(1); ++#endif ++ ++ break; + case '?': + case 'h': + usage(); +@@ -1658,46 +2046,71 @@ int main + if (flag_int + flag_rou + flag_mas + flag_sta > 1) + usage(); + +- if ((flag_inet || flag_inet6 || flag_sta) && !(flag_tcp || flag_udp || flag_raw)) +- flag_tcp = flag_udp = flag_raw = 1; ++ if ((flag_inet || flag_inet6 || flag_sta) && ++ !(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw)) ++ flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; + +- if ((flag_tcp || flag_udp || flag_raw || flag_igmp) && !(flag_inet || flag_inet6)) ++ if ((flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw || flag_igmp) && ++ !(flag_inet || flag_inet6)) + flag_inet = flag_inet6 = 1; + +- flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx +- + flag_ax25 + flag_netrom + flag_igmp + flag_x25; ++ if (flag_bluetooth && !(flag_l2cap || flag_rfcomm)) ++ flag_l2cap = flag_rfcomm = 1; ++ ++ flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx ++ + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose ++ + flag_l2cap + flag_rfcomm; + + if (flag_mas) { + #if HAVE_FW_MASQUERADE && HAVE_AFINET + #if MORE_THAN_ONE_MASQ_AF + if (!afname[0]) +- strcpy(afname, DFLT_AF); ++ safe_strncpy(afname, DFLT_AF, sizeof(afname)); + #endif + for (;;) { + i = ip_masq_info(flag_not & FLAG_NUM_HOST, + flag_not & FLAG_NUM_PORT, flag_exp); + if (i || !flag_cnt) + break; +- sleep(1); ++ wait_continous(); + } + #else +- ENOSUPP("netstat.c", "FW_MASQUERADE"); ++ ENOSUPP("netstat", "FW_MASQUERADE"); + i = -1; + #endif + return (i); + } + + if (flag_sta) { +- inittab(); +- parsesnmp(flag_raw, flag_tcp, flag_udp); +- exit(0); ++ if (!afname[0]) ++ safe_strncpy(afname, DFLT_AF, sizeof(afname)); ++ ++ if (!strcmp(afname, "inet")) { ++#if HAVE_AFINET ++ inittab(); ++ parsesnmp(flag_raw, flag_tcp, flag_udp); ++#else ++ ENOSUPP("netstat", "AF INET"); ++#endif ++ } else if(!strcmp(afname, "inet6")) { ++#if HAVE_AFINET6 ++ inittab6(); ++ parsesnmp6(flag_raw, flag_tcp, flag_udp); ++#else ++ ENOSUPP("netstat", "AF INET6"); ++#endif ++ } else { ++ printf(_("netstat: No statistics support for specified address family: %s\n"), afname); ++ exit(1); ++ } ++ exit(0); + } +- ++ + if (flag_rou) { + int options = 0; + + if (!afname[0]) +- strcpy(afname, DFLT_AF); ++ safe_strncpy(afname, DFLT_AF, sizeof(afname)); + + if (flag_exp == 2) + flag_exp = 1; +@@ -1712,7 +2125,7 @@ int main + i = route_info(afname, options); + if (i || !flag_cnt) + break; +- sleep(1); ++ wait_continous(); + } + return (i); + } +@@ -1721,12 +2134,12 @@ int main + i = iface_info(); + if (!flag_cnt || i) + break; +- sleep(1); ++ wait_continous(); + } + return (i); + } + for (;;) { +- if (!flag_arg || flag_tcp || flag_udp || flag_raw) { ++ if (!flag_arg || flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw) { + #if HAVE_AFINET + prg_cache_load(); + printf(_("Active Internet connections ")); /* xxx */ +@@ -1743,6 +2156,7 @@ int main + if (flag_exp > 1) + printf(_(" User Inode ")); + print_progname_banner(); ++ print_selinux_banner(); + if (flag_opt) + printf(_(" Timer")); /* xxx */ + printf("\n"); +@@ -1759,11 +2173,25 @@ int main + if (i) + return (i); + } ++ ++ if (!flag_arg || flag_sctp) { ++ i = sctp_info(); ++ if (i) ++ return (i); ++ } ++ + if (!flag_arg || flag_udp) { + i = udp_info(); + if (i) + return (i); + } ++ ++ if (!flag_arg || flag_udplite) { ++ i = udplite_info(); ++ if (i) ++ return (i); ++ } ++ + if (!flag_arg || flag_raw) { + i = raw_info(); + if (i) +@@ -1845,9 +2273,55 @@ int main + } + #endif + } ++ if (!flag_arg || flag_rose) { ++#if 0 && HAVE_AFROSE ++ i = rose_info(); ++ if (i) ++ return (i); ++#else ++ if (flag_arg) { ++ i = 1; ++ ENOSUPP("netstat", "AF ROSE"); ++ } ++#endif ++ } ++ ++ if (!flag_arg || flag_l2cap || flag_rfcomm) { ++#if HAVE_AFBLUETOOTH ++ printf(_("Active Bluetooth connections ")); /* xxx */ ++ ++ if (flag_all) ++ printf(_("(servers and established)")); ++ else { ++ if (flag_lst) ++ printf(_("(only servers)")); ++ else ++ printf(_("(w/o servers)")); ++ } ++ printf("\n"); ++#else ++ if (flag_arg) { ++ i = 1; ++ ENOSUPP("netstat", "AF BLUETOOTH"); ++ } ++#endif ++ } ++#if HAVE_AFBLUETOOTH ++ if (!flag_arg || flag_l2cap) { ++ i = l2cap_info(); ++ if (i) ++ return (i); ++ } ++ if (!flag_arg || flag_rfcomm) { ++ i = rfcomm_info(); ++ if (i) ++ return (i); ++ } ++#endif ++ + if (!flag_cnt || i) + break; +- sleep(1); ++ wait_continous(); + prg_cache_clear(); + } + return (i); +diff --git a/plipconfig.c b/plipconfig.c +index 1f972a7..86fa890 100644 +--- a/plipconfig.c ++++ b/plipconfig.c +@@ -4,7 +4,7 @@ + Copyright (c) 1994 John Paul Morrison (VE7JPM). + + version 0.2 +- ++ + Changed by Alan Cox, to reflect the way SIOCDEVPRIVATE is meant to work + and for the extra parameter added by Niibe. + +@@ -42,31 +42,27 @@ + #include "intl.h" + #include "net-support.h" + #include "version.h" ++#include "util.h" + +-int opt_a = 0; +-int opt_i = 0; +-int opt_v = 0; + int skfd = -1; + + struct ifreq ifr; + struct plipconf *plip; + +-char *Release = RELEASE, +- *Version = "plipconfig 0.2", +- *Signature = "John Paul Morrison, Alan Cox et al."; ++static char *Release = RELEASE, *Signature = "John Paul Morrison, Alan Cox et al."; + + static void version(void) + { +- printf("%s\n%s\n%s\n", Release, Version, Signature); ++ printf("%s\n%s\n", Release, Signature); + exit(E_VERSION); + } + + void usage(void) + { +- fprintf(stderr, _("Usage: plipconfig [-a] [-i] [-v] interface\n")); +- fprintf(stderr, _(" [nibble NN] [trigger NN]\n")); ++ fprintf(stderr, _("Usage: plipconfig interface [nibble NN] [trigger NN]\n")); + fprintf(stderr, _(" plipconfig -V | --version\n")); +- exit(-1); ++ fprintf(stderr, _(" plipconfig -h | --help\n")); ++ exit(E_USAGE); + } + + void print_plip(void) +@@ -93,12 +89,10 @@ int main(int argc, char **argv) + argc--; + argv++; + while (argv[0] && *argv[0] == '-') { +- if (!strcmp(*argv, "-a")) +- opt_a = 1; +- if (!strcmp(*argv, "-v")) +- opt_v = 1; + if (!strcmp(*argv, "-V") || !strcmp(*argv, "--version")) + version(); ++ else ++ usage(); + argv++; + argc--; + } +@@ -107,7 +101,7 @@ int main(int argc, char **argv) + usage(); + + spp = argv; +- strncpy(ifr.ifr_name, *spp++, IFNAMSIZ); ++ safe_strncpy(ifr.ifr_name, *spp++, IFNAMSIZ); + plip=(struct plipconf *)&ifr.ifr_data; + + plip->pcmd = PLIP_GET_TIMEOUT; /* get current settings for device */ +diff --git a/po/Makefile b/po/Makefile +index 0fdf82d..c7f27fb 100644 +--- a/po/Makefile ++++ b/po/Makefile +@@ -3,16 +3,24 @@ INSTALL_PROGRAM= ${INSTALL} + INSTALL_DATA= ${INSTALL} -m 644 + INSTALLNLSDIR=${BASEDIR}/usr/share/locale + +-TUPDATE = tupdate ++TUPDATE = msgmerge + + NLSPACKAGE = net-tools + + -include ../config.make ++ALL_POS = $(wildcard *.po) ++ALL_LANGS = $(ALL_POS:%.po=%) ++ALL_CATALOGS = $(ALL_LANGS:%=%.mo) + ifeq ($(I18N),1) +-CATALOGS = de.mo fr.mo pt_BR.mo et_EE.mo cs.mo ++ifeq ($(LINGUAS),) ++LANGS = $(ALL_LANGS) + else +-CATALOGS = ++LANGS = $(filter $(LINGUAS),$(ALL_LANGS)) + endif ++else ++LANGS = ++endif ++CATALOGS = $(LANGS:%=%.mo) + + POTFILES=../arp.c ../hostname.c ../ifconfig.c ../netstat.c ../rarp.c \ + ../route.c ../plipconfig.c ../iptunnel.c ../statistics.c \ +@@ -44,12 +52,12 @@ $(NLSPACKAGE).pot: $(POTFILES) + + update-po: Makefile + $(MAKE) $(NLSPACKAGE).pot +- catalogs='$(CATALOGS)'; \ +- for cat in $$catalogs; do \ +- lang=`echo $$cat | sed 's/.mo//'`; \ ++ langs='$(ALL_LANGS)'; \ ++ for lang in $$langs; do \ ++ cat=$$lang.mo; \ + mv $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ +- if $(TUPDATE) $(NLSPACKAGE).pot $$lang.old.po > $$lang.po; then \ ++ if $(TUPDATE) $$lang.old.po $(NLSPACKAGE).pot > $$lang.po; then \ + rm -f $$lang.old.po; \ + else \ + echo "tupdate for $$cat failed!"; \ +@@ -61,18 +69,19 @@ update-po: Makefile + clean: + rm -f *mo + ++dist: $(ALL_CATALOGS) ++ + distclean: clean + rm -f .depend Makefile + + depend: + + install: $(CATALOGS) +- catalogs='$(CATALOGS)'; \ +- for n in $$catalogs; do \ +- l=`basename $$n .mo`; \ ++ langs='$(LANGS)'; \ ++ for l in $$langs; do \ + $(INSTALL) -m 755 -d $(INSTALLNLSDIR)/$$l; \ + $(INSTALL) -m 755 -d $(INSTALLNLSDIR)/$$l/LC_MESSAGES; \ +- $(INSTALL) -m 644 $$n $(INSTALLNLSDIR)/$$l/LC_MESSAGES/net-tools.mo; \ ++ $(INSTALL) -m 644 $$l.mo $(INSTALLNLSDIR)/$$l/LC_MESSAGES/net-tools.mo; \ + done + + %.mo: %.po +diff --git a/po/cs.po b/po/cs.po +index b4b66a1..c1d6a8a 100644 +--- a/po/cs.po ++++ b/po/cs.po +@@ -1,359 +1,385 @@ + # Czech translation of net-tools + # Copyright (C) 1999 Free Software Foundation, Inc. +-# Ji Pavlovsk <pavlovsk@ffcuni.cz>, 1999. ++# Jiří Pavlovský <pavlovsk@ffcuni.cz>, 1999. ++# Petr Pisar <petr.pisar@atlas.cz>, 2009. + # + msgid "" + msgstr "" +-"Project-Id-Version: net-tools-1.51\n" +-"POT-Creation-Date: 2000-02-14 02:31+0100\n" +-"PO-Revision-Date: 1999-08-29 23:20+0200\n" +-"Last-Translator: Ji Pavlovsk <pavlovsk@ff.cuni.cz>\n" +-"Language-Team: Czech <cs@li.org>\n" ++"Project-Id-Version: net-tools cvs-20090825\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-25 18:34+0200\n" ++"PO-Revision-Date: 2009-08-26 22:18+0200\n" ++"Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n" ++"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n" + "MIME-Version: 1.0\n" +-"Content-Type: text/plain; charset=iso-8859-2\n" ++"Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: ../arp.c:110 ../arp.c:269 ++#: ../arp.c:112 ../arp.c:279 ++#, c-format + msgid "arp: need host name\n" +-msgstr "arp: je teba jmno potae\n" ++msgstr "arp: je třeba jméno počítače\n" + +-#: ../arp.c:207 ../arp.c:221 ++#: ../arp.c:215 ../arp.c:230 + #, c-format + msgid "No ARP entry for %s\n" +-msgstr "Pro %s neexistuje ARP poloka\n" ++msgstr "Pro %s neexistuje ARP položka\n" + +-#: ../arp.c:239 ++#: ../arp.c:248 + #, c-format + msgid "arp: cant get HW-Address for `%s': %s.\n" + msgstr "arp: HW adresu `%s' nelze zjistit: %s\n" + +-#: ../arp.c:243 ++#: ../arp.c:252 ++#, c-format + msgid "arp: protocol type mismatch.\n" +-msgstr "arp: chybn zadan typ protokolu\n" ++msgstr "arp: chybně zadaný typ protokolu\n" + +-#: ../arp.c:252 ++#: ../arp.c:261 + #, c-format + msgid "arp: device `%s' has HW address %s `%s'.\n" +-msgstr "arp: zazen `%s' m Hw adresu %s `%s'.\n" ++msgstr "arp: zařízení `%s' má Hw adresu %s `%s'.\n" + +-#: ../arp.c:282 ++#: ../arp.c:293 ++#, c-format + msgid "arp: need hardware address\n" +-msgstr "arp: je teba hardwarov adresa\n" ++msgstr "arp: je třeba hardwarová adresa\n" + +-#: ../arp.c:290 ++#: ../arp.c:301 ++#, c-format + msgid "arp: invalid hardware address\n" +-msgstr "arp: nesprvn hardwarov adresa\n" ++msgstr "arp: nesprávná hardwarová adresa\n" + +-#: ../arp.c:387 ++#: ../arp.c:398 + #, c-format + msgid "arp: cannot open etherfile %s !\n" +-msgstr "arp: databzi ethernetovch adres %s nelze otevt!\n" ++msgstr "arp: databázi ethernetových adres %s nelze otevřít!\n" + +-#: ../arp.c:403 ++#: ../arp.c:414 + #, c-format + msgid "arp: format error on line %u of etherfile %s !\n" +-msgstr "arp: syntaktick chyba na dku %u databze ethernetovch adres %s!\n" ++msgstr "arp: syntaktická chyba na řádku %u databáze ethernetových adres %s!\n" + +-#: ../arp.c:416 ++#: ../arp.c:427 + #, c-format + msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "" +-"arp: poloku na dku %u databze ethernetovch adres %s nelze nastavit!\n" ++"arp: položku na řádku %u databáze ethernetových adres %s nelze nastavit!\n" ++ ++#: ../arp.c:448 ++#, c-format ++msgid "" ++"Address HWtype HWaddress Flags Mask " ++"Iface\n" ++msgstr "" ++"Adresa HWtyp HWadresa Příz. Maska " ++"Rozhr\n" + +-#: ../arp.c:437 +-msgid "Address\t\t\tHWtype\tHWaddress\t Flags Mask\t\t Iface\n" +-msgstr "Adresa\t\t\t HWtyp\t HWadresa\t Pz Maska\t\t Rozhran\n" ++#: ../arp.c:476 ++msgid "<from_interface>" ++msgstr "<z_rozhraní>" + +-#: ../arp.c:467 ++#: ../arp.c:478 + msgid "(incomplete)" +-msgstr "(nekompletn)" ++msgstr "(nekompletní)" + +-#: ../arp.c:484 ++#: ../arp.c:495 + #, c-format + msgid "%s (%s) at " + msgstr "%s (%s) na " + +-#: ../arp.c:490 ++#: ../arp.c:501 ++#, c-format + msgid "<incomplete> " +-msgstr "<nekompletn>" ++msgstr "<nekompletní>" + +-#: ../arp.c:496 ++#: ../arp.c:507 + #, c-format + msgid "netmask %s " +-msgstr "sov maska %s " ++msgstr "síťová maska %s " + +-#: ../arp.c:513 ++#: ../arp.c:524 + #, c-format + msgid "on %s\n" + msgstr "na %s\n" + +-#: ../arp.c:592 ++#: ../arp.c:605 + #, c-format + msgid "Entries: %d\tSkipped: %d\tFound: %d\n" +-msgstr "Poloky: %d\tVynechno: %d\tNalezeno: %d\n" ++msgstr "Položky: %d\tVynecháno: %d\tNalezeno: %d\n" + +-#: ../arp.c:596 ++#: ../arp.c:609 + #, c-format + msgid "%s (%s) -- no entry\n" +-msgstr "%s (%s) -- dn poloka\n" ++msgstr "%s (%s) -- žádná položka\n" + +-#: ../arp.c:598 ++#: ../arp.c:611 + #, c-format + msgid "arp: in %d entries no match found.\n" +-msgstr "arp: dn z poloek (%d) nevyhovuje.\n" ++msgstr "arp: žádná z položek (%d) nevyhovuje.\n" + +-#: ../arp.c:613 ++#: ../arp.c:626 ++#, c-format + msgid "" + "Usage:\n" + " arp [-vn] [<HW>] [-i <if>] [-a] [<hostname>] <-Display ARP " + "cache\n" + msgstr "" +-"Pouit:\n" +-" arp [-vn] [<HW>] [-i <if> [-a] [<pota>] <-Zobraz ARP " ++"Použití:\n" ++" arp [-vn] [<HW>] [-i <rozhraní>] [-a] [<počítač>] <-Zobrazí ARP " + "cache\n" + +-#: ../arp.c:614 ++#: ../arp.c:627 ++#, c-format + msgid "" +-" arp [-v] [-i <if>] -d <hostname> [pub][nopub] <-Delete ARP " ++" arp [-v] [-i <if>] -d <host> [pub] <-Delete ARP " + "entry\n" + msgstr "" +-" arp [-v] [-i <if>] -d <pota> [pub][nopub] <-Smae poloku " ++" arp [-v] [-i <rozhraní>] -d <počítač> [pub] <-Smaže položku " + "ARP\n" + +-#: ../arp.c:615 +-#, fuzzy ++#: ../arp.c:628 ++#, c-format + msgid "" +-" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from " ++" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from " + "file\n" + msgstr "" +-" arp [-vnD] [<HW>] [-i <if>] -f <soubor> <-Pid poloku " +-"ze\n" +-" souboru\n" ++" arp [-vnD] [<HW>] [-i <rozhraní>] -f [<soubor>] <-Přidá položku ze " ++"souboru\n" + +-#: ../arp.c:616 ++#: ../arp.c:629 ++#, c-format + msgid "" +-" arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [temp][nopub] <-Add " ++" arp [-v] [<HW>] [-i <if>] -s <host> <hwaddr> [temp] <-Add " + "entry\n" + msgstr "" +-" arp [-v] [<HW> [-i <if> -s <pota> <hwadr> [temp][nopub] <-Pid " +-"poloku\n" +- +-#: ../arp.c:617 +-msgid "" +-" arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [netmask <nm>] pub " +-"<-''-\n" +-msgstr "" +-" arp [-v] [<HW>] [-i <if>] -s <soubor> <hwadr> [smask <s>] <-''-\n" ++" arp [-v] [<HW>] [-i <rozhraní>] -s <počítač> <hwadr> [temp] <-Přidá " ++"položku\n" + +-#: ../arp.c:618 ++#: ../arp.c:630 ++#, c-format + msgid "" +-" arp [-v] [<HW>] [-i <if>] -Ds <hostname> <if> [netmask <nm>] pub " ++" arp [-v] [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub " + "<-''-\n" + "\n" + msgstr "" +-" arp [-v] [<HW> [-i <if> -Ds <pota> <if> [smask <s>] pub " +-"<-''-\n" ++" arp [-v] [<HW>] [-i <rozhraní>] -Ds <počítač> <rozhraní> [síťmask <čís>] " ++"pub\n" ++" <-Totéž\n" + +-#: ../arp.c:620 ++#: ../arp.c:632 ++#, c-format + msgid "" + " -a display (all) hosts in alternative (BSD) " + "style\n" + msgstr "" +-" -a zobraz jmna vech pota alternativnm\n" +-" (BSD) zpsobem\n" ++" -a zobrazí jména všech počítačů alternativním\n" ++" (BSD) způsobem\n" + +-#: ../arp.c:621 ++#: ../arp.c:633 ++#, c-format + msgid " -s, --set set a new ARP entry\n" +-msgstr " -s, --set nastav novou ARP poloku\n" ++msgstr " -s, --set nastaví novou ARP položku\n" + +-#: ../arp.c:622 ++#: ../arp.c:634 ++#, c-format + msgid " -d, --delete delete a specified entry\n" +-msgstr " -d, --delete smae zadanou ARP poloku\n" ++msgstr " -d, --delete smaže zadanou ARP položku\n" + +-#: ../arp.c:623 ../netstat.c:1436 ../route.c:85 ++#: ../arp.c:635 ../netstat.c:1520 ../route.c:86 ++#, c-format + msgid " -v, --verbose be verbose\n" + msgstr "" +-" -v, --verbose bude vypisovat podrobn zprvy\n" +-" o innosti\n" ++" -v, --verbose bude vypisovat podrobné zprávy o činnosti\n" + +-#: ../arp.c:624 ../netstat.c:1437 ../route.c:86 +-msgid " -n, --numeric dont resolve names\n" +-msgstr "" +-" -n, --numeric nebude pevdt seln adresy\n" +-" na kanonick jmna\n" ++#: ../arp.c:636 ../netstat.c:1522 ../route.c:87 ++#, c-format ++msgid " -n, --numeric don't resolve names\n" ++msgstr " -n, --numeric nebude převádět jména\n" + +-#: ../arp.c:625 ++#: ../arp.c:637 ++#, c-format + msgid "" + " -i, --device specify network interface (e.g. eth0)\n" +-msgstr " -i, --device zadv sov rozhran (nap. eth0)\n" ++msgstr " -i, --device zadává síťové rozhraní (např. eth0)\n" + +-#: ../arp.c:626 ++#: ../arp.c:638 ++#, c-format + msgid " -D, --use-device read <hwaddr> from given device\n" +-msgstr " -D, --use-device te <hwadr> ze zadanho zazen\n" ++msgstr " -D, --use-device čte <hwadr> ze zadaného zařízení\n" + +-#: ../arp.c:627 +-#, fuzzy ++#: ../arp.c:639 ++#, c-format + msgid " -A, -p, --protocol specify protocol family\n" +-msgstr " -r, --route vype smrovac tabulku\n" ++msgstr " -A, -p, --protocol určuje rodinu protokolů\n" + +-#: ../arp.c:628 +-#, fuzzy ++#: ../arp.c:640 ++#, c-format + msgid "" +-" -f, --file read new entries from file or from " +-"/etc/ethers\n" ++" -f, --file read new entries from file or from /etc/" ++"ethers\n" + "\n" + msgstr "" +-" -f, --file te nov poloky ze souboru\n" +-"\n" ++" -f, --file čte nové položky ze souboru nebo z /etc/" ++"ethers\n" + +-#: ../arp.c:630 ../rarp.c:181 ++#: ../arp.c:642 ../rarp.c:183 + #, c-format + msgid " <HW>=Use '-H <hw>' to specify hardware address type. Default: %s\n" + msgstr "" +-" <HW>=Pouijte '-H <hw> pro zadn hardwarovho typu adresy.\n" +-" Implicitn: %s\n" ++" <HW>=Použijte '-H <hw> pro zadání hardwarového typu adresy.\n" ++" Implicitně: %s\n" + +-#: ../arp.c:631 ../rarp.c:182 ++#: ../arp.c:643 ../rarp.c:184 ++#, c-format + msgid " List of possible hardware types (which support ARP):\n" +-msgstr " Seznam monch hardwarovch typ (podporujcch ARP):\n" ++msgstr " Seznam možných hardwarových typů (podporujících ARP):\n" + +-#: ../arp.c:664 ++#: ../arp.c:677 ../arp.c:762 + #, c-format + msgid "%s: hardware type not supported!\n" +-msgstr "hardwarov typ %s nen podporovn!\n" ++msgstr "hardwarový typ %s není podporován!\n" + +-#: ../arp.c:668 ++#: ../arp.c:681 + #, c-format + msgid "%s: address family not supported!\n" +-msgstr "tda adres %s nen podporovna!\n" ++msgstr "třída adres %s není podporována!\n" + +-#: ../arp.c:703 ++#: ../arp.c:716 ++#, c-format + msgid "arp: -N not yet supported.\n" +-msgstr "arp: pepna -N nen zatm podporovn\n" ++msgstr "arp: přepínač -N není zatím podporován\n" + +-#: ../arp.c:713 ++#: ../arp.c:726 + #, c-format + msgid "arp: %s: unknown address family.\n" +-msgstr "arp: neznm tda adres %s.\n" ++msgstr "arp: neznámá třída adres %s.\n" + +-#: ../arp.c:722 ++#: ../arp.c:735 + #, c-format + msgid "arp: %s: unknown hardware type.\n" +-msgstr "arp: neznm hardwarov typ %s.\n" ++msgstr "arp: neznámý hardwarový typ %s.\n" + +-#: ../arp.c:741 ++#: ../arp.c:754 + #, c-format + msgid "arp: %s: kernel only supports 'inet'.\n" +-msgstr "arp: %s: jdro podporuje pouze 'inet'.\n" ++msgstr "arp: %s: jádro podporuje pouze 'inet'.\n" + +-#: ../arp.c:746 ++#: ../arp.c:767 + #, c-format + msgid "arp: %s: hardware type without ARP support.\n" +-msgstr "arp: hardwarov typ %s nepodporuje ARP.\n" ++msgstr "arp: hardwarový typ %s nepodporuje ARP.\n" + +-#: ../hostname.c:69 ++#: ../hostname.c:71 + #, c-format + msgid "Setting nodename to `%s'\n" +-msgstr "Nastavuji jmno uzlu na `%s'\n" ++msgstr "Nastavuji jméno uzlu na `%s'\n" + +-#: ../hostname.c:74 ++#: ../hostname.c:76 + #, c-format + msgid "%s: you must be root to change the node name\n" +-msgstr "%s: jmno uzlu me zmnit pouze superuivatel\n" ++msgstr "%s: jméno uzlu může změnit pouze superuživatel\n" + +-#: ../hostname.c:77 ../hostname.c:97 ../hostname.c:116 ++#: ../hostname.c:79 ../hostname.c:100 ../hostname.c:118 + #, c-format + msgid "%s: name too long\n" +-msgstr "jmno %s je pli dlouh\n" ++msgstr "jméno %s je příliš dlouhé\n" + +-#: ../hostname.c:89 ++#: ../hostname.c:92 + #, c-format + msgid "Setting hostname to `%s'\n" +-msgstr "Nastavuji jmno potae na `%s'\n" ++msgstr "Nastavuji jméno počítače na `%s'\n" + +-#: ../hostname.c:94 ++#: ../hostname.c:97 + #, c-format + msgid "%s: you must be root to change the host name\n" +-msgstr "%s: jmno potae me zmnit pouze superuivatel\n" ++msgstr "%s: jméno počítače může změnit pouze superuživatel\n" + +-#: ../hostname.c:108 ++#: ../hostname.c:110 + #, c-format + msgid "Setting domainname to `%s'\n" +-msgstr "Nastavuji jmno domny na `%s'\n" ++msgstr "Nastavuji jméno domény na `%s'\n" + +-#: ../hostname.c:113 ++#: ../hostname.c:115 + #, c-format + msgid "%s: you must be root to change the domain name\n" +-msgstr "%s: jmno domny me zmnit pouze superuivatel\n" ++msgstr "%s: jméno domény může změnit pouze superuživatel\n" + +-#: ../hostname.c:131 ++#: ../hostname.c:132 + #, c-format + msgid "Resolving `%s' ...\n" +-msgstr "Vyhledvm `%s' ...\n" ++msgstr "Vyhledávám `%s' ...\n" + +-#: ../hostname.c:137 ++#: ../hostname.c:138 + #, c-format + msgid "Result: h_name=`%s'\n" +-msgstr "Vsledek: h_name=`%s'\n" ++msgstr "Výsledek: h_name=`%s'\n" + +-#: ../hostname.c:142 ++#: ../hostname.c:143 + #, c-format + msgid "Result: h_aliases=`%s'\n" +-msgstr "Vsledek: h_aliases=`%s'\n" ++msgstr "Výsledek: h_aliases=`%s'\n" + +-#: ../hostname.c:147 ++#: ../hostname.c:148 + #, c-format + msgid "Result: h_addr_list=`%s'\n" +-msgstr "Vsledek: h_addr_list=`%s'\n" ++msgstr "Výsledek: h_addr_list=`%s'\n" + + #: ../hostname.c:209 + #, c-format + msgid "%s: can't open `%s'\n" +-msgstr "%s: `%s' nelze otevt\n" ++msgstr "%s: `%s' nelze otevřít\n" + + #: ../hostname.c:223 ++#, c-format + msgid "Usage: hostname [-v] {hostname|-F file} set hostname (from file)\n" + msgstr "" +-"Pouit:\n" +-" hostname [-v] {jmno|-F soubor} nastav jmno potae (ze " ++"Použití:\n" ++" hostname [-v] {jméno|-F soubor} nastaví jméno počítače (ze " + "souboru)\n" + + #: ../hostname.c:224 ++#, c-format + msgid "" + " domainname [-v] {nisdomain|-F file} set NIS domainname (from file)\n" + msgstr "" +-" domainname [-v] {jmno|-F soubor} nastav jmno NIS domny (ze\n" ++" domainname [-v] {jméno|-F soubor} nastaví jméno NIS domény (ze\n" + " souboru)\n" + + #: ../hostname.c:226 ++#, c-format + msgid "" + " nodename [-v] {nodename|-F file} set DECnet node name (from " + "file)\n" + msgstr "" +-" nodename [-v] {jmno|-F soubor} nastav jmno DECnet uzlu (ze\n" ++" nodename [-v] {jméno|-F soubor} nastaví jméno DECnet uzlu (ze\n" + " souboru)\n" + + #: ../hostname.c:228 ++#, c-format + msgid " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] display formatted name\n" +-msgstr " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] vype formtovan jmno\n" ++msgstr " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] vypíše formátované jméno\n" + + #: ../hostname.c:229 ++#, c-format + msgid "" + " hostname [-v] display hostname\n" + "\n" + msgstr "" +-" hostname [-v] vype jmno potae\n" ++" hostname [-v] vypíše jméno počítače\n" + "\n" + + #: ../hostname.c:230 ++#, c-format + msgid "" + " hostname -V|--version|-h|--help print info and exit\n" + "\n" + msgstr "" +-" hostname -V|--version|-h|--help vype informace a skon\n" ++" hostname -V|--version|-h|--help vypíše informace a skončí\n" + "\n" + + #: ../hostname.c:231 ++#, c-format + msgid "" + " dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n" + "\n" +@@ -362,42 +388,51 @@ msgstr "" + "\n" + + #: ../hostname.c:232 ++#, c-format + msgid " -s, --short short host name\n" +-msgstr " -s, --short krtk jmno potae\n" ++msgstr " -s, --short krátké jméno počítače\n" + + #: ../hostname.c:233 ++#, c-format + msgid " -a, --alias alias names\n" +-msgstr " -a, --alias pezdvky\n" ++msgstr " -a, --alias přezdívky\n" + + #: ../hostname.c:234 ++#, c-format + msgid " -i, --ip-address addresses for the hostname\n" +-msgstr " -i, --ip-address adresy odpovdajc jmnu potae\n" ++msgstr " -i, --ip-address adresy odpovídající jménu počítače\n" + + #: ../hostname.c:235 ++#, c-format + msgid " -f, --fqdn, --long long host name (FQDN)\n" +-msgstr " -f, --fqdn, --long dlouh jmno potae (kanonick)\n" ++msgstr " -f, --fqdn, --long dlouhé jméno počítače (kanonické)\n" + + #: ../hostname.c:236 ++#, c-format + msgid " -d, --domain DNS domain name\n" +-msgstr " -d, --domain jmno DNS domny\n" ++msgstr " -d, --domain jméno DNS domény\n" + + #: ../hostname.c:237 ++#, c-format + msgid " -y, --yp, --nis NIS/YP domainname\n" +-msgstr " -y, --yp, --nis jmno NIS/YP domny\n" ++msgstr " -y, --yp, --nis jméno NIS/YP domény\n" + + #: ../hostname.c:239 ++#, c-format + msgid " -n, --node DECnet node name\n" +-msgstr " -n, --node jmno DECnet uzlu\n" ++msgstr " -n, --node jméno DECnet uzlu\n" + + #: ../hostname.c:241 ++#, c-format + msgid "" + " -F, --file read hostname or NIS domainname from given file\n" + "\n" + msgstr "" +-" -F, --file te jmno potae i nis domny ze souboru\n" ++" -F, --file čte jméno počítače či nis domény ze souboru\n" + "\n" + + #: ../hostname.c:243 ++#, c-format + msgid "" + " This command can read or set the hostname or the NIS domainname. You can\n" + " also read the DNS domain or the FQDN (fully qualified domain name).\n" +@@ -405,931 +440,929 @@ msgid "" + " FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n" + " part of the FQDN) in the /etc/hosts file.\n" + msgstr "" ++" Tento příkaz může přečíst nebo nastavit název stroje nebo doménové jméno\n" ++" NIS. Načíst lze rovněž DNS doménu nebo FQDN (plně kvalifikované doménové\n" ++" jméno). Pokud pro vyhledávání strojů nepoužíváte bind nebo NIS, můžete\n" ++" změnit FQDN (Fully Qualified Domain Name) a doménové jméno DNS (což je\n" ++" část FQDN) v souboru /etc/hosts.\n" + +-#: ../hostname.c:338 ++#: ../hostname.c:340 + #, c-format + msgid "%s: You can't change the DNS domain name with this command\n" +-msgstr "%s: Tmto pkazem nelze DNS jmno domny zmnit\n" ++msgstr "%s: Tímto příkazem nelze DNS jméno domény změnit\n" + +-#: ../hostname.c:339 ++#: ../hostname.c:341 ++#, c-format + msgid "" + "\n" + "Unless you are using bind or NIS for host lookups you can change the DNS\n" + msgstr "" + "\n" +-"Pokud nepouvte bind i NIS pro vyhledvn jmen pota, pak mete " +-"zmnit\n" ++"Pokud nepoužíváte bind či NIS pro vyhledávání jmen počítačů, pak můžete " ++"změnit\n" + +-#: ../hostname.c:340 ++#: ../hostname.c:342 ++#, c-format + msgid "domain name (which is part of the FQDN) in the /etc/hosts file.\n" + msgstr "" +-"DNS jmno domny (je soust kanonickho jmna potae) v souboru\n" ++"DNS jméno domény (je součástí kanonického jména počítače) v souboru\n" + "/etc/hosts\n" + +-#: ../hostname.c:357 ++#: ../hostname.c:359 + #, c-format + msgid "gethostname()=`%s'\n" + msgstr "gethostname()=`%s'\n" + +-#: ../hostname.c:374 ++#: ../hostname.c:376 + #, c-format + msgid "getdomainname()=`%s'\n" + msgstr "getdomainname()=`%s'\n" + +-#: ../hostname.c:389 ++#: ../hostname.c:391 + #, c-format + msgid "getnodename()=`%s'\n" + msgstr "getnodename()=`%s'\n" + +-#: ../ifconfig.c:159 +-#, c-format +-msgid "%-9.9s Link encap:%s " +-msgstr "%-9.9s Zapouzden:%s " +- +-#: ../ifconfig.c:164 ++#: ../ifconfig.c:107 ../netstat.c:1482 + #, c-format +-msgid "HWaddr %s " +-msgstr "HWadr %s " ++msgid "" ++"Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " ++"Flg\n" ++msgstr "" ++"Rozhr MTU Met PŘ-OK PŘ-CHYB PŘ-ZAH PŘ-PŘT OD-OK OD-CHYB OD-ZAH OD-PŘT " ++"Přízn\n" + +-#: ../ifconfig.c:167 ++#: ../ifconfig.c:132 ../ifconfig.c:164 + #, c-format +-msgid "Media:%s" +-msgstr "Mdium:%s" ++msgid "%s: ERROR while getting interface flags: %s\n" ++msgstr "%s: CHYBA při získávání příznaků rozhraní: %s\n" + +-#: ../ifconfig.c:169 +-msgid "(auto)" +-msgstr "(auto)" +- +-#: ../ifconfig.c:176 ++#: ../ifconfig.c:156 ../ifconfig.c:188 ../ifconfig.c:794 ../ifconfig.c:887 ++#: ../ifconfig.c:1000 + #, c-format +-msgid " %s addr:%s " +-msgstr " %s adr:%s " ++msgid "No support for INET on this system.\n" ++msgstr "Tento systém nepodporuje INET.\n" + +-#: ../ifconfig.c:179 ++#: ../ifconfig.c:196 + #, c-format +-msgid " P-t-P:%s " +-msgstr " P-t-P:%s " ++msgid "%s: ERROR while testing interface flags: %s\n" ++msgstr "%s: CHYBA při zkoušení příznaků rozhraní: %s\n" + +-# V ostatnch katalozch se pekld Broadcast -> vesmrov vysln. +-# Tudi bcast -> Vesmr :) +-#: ../ifconfig.c:182 ++#: ../ifconfig.c:205 + #, c-format +-msgid " Bcast:%s " +-msgstr " Vesmr:%s " ++msgid "" ++"Usage:\n" ++" ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]\n" ++msgstr "" ++"Použití:\n" ++" ifconfig [-a] [-v] [-s] <rozhraní> [[<AF>] <adresa>]\n" + +-#: ../ifconfig.c:184 ++#: ../ifconfig.c:207 + #, c-format +-msgid " Mask:%s\n" +-msgstr "Maska:%s\n" ++msgid " [add <address>[/<prefixlen>]]\n" ++msgstr " [add <adresa>[/<délka prefixu>]]\n" + +-#: ../ifconfig.c:201 ++#: ../ifconfig.c:208 + #, c-format +-msgid " inet6 addr: %s/%d" +-msgstr " inet6-adr: %s/%d" +- +-#: ../ifconfig.c:203 +-msgid " Scope:" +-msgstr " Rozsah:" +- +-#: ../ifconfig.c:206 +-msgid "Global" +-msgstr "Globl" ++msgid " [del <address>[/<prefixlen>]]\n" ++msgstr " [del <adresa>[/<délka prefixu>]]\n" + + #: ../ifconfig.c:209 +-msgid "Link" +-msgstr "Linka" +- +-#: ../ifconfig.c:212 +-msgid "Site" +-msgstr "Stanovit" +- +-#: ../ifconfig.c:215 +-msgid "Compat" +-msgstr "Kompatibilita" +- +-#: ../ifconfig.c:218 +-msgid "Host" +-msgstr "Pota" +- +-#: ../ifconfig.c:221 +-msgid "Unknown" +-msgstr "Neznm." +- +-#: ../ifconfig.c:236 +-#, c-format +-msgid " IPX/Ethernet II addr:%s\n" +-msgstr " IPX/Ethernet II adr: %s\n" +- +-#: ../ifconfig.c:239 + #, c-format +-msgid " IPX/Ethernet SNAP addr:%s\n" +-msgstr " IPX/Ethernet SNAP adr:%s\n" +- +-#: ../ifconfig.c:242 +-#, c-format +-msgid " IPX/Ethernet 802.2 addr:%s\n" +-msgstr " IPX/Ethernet 802.2 adr:%s\n" ++msgid " [[-]broadcast [<address>]] [[-]pointopoint [<address>]]\n" ++msgstr " [[-]broadcast [<adresa>]] [[-]pointopoint [<adresa>]]\n" + +-#: ../ifconfig.c:245 ++#: ../ifconfig.c:210 + #, c-format +-msgid " IPX/Ethernet 802.3 addr:%s\n" +-msgstr " IPX/Ethernet 802.3 adr:%s\n" ++msgid " [netmask <address>] [dstaddr <address>] [tunnel <address>]\n" ++msgstr " [netmask <adresa>] [dstaddr <adresa>] [tunnel <adresa>]\n" + +-#: ../ifconfig.c:255 ++#: ../ifconfig.c:213 + #, c-format +-msgid " EtherTalk Phase 2 addr:%s\n" +-msgstr " EtherTalk Phase 2 adr:%s\n" ++msgid " [outfill <NN>] [keepalive <NN>]\n" ++msgstr " [outfill <NN>] [keepalive <NN>]\n" + +-#: ../ifconfig.c:264 ++#: ../ifconfig.c:215 + #, c-format +-msgid " econet addr:%s\n" +-msgstr " econet adr:%s\n" +- +-# Hic sunt leones ... +-#: ../ifconfig.c:270 +-msgid "[NO FLAGS] " +-msgstr "[DN PZNAKY]" +- +-#: ../ifconfig.c:272 +-msgid "UP " +-msgstr "AKTIVOVNO " +- +-#: ../ifconfig.c:274 +-msgid "BROADCAST " +-msgstr "VESMROV_VYSLN " +- +-#: ../ifconfig.c:276 +-msgid "DEBUG " +-msgstr "DEBUG " +- +-#: ../ifconfig.c:278 +-msgid "LOOPBACK " +-msgstr "SMYKA " +- +-#: ../ifconfig.c:280 +-msgid "POINTOPOINT " +-msgstr "POINTOPOINT " +- +-# ?? +-#: ../ifconfig.c:282 +-msgid "NOTRAILERS " +-msgstr "NOTRAILERS " +- +-#: ../ifconfig.c:284 +-msgid "RUNNING " +-msgstr "B̮ " +- +-#: ../ifconfig.c:286 +-msgid "NOARP " +-msgstr "NEARP " +- +-#: ../ifconfig.c:288 +-msgid "PROMISC " +-msgstr "PROMISK " +- +-#: ../ifconfig.c:290 +-msgid "ALLMULTI " +-msgstr "ALLMULTI " +- +-#: ../ifconfig.c:292 +-msgid "SLAVE " +-msgstr "SLAVE " +- +-#: ../ifconfig.c:294 +-msgid "MASTER " +-msgstr "MASTER " +- +-#: ../ifconfig.c:296 +-msgid "MULTICAST " +-msgstr "MULTICAST " +- +-#: ../ifconfig.c:299 +-msgid "DYNAMIC " +-msgstr "DYNAMIC " ++msgid " [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n" ++msgstr " [hw <HW> <adresa>] [metric <NN>] [mtu <NN>]\n" + +-#: ../ifconfig.c:302 ++#: ../ifconfig.c:216 + #, c-format +-msgid " MTU:%d Metric:%d" +-msgstr " MTU:%d Metrika:%d" ++msgid " [[-]trailers] [[-]arp] [[-]allmulti]\n" ++msgstr " [[-]trailers] [[-]arp] [[-]allmulti]\n" + +-#: ../ifconfig.c:306 ++#: ../ifconfig.c:217 + #, c-format +-msgid " Outfill:%d Keepalive:%d" +-msgstr " Outfill:%d Keepalive:%d" ++msgid " [multicast] [[-]promisc]\n" ++msgstr " [multicast] [[-]promisc]\n" + +-#: ../ifconfig.c:320 ++#: ../ifconfig.c:218 + #, c-format +-msgid "RX packets:%lu errors:%lu dropped:%lu overruns:%lu frame:%lu\n" +-msgstr "pijmutch paket:%lu chyb:%lu zahozeno:%lu peteen:%lu rmc:%lu\n" ++msgid " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n" ++msgstr " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <typ>]\n" + +-#: ../ifconfig.c:325 ++#: ../ifconfig.c:220 + #, c-format +-msgid " compressed:%lu\n" +-msgstr " komprimovno:%lu\n" ++msgid " [txqueuelen <NN>]\n" ++msgstr " [txqueuelen délka]\n" + +-# carrier? +-#: ../ifconfig.c:329 ++#: ../ifconfig.c:223 + #, c-format +-msgid "TX packets:%lu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n" +-msgstr "odeslanch paket:%lu chyb:%lu zahozeno:%lu peteen:%lu penos:%lu\n" ++msgid " [[-]dynamic]\n" ++msgstr " [[-]dynamic]\n" + +-#: ../ifconfig.c:333 ++#: ../ifconfig.c:225 + #, c-format +-msgid " collisions:%lu " +-msgstr " koliz:%lu " ++msgid "" ++" [up|down] ...\n" ++"\n" ++msgstr "" ++" [up|down] ...\n" ++"\n" + +-#: ../ifconfig.c:335 ++#: ../ifconfig.c:227 + #, c-format +-msgid "compressed:%lu " +-msgstr "komprimovno:%lu " ++msgid " <HW>=Hardware Type.\n" ++msgstr " <HW> = Hardwarový Typ.\n" + +-#: ../ifconfig.c:337 ++#: ../ifconfig.c:228 + #, c-format +-msgid "txqueuelen:%d " +-msgstr "dlka odchoz fronty:%d " ++msgid " List of possible hardware types:\n" ++msgstr " Seznam možných hardwarových typů:\n" + +-#: ../ifconfig.c:345 ++#. 1 = ARPable ++#: ../ifconfig.c:230 + #, c-format +-msgid "Interrupt:%d " +-msgstr "Peruen:%d " ++msgid " <AF>=Address family. Default: %s\n" ++msgstr " <AF> = Třída adres. Implicitní: %s\n" + +-#. Only print devices using it for +-#. I/O maps +-#: ../ifconfig.c:348 ++#: ../ifconfig.c:231 + #, c-format +-msgid "Base address:0x%x " +-msgstr "Vstupn/Vstupn port:0x%x " ++msgid " List of possible address families:\n" ++msgstr " Seznam možných tříd adres:\n" + +-#: ../ifconfig.c:350 ++#: ../ifconfig.c:307 + #, c-format +-msgid "Memory:%lx-%lx " +-msgstr "Pam:%lx-%lx " ++msgid "ifconfig: option `%s' not recognised.\n" ++msgstr "ifconfig: přepínač „%s“ nebyl rozpoznán.\n" + +-#: ../ifconfig.c:353 ++#: ../ifconfig.c:309 ../ifconfig.c:990 + #, c-format +-msgid "DMA chan:%x " +-msgstr "Kanl DMA:%x " ++msgid "ifconfig: `--help' gives usage information.\n" ++msgstr "ifconfig: návod na použití lze získat pomocí „--help“\n" + +-#: ../ifconfig.c:384 ../ifconfig.c:405 ++#: ../ifconfig.c:384 + #, c-format +-msgid "%s: unknown interface: %s\n" +-msgstr "%s: rozhran %s nen znmo\n" ++msgid "Unknown media type.\n" ++msgstr "Neznámý typ média.\n" + + #: ../ifconfig.c:421 ++#, c-format + msgid "" +-"Usage:\n" +-" ifconfig [-a] [-i] [-v] <interface> [[<AF>] <address>]\n" ++"Warning: Interface %s still in promisc mode... maybe other application is " ++"running?\n" + msgstr "" +-"Pouit:\n" +-" ifconfig [-a] [-i] [-v] <rozhran> [[<AF>] <adresa>]\n" +- +-#: ../ifconfig.c:425 +-msgid " [add <address>[/<prefixlen>]]\n" +-msgstr " [add <adresa>[/<dlka prefixu>]]\n" +- +-#: ../ifconfig.c:427 +-msgid " [del <address>[/<prefixlen>]]\n" +-msgstr " [del <adresa>[/<dlka prefixu>]]\n" +- +-#: ../ifconfig.c:432 +-msgid " [[-]broadcast [<address>]] [[-]pointopoint [<address>]]\n" +-msgstr " [[-]broadcast [<adresa>]] [[-]pointopoint [<adresa>]]\n" ++"Pozor: Rozhraní %s je stále v promiskuitním režimu. Neběží jiná aplikace?\n" + + #: ../ifconfig.c:433 +-msgid " [netmask <address>] [dstaddr <address>] [tunnel <address>]\n" +-msgstr " [netmask <adresa>] [dstaddr <adresa>] [tunnel <adresa>]\n" +- +-#: ../ifconfig.c:436 +-msgid " [outfill <NN>] [keepalive <NN>]\n" +-msgstr " [outfill <NN>] [keepalive <NN>]\n" ++#, c-format ++msgid "Warning: Interface %s still in MULTICAST mode.\n" ++msgstr "Pozor: Rozhraní %s je stále v režimu MULTICAST.\n" + +-#: ../ifconfig.c:438 +-msgid " [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n" +-msgstr " [hw <HW> <adresa>] [metric <NN>] [mtu <NN>]\n" ++#: ../ifconfig.c:445 ++#, c-format ++msgid "Warning: Interface %s still in ALLMULTI mode.\n" ++msgstr "Pozor: Rozhraní %s je stále v režimu ALLMULTI.\n" + +-#: ../ifconfig.c:439 +-msgid " [[-]trailers] [[-]arp] [[-]allmulti]\n" +-msgstr " [[-]trailers] [[-]arp] [[-]allmulti]\n" ++#: ../ifconfig.c:469 ++#, c-format ++msgid "Warning: Interface %s still in DYNAMIC mode.\n" ++msgstr "Pozor: Rozhraní %s je stále v režimu DYNAMIC.\n" + +-#: ../ifconfig.c:440 +-msgid " [multicast] [[-]promisc]\n" +-msgstr " [multicast] [[-]promisc]\n" ++#: ../ifconfig.c:527 ++#, c-format ++msgid "Warning: Interface %s still in BROADCAST mode.\n" ++msgstr "Pozor: Rozhraní %s je stále v režimu VŠESMĚR.\n" + +-#: ../ifconfig.c:441 +-msgid " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n" +-msgstr " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <typ>]\n" ++#: ../ifconfig.c:538 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for broadcast\n" ++msgstr "ifconfig: Chyba při překládání „%s“ pro všesměr\n" + +-#: ../ifconfig.c:443 +-msgid " [txqueuelen <NN>]\n" +-msgstr " [txqueuelen dlka]\n" ++#: ../ifconfig.c:563 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for dstaddr\n" ++msgstr "ifconfig: Chyba při překládání „%s“ pro adresu cíle\n" + +-#: ../ifconfig.c:446 +-msgid " [[-]dynamic]\n" +-msgstr " [[-]dynamic]\n" ++#: ../ifconfig.c:586 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for netmask\n" ++msgstr "ifconfig: Chyba při překládání „%s“ pro masku sítě\n" + +-#: ../ifconfig.c:448 +-msgid "" +-" [up|down] ...\n" +-"\n" +-msgstr "" +-" [up|down] ...\n" +-"\n" ++#: ../ifconfig.c:665 ++#, c-format ++msgid "Warning: Interface %s still in POINTOPOINT mode.\n" ++msgstr "Pozor: Rozhraní %s je stále v DVOUBODOVÉM režimu.\n" + +-#: ../ifconfig.c:450 +-msgid " <HW>=Hardware Type.\n" +-msgstr " <HW>=Hardwarov Typ.\n" ++#: ../ifconfig.c:676 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for pointopoint\n" ++msgstr "ifconfig: Chyba při překládání „%s“ pro dvoubodové nastavení\n" + +-#: ../ifconfig.c:451 +-msgid " List of possible hardware types:\n" +-msgstr " Seznam monch hardwarovch typ:\n" ++#: ../ifconfig.c:700 ++#, c-format ++msgid "hw address type `%s' has no handler to set address. failed.\n" ++msgstr "" ++"Pro typ hardwarové adresy „%s“ neexistuje obsluha na nastavování adresy.\n" ++"Operace selhala.\n" + +-#. 1 = ARPable +-#: ../ifconfig.c:453 ++#: ../ifconfig.c:709 + #, c-format +-msgid " <AF>=Address family. Default: %s\n" +-msgstr " <AF>=tda adres. Implicitn: %s\n" ++msgid "%s: invalid %s address.\n" ++msgstr "%s: adresa %s je nesprávná.\n" + +-#: ../ifconfig.c:454 +-msgid " List of possible address families:\n" +-msgstr " Seznam monch td adres:\n" ++#: ../ifconfig.c:749 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for add\n" ++msgstr "ifconfig: Chyba při překládání „%s“ pro adresu\n" + +-#: ../ifconfig.c:593 +-msgid "Unknown media type.\n" +-msgstr "Neznm typ mdia.\n" ++#: ../ifconfig.c:760 ../ifconfig.c:850 ../ifconfig.c:938 ++#, c-format ++msgid "No support for INET6 on this system.\n" ++msgstr "Tento systém nepodporuje INET6.\n" + +-#: ../ifconfig.c:881 ++#: ../ifconfig.c:803 ../ifconfig.c:896 + #, c-format +-msgid "%s: invalid %s address.\n" +-msgstr "%s: adresa %s je nesprvn.\n" ++msgid "Interface %s not initialized\n" ++msgstr "Rozhraní %s není inicializováno\n" + +-#: ../ifconfig.c:920 ../ifconfig.c:963 ../ifconfig.c:1011 +-msgid "No support for INET6 on this system.\n" +-msgstr "Tento systm nepodporuje INET6.\n" ++#: ../ifconfig.c:815 ../ifconfig.c:907 ++#, c-format ++msgid "Bad address.\n" ++msgstr "Chybná adresa.\n" + +-#: ../ifconfig.c:983 ++#: ../ifconfig.c:910 ++#, c-format + msgid "Address deletion not supported on this system.\n" +-msgstr "Tento systm nepodporuje mazn adres.\n" ++msgstr "Tento systém nepodporuje mazání adres.\n" + +-#: ../ifconfig.c:1066 +-msgid "No support for INET on this system.\n" +-msgstr "Tento systm nepodporuje INET.\n" ++#: ../ifconfig.c:982 ++#, c-format ++msgid "ifconfig: Cannot set address for this protocol family.\n" ++msgstr "ifconfig: Pro tuto rodinu protokolů nelze nastavit adresu.\n" ++ ++#: ../ifconfig.c:989 ++#, c-format ++msgid "ifconfig: error resolving '%s' to set address for af=%s\n" ++msgstr "ifconfig: chyba při překládání „%s“ za účelem nastavení adresy AF=%s\n" + +-#: ../ifconfig.c:1076 ++#: ../ifconfig.c:1010 ++#, c-format + msgid "No support for ECONET on this system.\n" +-msgstr "Tento systm nepodporuje ECONET.\n" ++msgstr "Tento systém nepodporuje ECONET.\n" + +-#: ../ifconfig.c:1084 ++#: ../ifconfig.c:1018 + #, c-format + msgid "Don't know how to set addresses for family %d.\n" +-msgstr "Nevm, jak nastavit adresu tdy %d.\n" ++msgstr "Nevím, jak nastavit adresu třídy %d.\n" ++ ++#: ../ifconfig.c:1053 ++#, c-format ++msgid "WARNING: at least one error occured. (%d)\n" ++msgstr "POZOR: Vyskytla se alespoň jedna chyba. (%d)\n" + +-#: ../netstat.c:383 ++#: ../netstat.c:434 + #, c-format + msgid "" + "(No info could be read for \"-p\": geteuid()=%d but you should be root.)\n" + msgstr "" +-"(Pro \"-p\" nelze zskat dn informace: geteuid()=%d, ale je teba, aby " ++"(Pro \"-p\" nelze získat žádné informace: geteuid()=%d, ale je třeba, aby " + "jste\n" +-"byl superuivatelem)\n" ++"byl superuživatelem)\n" + +-#: ../netstat.c:387 ++#: ../netstat.c:438 ++#, c-format + msgid "" + "(Not all processes could be identified, non-owned process info\n" + " will not be shown, you would have to be root to see it all.)\n" + msgstr "" +-"(Vechny procesy nemohly bt identifikovny. Budou vypsany informace\n" +-"pouze o procesech, jich jste vlastnkem. Aby jste mohl vidt ve, musel\n" +-"byste bt superuivatelem.)\n" ++"(Všechny procesy nemohly být identifikovány. Budou vypsány informace\n" ++"pouze o procesech, jichž jste vlastníkem. Aby jste mohl vidět vše, musel\n" ++"byste být superuživatelem.)\n" + +-#: ../netstat.c:394 ../netstat.c:1089 ../netstat.c:1166 ++#: ../netstat.c:445 ../netstat.c:1186 ../netstat.c:1264 + msgid "LISTENING" +-msgstr "NASLOUCH" ++msgstr "NASLOUCHÁ" + +-#: ../netstat.c:395 ++#: ../netstat.c:446 + msgid "CONN SENT" +-msgstr "CONN ODESLN" ++msgstr "CONN ODESLÁN" + +-#: ../netstat.c:396 ../netstat.c:1168 ++#: ../netstat.c:447 ../netstat.c:1266 + msgid "DISC SENT" +-msgstr "DISC ODESLN" ++msgstr "DISC ODESLÁN" + +-#: ../netstat.c:397 ../netstat.c:464 ../netstat.c:809 ../netstat.c:1169 ++#: ../netstat.c:448 ../netstat.c:515 ../netstat.c:898 ../netstat.c:1267 + msgid "ESTABLISHED" + msgstr "SPOJENO" + +-#: ../netstat.c:419 ++#: ../netstat.c:470 ++#, c-format + msgid "Active NET/ROM sockets\n" +-msgstr "Aktivn NET/ROM sokety\n" ++msgstr "Aktivní NET/ROM sokety\n" + +-#: ../netstat.c:420 ++#: ../netstat.c:471 ++#, c-format + msgid "" +-"User Dest Source Device State Vr/Vs Send-Q " +-"Recv-Q\n" ++"User Dest Source Device State Vr/Vs Send-Q Recv-" ++"Q\n" + msgstr "" +-"Uivatel Cl Zdroj Zazen Stav Vr/Vs Odch-F " +-"Pch-F\n" ++"Uživatel Cíl Zdroj Zařízení Stav Vr/Vs Odch-F Přích-" ++"F\n" + +-#: ../netstat.c:430 ../netstat.c:1208 ++#: ../netstat.c:481 ../netstat.c:1306 + #, c-format + msgid "Problem reading data from %s\n" +-msgstr "Chyba pi ten dat z %s\n" ++msgstr "Chyba při čtení dat z %s\n" + +-# nsledujc radji ponechat v originle ?! +-#: ../netstat.c:465 ++# následující raději ponechat v originále ?! ++#: ../netstat.c:516 + msgid "SYN_SENT" + msgstr "SYN_SENT" + +-#: ../netstat.c:466 ++#: ../netstat.c:517 + msgid "SYN_RECV" + msgstr "SYN_RECV" + +-#: ../netstat.c:467 ++#: ../netstat.c:518 + msgid "FIN_WAIT1" + msgstr "FIN_WAIT1" + +-#: ../netstat.c:468 ++#: ../netstat.c:519 + msgid "FIN_WAIT2" + msgstr "FIN_WAIT2" + +-#: ../netstat.c:469 ++#: ../netstat.c:520 + msgid "TIME_WAIT" + msgstr "TIME_WAIT" + +-#: ../netstat.c:470 ++#: ../netstat.c:521 + msgid "CLOSE" +-msgstr "ZAVEN" ++msgstr "ZAVŘEN" + +-#: ../netstat.c:471 ++#: ../netstat.c:522 + msgid "CLOSE_WAIT" + msgstr "CLOSE_WAIT" + +-#: ../netstat.c:472 ++#: ../netstat.c:523 + msgid "LAST_ACK" +-msgstr "POSLEDN ACK" ++msgstr "POSLEDNÍ ACK" + +-#: ../netstat.c:473 ++#: ../netstat.c:524 + msgid "LISTEN" +-msgstr "LISTEN" ++msgstr "NASLOUCHÁ" + +-#: ../netstat.c:474 ++#: ../netstat.c:525 + msgid "CLOSING" +-msgstr "ZAVR" ++msgstr "ZAVíRÁ" + +-#: ../netstat.c:544 ++#: ../netstat.c:596 + #, c-format + msgid "warning, got bogus igmp6 line %d.\n" +-msgstr "varovn, nesmysln igmp6 dek %d.\n" ++msgstr "varování, nesmyslný igmp6 řádek %d.\n" + +-#: ../netstat.c:549 ../netstat.c:587 ../netstat.c:670 ../netstat.c:803 +-#: ../netstat.c:935 ../netstat.c:940 ++#: ../netstat.c:601 ../netstat.c:639 ../netstat.c:763 ../netstat.c:892 ++#: ../netstat.c:1029 ../netstat.c:1034 + #, c-format + msgid "netstat: unsupported address family %d !\n" +-msgstr "netstat: tda adres %d nen podporovna !\n" ++msgstr "netstat: třída adres %d není podporována !\n" + +-#: ../netstat.c:562 ../netstat.c:567 ../netstat.c:575 ../netstat.c:582 ++#: ../netstat.c:614 ../netstat.c:619 ../netstat.c:627 ../netstat.c:634 + #, c-format + msgid "warning, got bogus igmp line %d.\n" +-msgstr "varovn, nesmysln igmp dek %d.\n" ++msgstr "varování, nesmyslný igmp řádek %d.\n" ++ ++#: ../netstat.c:677 ++#, c-format ++msgid "Active X.25 sockets\n" ++msgstr "Aktivní X.25 sokety\n" ++ ++#. IMHO, Vr/Vs is not very usefull --SF ++#: ../netstat.c:679 ++#, c-format ++msgid "" ++"Dest Source Device LCI State Vr/Vs Send-Q Recv-" ++"Q\n" ++msgstr "" ++"Cíl Zdroj Zaříz LCI Stav Vr/Vs Odhod-F Přích-" ++"F\n" + +-#: ../netstat.c:666 ++#: ../netstat.c:759 ++#, c-format + msgid "warning, got bogus tcp line.\n" +-msgstr "varovn, nesmysln tcp dek.\n" ++msgstr "varování, nesmyslný tcp řádek.\n" + +-#: ../netstat.c:704 ../netstat.c:855 ../netstat.c:975 ++#: ../netstat.c:798 ../netstat.c:947 ../netstat.c:1072 + #, c-format + msgid "off (0.00/%ld/%d)" + msgstr "vyp (0.00/%ld/%d)" + +-#: ../netstat.c:708 +-#, fuzzy, c-format ++#: ../netstat.c:802 ++#, c-format + msgid "on (%2.2f/%ld/%d)" +-msgstr "zap%d (%2.2f/%ld/%d)" ++msgstr "zapnut (%2.2f/%ld/%d)" + +-#: ../netstat.c:713 +-#, fuzzy, c-format ++#: ../netstat.c:807 ++#, c-format + msgid "keepalive (%2.2f/%ld/%d)" +-msgstr "zap%d (%2.2f/%ld/%d)" ++msgstr "keepalive (%2.2f/%ld/%d)" + +-#: ../netstat.c:718 +-#, fuzzy, c-format ++#: ../netstat.c:812 ++#, c-format + msgid "timewait (%2.2f/%ld/%d)" +-msgstr "zap%d (%2.2f/%ld/%d)" ++msgstr "timewait (%2.2f/%ld/%d)" + +-#: ../netstat.c:723 ../netstat.c:864 ../netstat.c:985 ++#: ../netstat.c:817 ../netstat.c:956 ../netstat.c:1082 + #, c-format + msgid "unkn-%d (%2.2f/%ld/%d)" + msgstr "nezn-%d (%2.2f/%ld/%d)" + +-#: ../netstat.c:799 ++#: ../netstat.c:888 ++#, c-format + msgid "warning, got bogus udp line.\n" +-msgstr "varovn, nesmysln udp dek.\n" ++msgstr "varování, nesmyslný udp řádek.\n" + +-#: ../netstat.c:817 ../netstat.c:1075 ../netstat.c:1108 ++#: ../netstat.c:906 ../netstat.c:1172 ../netstat.c:1205 + msgid "UNKNOWN" +-msgstr "NEZNM" ++msgstr "NEZNÁM" + +-#: ../netstat.c:860 ../netstat.c:980 ++#: ../netstat.c:952 ../netstat.c:1077 + #, c-format + msgid "on%d (%2.2f/%ld/%d)" + msgstr "zap%d (%2.2f/%ld/%d)" + +-#: ../netstat.c:949 ++#: ../netstat.c:1043 ++#, c-format + msgid "warning, got bogus raw line.\n" +-msgstr "varovn, nesmysln 'raw' dek.\n" ++msgstr "varování, nesmyslný 'raw' řádek.\n" + +-#: ../netstat.c:1028 ++#: ../netstat.c:1125 ++#, c-format + msgid "warning, got bogus unix line.\n" +-msgstr "varovn, netstat 'unix' dek.\n" ++msgstr "varování, netstat 'unix' řádek.\n" + +-#: ../netstat.c:1055 ++#: ../netstat.c:1152 + msgid "STREAM" + msgstr "STREAM" + +-#: ../netstat.c:1059 ++#: ../netstat.c:1156 + msgid "DGRAM" + msgstr "DGRAM" + +-#: ../netstat.c:1063 ++#: ../netstat.c:1160 + msgid "RAW" + msgstr "RAW" + +-#: ../netstat.c:1067 ++#: ../netstat.c:1164 + msgid "RDM" + msgstr "RDM" + +-#: ../netstat.c:1071 ++#: ../netstat.c:1168 + msgid "SEQPACKET" + msgstr "SEQPACKET" + +-#: ../netstat.c:1080 ++#: ../netstat.c:1177 + msgid "FREE" +-msgstr "NEALOKOVN" ++msgstr "NEALOKOVÁN" + +-#: ../netstat.c:1096 ++#: ../netstat.c:1193 + msgid "CONNECTING" + msgstr "SPOJUJE" + +-#: ../netstat.c:1100 ++#: ../netstat.c:1197 + msgid "CONNECTED" + msgstr "SPOJEN" + +-#: ../netstat.c:1104 ++#: ../netstat.c:1201 + msgid "DISCONNECTING" + msgstr "ODPOJUJE" + +-#: ../netstat.c:1135 ++#: ../netstat.c:1233 ++#, c-format + msgid "Active UNIX domain sockets " +-msgstr "Aktivn sokety domny UNIX " ++msgstr "Aktivní sokety domény UNIX " + +-#: ../netstat.c:1137 ../netstat.c:1666 ++#: ../netstat.c:1235 ../netstat.c:1801 ++#, c-format + msgid "(servers and established)" +-msgstr "(servery a navzan spojen)" ++msgstr "(servery a navázaná spojení)" + +-#: ../netstat.c:1140 ../netstat.c:1669 ++#: ../netstat.c:1238 ../netstat.c:1804 ++#, c-format + msgid "(only servers)" + msgstr "(pouze servery)" + +-#: ../netstat.c:1142 ../netstat.c:1671 ++#: ../netstat.c:1240 ../netstat.c:1806 ++#, c-format + msgid "(w/o servers)" + msgstr "(w/o servery)" + +-#: ../netstat.c:1145 ++#: ../netstat.c:1243 ++#, c-format + msgid "" + "\n" +-"Proto RefCnt Flags Type State I-Node" ++"Proto RefCnt Flags Type State I-Node " + msgstr "" + "\n" +-"Proto ta Pznaky Typ Stav I-Uzel" ++"Proto Čítač Příznaky Typ Stav I-Uzel " + +-#: ../netstat.c:1147 ++#: ../netstat.c:1245 ++#, c-format + msgid " Path\n" + msgstr " Cesta\n" + +-#: ../netstat.c:1167 ++#: ../netstat.c:1265 + msgid "SABM SENT" +-msgstr "SABM ODESLN" ++msgstr "SABM ODESLÁN" + +-#: ../netstat.c:1170 ++#: ../netstat.c:1268 + msgid "RECOVERY" + msgstr "OBNOVA" + +-#: ../netstat.c:1184 ++#: ../netstat.c:1282 ++#, c-format + msgid "Active AX.25 sockets\n" +-msgstr "Aktivn AX.25 sokety\n" ++msgstr "Aktivní AX.25 sokety\n" + +-#: ../netstat.c:1185 ++#: ../netstat.c:1283 ++#, c-format + msgid "Dest Source Device State Vr/Vs Send-Q Recv-Q\n" +-msgstr "Cl Zdroj Zaz Stav Vr/Vs Odhod-F Pch-F\n" ++msgstr "Cíl Zdroj Zaříz Stav Vr/Vs Odhod-F Přích-F\n" + +-#: ../netstat.c:1228 ++#: ../netstat.c:1326 + #, c-format + msgid "problem reading data from %s\n" +-msgstr "chyba pi ten dat z %s\n" ++msgstr "chyba při čtení dat z %s\n" + +-#: ../netstat.c:1279 ++#: ../netstat.c:1396 ++#, c-format + msgid "" + "Active IPX sockets\n" + "Proto Recv-Q Send-Q Local Address Foreign Address " + "State" + msgstr "" +-"Aktivn IPX sokety\n" +-"Proto Pch-F Odch-F Lokl adresa Vzdlen adresa " +-" Stav" ++"Aktivní IPX sokety\n" ++"Proto Přích-F Odch-F Lokál adresa Vzdálená " ++"adresa Stav" + +-#: ../netstat.c:1281 ++#: ../netstat.c:1398 ++#, c-format + msgid " User" +-msgstr " Uivatel" ++msgstr " Uživatel" + +-#: ../netstat.c:1315 ++#: ../netstat.c:1432 + msgid "ESTAB" + msgstr "SPOJEN" + +-#: ../netstat.c:1323 ++#: ../netstat.c:1440 + msgid "UNK." + msgstr "NEZ." + +-#: ../netstat.c:1367 +-msgid " - no statistics available -" +-msgstr " - statistick data nejsou dostupn -" +- +-#: ../netstat.c:1370 +-msgid "[NO FLAGS]" +-msgstr "[DN PZNAKY]" +- +-#: ../netstat.c:1400 ++#: ../netstat.c:1478 ++#, c-format + msgid "Kernel Interface table\n" +-msgstr "Tabulka rozhran v jdru\n" ++msgstr "Tabulka rozhraní v jádru\n" + +-#: ../netstat.c:1401 +-msgid "" +-"Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " +-"Flg\n" +-msgstr "" +-"Rozhr MTU Met P-OK P-CHYB P-ZAH P-PT OD-OK OD-CHYB OD-ZAH OD-PT " +-"PZ\n" +- +-#: ../netstat.c:1404 ++#: ../netstat.c:1486 + msgid "missing interface information" +-msgstr "chyb informace o rozhran" ++msgstr "chybí informace o rozhraní" + +-#: ../netstat.c:1425 ++#: ../netstat.c:1509 ++#, c-format + msgid "" +-"usage: netstat [-veenNcCF] [<Af>] -r netstat " +-"{-V|--version|-h|--help}\n" ++"usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--" ++"help}\n" + msgstr "" +-"Pouit: netstat [--veenNcCF] [<TA>] -r netstat " +-"{-V|--version|-h|--help}\n" ++"Použití: netstat [-vWeenNcCF] [<AF>] -r netstat {-V|--version|-h|--" ++"help}\n" + +-#: ../netstat.c:1426 +-msgid " netstat [-vnNcaeol] [<Socket> ...]\n" +-msgstr " netstat [-vnNcaeol] [<Soket> ...]\n" ++#: ../netstat.c:1510 ++#, c-format ++msgid " netstat [-vWnNcaeol] [<Socket> ...]\n" ++msgstr " netstat [-vWnNcaeol] [<Socket>…]\n" + +-#: ../netstat.c:1427 ++#: ../netstat.c:1511 ++#, c-format + msgid "" +-" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n" ++" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n" + "\n" + msgstr "" +-" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n" ++" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n" + "\n" + +-#: ../netstat.c:1429 ++#: ../netstat.c:1513 ++#, c-format + msgid " -r, --route display routing table\n" +-msgstr " -r, --route vype smrovac tabulku\n" ++msgstr " -r, --route vypíše směrovací tabulku\n" + +-#: ../netstat.c:1430 ++#: ../netstat.c:1514 ++#, c-format + msgid " -i, --interfaces display interface table\n" +-msgstr " -i, --interfaces vype tabulku rozhran\n" ++msgstr " -i, --interfaces vypíše tabulku rozhraní\n" + +-#: ../netstat.c:1431 ++#: ../netstat.c:1515 ++#, c-format + msgid " -g, --groups display multicast group memberships\n" + msgstr "" +-" -g, --groups vype lenstv v multicast skupinch\n" ++" -g, --groups vypíše členství v multicast skupinách\n" + +-#: ../netstat.c:1432 ++#: ../netstat.c:1516 ++#, c-format + msgid "" + " -s, --statistics display networking statistics (like SNMP)\n" + msgstr "" +-" -s, --statistics vype statistiku sov aktivity (jako " ++" -s, --statistics vypíše statistiku síťové aktivity (jako " + "SNMP)\n" + +-#: ../netstat.c:1434 ++#: ../netstat.c:1518 ++#, c-format + msgid "" + " -M, --masquerade display masqueraded connections\n" + "\n" + msgstr "" +-" -M, --masquerade vype maskovan spojen\n" ++" -M, --masquerade vypíše maskovaná spojení\n" + "\n" + +-#: ../netstat.c:1438 ../route.c:87 ++#: ../netstat.c:1521 ++#, c-format ++msgid " -W, --wide don't truncate IP addresses\n" ++msgstr " -W, --wide nezkracuje IP adresy\n" ++ ++#: ../netstat.c:1523 ++#, c-format ++msgid " --numeric-hosts don't resolve host names\n" ++msgstr " --numeric-hosts nepřekládá názvy strojů\n" ++ ++#: ../netstat.c:1524 ++#, c-format ++msgid " --numeric-ports don't resolve port names\n" ++msgstr " --numeric-ports nepřekládá názvy portů\n" ++ ++#: ../netstat.c:1525 ++#, c-format ++msgid " --numeric-users don't resolve user names\n" ++msgstr " --numeric-users nepřekládá uživatelské jména\n" ++ ++#: ../netstat.c:1526 ++#, c-format + msgid " -N, --symbolic resolve hardware names\n" +-msgstr " -N, --symbolic pevede hw jmna\n" ++msgstr " -N, --symbolic převede hw jména\n" + +-#: ../netstat.c:1439 ../route.c:88 ++#: ../netstat.c:1527 ../route.c:88 ++#, c-format + msgid " -e, --extend display other/more information\n" +-msgstr " -e, --extend vype podrobnj informace\n" ++msgstr " -e, --extend vypíše podrobnější informace\n" + +-#: ../netstat.c:1440 ++#: ../netstat.c:1528 ++#, c-format + msgid " -p, --programs display PID/Program name for sockets\n" + msgstr "" +-" -p, --programs vype PID/jmno programu pro sokety\n" ++" -p, --programs vypíše PID/jméno programu pro sokety\n" + +-#: ../netstat.c:1441 ++#: ../netstat.c:1529 ++#, c-format + msgid "" + " -c, --continuous continuous listing\n" + "\n" + msgstr "" +-" -c, --continuous neperuovan vpis\n" ++" -c, --continuous nepřerušovaný výpis\n" + "\n" + +-#: ../netstat.c:1442 ++#: ../netstat.c:1530 ++#, c-format + msgid " -l, --listening display listening server sockets\n" + msgstr "" +-" -l, --listening vype sokety, na nich je naslouchno\n" ++" -l, --listening vypíše sokety, na nichž je nasloucháno\n" + +-#: ../netstat.c:1443 ++#: ../netstat.c:1531 ++#, c-format + msgid "" + " -a, --all, --listening display all sockets (default: connected)\n" + msgstr "" +-" -a, --all, --listening vype vechny sokety (implicitn: " +-"spojen)\n" ++" -a, --all, --listening vypíše všechny sokety (implicitně: " ++"spojené)\n" + +-#: ../netstat.c:1444 ++#: ../netstat.c:1532 ++#, c-format + msgid " -o, --timers display timers\n" +-msgstr " -o, --timers zobraz asovae\n" ++msgstr " -o, --timers zobrazí časovače\n" + +-#: ../netstat.c:1445 ../route.c:89 ++#: ../netstat.c:1533 ../route.c:89 ++#, c-format + msgid "" + " -F, --fib display Forwarding Information Base " + "(default)\n" + msgstr "" +-" -F, --fib zobraz Forwarding Infomation Base\n" +-" (implicitn)\n" ++" -F, --fib zobrazí Forwarding Information Base\n" ++" (implicitní)\n" + +-#: ../netstat.c:1446 ../route.c:90 ++#: ../netstat.c:1534 ../route.c:90 ++#, c-format + msgid "" + " -C, --cache display routing cache instead of FIB\n" + "\n" +-msgstr " -C, --cache msto FIB zobraz smrovac cache\n" ++msgstr " -C, --cache místo FIB zobrazí směrovací cache\n" + +-#: ../netstat.c:1448 ++#: ../netstat.c:1536 ++#, c-format + msgid "" +-" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx " +-"--netrom\n" ++" <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix} --" ++"ax25 --ipx --netrom\n" + msgstr "" +-" <Soket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx " +-"--netrom\n" ++" <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix} --" ++"ax25 --ipx --netrom\n" + +-#: ../netstat.c:1449 ../route.c:92 ++#: ../netstat.c:1537 + #, c-format +-msgid " <AF>=Use '-A <af>' or '--<af>' Default: %s\n" +-msgstr " <AF>=Pouijte '-A <af>' or '--<af>' Implicitn: %s\n" ++msgid " <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: %s\n" ++msgstr " <AF>=Použijte „-6|-4“ nebo „-A <af>“ nebo „--<af>“. Implicitní: %s\n" + +-#: ../netstat.c:1450 ../route.c:93 ++#: ../netstat.c:1538 ../route.c:93 ++#, c-format + msgid " List of possible address families (which support routing):\n" +-msgstr " Seznam monch td adres (podporujcch smrovn):\n" ++msgstr " Seznam možných tříd adres (podporujících směrování):\n" ++ ++#: ../netstat.c:1756 ++#, c-format ++msgid "netstat: No statistics support for specified address family: %s\n" ++msgstr "netstat: Pro zadanou rodinu adres není podporována statistika: %s\n" + +-#: ../netstat.c:1663 ++#: ../netstat.c:1798 ++#, c-format + msgid "Active Internet connections " +-msgstr "Aktivn Internetov spojen " ++msgstr "Aktivní Internetová spojení " + +-#: ../netstat.c:1673 ++#: ../netstat.c:1808 ++#, c-format + msgid "" + "\n" +-"Proto Recv-Q Send-Q Local Address Foreign Address State " +-" " ++"Proto Recv-Q Send-Q Local Address Foreign Address " ++"State " + msgstr "" + "\n" +-"Proto Pch-F Odch-F Mstn Adresa Vzdlen Adresa Stav " ++"Proto Přích-F Odch-F Místní Adresa Vzdálená Adresa Stav " + +-#: ../netstat.c:1675 ++#: ../netstat.c:1810 ++#, c-format + msgid " User Inode " +-msgstr " Uivatel I-uzel " ++msgstr " Uživatel I-uzel " + +-#: ../netstat.c:1678 ++#: ../netstat.c:1813 ++#, c-format + msgid " Timer" +-msgstr " asova" ++msgstr " Časovač" + +-#: ../netstat.c:1708 ++#: ../netstat.c:1851 ++#, c-format + msgid "IPv4 Group Memberships\n" +-msgstr "lenstv v IPv4 skupinch\n" ++msgstr "Členství v IPv4 skupinách\n" + +-#: ../netstat.c:1709 ++#: ../netstat.c:1852 ++#, c-format + msgid "Interface RefCnt Group\n" +-msgstr "Rozhran ta Skupina\n" ++msgstr "Rozhraní Čítač Skupina\n" + +-#: ../rarp.c:43 ++#: ../rarp.c:45 + msgid "This kernel does not support RARP.\n" +-msgstr "Toto jdro nepodporuje RARP.\n" ++msgstr "Toto jádro nepodporuje RARP.\n" + +-#: ../rarp.c:82 ++#: ../rarp.c:84 + #, c-format + msgid "no RARP entry for %s.\n" +-msgstr "pro %s neexistuje RARP poloka.\n" ++msgstr "pro %s neexistuje RARP položka.\n" + +-#: ../rarp.c:95 ++#: ../rarp.c:97 + #, c-format + msgid "%s: bad hardware address\n" +-msgstr "hardwarov adresa %s je nesprvn\n" ++msgstr "hardwarová adresa %s je nesprávná\n" + +-#: ../rarp.c:127 ++#: ../rarp.c:129 + #, c-format + msgid "rarp: cannot open file %s:%s.\n" +-msgstr "rarp: soubor %s:%s nelze otevt.\n" ++msgstr "rarp: soubor %s:%s nelze otevřít.\n" + +-#: ../rarp.c:139 ++#: ../rarp.c:141 + #, c-format + msgid "rarp: format error at %s:%u\n" +-msgstr "rarp: syntaktick chyba na dku %2$u souboru %1$s\n" ++msgstr "rarp: syntaktická chyba na řádku %2$u souboru %1$s\n" + +-#: ../rarp.c:143 ../rarp.c:287 ++#: ../rarp.c:145 ../rarp.c:290 + #, c-format + msgid "rarp: %s: unknown host\n" +-msgstr "rarp: pota %s nen znm\n" ++msgstr "rarp: počítač %s není znám\n" + +-#: ../rarp.c:146 ++#: ../rarp.c:148 + #, c-format + msgid "rarp: cannot set entry from %s:%u\n" +-msgstr "rarp: nelze nastavit poloku z dku %2$u souboru %1$s\n" ++msgstr "rarp: nelze nastavit položku z řádku %2$u souboru %1$s\n" + +-#: ../rarp.c:175 ++#: ../rarp.c:177 ++#, c-format + msgid "Usage: rarp -a list entries in cache.\n" +-msgstr "Pouit: rarp -a vype poloky z cache.\n" ++msgstr "Použití: rarp -a vypíše položky z cache.\n" + +-#: ../rarp.c:176 ++#: ../rarp.c:178 ++#, c-format + msgid " rarp -d <hostname> delete entry from cache.\n" +-msgstr " rarp -d <jmno> smae poloku z cache.\n" ++msgstr " rarp -d <jméno> smaže položku z cache.\n" + +-#: ../rarp.c:177 ++#: ../rarp.c:179 ++#, c-format + msgid " rarp [<HW>] -s <hostname> <hwaddr> add entry to cache.\n" + msgstr "" +-" rarp [<HW>] -s <jmno> <hwadr> pid poloku do cache.\n" ++" rarp [<HW>] -s <jméno> <hwadr> přidá položku do cache.\n" + +-#: ../rarp.c:178 ++#: ../rarp.c:180 ++#, c-format + msgid "" + " rarp -f add entries from /etc/ethers.\n" + msgstr "" +-" rarp -f pid poloky z /etc/ethers.\n" ++" rarp -f přidá položky z /etc/ethers.\n" + +-#: ../rarp.c:179 ++#: ../rarp.c:181 ++#, c-format + msgid "" + " rarp -V display program version.\n" + "\n" + msgstr "" +-" rarp -V vype oznaen verze " ++" rarp -V vypíše označení verze " + "programu.\n" + "\n" + +-#: ../rarp.c:236 ++#: ../rarp.c:239 + #, c-format + msgid "%s: illegal option mix.\n" +-msgstr "Kombinace pepna %s je nesprvn.\n" ++msgstr "Kombinace přepínačů %s je nesprávná.\n" + +-#: ../rarp.c:267 ++#: ../rarp.c:270 + #, c-format + msgid "rarp: %s: unknown hardware type.\n" +-msgstr "rarp: hardwarov typ %s nen znm.\n" ++msgstr "rarp: hardwarový typ %s není znám.\n" + +-#: ../route.c:79 ++#: ../route.c:80 ++#, c-format + msgid "" + "Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables\n" + msgstr "" +-"Pouit: route [-nNvee] [-FC] [<AF>] Zobraz smrovac tabulky v " +-"jdru\n" ++"Použití: route [-nNvee] [-FC] [<AF>] Zobrazí směrovací tabulky v " ++"jádru\n" + +-#: ../route.c:80 ++#: ../route.c:81 ++#, c-format + msgid "" + " route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n" + "\n" + msgstr "" +-" route [-v] [-FC] {add|del|flush} ... Zmn smrovac tabulku pro " ++" route [-v] [-FC] {add|del|flush} ... Změní směrovací tabulku pro " + "AF.\n" + "\n" + +-#: ../route.c:82 ++#: ../route.c:83 ++#, c-format + msgid "" + " route {-h|--help} [<AF>] Detailed usage syntax for " + "specified AF.\n" + msgstr "" +-" route {-h|--help [<AF>] Npovda pro pouit s AF.\n" ++" route {-h|--help [<AF>] Nápověda pro použití s AF.\n" + +-#: ../route.c:83 ++#: ../route.c:84 ++#, c-format + msgid "" + " route {-V|--version} Display version/author and " + "exit.\n" + "\n" + msgstr "" +-" route {-V|--version} Vype oznaen verze a autora\n" ++" route {-V|--version} Vypíše označení verze a autora\n" + " programu.\n" + ++#: ../route.c:92 ++#, c-format ++msgid " <AF>=Use '-A <af>' or '--<af>'; default: %s\n" ++msgstr " <AF>=Použijte „-A <af>“ nebo „--<af>“. Implicitní: %s\n" ++ + #: ../plipconfig.c:66 ++#, c-format + msgid "Usage: plipconfig [-a] [-i] [-v] interface\n" +-msgstr "Pouit: plipconfig [-a] [-i] [-v] rozhran\n" ++msgstr "Použití: plipconfig [-a] [-i] [-v] rozhraní\n" + + #: ../plipconfig.c:67 ++#, c-format + msgid " [nibble NN] [trigger NN]\n" + msgstr " [nibble NN] [trigger NN]\n" + + #: ../plipconfig.c:68 ++#, c-format + msgid " plipconfig -V | --version\n" + msgstr " plipconfig -V | --version\n" + +@@ -1338,25 +1371,30 @@ msgstr " plipconfig -V | --version\n" + msgid "%s\tnibble %lu trigger %lu\n" + msgstr "%s\tnibble %lu trigger %lu\n" + +-#: ../iptunnel.c:79 ++#: ../iptunnel.c:85 ++#, c-format + msgid "Usage: iptunnel { add | change | del | show } [ NAME ]\n" +-msgstr "Pouit: iptunnel { add | change | del | show } [ JMNO ]\n" ++msgstr "Použití: iptunnel { add | change | del | show } [ JMÉNO ]\n" + +-#: ../iptunnel.c:80 ++#: ../iptunnel.c:86 ++#, c-format + msgid "" + " [ mode { ipip | gre | sit } ] [ remote ADDR ] [ local ADDR ]\n" + msgstr "" +-" [ mode { ipip | gre | sit } ] [ vzdlen ADR ] [ mstn ADR ]\n" ++" [ mode { ipip | gre | sit } ] [ vzdálená ADR ] [ místní ADR ]\n" + +-#: ../iptunnel.c:81 ++#: ../iptunnel.c:87 ++#, c-format + msgid " [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]\n" +-msgstr " [ [i|o]seq ] [ [i|o]key KL ] [ [i|o]csum ]\n" ++msgstr " [ [i|o]seq ] [ [i|o]key KLÍČ ] [ [i|o]csum ]\n" + +-#: ../iptunnel.c:82 ++#: ../iptunnel.c:88 ++#, c-format + msgid " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev PHYS_DEV ]\n" +-msgstr " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev ZAZEN ]\n" ++msgstr " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev ZAŘÍZENÍ ]\n" + +-#: ../iptunnel.c:83 ++#: ../iptunnel.c:89 ++#, c-format + msgid "" + " iptunnel -V | --version\n" + "\n" +@@ -1364,1068 +1402,1781 @@ msgstr "" + " iptunnel -V | --version\n" + "\n" + +-#: ../iptunnel.c:84 ++#: ../iptunnel.c:90 ++#, c-format + msgid "Where: NAME := STRING\n" +-msgstr "Kde: JMNO := ETZEC\n" ++msgstr "Kde: JMÉNO := ŘETĚZEC\n" + +-#: ../iptunnel.c:85 ++#: ../iptunnel.c:91 ++#, c-format + msgid " ADDR := { IP_ADDRESS | any }\n" + msgstr " ADR := { IP-ADRESA | any }\n" + +-#: ../iptunnel.c:86 ++#: ../iptunnel.c:92 ++#, c-format + msgid " TOS := { NUMBER | inherit }\n" +-msgstr " TOS := { SLO | inherit }\n" ++msgstr " TOS := { ČÍSLO | inherit }\n" + +-#: ../iptunnel.c:87 ++#: ../iptunnel.c:93 ++#, c-format + msgid " TTL := { 1..255 | inherit }\n" + msgstr " TTL := { 1..255 | inherit }\n" + +-#: ../iptunnel.c:88 ++#: ../iptunnel.c:94 ++#, c-format + msgid " KEY := { DOTTED_QUAD | NUMBER }\n" +-msgstr " KL := { DOTTED_QUAD | SLO }\n" ++msgstr " KLÍČ := { DOTTED_QUAD | ČÍSLO }\n" + +-#: ../iptunnel.c:326 ++#: ../iptunnel.c:332 ++#, c-format + msgid "Keys are not allowed with ipip and sit.\n" +-msgstr "S ipip a sit nejsou kle povoleny.\n" ++msgstr "S ipip a sit nejsou klíče povoleny.\n" + +-#: ../iptunnel.c:346 ++#: ../iptunnel.c:352 ++#, c-format + msgid "Broadcast tunnel requires a source address.\n" +-msgstr "Tunel se vesmrovm vyslnm vyaduje zdrojovou adresu.\n" ++msgstr "Tunel se všesměrovým vysíláním vyžaduje zdrojovou adresu.\n" + +-#: ../iptunnel.c:361 ++#: ../iptunnel.c:367 ++#, c-format + msgid "ttl != 0 and noptmudisc are incompatible\n" +-msgstr "ttl != 0 a noptmudisc se navzjem vyluuj\n" ++msgstr "ttl != 0 a noptmudisc se navzájem vylučují\n" + +-#: ../iptunnel.c:373 ++#: ../iptunnel.c:379 ++#, c-format + msgid "cannot determine tunnel mode (ipip, gre or sit)\n" +-msgstr "reim tunelu (ipip, gre i sit) nelze zjistit\n" ++msgstr "režim tunelu (ipip, gre či sit) nelze zjistit\n" + +-#: ../iptunnel.c:411 ++#: ../iptunnel.c:417 + #, c-format + msgid "%s: %s/ip remote %s local %s " +-msgstr "%s: %s/ip vzdlen %s mstn %s " ++msgstr "%s: %s/ip vzdálený %s místní %s " + +-#: ../iptunnel.c:415 ++#: ../iptunnel.c:421 + msgid "unknown" +-msgstr "Neznm." ++msgstr "Neznám." + +-#: ../iptunnel.c:447 ++#: ../iptunnel.c:453 ++#, c-format + msgid " Drop packets out of sequence.\n" +-msgstr " Zahazuje pakety mimo poad.\n" ++msgstr " Zahazuje pakety mimo pořadí.\n" + +-#: ../iptunnel.c:449 ++#: ../iptunnel.c:455 ++#, c-format + msgid " Checksum in received packet is required.\n" +-msgstr " Pijman pakety mus mt kontroln souet.\n" ++msgstr " Přijímané pakety musí mít kontrolní součet.\n" + + # ??? +-#: ../iptunnel.c:451 ++#: ../iptunnel.c:457 ++#, c-format + msgid " Sequence packets on output.\n" +-msgstr " ad odchoz pakety.\n" ++msgstr " Řadí odchozí pakety.\n" + +-#: ../iptunnel.c:453 ++#: ../iptunnel.c:459 ++#, c-format + msgid " Checksum output packets.\n" +-msgstr " Odchoz pakety budou mt kontroln souet.\n" ++msgstr " Odchozí pakety budou mít kontrolní součet.\n" + +-#: ../iptunnel.c:481 ++#: ../iptunnel.c:487 ++#, c-format + msgid "Wrong format of /proc/net/dev. Sorry.\n" +-msgstr "Lituji, formt /proc/net/dev je chybn.\n" ++msgstr "Lituji, formát /proc/net/dev je chybný.\n" + +-#: ../iptunnel.c:494 ++#: ../iptunnel.c:500 + #, c-format + msgid "Failed to get type of [%s]\n" +-msgstr "Typ [%s] se nepodailo zjistit.\n" ++msgstr "Typ [%s] se nepodařilo zjistit.\n" + +-#: ../iptunnel.c:510 ++#: ../iptunnel.c:516 ++#, c-format + msgid "RX: Packets Bytes Errors CsumErrs OutOfSeq Mcasts\n" +-msgstr "RX: Pakety Bajty Chyby CsumChyb MimoPo Mcasts\n" ++msgstr "RX: Pakety Bajty Chyby CsumChyb MimoPoř Mcasts\n" + +-#: ../iptunnel.c:513 ++#: ../iptunnel.c:519 ++#, c-format + msgid "TX: Packets Bytes Errors DeadLoop NoRoute NoBufs\n" + msgstr "TX: Pakety Bajty Chyby DeadLoop NoRoute NoBufs\n" + +-#: ../statistics.c:45 ++#: ../statistics.c:48 + msgid "ICMP input histogram:" +-msgstr "histogram ICMP vstupu:" ++msgstr "Histogram ICMP vstupu:" + +-#: ../statistics.c:46 ++#: ../statistics.c:49 + msgid "ICMP output histogram:" +-msgstr "histogram ICMP vstupu:" ++msgstr "Histogram ICMP výstupu:" ++ ++#: ../statistics.c:66 ++#, c-format ++msgid "Forwarding is %s" ++msgstr "Předávání je %s" ++ ++#: ../statistics.c:67 ++#, c-format ++msgid "Default TTL is %u" ++msgstr "Implicitní TTL je %u" ++ ++#: ../statistics.c:68 ../statistics.c:89 ++#, c-format ++msgid "%u total packets received" ++msgstr "Celkem přijatých paketů: %u" ++ ++#: ../statistics.c:69 ../statistics.c:90 ++#, c-format ++msgid "%u with invalid headers" ++msgstr "S nesprávnými hlavičkami: %u" ++ ++#: ../statistics.c:70 ../statistics.c:93 ++#, c-format ++msgid "%u with invalid addresses" ++msgstr "S nesprávnými adresami: %u" ++ ++#: ../statistics.c:71 ../statistics.c:98 ++#, c-format ++msgid "%u forwarded" ++msgstr "Přeposláno: %u" ++ ++#: ../statistics.c:72 ../statistics.c:94 ++#, c-format ++msgid "%u with unknown protocol" ++msgstr "S neznámým protokolem: %u" ++ ++#: ../statistics.c:73 ../statistics.c:96 ++#, c-format ++msgid "%u incoming packets discarded" ++msgstr "Počet zahozených příchozích paketů: %u" ++ ++#: ../statistics.c:74 ../statistics.c:97 ++#, c-format ++msgid "%u incoming packets delivered" ++msgstr "Počet doručených příchozích paketů: %u" ++ ++#: ../statistics.c:75 ../statistics.c:99 ++#, c-format ++msgid "%u requests sent out" ++msgstr "Počet požadavků na odeslání: %u" ++ ++#. ? ++#: ../statistics.c:76 ../statistics.c:100 ++#, c-format ++msgid "%u outgoing packets dropped" ++msgstr "Počet zahozených odchozích paketů: %u" ++ ++#: ../statistics.c:77 ../statistics.c:101 ++#, c-format ++msgid "%u dropped because of missing route" ++msgstr "Zahozeno kvůli chybějící cestě: %u" ++ ++#: ../statistics.c:78 ../statistics.c:102 ++#, c-format ++msgid "%u fragments dropped after timeout" ++msgstr "Počet fragmentů zahozených po vypršení času: %u" ++ ++#: ../statistics.c:79 ../statistics.c:103 ++#, c-format ++msgid "%u reassemblies required" ++msgstr "Počet nutných znovusestavení: %u" ++ ++#. ? ++#: ../statistics.c:80 ../statistics.c:104 ++#, c-format ++msgid "%u packets reassembled ok" ++msgstr "Počet v pořádku znovu sestavených paketů: %u" ++ ++#: ../statistics.c:81 ../statistics.c:105 ++#, c-format ++msgid "%u packet reassembles failed" ++msgstr "Počet paketů, jež se nepodařilo znovu sestavit: %u" ++ ++#: ../statistics.c:82 ../statistics.c:106 ++#, c-format ++msgid "%u fragments received ok" ++msgstr "Počet v pořádku přijatých fragmentů: %u" ++ ++#: ../statistics.c:83 ../statistics.c:107 ++#, c-format ++msgid "%u fragments failed" ++msgstr "Počet chybných fragmentů: %u" ++ ++#: ../statistics.c:84 ../statistics.c:108 ++#, c-format ++msgid "%u fragments created" ++msgstr "Počet vytvořených fragmentů: %u" ++ ++#: ../statistics.c:91 ++#, c-format ++msgid "%u with packets too big" ++msgstr "Počet příliš velkých packetů: %u" ++ ++#: ../statistics.c:92 ++#, c-format ++msgid "%u incoming packets with no route" ++msgstr "Počet příchozích paketů bez odpovídající cesty: %u" ++ ++#: ../statistics.c:95 ++#, c-format ++msgid "%u with truncated packets" ++msgstr "Počet zkrácených packetů: %u" ++ ++#: ../statistics.c:109 ++#, c-format ++msgid "%u incoming multicast packets" ++msgstr "Počet příchozích multicastových paketů: %u" ++ ++#: ../statistics.c:110 ++#, c-format ++msgid "%u outgoing multicast packets" ++msgstr "Počet odchozích multicastových paketů: %u" ++ ++#: ../statistics.c:115 ../statistics.c:145 ++#, c-format ++msgid "%u ICMP messages received" ++msgstr "Počet přijatých ICMP zpráv: %u" ++ ++#: ../statistics.c:116 ../statistics.c:146 ++#, c-format ++msgid "%u input ICMP message failed." ++msgstr "Počet chybných příchozích ICMP zpráv: %u" ++ ++#: ../statistics.c:117 ../statistics.c:130 ../statistics.c:147 ++#: ../statistics.c:162 ++#, c-format ++msgid "destination unreachable: %u" ++msgstr "Adresát nedostupný: %u" ++ ++#: ../statistics.c:118 ++#, c-format ++msgid "timeout in transit: %u" ++msgstr "Vypršel čas při přenosu: %u" ++ ++#: ../statistics.c:119 ../statistics.c:132 ++#, c-format ++msgid "wrong parameters: %u" ++msgstr "Chybné parametry: %u" ++ ++#. ? ++#: ../statistics.c:120 ++#, c-format ++msgid "source quenches: %u" ++msgstr "Zahlcení zdroje: %u" ++ ++#: ../statistics.c:121 ../statistics.c:160 ../statistics.c:175 ++#, c-format ++msgid "redirects: %u" ++msgstr "Počet přesměrování: %u" ++ ++#: ../statistics.c:122 ../statistics.c:151 ../statistics.c:166 ++#, c-format ++msgid "echo requests: %u" ++msgstr "Žádost o echo: %u" ++ ++#: ../statistics.c:123 ../statistics.c:136 ../statistics.c:152 ++#: ../statistics.c:167 ++#, c-format ++msgid "echo replies: %u" ++msgstr "Odpověď na žádost o echo: %u" ++ ++#: ../statistics.c:124 ++#, c-format ++msgid "timestamp request: %u" ++msgstr "Žádost o čas: %u" ++ ++#: ../statistics.c:125 ++#, c-format ++msgid "timestamp reply: %u" ++msgstr "Odpověď na žádost o čas: %u" ++ ++#: ../statistics.c:126 ++#, c-format ++msgid "address mask request: %u" ++msgstr "Žádost o masku podsítě: %u" ++ ++#. ? ++#: ../statistics.c:127 ../statistics.c:140 ++#, c-format ++msgid "address mask replies: %u" ++msgstr "Odpověď na žádost o masku podsítě: %u" ++ ++#. ? ++#: ../statistics.c:128 ../statistics.c:161 ++#, c-format ++msgid "%u ICMP messages sent" ++msgstr "Počet odeslaných ICMP zpráv: %u" ++ ++#: ../statistics.c:129 ++#, c-format ++msgid "%u ICMP messages failed" ++msgstr "Počet chybných ICMP zpráv: %u" ++ ++#: ../statistics.c:131 ++#, c-format ++msgid "time exceeded: %u" ++msgstr "Vypršení životnosti: %u" ++ ++#. ? ++#: ../statistics.c:133 ++#, c-format ++msgid "source quench: %u" ++msgstr "Zahlcení zdroje: %u" ++ ++#: ../statistics.c:134 ++#, c-format ++msgid "redirect: %u" ++msgstr "Počet přesměrování: %u" ++ ++#: ../statistics.c:135 ++#, c-format ++msgid "echo request: %u" ++msgstr "Žádost o echo: %u" ++ ++#: ../statistics.c:137 ++#, c-format ++msgid "timestamp requests: %u" ++msgstr "žádost o čas: %u" ++ ++#: ../statistics.c:138 ++#, c-format ++msgid "timestamp replies: %u" ++msgstr "Odpověď na žádost o čas: %u" ++ ++#: ../statistics.c:139 ++#, c-format ++msgid "address mask requests: %u" ++msgstr "Žádost o masku podsítě: %u" ++ ++#: ../statistics.c:148 ../statistics.c:163 ++#, c-format ++msgid "packets too big: %u" ++msgstr "Příliš velkých packetů: %u" ++ ++#: ../statistics.c:149 ++#, c-format ++msgid "received ICMPv6 time exceeded: %u" ++msgstr "Přijato ICMPv6 vypršení životnosti: %u" ++ ++#: ../statistics.c:150 ../statistics.c:165 ++#, c-format ++msgid "parameter problem: %u" ++msgstr "Problém s parametrem: %u" ++ ++#: ../statistics.c:153 ../statistics.c:168 ++#, c-format ++msgid "group member queries: %u" ++msgstr "Dotazů na členství ve skupině: %u" ++ ++#: ../statistics.c:154 ../statistics.c:169 ++#, c-format ++msgid "group member responses: %u" ++msgstr "Odpovědí na členství ve skupině: %u" ++ ++#: ../statistics.c:155 ../statistics.c:170 ++#, c-format ++msgid "group member reductions: %u" ++msgstr "Počet snížení členů skupiny: %u" ++ ++#: ../statistics.c:156 ../statistics.c:171 ++#, c-format ++msgid "router solicits: %u" ++msgstr "Počet výzev směrovači: %u" ++ ++#: ../statistics.c:157 ../statistics.c:172 ++#, c-format ++msgid "router advertisement: %u" ++msgstr "Počet oznámení směrovače: %u" ++ ++#: ../statistics.c:158 ++#, c-format ++msgid "neighbour solicits: %u" ++msgstr "Počet výzev sousedovi: %u" ++ ++#: ../statistics.c:159 ++#, c-format ++msgid "neighbour advertisement: %u" ++msgstr "Počet oznámení souseda: %u" ++ ++#: ../statistics.c:164 ++#, c-format ++msgid "sent ICMPv6 time exceeded: %u" ++msgstr "Počet odeslaných ICMPv6 vypršení životnosti: %u" ++ ++#: ../statistics.c:173 ++#, c-format ++msgid "neighbor solicits: %u" ++msgstr "Počet výzev sousedovi: %u" ++ ++#: ../statistics.c:174 ++#, c-format ++msgid "neighbor advertisements: %u" ++msgstr "Počet oznámení souseda: %u" ++ ++#: ../statistics.c:180 ++#, c-format ++msgid "RTO algorithm is %s" ++msgstr "RTO algoritmus je %s" ++ ++#: ../statistics.c:184 ++#, c-format ++msgid "%u active connections openings" ++msgstr "Počet aktivně navázaných spojení: %u" ++ ++#: ../statistics.c:185 ++#, c-format ++msgid "%u passive connection openings" ++msgstr "Počet pasivně navázaných spojení: %u" ++ ++#: ../statistics.c:186 ++#, c-format ++msgid "%u failed connection attempts" ++msgstr "Počet neúspěšných pokusů o spojení: %u" ++ ++#: ../statistics.c:187 ++#, c-format ++msgid "%u connection resets received" ++msgstr "Počet přijatých resetů spojení: %u" ++ ++#: ../statistics.c:188 ++#, c-format ++msgid "%u connections established" ++msgstr "Počet navázaných spojení: %u" ++ ++#: ../statistics.c:189 ++#, c-format ++msgid "%u segments received" ++msgstr "Počet přijatých segmentů: %u" ++ ++#: ../statistics.c:190 ++#, c-format ++msgid "%u segments send out" ++msgstr "Počet odeslaných segmentů: %u" ++ ++#: ../statistics.c:191 ++#, c-format ++msgid "%u segments retransmited" ++msgstr "Počet přenesených segmentů: %u" ++ ++#: ../statistics.c:192 ++#, c-format ++msgid "%u bad segments received." ++msgstr "Počet chybných příchozích segmentů: %u" ++ ++#: ../statistics.c:193 ++#, c-format ++msgid "%u resets sent" ++msgstr "Počet odeslaných resetů: %u" ++ ++#: ../statistics.c:198 ../statistics.c:206 ++#, c-format ++msgid "%u packets received" ++msgstr "Počet přijatých paketů: %u" ++ ++#: ../statistics.c:199 ../statistics.c:207 ++#, c-format ++msgid "%u packets to unknown port received." ++msgstr "Počet paketů přijatých pro neznámý port: %u" ++ ++#: ../statistics.c:200 ../statistics.c:208 ++#, c-format ++msgid "%u packet receive errors" ++msgstr "Počet chyb při příjmu paketů: %u" ++ ++#: ../statistics.c:201 ../statistics.c:209 ++#, c-format ++msgid "%u packets sent" ++msgstr "Počet odeslaných paketů: %u" ++ ++#: ../statistics.c:214 ++#, c-format ++msgid "%u SYN cookies sent" ++msgstr "Počet odeslaných SYN cookies: %u" + +-#: ../statistics.c:63 ++#: ../statistics.c:215 + #, c-format +-msgid "Forwarding is %s" +-msgstr "Pedvn je %s" ++msgid "%u SYN cookies received" ++msgstr "Počet přijatých SYN cookies: %u" + +-#: ../statistics.c:64 ++#: ../statistics.c:216 + #, c-format +-msgid "Default TTL is %d" +-msgstr "Implicitn TTL je %d" ++msgid "%u invalid SYN cookies received" ++msgstr "Počet chybných příchozích SYN cookies: %u" + +-#: ../statistics.c:65 ++#: ../statistics.c:218 + #, c-format +-msgid "%d total packets received" +-msgstr "celkem pijmutch paket: %d" ++msgid "%u resets received for embryonic SYN_RECV sockets" ++msgstr "Počet resetů přijatých pro sokety v zárodečném stavu SYN_PŘÍCH: %u" + +-#: ../statistics.c:66 ++#: ../statistics.c:220 + #, c-format +-msgid "%d with invalid headers" +-msgstr "s nesprvnmi hlavikami: %d" ++msgid "%u packets pruned from receive queue because of socket buffer overrun" ++msgstr "" ++"Počet packetů odstraněných z přijímací fronty kvůli přetečení bufferu " ++"socketu: %u" + +-#: ../statistics.c:67 ++#. obsolete: 2.2.0 doesn't do that anymore ++#: ../statistics.c:223 + #, c-format +-msgid "%d with invalid addresses" +-msgstr "s nesprvnmi adresami: %d" ++msgid "%u packets pruned from receive queue" ++msgstr "Počet packetů odstraněných z přijímací fronty: %u" + +-#: ../statistics.c:68 ++#: ../statistics.c:224 + #, c-format +-msgid "%d forwarded" +-msgstr "pedno: %d" ++msgid "" ++"%u packets dropped from out-of-order queue because of socket buffer overrun" ++msgstr "" ++"Počet packetů zahozených z fronty mimo-pořadí kvůli přetečení bufferu " ++"socketu: %u" + +-#: ../statistics.c:69 ++#: ../statistics.c:226 + #, c-format +-msgid "%d with unknown protocol" +-msgstr "s neznmm protokolem: %d" ++msgid "%u ICMP packets dropped because they were out-of-window" ++msgstr "Počet ICMP packetů zahozených, protože byly mimo okno: %u" + +-#: ../statistics.c:70 ++#: ../statistics.c:228 + #, c-format +-msgid "%d incoming packets discarded" +-msgstr "poet zahozench pchozch paket: %d" ++msgid "%u ICMP packets dropped because socket was locked" ++msgstr "Počet ICMP packetů zahozených kvůli zamčenému socketu: %u" + +-#: ../statistics.c:71 ++#: ../statistics.c:230 + #, c-format +-msgid "%d incoming packets delivered" +-msgstr "poet doruench pchozch paket: %d" ++msgid "%u TCP sockets finished time wait in fast timer" ++msgstr "" ++"Počet TCP socketů, které ukončily fázi time-wait uvnitř rychlého časovače: %u" + +-#: ../statistics.c:72 ++#: ../statistics.c:231 + #, c-format +-msgid "%d requests sent out" +-msgstr "poet odeslanch poadavk: %d" ++msgid "%u time wait sockets recycled by time stamp" ++msgstr "" ++"Počet socketů ve fázi time-wait, které byly znovu použity díky časovému " ++"razítku: %u" + +-#. ? +-#: ../statistics.c:73 ++#: ../statistics.c:232 + #, c-format +-msgid "%d outgoing packets dropped" +-msgstr "poet zahozench odchozch paket: %d" ++msgid "%u TCP sockets finished time wait in slow timer" ++msgstr "" ++"Počet TCP socketů, které ukončily fázi time-wait uvnitř pomalého časovače: %u" + +-#: ../statistics.c:74 ++#: ../statistics.c:233 + #, c-format +-msgid "%d dropped because of missing route" +-msgstr "zahozeno kvli chybjc cest: %d" ++msgid "%u passive connections rejected because of time stamp" ++msgstr "Počet odmítnutých pasivních spojení kvůli časovému razítku: %u" + +-#: ../statistics.c:75 ++#: ../statistics.c:235 + #, c-format +-msgid "%d fragments dropped after timeout" +-msgstr "poet fragment zahozench po vypren asu: %d" ++msgid "%u active connections rejected because of time stamp" ++msgstr "Počet odmítnutých aktivních spojení kvůli časovému razítku: %u" + +-#: ../statistics.c:76 ++#: ../statistics.c:237 + #, c-format +-msgid "%d reassemblies required" +-msgstr "poet nutnch znovusestaven: %d" ++msgid "%u packets rejects in established connections because of timestamp" ++msgstr "" ++"Počet odmítnutých packetů uvnitř navázaného spojení kvůli časovému razítku: %" ++"u" + +-#. ? +-#: ../statistics.c:77 ++#: ../statistics.c:239 + #, c-format +-msgid "%d packets reassembled ok" +-msgstr "poet v podku znovu sestavench paket: %d" ++msgid "%u delayed acks sent" ++msgstr "Počet odeslaných zpožděných potvrzení: %u" + +-#: ../statistics.c:78 ++#: ../statistics.c:240 + #, c-format +-msgid "%d packet reassembles failed" +-msgstr "poet paket, je se nepodailo znovu sestavit: %d" ++msgid "%u delayed acks further delayed because of locked socket" ++msgstr "" ++"Počet zpožděných potvrzení dále pozdržených kvůli zamčenému socketu: %u" + +-#: ../statistics.c:79 ++#: ../statistics.c:242 + #, c-format +-msgid "%d fragments received ok" +-msgstr "poet v podku pijmutch fragment: %d" ++msgid "Quick ack mode was activated %u times" ++msgstr "Počet aktivovaní rychlého potvrzovacího režimu: %u" + +-#: ../statistics.c:80 ++#: ../statistics.c:243 + #, c-format +-msgid "%d fragments failed" +-msgstr "poet chybnch fragment: %d" ++msgid "%u times the listen queue of a socket overflowed" ++msgstr "Počet přetečení naslouchací fronty socketu: %u" + +-#: ../statistics.c:81 ++#: ../statistics.c:245 + #, c-format +-msgid "%d fragments created" +-msgstr "poet vytvoench fragment: %d" ++msgid "%u SYNs to LISTEN sockets dropped" ++msgstr "Počet zahozených SYN packetů určených naslouchajícímu socketu: %u" + +-#: ../statistics.c:86 ++#: ../statistics.c:246 + #, c-format +-msgid "%d ICMP messages received" +-msgstr "poet pijmutch ICMP zprv: %d" ++msgid "%u packets directly queued to recvmsg prequeue." ++msgstr "Počet packetů přímo zařazených do předfronty recvmsg: %u" + +-#: ../statistics.c:87 ++#: ../statistics.c:248 + #, c-format +-msgid "%d input ICMP message failed." +-msgstr "poet chybnch pchozch ICMP zprv: %d" ++msgid "%u bytes directly in process context from backlog" ++msgstr "Počet bajtů předaných přímo z backlogu do kontextu procesu: %u" + +-#: ../statistics.c:88 ../statistics.c:101 ++#: ../statistics.c:249 + #, c-format +-msgid "destination unreachable: %d" +-msgstr "adrest nedostupn: %d" ++msgid "%u bytes directly received in process context from prequeue" ++msgstr "Počet bajtů přímo přijatých do kontextu procesu z předfronty: %u" + +-#: ../statistics.c:89 ++#: ../statistics.c:251 + #, c-format +-msgid "timeout in transit: %d" +-msgstr "vyprel as pi penosu: %d" ++msgid "%u packets dropped from prequeue" ++msgstr "Počet paketů odstraněných z předfronty: %u" + +-#: ../statistics.c:90 ../statistics.c:103 ++#: ../statistics.c:252 + #, c-format +-msgid "wrong parameters: %d" +-msgstr "chybn parametry: %d" ++msgid "%u packet headers predicted" ++msgstr "Počet předpovězených hlaviček packetů: %u" + +-#. ? +-#: ../statistics.c:91 ++#: ../statistics.c:253 + #, c-format +-msgid "source quenchs: %d" +-msgstr "zen toku dat: %d" ++msgid "%u packets header predicted and directly queued to user" ++msgstr "Počet hlaviček packetů předpovězených a přímo předaných uživateli: %u" + +-#: ../statistics.c:92 ++#: ../statistics.c:255 + #, c-format +-msgid "redirects: %d" +-msgstr "zmna cesty: %d" ++msgid "Ran %u times out of system memory during packet sending" ++msgstr "Kolikrát systému došla paměť při odesílání packetu: %u" + +-#: ../statistics.c:93 ++#: ../statistics.c:257 + #, c-format +-msgid "echo requests: %d" +-msgstr "dost o echo: %d" ++msgid "%u acknowledgments not containing data payload received" ++msgstr "Počet přijatých potvrzení neobsahující data: %u" + +-#: ../statistics.c:94 ../statistics.c:107 ++#: ../statistics.c:258 + #, c-format +-msgid "echo replies: %d" +-msgstr "odpov na dost o echo: %d" ++msgid "%u predicted acknowledgments" ++msgstr "Počet předpovězených potvrzení: %u" + +-#: ../statistics.c:95 ++#: ../statistics.c:259 + #, c-format +-msgid "timestamp request: %d" +-msgstr "dost o as: %d" ++msgid "%u times recovered from packet loss due to fast retransmit" ++msgstr "Počet zotavení ze ztráty packetu kvůli rychle opakovanému odeslání: %u" + +-#: ../statistics.c:96 ++#: ../statistics.c:260 + #, c-format +-msgid "timestamp reply: %d" +-msgstr "odpov na dost o as: %d" ++msgid "%u times recovered from packet loss by selective acknowledgements" ++msgstr "Počet zotavení ze ztráty packetu pomocí vyběrových potvrzení: %u" + +-#: ../statistics.c:97 ++#: ../statistics.c:261 + #, c-format +-msgid "address mask request: %d" +-msgstr "dost o masku podst: %d" ++msgid "%u bad SACK blocks received" ++msgstr "Počet přijatých chybných SACK bloků: %u" + +-#. ? +-#: ../statistics.c:98 +-msgid "address mask replies" +-msgstr "odpovdi na dost o masku podst" ++#: ../statistics.c:262 ++#, c-format ++msgid "Detected reordering %u times using FACK" ++msgstr "Kolikrát byla nalezena změna pořadí pomocí FACK: %u" + +-#. ? +-#: ../statistics.c:99 ++#: ../statistics.c:263 + #, c-format +-msgid "%d ICMP messages sent" +-msgstr "poet odeslanch ICMP zprv: %d" ++msgid "Detected reordering %u times using SACK" ++msgstr "Kolikrát byla nalezena změna pořadí pomocí SACK: %u" + +-#: ../statistics.c:100 ++#: ../statistics.c:264 + #, c-format +-msgid "%d ICMP messages failed" +-msgstr "poet chybnch ICMP zprv: %d" ++msgid "Detected reordering %u times using time stamp" ++msgstr "Kolikrát byla nalezena změna pořadí pomocí časového razítka: %u" + +-#: ../statistics.c:102 ++#: ../statistics.c:265 + #, c-format +-msgid "time exceeded: %d" +-msgstr "vypren ivotnosti: %d" ++msgid "Detected reordering %u times using reno fast retransmit" ++msgstr "" ++"Kolikrát byla nalezena změna pořadí kvůli rychlému znovuodeslání Reno: %u" + +-#. ? +-#: ../statistics.c:104 ++#: ../statistics.c:266 + #, c-format +-msgid "source quench: %d" +-msgstr "zen toku dat: %d" ++msgid "%u congestion windows fully recovered without slow start" ++msgstr "Počet plných zotavení ze zahlcení okna bez pomalého startu: %u" + +-#: ../statistics.c:105 ++#: ../statistics.c:267 + #, c-format +-msgid "redirect: %d" +-msgstr "zmna cesty: %d" ++msgid "%u congestion windows partially recovered using Hoe heuristic" ++msgstr "Počet částečných zotavení ze zahlcení okna pomocí heuristiky Hoe: %u" + +-#: ../statistics.c:106 ++#: ../statistics.c:268 + #, c-format +-msgid "echo request: %d" +-msgstr "dost o echo: %d" ++msgid "%u congestion window recovered without slow start using DSACK" ++msgstr "Počet zotavení ze zahlceného okna bez pomalého startu pomocí DSACK: %u" + +-#: ../statistics.c:108 ++#: ../statistics.c:269 + #, c-format +-msgid "timestamp requests: %d" +-msgstr "dost o as: %d" ++msgid "%u congestion windows recovered without slow start after partial ack" ++msgstr "" ++"Počet zotavení ze zahlcení okna bez pomalého startu po částečném potvrzení: %" ++"u" + +-#: ../statistics.c:109 ++#: ../statistics.c:270 + #, c-format +-msgid "timestamp replies: %d" +-msgstr "odpov na dost o as: %d" ++msgid "%u retransmits lost" ++msgstr "Počet ztracených opakovaných odeslání: %u" + +-#: ../statistics.c:110 ++#: ../statistics.c:271 + #, c-format +-msgid "address mask requests: %d" +-msgstr "dost o masku podst: %d" ++msgid "%u timeouts after reno fast retransmit" ++msgstr "Počet vypršení času po rychlém opakovaném odeslání Reno: %u" + +-#: ../statistics.c:111 ++#: ../statistics.c:272 + #, c-format +-msgid "address mask replies: %d" +-msgstr "odpov na dost o masku podst: %d" ++msgid "%u timeouts after SACK recovery" ++msgstr "Počet vypršení času po zotavení pomocí SACK: %u" + +-#: ../statistics.c:116 ++#: ../statistics.c:273 + #, c-format +-msgid "RTO algorithm is %s" +-msgstr "RTO algoritmus je %s" ++msgid "%u timeouts in loss state" ++msgstr "Počet vypršení času ve stavu ztráty: %u" + +-#: ../statistics.c:120 ++#: ../statistics.c:274 + #, c-format +-msgid "%d active connections openings" +-msgstr "poet aktivn navzanch spojen: %d" ++msgid "%u fast retransmits" ++msgstr "Počet rychlých opakování odeslání: %u" + +-#: ../statistics.c:121 ++#: ../statistics.c:275 + #, c-format +-msgid "%d passive connection openings" +-msgstr "poet pasivn navzanch spojen: %d" ++msgid "%u forward retransmits" ++msgstr "Počet dopředných opakovaných odeslání: %u" + +-#: ../statistics.c:122 ++#: ../statistics.c:276 + #, c-format +-msgid "%d failed connection attempts" +-msgstr "poet nespnch pokus o spojen: %d" ++msgid "%u retransmits in slow start" ++msgstr "Počet opakovaných odeslání v pomalém startu: %u" + +-#: ../statistics.c:123 ++#: ../statistics.c:277 + #, c-format +-msgid "%d connection resets received" +-msgstr "poet pijmutch reset: %d" ++msgid "%u other TCP timeouts" ++msgstr "Počet jiných vypršení časovače TCP: %u" + +-#: ../statistics.c:124 ++#: ../statistics.c:278 + #, c-format +-msgid "%d connections established" +-msgstr "poet navzanch spojen: %d" ++msgid "%u reno fast retransmits failed" ++msgstr "Počet selhání rychlých opakovaných odeslání Reno: %u" + +-#: ../statistics.c:125 ++#: ../statistics.c:279 + #, c-format +-msgid "%d segments received" +-msgstr "poet pijmutch segment: %d" ++msgid "%u SACK retransmits failed" ++msgstr "Počet selhání opakovaných odeslání SACK: %u" + +-#: ../statistics.c:126 ++#: ../statistics.c:280 + #, c-format +-msgid "%d segments send out" +-msgstr "poet odeslanch segment: %d" ++msgid "%u times receiver scheduled too late for direct processing" ++msgstr "Kolikrát byl přijímač naplánován příliš pozdě na přímé zpracovaní: %u" + +-#: ../statistics.c:127 ++#: ../statistics.c:281 + #, c-format +-msgid "%d segments retransmited" +-msgstr "poet penesench segment: %d" ++msgid "%u packets collapsed in receive queue due to low socket buffer" ++msgstr "" ++"Počet packetů sloučených v přijímací frontě kvůli malému bufferu socketu: %u" + +-#: ../statistics.c:128 ++#: ../statistics.c:282 + #, c-format +-msgid "%d bad segments received." +-msgstr "poet chybnch pchozch segment: %d." ++msgid "%u DSACKs sent for old packets" ++msgstr "Počet packetů DSACK odeslaných kvůli starým packetům: %u" + +-#: ../statistics.c:129 ++#: ../statistics.c:283 + #, c-format +-msgid "%d resets sent" +-msgstr "poet odeslanch reset: %d" ++msgid "%u DSACKs sent for out of order packets" ++msgstr "Počet packetů DSCACK odeslaných kvůli packetům mimo pořadí: %u" + +-#: ../statistics.c:134 ++#: ../statistics.c:284 + #, c-format +-msgid "%d packets received" +-msgstr "poet pijmutch paket: %d" ++msgid "%u DSACKs received" ++msgstr "Počet přijatých paketů DSACK: %u" + +-#: ../statistics.c:135 ++#: ../statistics.c:285 + #, c-format +-msgid "%d packets to unknown port received." +-msgstr "poet paket pijmutch pro neznm port: %d." ++msgid "%u DSACKs for out of order packets received" ++msgstr "Počet packetů DSACK přijatých kvůli packetům mimo pořadí: %u" + +-#: ../statistics.c:136 ++#: ../statistics.c:286 + #, c-format +-msgid "%d packet receive errors" +-msgstr "poet chyb pi pjmu paket: %d" ++msgid "%u connections reset due to unexpected SYN" ++msgstr "Počet resetů spojení kvůli neočekávanému SYN: %u" + +-#: ../statistics.c:137 ++#: ../statistics.c:287 + #, c-format +-msgid "%d packets sent" +-msgstr "poet odeslanch paket: %d" ++msgid "%u connections reset due to unexpected data" ++msgstr "Počet resetů spojení kvůli neočekávaným datům: %u" + +-#: ../statistics.c:142 ++#: ../statistics.c:288 + #, c-format +-msgid "%d SYN cookies sent" +-msgstr "poet odeslanch SYN cookies: %d" ++msgid "%u connections reset due to early user close" ++msgstr "Počet resetů spojení kvůli časnému uzavření uživatelem: %u" + +-#: ../statistics.c:143 ++#: ../statistics.c:289 + #, c-format +-msgid "%d SYN cookies received" +-msgstr "poet pijmutch SYN cookies: %d" ++msgid "%u connections aborted due to memory pressure" ++msgstr "Počet zrušených spojení kvůli paměťové tísni: %u" + +-#: ../statistics.c:144 ++#: ../statistics.c:290 + #, c-format +-msgid "%d invalid SYN cookies received" +-msgstr "poet chybnch pchozch SYN cookies: %d" ++msgid "%u connections aborted due to timeout" ++msgstr "Počet zrušených spojení kvůli vypršení časovače: %u" + +-#: ../statistics.c:146 ++#: ../statistics.c:291 + #, c-format +-msgid "%d resets received for embryonic SYN_RECV sockets" +-msgstr "poet reset pijmutch pro sokety ve stavu SYN_PCH: %d" ++msgid "%u connections aborted after user close in linger timeout" ++msgstr "" ++"Počet zrušených spojení po té, co je uživatel uzavřel ve fázi dožití: %u" + +-#: ../statistics.c:148 ++#: ../statistics.c:292 + #, c-format +-msgid "%d packets pruned from receive queue because of socket buffer overrun" +-msgstr "poet paket odstrannch z fronty kvli peteen bufferu soketu: %d" ++msgid "%u times unabled to send RST due to no memory" ++msgstr "Kolikrát nebylo možné odeslat RST kvůli nedostatku paměti: %u" + +-#. obsolete: 2.2.0 doesn't do that anymore +-#: ../statistics.c:151 ++#: ../statistics.c:293 + #, c-format +-msgid "%d packets pruned from out-of-order queue" +-msgstr "poet paket odstrannch z fronty mimo-poad: %d" ++msgid "TCP ran low on memory %u times" ++msgstr "Kolikrát TCP zpomalilo kvůli paměti: %u" + +-#: ../statistics.c:152 ++#: ../statistics.c:294 + #, c-format +-msgid "" +-"%d packets dropped from out-of-order queue because of socket buffer overrun" +-msgstr "" +-"poet paket zahozench z fronty mimo-poad kvli peteen bufferu soketu: " +-"%d" ++msgid "%u TCP data loss events" ++msgstr "Počet ztrát dat TCP: %u" + +-#: ../statistics.c:154 ++#: ../statistics.c:295 + #, c-format +-msgid "%d ICMP packets dropped because they were out-of-window" +-msgstr "poet ICMP paket zahozench, protoe byly mimo-okno: %d" ++msgid "%u congestion windows recovered without slow start by DSACK" ++msgstr "Počet zotavení ze zahlcení okna bez pomalého startu pomocí DSACK: %u" + +-#: ../statistics.c:156 ++#: ../statistics.c:297 + #, c-format +-msgid "%d ICMP packets dropped because socket was locked" +-msgstr "poet ICMP paket zahozench kvli zamenmu soketu: %d" ++msgid "%u classic Reno fast retransmits failed" ++msgstr "Počet selhání klasického rychlého opakovaného odeslání Reno: %u" + +-#: ../statistics.c:222 ++#: ../statistics.c:373 + msgid "enabled" + msgstr "zapnuto" + +-#: ../statistics.c:222 ++#: ../statistics.c:373 + msgid "disabled" + msgstr "vypnuto" + +-#: ../statistics.c:272 ++#: ../statistics.c:511 ../statistics.c:555 ++msgid "cannot open /proc/net/snmp" ++msgstr "/proc/net/snmp nelze otevřít" ++ ++#: ../statistics.c:516 + #, c-format +-msgid "unknown title %s\n" +-msgstr "titulek %s je neznm\n" ++msgid "Problem while parsing /proc/net/snmp\n" ++msgstr "Potíže při při zpracování /proc/net/snmp\n" + +-#: ../statistics.c:298 +-msgid "error parsing /proc/net/snmp" +-msgstr "chyba pi zpracovn /proc/net/snmp" ++#: ../statistics.c:527 ++#, c-format ++msgid "Problem while parsing /proc/net/netstat\n" ++msgstr "Potíže při při zpracování /proc/net/netstat\n" + +-#: ../statistics.c:311 +-msgid "cannot open /proc/net/snmp" +-msgstr "/proc/net/snmp nelze otevt" ++#: ../statistics.c:545 ++msgid "cannot open /proc/net/snmp6" ++msgstr "/proc/net/snmp6 nelze otevřít" + + #: ../lib/activate.c:69 + #, c-format + msgid "Hardware type `%s' not supported.\n" +-msgstr "Hardwarov typ `%s' nen podporovn.\n" ++msgstr "Hardwarový typ „%s“ není podporován.\n" + + #: ../lib/activate.c:73 + #, c-format + msgid "Cannot change line discipline to `%s'.\n" +-msgstr "Linkovou disciplnu nelze na `%s' zmnit.\n" ++msgstr "Linkovou disciplínu nelze na „%s“ změnit.\n" + +-#: ../lib/af.c:145 ../lib/hw.c:148 ++#: ../lib/af.c:157 ../lib/hw.c:166 + msgid "UNSPEC" +-msgstr "NEZNM" ++msgstr "NEZNÁM" + +-#: ../lib/af.c:147 ++#: ../lib/af.c:159 + msgid "UNIX Domain" +-msgstr "Domna UNIX" ++msgstr "Doména UNIX" + +-#: ../lib/af.c:150 ++#: ../lib/af.c:162 + msgid "DARPA Internet" + msgstr "DARPA Internet" + +-#: ../lib/af.c:153 ++#: ../lib/af.c:165 + msgid "IPv6" + msgstr "IPv6" + +-#: ../lib/af.c:156 ../lib/hw.c:169 ++#: ../lib/af.c:168 ../lib/hw.c:187 + msgid "AMPR AX.25" + msgstr "AMPR AX.25" + +-#: ../lib/af.c:159 ../lib/hw.c:175 ++#: ../lib/af.c:171 ../lib/hw.c:193 + msgid "AMPR NET/ROM" + msgstr "AMPR NET/ROM" + +-#: ../lib/af.c:162 ++#: ../lib/af.c:174 + msgid "Novell IPX" + msgstr "Novell IPX" + +-#: ../lib/af.c:165 ++#: ../lib/af.c:177 + msgid "Appletalk DDP" + msgstr "Appletalk DDP" + +-#: ../lib/af.c:168 ../lib/hw.c:207 ++#: ../lib/af.c:180 ../lib/hw.c:228 + msgid "Econet" + msgstr "Econet" + +-#: ../lib/af.c:171 ../lib/hw.c:172 ++#: ../lib/af.c:183 ++msgid "CCITT X.25" ++msgstr "CCITT X.25" ++ ++#: ../lib/af.c:186 ../lib/hw.c:190 + msgid "AMPR ROSE" + msgstr "AMPR ROSE" + +-#: ../lib/af.c:174 ../lib/hw.c:160 ++#: ../lib/af.c:189 ../lib/hw.c:178 + msgid "Ash" + msgstr "Ash" + +-#: ../lib/af.c:232 ++#: ../lib/af.c:247 ++#, c-format + msgid "Please don't supply more than one address family.\n" +-msgstr "Nezadvejte vce ne jednu tdu adres.\n" ++msgstr "Nezadávejte více než jednu třídu adres.\n" + +-#: ../lib/af.c:293 ++#: ../lib/af.c:308 ++#, c-format + msgid "Too much address family arguments.\n" +-msgstr "Bylo zadno pli mnoho td adres.\n" ++msgstr "Bylo zadáno příliš mnoho tříd adres.\n" + +-#: ../lib/af.c:304 ++#: ../lib/af.c:319 + #, c-format + msgid "Unknown address family `%s'.\n" +-msgstr "Tda adres `%s' nen znma.\n" +- +-#: ../lib/arcnet.c:53 ../lib/ax25.c:75 ../lib/ddp.c:50 ../lib/econet.c:52 +-#: ../lib/fddi.c:67 ../lib/hippi.c:68 ../lib/inet.c:244 ../lib/inet.c:259 +-#: ../lib/inet6.c:129 ../lib/ipx.c:81 ../lib/netrom.c:78 ../lib/rose.c:71 +-#: ../lib/rose.c:126 ../lib/unix.c:56 ../lib/unix.c:76 +-msgid "[NONE SET]" +-msgstr "[NENASTAVENO]" ++msgstr "Třída adres `%s' není známa.\n" + +-#: ../lib/arcnet.c:81 ../lib/arcnet.c:96 ++#: ../lib/arcnet.c:70 ../lib/arcnet.c:85 + #, c-format + msgid "in_arcnet(%s): invalid arcnet address!\n" +-msgstr "in_arcnet(%s): chybn arcnet adresa!\n" ++msgstr "in_arcnet(%s): chybná arcnet adresa!\n" + +-#: ../lib/arcnet.c:108 ++#: ../lib/arcnet.c:97 + #, c-format + msgid "in_arcnet(%s): trailing : ignored!\n" +-msgstr "in_arcnet(%s): nadbyten : ignorovno!\n" ++msgstr "in_arcnet(%s): nadbytečné : ignorováno!\n" + +-#: ../lib/arcnet.c:120 ++#: ../lib/arcnet.c:109 + #, c-format + msgid "in_arcnet(%s): trailing junk!\n" +-msgstr "in_arcnet(%s): nadbyten znaky!\n" ++msgstr "in_arcnet(%s): nadbytečné znaky!\n" + + #: ../lib/ash.c:81 ++#, c-format + msgid "Malformed Ash address" +-msgstr "Chybn Ash adresa" ++msgstr "Chybná Ash adresa" ++ ++#: ../lib/ax25.c:75 ../lib/ddp.c:50 ../lib/econet.c:52 ../lib/inet.c:244 ++#: ../lib/inet.c:259 ../lib/inet6.c:145 ../lib/ipx.c:81 ../lib/netrom.c:78 ++#: ../lib/rose.c:71 ../lib/unix.c:56 ../lib/unix.c:76 ++msgid "[NONE SET]" ++msgstr "[NENASTAVENO]" + + #: ../lib/ax25.c:97 ../lib/netrom.c:100 + msgid "Invalid callsign" +-msgstr "Nesprvn volac znak" ++msgstr "Nesprávný volací znak" + + #: ../lib/ax25.c:110 ../lib/netrom.c:113 + msgid "Callsign too long" +-msgstr "Volac znak je pli dlouh." ++msgstr "Volací znak je příliš dlouhý." + + #: ../lib/ax25_gr.c:47 ++#, c-format + msgid "AX.25 not configured in this system.\n" +-msgstr "AX.25 nen na tomto systmu nakonfigurovno.\n" ++msgstr "AX.25 není na tomto systému nakonfigurováno.\n" + + #: ../lib/ax25_gr.c:50 ++#, c-format + msgid "Kernel AX.25 routing table\n" +-msgstr "Smrovac tabulka v jdru pro AX.25\n" ++msgstr "Směrovací tabulka v jádru pro AX.25\n" + + #. xxx + #: ../lib/ax25_gr.c:51 ../lib/rose_gr.c:55 ++#, c-format + msgid "Destination Iface Use\n" +-msgstr "Adrest Rozhran Uit\n" +- +-#: ../lib/ddp_gr.c:21 +-msgid "Routing table for `ddp' not yet supported.\n" +-msgstr "Smrovac tabulka pro `ddp' nen zatm podporovna.\n" ++msgstr "Adresát Rozhraní Užití\n" + + #: ../lib/ether.c:74 ../lib/ether.c:91 + #, c-format + msgid "in_ether(%s): invalid ether address!\n" +-msgstr "in_ether(%s): chybn ethernetov adresa!\n" ++msgstr "in_ether(%s): chybná ethernetová adresa!\n" + + #: ../lib/ether.c:105 + #, c-format + msgid "in_ether(%s): trailing : ignored!\n" +-msgstr "in_ether(%s): nadbyten : ignorovno!\n" ++msgstr "in_ether(%s): nadbytečné : ignorováno!\n" + + #: ../lib/ether.c:117 + #, c-format + msgid "in_ether(%s): trailing junk!\n" +-msgstr "in_ether(%s): nadbyten znaky!\n" ++msgstr "in_ether(%s): nadbytečné znaky!\n" + +-#: ../lib/fddi.c:95 ../lib/fddi.c:110 ++#: ../lib/fddi.c:84 ../lib/fddi.c:99 + #, c-format + msgid "in_fddi(%s): invalid fddi address!\n" +-msgstr "in_fddi(%s): chybn fddi adresa!\n" ++msgstr "in_fddi(%s): chybná fddi adresa!\n" + +-#: ../lib/fddi.c:122 ++#: ../lib/fddi.c:111 + #, c-format + msgid "in_fddi(%s): trailing : ignored!\n" +-msgstr "in_fddi(%s): nadbyten : ignorovno!\n" ++msgstr "in_fddi(%s): nadbytečné : ignorováno!\n" + +-#: ../lib/fddi.c:134 ++#: ../lib/fddi.c:123 + #, c-format + msgid "in_fddi(%s): trailing junk!\n" +-msgstr "in_fddi(%s): nadbyten znaky!\n" ++msgstr "in_fddi(%s): nadbytečné znaky!\n" + +-#: ../lib/getroute.c:97 ../lib/setroute.c:76 ++#: ../lib/getroute.c:101 ../lib/setroute.c:80 + #, c-format + msgid "Address family `%s' not supported.\n" +-msgstr "Tda adres `%s' nen podporovna.\n" ++msgstr "Třída adres `%s' není podporována.\n" + +-#: ../lib/getroute.c:103 ../lib/setroute.c:80 ++#: ../lib/getroute.c:107 ../lib/setroute.c:84 + #, c-format + msgid "No routing for address family `%s'.\n" +-msgstr "Pro tdu adres `%s' nen dn smrovn.\n" ++msgstr "Pro třídu adres `%s' není žádné směrování.\n" + +-#: ../lib/hippi.c:96 ../lib/hippi.c:111 ++#: ../lib/hippi.c:84 ../lib/hippi.c:99 + #, c-format + msgid "in_hippi(%s): invalid hippi address!\n" +-msgstr "in_hippi(%s): chybn hippi adresa!\n" ++msgstr "in_hippi(%s): chybná hippi adresa!\n" + +-#: ../lib/hippi.c:123 ++#: ../lib/hippi.c:111 + #, c-format + msgid "in_hippi(%s): trailing : ignored!\n" +-msgstr "in_hippi(%s): nadbyten : ignorovno!\n" ++msgstr "in_hippi(%s): nadbytečné : ignorováno!\n" + +-#: ../lib/hippi.c:134 ++#: ../lib/hippi.c:122 + #, c-format + msgid "in_hippi(%s): trailing junk!\n" +-msgstr "in_hippi(%s): nadbyten znaky!\n" ++msgstr "in_hippi(%s): nadbytečné znaky!\n" + +-#: ../lib/hw.c:147 ++#: ../lib/hw.c:165 + msgid "Local Loopback" +-msgstr "Mstn smyka" ++msgstr "Místní smyčka" + +-#: ../lib/hw.c:150 ++#: ../lib/hw.c:168 + msgid "Serial Line IP" +-msgstr "IP po sriov lince" ++msgstr "IP po sériové lince" + +-#: ../lib/hw.c:151 ++#: ../lib/hw.c:169 + msgid "VJ Serial Line IP" +-msgstr "Vj IP po sriov lince" ++msgstr "VJ IP po sériové lince" + +-#: ../lib/hw.c:152 ++#: ../lib/hw.c:170 + msgid "6-bit Serial Line IP" +-msgstr "6bitov IP po sriov lince" ++msgstr "6bitový IP po sériové lince" + +-#: ../lib/hw.c:153 ++#: ../lib/hw.c:171 + msgid "VJ 6-bit Serial Line IP" +-msgstr "6bitov VJ IP po sriov lince" ++msgstr "6bitový VJ IP po sériové lince" + +-#: ../lib/hw.c:154 ++#: ../lib/hw.c:172 + msgid "Adaptive Serial Line IP" +-msgstr "Adaptivn IP po sriov lince" ++msgstr "Adaptivní IP po sériové lince" + +-#: ../lib/hw.c:157 ++#: ../lib/hw.c:175 + msgid "Ethernet" + msgstr "Ethernet" + +-#: ../lib/hw.c:163 ++#: ../lib/hw.c:181 + msgid "Fiber Distributed Data Interface" + msgstr "Fiber Distributed Data Interface" + +-#: ../lib/hw.c:166 ++#: ../lib/hw.c:184 + msgid "HIPPI" + msgstr "HIPPI" + +-#: ../lib/hw.c:178 ++#: ../lib/hw.c:196 ++msgid "generic X.25" ++msgstr "obecné X.25" ++ ++#: ../lib/hw.c:199 + msgid "IPIP Tunnel" + msgstr "IPIP Tunnel" + +-#: ../lib/hw.c:181 ++#: ../lib/hw.c:202 + msgid "Point-to-Point Protocol" +-msgstr "Point-to-Point Protokol" ++msgstr "Dvoubodový protokol" + +-#: ../lib/hw.c:184 ++#: ../lib/hw.c:205 + msgid "(Cisco)-HDLC" + msgstr "(Cisco)-HDLC" + +-#: ../lib/hw.c:185 ++#: ../lib/hw.c:206 + msgid "LAPB" + msgstr "LAPB" + +-#: ../lib/hw.c:188 ++#: ../lib/hw.c:209 + msgid "ARCnet" + msgstr "ARCnet" + +-#: ../lib/hw.c:191 ++#: ../lib/hw.c:212 + msgid "Frame Relay DLCI" + msgstr "Frame Relay DLCI" + +-#: ../lib/hw.c:192 ++#: ../lib/hw.c:213 + msgid "Frame Relay Access Device" +-msgstr "Pstupov zazen Frame Relay" ++msgstr "Přístupové zařízení Frame Relay" + +-#: ../lib/hw.c:195 ++#: ../lib/hw.c:216 + msgid "IPv6-in-IPv4" + msgstr "IPv6-in-IPv4" + +-#: ../lib/hw.c:198 ++#: ../lib/hw.c:219 + msgid "IrLAP" + msgstr "IrLAP" + +-#: ../lib/hw.c:201 ++#: ../lib/hw.c:222 + msgid "16/4 Mbps Token Ring" + msgstr "Token Ring 16/4 Mb/s" + +-#: ../lib/hw.c:203 +-#, fuzzy ++#: ../lib/hw.c:224 + msgid "16/4 Mbps Token Ring (New)" +-msgstr "Token Ring 16/4 Mb/s" ++msgstr "Token Ring 16/4 Mb/s (Nový)" + +-#: ../lib/inet.c:153 ../lib/inet6.c:79 ++#: ../lib/hw.c:231 ++msgid "InfiniBand" ++msgstr "InfiniBand" ++ ++#: ../lib/hw.c:234 ++msgid "Generic EUI-64" ++msgstr "Obecné EUI-64" ++ ++#: ../lib/inet.c:153 ../lib/inet6.c:94 + #, c-format + msgid "rresolve: unsupport address family %d !\n" +-msgstr "rresolve: tda adres %d nen podporovna!\n" ++msgstr "rresolve: třída adres %d není podporována!\n" + +-#: ../lib/inet6_gr.c:79 ++#: ../lib/inet6.c:147 ++msgid "[UNKNOWN]" ++msgstr "[NEZNÁMÝ]" ++ ++#: ../lib/inet6_gr.c:71 ++#, c-format + msgid "INET6 (IPv6) not configured in this system.\n" +-msgstr "INET6 (IPv6) nen na tomto systmu nakonfigurovno.\n" ++msgstr "INET6 (IPv6) není na tomto systému nakonfigurováno.\n" + +-#: ../lib/inet6_gr.c:82 ++#: ../lib/inet6_gr.c:76 ++#, c-format ++msgid "Kernel IPv6 routing cache\n" ++msgstr "Směrovací cache v jádru pro IPv6\n" ++ ++#: ../lib/inet6_gr.c:78 ++#, c-format + msgid "Kernel IPv6 routing table\n" +-msgstr "Smrovac tabulka v jdru pro IPv6\n" ++msgstr "Směrovací tabulka v jádru pro IPv6\n" + +-#: ../lib/inet6_gr.c:84 ++#: ../lib/inet6_gr.c:80 ++#, c-format + msgid "" +-"Destination Next Hop " +-" Flags Metric Ref Use Iface\n" ++"Destination Next Hop Flag Met Ref Use " ++"If\n" + msgstr "" +-"Adrest Dal Smrova " +-" Pzn Metrika Odkaz Uit Rozhran\n" ++"Adresát Další směrovač Příz Met Odk Užt " ++"Rozhr\n" + +-#: ../lib/inet6_gr.c:158 ++#: ../lib/inet6_gr.c:174 ++#, c-format + msgid "Kernel IPv6 Neighbour Cache\n" +-msgstr "Cache soused v jdru pro IPv6\n" ++msgstr "Cache sousedů v jádru pro IPv6\n" + +-#: ../lib/inet6_gr.c:161 ++#: ../lib/inet6_gr.c:177 ++#, c-format + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State\n" + msgstr "" +-"Soused HW Adresa Rozhran Pzn " ++"Soused HW Adresa Rozhraní Přízn " + "Odkazy Stav\n" + +-#: ../lib/inet6_gr.c:165 ++#: ../lib/inet6_gr.c:181 ++#, c-format + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State Stale(sec) Delete(sec)\n" + msgstr "" +-"Soused HW Adresa Rozhran " +-"Pznaky Odkazy Stav Prol(sec) Smazat(sec)\n" ++"Soused HW Adresa Rozhraní " ++"Příznaky Odkazy Stav Prošlý(sec) Smazat(sec)\n" + + #: ../lib/inet6_sr.c:46 ++#, c-format + msgid "Usage: inet6_route [-vF] del Target\n" +-msgstr "Pouit: inet6_route [-vF] del Cl\n" ++msgstr "Použití: inet6_route [-vF] del Cíl\n" + + #: ../lib/inet6_sr.c:47 ++#, c-format + msgid " inet6_route [-vF] add Target [gw Gw] [metric M] [[dev] If]\n" +-msgstr " inet6_route [-vF] add Cl [gw Gw] [metrika M] [[dev] If]\n" ++msgstr " inet6_route [-vF] add Cíl [gw Gw] [metrika M] [[dev] If]\n" + + #: ../lib/inet6_sr.c:48 ++#, c-format + msgid " inet6_route [-FC] flush NOT supported\n" +-msgstr " inet6_route [-FC] flush NEN podporovno\n" ++msgstr " inet6_route [-FC] flush NENÍ podporováno\n" + +-#: ../lib/inet6_sr.c:182 ++#: ../lib/inet6_sr.c:188 ++#, c-format + msgid "Flushing `inet6' routing table not supported\n" +-msgstr "Smrovac tabulku `inet6' nelze vyprazdovat\n" ++msgstr "Směrovací tabulku `inet6' nelze vyprazdňovat\n" + + #: ../lib/inet_gr.c:50 ../lib/inet_gr.c:220 ++#, c-format + msgid "INET (IPv4) not configured in this system.\n" +-msgstr "INET (IPv4) nen na tomto systmu nakonfigurovno.\n" ++msgstr "INET (IPv4) není na tomto systému nakonfigurováno.\n" + + #: ../lib/inet_gr.c:53 ++#, c-format + msgid "Kernel IP routing table\n" +-msgstr "Smrovac tabulka v jdru pro IP\n" ++msgstr "Směrovací tabulka v jádru pro IP\n" + + #: ../lib/inet_gr.c:56 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags Metric Ref Use " + "Iface\n" + msgstr "" +-"Adrest Brna Maska Pzn Metrik Odkaz Ut " +-"Rozhran\n" ++"Adresát Brána Maska Přízn Metrik Odkazů Užt " ++"Rozhraní\n" + + #: ../lib/inet_gr.c:59 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags MSS Window irtt " + "Iface\n" + msgstr "" +-"Adrest Brna Maska Pzn MSS Okno irtt " +-"Rozhran\n" ++"Adresát Brána Maska Přízn MSS Okno irtt " ++"Rozhraní\n" + + #: ../lib/inet_gr.c:62 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags Metric Ref Use " + "Iface MSS Window irtt\n" + msgstr "" +-"Adrest Brna Maska Pzn Metrik Odkazy Ut " +-"Rozhran MSS Okno irtt\n" ++"Adresát Brána Maska Přízn Metrik Odkazy Užt " ++"Rozhraní MSS Okno irtt\n" + + #: ../lib/inet_gr.c:237 ++#, c-format + msgid "Kernel IP routing cache\n" +-msgstr "Smrovac cache v jdru pro IP\n" ++msgstr "Směrovací cache v jádru pro IP\n" + + #: ../lib/inet_gr.c:258 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface\n" + msgstr "" +-"Odeslatel Adrest Maska Pzn Metrik Odkazy Ut " +-"Rozhran\n" ++"Odesílatel Adresát Maska Přízn Metrik Odkazy Užt " ++"Rozhraní\n" + + #: ../lib/inet_gr.c:261 ++#, c-format + msgid "" + "Source Destination Gateway Flags MSS Window irtt " + "Iface\n" + msgstr "" +-"Odeslatel Adrest Maska Pzn MSS Okno irtt " +-"Rozhran\n" ++"Odesílatel Adresát Maska Přízn MSS Okno irtt " ++"Rozhraní\n" + + #: ../lib/inet_gr.c:266 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface MSS Window irtt HH Arp\n" + msgstr "" +-"Odeslatel Adrest Maska Pzn Metrik Odkazy Ut " +-"Rozhran MSS Okno irtt HH Arp\n" ++"Odesílatel Adresát Maska Přízn Metrik Odkazy Užt " ++"Rozhraní MSS Okno irtt HH Arp\n" + + #: ../lib/inet_gr.c:290 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface MSS Window irtt TOS HHRef HHUptod SpecDst\n" + msgstr "" +-"Odeslatel Adrest Maska Pzn Metrik Odkazy Ut " +-"Rozhran MSS Okno irtt TOS HHOdk HHAktul ZvltCl\n" ++"Odesílatel Adresát Maska Přízn Metrik Odkazy Užt " ++"Rozhraní MSS Okno irtt TOS HHOdk HHAktuál ZvláštCíl\n" + +-#: ../lib/inet_sr.c:50 ++#: ../lib/inet_sr.c:51 ++#, c-format + msgid "" + "Usage: inet_route [-vF] del {-host|-net} Target[/prefix] [gw Gw] [metric M] " + "[[dev] If]\n" + msgstr "" +-"Pouit: inet_route [-vF] del {-host|-net} Cl[/prefix] [gw Gw] [metrika M] " ++"Použití: inet_route [-vF] del {-host|-net} Cíl[/prefix] [gw Gw] [metrika M] " + "[[dev] If]\n" + +-#: ../lib/inet_sr.c:51 ++#: ../lib/inet_sr.c:52 ++#, c-format + msgid "" + " inet_route [-vF] add {-host|-net} Target[/prefix] [gw Gw] [metric M]\n" + msgstr "" +-" inet_route [-vF] add {-host|-net} Cl[/prefix] [gw Gw] [metrika M]\n" ++" inet_route [-vF] add {-host|-net} Cíl[/prefix] [gw Gw] [metrika M]\n" + +-#: ../lib/inet_sr.c:52 ++#: ../lib/inet_sr.c:53 ++#, c-format + msgid "" + " [netmask N] [mss Mss] [window W] [irtt I]\n" + msgstr "" + " [netmask N] [mss Mss] [window W] [irtt I]\n" + +-#: ../lib/inet_sr.c:53 ++#: ../lib/inet_sr.c:54 ++#, c-format + msgid " [mod] [dyn] [reinstate] [[dev] If]\n" + msgstr " [mod] [dyn] [reinstate] [[dev] If]\n" + +-#: ../lib/inet_sr.c:54 ++#: ../lib/inet_sr.c:55 ++#, c-format + msgid "" + " inet_route [-vF] add {-host|-net} Target[/prefix] [metric M] reject\n" + msgstr "" +-" inet_route [-vF] add {-host|-net} Cl/[prefix] [metrika M] reject\n" ++" inet_route [-vF] add {-host|-net} Cíl/[prefix] [metrika M] reject\n" + +-#: ../lib/inet_sr.c:55 ++#: ../lib/inet_sr.c:56 ++#, c-format + msgid " inet_route [-FC] flush NOT supported\n" +-msgstr " inet_route [-FC] flush NEN podporovno\n" ++msgstr " inet_route [-FC] flush NENÍ podporováno\n" + + #: ../lib/inet_sr.c:158 + #, c-format + msgid "route: %s: cannot use a NETWORK as gateway!\n" +-msgstr "route: %s: s nelze pout jako brnu!\n" ++msgstr "route: %s: síť nelze použít jako bránu!\n" + + #: ../lib/inet_sr.c:174 +-#, fuzzy ++#, c-format + msgid "route: Invalid MSS/MTU.\n" +-msgstr "route: Nesprvn NSS.\n" ++msgstr "route: Neplatné MSS/MTU.\n" + + #: ../lib/inet_sr.c:187 ++#, c-format + msgid "route: Invalid window.\n" +-msgstr "route: Nesprvn okno.\n" ++msgstr "route: Nesprávné okno.\n" + + #: ../lib/inet_sr.c:203 ++#, c-format + msgid "route: Invalid initial rtt.\n" +-msgstr "route: Nesprvn zahajovac rtt.\n" ++msgstr "route: Nesprávné zahajovací rtt.\n" + + #: ../lib/inet_sr.c:261 + #, c-format + msgid "route: netmask %.8x doesn't make sense with host route\n" +-msgstr "route: sov maska %.8x nedv smysl, kdy clem je cesty pota\n" ++msgstr "route: síťová maska %.8x nedává smysl, když cílem je cesty počítač\n" + + #: ../lib/inet_sr.c:265 + #, c-format + msgid "route: bogus netmask %s\n" +-msgstr "route: sov maska %s je nesprvn\n" ++msgstr "route: síťová maska %s je nesprávná\n" + + #: ../lib/inet_sr.c:270 ++#, c-format + msgid "route: netmask doesn't match route address\n" +-msgstr "route: sov maska nevyhovuje adrese cesty\n" ++msgstr "route: síťová maska nevyhovuje adrese cesty\n" + + #: ../lib/inet_sr.c:306 ++#, c-format + msgid "Flushing `inet' routing table not supported\n" +-msgstr "Smrovac cache `inet' nelze vyprazdovat\n" ++msgstr "Směrovací cache `inet' nelze vyprazdňovat\n" + + #: ../lib/inet_sr.c:310 ++#, c-format + msgid "Modifying `inet' routing cache not supported\n" +-msgstr "Smrovac cache `inet' nelze mnit\n" ++msgstr "Směrovací cache `inet' nelze měnit\n" + +-#: ../lib/ipx_gr.c:52 +-msgid "IPX not configured in this system.\n" +-msgstr "IPX nen na tomto systmu nakonfigurovno.\n" ++#: ../lib/ipx_gr.c:53 ++#, c-format ++msgid "IPX routing not in file %s or %s found.\n" ++msgstr "Směrování IPX nenalezeno v souboru %s nebo %s.\n" + +-#: ../lib/ipx_gr.c:56 ++#: ../lib/ipx_gr.c:62 ++#, c-format + msgid "Kernel IPX routing table\n" +-msgstr "Smrovac tabulka v jdru pro IPX\n" ++msgstr "Směrovací tabulka v jádru pro IPX\n" + + #. xxx +-#: ../lib/ipx_gr.c:57 ++#: ../lib/ipx_gr.c:63 ++#, c-format + msgid "Destination Router Net Router Node\n" +-msgstr "Cl Smrova S Smrova Uzel\n" ++msgstr "Cíl Směrovač Síť Směrovač Uzel\n" + + #: ../lib/ipx_sr.c:33 ++#, c-format + msgid "IPX: this needs to be written\n" +-msgstr "IPX: toto je teba uloit\n" ++msgstr "IPX: toto je třeba uložit\n" + +-#: ../lib/masq_info.c:197 ++#: ../lib/masq_info.c:198 ++#, c-format + msgid "IP masquerading entries\n" +-msgstr "IP maskovac poloky\n" ++msgstr "IP maskovací položky\n" + +-#: ../lib/masq_info.c:200 ++#: ../lib/masq_info.c:201 ++#, c-format + msgid "prot expire source destination ports\n" +-msgstr "prot ivot zdroj cl porty\n" ++msgstr "prot život zdroj cíl porty\n" + +-#: ../lib/masq_info.c:203 ++#: ../lib/masq_info.c:204 ++#, c-format + msgid "" +-"prot expire initseq delta prevd source destination " +-" ports\n" ++"prot expire initseq delta prevd source " ++"destination ports\n" + msgstr "" +-"prot ivot zahajsek delta pedchd zdroj cl " +-" porty\n" ++"prot život zahajsek delta předchd zdroj " ++"cíl porty\n" + + #: ../lib/netrom_gr.c:48 ++#, c-format + msgid "NET/ROM not configured in this system.\n" +-msgstr "NET/ROM nen na tomto systmu nakonfigurovno.\n" ++msgstr "NET/ROM není na tomto systému nakonfigurováno.\n" + + #: ../lib/netrom_gr.c:51 ++#, c-format + msgid "Kernel NET/ROM routing table\n" +-msgstr "Smrovac tabulka v jdru pro NET/ROM\n" ++msgstr "Směrovací tabulka v jádru pro NET/ROM\n" + + #: ../lib/netrom_gr.c:52 ++#, c-format + msgid "Destination Mnemonic Quality Neighbour Iface\n" +-msgstr "Cl Mnemonika Kvalita Soused Rozhran\n" ++msgstr "Cíl Mnemonika Kvalita Soused Rozhraní\n" + + #: ../lib/netrom_sr.c:34 ++#, c-format + msgid "netrom usage\n" +-msgstr "pouit netrom\n" ++msgstr "použití netrom\n" + + #: ../lib/netrom_sr.c:44 ++#, c-format + msgid "NET/ROM: this needs to be written\n" +-msgstr "NET/ROM: toto je poteba uloit\n" ++msgstr "NET/ROM: toto je potřeba uložit\n" + + #: ../lib/ppp.c:44 ++#, c-format + msgid "You cannot start PPP with this program.\n" +-msgstr "Tmto programem nelze PPP spustit.\n" ++msgstr "Tímto programem nelze PPP spustit.\n" + + #: ../lib/ppp_ac.c:38 ++#, c-format + msgid "Sorry, use pppd!\n" +-msgstr "Lituji, pouijte pppd!\n" ++msgstr "Lituji, použijte pppd!\n" + + #: ../lib/rose.c:87 + msgid "Node address must be ten digits" +-msgstr "Adresa uzlu mus mt 10 slic" ++msgstr "Adresa uzlu musí mít 10 číslic" + + #: ../lib/rose_gr.c:51 ++#, c-format + msgid "ROSE not configured in this system.\n" +-msgstr "ROSE nen na tomto systmu nakonfigurovno.\n" ++msgstr "ROSE není na tomto systému nakonfigurováno.\n" + + #: ../lib/rose_gr.c:54 ++#, c-format + msgid "Kernel ROSE routing table\n" +-msgstr "Smrovac tabulka v jdru pro ROSE\n" ++msgstr "Směrovací tabulka v jádru pro ROSE\n" + +-#: ../lib/tr.c:70 ../lib/tr.c:85 ++#: ../lib/tr.c:86 ../lib/tr.c:101 + #, c-format + msgid "in_tr(%s): invalid token ring address!\n" +-msgstr "in_tr(%s): nesprvn token ring adresa!\n" ++msgstr "in_tr(%s): nesprávná token ring adresa!\n" + +-#: ../lib/tr.c:97 ++#: ../lib/tr.c:113 + #, c-format + msgid "in_tr(%s): trailing : ignored!\n" +-msgstr "in_tr(%s): nadbyten: ignorovno!\n" ++msgstr "in_tr(%s): nadbytečné: ignorováno!\n" + +-#: ../lib/tr.c:109 ++#: ../lib/tr.c:125 + #, c-format + msgid "in_tr(%s): trailing junk!\n" +-msgstr "in_tr(%s): nadbyten znaky!\n" ++msgstr "in_tr(%s): nadbytečné znaky!\n" + +-#: ../lib/interface.c:124 ++#: ../lib/interface.c:176 + #, c-format + msgid "warning: no inet socket available: %s\n" +-msgstr "varovn: nen dostupn dn inet soket: %s\n" ++msgstr "varování: není dostupný žádný inet soket: %s\n" + +-#: ../lib/interface.c:270 ++#: ../lib/interface.c:325 + #, c-format + msgid "Warning: cannot open %s (%s). Limited output.\n" +-msgstr "" ++msgstr "Pozor: %s nelze otevřít (%s). Výstup omezen.\n" + + #. Give better error message for this case. +-#: ../lib/interface.c:504 ++#: ../lib/interface.c:571 + msgid "Device not found" +-msgstr "Zazen nebylo nalezeno" ++msgstr "Zařízení nebylo nalezeno" + +-#: ../lib/interface.c:508 ++#: ../lib/interface.c:575 + #, c-format + msgid "%s: error fetching interface information: %s\n" +-msgstr "%s: chyba pi zskvn informac o rozhran %s\n" ++msgstr "%s: chyba při získávání informací o rozhraní %s\n" ++ ++#: ../lib/interface.c:608 ++msgid " - no statistics available -" ++msgstr " - statistická data nejsou dostupná -" ++ ++#: ../lib/interface.c:612 ++#, c-format ++msgid "[NO FLAGS]" ++msgstr "[ŽÁDNÉ PŘÍZNAKY]" ++ ++#: ../lib/interface.c:694 ++msgid "UP," ++msgstr "AKTIVOVÁNO," ++ ++#: ../lib/interface.c:696 ++msgid "BROADCAST," ++msgstr "VŠESMĚR," ++ ++#: ../lib/interface.c:698 ++msgid "DEBUG," ++msgstr "LADĚNÍ," ++ ++#: ../lib/interface.c:700 ++msgid "LOOPBACK," ++msgstr "SMYČKA," ++ ++#: ../lib/interface.c:702 ++msgid "POINTOPOINT," ++msgstr "DVOUBODOVÉ," ++ ++# ?? ++#: ../lib/interface.c:704 ++msgid "NOTRAILERS," ++msgstr "ŽÁDNÉ_TRAILERS" ++ ++#: ../lib/interface.c:706 ++msgid "RUNNING," ++msgstr "BĚŽÍ," ++ ++#: ../lib/interface.c:708 ++msgid "NOARP," ++msgstr "NEARP," ++ ++#: ../lib/interface.c:710 ++msgid "PROMISC," ++msgstr "PROMISK," ++ ++#: ../lib/interface.c:712 ++msgid "ALLMULTI," ++msgstr "ALLMULTI," ++ ++#: ../lib/interface.c:714 ++msgid "SLAVE," ++msgstr "PODŘÍZENÝ," ++ ++#: ../lib/interface.c:716 ++msgid "MASTER," ++msgstr "NADŘÍZENÝ," ++ ++#: ../lib/interface.c:718 ++msgid "MULTICAST," ++msgstr "MULTICAST," ++ ++#: ../lib/interface.c:721 ++msgid "DYNAMIC," ++msgstr "DYNAMIC," ++ ++#: ../lib/interface.c:730 ++#, c-format ++msgid "%s: %s mtu %d metric %d" ++msgstr "%s: %s mtu %d metrika %d" ++ ++#: ../lib/interface.c:734 ++#, c-format ++msgid " outfill %d keepalive %d" ++msgstr " outfill %d keepalive %d" ++ ++#: ../lib/interface.c:743 ../lib/interface.c:841 ++#, c-format ++msgid " %s %s" ++msgstr " %s %s" ++ ++#: ../lib/interface.c:745 ++#, c-format ++msgid " netmask %s" ++msgstr " síťová_maska %s" ++ ++#: ../lib/interface.c:747 ++#, c-format ++msgid " broadcast %s" ++msgstr " všesměr %s" ++ ++#: ../lib/interface.c:750 ++#, c-format ++msgid " destination %s" ++msgstr " cíl %s" ++ ++#: ../lib/interface.c:769 ++#, c-format ++msgid " %s %s prefixlen %d" ++msgstr " %s %s délka_prefixu %d" ++ ++#: ../lib/interface.c:773 ++#, c-format ++msgid " scopeid 0x%x" ++msgstr " scopeid 0x%x" ++ ++#: ../lib/interface.c:777 ++msgid "compat," ++msgstr "kompat," ++ ++#: ../lib/interface.c:781 ++msgid "global," ++msgstr "globální," ++ ++#: ../lib/interface.c:783 ++msgid "link," ++msgstr "linka," ++ ++#: ../lib/interface.c:785 ++msgid "site," ++msgstr "oblast," ++ ++#: ../lib/interface.c:787 ++msgid "host," ++msgstr "stroj," ++ ++#: ../lib/interface.c:805 ++#, c-format ++msgid " %s Ethernet-II %s\n" ++msgstr " %s Ethernet-II %s\n" ++ ++#: ../lib/interface.c:808 ++#, c-format ++msgid " %s Ethernet-SNAP %s\n" ++msgstr " %s Ethernet-SNAP %s\n" ++ ++#: ../lib/interface.c:811 ++#, c-format ++msgid " %s Ethernet802.2 %s\n" ++msgstr " %s Ethernet802.2 %s\n" ++ ++#: ../lib/interface.c:814 ++#, c-format ++msgid " %s Ethernet802.3 %s\n" ++msgstr " %s Ethernet802.3 %s\n" ++ ++#: ../lib/interface.c:824 ../lib/interface.c:833 ++#, c-format ++msgid " %s %s\n" ++msgstr " %s %s\n" ++ ++#: ../lib/interface.c:843 ++#, c-format ++msgid " %s" ++msgstr " %s" ++ ++#: ../lib/interface.c:845 ++#, c-format ++msgid " txqueuelen %d" ++msgstr " délka_odchozí_fronty %d" ++ ++#: ../lib/interface.c:850 ++#, c-format ++msgid " media %s" ++msgstr " médium %s" ++ ++#: ../lib/interface.c:852 ++#, c-format ++msgid "autoselect" ++msgstr "automatika" ++ ++#: ../lib/interface.c:903 ++#, c-format ++msgid "RX packets %llu bytes %llu (%lu.%lu %s)\n" ++msgstr "RX packetů %llu bajtů %llu (%lu,%lu %s)\n" ++ ++#: ../lib/interface.c:909 ++#, c-format ++msgid "RX compressed:%lu\n" ++msgstr "RX komprimováno %lu\n" ++ ++#: ../lib/interface.c:912 ++#, c-format ++msgid "RX errors %lu dropped %lu overruns %lu frame %lu\n" ++msgstr "RX chyb %lu zahozeno %lu přetečení %lu rámců %lu\n" ++ ++#: ../lib/interface.c:918 ++#, c-format ++msgid "TX packets %llu bytes %llu (%lu.%lu %s)\n" ++msgstr "TX packetů %llu bajtů %llu (%lu,%lu %s)\n" ++ ++#: ../lib/interface.c:924 ++#, c-format ++msgid "TX compressed %lu\n" ++msgstr "TX komprimováno %lu\n" ++ ++# carrier? ++#: ../lib/interface.c:927 ++#, c-format ++msgid "TX errors %lu dropped %lu overruns %lu carrier %lu collisions %lu\n" ++msgstr "TX chyb %lu zahozeno %lu přetečení %lu přenos %lu kolizí %lu\n" + +-#: ../lib/sockets.c:59 ++#: ../lib/interface.c:937 ++#, c-format ++msgid "interrupt %d " ++msgstr "přerušení %d " ++ ++#. Only print devices using it for ++#. I/O maps ++#: ../lib/interface.c:940 ++#, c-format ++msgid "base 0x%x " ++msgstr "základ 0x%x " ++ ++#: ../lib/interface.c:942 ++#, c-format ++msgid "memory 0x%lx-%lx " ++msgstr "paměť 0x%lx–%lx " ++ ++#: ../lib/interface.c:945 ++#, c-format ++msgid " dma 0x%x" ++msgstr " DMA 0x%x" ++ ++#: ../lib/sockets.c:63 ++#, c-format + msgid "No usable address families found.\n" +-msgstr "Nebyla nalezena dn pouiteln tda adres.\n" ++msgstr "Nebyla nalezena žádná použitelná třída adres.\n" + + #: ../lib/util-ank.c:229 + #, c-format + msgid "ip: %s is invalid inet address\n" +-msgstr "ip: %s nen platnou inet adresou\n" ++msgstr "ip: %s není platnou inet adresou\n" + + #: ../lib/util-ank.c:238 + #, c-format + msgid "ip: %s is invalid inet prefix\n" +-msgstr "ip: %s nen platnm inet prefixem\n" ++msgstr "ip: %s není platným inet prefixem\n" + + #: ../lib/util-ank.c:248 + #, c-format + msgid "ip: %s is invalid IPv4 address\n" +-msgstr "ip: %s nen platnou IPv4 adresou\n" ++msgstr "ip: %s není platnou IPv4 adresou\n" + + #: ../lib/util-ank.c:256 + #, c-format + msgid "ip: argument is wrong: %s\n" +-msgstr "ip: argument %s je nesprvn\n" ++msgstr "ip: argument %s je nesprávný\n" + +-#: ../ipmaddr.c:56 ++#: ../ipmaddr.c:61 ++#, c-format + msgid "Usage: ipmaddr [ add | del ] MULTIADDR dev STRING\n" +-msgstr " Usage: ipmaddr [ add | del ] MULTIADR dev ETZEC\n" ++msgstr " Usage: ipmaddr [ add | del ] MULTIADR dev ŘETĚZEC\n" + +-#: ../ipmaddr.c:57 ++#: ../ipmaddr.c:62 ++#, c-format + msgid " ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n" +-msgstr " ipmaddr show [ dev ETZEC ] [ ipv4 | ipv6 | link | all ]\n" ++msgstr " ipmaddr show [ dev ŘETĚZEC ] [ ipv4 | ipv6 | link | all ]\n" + +-#: ../ipmaddr.c:58 ++#: ../ipmaddr.c:63 ++#, c-format + msgid " ipmaddr -V | -version\n" + msgstr " ipmaddr -V | -version\n" + +-#: ../ipmaddr.c:258 ++#: ../ipmaddr.c:263 + #, c-format + msgid "family %d " +-msgstr "tda %d " ++msgstr "třída %d " + +-#: ../ipmaddr.c:267 ++#: ../ipmaddr.c:272 + #, c-format + msgid " users %d" +-msgstr " uivatel %d" ++msgstr " uživatelé %d" + +-#: ../ipmaddr.c:353 ++#: ../ipmaddr.c:361 + msgid "Cannot create socket" +-msgstr "Soket nelze vytvoit" ++msgstr "Soket nelze vytvořit" + + #: ../slattach.c:180 + #, c-format + msgid "slattach: /dev/%s already locked!\n" +-msgstr "slattach: zazen /dev/%s je ji zameno!\n" ++msgstr "slattach: zařízení /dev/%s je již zamčeno!\n" + + #: ../slattach.c:186 + #, c-format +@@ -2433,80 +3184,169 @@ msgid "slattach: tty_lock: (%s): %s\n" + msgstr "slattach: tty_lock: (%s): %s\n" + + #: ../slattach.c:192 ++#, c-format + msgid "slattach: cannot write PID file\n" + msgstr "slattach: do PID souboru nelze zapisovat\n" + + #: ../slattach.c:202 + #, c-format + msgid "slattach: tty_lock: UUCP user %s unknown!\n" +-msgstr "slattach: tty_lock: uivatel UUCP %s nen znm!\n" ++msgstr "slattach: tty_lock: uživatel UUCP %s není znám!\n" + +-#: ../slattach.c:430 ++#: ../slattach.c:432 + #, c-format + msgid "slattach: tty_hangup(DROP): %s\n" + msgstr "slattach: tty_hangup(DROP): %s\n" + +-#: ../slattach.c:437 ++#: ../slattach.c:439 + #, c-format + msgid "slattach: tty_hangup(RAISE): %s\n" + msgstr "slattach: tty_hangup(RAISE): %s\n" + +-#: ../slattach.c:486 ++#: ../slattach.c:470 ++#, c-format ++msgid "slattach: tty name too long\n" ++msgstr "slattach: název TTY je příliš dlouhý\n" ++ ++#: ../slattach.c:500 ++#, c-format + msgid "slattach: tty_open: cannot get current state!\n" +-msgstr "slattach: tty_open: aktuln stav nelze zjistit!\n" ++msgstr "slattach: tty_open: aktuální stav nelze zjistit!\n" + +-#: ../slattach.c:493 ++#: ../slattach.c:507 ++#, c-format + msgid "slattach: tty_open: cannot get current line disc!\n" +-msgstr "slattach: tty_open: aktuln linkovou disciplnu nelze zjistit!\n" ++msgstr "slattach: tty_open: aktuální linkovou disciplínu nelze zjistit!\n" + +-#: ../slattach.c:501 ++#: ../slattach.c:515 ++#, c-format + msgid "slattach: tty_open: cannot set RAW mode!\n" +-msgstr "slattach: tty_open: reim RAW nelze nastavit!\n" ++msgstr "slattach: tty_open: režim RAW nelze nastavit!\n" + +-#: ../slattach.c:508 ++#: ../slattach.c:522 + #, c-format + msgid "slattach: tty_open: cannot set %s bps!\n" + msgstr "slattach: tty_open: %s bps nelze nastavit!\n" + +-#: ../slattach.c:518 ++#: ../slattach.c:532 ++#, c-format + msgid "slattach: tty_open: cannot set 8N1 mode!\n" +-msgstr "slattach: tty_open: reim 8N1 nelze nastavit!\n" ++msgstr "slattach: tty_open: režim 8N1 nelze nastavit!\n" ++ ++#: ../slattach.c:674 ++#, c-format ++msgid "slattach: setvbuf(stdout,0,_IOLBF,0) : %s\n" ++msgstr "slattach: setvbuf(stdout, 0, _IOLBF, 0): %s\n" + +-#: ../slattach.c:686 ++#: ../slattach.c:706 + #, c-format + msgid "%s started" +-msgstr "protokol %s sputn" ++msgstr "protokol %s spuštěn" + +-#: ../slattach.c:687 ++#: ../slattach.c:707 + #, c-format + msgid " on %s" + msgstr " na %s" + +-#: ../slattach.c:688 ++#: ../slattach.c:708 + #, c-format + msgid " interface %s\n" +-msgstr " rozhran %s\n" ++msgstr " rozhraní %s\n" ++ ++#~ msgid "" ++#~ " arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [netmask <nm>] pub " ++#~ "<-''-\n" ++#~ msgstr "" ++#~ " arp [-v] [<HW>] [-i <if>] -s <soubor> <hwadr> [síťmask <čís>] <-''-\n" ++ ++#~ msgid "%-9.9s Link encap:%s " ++#~ msgstr "%-9.9s Zapouzdření:%s " ++ ++#~ msgid "HWaddr %s " ++#~ msgstr "HWadr %s " ++ ++#~ msgid "Media:%s" ++#~ msgstr "Médium:%s" ++ ++#~ msgid "(auto)" ++#~ msgstr "(auto)" ++ ++#~ msgid " P-t-P:%s " ++#~ msgstr " P-t-P:%s " ++ ++# V ostatních katalozích se překládá Broadcast -> všesměrové vysílání. ++# Tudiž bcast -> Všesměr :) ++#~ msgid " Bcast:%s " ++#~ msgstr " Všesměr:%s " ++ ++#~ msgid " Mask:%s\n" ++#~ msgstr "Maska:%s\n" ++ ++#~ msgid " Scope:" ++#~ msgstr " Rozsah:" ++ ++#~ msgid "Unknown" ++#~ msgstr "Neznám." ++ ++#~ msgid " EtherTalk Phase 2 addr:%s\n" ++#~ msgstr " EtherTalk Phase 2 adr:%s\n" ++ ++#~ msgid " econet addr:%s\n" ++#~ msgstr " econet adr:%s\n" ++ ++# Hic sunt leones ... ++#~ msgid "[NO FLAGS] " ++#~ msgstr "[ŽÁDNÉ PŘÍZNAKY]" ++ ++#~ msgid " MTU:%d Metric:%d" ++#~ msgstr " MTU:%d Metrika:%d" ++ ++#~ msgid " compressed:%lu\n" ++#~ msgstr " komprimováno:%lu\n" ++ ++#~ msgid " collisions:%lu " ++#~ msgstr " kolizí:%lu " ++ ++#~ msgid "DMA chan:%x " ++#~ msgstr "Kanál DMA:%x " ++ ++#~ msgid "%s: unknown interface: %s\n" ++#~ msgstr "%s: rozhraní %s není známo\n" ++ ++#~ msgid "address mask replies" ++#~ msgstr "odpovědi na žádost o masku podsítě" ++ ++#~ msgid "unknown title %s\n" ++#~ msgstr "titulek %s je neznámý\n" ++ ++#~ msgid "Routing table for `ddp' not yet supported.\n" ++#~ msgstr "Směrovací tabulka pro `ddp' není zatím podporována.\n" ++ ++#~ msgid "IPX not configured in this system.\n" ++#~ msgstr "IPX není na tomto systému nakonfigurováno.\n" + + #~ msgid "" +-#~ " This comand can read or set the hostname or the NIS domainname. You can\n" ++#~ " This comand can read or set the hostname or the NIS domainname. You " ++#~ "can\n" + #~ msgstr "" +-#~ " Tento program zjiuje a nastavuje jmno potae i NIS domny. Me " +-#~ "tak\n" ++#~ " Tento program zjišťuje a nastavuje jméno počítače či NIS domény. Může " ++#~ "také\n" + + #~ msgid "" + #~ " also read the DNS domain or the FQDN (fully qualified domain name).\n" +-#~ msgstr " zjistit DNS domnu i kanonick jmno potae.\n" ++#~ msgstr " zjistit DNS doménu či kanonické jméno počítače.\n" + + #~ msgid "" + #~ " Unless you are using bind or NIS for host lookups you can change the\n" + #~ msgstr "" +-#~ " Pokud nepouvte bind i NIS pro vyhledvn jmen pota, pak mete\n" ++#~ " Pokud nepoužíváte bind či NIS pro vyhledávání jmen počítačů, pak " ++#~ "můžete\n" + + #~ msgid "" + #~ " FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n" + #~ msgstr "" +-#~ " zmnit kanonick jmno potae a jmno DNS domny (je soust " +-#~ "kanonickho\n" ++#~ " změnit kanonické jméno počítače a jméno DNS domény (je součástí " ++#~ "kanonického\n" + + #~ msgid " part of the FQDN) in the /etc/hosts file.\n" +-#~ msgstr " jmna potae) v souboru /etc/hosts.\n" ++#~ msgstr " jména počítače) v souboru /etc/hosts.\n" +diff --git a/po/de.po b/po/de.po +index f884dd9..9f8f679 100644 +--- a/po/de.po ++++ b/po/de.po +@@ -1,4 +1,4 @@ +-# $Id: de.po,v 1.10 2000/08/01 03:19:48 ecki Exp $ ++# $Id: de.po,v 1.11 2003/10/25 21:15:09 ecki Exp $ + # German translation for net-tools 1.51 + # Copyright (C) 1999 Ralf Bchle <ralf@gnu.org> + msgid "" +@@ -9,7 +9,7 @@ msgstr "" + "Last-Translator: Ralf Bchle <ralf@gnu.org>\n" + "Language-Team:\n" + "MIME-Version: 1.0\n" +-"Content-Type: text/plain; charset=iso8859-1\n" ++"Content-Type: text/plain; charset=iso-8859-1\n" + "Content-Transfer-Encoding: 8bit\n" + + #: ../arp.c:110 ../arp.c:269 +@@ -59,12 +59,16 @@ msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "arp: Kann Eintrag auf Zeile %u von Etherdatei %s nicht setzen!\n" + + #: ../arp.c:437 +-msgid "Address\t\t\tHWtype\tHWaddress\t Flags Mask\t\t Iface\n" +-msgstr "Adresse\t\t\tHWTyp\tHWAdresse\t Flags Maske\t\t Iface\n" ++msgid "" ++"Address HWtype HWaddress Flags Mask " ++"Iface\n" ++msgstr "" ++"Adresse HW-Typ HW-Adresse Flags Maske " ++"Iface\n" + + #: ../arp.c:467 + msgid "(incomplete)" +-msgstr "(unvollsndig)" ++msgstr "(unvollstndig)" + + #: ../arp.c:484 + #, c-format +diff --git a/po/et_EE.po b/po/et_EE.po +index d748410..827406d 100644 +--- a/po/et_EE.po ++++ b/po/et_EE.po +@@ -1,66 +1,65 @@ + # Estonian translations for net-tools +-# Copyright (C) 1999 Free Software Foundation, Inc. +-# Meelis Roos <Meelis.Roos@mail.ee>, 1999. ++# Copyright (C) 1999-2001 Free Software Foundation, Inc. ++# Meelis Roos <mroos@linux.ee>, 1999-2001. + # +-#, fuzzy + msgid "" + msgstr "" +-"Project-Id-Version: net-tools 1.58\n" +-"POT-Creation-Date: 2001-02-15 21:28+0200\n" +-"PO-Revision-Date: 2001-02-15 18:00+0300\n" ++"Project-Id-Version: net-tools 1.60\n" ++"POT-Creation-Date: 2001-04-16 20:24+0200\n" ++"PO-Revision-Date: 2001-04-16 20:30+0200\n" + "Last-Translator: Meelis Roos <mroos@linux.ee>\n" + "Language-Team: Estonian <linux-ee@eenet.ee>\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=iso-8859-15\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: ../arp.c:110 ../arp.c:269 ++#: ../arp.c:111 ../arp.c:270 + msgid "arp: need host name\n" + msgstr "arp: puudub hosti nimi\n" + +-#: ../arp.c:207 ../arp.c:221 ++#: ../arp.c:208 ../arp.c:222 + #, c-format + msgid "No ARP entry for %s\n" + msgstr "%s jaoks pole ARP kirjet\n" + +-#: ../arp.c:239 ++#: ../arp.c:240 + #, c-format + msgid "arp: cant get HW-Address for `%s': %s.\n" + msgstr "arp: ei saa riistvaralist aadressi `%s' jaoks: %s\n" + +-#: ../arp.c:243 ++#: ../arp.c:244 + msgid "arp: protocol type mismatch.\n" + msgstr "arp: vale protokolli tp\n" + +-#: ../arp.c:252 ++#: ../arp.c:253 + #, c-format + msgid "arp: device `%s' has HW address %s `%s'.\n" + msgstr "arp: seadmel `%s' on riistvaraline aadress %s `%s'\n" + +-#: ../arp.c:282 ++#: ../arp.c:283 + msgid "arp: need hardware address\n" + msgstr "arp: puudub riistvaraline aadress\n" + +-#: ../arp.c:290 ++#: ../arp.c:291 + msgid "arp: invalid hardware address\n" + msgstr "arp: vigane riistvaraline aadress\n" + +-#: ../arp.c:387 ++#: ../arp.c:388 + #, c-format + msgid "arp: cannot open etherfile %s !\n" + msgstr "arp: ei saa avada faili %s\n" + +-#: ../arp.c:403 ++#: ../arp.c:404 + #, c-format + msgid "arp: format error on line %u of etherfile %s !\n" + msgstr "arp: formaadiviga real %u failis %s\n" + +-#: ../arp.c:416 ++#: ../arp.c:417 + #, c-format + msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "arp: ei saa kehtestada ARP kirjet real %u failis %s\n" + +-#: ../arp.c:437 ++#: ../arp.c:438 + msgid "" + "Address HWtype HWaddress Flags Mask " + "Iface\n" +@@ -68,45 +67,45 @@ msgstr "" + "Aadress HWtp HWaadress Lipud Mask " + "Liides\n" + +-#: ../arp.c:467 ++#: ../arp.c:468 + msgid "(incomplete)" + msgstr "(mittetielik)" + +-#: ../arp.c:484 ++#: ../arp.c:485 + #, c-format + msgid "%s (%s) at " + msgstr "%s (%s) aadressil " + +-#: ../arp.c:490 ++#: ../arp.c:491 + msgid "<incomplete> " + msgstr "<mittetielik>" + +-#: ../arp.c:496 ++#: ../arp.c:497 + #, c-format + msgid "netmask %s " + msgstr "vrgumask %s " + +-#: ../arp.c:513 ++#: ../arp.c:514 + #, c-format + msgid "on %s\n" + msgstr "liides %s\n" + +-#: ../arp.c:592 ++#: ../arp.c:593 + #, c-format + msgid "Entries: %d\tSkipped: %d\tFound: %d\n" + msgstr "ARP kirjeid kokku: %s\tignoreerisin: %d\tleidsin: %d\n" + +-#: ../arp.c:596 ++#: ../arp.c:597 + #, c-format + msgid "%s (%s) -- no entry\n" + msgstr "%s (%s) -- pole kirjet\n" + +-#: ../arp.c:598 ++#: ../arp.c:599 + #, c-format + msgid "arp: in %d entries no match found.\n" + msgstr "arp: ei leidnud %d kirje hulgast sobivat\n" + +-#: ../arp.c:613 ++#: ../arp.c:614 + msgid "" + "Usage:\n" + " arp [-vn] [<HW>] [-i <if>] [-a] [<hostname>] <-Display ARP " +@@ -116,7 +115,7 @@ msgstr "" + "ARP cache vaatamine:\n" + " arp [-vn] [<HW>] [-i <if>] [-a] [<hosti nimi>]\n" + +-#: ../arp.c:614 ++#: ../arp.c:615 + msgid "" + " arp [-v] [-i <if>] -d <hostname> [pub][nopub] <-Delete ARP " + "entry\n" +@@ -124,7 +123,7 @@ msgstr "" + "ARP kirje kustutamine:\n" + " arp [-v] [-i <if>] -d <hosti nimi> [pub] [nopub]\n" + +-#: ../arp.c:615 ++#: ../arp.c:616 + msgid "" + " arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from " + "file\n" +@@ -132,7 +131,7 @@ msgstr "" + "ARP kirjete lisamine failist:\n" + " arp [-vnD] [<HW>] [-i <if>] -f [<failinimi>]\n" + +-#: ../arp.c:616 ++#: ../arp.c:617 + msgid "" + " arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [temp][nopub] <-Add " + "entry\n" +@@ -140,14 +139,14 @@ msgstr "" + "ARP kirje lisamine:\n" + " arp [-v] [<HW>] [-i <if>] -s <hosti nimi> <hwaddr> [temp] [nopub]\n" + +-#: ../arp.c:617 ++#: ../arp.c:618 + msgid "" + " arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [netmask <nm>] pub " + "<-''-\n" + msgstr "" + " arp [-v] [<HW>] [-i <if>] -s <hosti nimi> <hwaddr> [netmask <nm>] pub\n" + +-#: ../arp.c:618 ++#: ../arp.c:619 + msgid "" + " arp [-v] [<HW>] [-i <if>] -Ds <hostname> <if> [netmask <nm>] pub " + "<-''-\n" +@@ -156,7 +155,7 @@ msgstr "" + " arp [-v] [<HW>] [-i <if>] -Ds <hosti nimi> <if> [netmask <nm>] pub\n" + "\n" + +-#: ../arp.c:620 ++#: ../arp.c:621 + msgid "" + " -a display (all) hosts in alternative (BSD) " + "style\n" +@@ -164,37 +163,37 @@ msgstr "" + " -a nita kiki hoste alternatiivsel (BSD) " + "kujul\n" + +-#: ../arp.c:621 ++#: ../arp.c:622 + msgid " -s, --set set a new ARP entry\n" + msgstr " -s, --set uue ARP kirje seadmine\n" + +-#: ../arp.c:622 ++#: ../arp.c:623 + msgid " -d, --delete delete a specified entry\n" + msgstr " -d, --delete mratud kirje kustutamine\n" + +-#: ../arp.c:623 ../netstat.c:1485 ../route.c:85 ++#: ../arp.c:624 ../netstat.c:1490 ../route.c:86 + msgid " -v, --verbose be verbose\n" + msgstr " -v, --verbose jutukas vljund\n" + +-#: ../arp.c:624 ++#: ../arp.c:625 ../netstat.c:1491 ../route.c:87 + msgid " -n, --numeric don't resolve names\n" + msgstr " -n, --numeric mitte lahendada nimesid\n" + +-#: ../arp.c:625 ++#: ../arp.c:626 + msgid "" + " -i, --device specify network interface (e.g. eth0)\n" + msgstr "" + " -i, --device vrguliidese tpsustamine (niteks eth0)\n" + +-#: ../arp.c:626 ++#: ../arp.c:627 + msgid " -D, --use-device read <hwaddr> from given device\n" + msgstr " -D, --use-device lugeda <hwaddr> vastavalt liideselt\n" + +-#: ../arp.c:627 ++#: ../arp.c:628 + msgid " -A, -p, --protocol specify protocol family\n" + msgstr " -A, -p, --protocol protokollipere mramine\n" + +-#: ../arp.c:628 ++#: ../arp.c:629 + msgid "" + " -f, --file read new entries from file or from " + "/etc/ethers\n" +@@ -204,125 +203,125 @@ msgstr "" + "/etc/ethers'st\n" + "\n" + +-#: ../arp.c:630 ../rarp.c:181 ++#: ../arp.c:631 ../rarp.c:182 + #, c-format + msgid " <HW>=Use '-H <hw>' to specify hardware address type. Default: %s\n" + msgstr "" + " <HW>=kasutage '-H <hw>' riistvaralise aadressi mramiseks.\n" + " Vaikimisi: %s\n" + +-#: ../arp.c:631 ../rarp.c:182 ++#: ../arp.c:632 ../rarp.c:183 + msgid " List of possible hardware types (which support ARP):\n" + msgstr " Vimalike ARP-i toetavate riistvara tpide nimekiri:\n" + +-#: ../arp.c:664 ../arp.c:749 ++#: ../arp.c:666 ../arp.c:751 + #, c-format + msgid "%s: hardware type not supported!\n" + msgstr "arp: riistvara tpi %s ei toetata\n" + +-#: ../arp.c:668 ++#: ../arp.c:670 + #, c-format + msgid "%s: address family not supported!\n" + msgstr "arp: aadressiperekonda %s ei toetata\n" + +-#: ../arp.c:703 ++#: ../arp.c:705 + msgid "arp: -N not yet supported.\n" + msgstr "arp: -N toetust pole veel\n" + +-#: ../arp.c:713 ++#: ../arp.c:715 + #, c-format + msgid "arp: %s: unknown address family.\n" + msgstr "arp: tundmatu aadressiperekond %s\n" + +-#: ../arp.c:722 ++#: ../arp.c:724 + #, c-format + msgid "arp: %s: unknown hardware type.\n" + msgstr "arp: tundmatu riistvara tp %s\n" + +-#: ../arp.c:741 ++#: ../arp.c:743 + #, c-format + msgid "arp: %s: kernel only supports 'inet'.\n" + msgstr "arp: tuumas on ainult 'inet' aadressiperekonna toetus\n" + +-#: ../arp.c:754 ++#: ../arp.c:756 + #, c-format + msgid "arp: %s: hardware type without ARP support.\n" + msgstr "arp: riistvara tbil %s pole ARP toetust\n" + +-#: ../hostname.c:69 ++#: ../hostname.c:70 + #, c-format + msgid "Setting nodename to `%s'\n" + msgstr "Sean slme nimeks `%s'\n" + +-#: ../hostname.c:74 ++#: ../hostname.c:75 + #, c-format + msgid "%s: you must be root to change the node name\n" + msgstr "%s: ainult root saab slme nime muuta\n" + +-#: ../hostname.c:77 ../hostname.c:97 ../hostname.c:116 ++#: ../hostname.c:78 ../hostname.c:98 ../hostname.c:117 + #, c-format + msgid "%s: name too long\n" + msgstr "%s: nimi on liiga pikk\n" + +-#: ../hostname.c:89 ++#: ../hostname.c:90 + #, c-format + msgid "Setting hostname to `%s'\n" + msgstr "Sean hosti nimeks `%s'\n" + +-#: ../hostname.c:94 ++#: ../hostname.c:95 + #, c-format + msgid "%s: you must be root to change the host name\n" + msgstr "%s: ainult root saab hosti nime muuta\n" + +-#: ../hostname.c:108 ++#: ../hostname.c:109 + #, c-format + msgid "Setting domainname to `%s'\n" + msgstr "Sean domeeni nimeks `%s'\n" + +-#: ../hostname.c:113 ++#: ../hostname.c:114 + #, c-format + msgid "%s: you must be root to change the domain name\n" + msgstr "%s: ainult root saab domeeni nime muuta\n" + +-#: ../hostname.c:131 ++#: ../hostname.c:132 + #, c-format + msgid "Resolving `%s' ...\n" + msgstr "Lahendan `%s' ...\n" + +-#: ../hostname.c:137 ++#: ../hostname.c:138 + #, c-format + msgid "Result: h_name=`%s'\n" + msgstr "Tulemus: h_name=`%s'\n" + +-#: ../hostname.c:142 ++#: ../hostname.c:143 + #, c-format + msgid "Result: h_aliases=`%s'\n" + msgstr "Tulemus: h_aliases=`%s'\n" + +-#: ../hostname.c:147 ++#: ../hostname.c:148 + #, c-format + msgid "Result: h_addr_list=`%s'\n" + msgstr "Tulemus: h_addr_list=`%s'\n" + +-#: ../hostname.c:209 ++#: ../hostname.c:210 + #, c-format + msgid "%s: can't open `%s'\n" + msgstr "%s: ei saa avada faili `%s'\n" + +-#: ../hostname.c:223 ++#: ../hostname.c:224 + msgid "Usage: hostname [-v] {hostname|-F file} set hostname (from file)\n" + msgstr "" + "Kasutamine:\n" + " hostname [-v] {hosti nimi|-F fail} hosti nime seadmine (ka " + "failist)\n" + +-#: ../hostname.c:224 ++#: ../hostname.c:225 + msgid "" + " domainname [-v] {nisdomain|-F file} set NIS domainname (from file)\n" + msgstr "" + " domainname [-v] {nisdomeen|-F fail} NIS domeeni nime seadmine\n" + +-#: ../hostname.c:226 ++#: ../hostname.c:227 + msgid "" + " nodename [-v] {nodename|-F file} set DECnet node name (from " + "file)\n" +@@ -330,18 +329,18 @@ msgstr "" + " nodename [-v] {nodename|-F fail} DECneti vrguslme nime " + "seadmine\n" + +-#: ../hostname.c:228 ++#: ../hostname.c:229 + msgid " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] display formatted name\n" + msgstr "" + " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] nime nitamine antud formaadis\n" + +-#: ../hostname.c:229 ++#: ../hostname.c:230 + msgid "" + " hostname [-v] display hostname\n" + "\n" + msgstr " hostname [-v] hosti nime nitamine\n" + +-#: ../hostname.c:230 ++#: ../hostname.c:231 + msgid "" + " hostname -V|--version|-h|--help print info and exit\n" + "\n" +@@ -350,7 +349,7 @@ msgstr "" + " hostname -h|--help seesama abiinfo\n" + "\n" + +-#: ../hostname.c:231 ++#: ../hostname.c:232 + msgid "" + " dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n" + "\n" +@@ -358,36 +357,36 @@ msgstr "" + " dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n" + "\n" + +-#: ../hostname.c:232 ++#: ../hostname.c:233 + msgid " -s, --short short host name\n" + msgstr " -s, --short lhike hosti nimi\n" + +-#: ../hostname.c:233 ++#: ../hostname.c:234 + msgid " -a, --alias alias names\n" + msgstr " -a, --alias alias-nimed\n" + +-#: ../hostname.c:234 ++#: ../hostname.c:235 + msgid " -i, --ip-address addresses for the hostname\n" + msgstr " -i, --ip-address hosti IP aadressid\n" + +-#: ../hostname.c:235 ++#: ../hostname.c:236 + msgid " -f, --fqdn, --long long host name (FQDN)\n" + msgstr "" + " -f, --fqdn, --long pikk hosti nimi (FQDN - tielik ssteeminimi)\n" + +-#: ../hostname.c:236 ++#: ../hostname.c:237 + msgid " -d, --domain DNS domain name\n" + msgstr " -d, --domain DNS domeeni nimi\n" + +-#: ../hostname.c:237 ++#: ../hostname.c:238 + msgid " -y, --yp, --nis NIS/YP domainname\n" + msgstr " -y, --yp, --nis NIS/YP domeeni nimi\n" + +-#: ../hostname.c:239 ++#: ../hostname.c:240 + msgid " -n, --node DECnet node name\n" + msgstr " -n, --node DECneti vrguslme nimi\n" + +-#: ../hostname.c:241 ++#: ../hostname.c:242 + msgid "" + " -F, --file read hostname or NIS domainname from given file\n" + "\n" +@@ -395,7 +394,7 @@ msgstr "" + " -F, --file lugeda hosti vi NIS domeeni nimi failist\n" + "\n" + +-#: ../hostname.c:243 ++#: ../hostname.c:244 + msgid "" + " This command can read or set the hostname or the NIS domainname. You can\n" + " also read the DNS domain or the FQDN (fully qualified domain name).\n" +@@ -409,12 +408,12 @@ msgstr "" + " tielikku ssteeminime (FQDN) ja DNS domeeni nime (mis on tieliku nime\n" + " osa) muuta failist /etc/hosts.\n" + +-#: ../hostname.c:338 ++#: ../hostname.c:340 + #, c-format + msgid "%s: You can't change the DNS domain name with this command\n" + msgstr "%s: selle ksuga ei saa muuta DNS domeeni nime\n" + +-#: ../hostname.c:339 ++#: ../hostname.c:341 + msgid "" + "\n" + "Unless you are using bind or NIS for host lookups you can change the DNS\n" +@@ -422,26 +421,26 @@ msgstr "" + "\n" + "Kui Te EI kasuta bind'i ega NIS'i nimede lahendamiseks, saate DNS domeeni\n" + +-#: ../hostname.c:340 ++#: ../hostname.c:342 + msgid "domain name (which is part of the FQDN) in the /etc/hosts file.\n" + msgstr "(mis on tieliku nime osa) nime muuta failist /etc/hosts.\n" + +-#: ../hostname.c:357 ++#: ../hostname.c:359 + #, c-format + msgid "gethostname()=`%s'\n" + msgstr "gethostname()=`%s'\n" + +-#: ../hostname.c:374 ++#: ../hostname.c:376 + #, c-format + msgid "getdomainname()=`%s'\n" + msgstr "getdomainname()=`%s'\n" + +-#: ../hostname.c:389 ++#: ../hostname.c:391 + #, c-format + msgid "getnodename()=`%s'\n" + msgstr "getnodename()=`%s'\n" + +-#: ../ifconfig.c:110 ++#: ../ifconfig.c:108 + msgid "" + "Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " + "Flg\n" +@@ -449,16 +448,16 @@ msgstr "" + "Liides MTU Meetr. RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " + "Lip\n" + +-#: ../ifconfig.c:132 ../ifconfig.c:164 ++#: ../ifconfig.c:130 ../ifconfig.c:162 + #, c-format + msgid "%s: unknown interface: %s\n" + msgstr "ifconfig: tundmatu liides %s: %s\n" + +-#: ../ifconfig.c:156 ../ifconfig.c:740 ../ifconfig.c:831 ../ifconfig.c:937 ++#: ../ifconfig.c:154 ../ifconfig.c:734 ../ifconfig.c:825 ../ifconfig.c:936 + msgid "No support for INET on this system.\n" + msgstr "Antud ssteem ei toeta INET aadressiperekonda\n" + +-#: ../ifconfig.c:179 ++#: ../ifconfig.c:177 + msgid "" + "Usage:\n" + " ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n" +@@ -466,51 +465,51 @@ msgstr "" + "Kasutamine:\n" + " ifconfig [-a] [-i] [-v] [-s] <liides> [[<AF>] <aadress>]\n" + +-#: ../ifconfig.c:181 ++#: ../ifconfig.c:179 + msgid " [add <address>[/<prefixlen>]]\n" + msgstr " [add <aadress>[/<prefiksi pikkus>]]\n" + +-#: ../ifconfig.c:182 ++#: ../ifconfig.c:180 + msgid " [del <address>[/<prefixlen>]]\n" + msgstr " [del <aadress>[/<prefiksi pikkus>]]\n" + +-#: ../ifconfig.c:183 ++#: ../ifconfig.c:181 + msgid " [[-]broadcast [<address>]] [[-]pointopoint [<address>]]\n" + msgstr " [[-]broadcast [<aadress>]] [[-]pointopoint [<aadress>]]\n" + +-#: ../ifconfig.c:184 ++#: ../ifconfig.c:182 + msgid " [netmask <address>] [dstaddr <address>] [tunnel <address>]\n" + msgstr " [netmask <aadress>] [dstaddr <aadress>] [tunnel <aadress>]\n" + +-#: ../ifconfig.c:187 ++#: ../ifconfig.c:185 + msgid " [outfill <NN>] [keepalive <NN>]\n" + msgstr " [outfill <NN>] [keepalive <NN>]\n" + +-#: ../ifconfig.c:189 ++#: ../ifconfig.c:187 + msgid " [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n" + msgstr " [hw <HW> <aadress>] [metric <NN>] [mtu <NN>]\n" + +-#: ../ifconfig.c:190 ++#: ../ifconfig.c:188 + msgid " [[-]trailers] [[-]arp] [[-]allmulti]\n" + msgstr " [[-]trailers] [[-]arp] [[-]allmulti]\n" + +-#: ../ifconfig.c:191 ++#: ../ifconfig.c:189 + msgid " [multicast] [[-]promisc]\n" + msgstr " [multicast] [[-]promisc]\n" + +-#: ../ifconfig.c:192 ++#: ../ifconfig.c:190 + msgid " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n" + msgstr " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <tp>]\n" + +-#: ../ifconfig.c:194 ++#: ../ifconfig.c:192 + msgid " [txqueuelen <NN>]\n" + msgstr " [txqueuelen <NN>]\n" + +-#: ../ifconfig.c:197 ++#: ../ifconfig.c:195 + msgid " [[-]dynamic]\n" + msgstr " [[-]dynamic]\n" + +-#: ../ifconfig.c:199 ++#: ../ifconfig.c:197 + msgid "" + " [up|down] ...\n" + "\n" +@@ -518,73 +517,86 @@ msgstr "" + " [up|down] ...\n" + "\n" + +-#: ../ifconfig.c:201 ++#: ../ifconfig.c:199 + msgid " <HW>=Hardware Type.\n" + msgstr " <HW>=riistvara tp\n" + +-#: ../ifconfig.c:202 ++#: ../ifconfig.c:200 + msgid " List of possible hardware types:\n" + msgstr " Vimalike riistvara tpide nimekiri:\n" + + #. 1 = ARPable +-#: ../ifconfig.c:204 ++#: ../ifconfig.c:202 + #, c-format + msgid " <AF>=Address family. Default: %s\n" + msgstr " <AF>=aadressiperekond, vaikimisi %s\n" + +-#: ../ifconfig.c:205 ++#: ../ifconfig.c:203 + msgid " List of possible address families:\n" + msgstr " Vimalike aadressiperekondade nimekiri:\n" + +-#: ../ifconfig.c:361 ++#: ../ifconfig.c:278 ++#, c-format ++msgid "ifconfig: option `%s' not recognised.\n" ++msgstr "" ++ ++#: ../ifconfig.c:280 ../ifconfig.c:925 ++msgid "ifconfig: `--help' gives usage information.\n" ++msgstr "" ++ ++#: ../ifconfig.c:355 + msgid "Unknown media type.\n" + msgstr "Tundmatu meedia tp\n" + +-#: ../ifconfig.c:653 ++#: ../ifconfig.c:647 + #, c-format + msgid "hw address type `%s' has no handler to set address. failed.\n" + msgstr "" + "riistvara aadressi tbil `%s' pole ksitlejat aadressi seadmiseks - ebann\n" + +-#: ../ifconfig.c:662 ++#: ../ifconfig.c:656 + #, c-format + msgid "%s: invalid %s address.\n" + msgstr "%s: vigane %s aadress\n" + +-#: ../ifconfig.c:706 ../ifconfig.c:796 ../ifconfig.c:882 ++#: ../ifconfig.c:700 ../ifconfig.c:790 ../ifconfig.c:876 + msgid "No support for INET6 on this system.\n" + msgstr "Antud ssteem ei toeta INET6 aadressiperekonda\n" + +-#: ../ifconfig.c:749 ../ifconfig.c:840 ++#: ../ifconfig.c:743 ../ifconfig.c:834 + #, c-format + msgid "Interface %s not initialized\n" + msgstr "Liides %s pole initsialiseeritud\n" + +-#: ../ifconfig.c:761 ../ifconfig.c:851 ++#: ../ifconfig.c:755 ../ifconfig.c:845 + msgid "Bad address.\n" + msgstr "Vigane aadress\n" + +-#: ../ifconfig.c:854 ++#: ../ifconfig.c:848 + msgid "Address deletion not supported on this system.\n" + msgstr "Antud ssteem ei toeta aadresside kustutamist\n" + +-#: ../ifconfig.c:947 ++#: ../ifconfig.c:920 ++msgid "ifconfig: Cannot set address for this protocol family.\n" ++msgstr "Ei oska seada aadresse selle aadressiperekonna jaoks\n" ++ ++#: ../ifconfig.c:946 + msgid "No support for ECONET on this system.\n" + msgstr "Antud ssteem ei toeta ECONET aadressiperekonda\n" + +-#: ../ifconfig.c:955 ++#: ../ifconfig.c:954 + #, c-format + msgid "Don't know how to set addresses for family %d.\n" + msgstr "Ei oska seada aadresse aadressiperekonna %d jaoks\n" + +-#: ../netstat.c:429 ++#: ../netstat.c:430 + #, c-format + msgid "" + "(No info could be read for \"-p\": geteuid()=%d but you should be root.)\n" + msgstr "" + "(\"-p\" jaoks ei saanud infot lugeda: geteuid()=%d, aga vaja oleks root'u)\n" + +-#: ../netstat.c:433 ++#: ../netstat.c:434 + msgid "" + "(Not all processes could be identified, non-owned process info\n" + " will not be shown, you would have to be root to see it all.)\n" +@@ -592,27 +604,27 @@ msgstr "" + "(Mnesid protsesse ei saanud identifitseerida, teiste kasutajate\n" + "info lugemiseks peab olema root)\n" + +-#: ../netstat.c:440 ../netstat.c:1171 ../netstat.c:1248 ++#: ../netstat.c:441 ../netstat.c:1176 ../netstat.c:1253 + msgid "LISTENING" + msgstr "LISTENING" + +-#: ../netstat.c:441 ++#: ../netstat.c:442 + msgid "CONN SENT" + msgstr "CONN SENT" + +-#: ../netstat.c:442 ../netstat.c:1250 ++#: ../netstat.c:443 ../netstat.c:1255 + msgid "DISC SENT" + msgstr "DISC SENT" + +-#: ../netstat.c:443 ../netstat.c:510 ../netstat.c:889 ../netstat.c:1251 ++#: ../netstat.c:444 ../netstat.c:511 ../netstat.c:894 ../netstat.c:1256 + msgid "ESTABLISHED" + msgstr "ESTABLISHED" + +-#: ../netstat.c:465 ++#: ../netstat.c:466 + msgid "Active NET/ROM sockets\n" + msgstr "Aktiivsed NET/ROM soklid\n" + +-#: ../netstat.c:466 ++#: ../netstat.c:467 + msgid "" + "User Dest Source Device State Vr/Vs Send-Q " + "Recv-Q\n" +@@ -620,182 +632,182 @@ msgstr "" + "Kasutaja Sihtpunkt Lhtepunkt Liides Olek Vr/Vs SaatJrk " + "VvJrk\n" + +-#: ../netstat.c:476 ../netstat.c:1290 ++#: ../netstat.c:477 ../netstat.c:1295 + #, c-format + msgid "Problem reading data from %s\n" + msgstr "Probleem andmete lugemisel failist %s\n" + +-#: ../netstat.c:511 ++#: ../netstat.c:512 + msgid "SYN_SENT" + msgstr "SYN_SENT" + +-#: ../netstat.c:512 ++#: ../netstat.c:513 + msgid "SYN_RECV" + msgstr "SYN_RECV" + +-#: ../netstat.c:513 ++#: ../netstat.c:514 + msgid "FIN_WAIT1" + msgstr "FIN_WAIT1" + +-#: ../netstat.c:514 ++#: ../netstat.c:515 + msgid "FIN_WAIT2" + msgstr "FIN_WAIT2" + +-#: ../netstat.c:515 ++#: ../netstat.c:516 + msgid "TIME_WAIT" + msgstr "TIME_WAIT" + +-#: ../netstat.c:516 ++#: ../netstat.c:517 + msgid "CLOSE" + msgstr "CLOSE" + +-#: ../netstat.c:517 ++#: ../netstat.c:518 + msgid "CLOSE_WAIT" + msgstr "CLOSE_WAIT" + +-#: ../netstat.c:518 ++#: ../netstat.c:519 + msgid "LAST_ACK" + msgstr "LAST_ACK" + +-#: ../netstat.c:519 ++#: ../netstat.c:520 + msgid "LISTEN" + msgstr "LISTEN" + +-#: ../netstat.c:520 ++#: ../netstat.c:521 + msgid "CLOSING" + msgstr "CLOSING" + +-#: ../netstat.c:587 ++#: ../netstat.c:592 + #, c-format + msgid "warning, got bogus igmp6 line %d.\n" + msgstr "Hoiatus - sain imeliku igmp6 rea (nr. %d)\n" + +-#: ../netstat.c:592 ../netstat.c:630 ../netstat.c:751 ../netstat.c:883 +-#: ../netstat.c:1014 ../netstat.c:1019 ++#: ../netstat.c:597 ../netstat.c:635 ../netstat.c:756 ../netstat.c:888 ++#: ../netstat.c:1019 ../netstat.c:1024 + #, c-format + msgid "netstat: unsupported address family %d !\n" + msgstr "netstat: aadressiperekonda %d ei toetata\n" + +-#: ../netstat.c:605 ../netstat.c:610 ../netstat.c:618 ../netstat.c:625 ++#: ../netstat.c:610 ../netstat.c:615 ../netstat.c:623 ../netstat.c:630 + #, c-format + msgid "warning, got bogus igmp line %d.\n" + msgstr "Hoiatus - sain imeliku igmp rea (nr. %d)\n" + +-#: ../netstat.c:668 ++#: ../netstat.c:673 + msgid "Active X.25 sockets\n" + msgstr "Aktiivsed X.25 soklid\n" + + #. IMHO, Vr/Vs is not very usefull --SF +-#: ../netstat.c:670 ++#: ../netstat.c:675 + msgid "" + "Dest Source Device LCI State Vr/Vs Send-Q " + "Recv-Q\n" + msgstr "" + "Sihtpunkt Lhtepunkt Liides LCI Olek Vr/Vs SaatJrk VvJrk\n" + +-#: ../netstat.c:747 ++#: ../netstat.c:752 + msgid "warning, got bogus tcp line.\n" + msgstr "Hoiatus - sain imeliku tcp rea\n" + +-#: ../netstat.c:788 ../netstat.c:938 ../netstat.c:1057 ++#: ../netstat.c:793 ../netstat.c:943 ../netstat.c:1062 + #, c-format + msgid "off (0.00/%ld/%d)" + msgstr "eiki ((0.00/%ld/%d)" + +-#: ../netstat.c:792 ++#: ../netstat.c:797 + #, c-format + msgid "on (%2.2f/%ld/%d)" + msgstr "kib (%2.2f/%ld/%d)" + +-#: ../netstat.c:797 ++#: ../netstat.c:802 + #, c-format + msgid "keepalive (%2.2f/%ld/%d)" + msgstr "keepalive (%2.2f/%ld/%d)" + +-#: ../netstat.c:802 ++#: ../netstat.c:807 + #, c-format + msgid "timewait (%2.2f/%ld/%d)" + msgstr "timewait (%2.2f/%ld/%d)" + +-#: ../netstat.c:807 ../netstat.c:947 ../netstat.c:1067 ++#: ../netstat.c:812 ../netstat.c:952 ../netstat.c:1072 + #, c-format + msgid "unkn-%d (%2.2f/%ld/%d)" + msgstr "eitea-%d (%2.2f/%ld/%d)" + +-#: ../netstat.c:879 ++#: ../netstat.c:884 + msgid "warning, got bogus udp line.\n" + msgstr "Hoiatus - sain imeliku udp rea\n" + +-#: ../netstat.c:897 ../netstat.c:1157 ../netstat.c:1190 ++#: ../netstat.c:902 ../netstat.c:1162 ../netstat.c:1195 + msgid "UNKNOWN" + msgstr "TUNDMATU" + +-#: ../netstat.c:943 ../netstat.c:1062 ++#: ../netstat.c:948 ../netstat.c:1067 + #, c-format + msgid "on%d (%2.2f/%ld/%d)" + msgstr "kib-%d (%2.2f/%ld/%d)" + +-#: ../netstat.c:1028 ++#: ../netstat.c:1033 + msgid "warning, got bogus raw line.\n" + msgstr "Hoiatus - sain imeliku raw rea\n" + +-#: ../netstat.c:1110 ++#: ../netstat.c:1115 + msgid "warning, got bogus unix line.\n" + msgstr "Hoiatus - sain imeliku unix rea\n" + +-#: ../netstat.c:1137 ++#: ../netstat.c:1142 + msgid "STREAM" + msgstr "STREAM" + +-#: ../netstat.c:1141 ++#: ../netstat.c:1146 + msgid "DGRAM" + msgstr "DGRAM" + +-#: ../netstat.c:1145 ++#: ../netstat.c:1150 + msgid "RAW" + msgstr "RAW" + +-#: ../netstat.c:1149 ++#: ../netstat.c:1154 + msgid "RDM" + msgstr "RDM" + +-#: ../netstat.c:1153 ++#: ../netstat.c:1158 + msgid "SEQPACKET" + msgstr "SEQPACKET" + +-#: ../netstat.c:1162 ++#: ../netstat.c:1167 + msgid "FREE" + msgstr "VABA" + +-#: ../netstat.c:1178 ++#: ../netstat.c:1183 + msgid "CONNECTING" + msgstr "HENDUMAS" + +-#: ../netstat.c:1182 ++#: ../netstat.c:1187 + msgid "CONNECTED" + msgstr "HENDATUD" + +-#: ../netstat.c:1186 ++#: ../netstat.c:1191 + msgid "DISCONNECTING" + msgstr "LAHTIHENDUMAS" + +-#: ../netstat.c:1217 ++#: ../netstat.c:1222 + msgid "Active UNIX domain sockets " + msgstr "Aktiivsed UNIX domeeni soklid " + +-#: ../netstat.c:1219 ../netstat.c:1729 ++#: ../netstat.c:1224 ../netstat.c:1735 + msgid "(servers and established)" + msgstr "(serverid ja hendatud)" + +-#: ../netstat.c:1222 ../netstat.c:1732 ++#: ../netstat.c:1227 ../netstat.c:1738 + msgid "(only servers)" + msgstr "(ainult serverid)" + +-#: ../netstat.c:1224 ../netstat.c:1734 ++#: ../netstat.c:1229 ../netstat.c:1740 + msgid "(w/o servers)" + msgstr "(ilma serveriteta)" + +-#: ../netstat.c:1227 ++#: ../netstat.c:1232 + msgid "" + "\n" + "Proto RefCnt Flags Type State I-Node" +@@ -803,32 +815,32 @@ msgstr "" + "\n" + "Proto Mitu Lipud Tp Olek I-kirje " + +-#: ../netstat.c:1229 ++#: ../netstat.c:1234 + msgid " Path\n" + msgstr "Tee\n" + +-#: ../netstat.c:1249 ++#: ../netstat.c:1254 + msgid "SABM SENT" + msgstr "SABM SENT" + +-#: ../netstat.c:1252 ++#: ../netstat.c:1257 + msgid "RECOVERY" + msgstr "RECOVERY" + +-#: ../netstat.c:1266 ++#: ../netstat.c:1271 + msgid "Active AX.25 sockets\n" + msgstr "Aktiivsed AX.25 soklid\n" + +-#: ../netstat.c:1267 ++#: ../netstat.c:1272 + msgid "Dest Source Device State Vr/Vs Send-Q Recv-Q\n" + msgstr "Sihtpunkt Lhtepunkt Liides Olek Vr/Vs SaatJrk VvJrk\n" + +-#: ../netstat.c:1310 ++#: ../netstat.c:1315 + #, c-format + msgid "problem reading data from %s\n" + msgstr "Probleem andmete lugemisel failist %s\n" + +-#: ../netstat.c:1361 ++#: ../netstat.c:1366 + msgid "" + "Active IPX sockets\n" + "Proto Recv-Q Send-Q Local Address Foreign Address " +@@ -838,23 +850,23 @@ msgstr "" + "Proto VvJrk SaatJrk Kohalik aadress Vline aadress " + "Olek " + +-#: ../netstat.c:1363 ++#: ../netstat.c:1368 + msgid " User" + msgstr " Kasutaja" + +-#: ../netstat.c:1397 ++#: ../netstat.c:1402 + msgid "ESTAB" + msgstr "ESTAB" + +-#: ../netstat.c:1405 ++#: ../netstat.c:1410 + msgid "UNK." + msgstr "UNK." + +-#: ../netstat.c:1443 ++#: ../netstat.c:1448 + msgid "Kernel Interface table\n" + msgstr "Tuuma liideste tabel\n" + +-#: ../netstat.c:1447 ++#: ../netstat.c:1452 + msgid "" + "Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " + "Flg\n" +@@ -862,11 +874,11 @@ msgstr "" + "Liides MTU Meetr RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " + "Lip\n" + +-#: ../netstat.c:1451 ++#: ../netstat.c:1456 + msgid "missing interface information" + msgstr "Puudulik informatsioon liideste kohta" + +-#: ../netstat.c:1474 ++#: ../netstat.c:1479 + msgid "" + "usage: netstat [-veenNcCF] [<Af>] -r netstat " + "{-V|--version|-h|--help}\n" +@@ -874,11 +886,11 @@ msgstr "" + "Kasutamine: netstat [-veenNcCF] [<Af>] -r\n" + " netstat {-V|--version|-h|--help}\n" + +-#: ../netstat.c:1475 ++#: ../netstat.c:1480 + msgid " netstat [-vnNcaeol] [<Socket> ...]\n" + msgstr " netstat [-vnNcaeol] [<Sokkel> ...]\n" + +-#: ../netstat.c:1476 ++#: ../netstat.c:1481 + msgid "" + " netstat { [-veenNac] -i | [-cnNe] -M | -s }\n" + "\n" +@@ -886,25 +898,25 @@ msgstr "" + " netstat { [-veenNac] -i | [-cnNe] -M | -s }\n" + "\n" + +-#: ../netstat.c:1478 ++#: ../netstat.c:1483 + msgid " -r, --route display routing table\n" + msgstr " -r, --route ruutingutabeli nitamine\n" + +-#: ../netstat.c:1479 ++#: ../netstat.c:1484 + msgid " -i, --interfaces display interface table\n" + msgstr " -i, --interfaces liideste tabeli nitamine\n" + +-#: ../netstat.c:1480 ++#: ../netstat.c:1485 + msgid " -g, --groups display multicast group memberships\n" + msgstr " -g, --groups multiedastuse gruppide nitamine\n" + +-#: ../netstat.c:1481 ++#: ../netstat.c:1486 + msgid "" + " -s, --statistics display networking statistics (like SNMP)\n" + msgstr "" + " -s, --statistics vrgu statistika nitamine (SNMP stiilis)\n" + +-#: ../netstat.c:1483 ++#: ../netstat.c:1488 + msgid "" + " -M, --masquerade display masqueraded connections\n" + "\n" +@@ -912,36 +924,32 @@ msgstr "" + " -M, --masquerade maskeeritavate henduste nitamine\n" + "\n" + +-#: ../netstat.c:1486 ../route.c:86 +-msgid " -n, --numeric dont resolve names\n" +-msgstr " -n, --numeric mitte lahendada numbreid nimedeks\n" +- +-#: ../netstat.c:1487 +-msgid " --numeric-hosts dont resolve host names\n" ++#: ../netstat.c:1492 ++msgid " --numeric-hosts don't resolve host names\n" + msgstr " --numeric-hosts mitte lahendada hostinimesid\n" + +-#: ../netstat.c:1488 +-msgid " --numeric-ports dont resolve port names\n" ++#: ../netstat.c:1493 ++msgid " --numeric-ports don't resolve port names\n" + msgstr " --numeric-ports mitte lahendada pordinimesid\n" + +-#: ../netstat.c:1489 +-msgid " --numeric-users dont resolve user names\n" ++#: ../netstat.c:1494 ++msgid " --numeric-users don't resolve user names\n" + msgstr " --numeric-users mitte lahendada kasutajanimesid\n" + +-#: ../netstat.c:1490 ++#: ../netstat.c:1495 + msgid " -N, --symbolic resolve hardware names\n" + msgstr " -N, --symbolic lahendada riistvara aadressid\n" + +-#: ../netstat.c:1491 ../route.c:87 ++#: ../netstat.c:1496 ../route.c:88 + msgid " -e, --extend display other/more information\n" + msgstr " -e, --extend muu info/lisainfo nitamine\n" + +-#: ../netstat.c:1492 ++#: ../netstat.c:1497 + msgid " -p, --programs display PID/Program name for sockets\n" + msgstr "" + " -p, --programs soklite kohta PID/protsessi nime nitamine\n" + +-#: ../netstat.c:1493 ++#: ../netstat.c:1498 + msgid "" + " -c, --continuous continuous listing\n" + "\n" +@@ -949,22 +957,22 @@ msgstr "" + " -c, --continuous pidevalt uuenev nimekiri\n" + "\n" + +-#: ../netstat.c:1494 ++#: ../netstat.c:1499 + msgid " -l, --listening display listening server sockets\n" + msgstr " -l, --listening kuulavate serversoklite nitamine\n" + +-#: ../netstat.c:1495 ++#: ../netstat.c:1500 + msgid "" + " -a, --all, --listening display all sockets (default: connected)\n" + msgstr "" + " -a, --all, --listening kigi soklite nitamine (vaikimisi " + "hendatud)\n" + +-#: ../netstat.c:1496 ++#: ../netstat.c:1501 + msgid " -o, --timers display timers\n" + msgstr " -o, --timers taimerite nitamine\n" + +-#: ../netstat.c:1497 ../route.c:88 ++#: ../netstat.c:1502 ../route.c:89 + msgid "" + " -F, --fib display Forwarding Information Base " + "(default)\n" +@@ -972,7 +980,7 @@ msgstr "" + " -F, --fib ldiste ruutingutabelite nitamine " + "(vaikimisi)\n" + +-#: ../netstat.c:1498 ../route.c:89 ++#: ../netstat.c:1503 ../route.c:90 + msgid "" + " -C, --cache display routing cache instead of FIB\n" + "\n" +@@ -981,7 +989,7 @@ msgstr "" + "nitamine\n" + "\n" + +-#: ../netstat.c:1500 ++#: ../netstat.c:1505 + msgid "" + " <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx " + "--netrom\n" +@@ -989,20 +997,19 @@ msgstr "" + " <Sokkel>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx " + "--netrom\n" + +-#: ../netstat.c:1501 ../route.c:91 +-#, c-format +-msgid " <AF>=Use '-A <af>' or '--<af>' Default: %s\n" +-msgstr " <AF>=kasutage '-A <af>' vi '--<af>' vaikimisi: %s\n" ++#: ../netstat.c:1506 ../route.c:92 ++msgid " <AF>=Use '-A <af>' or '--<af>'; default: %s\n" ++msgstr " <AF>=kasutage '-A <af>' vi '--<af>'; vaikimisi: %s\n" + +-#: ../netstat.c:1502 ../route.c:92 ++#: ../netstat.c:1507 ../route.c:93 + msgid " List of possible address families (which support routing):\n" + msgstr " Vimalike ruutingu toetavate aadressiperekondade nimekiri:\n" + +-#: ../netstat.c:1726 ++#: ../netstat.c:1732 + msgid "Active Internet connections " + msgstr "Aktiivsed internetihendused " + +-#: ../netstat.c:1736 ++#: ../netstat.c:1742 + msgid "" + "\n" + "Proto Recv-Q Send-Q Local Address Foreign Address State " +@@ -1012,77 +1019,77 @@ msgstr "" + "Proto VvJrk SaatJrk Kohalik aadress Vline aadress Olek " + " " + +-#: ../netstat.c:1738 ++#: ../netstat.c:1744 + msgid " User Inode " + msgstr " Kasutaja I-kirje " + +-#: ../netstat.c:1741 ++#: ../netstat.c:1747 + msgid " Timer" + msgstr " Taimer" + +-#: ../netstat.c:1771 ++#: ../netstat.c:1777 + msgid "IPv4 Group Memberships\n" + msgstr "IPv4 grupikuuluvused\n" + +-#: ../netstat.c:1772 ++#: ../netstat.c:1778 + msgid "Interface RefCnt Group\n" + msgstr "Liides Mitu Grupp\n" + +-#: ../rarp.c:43 ++#: ../rarp.c:44 + msgid "This kernel does not support RARP.\n" + msgstr "rarp: tuum ei toeta RARP'i\n" + +-#: ../rarp.c:82 ++#: ../rarp.c:83 + #, c-format + msgid "no RARP entry for %s.\n" + msgstr "rarp: %s jaoks pole RARP kirjet\n" + +-#: ../rarp.c:95 ++#: ../rarp.c:96 + #, c-format + msgid "%s: bad hardware address\n" + msgstr "rarp: vigane riistvaraline aadress %s\n" + +-#: ../rarp.c:127 ++#: ../rarp.c:128 + #, c-format + msgid "rarp: cannot open file %s:%s.\n" + msgstr "rarp: ei saa avada faili %s:%s\n" + +-#: ../rarp.c:139 ++#: ../rarp.c:140 + #, c-format + msgid "rarp: format error at %s:%u\n" + msgstr "rarp: vorminguviga failis %s real %u\n" + +-#: ../rarp.c:143 ../rarp.c:287 ++#: ../rarp.c:144 ../rarp.c:289 + #, c-format + msgid "rarp: %s: unknown host\n" + msgstr "rarp: tundmatu host %s\n" + +-#: ../rarp.c:146 ++#: ../rarp.c:147 + #, c-format + msgid "rarp: cannot set entry from %s:%u\n" + msgstr "rarp: ei saa kehtestada kirjet failist %s realt %u\n" + +-#: ../rarp.c:175 ++#: ../rarp.c:176 + msgid "Usage: rarp -a list entries in cache.\n" + msgstr "" + "Kasutamine:\n" + " rarp -a puhvris olevate kirjete vaatamine\n" + +-#: ../rarp.c:176 ++#: ../rarp.c:177 + msgid " rarp -d <hostname> delete entry from cache.\n" + msgstr " rarp -d <hosti nimi> kirje kustutamine puhvrist\n" + +-#: ../rarp.c:177 ++#: ../rarp.c:178 + msgid " rarp [<HW>] -s <hostname> <hwaddr> add entry to cache.\n" + msgstr " rarp [<HW>] -s <hosti nimi> <hwaddr> kirje lisamine puhvrisse\n" + +-#: ../rarp.c:178 ++#: ../rarp.c:179 + msgid "" + " rarp -f add entries from /etc/ethers.\n" + msgstr "" + " rarp -f kirjete lisamine failist /etc/ethers\n" + +-#: ../rarp.c:179 ++#: ../rarp.c:180 + msgid "" + " rarp -V display program version.\n" + "\n" +@@ -1090,24 +1097,24 @@ msgstr "" + " rarp -V programmi versiooni nitamine\n" + "\n" + +-#: ../rarp.c:236 ++#: ../rarp.c:238 + #, c-format + msgid "%s: illegal option mix.\n" + msgstr "%s: lubamatu vtmete kombinatsioon\n" + +-#: ../rarp.c:267 ++#: ../rarp.c:269 + #, c-format + msgid "rarp: %s: unknown hardware type.\n" + msgstr "rarp: tundmatu riistvara tp %s\n" + +-#: ../route.c:79 ++#: ../route.c:80 + msgid "" + "Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables\n" + msgstr "" + "Kasutamine:\n" + " route [-nNvee] [-FC] [<AF>] Tuuma ruutingutabeli nitamine\n" + +-#: ../route.c:80 ++#: ../route.c:81 + msgid "" + " route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n" + "\n" +@@ -1115,7 +1122,7 @@ msgstr "" + " route [-v] [-FC] {add|del|flush} ... Tuuma ruutingutabeli muutmine\n" + "\n" + +-#: ../route.c:82 ++#: ../route.c:83 + msgid "" + " route {-h|--help} [<AF>] Detailed usage syntax for " + "specified AF.\n" +@@ -1123,7 +1130,7 @@ msgstr "" + " route {-h|--help} [<AF>] Detailne sntaks perekonna AF " + "jaoks\n" + +-#: ../route.c:83 ++#: ../route.c:84 + msgid "" + " route {-V|--version} Display version/author and " + "exit.\n" +@@ -1149,25 +1156,25 @@ msgstr " plipconfig -V | --version\n" + msgid "%s\tnibble %lu trigger %lu\n" + msgstr "%s\tnibble %lu trigger %lu\n" + +-#: ../iptunnel.c:84 ++#: ../iptunnel.c:85 + msgid "Usage: iptunnel { add | change | del | show } [ NAME ]\n" + msgstr "Kasutamine: iptunnel { add | change | del | show } [ NIMI ]\n" + +-#: ../iptunnel.c:85 ++#: ../iptunnel.c:86 + msgid "" + " [ mode { ipip | gre | sit } ] [ remote ADDR ] [ local ADDR ]\n" + msgstr "" + " [ mode { ipip | gre | sit } ] [ remote AADR ] [ local AADR ]\n" + +-#: ../iptunnel.c:86 ++#: ../iptunnel.c:87 + msgid " [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]\n" + msgstr " [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]\n" + +-#: ../iptunnel.c:87 ++#: ../iptunnel.c:88 + msgid " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev PHYS_DEV ]\n" + msgstr " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev LIIDES ]\n" + +-#: ../iptunnel.c:88 ++#: ../iptunnel.c:89 + msgid "" + " iptunnel -V | --version\n" + "\n" +@@ -1175,83 +1182,83 @@ msgstr "" + " iptunnel -V | --version\n" + "\n" + +-#: ../iptunnel.c:89 ++#: ../iptunnel.c:90 + msgid "Where: NAME := STRING\n" + msgstr "Kus: NIMI := STRING\n" + +-#: ../iptunnel.c:90 ++#: ../iptunnel.c:91 + msgid " ADDR := { IP_ADDRESS | any }\n" + msgstr " AADR := { IP_AADRESS | any }\n" + +-#: ../iptunnel.c:91 ++#: ../iptunnel.c:92 + msgid " TOS := { NUMBER | inherit }\n" + msgstr " TOS := { ARV | inherit }\n" + +-#: ../iptunnel.c:92 ++#: ../iptunnel.c:93 + msgid " TTL := { 1..255 | inherit }\n" + msgstr " TTL := { 1..255 | inherit }\n" + +-#: ../iptunnel.c:93 ++#: ../iptunnel.c:94 + msgid " KEY := { DOTTED_QUAD | NUMBER }\n" + msgstr "" + " KEY := { PUNKTIDEGA_ARVUNELIK | ARV }\n" + " LIIDES := FSILISE_LIIDESE_NIMI\n" + +-#: ../iptunnel.c:331 ++#: ../iptunnel.c:332 + msgid "Keys are not allowed with ipip and sit.\n" + msgstr "ipip ja sit juures ei ole vtmed lubatud\n" + +-#: ../iptunnel.c:351 ++#: ../iptunnel.c:352 + msgid "Broadcast tunnel requires a source address.\n" + msgstr "Leviedastusega tunnel vajab lhteaadressi\n" + +-#: ../iptunnel.c:366 ++#: ../iptunnel.c:367 + msgid "ttl != 0 and noptmudisc are incompatible\n" + msgstr "ttl != 0 ning noptmudisc ei sobi kokku\n" + +-#: ../iptunnel.c:378 ++#: ../iptunnel.c:379 + msgid "cannot determine tunnel mode (ipip, gre or sit)\n" + msgstr "Ei suuda mrata tunneli moodi (ipip, gre vi sit)\n" + +-#: ../iptunnel.c:416 ++#: ../iptunnel.c:417 + #, c-format + msgid "%s: %s/ip remote %s local %s " + msgstr "%s: %s/ip teises otsas %s siin %s " + +-#: ../iptunnel.c:420 ++#: ../iptunnel.c:421 + msgid "unknown" + msgstr "tundmatu" + +-#: ../iptunnel.c:452 ++#: ../iptunnel.c:453 + msgid " Drop packets out of sequence.\n" + msgstr " Jrjekorravlised paketid visatakse minema\n" + +-#: ../iptunnel.c:454 ++#: ../iptunnel.c:455 + msgid " Checksum in received packet is required.\n" + msgstr " Vastuvetavates pakettides on kontrollsumma kohustuslik\n" + +-#: ../iptunnel.c:456 ++#: ../iptunnel.c:457 + msgid " Sequence packets on output.\n" + msgstr " Vljuvad paketid varustatakse jrjekorranumbritega\n" + +-#: ../iptunnel.c:458 ++#: ../iptunnel.c:459 + msgid " Checksum output packets.\n" + msgstr " Vljuvad paketid varustatakse kontrollsummaga\n" + +-#: ../iptunnel.c:486 ++#: ../iptunnel.c:487 + msgid "Wrong format of /proc/net/dev. Sorry.\n" + msgstr "/proc/net/dev on vales formaadis. Vale tuuma versioon?\n" + +-#: ../iptunnel.c:499 ++#: ../iptunnel.c:500 + #, c-format + msgid "Failed to get type of [%s]\n" + msgstr "Ei suutnud kindlaks teha liidese %s tpi\n" + +-#: ../iptunnel.c:515 ++#: ../iptunnel.c:516 + msgid "RX: Packets Bytes Errors CsumErrs OutOfSeq Mcasts\n" + msgstr "RX: Pakette Baite Vigu KSumVigu JrkVigu Levipakette\n" + +-#: ../iptunnel.c:518 ++#: ../iptunnel.c:519 + msgid "TX: Packets Bytes Errors DeadLoop NoRoute NoBufs\n" + msgstr "TX: Pakette Baite Vigu DeadLoop EiRuudi MluOtsas\n" + +@@ -1972,15 +1979,15 @@ msgstr "rresolve: toetuseta aadressiperekond %d\n" + msgid "[UNKNOWN]" + msgstr "[TUNDMATU]" + +-#: ../lib/inet6_gr.c:79 ++#: ../lib/inet6_gr.c:71 + msgid "INET6 (IPv6) not configured in this system.\n" + msgstr "INET6 (IPv6) pole antud ssteemis konfigureeritud\n" + +-#: ../lib/inet6_gr.c:82 ++#: ../lib/inet6_gr.c:74 + msgid "Kernel IPv6 routing table\n" + msgstr "Tuuma IPv6 ruutingutabel\n" + +-#: ../lib/inet6_gr.c:84 ++#: ../lib/inet6_gr.c:76 + msgid "" + "Destination Next Hop " + " Flags Metric Ref Use Iface\n" +@@ -1988,11 +1995,11 @@ msgstr "" + "Sihtpunkt Jrgmine samm " + " Lipud Meetr Mitu Kasut Liides\n" + +-#: ../lib/inet6_gr.c:158 ++#: ../lib/inet6_gr.c:150 + msgid "Kernel IPv6 Neighbour Cache\n" + msgstr "Tuuma IPv6 naabrite puhver\n" + +-#: ../lib/inet6_gr.c:161 ++#: ../lib/inet6_gr.c:153 + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State\n" +@@ -2000,7 +2007,7 @@ msgstr "" + "Naaber HW Aadress Liides Lipud " + "Mitu Olek\n" + +-#: ../lib/inet6_gr.c:165 ++#: ../lib/inet6_gr.c:157 + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State Stale(sec) Delete(sec)\n" +@@ -2538,29 +2545,29 @@ msgstr "iptunnel: %s on vigane IPv4 aadress\n" + msgid "ip: argument is wrong: %s\n" + msgstr "iptunnel: vale argument %s\n" + +-#: ../ipmaddr.c:58 ++#: ../ipmaddr.c:61 + msgid "Usage: ipmaddr [ add | del ] MULTIADDR dev STRING\n" + msgstr "Kasutamine: ipmaddr [ add | del ] MULTIAADR dev STRING\n" + +-#: ../ipmaddr.c:59 ++#: ../ipmaddr.c:62 + msgid " ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n" + msgstr " ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n" + +-#: ../ipmaddr.c:60 ++#: ../ipmaddr.c:63 + msgid " ipmaddr -V | -version\n" + msgstr " ipmaddr -V | -version\n" + +-#: ../ipmaddr.c:260 ++#: ../ipmaddr.c:263 + #, c-format + msgid "family %d " + msgstr "perekond %d " + +-#: ../ipmaddr.c:269 ++#: ../ipmaddr.c:272 + #, c-format + msgid " users %d" + msgstr " kasutajaid %d" + +-#: ../ipmaddr.c:355 ++#: ../ipmaddr.c:358 + msgid "Cannot create socket" + msgstr "Ei saa avada soklit" + +diff --git a/po/fr.po b/po/fr.po +index e8e7542..e4e8245 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -9,7 +9,7 @@ msgstr "" + "Last-Translator: J.M.Vansteene <vanstee@worldnet.fr>\n" + "Language-Team:\n" + "MIME-Version: 1.0\n" +-"Content-Type: text/plain; charset=iso8859-1\n" ++"Content-Type: text/plain; charset=iso-8859-1\n" + "Content-Transfer-Encoding: 8bit\n" + + #: ../arp.c:110 ../arp.c:269 +@@ -59,8 +59,12 @@ msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "arp: ne peut dfinir l'entre en ligne %u du fichier ether %s !\n" + + #: ../arp.c:437 +-msgid "Address\t\t\tHWtype\tHWaddress\t Flags Mask\t\t Iface\n" +-msgstr "Adresse\t\t\tTypeMap\tAdresseMat\t Indicateurs\t\t Iface\n" ++msgid "" ++"Address HWtype HWaddress Flags Mask " ++"Iface\n" ++msgstr "" ++"Adresse TypeMap AdresseMat Indicateurs " ++"Iface\n" + + #: ../arp.c:467 + msgid "(incomplete)" +diff --git a/po/net-tools.pot b/po/net-tools.pot +index 0231aac..cdeccc9 100644 +--- a/po/net-tools.pot ++++ b/po/net-tools.pot +@@ -1,263 +1,285 @@ + # SOME DESCRIPTIVE TITLE. +-# Copyright (C) YEAR Free Software Foundation, Inc. ++# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER ++# This file is distributed under the same license as the PACKAGE package. + # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. + # + #, fuzzy + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" +-"POT-Creation-Date: 2001-04-15 15:40+0100\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2005-05-16 05:18+0200\n" + "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" + "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" + "Language-Team: LANGUAGE <LL@li.org>\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=CHARSET\n" +-"Content-Transfer-Encoding: ENCODING\n" ++"Content-Transfer-Encoding: 8bit\n" + +-#: ../arp.c:111 ../arp.c:270 ++#: ../arp.c:111 ../arp.c:276 ++#, c-format + msgid "arp: need host name\n" + msgstr "" + +-#: ../arp.c:208 ../arp.c:222 ++#: ../arp.c:213 ../arp.c:228 + #, c-format + msgid "No ARP entry for %s\n" + msgstr "" + +-#: ../arp.c:240 ++#: ../arp.c:246 + #, c-format + msgid "arp: cant get HW-Address for `%s': %s.\n" + msgstr "" + +-#: ../arp.c:244 ++#: ../arp.c:250 ++#, c-format + msgid "arp: protocol type mismatch.\n" + msgstr "" + +-#: ../arp.c:253 ++#: ../arp.c:259 + #, c-format + msgid "arp: device `%s' has HW address %s `%s'.\n" + msgstr "" + +-#: ../arp.c:283 ++#: ../arp.c:289 ++#, c-format + msgid "arp: need hardware address\n" + msgstr "" + +-#: ../arp.c:291 ++#: ../arp.c:297 ++#, c-format + msgid "arp: invalid hardware address\n" + msgstr "" + +-#: ../arp.c:388 ++#: ../arp.c:394 + #, c-format + msgid "arp: cannot open etherfile %s !\n" + msgstr "" + +-#: ../arp.c:404 ++#: ../arp.c:410 + #, c-format + msgid "arp: format error on line %u of etherfile %s !\n" + msgstr "" + +-#: ../arp.c:417 ++#: ../arp.c:423 + #, c-format + msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "" + +-#: ../arp.c:438 ++#: ../arp.c:444 ++#, c-format + msgid "" + "Address HWtype HWaddress Flags Mask " + "Iface\n" + msgstr "" + +-#: ../arp.c:468 ++#: ../arp.c:472 ++msgid "<from_interface>" ++msgstr "" ++ ++#: ../arp.c:474 + msgid "(incomplete)" + msgstr "" + +-#: ../arp.c:485 ++#: ../arp.c:491 + #, c-format + msgid "%s (%s) at " + msgstr "" + +-#: ../arp.c:491 ++#: ../arp.c:497 ++#, c-format + msgid "<incomplete> " + msgstr "" + +-#: ../arp.c:497 ++#: ../arp.c:503 + #, c-format + msgid "netmask %s " + msgstr "" + +-#: ../arp.c:514 ++#: ../arp.c:520 + #, c-format + msgid "on %s\n" + msgstr "" + +-#: ../arp.c:593 ++#: ../arp.c:599 + #, c-format + msgid "Entries: %d\tSkipped: %d\tFound: %d\n" + msgstr "" + +-#: ../arp.c:597 ++#: ../arp.c:603 + #, c-format + msgid "%s (%s) -- no entry\n" + msgstr "" + +-#: ../arp.c:599 ++#: ../arp.c:605 + #, c-format + msgid "arp: in %d entries no match found.\n" + msgstr "" + +-#: ../arp.c:614 ++#: ../arp.c:620 ++#, c-format + msgid "" + "Usage:\n" + " arp [-vn] [<HW>] [-i <if>] [-a] [<hostname>] <-Display ARP " + "cache\n" + msgstr "" + +-#: ../arp.c:615 ++#: ../arp.c:621 ++#, c-format + msgid "" + " arp [-v] [-i <if>] -d <hostname> [pub][nopub] <-Delete ARP " + "entry\n" + msgstr "" + +-#: ../arp.c:616 ++#: ../arp.c:622 ++#, c-format + msgid "" +-" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from " ++" arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from " + "file\n" + msgstr "" + +-#: ../arp.c:617 ++#: ../arp.c:623 ++#, c-format + msgid "" + " arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [temp][nopub] <-Add " + "entry\n" + msgstr "" + +-#: ../arp.c:618 +-msgid "" +-" arp [-v] [<HW>] [-i <if>] -s <hostname> <hwaddr> [netmask <nm>] pub " +-"<-''-\n" +-msgstr "" +- +-#: ../arp.c:619 ++#: ../arp.c:624 ++#, c-format + msgid "" + " arp [-v] [<HW>] [-i <if>] -Ds <hostname> <if> [netmask <nm>] pub " + "<-''-\n" + "\n" + msgstr "" + +-#: ../arp.c:621 ++#: ../arp.c:626 ++#, c-format + msgid "" + " -a display (all) hosts in alternative (BSD) " + "style\n" + msgstr "" + +-#: ../arp.c:622 ++#: ../arp.c:627 ++#, c-format + msgid " -s, --set set a new ARP entry\n" + msgstr "" + +-#: ../arp.c:623 ++#: ../arp.c:628 ++#, c-format + msgid " -d, --delete delete a specified entry\n" + msgstr "" + +-#: ../arp.c:624 ../netstat.c:1490 ../route.c:86 ++#: ../arp.c:629 ../netstat.c:1503 ../route.c:86 ++#, c-format + msgid " -v, --verbose be verbose\n" + msgstr "" + +-#: ../arp.c:625 ../netstat.c:1491 ../route.c:87 ++#: ../arp.c:630 ../netstat.c:1504 ../route.c:87 ++#, c-format + msgid " -n, --numeric don't resolve names\n" + msgstr "" + +-#: ../arp.c:626 ++#: ../arp.c:631 ++#, c-format + msgid "" + " -i, --device specify network interface (e.g. eth0)\n" + msgstr "" + +-#: ../arp.c:627 ++#: ../arp.c:632 ++#, c-format + msgid " -D, --use-device read <hwaddr> from given device\n" + msgstr "" + +-#: ../arp.c:628 ++#: ../arp.c:633 ++#, c-format + msgid " -A, -p, --protocol specify protocol family\n" + msgstr "" + +-#: ../arp.c:629 ++#: ../arp.c:634 ++#, c-format + msgid "" +-" -f, --file read new entries from file or from " +-"/etc/ethers\n" ++" -f, --file read new entries from file or from /etc/" ++"ethers\n" + "\n" + msgstr "" + +-#: ../arp.c:631 ../rarp.c:182 ++#: ../arp.c:636 ../rarp.c:182 + #, c-format + msgid " <HW>=Use '-H <hw>' to specify hardware address type. Default: %s\n" + msgstr "" + +-#: ../arp.c:632 ../rarp.c:183 ++#: ../arp.c:637 ../rarp.c:183 ++#, c-format + msgid " List of possible hardware types (which support ARP):\n" + msgstr "" + +-#: ../arp.c:666 ../arp.c:751 ++#: ../arp.c:671 ../arp.c:756 + #, c-format + msgid "%s: hardware type not supported!\n" + msgstr "" + +-#: ../arp.c:670 ++#: ../arp.c:675 + #, c-format + msgid "%s: address family not supported!\n" + msgstr "" + +-#: ../arp.c:705 ++#: ../arp.c:710 ++#, c-format + msgid "arp: -N not yet supported.\n" + msgstr "" + +-#: ../arp.c:715 ++#: ../arp.c:720 + #, c-format + msgid "arp: %s: unknown address family.\n" + msgstr "" + +-#: ../arp.c:724 ++#: ../arp.c:729 + #, c-format + msgid "arp: %s: unknown hardware type.\n" + msgstr "" + +-#: ../arp.c:743 ++#: ../arp.c:748 + #, c-format + msgid "arp: %s: kernel only supports 'inet'.\n" + msgstr "" + +-#: ../arp.c:756 ++#: ../arp.c:761 + #, c-format + msgid "arp: %s: hardware type without ARP support.\n" + msgstr "" + +-#: ../hostname.c:70 ++#: ../hostname.c:71 + #, c-format + msgid "Setting nodename to `%s'\n" + msgstr "" + +-#: ../hostname.c:75 ++#: ../hostname.c:76 + #, c-format + msgid "%s: you must be root to change the node name\n" + msgstr "" + +-#: ../hostname.c:78 ../hostname.c:98 ../hostname.c:117 ++#: ../hostname.c:79 ../hostname.c:100 ../hostname.c:118 + #, c-format + msgid "%s: name too long\n" + msgstr "" + +-#: ../hostname.c:90 ++#: ../hostname.c:92 + #, c-format + msgid "Setting hostname to `%s'\n" + msgstr "" + +-#: ../hostname.c:95 ++#: ../hostname.c:97 + #, c-format + msgid "%s: you must be root to change the host name\n" + msgstr "" + +-#: ../hostname.c:109 ++#: ../hostname.c:110 + #, c-format + msgid "Setting domainname to `%s'\n" + msgstr "" + +-#: ../hostname.c:114 ++#: ../hostname.c:115 + #, c-format + msgid "%s: you must be root to change the domain name\n" + msgstr "" +@@ -282,83 +304,99 @@ msgstr "" + msgid "Result: h_addr_list=`%s'\n" + msgstr "" + +-#: ../hostname.c:210 ++#: ../hostname.c:209 + #, c-format + msgid "%s: can't open `%s'\n" + msgstr "" + +-#: ../hostname.c:224 ++#: ../hostname.c:223 ++#, c-format + msgid "Usage: hostname [-v] {hostname|-F file} set hostname (from file)\n" + msgstr "" + +-#: ../hostname.c:225 ++#: ../hostname.c:224 ++#, c-format + msgid "" + " domainname [-v] {nisdomain|-F file} set NIS domainname (from file)\n" + msgstr "" + +-#: ../hostname.c:227 ++#: ../hostname.c:226 ++#, c-format + msgid "" + " nodename [-v] {nodename|-F file} set DECnet node name (from " + "file)\n" + msgstr "" + +-#: ../hostname.c:229 ++#: ../hostname.c:228 ++#, c-format + msgid " hostname [-v] [-d|-f|-s|-a|-i|-y|-n] display formatted name\n" + msgstr "" + +-#: ../hostname.c:230 ++#: ../hostname.c:229 ++#, c-format + msgid "" + " hostname [-v] display hostname\n" + "\n" + msgstr "" + +-#: ../hostname.c:231 ++#: ../hostname.c:230 ++#, c-format + msgid "" + " hostname -V|--version|-h|--help print info and exit\n" + "\n" + msgstr "" + +-#: ../hostname.c:232 ++#: ../hostname.c:231 ++#, c-format + msgid "" + " dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n" + "\n" + msgstr "" + +-#: ../hostname.c:233 ++#: ../hostname.c:232 ++#, c-format + msgid " -s, --short short host name\n" + msgstr "" + +-#: ../hostname.c:234 ++#: ../hostname.c:233 ++#, c-format + msgid " -a, --alias alias names\n" + msgstr "" + +-#: ../hostname.c:235 ++#: ../hostname.c:234 ++#, c-format + msgid " -i, --ip-address addresses for the hostname\n" + msgstr "" + +-#: ../hostname.c:236 ++#: ../hostname.c:235 ++#, c-format + msgid " -f, --fqdn, --long long host name (FQDN)\n" + msgstr "" + +-#: ../hostname.c:237 ++#: ../hostname.c:236 ++#, c-format + msgid " -d, --domain DNS domain name\n" + msgstr "" + +-#: ../hostname.c:238 ++#: ../hostname.c:237 ++#, c-format + msgid " -y, --yp, --nis NIS/YP domainname\n" + msgstr "" + +-#: ../hostname.c:240 ++#: ../hostname.c:239 ++#, c-format + msgid " -n, --node DECnet node name\n" + msgstr "" + +-#: ../hostname.c:242 ++#: ../hostname.c:241 ++#, c-format + msgid "" + " -F, --file read hostname or NIS domainname from given file\n" + "\n" + msgstr "" + +-#: ../hostname.c:244 ++#: ../hostname.c:243 ++#, c-format + msgid "" + " This command can read or set the hostname or the NIS domainname. You can\n" + " also read the DNS domain or the FQDN (fully qualified domain name).\n" +@@ -373,12 +411,14 @@ msgid "%s: You can't change the DNS domain name with this command\n" + msgstr "" + + #: ../hostname.c:341 ++#, c-format + msgid "" + "\n" + "Unless you are using bind or NIS for host lookups you can change the DNS\n" + msgstr "" + + #: ../hostname.c:342 ++#, c-format + msgid "domain name (which is part of the FQDN) in the /etc/hosts file.\n" + msgstr "" + +@@ -397,557 +437,697 @@ msgstr "" + msgid "getnodename()=`%s'\n" + msgstr "" + +-#: ../ifconfig.c:108 ++#: ../ifconfig.c:107 ../netstat.c:1465 ++#, c-format + msgid "" +-"Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " ++"Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " + "Flg\n" + msgstr "" + +-#: ../ifconfig.c:130 ../ifconfig.c:162 ++#: ../ifconfig.c:129 ../ifconfig.c:161 + #, c-format +-msgid "%s: unknown interface: %s\n" ++msgid "%s: ERROR while getting interface flags: %s\n" + msgstr "" + +-#: ../ifconfig.c:154 ../ifconfig.c:734 ../ifconfig.c:825 ../ifconfig.c:936 ++#: ../ifconfig.c:153 ../ifconfig.c:185 ../ifconfig.c:791 ../ifconfig.c:884 ++#: ../ifconfig.c:997 ++#, c-format + msgid "No support for INET on this system.\n" + msgstr "" + +-#: ../ifconfig.c:177 ++#: ../ifconfig.c:193 ++#, c-format ++msgid "%s: ERROR while testing interface flags: %s\n" ++msgstr "" ++ ++#: ../ifconfig.c:202 ++#, c-format + msgid "" + "Usage:\n" +-" ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n" ++" ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]\n" + msgstr "" + +-#: ../ifconfig.c:179 ++#: ../ifconfig.c:204 ++#, c-format + msgid " [add <address>[/<prefixlen>]]\n" + msgstr "" + +-#: ../ifconfig.c:180 ++#: ../ifconfig.c:205 ++#, c-format + msgid " [del <address>[/<prefixlen>]]\n" + msgstr "" + +-#: ../ifconfig.c:181 ++#: ../ifconfig.c:206 ++#, c-format + msgid " [[-]broadcast [<address>]] [[-]pointopoint [<address>]]\n" + msgstr "" + +-#: ../ifconfig.c:182 ++#: ../ifconfig.c:207 ++#, c-format + msgid " [netmask <address>] [dstaddr <address>] [tunnel <address>]\n" + msgstr "" + +-#: ../ifconfig.c:185 ++#: ../ifconfig.c:210 ++#, c-format + msgid " [outfill <NN>] [keepalive <NN>]\n" + msgstr "" + +-#: ../ifconfig.c:187 ++#: ../ifconfig.c:212 ++#, c-format + msgid " [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n" + msgstr "" + +-#: ../ifconfig.c:188 ++#: ../ifconfig.c:213 ++#, c-format + msgid " [[-]trailers] [[-]arp] [[-]allmulti]\n" + msgstr "" + +-#: ../ifconfig.c:189 ++#: ../ifconfig.c:214 ++#, c-format + msgid " [multicast] [[-]promisc]\n" + msgstr "" + +-#: ../ifconfig.c:190 ++#: ../ifconfig.c:215 ++#, c-format + msgid " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n" + msgstr "" + +-#: ../ifconfig.c:192 ++#: ../ifconfig.c:217 ++#, c-format + msgid " [txqueuelen <NN>]\n" + msgstr "" + +-#: ../ifconfig.c:195 ++#: ../ifconfig.c:220 ++#, c-format + msgid " [[-]dynamic]\n" + msgstr "" + +-#: ../ifconfig.c:197 ++#: ../ifconfig.c:222 ++#, c-format + msgid "" + " [up|down] ...\n" + "\n" + msgstr "" + +-#: ../ifconfig.c:199 ++#: ../ifconfig.c:224 ++#, c-format + msgid " <HW>=Hardware Type.\n" + msgstr "" + +-#: ../ifconfig.c:200 ++#: ../ifconfig.c:225 ++#, c-format + msgid " List of possible hardware types:\n" + msgstr "" + + #. 1 = ARPable +-#: ../ifconfig.c:202 ++#: ../ifconfig.c:227 + #, c-format + msgid " <AF>=Address family. Default: %s\n" + msgstr "" + +-#: ../ifconfig.c:203 ++#: ../ifconfig.c:228 ++#, c-format + msgid " List of possible address families:\n" + msgstr "" + +-#: ../ifconfig.c:278 ++#: ../ifconfig.c:304 + #, c-format + msgid "ifconfig: option `%s' not recognised.\n" + msgstr "" + +-#: ../ifconfig.c:280 ../ifconfig.c:925 ++#: ../ifconfig.c:306 ../ifconfig.c:987 ++#, c-format + msgid "ifconfig: `--help' gives usage information.\n" + msgstr "" + +-#: ../ifconfig.c:355 ++#: ../ifconfig.c:381 ++#, c-format + msgid "Unknown media type.\n" + msgstr "" + +-#: ../ifconfig.c:647 ++#: ../ifconfig.c:418 ++#, c-format ++msgid "" ++"Warning: Interface %s still in promisc mode... maybe other application is " ++"running?\n" ++msgstr "" ++ ++#: ../ifconfig.c:430 ++#, c-format ++msgid "Warning: Interface %s still in MULTICAST mode.\n" ++msgstr "" ++ ++#: ../ifconfig.c:442 ++#, c-format ++msgid "Warning: Interface %s still in ALLMULTI mode.\n" ++msgstr "" ++ ++#: ../ifconfig.c:466 ++#, c-format ++msgid "Warning: Interface %s still in DYNAMIC mode.\n" ++msgstr "" ++ ++#: ../ifconfig.c:524 ++#, c-format ++msgid "Warning: Interface %s still in BROADCAST mode.\n" ++msgstr "" ++ ++#: ../ifconfig.c:535 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for broadcast\n" ++msgstr "" ++ ++#: ../ifconfig.c:560 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for dstaddr\n" ++msgstr "" ++ ++#: ../ifconfig.c:583 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for netmask\n" ++msgstr "" ++ ++#: ../ifconfig.c:662 ++#, c-format ++msgid "Warning: Interface %s still in POINTOPOINT mode.\n" ++msgstr "" ++ ++#: ../ifconfig.c:673 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for pointopoint\n" ++msgstr "" ++ ++#: ../ifconfig.c:697 + #, c-format + msgid "hw address type `%s' has no handler to set address. failed.\n" + msgstr "" + +-#: ../ifconfig.c:656 ++#: ../ifconfig.c:706 + #, c-format + msgid "%s: invalid %s address.\n" + msgstr "" + +-#: ../ifconfig.c:700 ../ifconfig.c:790 ../ifconfig.c:876 ++#: ../ifconfig.c:746 ++#, c-format ++msgid "ifconfig: Error resolving '%s' for add\n" ++msgstr "" ++ ++#: ../ifconfig.c:757 ../ifconfig.c:847 ../ifconfig.c:935 ++#, c-format + msgid "No support for INET6 on this system.\n" + msgstr "" + +-#: ../ifconfig.c:743 ../ifconfig.c:834 ++#: ../ifconfig.c:800 ../ifconfig.c:893 + #, c-format + msgid "Interface %s not initialized\n" + msgstr "" + +-#: ../ifconfig.c:755 ../ifconfig.c:845 ++#: ../ifconfig.c:812 ../ifconfig.c:904 ++#, c-format + msgid "Bad address.\n" + msgstr "" + +-#: ../ifconfig.c:848 ++#: ../ifconfig.c:907 ++#, c-format + msgid "Address deletion not supported on this system.\n" + msgstr "" + +-#: ../ifconfig.c:920 ++#: ../ifconfig.c:979 ++#, c-format + msgid "ifconfig: Cannot set address for this protocol family.\n" + msgstr "" + +-#: ../ifconfig.c:946 ++#: ../ifconfig.c:986 ++#, c-format ++msgid "ifconfig: error resolving '%s' to set address for af=%s\n" ++msgstr "" ++ ++#: ../ifconfig.c:1007 ++#, c-format + msgid "No support for ECONET on this system.\n" + msgstr "" + +-#: ../ifconfig.c:954 ++#: ../ifconfig.c:1015 + #, c-format + msgid "Don't know how to set addresses for family %d.\n" + msgstr "" + +-#: ../netstat.c:430 ++#: ../ifconfig.c:1050 ++#, c-format ++msgid "WARNING: at least one error occured. (%d)\n" ++msgstr "" ++ ++#: ../netstat.c:434 + #, c-format + msgid "" + "(No info could be read for \"-p\": geteuid()=%d but you should be root.)\n" + msgstr "" + +-#: ../netstat.c:434 ++#: ../netstat.c:438 ++#, c-format + msgid "" + "(Not all processes could be identified, non-owned process info\n" + " will not be shown, you would have to be root to see it all.)\n" + msgstr "" + +-#: ../netstat.c:441 ../netstat.c:1176 ../netstat.c:1253 ++#: ../netstat.c:445 ../netstat.c:1189 ../netstat.c:1266 + msgid "LISTENING" + msgstr "" + +-#: ../netstat.c:442 ++#: ../netstat.c:446 + msgid "CONN SENT" + msgstr "" + +-#: ../netstat.c:443 ../netstat.c:1255 ++#: ../netstat.c:447 ../netstat.c:1268 + msgid "DISC SENT" + msgstr "" + +-#: ../netstat.c:444 ../netstat.c:511 ../netstat.c:894 ../netstat.c:1256 ++#: ../netstat.c:448 ../netstat.c:515 ../netstat.c:904 ../netstat.c:1269 + msgid "ESTABLISHED" + msgstr "" + +-#: ../netstat.c:466 ++#: ../netstat.c:470 ++#, c-format + msgid "Active NET/ROM sockets\n" + msgstr "" + +-#: ../netstat.c:467 ++#: ../netstat.c:471 ++#, c-format + msgid "" +-"User Dest Source Device State Vr/Vs Send-Q " +-"Recv-Q\n" ++"User Dest Source Device State Vr/Vs Send-Q Recv-" ++"Q\n" + msgstr "" + +-#: ../netstat.c:477 ../netstat.c:1295 ++#: ../netstat.c:481 ../netstat.c:1308 + #, c-format + msgid "Problem reading data from %s\n" + msgstr "" + +-#: ../netstat.c:512 ++#: ../netstat.c:516 + msgid "SYN_SENT" + msgstr "" + +-#: ../netstat.c:513 ++#: ../netstat.c:517 + msgid "SYN_RECV" + msgstr "" + +-#: ../netstat.c:514 ++#: ../netstat.c:518 + msgid "FIN_WAIT1" + msgstr "" + +-#: ../netstat.c:515 ++#: ../netstat.c:519 + msgid "FIN_WAIT2" + msgstr "" + +-#: ../netstat.c:516 ++#: ../netstat.c:520 + msgid "TIME_WAIT" + msgstr "" + +-#: ../netstat.c:517 ++#: ../netstat.c:521 + msgid "CLOSE" + msgstr "" + +-#: ../netstat.c:518 ++#: ../netstat.c:522 + msgid "CLOSE_WAIT" + msgstr "" + +-#: ../netstat.c:519 ++#: ../netstat.c:523 + msgid "LAST_ACK" + msgstr "" + +-#: ../netstat.c:520 ++#: ../netstat.c:524 + msgid "LISTEN" + msgstr "" + +-#: ../netstat.c:521 ++#: ../netstat.c:525 + msgid "CLOSING" + msgstr "" + +-#: ../netstat.c:592 ++#: ../netstat.c:596 + #, c-format + msgid "warning, got bogus igmp6 line %d.\n" + msgstr "" + +-#: ../netstat.c:597 ../netstat.c:635 ../netstat.c:756 ../netstat.c:888 +-#: ../netstat.c:1019 ../netstat.c:1024 ++#: ../netstat.c:601 ../netstat.c:639 ../netstat.c:763 ../netstat.c:898 ++#: ../netstat.c:1032 ../netstat.c:1037 + #, c-format + msgid "netstat: unsupported address family %d !\n" + msgstr "" + +-#: ../netstat.c:610 ../netstat.c:615 ../netstat.c:623 ../netstat.c:630 ++#: ../netstat.c:614 ../netstat.c:619 ../netstat.c:627 ../netstat.c:634 + #, c-format + msgid "warning, got bogus igmp line %d.\n" + msgstr "" + +-#: ../netstat.c:673 ++#: ../netstat.c:677 ++#, c-format + msgid "Active X.25 sockets\n" + msgstr "" + + #. IMHO, Vr/Vs is not very usefull --SF +-#: ../netstat.c:675 ++#: ../netstat.c:679 ++#, c-format + msgid "" +-"Dest Source Device LCI State Vr/Vs Send-Q " +-"Recv-Q\n" ++"Dest Source Device LCI State Vr/Vs Send-Q Recv-" ++"Q\n" + msgstr "" + +-#: ../netstat.c:752 ++#: ../netstat.c:759 ++#, c-format + msgid "warning, got bogus tcp line.\n" + msgstr "" + +-#: ../netstat.c:793 ../netstat.c:943 ../netstat.c:1062 ++#: ../netstat.c:800 ../netstat.c:953 ../netstat.c:1075 + #, c-format + msgid "off (0.00/%ld/%d)" + msgstr "" + +-#: ../netstat.c:797 ++#: ../netstat.c:804 + #, c-format + msgid "on (%2.2f/%ld/%d)" + msgstr "" + +-#: ../netstat.c:802 ++#: ../netstat.c:809 + #, c-format + msgid "keepalive (%2.2f/%ld/%d)" + msgstr "" + +-#: ../netstat.c:807 ++#: ../netstat.c:814 + #, c-format + msgid "timewait (%2.2f/%ld/%d)" + msgstr "" + +-#: ../netstat.c:812 ../netstat.c:952 ../netstat.c:1072 ++#: ../netstat.c:819 ../netstat.c:962 ../netstat.c:1085 + #, c-format + msgid "unkn-%d (%2.2f/%ld/%d)" + msgstr "" + +-#: ../netstat.c:884 ++#: ../netstat.c:894 ++#, c-format + msgid "warning, got bogus udp line.\n" + msgstr "" + +-#: ../netstat.c:902 ../netstat.c:1162 ../netstat.c:1195 ++#: ../netstat.c:912 ../netstat.c:1175 ../netstat.c:1208 + msgid "UNKNOWN" + msgstr "" + +-#: ../netstat.c:948 ../netstat.c:1067 ++#: ../netstat.c:958 ../netstat.c:1080 + #, c-format + msgid "on%d (%2.2f/%ld/%d)" + msgstr "" + +-#: ../netstat.c:1033 ++#: ../netstat.c:1046 ++#, c-format + msgid "warning, got bogus raw line.\n" + msgstr "" + +-#: ../netstat.c:1115 ++#: ../netstat.c:1128 ++#, c-format + msgid "warning, got bogus unix line.\n" + msgstr "" + +-#: ../netstat.c:1142 ++#: ../netstat.c:1155 + msgid "STREAM" + msgstr "" + +-#: ../netstat.c:1146 ++#: ../netstat.c:1159 + msgid "DGRAM" + msgstr "" + +-#: ../netstat.c:1150 ++#: ../netstat.c:1163 + msgid "RAW" + msgstr "" + +-#: ../netstat.c:1154 ++#: ../netstat.c:1167 + msgid "RDM" + msgstr "" + +-#: ../netstat.c:1158 ++#: ../netstat.c:1171 + msgid "SEQPACKET" + msgstr "" + +-#: ../netstat.c:1167 ++#: ../netstat.c:1180 + msgid "FREE" + msgstr "" + +-#: ../netstat.c:1183 ++#: ../netstat.c:1196 + msgid "CONNECTING" + msgstr "" + +-#: ../netstat.c:1187 ++#: ../netstat.c:1200 + msgid "CONNECTED" + msgstr "" + +-#: ../netstat.c:1191 ++#: ../netstat.c:1204 + msgid "DISCONNECTING" + msgstr "" + +-#: ../netstat.c:1222 ++#: ../netstat.c:1235 ++#, c-format + msgid "Active UNIX domain sockets " + msgstr "" + +-#: ../netstat.c:1224 ../netstat.c:1735 ++#: ../netstat.c:1237 ../netstat.c:1756 ++#, c-format + msgid "(servers and established)" + msgstr "" + +-#: ../netstat.c:1227 ../netstat.c:1738 ++#: ../netstat.c:1240 ../netstat.c:1759 ++#, c-format + msgid "(only servers)" + msgstr "" + +-#: ../netstat.c:1229 ../netstat.c:1740 ++#: ../netstat.c:1242 ../netstat.c:1761 ++#, c-format + msgid "(w/o servers)" + msgstr "" + +-#: ../netstat.c:1232 ++#: ../netstat.c:1245 ++#, c-format + msgid "" + "\n" + "Proto RefCnt Flags Type State I-Node" + msgstr "" + +-#: ../netstat.c:1234 ++#: ../netstat.c:1247 ++#, c-format + msgid " Path\n" + msgstr "" + +-#: ../netstat.c:1254 ++#: ../netstat.c:1267 + msgid "SABM SENT" + msgstr "" + +-#: ../netstat.c:1257 ++#: ../netstat.c:1270 + msgid "RECOVERY" + msgstr "" + +-#: ../netstat.c:1271 ++#: ../netstat.c:1284 ++#, c-format + msgid "Active AX.25 sockets\n" + msgstr "" + +-#: ../netstat.c:1272 ++#: ../netstat.c:1285 ++#, c-format + msgid "Dest Source Device State Vr/Vs Send-Q Recv-Q\n" + msgstr "" + +-#: ../netstat.c:1315 ++#: ../netstat.c:1328 + #, c-format + msgid "problem reading data from %s\n" + msgstr "" + +-#: ../netstat.c:1366 ++#: ../netstat.c:1379 ++#, c-format + msgid "" + "Active IPX sockets\n" + "Proto Recv-Q Send-Q Local Address Foreign Address " + "State" + msgstr "" + +-#: ../netstat.c:1368 ++#: ../netstat.c:1381 ++#, c-format + msgid " User" + msgstr "" + +-#: ../netstat.c:1402 ++#: ../netstat.c:1415 + msgid "ESTAB" + msgstr "" + +-#: ../netstat.c:1410 ++#: ../netstat.c:1423 + msgid "UNK." + msgstr "" + +-#: ../netstat.c:1448 ++#: ../netstat.c:1461 ++#, c-format + msgid "Kernel Interface table\n" + msgstr "" + +-#: ../netstat.c:1452 +-msgid "" +-"Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR " +-"Flg\n" +-msgstr "" +- +-#: ../netstat.c:1456 ++#: ../netstat.c:1469 + msgid "missing interface information" + msgstr "" + +-#: ../netstat.c:1479 ++#: ../netstat.c:1492 ++#, c-format + msgid "" +-"usage: netstat [-veenNcCF] [<Af>] -r netstat " +-"{-V|--version|-h|--help}\n" ++"usage: netstat [-veenNcCF] [<Af>] -r netstat {-V|--version|-h|--" ++"help}\n" + msgstr "" + +-#: ../netstat.c:1480 ++#: ../netstat.c:1493 ++#, c-format + msgid " netstat [-vnNcaeol] [<Socket> ...]\n" + msgstr "" + +-#: ../netstat.c:1481 ++#: ../netstat.c:1494 ++#, c-format + msgid "" + " netstat { [-veenNac] -i | [-cnNe] -M | -s }\n" + "\n" + msgstr "" + +-#: ../netstat.c:1483 ++#: ../netstat.c:1496 ++#, c-format + msgid " -r, --route display routing table\n" + msgstr "" + +-#: ../netstat.c:1484 ++#: ../netstat.c:1497 ++#, c-format + msgid " -i, --interfaces display interface table\n" + msgstr "" + +-#: ../netstat.c:1485 ++#: ../netstat.c:1498 ++#, c-format + msgid " -g, --groups display multicast group memberships\n" + msgstr "" + +-#: ../netstat.c:1486 ++#: ../netstat.c:1499 ++#, c-format + msgid "" + " -s, --statistics display networking statistics (like SNMP)\n" + msgstr "" + +-#: ../netstat.c:1488 ++#: ../netstat.c:1501 ++#, c-format + msgid "" + " -M, --masquerade display masqueraded connections\n" + "\n" + msgstr "" + +-#: ../netstat.c:1492 ++#: ../netstat.c:1505 ++#, c-format + msgid " --numeric-hosts don't resolve host names\n" + msgstr "" + +-#: ../netstat.c:1493 ++#: ../netstat.c:1506 ++#, c-format + msgid " --numeric-ports don't resolve port names\n" + msgstr "" + +-#: ../netstat.c:1494 ++#: ../netstat.c:1507 ++#, c-format + msgid " --numeric-users don't resolve user names\n" + msgstr "" + +-#: ../netstat.c:1495 ++#: ../netstat.c:1508 ++#, c-format + msgid " -N, --symbolic resolve hardware names\n" + msgstr "" + +-#: ../netstat.c:1496 ../route.c:88 ++#: ../netstat.c:1509 ../route.c:88 ++#, c-format + msgid " -e, --extend display other/more information\n" + msgstr "" + +-#: ../netstat.c:1497 ++#: ../netstat.c:1510 ++#, c-format + msgid " -p, --programs display PID/Program name for sockets\n" + msgstr "" + +-#: ../netstat.c:1498 ++#: ../netstat.c:1511 ++#, c-format + msgid "" + " -c, --continuous continuous listing\n" + "\n" + msgstr "" + +-#: ../netstat.c:1499 ++#: ../netstat.c:1512 ++#, c-format + msgid " -l, --listening display listening server sockets\n" + msgstr "" + +-#: ../netstat.c:1500 ++#: ../netstat.c:1513 ++#, c-format + msgid "" + " -a, --all, --listening display all sockets (default: connected)\n" + msgstr "" + +-#: ../netstat.c:1501 ++#: ../netstat.c:1514 ++#, c-format + msgid " -o, --timers display timers\n" + msgstr "" + +-#: ../netstat.c:1502 ../route.c:89 ++#: ../netstat.c:1515 ../route.c:89 ++#, c-format + msgid "" + " -F, --fib display Forwarding Information Base " + "(default)\n" + msgstr "" + +-#: ../netstat.c:1503 ../route.c:90 ++#: ../netstat.c:1516 ../route.c:90 ++#, c-format + msgid "" + " -C, --cache display routing cache instead of FIB\n" + "\n" + msgstr "" + +-#: ../netstat.c:1505 ++#: ../netstat.c:1518 ++#, c-format + msgid "" +-" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx " +-"--netrom\n" ++" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --" ++"netrom\n" + msgstr "" + +-#: ../netstat.c:1506 ../route.c:92 ++#: ../netstat.c:1519 + #, c-format +-msgid " <AF>=Use '-A <af>' or '--<af>'; default: %s\n" ++msgid " <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: %s\n" + msgstr "" + +-#: ../netstat.c:1507 ../route.c:93 ++#: ../netstat.c:1520 ../route.c:93 ++#, c-format + msgid " List of possible address families (which support routing):\n" + msgstr "" + +-#: ../netstat.c:1732 ++#: ../netstat.c:1753 ++#, c-format + msgid "Active Internet connections " + msgstr "" + +-#: ../netstat.c:1742 ++#: ../netstat.c:1763 ++#, c-format + msgid "" + "\n" +-"Proto Recv-Q Send-Q Local Address Foreign Address State " +-" " ++"Proto Recv-Q Send-Q Local Address Foreign Address " ++"State " + msgstr "" + +-#: ../netstat.c:1744 ++#: ../netstat.c:1765 ++#, c-format + msgid " User Inode " + msgstr "" + +-#: ../netstat.c:1747 ++#: ../netstat.c:1768 ++#, c-format + msgid " Timer" + msgstr "" + +-#: ../netstat.c:1777 ++#: ../netstat.c:1798 ++#, c-format + msgid "IPv4 Group Memberships\n" + msgstr "" + +-#: ../netstat.c:1778 ++#: ../netstat.c:1799 ++#, c-format + msgid "Interface RefCnt Group\n" + msgstr "" + +@@ -986,23 +1166,28 @@ msgid "rarp: cannot set entry from %s:%u\n" + msgstr "" + + #: ../rarp.c:176 ++#, c-format + msgid "Usage: rarp -a list entries in cache.\n" + msgstr "" + + #: ../rarp.c:177 ++#, c-format + msgid " rarp -d <hostname> delete entry from cache.\n" + msgstr "" + + #: ../rarp.c:178 ++#, c-format + msgid " rarp [<HW>] -s <hostname> <hwaddr> add entry to cache.\n" + msgstr "" + + #: ../rarp.c:179 ++#, c-format + msgid "" + " rarp -f add entries from /etc/ethers.\n" + msgstr "" + + #: ../rarp.c:180 ++#, c-format + msgid "" + " rarp -V display program version.\n" + "\n" +@@ -1019,38 +1204,50 @@ msgid "rarp: %s: unknown hardware type.\n" + msgstr "" + + #: ../route.c:80 ++#, c-format + msgid "" + "Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables\n" + msgstr "" + + #: ../route.c:81 ++#, c-format + msgid "" + " route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n" + "\n" + msgstr "" + + #: ../route.c:83 ++#, c-format + msgid "" + " route {-h|--help} [<AF>] Detailed usage syntax for " + "specified AF.\n" + msgstr "" + + #: ../route.c:84 ++#, c-format + msgid "" + " route {-V|--version} Display version/author and " + "exit.\n" + "\n" + msgstr "" + ++#: ../route.c:92 ++#, c-format ++msgid " <AF>=Use '-A <af>' or '--<af>'; default: %s\n" ++msgstr "" ++ + #: ../plipconfig.c:66 ++#, c-format + msgid "Usage: plipconfig [-a] [-i] [-v] interface\n" + msgstr "" + + #: ../plipconfig.c:67 ++#, c-format + msgid " [nibble NN] [trigger NN]\n" + msgstr "" + + #: ../plipconfig.c:68 ++#, c-format + msgid " plipconfig -V | --version\n" + msgstr "" + +@@ -1060,61 +1257,75 @@ msgid "%s\tnibble %lu trigger %lu\n" + msgstr "" + + #: ../iptunnel.c:85 ++#, c-format + msgid "Usage: iptunnel { add | change | del | show } [ NAME ]\n" + msgstr "" + + #: ../iptunnel.c:86 ++#, c-format + msgid "" + " [ mode { ipip | gre | sit } ] [ remote ADDR ] [ local ADDR ]\n" + msgstr "" + + #: ../iptunnel.c:87 ++#, c-format + msgid " [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]\n" + msgstr "" + + #: ../iptunnel.c:88 ++#, c-format + msgid " [ ttl TTL ] [ tos TOS ] [ nopmtudisc ] [ dev PHYS_DEV ]\n" + msgstr "" + + #: ../iptunnel.c:89 ++#, c-format + msgid "" + " iptunnel -V | --version\n" + "\n" + msgstr "" + + #: ../iptunnel.c:90 ++#, c-format + msgid "Where: NAME := STRING\n" + msgstr "" + + #: ../iptunnel.c:91 ++#, c-format + msgid " ADDR := { IP_ADDRESS | any }\n" + msgstr "" + + #: ../iptunnel.c:92 ++#, c-format + msgid " TOS := { NUMBER | inherit }\n" + msgstr "" + + #: ../iptunnel.c:93 ++#, c-format + msgid " TTL := { 1..255 | inherit }\n" + msgstr "" + + #: ../iptunnel.c:94 ++#, c-format + msgid " KEY := { DOTTED_QUAD | NUMBER }\n" + msgstr "" + + #: ../iptunnel.c:332 ++#, c-format + msgid "Keys are not allowed with ipip and sit.\n" + msgstr "" + + #: ../iptunnel.c:352 ++#, c-format + msgid "Broadcast tunnel requires a source address.\n" + msgstr "" + + #: ../iptunnel.c:367 ++#, c-format + msgid "ttl != 0 and noptmudisc are incompatible\n" + msgstr "" + + #: ../iptunnel.c:379 ++#, c-format + msgid "cannot determine tunnel mode (ipip, gre or sit)\n" + msgstr "" + +@@ -1128,22 +1339,27 @@ msgid "unknown" + msgstr "" + + #: ../iptunnel.c:453 ++#, c-format + msgid " Drop packets out of sequence.\n" + msgstr "" + + #: ../iptunnel.c:455 ++#, c-format + msgid " Checksum in received packet is required.\n" + msgstr "" + + #: ../iptunnel.c:457 ++#, c-format + msgid " Sequence packets on output.\n" + msgstr "" + + #: ../iptunnel.c:459 ++#, c-format + msgid " Checksum output packets.\n" + msgstr "" + + #: ../iptunnel.c:487 ++#, c-format + msgid "Wrong format of /proc/net/dev. Sorry.\n" + msgstr "" + +@@ -1153,10 +1369,12 @@ msgid "Failed to get type of [%s]\n" + msgstr "" + + #: ../iptunnel.c:516 ++#, c-format + msgid "RX: Packets Bytes Errors CsumErrs OutOfSeq Mcasts\n" + msgstr "" + + #: ../iptunnel.c:519 ++#, c-format + msgid "TX: Packets Bytes Errors DeadLoop NoRoute NoBufs\n" + msgstr "" + +@@ -1323,287 +1541,487 @@ msgstr "" + + #: ../statistics.c:99 + #, c-format +-msgid "address mask request: %u" ++msgid "address mask request: %u" ++msgstr "" ++ ++#. ? ++#: ../statistics.c:100 ../statistics.c:113 ++#, c-format ++msgid "address mask replies: %u" ++msgstr "" ++ ++#. ? ++#: ../statistics.c:101 ++#, c-format ++msgid "%u ICMP messages sent" ++msgstr "" ++ ++#: ../statistics.c:102 ++#, c-format ++msgid "%u ICMP messages failed" ++msgstr "" ++ ++#: ../statistics.c:104 ++#, c-format ++msgid "time exceeded: %u" ++msgstr "" ++ ++#. ? ++#: ../statistics.c:106 ++#, c-format ++msgid "source quench: %u" ++msgstr "" ++ ++#: ../statistics.c:107 ++#, c-format ++msgid "redirect: %u" ++msgstr "" ++ ++#: ../statistics.c:108 ++#, c-format ++msgid "echo request: %u" ++msgstr "" ++ ++#: ../statistics.c:110 ++#, c-format ++msgid "timestamp requests: %u" ++msgstr "" ++ ++#: ../statistics.c:111 ++#, c-format ++msgid "timestamp replies: %u" ++msgstr "" ++ ++#: ../statistics.c:112 ++#, c-format ++msgid "address mask requests: %u" ++msgstr "" ++ ++#: ../statistics.c:118 ++#, c-format ++msgid "RTO algorithm is %s" ++msgstr "" ++ ++#: ../statistics.c:122 ++#, c-format ++msgid "%u active connections openings" ++msgstr "" ++ ++#: ../statistics.c:123 ++#, c-format ++msgid "%u passive connection openings" ++msgstr "" ++ ++#: ../statistics.c:124 ++#, c-format ++msgid "%u failed connection attempts" ++msgstr "" ++ ++#: ../statistics.c:125 ++#, c-format ++msgid "%u connection resets received" ++msgstr "" ++ ++#: ../statistics.c:126 ++#, c-format ++msgid "%u connections established" ++msgstr "" ++ ++#: ../statistics.c:127 ++#, c-format ++msgid "%u segments received" ++msgstr "" ++ ++#: ../statistics.c:128 ++#, c-format ++msgid "%u segments send out" ++msgstr "" ++ ++#: ../statistics.c:129 ++#, c-format ++msgid "%u segments retransmited" ++msgstr "" ++ ++#: ../statistics.c:130 ++#, c-format ++msgid "%u bad segments received." ++msgstr "" ++ ++#: ../statistics.c:131 ++#, c-format ++msgid "%u resets sent" ++msgstr "" ++ ++#: ../statistics.c:136 ++#, c-format ++msgid "%u packets received" ++msgstr "" ++ ++#: ../statistics.c:137 ++#, c-format ++msgid "%u packets to unknown port received." ++msgstr "" ++ ++#: ../statistics.c:138 ++#, c-format ++msgid "%u packet receive errors" ++msgstr "" ++ ++#: ../statistics.c:139 ++#, c-format ++msgid "%u packets sent" ++msgstr "" ++ ++#: ../statistics.c:144 ++#, c-format ++msgid "%u SYN cookies sent" ++msgstr "" ++ ++#: ../statistics.c:145 ++#, c-format ++msgid "%u SYN cookies received" ++msgstr "" ++ ++#: ../statistics.c:146 ++#, c-format ++msgid "%u invalid SYN cookies received" ++msgstr "" ++ ++#: ../statistics.c:148 ++#, c-format ++msgid "%u resets received for embryonic SYN_RECV sockets" ++msgstr "" ++ ++#: ../statistics.c:150 ++#, c-format ++msgid "%u packets pruned from receive queue because of socket buffer overrun" ++msgstr "" ++ ++#. obsolete: 2.2.0 doesn't do that anymore ++#: ../statistics.c:153 ++#, c-format ++msgid "%u packets pruned from receive queue" ++msgstr "" ++ ++#: ../statistics.c:154 ++#, c-format ++msgid "" ++"%u packets dropped from out-of-order queue because of socket buffer overrun" ++msgstr "" ++ ++#: ../statistics.c:156 ++#, c-format ++msgid "%u ICMP packets dropped because they were out-of-window" ++msgstr "" ++ ++#: ../statistics.c:158 ++#, c-format ++msgid "%u ICMP packets dropped because socket was locked" ++msgstr "" ++ ++#: ../statistics.c:160 ++#, c-format ++msgid "%u TCP sockets finished time wait in fast timer" ++msgstr "" ++ ++#: ../statistics.c:161 ++#, c-format ++msgid "%u time wait sockets recycled by time stamp" ++msgstr "" ++ ++#: ../statistics.c:162 ++#, c-format ++msgid "%u TCP sockets finished time wait in slow timer" ++msgstr "" ++ ++#: ../statistics.c:163 ++#, c-format ++msgid "%u passive connections rejected because of time stamp" ++msgstr "" ++ ++#: ../statistics.c:165 ++#, c-format ++msgid "%u active connections rejected because of time stamp" ++msgstr "" ++ ++#: ../statistics.c:167 ++#, c-format ++msgid "%u packets rejects in established connections because of timestamp" + msgstr "" + +-#. ? +-#: ../statistics.c:100 ../statistics.c:113 ++#: ../statistics.c:169 + #, c-format +-msgid "address mask replies: %u" ++msgid "%u delayed acks sent" + msgstr "" + +-#. ? +-#: ../statistics.c:101 ++#: ../statistics.c:170 + #, c-format +-msgid "%u ICMP messages sent" ++msgid "%u delayed acks further delayed because of locked socket" + msgstr "" + +-#: ../statistics.c:102 ++#: ../statistics.c:172 + #, c-format +-msgid "%u ICMP messages failed" ++msgid "Quick ack mode was activated %u times" + msgstr "" + +-#: ../statistics.c:104 ++#: ../statistics.c:173 + #, c-format +-msgid "time exceeded: %u" ++msgid "%u times the listen queue of a socket overflowed" + msgstr "" + +-#. ? +-#: ../statistics.c:106 ++#: ../statistics.c:175 + #, c-format +-msgid "source quench: %u" ++msgid "%u SYNs to LISTEN sockets dropped" + msgstr "" + +-#: ../statistics.c:107 ++#: ../statistics.c:176 + #, c-format +-msgid "redirect: %u" ++msgid "%u packets directly queued to recvmsg prequeue." + msgstr "" + +-#: ../statistics.c:108 ++#: ../statistics.c:178 + #, c-format +-msgid "echo request: %u" ++msgid "%u bytes directly in process context from backlog" + msgstr "" + +-#: ../statistics.c:110 ++#: ../statistics.c:179 + #, c-format +-msgid "timestamp requests: %u" ++msgid "%u bytes directly received in process context from prequeue" + msgstr "" + +-#: ../statistics.c:111 ++#: ../statistics.c:181 + #, c-format +-msgid "timestamp replies: %u" ++msgid "%u packets dropped from prequeue" + msgstr "" + +-#: ../statistics.c:112 ++#: ../statistics.c:182 + #, c-format +-msgid "address mask requests: %u" ++msgid "%u packet headers predicted" + msgstr "" + +-#: ../statistics.c:118 ++#: ../statistics.c:183 + #, c-format +-msgid "RTO algorithm is %s" ++msgid "%u packets header predicted and directly queued to user" + msgstr "" + +-#: ../statistics.c:122 ++#: ../statistics.c:185 + #, c-format +-msgid "%u active connections openings" ++msgid "Ran %u times out of system memory during packet sending" + msgstr "" + +-#: ../statistics.c:123 ++#: ../statistics.c:187 + #, c-format +-msgid "%u passive connection openings" ++msgid "%u acknowledgments not containing data payload received" + msgstr "" + +-#: ../statistics.c:124 ++#: ../statistics.c:188 + #, c-format +-msgid "%u failed connection attempts" ++msgid "%u predicted acknowledgments" + msgstr "" + +-#: ../statistics.c:125 ++#: ../statistics.c:189 + #, c-format +-msgid "%u connection resets received" ++msgid "%u times recovered from packet loss due to fast retransmit" + msgstr "" + +-#: ../statistics.c:126 ++#: ../statistics.c:190 + #, c-format +-msgid "%u connections established" ++msgid "%u times recovered from packet loss by selective acknowledgements" + msgstr "" + +-#: ../statistics.c:127 ++#: ../statistics.c:191 + #, c-format +-msgid "%u segments received" ++msgid "%u bad SACK blocks received" + msgstr "" + +-#: ../statistics.c:128 ++#: ../statistics.c:192 + #, c-format +-msgid "%u segments send out" ++msgid "Detected reordering %u times using FACK" + msgstr "" + +-#: ../statistics.c:129 ++#: ../statistics.c:193 + #, c-format +-msgid "%u segments retransmited" ++msgid "Detected reordering %u times using SACK" + msgstr "" + +-#: ../statistics.c:130 ++#: ../statistics.c:194 + #, c-format +-msgid "%u bad segments received." ++msgid "Detected reordering %u times using time stamp" + msgstr "" + +-#: ../statistics.c:131 ++#: ../statistics.c:195 + #, c-format +-msgid "%u resets sent" ++msgid "Detected reordering %u times using reno fast retransmit" + msgstr "" + +-#: ../statistics.c:136 ++#: ../statistics.c:196 + #, c-format +-msgid "%u packets received" ++msgid "%u congestion windows fully recovered without slow start" + msgstr "" + +-#: ../statistics.c:137 ++#: ../statistics.c:197 + #, c-format +-msgid "%u packets to unknown port received." ++msgid "%u congestion windows partially recovered using Hoe heuristic" + msgstr "" + +-#: ../statistics.c:138 ++#: ../statistics.c:198 + #, c-format +-msgid "%u packet receive errors" ++msgid "%u congestion window recovered without slow start using DSACK" + msgstr "" + +-#: ../statistics.c:139 ++#: ../statistics.c:199 + #, c-format +-msgid "%u packets sent" ++msgid "%u congestion windows recovered without slow start after partial ack" + msgstr "" + +-#: ../statistics.c:144 ++#: ../statistics.c:200 + #, c-format +-msgid "%u SYN cookies sent" ++msgid "%u retransmits lost" + msgstr "" + +-#: ../statistics.c:145 ++#: ../statistics.c:201 + #, c-format +-msgid "%u SYN cookies received" ++msgid "%u timeouts after reno fast retransmit" + msgstr "" + +-#: ../statistics.c:146 ++#: ../statistics.c:202 + #, c-format +-msgid "%u invalid SYN cookies received" ++msgid "%u timeouts after SACK recovery" + msgstr "" + +-#: ../statistics.c:148 ++#: ../statistics.c:203 + #, c-format +-msgid "%u resets received for embryonic SYN_RECV sockets" ++msgid "%u timeouts in loss state" + msgstr "" + +-#: ../statistics.c:150 ++#: ../statistics.c:204 + #, c-format +-msgid "%u packets pruned from receive queue because of socket buffer overrun" ++msgid "%u fast retransmits" + msgstr "" + +-#. obsolete: 2.2.0 doesn't do that anymore +-#: ../statistics.c:153 ++#: ../statistics.c:205 + #, c-format +-msgid "%u packets pruned from receive queue" ++msgid "%u forward retransmits" + msgstr "" + +-#: ../statistics.c:154 ++#: ../statistics.c:206 + #, c-format +-msgid "" +-"%u packets dropped from out-of-order queue because of socket buffer overrun" ++msgid "%u retransmits in slow start" + msgstr "" + +-#: ../statistics.c:156 ++#: ../statistics.c:207 + #, c-format +-msgid "%u ICMP packets dropped because they were out-of-window" ++msgid "%u other TCP timeouts" + msgstr "" + +-#: ../statistics.c:158 ++#: ../statistics.c:208 + #, c-format +-msgid "%u ICMP packets dropped because socket was locked" ++msgid "%u reno fast retransmits failed" + msgstr "" + +-#: ../statistics.c:160 ++#: ../statistics.c:209 + #, c-format +-msgid "%u TCP sockets finished time wait in fast timer" ++msgid "%u SACK retransmits failed" + msgstr "" + +-#: ../statistics.c:161 ++#: ../statistics.c:210 + #, c-format +-msgid "%u time wait sockets recycled by time stamp" ++msgid "%u times receiver scheduled too late for direct processing" + msgstr "" + +-#: ../statistics.c:162 ++#: ../statistics.c:211 + #, c-format +-msgid "%u TCP sockets finished time wait in slow timer" ++msgid "%u packets collapsed in receive queue due to low socket buffer" + msgstr "" + +-#: ../statistics.c:163 ++#: ../statistics.c:212 + #, c-format +-msgid "%u passive connections rejected because of time stamp" ++msgid "%u DSACKs sent for old packets" + msgstr "" + +-#: ../statistics.c:165 ++#: ../statistics.c:213 + #, c-format +-msgid "%u active connections rejected because of time stamp" ++msgid "%u DSACKs sent for out of order packets" + msgstr "" + +-#: ../statistics.c:167 ++#: ../statistics.c:214 + #, c-format +-msgid "%u packets rejects in established connections because of timestamp" ++msgid "%u DSACKs received" + msgstr "" + +-#: ../statistics.c:169 ++#: ../statistics.c:215 + #, c-format +-msgid "%u delayed acks sent" ++msgid "%u DSACKs for out of order packets received" + msgstr "" + +-#: ../statistics.c:170 ++#: ../statistics.c:216 + #, c-format +-msgid "%u delayed acks further delayed because of locked socket" ++msgid "%u connections reset due to unexpected SYN" + msgstr "" + +-#: ../statistics.c:172 ++#: ../statistics.c:217 + #, c-format +-msgid "Quick ack mode was activated %u times" ++msgid "%u connections reset due to unexpected data" + msgstr "" + +-#: ../statistics.c:173 ++#: ../statistics.c:218 + #, c-format +-msgid "%u times the listen queue of a socket overflowed" ++msgid "%u connections reset due to early user close" + msgstr "" + +-#: ../statistics.c:175 ++#: ../statistics.c:219 + #, c-format +-msgid "%u SYNs to LISTEN sockets ignored" ++msgid "%u connections aborted due to memory pressure" + msgstr "" + +-#: ../statistics.c:176 ++#: ../statistics.c:220 + #, c-format +-msgid "%u packets directly queued to recvmsg prequeue." ++msgid "%u connections aborted due to timeout" + msgstr "" + +-#: ../statistics.c:178 ++#: ../statistics.c:221 + #, c-format +-msgid "%u packets directly received from backlog" ++msgid "%u connections aborted after user close in linger timeout" + msgstr "" + +-#: ../statistics.c:180 ++#: ../statistics.c:222 + #, c-format +-msgid "%u packets directly received from prequeue" ++msgid "%u times unabled to send RST due to no memory" + msgstr "" + +-#: ../statistics.c:182 ++#: ../statistics.c:223 + #, c-format +-msgid "%u packets dropped from prequeue" ++msgid "TCP ran low on memory %u times" + msgstr "" + +-#: ../statistics.c:183 ++#: ../statistics.c:224 + #, c-format +-msgid "%u packets header predicted" ++msgid "%u TCP data loss events" + msgstr "" + +-#: ../statistics.c:184 ++#: ../statistics.c:225 + #, c-format +-msgid "%u packets header predicted and directly queued to user" ++msgid "%u congestion windows recovered without slow start by DSACK" + msgstr "" + +-#: ../statistics.c:186 ++#: ../statistics.c:227 + #, c-format +-msgid "Ran %u times out of system memory during packet sending" ++msgid "%u classic Reno fast retransmits failed" + msgstr "" + +-#: ../statistics.c:253 ++#: ../statistics.c:294 + msgid "enabled" + msgstr "" + +-#: ../statistics.c:253 ++#: ../statistics.c:294 + msgid "disabled" + msgstr "" + +-#: ../statistics.c:336 ++#: ../statistics.c:377 + msgid "error parsing /proc/net/snmp" + msgstr "" + +-#: ../statistics.c:349 ++#: ../statistics.c:390 + msgid "cannot open /proc/net/snmp" + msgstr "" + +@@ -1617,7 +2035,7 @@ msgstr "" + msgid "Cannot change line discipline to `%s'.\n" + msgstr "" + +-#: ../lib/af.c:153 ../lib/hw.c:156 ++#: ../lib/af.c:153 ../lib/hw.c:161 + msgid "UNSPEC" + msgstr "" + +@@ -1633,11 +2051,11 @@ msgstr "" + msgid "IPv6" + msgstr "" + +-#: ../lib/af.c:164 ../lib/hw.c:177 ++#: ../lib/af.c:164 ../lib/hw.c:182 + msgid "AMPR AX.25" + msgstr "" + +-#: ../lib/af.c:167 ../lib/hw.c:183 ++#: ../lib/af.c:167 ../lib/hw.c:188 + msgid "AMPR NET/ROM" + msgstr "" + +@@ -1649,7 +2067,7 @@ msgstr "" + msgid "Appletalk DDP" + msgstr "" + +-#: ../lib/af.c:176 ../lib/hw.c:218 ++#: ../lib/af.c:176 ../lib/hw.c:223 + msgid "Econet" + msgstr "" + +@@ -1657,19 +2075,21 @@ msgstr "" + msgid "CCITT X.25" + msgstr "" + +-#: ../lib/af.c:182 ../lib/hw.c:180 ++#: ../lib/af.c:182 ../lib/hw.c:185 + msgid "AMPR ROSE" + msgstr "" + +-#: ../lib/af.c:185 ../lib/hw.c:168 ++#: ../lib/af.c:185 ../lib/hw.c:173 + msgid "Ash" + msgstr "" + + #: ../lib/af.c:243 ++#, c-format + msgid "Please don't supply more than one address family.\n" + msgstr "" + + #: ../lib/af.c:304 ++#, c-format + msgid "Too much address family arguments.\n" + msgstr "" + +@@ -1694,11 +2114,12 @@ msgid "in_arcnet(%s): trailing junk!\n" + msgstr "" + + #: ../lib/ash.c:81 ++#, c-format + msgid "Malformed Ash address" + msgstr "" + + #: ../lib/ax25.c:75 ../lib/ddp.c:50 ../lib/econet.c:52 ../lib/inet.c:244 +-#: ../lib/inet.c:259 ../lib/inet6.c:129 ../lib/ipx.c:81 ../lib/netrom.c:78 ++#: ../lib/inet.c:259 ../lib/inet6.c:145 ../lib/ipx.c:81 ../lib/netrom.c:78 + #: ../lib/rose.c:71 ../lib/unix.c:56 ../lib/unix.c:76 + msgid "[NONE SET]" + msgstr "" +@@ -1712,22 +2133,21 @@ msgid "Callsign too long" + msgstr "" + + #: ../lib/ax25_gr.c:47 ++#, c-format + msgid "AX.25 not configured in this system.\n" + msgstr "" + + #: ../lib/ax25_gr.c:50 ++#, c-format + msgid "Kernel AX.25 routing table\n" + msgstr "" + + #. xxx + #: ../lib/ax25_gr.c:51 ../lib/rose_gr.c:55 ++#, c-format + msgid "Destination Iface Use\n" + msgstr "" + +-#: ../lib/ddp_gr.c:21 +-msgid "Routing table for `ddp' not yet supported.\n" +-msgstr "" +- + #: ../lib/ether.c:74 ../lib/ether.c:91 + #, c-format + msgid "in_ether(%s): invalid ether address!\n" +@@ -1783,225 +2203,260 @@ msgstr "" + msgid "in_hippi(%s): trailing junk!\n" + msgstr "" + +-#: ../lib/hw.c:155 ++#: ../lib/hw.c:160 + msgid "Local Loopback" + msgstr "" + +-#: ../lib/hw.c:158 ++#: ../lib/hw.c:163 + msgid "Serial Line IP" + msgstr "" + +-#: ../lib/hw.c:159 ++#: ../lib/hw.c:164 + msgid "VJ Serial Line IP" + msgstr "" + +-#: ../lib/hw.c:160 ++#: ../lib/hw.c:165 + msgid "6-bit Serial Line IP" + msgstr "" + +-#: ../lib/hw.c:161 ++#: ../lib/hw.c:166 + msgid "VJ 6-bit Serial Line IP" + msgstr "" + +-#: ../lib/hw.c:162 ++#: ../lib/hw.c:167 + msgid "Adaptive Serial Line IP" + msgstr "" + +-#: ../lib/hw.c:165 ++#: ../lib/hw.c:170 + msgid "Ethernet" + msgstr "" + +-#: ../lib/hw.c:171 ++#: ../lib/hw.c:176 + msgid "Fiber Distributed Data Interface" + msgstr "" + +-#: ../lib/hw.c:174 ++#: ../lib/hw.c:179 + msgid "HIPPI" + msgstr "" + +-#: ../lib/hw.c:186 ++#: ../lib/hw.c:191 + msgid "generic X.25" + msgstr "" + +-#: ../lib/hw.c:189 ++#: ../lib/hw.c:194 + msgid "IPIP Tunnel" + msgstr "" + +-#: ../lib/hw.c:192 ++#: ../lib/hw.c:197 + msgid "Point-to-Point Protocol" + msgstr "" + +-#: ../lib/hw.c:195 ++#: ../lib/hw.c:200 + msgid "(Cisco)-HDLC" + msgstr "" + +-#: ../lib/hw.c:196 ++#: ../lib/hw.c:201 + msgid "LAPB" + msgstr "" + +-#: ../lib/hw.c:199 ++#: ../lib/hw.c:204 + msgid "ARCnet" + msgstr "" + +-#: ../lib/hw.c:202 ++#: ../lib/hw.c:207 + msgid "Frame Relay DLCI" + msgstr "" + +-#: ../lib/hw.c:203 ++#: ../lib/hw.c:208 + msgid "Frame Relay Access Device" + msgstr "" + +-#: ../lib/hw.c:206 ++#: ../lib/hw.c:211 + msgid "IPv6-in-IPv4" + msgstr "" + +-#: ../lib/hw.c:209 ++#: ../lib/hw.c:214 + msgid "IrLAP" + msgstr "" + +-#: ../lib/hw.c:212 ++#: ../lib/hw.c:217 + msgid "16/4 Mbps Token Ring" + msgstr "" + +-#: ../lib/hw.c:214 ++#: ../lib/hw.c:219 + msgid "16/4 Mbps Token Ring (New)" + msgstr "" + +-#: ../lib/inet.c:153 ../lib/inet6.c:79 ++#: ../lib/hw.c:226 ++msgid "Generic EUI-64" ++msgstr "" ++ ++#: ../lib/inet.c:153 ../lib/inet6.c:94 + #, c-format + msgid "rresolve: unsupport address family %d !\n" + msgstr "" + +-#: ../lib/inet6.c:131 ++#: ../lib/inet6.c:147 + msgid "[UNKNOWN]" + msgstr "" + + #: ../lib/inet6_gr.c:71 ++#, c-format + msgid "INET6 (IPv6) not configured in this system.\n" + msgstr "" + +-#: ../lib/inet6_gr.c:74 ++#: ../lib/inet6_gr.c:76 ++#, c-format ++msgid "Kernel IPv6 routing cache\n" ++msgstr "" ++ ++#: ../lib/inet6_gr.c:78 ++#, c-format + msgid "Kernel IPv6 routing table\n" + msgstr "" + +-#: ../lib/inet6_gr.c:76 ++#: ../lib/inet6_gr.c:80 ++#, c-format + msgid "" +-"Destination Next Hop " +-" Flags Metric Ref Use Iface\n" ++"Destination Next Hop Flag Met Ref Use " ++"If\n" + msgstr "" + +-#: ../lib/inet6_gr.c:150 ++#: ../lib/inet6_gr.c:174 ++#, c-format + msgid "Kernel IPv6 Neighbour Cache\n" + msgstr "" + +-#: ../lib/inet6_gr.c:153 ++#: ../lib/inet6_gr.c:177 ++#, c-format + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State\n" + msgstr "" + +-#: ../lib/inet6_gr.c:157 ++#: ../lib/inet6_gr.c:181 ++#, c-format + msgid "" + "Neighbour HW Address Iface Flags " + "Ref State Stale(sec) Delete(sec)\n" + msgstr "" + + #: ../lib/inet6_sr.c:46 ++#, c-format + msgid "Usage: inet6_route [-vF] del Target\n" + msgstr "" + + #: ../lib/inet6_sr.c:47 ++#, c-format + msgid " inet6_route [-vF] add Target [gw Gw] [metric M] [[dev] If]\n" + msgstr "" + + #: ../lib/inet6_sr.c:48 ++#, c-format + msgid " inet6_route [-FC] flush NOT supported\n" + msgstr "" + + #: ../lib/inet6_sr.c:188 ++#, c-format + msgid "Flushing `inet6' routing table not supported\n" + msgstr "" + + #: ../lib/inet_gr.c:50 ../lib/inet_gr.c:220 ++#, c-format + msgid "INET (IPv4) not configured in this system.\n" + msgstr "" + + #: ../lib/inet_gr.c:53 ++#, c-format + msgid "Kernel IP routing table\n" + msgstr "" + + #: ../lib/inet_gr.c:56 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags Metric Ref Use " + "Iface\n" + msgstr "" + + #: ../lib/inet_gr.c:59 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags MSS Window irtt " + "Iface\n" + msgstr "" + + #: ../lib/inet_gr.c:62 ++#, c-format + msgid "" + "Destination Gateway Genmask Flags Metric Ref Use " + "Iface MSS Window irtt\n" + msgstr "" + + #: ../lib/inet_gr.c:237 ++#, c-format + msgid "Kernel IP routing cache\n" + msgstr "" + + #: ../lib/inet_gr.c:258 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface\n" + msgstr "" + + #: ../lib/inet_gr.c:261 ++#, c-format + msgid "" + "Source Destination Gateway Flags MSS Window irtt " + "Iface\n" + msgstr "" + + #: ../lib/inet_gr.c:266 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface MSS Window irtt HH Arp\n" + msgstr "" + + #: ../lib/inet_gr.c:290 ++#, c-format + msgid "" + "Source Destination Gateway Flags Metric Ref Use " + "Iface MSS Window irtt TOS HHRef HHUptod SpecDst\n" + msgstr "" + +-#: ../lib/inet_sr.c:50 ++#: ../lib/inet_sr.c:51 ++#, c-format + msgid "" + "Usage: inet_route [-vF] del {-host|-net} Target[/prefix] [gw Gw] [metric M] " + "[[dev] If]\n" + msgstr "" + +-#: ../lib/inet_sr.c:51 ++#: ../lib/inet_sr.c:52 ++#, c-format + msgid "" + " inet_route [-vF] add {-host|-net} Target[/prefix] [gw Gw] [metric M]\n" + msgstr "" + +-#: ../lib/inet_sr.c:52 ++#: ../lib/inet_sr.c:53 ++#, c-format + msgid "" + " [netmask N] [mss Mss] [window W] [irtt I]\n" + msgstr "" + +-#: ../lib/inet_sr.c:53 ++#: ../lib/inet_sr.c:54 ++#, c-format + msgid " [mod] [dyn] [reinstate] [[dev] If]\n" + msgstr "" + +-#: ../lib/inet_sr.c:54 ++#: ../lib/inet_sr.c:55 ++#, c-format + msgid "" + " inet_route [-vF] add {-host|-net} Target[/prefix] [metric M] reject\n" + msgstr "" + +-#: ../lib/inet_sr.c:55 ++#: ../lib/inet_sr.c:56 ++#, c-format + msgid " inet_route [-FC] flush NOT supported\n" + msgstr "" + +@@ -2011,14 +2466,17 @@ msgid "route: %s: cannot use a NETWORK as gateway!\n" + msgstr "" + + #: ../lib/inet_sr.c:174 ++#, c-format + msgid "route: Invalid MSS/MTU.\n" + msgstr "" + + #: ../lib/inet_sr.c:187 ++#, c-format + msgid "route: Invalid window.\n" + msgstr "" + + #: ../lib/inet_sr.c:203 ++#, c-format + msgid "route: Invalid initial rtt.\n" + msgstr "" + +@@ -2033,73 +2491,90 @@ msgid "route: bogus netmask %s\n" + msgstr "" + + #: ../lib/inet_sr.c:270 ++#, c-format + msgid "route: netmask doesn't match route address\n" + msgstr "" + + #: ../lib/inet_sr.c:306 ++#, c-format + msgid "Flushing `inet' routing table not supported\n" + msgstr "" + + #: ../lib/inet_sr.c:310 ++#, c-format + msgid "Modifying `inet' routing cache not supported\n" + msgstr "" + + #: ../lib/ipx_gr.c:52 ++#, c-format + msgid "IPX not configured in this system.\n" + msgstr "" + + #: ../lib/ipx_gr.c:56 ++#, c-format + msgid "Kernel IPX routing table\n" + msgstr "" + + #. xxx + #: ../lib/ipx_gr.c:57 ++#, c-format + msgid "Destination Router Net Router Node\n" + msgstr "" + + #: ../lib/ipx_sr.c:33 ++#, c-format + msgid "IPX: this needs to be written\n" + msgstr "" + + #: ../lib/masq_info.c:198 ++#, c-format + msgid "IP masquerading entries\n" + msgstr "" + + #: ../lib/masq_info.c:201 ++#, c-format + msgid "prot expire source destination ports\n" + msgstr "" + + #: ../lib/masq_info.c:204 ++#, c-format + msgid "" +-"prot expire initseq delta prevd source destination " +-" ports\n" ++"prot expire initseq delta prevd source " ++"destination ports\n" + msgstr "" + + #: ../lib/netrom_gr.c:48 ++#, c-format + msgid "NET/ROM not configured in this system.\n" + msgstr "" + + #: ../lib/netrom_gr.c:51 ++#, c-format + msgid "Kernel NET/ROM routing table\n" + msgstr "" + + #: ../lib/netrom_gr.c:52 ++#, c-format + msgid "Destination Mnemonic Quality Neighbour Iface\n" + msgstr "" + + #: ../lib/netrom_sr.c:34 ++#, c-format + msgid "netrom usage\n" + msgstr "" + + #: ../lib/netrom_sr.c:44 ++#, c-format + msgid "NET/ROM: this needs to be written\n" + msgstr "" + + #: ../lib/ppp.c:44 ++#, c-format + msgid "You cannot start PPP with this program.\n" + msgstr "" + + #: ../lib/ppp_ac.c:38 ++#, c-format + msgid "Sorry, use pppd!\n" + msgstr "" + +@@ -2108,287 +2583,314 @@ msgid "Node address must be ten digits" + msgstr "" + + #: ../lib/rose_gr.c:51 ++#, c-format + msgid "ROSE not configured in this system.\n" + msgstr "" + + #: ../lib/rose_gr.c:54 ++#, c-format + msgid "Kernel ROSE routing table\n" + msgstr "" + +-#: ../lib/tr.c:70 ../lib/tr.c:85 ++#: ../lib/tr.c:86 ../lib/tr.c:101 + #, c-format + msgid "in_tr(%s): invalid token ring address!\n" + msgstr "" + +-#: ../lib/tr.c:97 ++#: ../lib/tr.c:113 + #, c-format + msgid "in_tr(%s): trailing : ignored!\n" + msgstr "" + +-#: ../lib/tr.c:109 ++#: ../lib/tr.c:125 + #, c-format + msgid "in_tr(%s): trailing junk!\n" + msgstr "" + +-#: ../lib/interface.c:164 ++#: ../lib/interface.c:174 + #, c-format + msgid "warning: no inet socket available: %s\n" + msgstr "" + +-#: ../lib/interface.c:316 ++#: ../lib/interface.c:323 + #, c-format + msgid "Warning: cannot open %s (%s). Limited output.\n" + msgstr "" + + #. Give better error message for this case. +-#: ../lib/interface.c:556 ++#: ../lib/interface.c:570 + msgid "Device not found" + msgstr "" + +-#: ../lib/interface.c:560 ++#: ../lib/interface.c:574 + #, c-format + msgid "%s: error fetching interface information: %s\n" + msgstr "" + +-#: ../lib/interface.c:593 ++#: ../lib/interface.c:607 + msgid " - no statistics available -" + msgstr "" + +-#: ../lib/interface.c:597 ++#: ../lib/interface.c:611 ++#, c-format + msgid "[NO FLAGS]" + msgstr "" + +-#: ../lib/interface.c:673 ++#: ../lib/interface.c:687 + #, c-format + msgid "%-9.9s Link encap:%s " + msgstr "" + +-#: ../lib/interface.c:678 ++#: ../lib/interface.c:692 + #, c-format + msgid "HWaddr %s " + msgstr "" + +-#: ../lib/interface.c:681 ++#: ../lib/interface.c:695 + #, c-format + msgid "Media:%s" + msgstr "" + +-#: ../lib/interface.c:683 ++#: ../lib/interface.c:697 ++#, c-format + msgid "(auto)" + msgstr "" + +-#: ../lib/interface.c:690 ++#: ../lib/interface.c:704 + #, c-format + msgid " %s addr:%s " + msgstr "" + +-#: ../lib/interface.c:693 ++#: ../lib/interface.c:707 + #, c-format + msgid " P-t-P:%s " + msgstr "" + +-#: ../lib/interface.c:696 ++#: ../lib/interface.c:710 + #, c-format + msgid " Bcast:%s " + msgstr "" + +-#: ../lib/interface.c:698 ++#: ../lib/interface.c:712 + #, c-format + msgid " Mask:%s\n" + msgstr "" + +-#: ../lib/interface.c:715 ++#: ../lib/interface.c:729 + #, c-format + msgid " inet6 addr: %s/%d" + msgstr "" + +-#: ../lib/interface.c:717 ++#: ../lib/interface.c:731 ++#, c-format + msgid " Scope:" + msgstr "" + +-#: ../lib/interface.c:720 ++#: ../lib/interface.c:734 ++#, c-format + msgid "Global" + msgstr "" + +-#: ../lib/interface.c:723 ++#: ../lib/interface.c:737 ++#, c-format + msgid "Link" + msgstr "" + +-#: ../lib/interface.c:726 ++#: ../lib/interface.c:740 ++#, c-format + msgid "Site" + msgstr "" + +-#: ../lib/interface.c:729 ++#: ../lib/interface.c:743 ++#, c-format + msgid "Compat" + msgstr "" + +-#: ../lib/interface.c:732 ++#: ../lib/interface.c:746 ++#, c-format + msgid "Host" + msgstr "" + +-#: ../lib/interface.c:735 ++#: ../lib/interface.c:749 ++#, c-format + msgid "Unknown" + msgstr "" + +-#: ../lib/interface.c:750 ++#: ../lib/interface.c:764 + #, c-format + msgid " IPX/Ethernet II addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:753 ++#: ../lib/interface.c:767 + #, c-format + msgid " IPX/Ethernet SNAP addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:756 ++#: ../lib/interface.c:770 + #, c-format + msgid " IPX/Ethernet 802.2 addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:759 ++#: ../lib/interface.c:773 + #, c-format + msgid " IPX/Ethernet 802.3 addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:769 ++#: ../lib/interface.c:783 + #, c-format + msgid " EtherTalk Phase 2 addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:778 ++#: ../lib/interface.c:792 + #, c-format + msgid " econet addr:%s\n" + msgstr "" + +-#: ../lib/interface.c:785 ++#: ../lib/interface.c:799 ++#, c-format + msgid "[NO FLAGS] " + msgstr "" + +-#: ../lib/interface.c:787 ++#: ../lib/interface.c:801 ++#, c-format + msgid "UP " + msgstr "" + +-#: ../lib/interface.c:789 ++#: ../lib/interface.c:803 ++#, c-format + msgid "BROADCAST " + msgstr "" + +-#: ../lib/interface.c:791 ++#: ../lib/interface.c:805 ++#, c-format + msgid "DEBUG " + msgstr "" + +-#: ../lib/interface.c:793 ++#: ../lib/interface.c:807 ++#, c-format + msgid "LOOPBACK " + msgstr "" + +-#: ../lib/interface.c:795 ++#: ../lib/interface.c:809 ++#, c-format + msgid "POINTOPOINT " + msgstr "" + +-#: ../lib/interface.c:797 ++#: ../lib/interface.c:811 ++#, c-format + msgid "NOTRAILERS " + msgstr "" + +-#: ../lib/interface.c:799 ++#: ../lib/interface.c:813 ++#, c-format + msgid "RUNNING " + msgstr "" + +-#: ../lib/interface.c:801 ++#: ../lib/interface.c:815 ++#, c-format + msgid "NOARP " + msgstr "" + +-#: ../lib/interface.c:803 ++#: ../lib/interface.c:817 ++#, c-format + msgid "PROMISC " + msgstr "" + +-#: ../lib/interface.c:805 ++#: ../lib/interface.c:819 ++#, c-format + msgid "ALLMULTI " + msgstr "" + +-#: ../lib/interface.c:807 ++#: ../lib/interface.c:821 ++#, c-format + msgid "SLAVE " + msgstr "" + +-#: ../lib/interface.c:809 ++#: ../lib/interface.c:823 ++#, c-format + msgid "MASTER " + msgstr "" + +-#: ../lib/interface.c:811 ++#: ../lib/interface.c:825 ++#, c-format + msgid "MULTICAST " + msgstr "" + +-#: ../lib/interface.c:814 ++#: ../lib/interface.c:828 ++#, c-format + msgid "DYNAMIC " + msgstr "" + + #. DONT FORGET TO ADD THE FLAGS IN ife_print_short +-#: ../lib/interface.c:817 ++#: ../lib/interface.c:831 + #, c-format + msgid " MTU:%d Metric:%d" + msgstr "" + +-#: ../lib/interface.c:821 ++#: ../lib/interface.c:835 + #, c-format + msgid " Outfill:%d Keepalive:%d" + msgstr "" + +-#: ../lib/interface.c:835 ++#: ../lib/interface.c:849 + #, c-format + msgid "RX packets:%llu errors:%lu dropped:%lu overruns:%lu frame:%lu\n" + msgstr "" + +-#: ../lib/interface.c:840 ++#: ../lib/interface.c:854 + #, c-format + msgid " compressed:%lu\n" + msgstr "" + +-#: ../lib/interface.c:852 ++#: ../lib/interface.c:894 + #, c-format + msgid "TX packets:%llu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n" + msgstr "" + +-#: ../lib/interface.c:856 ++#: ../lib/interface.c:898 + #, c-format + msgid " collisions:%lu " + msgstr "" + +-#: ../lib/interface.c:858 ++#: ../lib/interface.c:900 + #, c-format + msgid "compressed:%lu " + msgstr "" + +-#: ../lib/interface.c:860 ++#: ../lib/interface.c:902 + #, c-format + msgid "txqueuelen:%d " + msgstr "" + +-#: ../lib/interface.c:862 ++#: ../lib/interface.c:904 + #, c-format + msgid "RX bytes:%llu (%lu.%lu %s) TX bytes:%llu (%lu.%lu %s)\n" + msgstr "" + +-#: ../lib/interface.c:873 ++#: ../lib/interface.c:915 + #, c-format + msgid "Interrupt:%d " + msgstr "" + + #. Only print devices using it for + #. I/O maps +-#: ../lib/interface.c:876 ++#: ../lib/interface.c:918 + #, c-format + msgid "Base address:0x%x " + msgstr "" + +-#: ../lib/interface.c:878 ++#: ../lib/interface.c:920 + #, c-format + msgid "Memory:%lx-%lx " + msgstr "" + +-#: ../lib/interface.c:881 ++#: ../lib/interface.c:923 + #, c-format + msgid "DMA chan:%x " + msgstr "" + + #: ../lib/sockets.c:63 ++#, c-format + msgid "No usable address families found.\n" + msgstr "" + +@@ -2413,14 +2915,17 @@ msgid "ip: argument is wrong: %s\n" + msgstr "" + + #: ../ipmaddr.c:61 ++#, c-format + msgid "Usage: ipmaddr [ add | del ] MULTIADDR dev STRING\n" + msgstr "" + + #: ../ipmaddr.c:62 ++#, c-format + msgid " ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n" + msgstr "" + + #: ../ipmaddr.c:63 ++#, c-format + msgid " ipmaddr -V | -version\n" + msgstr "" + +@@ -2449,6 +2954,7 @@ msgid "slattach: tty_lock: (%s): %s\n" + msgstr "" + + #: ../slattach.c:192 ++#, c-format + msgid "slattach: cannot write PID file\n" + msgstr "" + +@@ -2468,18 +2974,22 @@ msgid "slattach: tty_hangup(RAISE): %s\n" + msgstr "" + + #: ../slattach.c:468 ++#, c-format + msgid "slattach: tty name too long\n" + msgstr "" + + #: ../slattach.c:498 ++#, c-format + msgid "slattach: tty_open: cannot get current state!\n" + msgstr "" + + #: ../slattach.c:505 ++#, c-format + msgid "slattach: tty_open: cannot get current line disc!\n" + msgstr "" + + #: ../slattach.c:513 ++#, c-format + msgid "slattach: tty_open: cannot set RAW mode!\n" + msgstr "" + +@@ -2489,6 +2999,7 @@ msgid "slattach: tty_open: cannot set %s bps!\n" + msgstr "" + + #: ../slattach.c:530 ++#, c-format + msgid "slattach: tty_open: cannot set 8N1 mode!\n" + msgstr "" + +diff --git a/po/pt_BR.po b/po/pt_BR.po +index 7c5dd37..17f1e5a 100644 +--- a/po/pt_BR.po ++++ b/po/pt_BR.po +@@ -2,7 +2,7 @@ + # Copyright (C) 2000 Free Software Foundation, Inc. + # Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 2000. + # +-# $Id: pt_BR.po,v 1.7 2000/02/13 22:28:11 ralf Exp $ ++# $Id: pt_BR.po,v 1.8 2006/12/14 23:36:24 ecki Exp $ + # Brazilian portuguese translation for net-tools 1.54 + # Copyright (C) 1998, 1999 Free Software Foundation, Inc. + # Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 1998-2000 +@@ -14,7 +14,7 @@ msgstr "" + "PO-Revision-Date: 1999-03-01 02:38+0100\n" + "Last-Translator: Arnaldo Carvalho de Melo <acme@conectiva.com.br>\n" + "MIME-Version: 1.0\n" +-"Content-Type: text/plain; charset=ISO8859-9\n" ++"Content-Type: text/plain; charset=iso-8859-9\n" + "Content-Transfer-Encoding: 8bit\n" + + #: ../arp.c:110 ../arp.c:269 +@@ -64,8 +64,12 @@ msgid "arp: cannot set entry on line %u of etherfile %s !\n" + msgstr "arp: no foi possvel configurar a linha %u do arquivo etherfile %s!\n" + + #: ../arp.c:437 +-msgid "Address\t\t\tHWtype\tHWaddress\t Flags Mask\t\t Iface\n" +-msgstr "Endereo\t\tTipoHW\tEndereoHW\t Flags Mascara\t\t Iface\n" ++msgid "" ++"Address HWtype HWaddress Flags Mask " ++"Iface\n" ++msgstr "" ++"Endereo TipoHW EndereoHW Flags Mascara " ++"Iface\n" + + #: ../arp.c:467 + msgid "(incomplete)" +@@ -2361,17 +2365,15 @@ msgstr "aten + msgid "Warning: cannot open %s (%s). Limited output.\n" + msgstr "Ateno: no foi possvel abrir %s (%s). Sada limitada.\n" + +-#. Give better error message for this case. ++#. better translation? + #: ../lib/interface.c:504 + msgid "Device not found" +-msgstr "%s: dispositivo no encontrado" ++msgstr "dispositivo no encontrado" + + #: ../lib/interface.c:508 + #, c-format + msgid "%s: error fetching interface information: %s\n" +-msgstr "" +-"%s: erro obtendo informaes da interface: %s\n" +-"\n" ++msgstr "%s: erro obtendo informaes da interface: %s\n" + + #: ../lib/sockets.c:59 + msgid "No usable address families found.\n" +diff --git a/rarp.c b/rarp.c +index aab05b3..ab8f710 100644 +--- a/rarp.c ++++ b/rarp.c +@@ -3,7 +3,7 @@ + * that maintains the kernel's RARP cache. It is derived + * from Fred N. van Kempen's arp command. + * +- * Version: $Id: rarp.c,v 1.6 2001/04/08 17:05:05 pb Exp $ ++ * Version: $Id: rarp.c,v 1.9 2007/12/02 02:19:52 ecki Exp $ + * + * Usage: rarp -d hostname Delete entry + * rarp -s hostname ethernet_address Add entry +@@ -40,10 +40,11 @@ + #include "net-support.h" + #include "version.h" + #include "pathnames.h" ++#include "proc.h" + + static char no_rarp_message[] = N_("This kernel does not support RARP.\n"); + +-static char version_string[] = RELEASE "\nrarp 1.03 (2001-04-04)\n"; ++static char *Release = RELEASE; + + static struct hwtype *hardware = NULL; + +@@ -154,7 +155,7 @@ static int rarp_file(int fd, const char *name) + + static int display_cache(void) + { +- FILE *fd = fopen(_PATH_PROCNET_RARP, "r"); ++ FILE *fd = proc_fopen(_PATH_PROCNET_RARP); + char buffer[256]; + if (fd == NULL) { + if (errno == ENOENT) +@@ -225,7 +226,7 @@ int main(int argc, char **argv) + case 'h': + usage(); + case 'V': +- fprintf(stderr, version_string); ++ fprintf(stderr, "%s\n", Release); + exit(E_VERSION); + break; + case 'v': +diff --git a/route.c b/route.c +index f8c2bc3..4eaed49 100644 +--- a/route.c ++++ b/route.c +@@ -2,7 +2,7 @@ + * route This file contains an implementation of the command + * that manages the IP routing table in the kernel. + * +- * Version: $Id: route.c,v 1.9 2001/04/15 14:41:17 pb Exp $ ++ * Version: $Id: route.c,v 1.10 2002/07/30 05:24:20 ecki Exp $ + * + * Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de> + * +@@ -10,7 +10,7 @@ + * (derived from FvK's 'route.c 1.70 01/04/94') + * + * Modifications: +- * Johannes Stille: for Net-2Debugged by ++ * Johannes Stille: for Net-2Debugged by + * <johannes@titan.os.open.de> + * Linus Torvalds: Misc Changes + * Alan Cox: add the new mtu/window stuff +@@ -19,7 +19,7 @@ + * {1.80} Bernd Eckenfels: reject, metric, irtt, 1.2.x support. + * {1.81} Bernd Eckenfels: reject routes need a dummy device + *960127 {1.82} Bernd Eckenfels: 'mod' and 'dyn' 'reinstate' added +- *960129 {1.83} Bernd Eckenfels: resolve and getsock now in lib/, ++ *960129 {1.83} Bernd Eckenfels: resolve and getsock now in lib/, + * REJECT displays '-' as gatway. + *960202 {1.84} Bernd Eckenfels: net-features support added + *960203 {1.85} Bernd Eckenfels: "#ifdef' in '#if' for net-features +@@ -60,20 +60,21 @@ + #include "intl.h" + #include "pathnames.h" + #include "version.h" ++#include "util.h" + + #define DFLT_AF "inet" + + #define FEATURE_ROUTE + #include "lib/net-features.h" /* needs some of the system includes above! */ + +-char *Release = RELEASE, *Version = "route 1.98 (2001-04-15)"; ++static char *Release = RELEASE; + +-int opt_n = 0; /* numerical output flag */ +-int opt_v = 0; /* debugging output flag */ +-int opt_e = 1; /* 1,2,3=type of routetable */ +-int opt_fc = 0; /* routing cache/FIB */ +-int opt_h = 0; /* help selected */ +-struct aftype *ap; /* current address family */ ++int opt_n = 0; // numerical output FLAG_NUM | FLAG_SYM ++int opt_v = 0; // debugging output flag ++int opt_e = 1; // 1,2,3=type of routetable ++int opt_fc = 0; // routing cache/FIB ++int opt_h = 0; // help selected ++struct aftype *ap; // selected address family + + static void usage(void) + { +@@ -89,7 +90,7 @@ static void usage(void) + fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n")); + fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n")); + +- fprintf(stderr, _(" <AF>=Use '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF); ++ fprintf(stderr, _(" <AF>=Use -4, -6, '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF); + fprintf(stderr, _(" List of possible address families (which support routing):\n")); + print_aflist(1); /* 1 = routeable */ + exit(E_USAGE); +@@ -98,7 +99,7 @@ static void usage(void) + + static void version(void) + { +- fprintf(stderr, "%s\n%s\n%s\n", Release, Version, Features); ++ fprintf(stderr, "%s\n%s\n", Release, Features); + exit(E_VERSION); + } + +@@ -135,14 +136,12 @@ int main(int argc, char **argv) + + /* getopts and -net wont work :-/ */ + for (tmp = argv; *tmp; tmp++) { +- if (!strcmp(*tmp, "-net")) +- strcpy(*tmp, "#net"); +- else if (!strcmp(*tmp, "-host")) +- strcpy(*tmp, "#host"); ++ if (!strcmp(*tmp, "-net") || !strcmp(*tmp, "-host")) ++ (*tmp)[0]='#'; + } + + /* Fetch the command-line arguments. */ +- while ((i = getopt_long(argc, argv, "A:eCFhnNVv?", longopts, &lop)) != EOF) ++ while ((i = getopt_long(argc, argv, "A:eCFhnN64Vv?", longopts, &lop)) != EOF) + switch (i) { + case -1: + break; +@@ -176,6 +175,14 @@ int main(int argc, char **argv) + if ((i = aftrans_opt(optarg))) + exit(i); + break; ++ case '6': ++ if ((i = aftrans_opt("inet6"))) ++ exit(i); ++ break; ++ case '4': ++ if ((i = aftrans_opt("inet"))) ++ exit(i); ++ break; + case 'V': + version(); + case 'h': +diff --git a/slattach.c b/slattach.c +index cedae1b..5c81584 100644 +--- a/slattach.c ++++ b/slattach.c +@@ -40,7 +40,7 @@ + #include <limits.h> + #include <pwd.h> + #include <signal.h> +-#include <stdlib.h> ++#include <stdlib.h> + #include <string.h> + #include <unistd.h> + #include <getopt.h> +@@ -62,26 +62,27 @@ + #include "util.h" + + #ifndef _PATH_LOCKD +-#define _PATH_LOCKD "/var/lock" /* lock files */ ++#define _PATH_LOCKD "/var/lock" /* lock files */ + #endif + #ifndef _UID_UUCP +-#define _UID_UUCP "uucp" /* owns locks */ ++#define _UID_UUCP "uucp" /* owns locks */ ++#endif ++#ifndef _PATH_DEVPTMX ++#define _PATH_DEVPTMX "/dev/ptmx" /* pseudo-terminal master */ + #endif + + + #define DEF_PROTO "cslip" + + +-const char *Release = RELEASE, +- *Version = "@(#) slattach 1.21 (1999-11-21)", +- *Signature = "net-tools, Fred N. van Kempen et al."; ++static char *Release = RELEASE, *Signature = "Fred N. van Kempen et al."; + + + struct { + const char *speed; + int code; + } tty_speeds[] = { /* table of usable baud rates */ +- { "50", B50 }, { "75", B75 }, ++ { "50", B50 }, { "75", B75 }, + { "110", B110 }, { "300", B300 }, + { "600", B600 }, { "1200", B1200 }, + { "2400", B2400 }, { "4800", B4800 }, +@@ -108,6 +109,7 @@ struct termios tty_saved, /* saved TTY device state */ + int tty_sdisc, /* saved TTY line discipline */ + tty_ldisc, /* current TTY line discipline */ + tty_fd = -1; /* TTY file descriptor */ ++char * path_pts = NULL; /* slave pseudo-terminal device */ + int opt_c = 0; /* "command" to run at exit */ + int opt_e = 0; /* "activate only" flag */ + int opt_h = 0; /* "hangup" on carrier loss */ +@@ -115,7 +117,7 @@ int opt_h = 0; /* "hangup" on carrier loss */ + int opt_k = 0; /* "keepalive" value */ + #endif + int opt_l = 0; /* "lock it" flag */ +-int opt_L = 0; /* clocal flag */ ++int opt_L = 0; /* 3-wire mode flag */ + int opt_m = 0; /* "set RAW mode" flag */ + int opt_n = 0; /* "set No Mesg" flag */ + #ifdef SIOCSOUTFILL +@@ -149,7 +151,7 @@ tty_already_locked(char *nam) + /* that lock. */ + i = fscanf(fd, "%d", &pid); + (void) fclose(fd); +- ++ + if (i != 1) /* Lock file format's wrong! Kill't */ + return(0); + +@@ -195,15 +197,18 @@ tty_lock(char *path, int mode) + return(-1); + } + +- (void) close(fd); +- + /* Make sure UUCP owns the lockfile. Required by some packages. */ + if ((pw = getpwnam(_UID_UUCP)) == NULL) { + if (opt_q == 0) fprintf(stderr, _("slattach: tty_lock: UUCP user %s unknown!\n"), + _UID_UUCP); ++ (void) close(fd); + return(0); /* keep the lock anyway */ + } +- (void) chown(saved_path, pw->pw_uid, pw->pw_gid); ++ if (fchown(fd, pw->pw_uid, pw->pw_gid)) ++ /* keep the lock anyway */; ++ ++ (void) close(fd); ++ + saved_lock = 1; + } else { /* unlock */ + if (saved_lock != 1) return(0); +@@ -294,7 +299,7 @@ tty_set_parity(struct termios *tty, char *parity) + switch(toupper(*parity)) { + case 'N': + tty->c_cflag &= ~(PARENB | PARODD); +- break; ++ break; + + case 'O': + tty->c_cflag &= ~(PARENB | PARODD); +@@ -342,9 +347,11 @@ tty_set_raw(struct termios *tty) + tty->c_oflag = (0); /* output flags */ + tty->c_lflag = (0); /* local flags */ + speed = (tty->c_cflag & CBAUD); /* save current speed */ +- tty->c_cflag = (CRTSCTS | HUPCL | CREAD); /* UART flags */ +- if (opt_L) ++ tty->c_cflag = (HUPCL | CREAD); /* UART flags */ ++ if (opt_L) + tty->c_cflag |= CLOCAL; ++ else ++ tty->c_cflag |= CRTSCTS; + tty->c_cflag |= speed; /* restore speed */ + return(0); + } +@@ -410,7 +417,7 @@ static int + tty_get_name(char *name) + { + if (ioctl(tty_fd, SIOCGIFNAME, name) < 0) { +- if (opt_q == 0) ++ if (opt_q == 0) + perror("tty_get_name"); + return(-errno); + } +@@ -464,7 +471,7 @@ tty_open(char *name, const char *speed) + if (name != NULL) { + if (name[0] != '/') { + if (strlen(name + 6) > sizeof(pathbuf)) { +- if (opt_q == 0) fprintf(stderr, ++ if (opt_q == 0) fprintf(stderr, + _("slattach: tty name too long\n")); + return (-1); + } +@@ -488,7 +495,28 @@ tty_open(char *name, const char *speed) + return(-errno); + } + tty_fd = fd; +- if (opt_d) printf("slattach: tty_open: %s (fd=%d) ", path_open, fd); ++ if (opt_d) printf("slattach: tty_open: %s (fd=%d)\n", path_open, fd); ++ if (!strcmp(path_open, _PATH_DEVPTMX)) { ++ if (opt_d) printf("slattach: tty_open: trying to grantpt and unlockpt\n"); ++ if (grantpt(fd) < 0) { ++ if (opt_q == 0) fprintf(stderr, ++ "slattach: tty_open: grantpt: %s\n", strerror(errno)); ++ return(-errno); ++ } ++ if (unlockpt(fd) < 0) { ++ if (opt_q == 0) fprintf(stderr, ++ "slattach: tty_open: unlockpt: %s\n", strerror(errno)); ++ return(-errno); ++ } ++ path_pts = ptsname(fd); ++ if (path_pts == NULL) { ++ if (opt_q == 0) fprintf(stderr, ++ "slattach: tty_open: ptsname: %s\n", strerror(errno)); ++ return(-errno); ++ } ++ if (opt_d) printf("slattach: tty_open: %s: slave pseudo-terminal is %s\n", ++ path_open, path_pts); ++ } + } else { + tty_fd = 0; + } +@@ -504,7 +532,7 @@ tty_open(char *name, const char *speed) + if (tty_get_disc(&tty_sdisc) < 0) { + if (opt_q == 0) fprintf(stderr, _("slattach: tty_open: cannot get current line disc!\n")); + return(-errno); +- } ++ } + tty_ldisc = tty_sdisc; + + /* Put this terminal line in a 8-bit transparent mode. */ +@@ -565,15 +593,15 @@ usage(void) + "[-c cmd] [-s speed] [-p protocol] tty | -\n" + " slattach -V | --version\n"; + +- fprintf(stderr, usage_msg); +- exit(1); ++ fputs(usage_msg, stderr); ++ exit(E_USAGE); + } + + +-static void ++static void + version(void) + { +- printf("%s\n%s\n%s\n", Release, Version, Signature); ++ printf("%s\n%s\n", Release, Signature); + exit(E_VERSION); + } + +@@ -581,7 +609,7 @@ version(void) + int + main(int argc, char *argv[]) + { +- char path_buf[128]; ++ char path_buf[128] = ""; + char *path_dev; + char buff[128]; + const char *speed = NULL; +@@ -593,7 +621,6 @@ main(int argc, char *argv[]) + { NULL, 0, NULL, 0 } + }; + +- strcpy(path_buf, ""); + path_dev = path_buf; + + /* Scan command line for any arguments. */ +@@ -667,7 +694,7 @@ main(int argc, char *argv[]) + usage(); + /*NOTREACHED*/ + } +- ++ + if (setvbuf(stdout,0,_IOLBF,0)) { + if (opt_q == 0) fprintf(stderr, _("slattach: setvbuf(stdout,0,_IOLBF,0) : %s\n"), + strerror(errno)); +@@ -703,6 +730,7 @@ main(int argc, char *argv[]) + if (tty_get_name(buff)) { return(3); } + printf(_("%s started"), proto); + if (path_dev != NULL) printf(_(" on %s"), path_dev); ++ if (path_pts != NULL) printf(_(" ptsname %s"), path_pts); + printf(_(" interface %s\n"), buff); + } + +@@ -738,7 +766,7 @@ main(int argc, char *argv[]) + + tty_close(); + if(extcmd) /* external command on exit */ +- system(extcmd); ++ exit(system(extcmd)); + } + exit(0); + } +diff --git a/statistics.c b/statistics.c +index a878df8..fe8ee4e 100644 +--- a/statistics.c ++++ b/statistics.c +@@ -1,9 +1,9 @@ + /* +- * Copyright 1997,1999,2000 Andi Kleen. Subject to the GPL. +- * $Id: statistics.c,v 1.14 2001/02/02 18:01:23 pb Exp $ +- * 19980630 - i18n - Arnaldo Carvalho de Melo <acme@conectiva.com.br> +- * 19981113 - i18n fixes - Arnaldo Carvalho de Melo <acme@conectiva.com.br> +- * 19990101 - added net/netstat, -t, -u, -w supprt - Bernd Eckenfels ++ * Copyright 1997,1999,2000 Andi Kleen. Subject to the GPL. ++ * $Id: statistics.c,v 1.23 2010-10-29 19:24:36 ecki Exp $ ++ * 19980630 - i18n - Arnaldo Carvalho de Melo <acme@conectiva.com.br> ++ * 19981113 - i18n fixes - Arnaldo Carvalho de Melo <acme@conectiva.com.br> ++ * 19990101 - added net/netstat, -t, -u, -w supprt - Bernd Eckenfels + */ + #include <ctype.h> + #include <stdio.h> +@@ -11,6 +11,7 @@ + #include <string.h> + #include "config.h" + #include "intl.h" ++#include "proc.h" + + /* #define WARN 1 */ + +@@ -35,26 +36,26 @@ struct entry { + enum State type; + }; + +-struct statedesc { ++struct statedesc { + int indent; +- char *title; +-}; ++ char *title; ++}; + +-struct statedesc states[] = { ++struct statedesc states[] = { + [number] = { 4, NULL }, +- [opt_number] = { 4, NULL }, ++ [opt_number] = { 4, NULL }, + [i_forward] = { 4, NULL }, + [i_inp_icmp] = { 8, N_("ICMP input histogram:") }, + [i_outp_icmp] = { 8, N_("ICMP output histogram:") }, + [MaxState] = {0}, +-}; ++}; + + static enum State state; + + #define I_STATIC (1<<16) /* static configuration option. */ + #define I_TITLE (1<<17) + +-/* ++/* + * XXX check against the snmp mib rfc. + * + * Don't mark the first field as translatable! It's a snmp MIB standard. +@@ -63,54 +64,115 @@ static enum State state; + struct entry Iptab[] = + { + {"Forwarding", N_("Forwarding is %s"), i_forward | I_STATIC}, +- {"DefaultTTL", N_("Default TTL is %u"), number | I_STATIC}, +- {"InReceives", N_("%u total packets received"), number}, +- {"InHdrErrors", N_("%u with invalid headers"), opt_number}, +- {"InAddrErrors", N_("%u with invalid addresses"), opt_number}, +- {"ForwDatagrams", N_("%u forwarded"), number}, +- {"InUnknownProtos", N_("%u with unknown protocol"), opt_number}, +- {"InDiscards", N_("%u incoming packets discarded"), number}, +- {"InDelivers", N_("%u incoming packets delivered"), number}, +- {"OutRequests", N_("%u requests sent out"), number}, /*? */ +- {"OutDiscards", N_("%u outgoing packets dropped"), opt_number}, +- {"OutNoRoutes", N_("%u dropped because of missing route"), opt_number}, +- {"ReasmTimeout", N_("%u fragments dropped after timeout"), opt_number}, +- {"ReasmReqds", N_("%u reassemblies required"), opt_number}, /* ? */ +- {"ReasmOKs", N_("%u packets reassembled ok"), opt_number}, +- {"ReasmFails", N_("%u packet reassembles failed"), opt_number}, +- {"FragOKs", N_("%u fragments received ok"), opt_number}, +- {"FragFails", N_("%u fragments failed"), opt_number}, +- {"FragCreates", N_("%u fragments created"), opt_number} ++ {"DefaultTTL", N_("Default TTL is %llu"), number | I_STATIC}, ++ {"InReceives", N_("%llu total packets received"), number}, ++ {"InHdrErrors", N_("%llu with invalid headers"), opt_number}, ++ {"InAddrErrors", N_("%llu with invalid addresses"), opt_number}, ++ {"ForwDatagrams", N_("%llu forwarded"), number}, ++ {"InUnknownProtos", N_("%llu with unknown protocol"), opt_number}, ++ {"InDiscards", N_("%llu incoming packets discarded"), number}, ++ {"InDelivers", N_("%llu incoming packets delivered"), number}, ++ {"OutRequests", N_("%llu requests sent out"), number}, /*? */ ++ {"OutDiscards", N_("%llu outgoing packets dropped"), opt_number}, ++ {"OutNoRoutes", N_("%llu dropped because of missing route"), opt_number}, ++ {"ReasmTimeout", N_("%llu fragments dropped after timeout"), opt_number}, ++ {"ReasmReqds", N_("%llu reassemblies required"), opt_number}, /* ? */ ++ {"ReasmOKs", N_("%llu packets reassembled ok"), opt_number}, ++ {"ReasmFails", N_("%llu packet reassembles failed"), opt_number}, ++ {"FragOKs", N_("%llu fragments received ok"), opt_number}, ++ {"FragFails", N_("%llu fragments failed"), opt_number}, ++ {"FragCreates", N_("%llu fragments created"), opt_number} ++}; ++ ++struct entry Ip6tab[] = ++{ ++ {"Ip6InReceives", N_("%llu total packets received"), number}, ++ {"Ip6InHdrErrors", N_("%llu with invalid headers"), opt_number}, ++ {"Ip6InTooBigErrors", N_("%llu with packets too big"), opt_number}, ++ {"Ip6InNoRoutes", N_("%llu incoming packets with no route"), opt_number}, ++ {"Ip6InAddrErrors", N_("%llu with invalid addresses"), opt_number}, ++ {"Ip6InUnknownProtos", N_("%llu with unknown protocol"), opt_number}, ++ {"Ip6InTruncatedPkts", N_("%llu with truncated packets"), opt_number}, ++ {"Ip6InDiscards", N_("%llu incoming packets discarded"), number}, ++ {"Ip6InDelivers", N_("%llu incoming packets delivered"), number}, ++ {"Ip6OutForwDatagrams", N_("%llu forwarded"), number}, ++ {"Ip6OutRequests", N_("%llu requests sent out"), number}, /*? */ ++ {"Ip6OutDiscards", N_("%llu outgoing packets dropped"), opt_number}, ++ {"Ip6OutNoRoutes", N_("%llu dropped because of missing route"), opt_number}, ++ {"Ip6ReasmTimeout", N_("%llu fragments dropped after timeout"), opt_number}, ++ {"Ip6ReasmReqds", N_("%llu reassemblies required"), opt_number}, /* ? */ ++ {"Ip6ReasmOKs", N_("%llu packets reassembled ok"), opt_number}, ++ {"Ip6ReasmFails", N_("%llu packet reassembles failed"), opt_number}, ++ {"Ip6FragOKs", N_("%llu fragments received ok"), opt_number}, ++ {"Ip6FragFails", N_("%llu fragments failed"), opt_number}, ++ {"Ip6FragCreates", N_("%llu fragments created"), opt_number}, ++ {"Ip6InMcastPkts", N_("%llu incoming multicast packets"), opt_number}, ++ {"Ip6OutMcastPkts", N_("%llu outgoing multicast packets"), opt_number} + }; + + struct entry Icmptab[] = + { +- {"InMsgs", N_("%u ICMP messages received"), number}, +- {"InErrors", N_("%u input ICMP message failed."), number}, +- {"InDestUnreachs", N_("destination unreachable: %u"), i_inp_icmp | I_TITLE}, +- {"InTimeExcds", N_("timeout in transit: %u"), i_inp_icmp | I_TITLE}, +- {"InParmProbs", N_("wrong parameters: %u"), i_inp_icmp | I_TITLE}, /*? */ +- {"InSrcQuenchs", N_("source quenches: %u"), i_inp_icmp | I_TITLE}, +- {"InRedirects", N_("redirects: %u"), i_inp_icmp | I_TITLE}, +- {"InEchos", N_("echo requests: %u"), i_inp_icmp | I_TITLE}, +- {"InEchoReps", N_("echo replies: %u"), i_inp_icmp | I_TITLE}, +- {"InTimestamps", N_("timestamp request: %u"), i_inp_icmp | I_TITLE}, +- {"InTimestampReps", N_("timestamp reply: %u"), i_inp_icmp | I_TITLE}, +- {"InAddrMasks", N_("address mask request: %u"), i_inp_icmp | I_TITLE}, /*? */ +- {"InAddrMaskReps", N_("address mask replies: %u"), i_inp_icmp | I_TITLE}, /*? */ +- {"OutMsgs", N_("%u ICMP messages sent"), number}, +- {"OutErrors", N_("%u ICMP messages failed"), number}, +- {"OutDestUnreachs", N_("destination unreachable: %u"), i_outp_icmp | I_TITLE}, +- {"OutTimeExcds", N_("time exceeded: %u"), i_outp_icmp | I_TITLE}, +- {"OutParmProbs", N_("wrong parameters: %u"), i_outp_icmp | I_TITLE}, /*? */ +- {"OutSrcQuenchs", N_("source quench: %u"), i_outp_icmp | I_TITLE}, +- {"OutRedirects", N_("redirect: %u"), i_outp_icmp | I_TITLE}, +- {"OutEchos", N_("echo request: %u"), i_outp_icmp | I_TITLE}, +- {"OutEchoReps", N_("echo replies: %u"), i_outp_icmp | I_TITLE}, +- {"OutTimestamps", N_("timestamp requests: %u"), i_outp_icmp | I_TITLE}, +- {"OutTimestampReps", N_("timestamp replies: %u"), i_outp_icmp | I_TITLE}, +- {"OutAddrMasks", N_("address mask requests: %u"), i_outp_icmp | I_TITLE}, +- {"OutAddrMaskReps", N_("address mask replies: %u"), i_outp_icmp | I_TITLE}, ++ {"InMsgs", N_("%llu ICMP messages received"), number}, ++ {"InErrors", N_("%llu input ICMP message failed."), number}, ++ {"InDestUnreachs", N_("destination unreachable: %llu"), i_inp_icmp | I_TITLE}, ++ {"InTimeExcds", N_("timeout in transit: %llu"), i_inp_icmp | I_TITLE}, ++ {"InParmProbs", N_("wrong parameters: %llu"), i_inp_icmp | I_TITLE}, /*? */ ++ {"InSrcQuenchs", N_("source quenches: %llu"), i_inp_icmp | I_TITLE}, ++ {"InRedirects", N_("redirects: %llu"), i_inp_icmp | I_TITLE}, ++ {"InEchos", N_("echo requests: %llu"), i_inp_icmp | I_TITLE}, ++ {"InEchoReps", N_("echo replies: %llu"), i_inp_icmp | I_TITLE}, ++ {"InTimestamps", N_("timestamp request: %llu"), i_inp_icmp | I_TITLE}, ++ {"InTimestampReps", N_("timestamp reply: %llu"), i_inp_icmp | I_TITLE}, ++ {"InAddrMasks", N_("address mask request: %llu"), i_inp_icmp | I_TITLE}, /*? */ ++ {"InAddrMaskReps", N_("address mask replies: %llu"), i_inp_icmp | I_TITLE}, /*? */ ++ {"OutMsgs", N_("%llu ICMP messages sent"), number}, ++ {"OutErrors", N_("%llu ICMP messages failed"), number}, ++ {"OutDestUnreachs", N_("destination unreachable: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutTimeExcds", N_("time exceeded: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutParmProbs", N_("wrong parameters: %llu"), i_outp_icmp | I_TITLE}, /*? */ ++ {"OutSrcQuenchs", N_("source quench: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutRedirects", N_("redirect: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutEchos", N_("echo request: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutEchoReps", N_("echo replies: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutTimestamps", N_("timestamp requests: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutTimestampReps", N_("timestamp replies: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutAddrMasks", N_("address mask requests: %llu"), i_outp_icmp | I_TITLE}, ++ {"OutAddrMaskReps", N_("address mask replies: %llu"), i_outp_icmp | I_TITLE}, ++}; ++ ++struct entry Icmp6tab[] = ++{ ++ {"Icmp6InMsgs", N_("%llu ICMP messages received"), number}, ++ {"Icmp6InErrors", N_("%llu input ICMP message failed."), number}, ++ {"Icmp6InDestUnreachs", N_("destination unreachable: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InPktTooBigs", N_("packets too big: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InTimeExcds", N_("received ICMPv6 time exceeded: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InParmProblems", N_("parameter problem: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InEchos", N_("echo requests: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InEchoReplies", N_("echo replies: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InGroupMembQueries", N_("group member queries: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InGroupMembResponses", N_("group member responses: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InGroupMembReductions", N_("group member reductions: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InRouterSolicits", N_("router solicits: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InRouterAdvertisements", N_("router advertisement: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InNeighborSolicits", N_("neighbour solicits: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InNeighborAdvertisements", N_("neighbour advertisement: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6InRedirects", N_("redirects: %llu"), i_inp_icmp | I_TITLE}, ++ {"Icmp6OutMsgs", N_("%llu ICMP messages sent"), number}, ++ {"Icmp6OutDestUnreachs", N_("destination unreachable: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutPktTooBigs", N_("packets too big: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutTimeExcds", N_("sent ICMPv6 time exceeded: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutParmProblems", N_("parameter problem: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutEchos", N_("echo requests: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutEchoReplies", N_("echo replies: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutGroupMembQueries", N_("group member queries: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutGroupMembResponses", N_("group member responses: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutGroupMembReductions", N_("group member reductions: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutRouterSolicits", N_("router solicits: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutRouterAdvertisements ", N_("router advertisement: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutNeighborSolicits", N_("neighbor solicits: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutNeighborAdvertisements", N_("neighbor advertisements: %llu"), i_outp_icmp | I_TITLE}, ++ {"Icmp6OutRedirects", N_("redirects: %llu"), i_outp_icmp | I_TITLE}, + }; + + struct entry Tcptab[] = +@@ -119,79 +181,129 @@ struct entry Tcptab[] = + {"RtoMin", "", number}, + {"RtoMax", "", number}, + {"MaxConn", "", number}, +- {"ActiveOpens", N_("%u active connections openings"), number}, +- {"PassiveOpens", N_("%u passive connection openings"), number}, +- {"AttemptFails", N_("%u failed connection attempts"), number}, +- {"EstabResets", N_("%u connection resets received"), number}, +- {"CurrEstab", N_("%u connections established"), number}, +- {"InSegs", N_("%u segments received"), number}, +- {"OutSegs", N_("%u segments send out"), number}, +- {"RetransSegs", N_("%u segments retransmited"), number}, +- {"InErrs", N_("%u bad segments received."), number}, +- {"OutRsts", N_("%u resets sent"), number}, ++ {"ActiveOpens", N_("%llu active connections openings"), number}, ++ {"PassiveOpens", N_("%llu passive connection openings"), number}, ++ {"AttemptFails", N_("%llu failed connection attempts"), number}, ++ {"EstabResets", N_("%llu connection resets received"), number}, ++ {"CurrEstab", N_("%llu connections established"), number}, ++ {"InSegs", N_("%llu segments received"), number}, ++ {"OutSegs", N_("%llu segments send out"), number}, ++ {"RetransSegs", N_("%llu segments retransmited"), number}, ++ {"InErrs", N_("%llu bad segments received."), number}, ++ {"OutRsts", N_("%llu resets sent"), number}, + }; + + struct entry Udptab[] = + { +- {"InDatagrams", N_("%u packets received"), number}, +- {"NoPorts", N_("%u packets to unknown port received."), number}, +- {"InErrors", N_("%u packet receive errors"), number}, +- {"OutDatagrams", N_("%u packets sent"), number}, ++ {"InDatagrams", N_("%llu packets received"), number}, ++ {"NoPorts", N_("%llu packets to unknown port received."), number}, ++ {"InErrors", N_("%llu packet receive errors"), number}, ++ {"OutDatagrams", N_("%llu packets sent"), number}, ++ {"RcvbufErrors", N_("%llu receive buffer errors"), number}, ++ {"SndbufErrors", N_("%llu send buffer errors"), number}, ++ }; ++ ++struct entry Udp6tab[] = ++{ ++ {"Udp6InDatagrams", N_("%llu packets received"), number}, ++ {"Udp6NoPorts", N_("%llu packets to unknown port received."), number}, ++ {"Udp6InErrors", N_("%llu packet receive errors"), number}, ++ {"Udp6OutDatagrams", N_("%llu packets sent"), number}, + }; + + struct entry Tcpexttab[] = + { +- {"SyncookiesSent", N_("%u SYN cookies sent"), opt_number}, +- {"SyncookiesRecv", N_("%u SYN cookies received"), opt_number}, +- {"SyncookiesFailed", N_("%u invalid SYN cookies received"), opt_number}, +- +- { "EmbryonicRsts", N_("%u resets received for embryonic SYN_RECV sockets"), +- opt_number }, +- { "PruneCalled", N_("%u packets pruned from receive queue because of socket" +- " buffer overrun"), opt_number }, ++ {"SyncookiesSent", N_("%llu SYN cookies sent"), opt_number}, ++ {"SyncookiesRecv", N_("%llu SYN cookies received"), opt_number}, ++ {"SyncookiesFailed", N_("%llu invalid SYN cookies received"), opt_number}, ++ ++ { "EmbryonicRsts", N_("%llu resets received for embryonic SYN_RECV sockets"), ++ opt_number }, ++ { "PruneCalled", N_("%llu packets pruned from receive queue because of socket" ++ " buffer overrun"), opt_number }, + /* obsolete: 2.2.0 doesn't do that anymore */ +- { "RcvPruned", N_("%u packets pruned from receive queue"), opt_number }, +- { "OfoPruned", N_("%u packets dropped from out-of-order queue because of" +- " socket buffer overrun"), opt_number }, +- { "OutOfWindowIcmps", N_("%u ICMP packets dropped because they were " +- "out-of-window"), opt_number }, +- { "LockDroppedIcmps", N_("%u ICMP packets dropped because" ++ { "RcvPruned", N_("%llu packets pruned from receive queue"), opt_number }, ++ { "OfoPruned", N_("%llu packets dropped from out-of-order queue because of" ++ " socket buffer overrun"), opt_number }, ++ { "OutOfWindowIcmps", N_("%llu ICMP packets dropped because they were " ++ "out-of-window"), opt_number }, ++ { "LockDroppedIcmps", N_("%llu ICMP packets dropped because" + " socket was locked"), opt_number }, +- { "TW", N_("%u TCP sockets finished time wait in fast timer"), opt_number }, +- { "TWRecycled", N_("%u time wait sockets recycled by time stamp"), opt_number }, +- { "TWKilled", N_("%u TCP sockets finished time wait in slow timer"), opt_number }, +- { "PAWSPassive", N_("%u passive connections rejected because of" ++ { "TW", N_("%llu TCP sockets finished time wait in fast timer"), opt_number }, ++ { "TWRecycled", N_("%llu time wait sockets recycled by time stamp"), opt_number }, ++ { "TWKilled", N_("%llu TCP sockets finished time wait in slow timer"), opt_number }, ++ { "PAWSPassive", N_("%llu passive connections rejected because of" + " time stamp"), opt_number }, +- { "PAWSActive", N_("%u active connections rejected because of " ++ { "PAWSActive", N_("%llu active connections rejected because of " + "time stamp"), opt_number }, +- { "PAWSEstab", N_("%u packets rejects in established connections because of" ++ { "PAWSEstab", N_("%llu packets rejects in established connections because of" + " timestamp"), opt_number }, +- { "DelayedACKs", N_("%u delayed acks sent"), opt_number }, +- { "DelayedACKLocked", N_("%u delayed acks further delayed because of" ++ { "DelayedACKs", N_("%llu delayed acks sent"), opt_number }, ++ { "DelayedACKLocked", N_("%llu delayed acks further delayed because of" + " locked socket"), opt_number }, +- { "DelayedACKLost", N_("Quick ack mode was activated %u times"), opt_number }, +- { "ListenOverflows", N_("%u times the listen queue of a socket overflowed"), ++ { "DelayedACKLost", N_("Quick ack mode was activated %llu times"), opt_number }, ++ { "ListenOverflows", N_("%llu times the listen queue of a socket overflowed"), + opt_number }, +- { "ListenDrops", N_("%u SYNs to LISTEN sockets ignored"), opt_number }, +- { "TCPPrequeued", N_("%u packets directly queued to recvmsg prequeue."), ++ { "ListenDrops", N_("%llu SYNs to LISTEN sockets dropped"), opt_number }, ++ { "TCPPrequeued", N_("%llu packets directly queued to recvmsg prequeue."), + opt_number }, +- { "TCPDirectCopyFromBacklog", N_("%u packets directly received" +- " from backlog"), opt_number }, +- { "TCPDirectCopyFromPrequeue", N_("%u packets directly received" +- " from prequeue"), opt_number }, +- { "TCPPrequeueDropped", N_("%u packets dropped from prequeue"), opt_number }, +- { "TCPHPHits", N_("%u packets header predicted"), number }, +- { "TCPHPHitsToUser", N_("%u packets header predicted and " ++ { "TCPDirectCopyFromBacklog", N_("%llu bytes directly in process context from backlog"), opt_number }, ++ { "TCPDirectCopyFromPrequeue", N_("%llu bytes directly received in process context from prequeue"), ++ opt_number }, ++ { "TCPPrequeueDropped", N_("%llu packets dropped from prequeue"), opt_number }, ++ { "TCPHPHits", N_("%llu packet headers predicted"), number }, ++ { "TCPHPHitsToUser", N_("%llu packets header predicted and " + "directly queued to user"), opt_number }, +- { "SockMallocOOM", N_("Ran %u times out of system memory during " +- "packet sending"), opt_number }, ++ { "SockMallocOOM", N_("Ran %llu times out of system memory during " ++ "packet sending"), opt_number }, ++ { "TCPPureAcks", N_("%llu acknowledgments not containing data payload received"), opt_number }, ++ { "TCPHPAcks", N_("%llu predicted acknowledgments"), opt_number }, ++ { "TCPRenoRecovery", N_("%llu times recovered from packet loss due to fast retransmit"), opt_number }, ++ { "TCPSackRecovery", N_("%llu times recovered from packet loss by selective acknowledgements"), opt_number }, ++ { "TCPSACKReneging", N_("%llu bad SACK blocks received"), opt_number }, ++ { "TCPFACKReorder", N_("Detected reordering %llu times using FACK"), opt_number }, ++ { "TCPSACKReorder", N_("Detected reordering %llu times using SACK"), opt_number }, ++ { "TCPTSReorder", N_("Detected reordering %llu times using time stamp"), opt_number }, ++ { "TCPRenoReorder", N_("Detected reordering %llu times using reno fast retransmit"), opt_number }, ++ { "TCPFullUndo", N_("%llu congestion windows fully recovered without slow start"), opt_number }, ++ { "TCPPartialUndo", N_("%llu congestion windows partially recovered using Hoe heuristic"), opt_number }, ++ { "TCPDSackUndo", N_("%llu congestion window recovered without slow start using DSACK"), opt_number }, ++ { "TCPLossUndo", N_("%llu congestion windows recovered without slow start after partial ack"), opt_number }, ++ { "TCPLostRetransmits", N_("%llu retransmits lost"), opt_number }, ++ { "TCPRenoFailures", N_("%llu timeouts after reno fast retransmit"), opt_number }, ++ { "TCPSackFailures", N_("%llu timeouts after SACK recovery"), opt_number }, ++ { "TCPLossFailures", N_("%llu timeouts in loss state"), opt_number }, ++ { "TCPFastRetrans", N_("%llu fast retransmits"), opt_number }, ++ { "TCPForwardRetrans", N_("%llu forward retransmits"), opt_number }, ++ { "TCPSlowStartRetrans", N_("%llu retransmits in slow start"), opt_number }, ++ { "TCPTimeouts", N_("%llu other TCP timeouts"), opt_number }, ++ { "TCPRenoRecoveryFailed", N_("%llu reno fast retransmits failed"), opt_number }, ++ { "TCPSackRecoveryFail", N_("%llu SACK retransmits failed"), opt_number }, ++ { "TCPSchedulerFailed", N_("%llu times receiver scheduled too late for direct processing"), opt_number }, ++ { "TCPRcvCollapsed", N_("%llu packets collapsed in receive queue due to low socket buffer"), opt_number }, ++ { "TCPDSACKOldSent", N_("%llu DSACKs sent for old packets"), opt_number }, ++ { "TCPDSACKOfoSent", N_("%llu DSACKs sent for out of order packets"), opt_number }, ++ { "TCPDSACKRecv", N_("%llu DSACKs received"), opt_number }, ++ { "TCPDSACKOfoRecv", N_("%llu DSACKs for out of order packets received"), opt_number }, ++ { "TCPAbortOnSyn", N_("%llu connections reset due to unexpected SYN"), opt_number }, ++ { "TCPAbortOnData", N_("%llu connections reset due to unexpected data"), opt_number }, ++ { "TCPAbortOnClose", N_("%llu connections reset due to early user close"), opt_number }, ++ { "TCPAbortOnMemory", N_("%llu connections aborted due to memory pressure"), opt_number }, ++ { "TCPAbortOnTimeout", N_("%llu connections aborted due to timeout"), opt_number }, ++ { "TCPAbortOnLinger", N_("%llu connections aborted after user close in linger timeout"), opt_number }, ++ { "TCPAbortFailed", N_("%llu times unable to send RST due to no memory"), opt_number }, ++ { "TCPMemoryPressures", N_("TCP ran low on memory %llu times"), opt_number }, ++ { "TCPLoss", N_("%llu TCP data loss events"), opt_number }, ++ { "TCPDSACKUndo", N_("%llu congestion windows recovered without slow start by DSACK"), ++ opt_number }, ++ { "TCPRenoRecoveryFail", N_("%llu classic Reno fast retransmits failed"), opt_number }, + }; + + struct tabtab { + char *title; + struct entry *tab; + size_t size; +- int *flag; ++ int *flag; + }; + + struct tabtab snmptabs[] = +@@ -204,6 +316,15 @@ struct tabtab snmptabs[] = + {NULL} + }; + ++struct tabtab snmp6tabs[] = ++{ ++ {"Ip6", Ip6tab, sizeof(Ip6tab), &f_raw}, ++ {"Icmp6", Icmp6tab, sizeof(Icmp6tab), &f_raw}, ++ {"Udp6", Udp6tab, sizeof(Udp6tab), &f_udp}, ++ {"Tcp6", Tcptab, sizeof(Tcptab), &f_tcp}, ++ {NULL} ++}; ++ + /* XXX IGMP */ + + int cmpentries(const void *a, const void *b) +@@ -211,18 +332,19 @@ int cmpentries(const void *a, const void *b) + return strcmp(((struct entry *) a)->title, ((struct entry *) b)->title); + } + +-void printval(struct tabtab *tab, char *title, int val) ++void printval(struct tabtab *tab, char *title, unsigned long long val) + { + struct entry *ent = NULL, key; + int type; + char buf[512]; + + key.title = title; +- if (tab->tab) ++ if (tab->tab) + ent = bsearch(&key, tab->tab, tab->size / sizeof(struct entry), + sizeof(struct entry), cmpentries); + if (!ent) { /* try our best */ +- printf("%*s%s: %d\n", states[state].indent, "", title, val); ++ if (val) ++ printf("%*s%s: %llu\n", states[state].indent, "", title, val); + return; + } + type = ent->type; +@@ -242,7 +364,7 @@ void printval(struct tabtab *tab, char *title, int val) + buf[0] = '\0'; + switch (type) { + case opt_number: +- if (val == 0) ++ if (val == 0) + break; + /*FALL THOUGH*/ + case number: +@@ -272,7 +394,7 @@ struct tabtab *newtable(struct tabtab *tabs, char *title) + { + struct tabtab *t; + static struct tabtab dummytab; +- ++ + for (t = tabs; t->title; t++) { + if (!strcmp(title, t->title)) { + if (*(t->flag)) +@@ -281,22 +403,25 @@ struct tabtab *newtable(struct tabtab *tabs, char *title) + return t; + } + } +- if (!f_unknown) +- return NULL; ++ if (!f_unknown) ++ return NULL; + printf("%s:\n", _(title)); + dummytab.title = title; +- dummytab.flag = &f_unknown; ++ dummytab.flag = &f_unknown; + return &dummytab; + } + +-void process_fd(FILE *f) ++int process_fd(FILE *f, int all, char *filter) + { +- char buf1[1024], buf2[1024]; ++ char buf1[2048], buf2[2048]; + char *sp, *np, *p; + while (fgets(buf1, sizeof buf1, f)) { + int endflag; + struct tabtab *tab; + ++ if (buf1[0] == '\n') // skip empty first line in 2.6 kernels ++ continue; ++ + if (!fgets(buf2, sizeof buf2, f)) + break; + sp = strchr(buf1, ':'); +@@ -305,6 +430,10 @@ void process_fd(FILE *f) + goto formaterr; + *sp = '\0'; + ++ if (!all) ++ if (strncmp(buf1, filter, strlen(filter))) ++ continue; ++ + tab = newtable(snmptabs, buf1); + if (tab == NULL) { + printf("unknown %s\n", buf1); +@@ -315,8 +444,8 @@ void process_fd(FILE *f) + + endflag = 0; + while (!endflag) { +- sp += strspn(sp, " \t\n"); +- np += strspn(np, " \t\n"); ++ sp += strspn(sp, " \t\n"); ++ np += strspn(np, " \t\n"); + /*if (*np == '\0') goto formaterr; */ + + p = sp+strcspn(sp, " \t\n"); +@@ -324,51 +453,116 @@ void process_fd(FILE *f) + endflag = 1; + *p = '\0'; + +- if (*sp != '\0' && *(tab->flag)) +- printval(tab, sp, strtoul(np, &np, 10)); ++ if (*sp != '\0' && *(tab->flag)) ++ printval(tab, sp, strtoull(np, &np, 10)); + + sp = p + 1; + } + } +- return; +- ++ return 0; ++ + formaterr: +- perror(_("error parsing /proc/net/snmp")); +- return; ++ return -1; + } + ++void cpytitle(char *original, char *new) ++{ ++ char *ptr = original; ++ while(*ptr != '6' && *ptr != '\0') { ++ *new = *ptr; ++ new++; ++ ptr++; ++ } ++ *new = *ptr; ++ new++; ++ *new = '\0'; ++} ++ ++void process6_fd(FILE *f) ++{ ++ char buf1[1024],buf2[50],buf3[1024]; ++ unsigned long long val; ++ struct tabtab *tab = NULL; ++ int cpflg = 0; ++ ++ while (fgets(buf1, sizeof buf1, f)) { ++ sscanf(buf1, "%s %llu", buf2, &val); ++ if(!cpflg) { ++ cpytitle(buf2, buf3); ++ tab = newtable(snmp6tabs, buf3); ++ cpflg = 1; ++ } ++ if(!strstr(buf2, buf3)) { ++ cpytitle(buf2, buf3); ++ tab = newtable(snmp6tabs, buf3); ++ } ++ if (*(tab->flag)) ++ printval(tab, buf2, val); ++ } ++ ++} + + void parsesnmp(int flag_raw, int flag_tcp, int flag_udp) + { + FILE *f; + + f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; +- +- f = fopen("/proc/net/snmp", "r"); ++ ++ f = proc_fopen("/proc/net/snmp"); + if (!f) { + perror(_("cannot open /proc/net/snmp")); + return; + } +- process_fd(f); ++ ++ if (process_fd(f, 1, NULL) < 0) ++ fprintf(stderr, _("Problem while parsing /proc/net/snmp\n")); + + if (ferror(f)) + perror("/proc/net/snmp"); + + fclose(f); + +- f = fopen("/proc/net/netstat", "r"); ++ f = proc_fopen("/proc/net/netstat"); + + if (f) { +- process_fd(f); ++ if (process_fd(f, 1, NULL) <0) ++ fprintf(stderr, _("Problem while parsing /proc/net/netstat\n")); + + if (ferror(f)) + perror("/proc/net/netstat"); +- ++ + fclose(f); + } + return; + } +- ++ ++void parsesnmp6(int flag_raw, int flag_tcp, int flag_udp) ++{ ++ FILE *f; ++ ++ f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; ++ ++ f = fopen("/proc/net/snmp6", "r"); ++ if (!f) { ++ perror(_("cannot open /proc/net/snmp6")); ++ return; ++ } ++ process6_fd(f); ++ if (ferror(f)) ++ perror("/proc/net/snmp6"); ++ ++ fclose(f); ++ f = fopen("/proc/net/snmp", "r"); ++ if (!f) { ++ perror(_("cannot open /proc/net/snmp")); ++ return; ++ } ++ process_fd(f, 0, "Tcp"); ++ if (ferror(f)) ++ perror("/proc/net/snmp"); ++ ++ fclose(f); ++} + + void inittab(void) + { +@@ -379,3 +573,13 @@ void inittab(void) + qsort(t->tab, t->size / sizeof(struct entry), + sizeof(struct entry), cmpentries); + } ++ ++void inittab6(void) ++{ ++ struct tabtab *t; ++ ++ for (t = snmp6tabs; t->title; t++) ++ qsort(t->tab, t->size / sizeof(struct entry), ++ sizeof(struct entry), cmpentries); ++} ++ diff --git a/repo/util/net-tools/musl-fixes.patch b/repo/util/net-tools/musl-fixes.patch new file mode 100644 index 0000000..4d6170c --- /dev/null +++ b/repo/util/net-tools/musl-fixes.patch @@ -0,0 +1,94 @@ +diff --git a/lib/inet6_gr.c b/lib/inet6_gr.c +index 72b4a66..2361809 100644 +--- a/lib/inet6_gr.c ++++ b/lib/inet6_gr.c +@@ -23,7 +23,7 @@ + #include <string.h> + #include <stdio.h> + #include <unistd.h> +-#ifndef __GLIBC__ ++#ifdef HAVE_IPV6_ROUTE_H + #include <netinet6/ipv6_route.h> /* glibc doesn't have this */ + #endif + #include "version.h" +diff --git a/lib/inet6_sr.c b/lib/inet6_sr.c +index 1ad9510..96dbd5f 100644 +--- a/lib/inet6_sr.c ++++ b/lib/inet6_sr.c +@@ -23,10 +23,10 @@ + #include <string.h> + #include <stdio.h> + #include <unistd.h> +-#ifdef __GLIBC__ +-#include <net/route.h> +-#else ++#ifdef HAVE_IPV6_ROUTE_H + #include <netinet6/ipv6_route.h> /* glibc does not have this */ ++#else ++#include <net/route.h> + #endif + #include "version.h" + #include "net-support.h" +diff --git a/lib/inet_sr.c b/lib/inet_sr.c +index 1a876ae..6a26a76 100644 +--- a/lib/inet_sr.c ++++ b/lib/inet_sr.c +@@ -26,6 +26,7 @@ + #include <string.h> + #include <stdio.h> + #include <unistd.h> ++#include <asm-generic/param.h> + #include "version.h" + #include "net-support.h" + #include "pathnames.h" +diff --git a/lib/util-ank.c b/lib/util-ank.c +index b077f35..4ee59f6 100644 +--- a/lib/util-ank.c ++++ b/lib/util-ank.c +@@ -14,6 +14,7 @@ + * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses + */ + ++#include <limits.h> + #include <stdio.h> + #include <stdlib.h> + #include <unistd.h> +diff --git a/mii-tool.c b/mii-tool.c +index 1cfecc2..fbc3b34 100644 +--- a/mii-tool.c ++++ b/mii-tool.c +@@ -46,10 +46,6 @@ + #include <net/if.h> + #include <linux/sockios.h> + +-#ifndef __GLIBC__ +-#include <linux/if_arp.h> +-#include <linux/if_ether.h> +-#endif + #include <linux/mii.h> + #include <linux/sockios.h> + #include "version.h" +diff --git a/netstat.c b/netstat.c +index d0c364f..8453f18 100644 +--- a/netstat.c ++++ b/netstat.c +@@ -88,6 +88,7 @@ + #include <sys/stat.h> + #include <net/if.h> + #include <dirent.h> ++#include <asm-generic/param.h> + + #include "net-support.h" + #include "pathnames.h" +diff --git a/slattach.c b/slattach.c +index 5c81584..3ccde28 100644 +--- a/slattach.c ++++ b/slattach.c +@@ -44,6 +44,7 @@ + #include <string.h> + #include <unistd.h> + #include <getopt.h> ++#include <termios.h> + #include <linux/if_slip.h> + + #if defined(__GLIBC__) diff --git a/repo/util/net-tools.xibuild b/repo/util/net-tools/net-tools.xibuild index 0b1d792..0b1d792 100644 --- a/repo/util/net-tools.xibuild +++ b/repo/util/net-tools/net-tools.xibuild diff --git a/repo/util/nmap.xibuild b/repo/util/nmap/nmap.xibuild index 3fd85e8..3fd85e8 100644 --- a/repo/util/nmap.xibuild +++ b/repo/util/nmap/nmap.xibuild diff --git a/repo/util/openssh.xibuild b/repo/util/openssh/openssh.xibuild index 869bcb9..869bcb9 100644 --- a/repo/util/openssh.xibuild +++ b/repo/util/openssh/openssh.xibuild diff --git a/repo/util/openssh/sshd.confd b/repo/util/openssh/sshd.confd new file mode 100644 index 0000000..8c44444 --- /dev/null +++ b/repo/util/openssh/sshd.confd @@ -0,0 +1,26 @@ +# Configuration for /etc/init.d/sshd + +# Path of sshd_config file. +#cfgfile="/etc/ssh/sshd_config" + +# Any random options you want to pass to sshd. +# See the sshd(8) manpage for more info. +#command_args="" + +# Space-separated list of SSH host key types to generate if they do +# not already exist. An empty value means generate all of the default +# set of dsa, ecdsa, ed25519, and rsa types. +# +# Example: "ed25519 rsa". +# +#key_types_to_generate="" + +# The number of bits to use for a generated ECDSA SSH host key. +# Defaults to 256 bits if not set. +# +#ecdsa_bit_size="256" + +# Number of bits for use for a generated RSA SSH host key. +# Defaults to 3072 bits if not set. +# +#rsa_bit_size="3072" diff --git a/repo/util/openssh/sshd.initd b/repo/util/openssh/sshd.initd new file mode 100644 index 0000000..477cdbc --- /dev/null +++ b/repo/util/openssh/sshd.initd @@ -0,0 +1,162 @@ +#!/sbin/openrc-run + +description="OpenBSD Secure Shell server" +description_checkconfig="Verify configuration file" +description_reload="Reload configuration" + +extra_commands="checkconfig" +extra_started_commands="reload" + +# NOTE: SSHD_* variables are deprecated and will be removed in future! +: "${sshd_disable_keygen:="${SSHD_DISABLE_KEYGEN:-"no"}"}" +: "${cfgfile:=${SSHD_CONFIG:-"${SSHD_CONFDIR:-"/etc/ssh"}/sshd_config"}}" + +pidfile="${SSHD_PIDFILE:-"/run/$RC_SVCNAME.pid"}" +command="${SSHD_BINARY:-"/usr/sbin/sshd"}" +command_args="${command_args:-${SSHD_OPTS:-}}" + +required_files="$cfgfile" + +generate_host_key_type() { + local bit_size key_type + + key_type=$1 + if [ ! -f /etc/ssh/ssh_host_"${key_type}"_key ]; then + case $key_type in + ecdsa) bit_size="$ecdsa_bit_size";; + rsa) bit_size="$rsa_bit_size";; + esac + einfo "Generating $key_type SSH host key..." + ssh-keygen \ + -q \ + -f /etc/ssh/ssh_host_"$key_type"_key \ + -N '' \ + -t "$key_type" \ + ${bit_size:+ -b ${bit_size}} || return 1 + fi +} + +generate_host_keys() { + local type + + if [ -z "$key_types_to_generate" ] && + [ -z "$ecdsa_bit_size" ] && [ -z "$rsa_bit_size" ]; then + ssh-keygen -A + return + fi + for type in ${key_types_to_generate:-dsa ecdsa ed25519 rsa}; do + generate_host_key_type "$type" || return 1 + done +} + +get_conf() { + awk "/^$1/{ print \$2 }" "$cfgfile" 2>/dev/null +} + +conf_enabled() { + [ "$(get_conf "$1")" = "yes" ] +} + +depend() { + use logger dns + after entropy + + if [ "${rc_need+set}" = "set" ] ; then + : # Do nothing, the user has explicitly set rc_need + else + local x warn_addr + # shellcheck disable=SC2013 + for x in $(get_conf ListenAddress) ; do + case "$x" in + 0.0.0.0|0.0.0.0:*) ;; + ::|\[::\]*) ;; + *) warn_addr="$warn_addr $x" ;; + esac + done + if [ -n "$warn_addr" ] ; then + need net + ewarn "You are binding an interface in ListenAddress statement in your sshd_config!" + ewarn "You must add rc_need=\"net.FOO\" to your /etc/conf.d/sshd" + ewarn "where FOO is the interface(s) providing the following address(es):" + ewarn "$warn_addr" + fi + fi +} + +update_command() { + if conf_enabled KerberosAuthentication || conf_enabled GSSAPIAuthentication && [ -r /usr/sbin/sshd.krb5 ]; then + command="${SSHD_BINARY:-"/usr/sbin/sshd.krb5"}" + elif conf_enabled UsePAM && [ -r /usr/sbin/sshd.pam ]; then + command="${SSHD_BINARY:-"/usr/sbin/sshd.pam"}" + fi +} + +checkconfig() { + update_command + warn_deprecated_var SSHD_BINARY + warn_deprecated_var SSHD_CONFDIR + warn_deprecated_var SSHD_CONFIG cfgfile + warn_deprecated_var SSHD_DISABLE_KEYGEN sshd_disable_keygen + warn_deprecated_var SSHD_OPTS command_args + warn_deprecated_var SSHD_PIDFILE + + if [ ! -d /var/empty ] ; then + mkdir -p /var/empty || return 1 + fi + + if ! yesno "$sshd_disable_keygen"; then + generate_host_keys || return 1 + fi + + [ "$pidfile" != "/run/sshd.pid" ] \ + && command_args="$command_args -o PidFile=$pidfile" + + [ "$cfgfile" != "/etc/ssh/sshd_config" ] \ + && command_args="$command_args -f $cfgfile" + + # shellcheck disable=SC2086 + "$command" -t $command_args || return 1 +} + +start_pre() { + checkconfig +} + +stop_pre() { + update_command + if [ "${RC_CMD}" = "restart" ] ; then + checkconfig || return 1 + fi +} + +stop_post() { + if [ "$RC_RUNLEVEL" = "shutdown" ]; then + _sshd_pids=$(pgrep "${command##*/}") + if [ -n "$_sshd_pids" ]; then + ebegin "Shutting down ssh connections" + # shellcheck disable=SC2086 + kill -TERM $_sshd_pids >/dev/null 2>&1 + eend 0 + fi + fi +} + +reload() { + checkconfig || return 1 + + ebegin "Reloading $RC_SVCNAME" + start-stop-daemon --signal HUP \ + --exec "$command" --pidfile "$pidfile" + eend $? +} + +warn_deprecated_var() { + local varname="$1" + local replacement="${2:-}" + + eval "test -n \"\$$varname\"" || return 0 + + ewarn "Variable \$$varname is deprecated and will be removed in the future!" + # shellcheck disable=SC2015 + [ "$replacement" ] && ewarn "Use \$$replacement instead of \$$varname." ||: +} diff --git a/repo/util/pciutils.xibuild b/repo/util/pciutils/pciutils.xibuild index 8eaa657..8eaa657 100644 --- a/repo/util/pciutils.xibuild +++ b/repo/util/pciutils/pciutils.xibuild diff --git a/repo/util/pm-utils.xibuild b/repo/util/pm-utils/pm-utils.xibuild index 87c14ef..87c14ef 100644 --- a/repo/util/pm-utils.xibuild +++ b/repo/util/pm-utils/pm-utils.xibuild diff --git a/repo/util/procps-ng/procps-3.3.17-musl-fix.patch b/repo/util/procps-ng/procps-3.3.17-musl-fix.patch new file mode 100644 index 0000000..4402354 --- /dev/null +++ b/repo/util/procps-ng/procps-3.3.17-musl-fix.patch @@ -0,0 +1,78 @@ +Temporary stopgap patch (a different solution was used upstream +in the next release, should be in the next after 3.3.17 -- we'll need to +add --disable-w instead). + +https://bugs.gentoo.org/794997 + +From 7bfe2b7c12b33aabca71491360c433d2d3f7bbf4 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Wed, 24 Feb 2021 21:14:31 +0000 +Subject: [PATCH 1/2] w.c: correct musl builds + +No need to redefine UT_ stuff to something that does not exist. + +UT_ is already provided in musl but via utmp.h header, so include +it always. + +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + w.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/w.c b/w.c +index 9d07ac9e..d10639b8 100644 +--- a/w.c ++++ b/w.c +@@ -57,9 +57,8 @@ + #include <unistd.h> + #ifdef HAVE_UTMPX_H + # include <utmpx.h> +-#else +-# include <utmp.h> + #endif ++#include <utmp.h> + #include <arpa/inet.h> + + static int ignoreuser = 0; /* for '-u' */ +@@ -72,12 +71,6 @@ typedef struct utmpx utmp_t; + typedef struct utmp utmp_t; + #endif + +-#if !defined(UT_HOSTSIZE) || defined(__UT_HOSTSIZE) +-# define UT_HOSTSIZE __UT_HOSTSIZE +-# define UT_LINESIZE __UT_LINESIZE +-# define UT_NAMESIZE __UT_NAMESIZE +-#endif +- + #ifdef W_SHOWFROM + # define FROM_STRING "on" + #else +-- +GitLab + + +From 145165aba6c659f3f0f3567a323a3e6170408ea6 Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <alex.kanavin@gmail.com> +Date: Wed, 24 Feb 2021 21:16:14 +0000 +Subject: [PATCH 2/2] proc/escape.c: add missing include + +Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> +--- + proc/escape.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/proc/escape.c b/proc/escape.c +index 2e8fb7dd..e1f4612d 100644 +--- a/proc/escape.c ++++ b/proc/escape.c +@@ -21,6 +21,7 @@ + #include <sys/types.h> + #include <string.h> + #include <limits.h> ++#include <langinfo.h> + #include "procps.h" + #include "escape.h" + #include "readproc.h" +-- +GitLab + diff --git a/repo/util/procps-ng.xibuild b/repo/util/procps-ng/procps-ng.xibuild index 234892e..234892e 100644 --- a/repo/util/procps-ng.xibuild +++ b/repo/util/procps-ng/procps-ng.xibuild diff --git a/repo/util/procps-ng/use_utmpx.patch b/repo/util/procps-ng/use_utmpx.patch new file mode 100644 index 0000000..ea9e9e2 --- /dev/null +++ b/repo/util/procps-ng/use_utmpx.patch @@ -0,0 +1,38 @@ +diff -uNr procps-3.3.17.orig/proc/whattime.c procps-3.3.17/proc/whattime.c +--- procps-3.3.17.orig/proc/whattime.c 2021-02-09 04:11:25.000000000 -0600 ++++ procps-3.3.17/proc/whattime.c 2021-03-19 13:40:17.910049032 -0500 +@@ -33,7 +33,7 @@ + #include <fcntl.h> + #include <unistd.h> + #include <time.h> +-#include <utmp.h> ++#include <utmpx.h> + #include <sys/ioctl.h> + #include "whattime.h" + #include "sysinfo.h" +@@ -42,7 +42,7 @@ + static double av[3]; + + char *sprint_uptime(int human_readable) { +- struct utmp *utmpstruct; ++ struct utmpx *utmpstruct; + int upminutes, uphours, updays, upweeks, upyears, updecades; + int pos; + int comma; +@@ -98,13 +98,13 @@ + /* count the number of users */ + + numuser = 0; +- setutent(); +- while ((utmpstruct = getutent())) { ++ setutxent(); ++ while ((utmpstruct = getutxent())) { + if ((utmpstruct->ut_type == USER_PROCESS) && + (utmpstruct->ut_name[0] != '\0')) + numuser++; + } +- endutent(); ++ endutxent(); + + pos += sprintf(buf + pos, "%2d user%s, ", numuser, numuser == 1 ? "" : "s"); + diff --git a/repo/util/rhash.xibuild b/repo/util/rhash/rhash.xibuild index a35a820..a35a820 100644 --- a/repo/util/rhash.xibuild +++ b/repo/util/rhash/rhash.xibuild diff --git a/repo/util/rsync.xibuild b/repo/util/rsync/rsync.xibuild index 8e09cfa..8e09cfa 100644 --- a/repo/util/rsync.xibuild +++ b/repo/util/rsync/rsync.xibuild diff --git a/repo/util/sort.xibuild b/repo/util/sort/sort.xibuild index 5310d1b..5310d1b 100644 --- a/repo/util/sort.xibuild +++ b/repo/util/sort/sort.xibuild diff --git a/repo/util/sudo.xibuild b/repo/util/sudo/sudo.xibuild index dbb08f7..dbb08f7 100644 --- a/repo/util/sudo.xibuild +++ b/repo/util/sudo/sudo.xibuild diff --git a/repo/util/tmux.xibuild b/repo/util/tmux/tmux.xibuild index bbb42e1..bbb42e1 100644 --- a/repo/util/tmux.xibuild +++ b/repo/util/tmux/tmux.xibuild diff --git a/repo/util/unzip.xibuild b/repo/util/unzip/unzip.xibuild index d3fea41..d3fea41 100644 --- a/repo/util/unzip.xibuild +++ b/repo/util/unzip/unzip.xibuild diff --git a/repo/util/usbutils.xibuild b/repo/util/usbutils/usbutils.xibuild index 9df636f..9df636f 100644 --- a/repo/util/usbutils.xibuild +++ b/repo/util/usbutils/usbutils.xibuild diff --git a/repo/util/util-linux.xibuild b/repo/util/util-linux/util-linux.xibuild index 327d0db..327d0db 100644 --- a/repo/util/util-linux.xibuild +++ b/repo/util/util-linux/util-linux.xibuild diff --git a/repo/util/webfs.xibuild b/repo/util/webfs/webfs.xibuild index ab76812..ab76812 100644 --- a/repo/util/webfs.xibuild +++ b/repo/util/webfs/webfs.xibuild diff --git a/repo/util/wget.xibuild b/repo/util/wget/wget.xibuild index 46b772a..46b772a 100644 --- a/repo/util/wget.xibuild +++ b/repo/util/wget/wget.xibuild diff --git a/repo/util/which.xibuild b/repo/util/which/which.xibuild index ea246fa..ea246fa 100644 --- a/repo/util/which.xibuild +++ b/repo/util/which/which.xibuild diff --git a/repo/util/wireless-tools.xibuild b/repo/util/wireless-tools/wireless-tools.xibuild index dc7e19f..dc7e19f 100644 --- a/repo/util/wireless-tools.xibuild +++ b/repo/util/wireless-tools/wireless-tools.xibuild diff --git a/repo/util/wpa_supplicant/wpa_cli.confd b/repo/util/wpa_supplicant/wpa_cli.confd new file mode 100644 index 0000000..aa481ac --- /dev/null +++ b/repo/util/wpa_supplicant/wpa_cli.confd @@ -0,0 +1 @@ +WPACLI_OPTS="-a /etc/wpa_supplicant/wpa_cli.sh" diff --git a/repo/util/wpa_supplicant/wpa_cli.initd b/repo/util/wpa_supplicant/wpa_cli.initd new file mode 100644 index 0000000..2bf7c0d --- /dev/null +++ b/repo/util/wpa_supplicant/wpa_cli.initd @@ -0,0 +1,22 @@ +#!/sbin/openrc-run + +supervisor=supervise-daemon + +# The wpa_cli services depends on wpa_supplicant. If wpa_supplicant is +# restarted, so is wpa_cli. Unfortunately, wpa_supplicant creates the +# socket, used for communication with wpa_cli, rather late thereby +# causing wpa_cli to be restarted before it is created and thus fail. +# By default supervise-daemon will restart wpa_cli immediately, often +# resulting in all restart attempts to be exhausted before the socket is +# created. To work around this issue, add a respawn-delay to wpa_cli. +supervise_daemon_args="--respawn-delay 3" + +name="WPA Command Line Client" +description="Text-based frontend for interacting with WPA Supplicant" + +command=/sbin/wpa_cli +command_args="${WPACLI_OPTS} >/dev/null" + +depend() { + need wpa_supplicant +} diff --git a/repo/util/wpa_supplicant/wpa_supplicant.confd b/repo/util/wpa_supplicant/wpa_supplicant.confd new file mode 100644 index 0000000..56a6c11 --- /dev/null +++ b/repo/util/wpa_supplicant/wpa_supplicant.confd @@ -0,0 +1,10 @@ +# conf.d file for wpa_supplicant +# +# Please check man 8 wpa_supplicant for more information about the options +# wpa_supplicant accepts. +wpa_supplicant_args="" + +# The dbus interface will be enabled by default if wpa_supplicant.conf is +# missing. use wpa_supplicant_dbus to explicitly enable/disable dbus interface + +#wpa_supplicant_dbus=no diff --git a/repo/util/wpa_supplicant/wpa_supplicant.initd b/repo/util/wpa_supplicant/wpa_supplicant.initd new file mode 100644 index 0000000..c1a4834 --- /dev/null +++ b/repo/util/wpa_supplicant/wpa_supplicant.initd @@ -0,0 +1,79 @@ +#!/sbin/openrc-run +# Copyright (c) 2009 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. +supervisor=supervise-daemon + +name="WPA Supplicant" +description="Wi-Fi Protected Access client and IEEE 802.1X supplicant" + +command=/sbin/wpa_supplicant +wpa_supplicant_if=${wpa_supplicant_if:+-i}$wpa_supplicant_if +command_args="$wpa_supplicant_args $wpa_supplicant_if" + +default_conf=/etc/wpa_supplicant/wpa_supplicant.conf + +depend() { + need localmount + use logger dbus + after bootmisc modules entropy udev-settle + before dns dhcpcd net + keyword -shutdown +} + +find_wireless() { + local iface= + for iface in /sys/class/net/*; do + if [ -e "$iface"/wireless -o -e "$iface"/phy80211 ]; then + echo "${iface##*/}" + return 0 + fi + done + + return 1 +} + +append_wireless() { + local iface= i= + + iface=$(find_wireless) + if [ -n "$iface" ]; then + for i in $iface; do + command_args="$command_args -i$i" + done + else + eerror "Could not find a wireless interface" + fi +} + +start_pre() { + case " $command_args" in + *" -i"*) ;; + *) append_wireless;; + esac + + # set default conf if dbus is explicitly disabled + if [ -n "${wpa_supplicant_dbus}" ] && ! yesno "${wpa_supplicant_dbus}"; then + : ${wpa_supplicant_conf:=${default_conf}} + fi + + # use default conf if it exists + if [ -f "${default_conf}" ]; then + : ${wpa_supplicant_conf:=${default_conf}} + fi + + # enable default dbus if we still dont have a config + if [ -z "${wpa_supplicant_conf}" ]; then + : ${wpa_supplicant_dbus:=yes} + else + command_args="${command_args} -c$wpa_supplicant_conf" + fi + case " ${command_args}" in + *" -u"*);; + *) if yesno "{wpa_supplicant_dbus}"; then + command_args="-u ${command_args}" + fi + ;; + esac + + checkpath -d -m 0755 -o root:root /var/run/wpa_supplicant +} diff --git a/repo/util/wpa_supplicant.xibuild b/repo/util/wpa_supplicant/wpa_supplicant.xibuild index b1b1f20..b1b1f20 100644 --- a/repo/util/wpa_supplicant.xibuild +++ b/repo/util/wpa_supplicant/wpa_supplicant.xibuild diff --git a/repo/x11/adwaita-icon-theme.xibuild b/repo/x11/adwaita-icon-theme/adwaita-icon-theme.xibuild index c87bd79..c87bd79 100644 --- a/repo/x11/adwaita-icon-theme.xibuild +++ b/repo/x11/adwaita-icon-theme/adwaita-icon-theme.xibuild diff --git a/repo/x11/berry.xibuild b/repo/x11/berry/berry.xibuild index 5b4fe5e..5b4fe5e 100644 --- a/repo/x11/berry.xibuild +++ b/repo/x11/berry/berry.xibuild diff --git a/repo/x11/bspwm.xibuild b/repo/x11/bspwm/bspwm.xibuild index 7887321..7887321 100644 --- a/repo/x11/bspwm.xibuild +++ b/repo/x11/bspwm/bspwm.xibuild diff --git a/repo/x11/dmenu.xibuild b/repo/x11/dmenu/dmenu.xibuild index 0356f4e..0356f4e 100644 --- a/repo/x11/dmenu.xibuild +++ b/repo/x11/dmenu/dmenu.xibuild diff --git a/repo/x11/gdk-pixbuf/disable-tests.patch b/repo/x11/gdk-pixbuf/disable-tests.patch new file mode 100644 index 0000000..01ee3a6 --- /dev/null +++ b/repo/x11/gdk-pixbuf/disable-tests.patch @@ -0,0 +1,13 @@ +Index: meson.build +--- a/meson.build ++++ b/meson.build +@@ -398,7 +398,9 @@ endif + subdir('po') + + if not meson.is_cross_build() +- subdir('tests') ++ if get_option('installed_tests') ++ subdir('tests') ++ endif + subdir('thumbnailer') + endif diff --git a/repo/x11/gdk-pixbuf.xibuild b/repo/x11/gdk-pixbuf/gdk-pixbuf.xibuild index fe704e9..fe704e9 100644 --- a/repo/x11/gdk-pixbuf.xibuild +++ b/repo/x11/gdk-pixbuf/gdk-pixbuf.xibuild diff --git a/repo/x11/graphite/cmake.patch b/repo/x11/graphite/cmake.patch new file mode 100644 index 0000000..2b21d6b --- /dev/null +++ b/repo/x11/graphite/cmake.patch @@ -0,0 +1,23 @@ +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index b6ac26b..0371b0c 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -120,11 +120,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + if (${CMAKE_CXX_COMPILER} MATCHES ".*mingw.*") + target_link_libraries(graphite2 kernel32 msvcr90 mingw32 gcc user32) + else (${CMAKE_CXX_COMPILER} MATCHES ".*mingw.*") +- if (GRAPHITE2_SANITIZERS) +- target_link_libraries(graphite2 c gcc_s) +- else () +- target_link_libraries(graphite2 c gcc) +- endif () ++ target_link_libraries(graphite2 c gcc_s -lssp_nonshared) + endif() + include(Graphite) + if (BUILD_SHARED_LIBS) +@@ -156,4 +152,4 @@ endif() + + + install(TARGETS graphite2 EXPORT graphite2 LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX} PUBLIC_HEADER DESTINATION include/graphite2 RUNTIME DESTINATION bin) +-install(EXPORT graphite2 DESTINATION share/graphite2 NAMESPACE gr2_) ++install(EXPORT graphite2 DESTINATION lib${LIB_SUFFIX}/cmake/graphite2 NAMESPACE gr2_) diff --git a/repo/x11/graphite.xibuild b/repo/x11/graphite/graphite.xibuild index 5583086..5583086 100644 --- a/repo/x11/graphite.xibuild +++ b/repo/x11/graphite/graphite.xibuild diff --git a/repo/x11/gsettings-desktop-schemas.xibuild b/repo/x11/gsettings-desktop-schemas/gsettings-desktop-schemas.xibuild index 72092d1..72092d1 100644 --- a/repo/x11/gsettings-desktop-schemas.xibuild +++ b/repo/x11/gsettings-desktop-schemas/gsettings-desktop-schemas.xibuild diff --git a/repo/x11/gtk2.xibuild b/repo/x11/gtk2/gtk2.xibuild index 1798730..1798730 100644 --- a/repo/x11/gtk2.xibuild +++ b/repo/x11/gtk2/gtk2.xibuild diff --git a/repo/x11/gtk3.xibuild b/repo/x11/gtk3/gtk3.xibuild index 14e4989..14e4989 100644 --- a/repo/x11/gtk3.xibuild +++ b/repo/x11/gtk3/gtk3.xibuild diff --git a/repo/x11/harfbuzz.xibuild b/repo/x11/harfbuzz/harfbuzz.xibuild index d86a83e..d86a83e 100644 --- a/repo/x11/harfbuzz.xibuild +++ b/repo/x11/harfbuzz/harfbuzz.xibuild diff --git a/repo/x11/hicolor-icon-theme.xibuild b/repo/x11/hicolor-icon-theme/hicolor-icon-theme.xibuild index 3d51994..3d51994 100644 --- a/repo/x11/hicolor-icon-theme.xibuild +++ b/repo/x11/hicolor-icon-theme/hicolor-icon-theme.xibuild diff --git a/repo/x11/iceauth.xibuild b/repo/x11/iceauth/iceauth.xibuild index b197866..b197866 100644 --- a/repo/x11/iceauth.xibuild +++ b/repo/x11/iceauth/iceauth.xibuild diff --git a/repo/x11/intel-vaapi-driver.xibuild b/repo/x11/intel-vaapi-driver/intel-vaapi-driver.xibuild index 4452392..4452392 100644 --- a/repo/x11/intel-vaapi-driver.xibuild +++ b/repo/x11/intel-vaapi-driver/intel-vaapi-driver.xibuild diff --git a/repo/x11/libdmx.xibuild b/repo/x11/libdmx/libdmx.xibuild index 9380c76..9380c76 100644 --- a/repo/x11/libdmx.xibuild +++ b/repo/x11/libdmx/libdmx.xibuild diff --git a/repo/x11/libdrm.xibuild b/repo/x11/libdrm/libdrm.xibuild index 5e9b11c..5e9b11c 100644 --- a/repo/x11/libdrm.xibuild +++ b/repo/x11/libdrm/libdrm.xibuild diff --git a/repo/x11/libepoxy.xibuild b/repo/x11/libepoxy/libepoxy.xibuild index 3d79d77..3d79d77 100644 --- a/repo/x11/libepoxy.xibuild +++ b/repo/x11/libepoxy/libepoxy.xibuild diff --git a/repo/x11/libevdev.xibuild b/repo/x11/libevdev/libevdev.xibuild index e5b822e..e5b822e 100644 --- a/repo/x11/libevdev.xibuild +++ b/repo/x11/libevdev/libevdev.xibuild diff --git a/repo/x11/libfontenc.xibuild b/repo/x11/libfontenc/libfontenc.xibuild index 6f9c0c3..6f9c0c3 100644 --- a/repo/x11/libfontenc.xibuild +++ b/repo/x11/libfontenc/libfontenc.xibuild diff --git a/repo/x11/libfs.xibuild b/repo/x11/libfs/libfs.xibuild index 2e635dd..2e635dd 100644 --- a/repo/x11/libfs.xibuild +++ b/repo/x11/libfs/libfs.xibuild diff --git a/repo/x11/libice.xibuild b/repo/x11/libice/libice.xibuild index b819df4..b819df4 100644 --- a/repo/x11/libice.xibuild +++ b/repo/x11/libice/libice.xibuild diff --git a/repo/x11/libinput.xibuild b/repo/x11/libinput/libinput.xibuild index 8996272..8996272 100644 --- a/repo/x11/libinput.xibuild +++ b/repo/x11/libinput/libinput.xibuild diff --git a/repo/x11/libpciaccess.xibuild b/repo/x11/libpciaccess/libpciaccess.xibuild index 6af00dc..6af00dc 100644 --- a/repo/x11/libpciaccess.xibuild +++ b/repo/x11/libpciaccess/libpciaccess.xibuild diff --git a/repo/x11/libsm.xibuild b/repo/x11/libsm/libsm.xibuild index 9e132d9..9e132d9 100644 --- a/repo/x11/libsm.xibuild +++ b/repo/x11/libsm/libsm.xibuild diff --git a/repo/x11/libva.xibuild b/repo/x11/libva/libva.xibuild index 7d6c66b..7d6c66b 100644 --- a/repo/x11/libva.xibuild +++ b/repo/x11/libva/libva.xibuild diff --git a/repo/x11/libvdpau-va-gl.xibuild b/repo/x11/libvdpau-va-gl/libvdpau-va-gl.xibuild index 074dece..074dece 100644 --- a/repo/x11/libvdpau-va-gl.xibuild +++ b/repo/x11/libvdpau-va-gl/libvdpau-va-gl.xibuild diff --git a/repo/x11/libvdpau.xibuild b/repo/x11/libvdpau/libvdpau.xibuild index f36957f..f36957f 100644 --- a/repo/x11/libvdpau.xibuild +++ b/repo/x11/libvdpau/libvdpau.xibuild diff --git a/repo/x11/libwacom.xibuild b/repo/x11/libwacom/libwacom.xibuild index 80dd536..80dd536 100644 --- a/repo/x11/libwacom.xibuild +++ b/repo/x11/libwacom/libwacom.xibuild diff --git a/repo/x11/libx11.xibuild b/repo/x11/libx11/libx11.xibuild index 90b6d57..90b6d57 100644 --- a/repo/x11/libx11.xibuild +++ b/repo/x11/libx11/libx11.xibuild diff --git a/repo/x11/libxau.xibuild b/repo/x11/libxau/libxau.xibuild index adb0567..adb0567 100644 --- a/repo/x11/libxau.xibuild +++ b/repo/x11/libxau/libxau.xibuild diff --git a/repo/x11/libxaw.xibuild b/repo/x11/libxaw/libxaw.xibuild index e7e4788..e7e4788 100644 --- a/repo/x11/libxaw.xibuild +++ b/repo/x11/libxaw/libxaw.xibuild diff --git a/repo/x11/libxcb.xibuild b/repo/x11/libxcb/libxcb.xibuild index 0a59eea..0a59eea 100644 --- a/repo/x11/libxcb.xibuild +++ b/repo/x11/libxcb/libxcb.xibuild diff --git a/repo/x11/libxcomposite.xibuild b/repo/x11/libxcomposite/libxcomposite.xibuild index 5cf3082..5cf3082 100644 --- a/repo/x11/libxcomposite.xibuild +++ b/repo/x11/libxcomposite/libxcomposite.xibuild diff --git a/repo/x11/libxcursor.xibuild b/repo/x11/libxcursor/libxcursor.xibuild index 4ae2314..4ae2314 100644 --- a/repo/x11/libxcursor.xibuild +++ b/repo/x11/libxcursor/libxcursor.xibuild diff --git a/repo/x11/libxcvt.xibuild b/repo/x11/libxcvt/libxcvt.xibuild index 07e3766..07e3766 100644 --- a/repo/x11/libxcvt.xibuild +++ b/repo/x11/libxcvt/libxcvt.xibuild diff --git a/repo/x11/libxdamage.xibuild b/repo/x11/libxdamage/libxdamage.xibuild index cc03c7f..cc03c7f 100644 --- a/repo/x11/libxdamage.xibuild +++ b/repo/x11/libxdamage/libxdamage.xibuild diff --git a/repo/x11/libxdmcp.xibuild b/repo/x11/libxdmcp/libxdmcp.xibuild index 2a0a481..2a0a481 100644 --- a/repo/x11/libxdmcp.xibuild +++ b/repo/x11/libxdmcp/libxdmcp.xibuild diff --git a/repo/x11/libxext.xibuild b/repo/x11/libxext/libxext.xibuild index f20a096..f20a096 100644 --- a/repo/x11/libxext.xibuild +++ b/repo/x11/libxext/libxext.xibuild diff --git a/repo/x11/libxfixes.xibuild b/repo/x11/libxfixes/libxfixes.xibuild index 0f337ce..0f337ce 100644 --- a/repo/x11/libxfixes.xibuild +++ b/repo/x11/libxfixes/libxfixes.xibuild diff --git a/repo/x11/libxfont2.xibuild b/repo/x11/libxfont2/libxfont2.xibuild index c2ba59d..c2ba59d 100644 --- a/repo/x11/libxfont2.xibuild +++ b/repo/x11/libxfont2/libxfont2.xibuild diff --git a/repo/x11/libxft.xibuild b/repo/x11/libxft/libxft.xibuild index 3e2f91d..3e2f91d 100644 --- a/repo/x11/libxft.xibuild +++ b/repo/x11/libxft/libxft.xibuild diff --git a/repo/x11/libxi.xibuild b/repo/x11/libxi/libxi.xibuild index 6741cfe..6741cfe 100644 --- a/repo/x11/libxi.xibuild +++ b/repo/x11/libxi/libxi.xibuild diff --git a/repo/x11/libxinerama.xibuild b/repo/x11/libxinerama/libxinerama.xibuild index 047bdd0..047bdd0 100644 --- a/repo/x11/libxinerama.xibuild +++ b/repo/x11/libxinerama/libxinerama.xibuild diff --git a/repo/x11/libxkbcommon.xibuild b/repo/x11/libxkbcommon/libxkbcommon.xibuild index 2675370..2675370 100644 --- a/repo/x11/libxkbcommon.xibuild +++ b/repo/x11/libxkbcommon/libxkbcommon.xibuild diff --git a/repo/x11/libxkbfile.xibuild b/repo/x11/libxkbfile/libxkbfile.xibuild index 9825b82..9825b82 100644 --- a/repo/x11/libxkbfile.xibuild +++ b/repo/x11/libxkbfile/libxkbfile.xibuild diff --git a/repo/x11/libxmu.xibuild b/repo/x11/libxmu/libxmu.xibuild index 5127ccc..5127ccc 100644 --- a/repo/x11/libxmu.xibuild +++ b/repo/x11/libxmu/libxmu.xibuild diff --git a/repo/x11/libxpm.xibuild b/repo/x11/libxpm/libxpm.xibuild index cfdfadc..cfdfadc 100644 --- a/repo/x11/libxpm.xibuild +++ b/repo/x11/libxpm/libxpm.xibuild diff --git a/repo/x11/libxrandr.xibuild b/repo/x11/libxrandr/libxrandr.xibuild index 8d8b790..8d8b790 100644 --- a/repo/x11/libxrandr.xibuild +++ b/repo/x11/libxrandr/libxrandr.xibuild diff --git a/repo/x11/libxrender.xibuild b/repo/x11/libxrender/libxrender.xibuild index 55126aa..55126aa 100644 --- a/repo/x11/libxrender.xibuild +++ b/repo/x11/libxrender/libxrender.xibuild diff --git a/repo/x11/libxres.xibuild b/repo/x11/libxres/libxres.xibuild index 0639324..0639324 100644 --- a/repo/x11/libxres.xibuild +++ b/repo/x11/libxres/libxres.xibuild diff --git a/repo/x11/libxscrnsaver.xibuild b/repo/x11/libxscrnsaver/libxscrnsaver.xibuild index 27b710c..27b710c 100644 --- a/repo/x11/libxscrnsaver.xibuild +++ b/repo/x11/libxscrnsaver/libxscrnsaver.xibuild diff --git a/repo/x11/libxshmfence.xibuild b/repo/x11/libxshmfence/libxshmfence.xibuild index 224612b..224612b 100644 --- a/repo/x11/libxshmfence.xibuild +++ b/repo/x11/libxshmfence/libxshmfence.xibuild diff --git a/repo/x11/libxt.xibuild b/repo/x11/libxt/libxt.xibuild index 293683d..293683d 100644 --- a/repo/x11/libxt.xibuild +++ b/repo/x11/libxt/libxt.xibuild diff --git a/repo/x11/libxtst.xibuild b/repo/x11/libxtst/libxtst.xibuild index 45093e1..45093e1 100644 --- a/repo/x11/libxtst.xibuild +++ b/repo/x11/libxtst/libxtst.xibuild diff --git a/repo/x11/libxv.xibuild b/repo/x11/libxv/libxv.xibuild index c7fa2b6..c7fa2b6 100644 --- a/repo/x11/libxv.xibuild +++ b/repo/x11/libxv/libxv.xibuild diff --git a/repo/x11/libxvmc.xibuild b/repo/x11/libxvmc/libxvmc.xibuild index 76b445c..76b445c 100644 --- a/repo/x11/libxvmc.xibuild +++ b/repo/x11/libxvmc/libxvmc.xibuild diff --git a/repo/x11/libxxf86dga.xibuild b/repo/x11/libxxf86dga/libxxf86dga.xibuild index ba5a0b9..ba5a0b9 100644 --- a/repo/x11/libxxf86dga.xibuild +++ b/repo/x11/libxxf86dga/libxxf86dga.xibuild diff --git a/repo/x11/libxxf86vm.xibuild b/repo/x11/libxxf86vm/libxxf86vm.xibuild index d45959e..d45959e 100644 --- a/repo/x11/libxxf86vm.xibuild +++ b/repo/x11/libxxf86vm/libxxf86vm.xibuild diff --git a/repo/x11/luit.xibuild b/repo/x11/luit/luit.xibuild index 7a2beed..7a2beed 100644 --- a/repo/x11/luit.xibuild +++ b/repo/x11/luit/luit.xibuild diff --git a/repo/x11/maim.xibuild b/repo/x11/maim/maim.xibuild index 4f93af0..4f93af0 100644 --- a/repo/x11/maim.xibuild +++ b/repo/x11/maim/maim.xibuild diff --git a/repo/x11/mesa/0001-radeonsi-On-Aarch64-force-persistent-buffers-to-GTT.patch b/repo/x11/mesa/0001-radeonsi-On-Aarch64-force-persistent-buffers-to-GTT.patch new file mode 100644 index 0000000..ea855f6 --- /dev/null +++ b/repo/x11/mesa/0001-radeonsi-On-Aarch64-force-persistent-buffers-to-GTT.patch @@ -0,0 +1,38 @@ +From d72aa8ae74ffb7329003f9f23ffa05833af951ab Mon Sep 17 00:00:00 2001 +From: Jon Nettleton <jon@solid-run.com> +Date: Fri, 14 Aug 2020 13:36:08 +0200 +Subject: [PATCH] radeonsi: On Aarch64 force persistent buffers to GTT + +This fixes a glamore corruption issue on the HoneyComb and by +internet reports should also fix problems seen on Huaweii +Kunpeng hardware. + +The root cause of the corruption needs to be worked out, but +this patch also adds a noticable performance improvement. The +aquarium webgl demo under chromium increases from 39-49 FPS +when 5000 fish being rendered is selected. Glmark scores also +improve by ~200 with no specific tests showing any regression. + +Signed-off-by: Jon Nettleton <jon@solid-run.com> +--- + src/gallium/drivers/radeonsi/si_buffer.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c +index 6b58aebee2d..c9e983367a0 100644 +--- a/src/gallium/drivers/radeonsi/si_buffer.c ++++ b/src/gallium/drivers/radeonsi/si_buffer.c +@@ -151,6 +151,11 @@ void si_init_resource_fields(struct si_screen *sscreen, struct si_resource *res, + */ + if (!sscreen->info.kernel_flushes_hdp_before_ib || !sscreen->info.is_amdgpu) + res->domains = RADEON_DOMAIN_GTT; ++ ++#if defined(PIPE_ARCH_AARCH64) ++ if (size <= 1024 * 512) ++ res->domains = RADEON_DOMAIN_GTT; ++#endif + } + + /* Tiled textures are unmappable. Always put them in VRAM. */ +-- +2.26.2 diff --git a/repo/x11/mesa/add-use-elf-tls.patch b/repo/x11/mesa/add-use-elf-tls.patch new file mode 100644 index 0000000..629c5ac --- /dev/null +++ b/repo/x11/mesa/add-use-elf-tls.patch @@ -0,0 +1,29 @@ +diff --git a/meson.build b/meson.build +index e1e94e7..b355f94 100644 +--- a/meson.build ++++ b/meson.build +@@ -447,7 +447,9 @@ endif + + # Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS. + use_elf_tls = false +-if (not ['freebsd', 'openbsd', 'haiku'].contains(host_machine.system()) and ++with_use_elf_tls = get_option('use-elf-tls') ++if with_use_elf_tls and ++ (not ['freebsd', 'openbsd', 'haiku'].contains(host_machine.system()) and + (not with_platform_android or get_option('platform-sdk-version') >= 29) and + (not with_platform_windows or not with_shared_glapi)) + pre_args += '-DUSE_ELF_TLS' +diff --git a/meson_options.txt b/meson_options.txt +index a7030ab..73bd28e 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -465,3 +465,9 @@ option( + value : true, + description : 'use msse2 flag for mingw x86. Default: true', + ) ++option( ++ 'use-elf-tls', ++ type : 'boolean', ++ value : false, ++ description : 'Build support for initial-exec TLS model' ++) diff --git a/repo/x11/mesa/disable-rgb10-by-default.patch b/repo/x11/mesa/disable-rgb10-by-default.patch new file mode 100644 index 0000000..6e1158b --- /dev/null +++ b/repo/x11/mesa/disable-rgb10-by-default.patch @@ -0,0 +1,25 @@ +From b33c8b56abcc4837f96f7f106b108681858482e0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com> +Date: Tue, 24 Apr 2018 09:46:41 +0200 +Subject: [PATCH] gallium: Disable rgb10 configs by default + +Applications tend to not handle rgb10 configs very well, so lets +disable it for now. + +https://bugzilla.redhat.com/show_bug.cgi?id=1560481 +--- + src/gallium/auxiliary/pipe-loader/driinfo_gallium.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h +index 3b630f7..b542e0c 100644 +--- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h ++++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h +@@ -49,6 +49,6 @@ DRI_CONF_SECTION_MISCELLANEOUS + DRI_CONF_GLSL_ZERO_INIT(false) + DRI_CONF_VS_POSITION_ALWAYS_INVARIANT(false) + DRI_CONF_VS_POSITION_ALWAYS_PRECISE(false) +- DRI_CONF_ALLOW_RGB10_CONFIGS(true) ++ DRI_CONF_ALLOW_RGB10_CONFIGS(false) + DRI_CONF_FORCE_INTEGER_TEX_NEAREST(false) + DRI_CONF_SECTION_END diff --git a/repo/x11/mesa/mesa-21.3.7-add_xdemos-1.patch b/repo/x11/mesa/mesa-21.3.7-add_xdemos-1.patch new file mode 100644 index 0000000..6b41e57 --- /dev/null +++ b/repo/x11/mesa/mesa-21.3.7-add_xdemos-1.patch @@ -0,0 +1,3197 @@ +Submitted By: DJ Lucas <dj@linuxfromscratch.org> + based on previous patches submitted + by Armin K and Fernando de Oliveira +Date: 2020-10-16 +Initial Package Version: 19.0.4 +Upstream Status: Not applicable. +Origin: Self. +Description: This patch adds two OpenGL demos, glxinfo and + glxgears and respective man pages. + +diff -Naurp mesa-20.2.1-orig/src/glx/meson.build mesa-20.2.1/src/glx/meson.build +--- mesa-20.2.1-orig/src/glx/meson.build 2020-10-14 12:19:10.623185200 -0500 ++++ mesa-20.2.1/src/glx/meson.build 2020-10-15 23:06:45.823362439 -0500 +@@ -165,6 +165,8 @@ libgl = shared_library( + install : true, + ) + ++subdir('xdemos') ++ + if with_tests + subdir('tests') + endif +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glinfo_common.c mesa-20.2.1/src/glx/xdemos/glinfo_common.c +--- mesa-20.2.1-orig/src/glx/xdemos/glinfo_common.c 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glinfo_common.c 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,800 @@ ++/* ++ * Copyright (C) 1999-2014 Brian Paul All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include <assert.h> ++#include <ctype.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include "glinfo_common.h" ++ ++#ifdef _WIN32 ++#define snprintf _snprintf ++#endif ++ ++ ++/** ++ * Return the GL enum name for a numeric value. ++ * We really only care about the compressed texture formats for now. ++ */ ++static const char * ++enum_name(GLenum val) ++{ ++ static const struct { ++ const char *name; ++ GLenum val; ++ } enums [] = { ++ { "GL_COMPRESSED_ALPHA", 0x84E9 }, ++ { "GL_COMPRESSED_LUMINANCE", 0x84EA }, ++ { "GL_COMPRESSED_LUMINANCE_ALPHA", 0x84EB }, ++ { "GL_COMPRESSED_INTENSITY", 0x84EC }, ++ { "GL_COMPRESSED_RGB", 0x84ED }, ++ { "GL_COMPRESSED_RGBA", 0x84EE }, ++ { "GL_COMPRESSED_TEXTURE_FORMATS", 0x86A3 }, ++ { "GL_COMPRESSED_RGB", 0x84ED }, ++ { "GL_COMPRESSED_RGBA", 0x84EE }, ++ { "GL_COMPRESSED_TEXTURE_FORMATS", 0x86A3 }, ++ { "GL_COMPRESSED_ALPHA", 0x84E9 }, ++ { "GL_COMPRESSED_LUMINANCE", 0x84EA }, ++ { "GL_COMPRESSED_LUMINANCE_ALPHA", 0x84EB }, ++ { "GL_COMPRESSED_INTENSITY", 0x84EC }, ++ { "GL_COMPRESSED_SRGB", 0x8C48 }, ++ { "GL_COMPRESSED_SRGB_ALPHA", 0x8C49 }, ++ { "GL_COMPRESSED_SLUMINANCE", 0x8C4A }, ++ { "GL_COMPRESSED_SLUMINANCE_ALPHA", 0x8C4B }, ++ { "GL_COMPRESSED_RED", 0x8225 }, ++ { "GL_COMPRESSED_RG", 0x8226 }, ++ { "GL_COMPRESSED_RED_RGTC1", 0x8DBB }, ++ { "GL_COMPRESSED_SIGNED_RED_RGTC1", 0x8DBC }, ++ { "GL_COMPRESSED_RG_RGTC2", 0x8DBD }, ++ { "GL_COMPRESSED_SIGNED_RG_RGTC2", 0x8DBE }, ++ { "GL_COMPRESSED_RGB8_ETC2", 0x9274 }, ++ { "GL_COMPRESSED_SRGB8_ETC2", 0x9275 }, ++ { "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", 0x9276 }, ++ { "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2", 0x9277 }, ++ { "GL_COMPRESSED_RGBA8_ETC2_EAC", 0x9278 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", 0x9279 }, ++ { "GL_COMPRESSED_R11_EAC", 0x9270 }, ++ { "GL_COMPRESSED_SIGNED_R11_EAC", 0x9271 }, ++ { "GL_COMPRESSED_RG11_EAC", 0x9272 }, ++ { "GL_COMPRESSED_SIGNED_RG11_EAC", 0x9273 }, ++ { "GL_COMPRESSED_ALPHA_ARB", 0x84E9 }, ++ { "GL_COMPRESSED_LUMINANCE_ARB", 0x84EA }, ++ { "GL_COMPRESSED_LUMINANCE_ALPHA_ARB", 0x84EB }, ++ { "GL_COMPRESSED_INTENSITY_ARB", 0x84EC }, ++ { "GL_COMPRESSED_RGB_ARB", 0x84ED }, ++ { "GL_COMPRESSED_RGBA_ARB", 0x84EE }, ++ { "GL_COMPRESSED_TEXTURE_FORMATS_ARB", 0x86A3 }, ++ { "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB", 0x8E8C }, ++ { "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB", 0x8E8D }, ++ { "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB", 0x8E8E }, ++ { "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB", 0x8E8F }, ++ { "GL_COMPRESSED_RGBA_ASTC_4x4_KHR", 0x93B0 }, ++ { "GL_COMPRESSED_RGBA_ASTC_5x4_KHR", 0x93B1 }, ++ { "GL_COMPRESSED_RGBA_ASTC_5x5_KHR", 0x93B2 }, ++ { "GL_COMPRESSED_RGBA_ASTC_6x5_KHR", 0x93B3 }, ++ { "GL_COMPRESSED_RGBA_ASTC_6x6_KHR", 0x93B4 }, ++ { "GL_COMPRESSED_RGBA_ASTC_8x5_KHR", 0x93B5 }, ++ { "GL_COMPRESSED_RGBA_ASTC_8x6_KHR", 0x93B6 }, ++ { "GL_COMPRESSED_RGBA_ASTC_8x8_KHR", 0x93B7 }, ++ { "GL_COMPRESSED_RGBA_ASTC_10x5_KHR", 0x93B8 }, ++ { "GL_COMPRESSED_RGBA_ASTC_10x6_KHR", 0x93B9 }, ++ { "GL_COMPRESSED_RGBA_ASTC_10x8_KHR", 0x93BA }, ++ { "GL_COMPRESSED_RGBA_ASTC_10x10_KHR", 0x93BB }, ++ { "GL_COMPRESSED_RGBA_ASTC_12x10_KHR", 0x93BC }, ++ { "GL_COMPRESSED_RGBA_ASTC_12x12_KHR", 0x93BD }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR", 0x93D0 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR", 0x93D1 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR", 0x93D2 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR", 0x93D3 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR", 0x93D4 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR", 0x93D5 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR", 0x93D6 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR", 0x93D7 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR", 0x93D8 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", 0x93D9 }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR", 0x93DA }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR", 0x93DB }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR", 0x93DC }, ++ { "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR", 0x93DD }, ++ { "GL_COMPRESSED_RGB_FXT1_3DFX", 0x86B0 }, ++ { "GL_COMPRESSED_RGBA_FXT1_3DFX", 0x86B1 }, ++ { "GL_COMPRESSED_LUMINANCE_LATC1_EXT", 0x8C70 }, ++ { "GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT", 0x8C71 }, ++ { "GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT", 0x8C72 }, ++ { "GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT", 0x8C73 }, ++ { "GL_COMPRESSED_RED_RGTC1_EXT", 0x8DBB }, ++ { "GL_COMPRESSED_SIGNED_RED_RGTC1_EXT", 0x8DBC }, ++ { "GL_COMPRESSED_RED_GREEN_RGTC2_EXT", 0x8DBD }, ++ { "GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT", 0x8DBE }, ++ { "GL_COMPRESSED_RGB_S3TC_DXT1_EXT", 0x83F0 }, ++ { "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT", 0x83F1 }, ++ { "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT", 0x83F2 }, ++ { "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT", 0x83F3 }, ++ { "GL_COMPRESSED_SRGB_EXT", 0x8C48 }, ++ { "GL_COMPRESSED_SRGB_ALPHA_EXT", 0x8C49 }, ++ { "GL_COMPRESSED_SLUMINANCE_EXT", 0x8C4A }, ++ { "GL_COMPRESSED_SLUMINANCE_ALPHA_EXT", 0x8C4B }, ++ { "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT", 0x8C4C }, ++ { "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT", 0x8C4D }, ++ { "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT", 0x8C4E }, ++ { "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT", 0x8C4F }, ++ { "GL_PALETTE4_RGB8_OES", 0x8B90 }, ++ { "GL_PALETTE4_RGBA8_OES", 0x8B91 }, ++ { "GL_PALETTE4_R5_G6_B5_OES", 0x8B92 }, ++ { "GL_PALETTE4_RGBA4_OES", 0x8B93 }, ++ { "GL_PALETTE4_RGB5_A1_OES", 0x8B94 }, ++ { "GL_PALETTE8_RGB8_OES", 0x8B95 }, ++ { "GL_PALETTE8_RGBA8_OES", 0x8B96 }, ++ { "GL_PALETTE8_R5_G6_B5_OES", 0x8B97 }, ++ { "GL_PALETTE8_RGBA4_OES", 0x8B98 }, ++ { "GL_PALETTE8_RGB5_A1_OES", 0x8B99 } ++ }; ++ const int n = sizeof(enums) / sizeof(enums[0]); ++ static char buffer[100]; ++ int i; ++ for (i = 0; i < n; i++) { ++ if (enums[i].val == val) { ++ return enums[i].name; ++ } ++ } ++ /* enum val not found, just print hexadecimal value into static buffer */ ++ snprintf(buffer, sizeof(buffer), "0x%x", val); ++ return buffer; ++} ++ ++ ++/* ++ * qsort callback for string comparison. ++ */ ++static int ++compare_string_ptr(const void *p1, const void *p2) ++{ ++ return strcmp(* (char * const *) p1, * (char * const *) p2); ++} ++ ++/* ++ * Print a list of extensions, with word-wrapping. ++ */ ++void ++print_extension_list(const char *ext, GLboolean singleLine) ++{ ++ char **extensions; ++ int num_extensions; ++ const char *indentString = " "; ++ const int indent = 4; ++ const int max = 79; ++ int width, i, j, k; ++ ++ if (!ext || !ext[0]) ++ return; ++ ++ /* count the number of extensions, ignoring successive spaces */ ++ num_extensions = 0; ++ j = 1; ++ do { ++ if ((ext[j] == ' ' || ext[j] == 0) && ext[j - 1] != ' ') { ++ ++num_extensions; ++ } ++ } while(ext[j++]); ++ ++ /* copy individual extensions to an array */ ++ extensions = malloc(num_extensions * sizeof *extensions); ++ if (!extensions) { ++ fprintf(stderr, "Error: malloc() failed\n"); ++ exit(1); ++ } ++ i = j = k = 0; ++ while (1) { ++ if (ext[j] == ' ' || ext[j] == 0) { ++ /* found end of an extension name */ ++ const int len = j - i; ++ ++ if (len) { ++ assert(k < num_extensions); ++ ++ extensions[k] = malloc(len + 1); ++ if (!extensions[k]) { ++ fprintf(stderr, "Error: malloc() failed\n"); ++ exit(1); ++ } ++ ++ memcpy(extensions[k], ext + i, len); ++ extensions[k][len] = 0; ++ ++ ++k; ++ }; ++ ++ i += len + 1; ++ ++ if (ext[j] == 0) { ++ break; ++ } ++ } ++ j++; ++ } ++ assert(k == num_extensions); ++ ++ /* sort extensions alphabetically */ ++ qsort(extensions, num_extensions, sizeof extensions[0], compare_string_ptr); ++ ++ /* print the extensions */ ++ width = indent; ++ printf("%s", indentString); ++ for (k = 0; k < num_extensions; ++k) { ++ const int len = strlen(extensions[k]); ++ if ((!singleLine) && (width + len > max)) { ++ /* start a new line */ ++ printf("\n"); ++ width = indent; ++ printf("%s", indentString); ++ } ++ /* print the extension name */ ++ printf("%s", extensions[k]); ++ ++ /* either we're all done, or we'll continue with next extension */ ++ width += len + 1; ++ ++ if (singleLine) { ++ printf("\n"); ++ width = indent; ++ printf("%s", indentString); ++ } ++ else if (k < (num_extensions -1)) { ++ printf(", "); ++ width += 2; ++ } ++ } ++ printf("\n"); ++ ++ for (k = 0; k < num_extensions; ++k) { ++ free(extensions[k]); ++ } ++ free(extensions); ++} ++ ++ ++ ++ ++/** ++ * Get list of OpenGL extensions using core profile's glGetStringi(). ++ */ ++char * ++build_core_profile_extension_list(const struct ext_functions *extfuncs) ++{ ++ GLint i, n, totalLen; ++ char *buffer; ++ ++ glGetIntegerv(GL_NUM_EXTENSIONS, &n); ++ ++ /* compute totalLen */ ++ totalLen = 0; ++ for (i = 0; i < n; i++) { ++ const char *ext = (const char *) extfuncs->GetStringi(GL_EXTENSIONS, i); ++ if (ext) ++ totalLen += strlen(ext) + 1; /* plus a space */ ++ } ++ ++ if (!totalLen) ++ return NULL; ++ ++ buffer = malloc(totalLen + 1); ++ if (buffer) { ++ int pos = 0; ++ for (i = 0; i < n; i++) { ++ const char *ext = (const char *) extfuncs->GetStringi(GL_EXTENSIONS, i); ++ strcpy(buffer + pos, ext); ++ pos += strlen(ext); ++ buffer[pos++] = ' '; ++ } ++ buffer[pos] = '\0'; ++ } ++ return buffer; ++} ++ ++ ++/** Is extension 'ext' supported? */ ++GLboolean ++extension_supported(const char *ext, const char *extensionsList) ++{ ++ while (1) { ++ const char *p = strstr(extensionsList, ext); ++ if (p) { ++ /* check that next char is a space or end of string */ ++ int extLen = strlen(ext); ++ if (p[extLen] == 0 || p[extLen] == ' ') { ++ return 1; ++ } ++ else { ++ /* We found a superset string, keep looking */ ++ extensionsList += extLen; ++ } ++ } ++ else { ++ break; ++ } ++ } ++ return 0; ++} ++ ++ ++/** ++ * Is verNum >= verString? ++ * \param verString such as "2.1", "3.0", etc. ++ * \param verNum such as 20, 21, 30, 31, 32, etc. ++ */ ++static GLboolean ++version_supported(const char *verString, int verNum) ++{ ++ int v; ++ ++ if (!verString || ++ !isdigit(verString[0]) || ++ verString[1] != '.' || ++ !isdigit(verString[2])) { ++ return GL_FALSE; ++ } ++ ++ v = (verString[0] - '0') * 10 + (verString[2] - '0'); ++ ++ return verNum >= v; ++} ++ ++ ++struct token_name ++{ ++ GLenum token; ++ const char *name; ++}; ++ ++ ++static void ++print_shader_limit_list(const struct token_name *lim) ++{ ++ GLint max[1]; ++ unsigned i; ++ ++ for (i = 0; lim[i].token; i++) { ++ glGetIntegerv(lim[i].token, max); ++ if (glGetError() == GL_NO_ERROR) { ++ printf(" %s = %d\n", lim[i].name, max[0]); ++ } ++ } ++} ++ ++ ++/** ++ * Print interesting limits for vertex/fragment shaders. ++ */ ++static void ++print_shader_limits(GLenum target) ++{ ++ static const struct token_name vertex_limits[] = { ++ { GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" }, ++ { GL_MAX_VARYING_FLOATS_ARB, "GL_MAX_VARYING_FLOATS_ARB" }, ++ { GL_MAX_VERTEX_ATTRIBS_ARB, "GL_MAX_VERTEX_ATTRIBS_ARB" }, ++ { GL_MAX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, ++ { GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" }, ++ { GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" }, ++ { GL_MAX_TEXTURE_COORDS_ARB, "GL_MAX_TEXTURE_COORDS_ARB" }, ++ { GL_MAX_VERTEX_OUTPUT_COMPONENTS , "GL_MAX_VERTEX_OUTPUT_COMPONENTS " }, ++ { (GLenum) 0, NULL } ++ }; ++ static const struct token_name fragment_limits[] = { ++ { GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" }, ++ { GL_MAX_TEXTURE_COORDS_ARB, "GL_MAX_TEXTURE_COORDS_ARB" }, ++ { GL_MAX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, ++ { GL_MAX_FRAGMENT_INPUT_COMPONENTS , "GL_MAX_FRAGMENT_INPUT_COMPONENTS " }, ++ { (GLenum) 0, NULL } ++ }; ++ static const struct token_name geometry_limits[] = { ++ { GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS" }, ++ { GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS" }, ++ { GL_MAX_GEOMETRY_OUTPUT_VERTICES , "GL_MAX_GEOMETRY_OUTPUT_VERTICES " }, ++ { GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS" }, ++ { GL_MAX_GEOMETRY_INPUT_COMPONENTS , "GL_MAX_GEOMETRY_INPUT_COMPONENTS " }, ++ { GL_MAX_GEOMETRY_OUTPUT_COMPONENTS, "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS" }, ++ { (GLenum) 0, NULL } ++ }; ++ ++ switch (target) { ++ case GL_VERTEX_SHADER: ++ printf(" GL_VERTEX_SHADER_ARB:\n"); ++ print_shader_limit_list(vertex_limits); ++ break; ++ ++ case GL_FRAGMENT_SHADER: ++ printf(" GL_FRAGMENT_SHADER_ARB:\n"); ++ print_shader_limit_list(fragment_limits); ++ break; ++ ++ case GL_GEOMETRY_SHADER: ++ printf(" GL_GEOMETRY_SHADER:\n"); ++ print_shader_limit_list(geometry_limits); ++ break; ++ } ++} ++ ++ ++/** ++ * Print interesting limits for vertex/fragment programs. ++ */ ++static void ++print_program_limits(GLenum target, ++ const struct ext_functions *extfuncs) ++{ ++#if defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program) ++ struct token_name { ++ GLenum token; ++ const char *name; ++ }; ++ static const struct token_name common_limits[] = { ++ { GL_MAX_PROGRAM_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_TEMPORARIES_ARB, "GL_MAX_PROGRAM_TEMPORARIES_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" }, ++ { GL_MAX_PROGRAM_PARAMETERS_ARB, "GL_MAX_PROGRAM_PARAMETERS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" }, ++ { GL_MAX_PROGRAM_ATTRIBS_ARB, "GL_MAX_PROGRAM_ATTRIBS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" }, ++ { GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, ++ { GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" }, ++ { GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" }, ++ { (GLenum) 0, NULL } ++ }; ++ static const struct token_name fragment_limits[] = { ++ { GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, ++ { GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, ++ { (GLenum) 0, NULL } ++ }; ++ ++ GLint max[1]; ++ int i; ++ ++ if (target == GL_VERTEX_PROGRAM_ARB) { ++ printf(" GL_VERTEX_PROGRAM_ARB:\n"); ++ } ++ else if (target == GL_FRAGMENT_PROGRAM_ARB) { ++ printf(" GL_FRAGMENT_PROGRAM_ARB:\n"); ++ } ++ else { ++ return; /* something's wrong */ ++ } ++ ++ for (i = 0; common_limits[i].token; i++) { ++ extfuncs->GetProgramivARB(target, common_limits[i].token, max); ++ if (glGetError() == GL_NO_ERROR) { ++ printf(" %s = %d\n", common_limits[i].name, max[0]); ++ } ++ } ++ if (target == GL_FRAGMENT_PROGRAM_ARB) { ++ for (i = 0; fragment_limits[i].token; i++) { ++ extfuncs->GetProgramivARB(target, fragment_limits[i].token, max); ++ if (glGetError() == GL_NO_ERROR) { ++ printf(" %s = %d\n", fragment_limits[i].name, max[0]); ++ } ++ } ++ } ++#endif /* GL_ARB_vertex_program / GL_ARB_fragment_program */ ++} ++ ++ ++/** ++ * Print interesting OpenGL implementation limits. ++ * \param version 20, 21, 30, 31, 32, etc. ++ */ ++void ++print_limits(const char *extensions, const char *oglstring, int version, ++ const struct ext_functions *extfuncs) ++{ ++ struct token_name { ++ GLuint count; ++ GLenum token; ++ const char *name; ++ const char *extension; /* NULL or GL extension name or version string */ ++ }; ++ static const struct token_name limits[] = { ++ { 1, GL_MAX_ATTRIB_STACK_DEPTH, "GL_MAX_ATTRIB_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_CLIP_PLANES, "GL_MAX_CLIP_PLANES", NULL }, ++ { 1, GL_MAX_COLOR_MATRIX_STACK_DEPTH, "GL_MAX_COLOR_MATRIX_STACK_DEPTH", "GL_ARB_imaging" }, ++ { 1, GL_MAX_ELEMENTS_VERTICES, "GL_MAX_ELEMENTS_VERTICES", NULL }, ++ { 1, GL_MAX_ELEMENTS_INDICES, "GL_MAX_ELEMENTS_INDICES", NULL }, ++ { 1, GL_MAX_EVAL_ORDER, "GL_MAX_EVAL_ORDER", NULL }, ++ { 1, GL_MAX_LIGHTS, "GL_MAX_LIGHTS", NULL }, ++ { 1, GL_MAX_LIST_NESTING, "GL_MAX_LIST_NESTING", NULL }, ++ { 1, GL_MAX_MODELVIEW_STACK_DEPTH, "GL_MAX_MODELVIEW_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_NAME_STACK_DEPTH, "GL_MAX_NAME_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_PIXEL_MAP_TABLE, "GL_MAX_PIXEL_MAP_TABLE", NULL }, ++ { 1, GL_MAX_PROJECTION_STACK_DEPTH, "GL_MAX_PROJECTION_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_TEXTURE_STACK_DEPTH, "GL_MAX_TEXTURE_STACK_DEPTH", NULL }, ++ { 1, GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE", NULL }, ++ { 1, GL_MAX_3D_TEXTURE_SIZE, "GL_MAX_3D_TEXTURE_SIZE", NULL }, ++#if defined(GL_EXT_texture_array) ++ { 1, GL_MAX_ARRAY_TEXTURE_LAYERS_EXT, "GL_MAX_ARRAY_TEXTURE_LAYERS", "GL_EXT_texture_array" }, ++#endif ++ { 2, GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS", NULL }, ++ { 2, GL_ALIASED_LINE_WIDTH_RANGE, "GL_ALIASED_LINE_WIDTH_RANGE", NULL }, ++ { 2, GL_SMOOTH_LINE_WIDTH_RANGE, "GL_SMOOTH_LINE_WIDTH_RANGE", NULL }, ++ { 2, GL_ALIASED_POINT_SIZE_RANGE, "GL_ALIASED_POINT_SIZE_RANGE", NULL }, ++ { 2, GL_SMOOTH_POINT_SIZE_RANGE, "GL_SMOOTH_POINT_SIZE_RANGE", NULL }, ++#if defined(GL_ARB_texture_cube_map) ++ { 1, GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, "GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB", "GL_ARB_texture_cube_map" }, ++#endif ++#if defined(GL_NV_texture_rectangle) ++ { 1, GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, "GL_MAX_RECTANGLE_TEXTURE_SIZE_NV", "GL_NV_texture_rectangle" }, ++#endif ++#if defined(GL_ARB_multitexture) ++ { 1, GL_MAX_TEXTURE_UNITS_ARB, "GL_MAX_TEXTURE_UNITS_ARB", "GL_ARB_multitexture" }, ++#endif ++#if defined(GL_EXT_texture_lod_bias) ++ { 1, GL_MAX_TEXTURE_LOD_BIAS_EXT, "GL_MAX_TEXTURE_LOD_BIAS_EXT", "GL_EXT_texture_lod_bias" }, ++#endif ++#if defined(GL_EXT_texture_filter_anisotropic) ++ { 1, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT", "GL_EXT_texture_filter_anisotropic" }, ++#endif ++#if defined(GL_ARB_draw_buffers) ++ { 1, GL_MAX_DRAW_BUFFERS_ARB, "GL_MAX_DRAW_BUFFERS_ARB", "GL_ARB_draw_buffers" }, ++#endif ++#if defined(GL_ARB_blend_func_extended) ++ { 1, GL_MAX_DUAL_SOURCE_DRAW_BUFFERS, "GL_MAX_DUAL_SOURCE_DRAW_BUFFERS", "GL_ARB_blend_func_extended" }, ++#endif ++#if defined (GL_ARB_framebuffer_object) ++ { 1, GL_MAX_RENDERBUFFER_SIZE, "GL_MAX_RENDERBUFFER_SIZE", "GL_ARB_framebuffer_object" }, ++ { 1, GL_MAX_COLOR_ATTACHMENTS, "GL_MAX_COLOR_ATTACHMENTS", "GL_ARB_framebuffer_object" }, ++ { 1, GL_MAX_SAMPLES, "GL_MAX_SAMPLES", "GL_ARB_framebuffer_object" }, ++#endif ++#if defined (GL_EXT_transform_feedback) ++ { 1, GL_MAX_TRANSFORM_FEEDBACK_BUFFERS, "GL_MAX_TRANSFORM_FEEDBACK_BUFFERS", "GL_EXT_transform_feedback" }, ++ { 1, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "GL_EXT_transform_feedback" }, ++ { 1, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "GL_EXT_transform_feedback", }, ++ { 1, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "GL_EXT_transform_feedback" }, ++#endif ++#if defined (GL_ARB_texture_buffer_object) ++ { 1, GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, "GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT", "GL_ARB_texture_buffer_object" }, ++ { 1, GL_MAX_TEXTURE_BUFFER_SIZE, "GL_MAX_TEXTURE_BUFFER_SIZE", "GL_ARB_texture_buffer_object" }, ++#endif ++#if defined (GL_ARB_texture_multisample) ++ { 1, GL_MAX_COLOR_TEXTURE_SAMPLES, "GL_MAX_COLOR_TEXTURE_SAMPLES", "GL_ARB_texture_multisample" }, ++ { 1, GL_MAX_DEPTH_TEXTURE_SAMPLES, "GL_MAX_DEPTH_TEXTURE_SAMPLES", "GL_ARB_texture_multisample" }, ++ { 1, GL_MAX_INTEGER_SAMPLES, "GL_MAX_INTEGER_SAMPLES", "GL_ARB_texture_multisample" }, ++#endif ++#if defined (GL_ARB_uniform_buffer_object) ++ { 1, GL_MAX_VERTEX_UNIFORM_BLOCKS, "GL_MAX_VERTEX_UNIFORM_BLOCKS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_FRAGMENT_UNIFORM_BLOCKS, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_GEOMETRY_UNIFORM_BLOCKS, "GL_MAX_GEOMETRY_UNIFORM_BLOCKS" , "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_COMBINED_UNIFORM_BLOCKS, "GL_MAX_COMBINED_UNIFORM_BLOCKS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_UNIFORM_BUFFER_BINDINGS, "GL_MAX_UNIFORM_BUFFER_BINDINGS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_UNIFORM_BLOCK_SIZE, "GL_MAX_UNIFORM_BLOCK_SIZE", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS", "GL_ARB_uniform_buffer_object" }, ++ { 1, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT", "GL_ARB_uniform_buffer_object" }, ++#endif ++#if defined (GL_ARB_vertex_attrib_binding) ++ { 1, GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET", "GL_ARB_vertex_attrib_binding" }, ++ { 1, GL_MAX_VERTEX_ATTRIB_BINDINGS, "GL_MAX_VERTEX_ATTRIB_BINDINGS", "GL_ARB_vertex_attrib_binding" }, ++#endif ++#if defined(GL_VERSION_4_4) ++ { 1, GL_MAX_VERTEX_ATTRIB_STRIDE, "GL_MAX_VERTEX_ATTRIB_STRIDE", "4.4" }, ++#endif ++ { 0, (GLenum) 0, NULL, NULL } ++ }; ++ GLint i, max[2]; ++ ++ printf("%s limits:\n", oglstring); ++ for (i = 0; limits[i].count; i++) { ++ if (!limits[i].extension || ++ version_supported(limits[i].extension, version) || ++ extension_supported(limits[i].extension, extensions)) { ++ glGetIntegerv(limits[i].token, max); ++ if (glGetError() == GL_NO_ERROR) { ++ if (limits[i].count == 1) ++ printf(" %s = %d\n", limits[i].name, max[0]); ++ else /* XXX fix if we ever query something with more than 2 values */ ++ printf(" %s = %d, %d\n", limits[i].name, max[0], max[1]); ++ } ++ } ++ } ++ ++ /* these don't fit into the above mechanism, unfortunately */ ++ if (extension_supported("GL_ARB_imaging", extensions)) { ++ extfuncs->GetConvolutionParameteriv(GL_CONVOLUTION_2D, ++ GL_MAX_CONVOLUTION_WIDTH, max); ++ extfuncs->GetConvolutionParameteriv(GL_CONVOLUTION_2D, ++ GL_MAX_CONVOLUTION_HEIGHT, max+1); ++ printf(" GL_MAX_CONVOLUTION_WIDTH/HEIGHT = %d, %d\n", max[0], max[1]); ++ } ++ ++ if (extension_supported("GL_ARB_texture_compression", extensions)) { ++ GLint i, n; ++ GLint *formats; ++ glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &n); ++ printf(" GL_NUM_COMPRESSED_TEXTURE_FORMATS = %d\n", n); ++ formats = (GLint *) malloc(n * sizeof(GLint)); ++ glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats); ++ for (i = 0; i < n; i++) { ++ printf(" %s\n", enum_name(formats[i])); ++ } ++ free(formats); ++ } ++#if defined(GL_ARB_vertex_program) ++ if (extension_supported("GL_ARB_vertex_program", extensions)) { ++ print_program_limits(GL_VERTEX_PROGRAM_ARB, extfuncs); ++ } ++#endif ++#if defined(GL_ARB_fragment_program) ++ if (extension_supported("GL_ARB_fragment_program", extensions)) { ++ print_program_limits(GL_FRAGMENT_PROGRAM_ARB, extfuncs); ++ } ++#endif ++ if (extension_supported("GL_ARB_vertex_shader", extensions)) { ++ print_shader_limits(GL_VERTEX_SHADER_ARB); ++ } ++ if (extension_supported("GL_ARB_fragment_shader", extensions)) { ++ print_shader_limits(GL_FRAGMENT_SHADER_ARB); ++ } ++ if (version >= 32) { ++ print_shader_limits(GL_GEOMETRY_SHADER); ++ } ++} ++ ++ ++ ++/** ++ * Return string representation for bits in a bitmask. ++ */ ++const char * ++bitmask_to_string(const struct bit_info bits[], int numBits, int mask) ++{ ++ static char buffer[256], *p; ++ int i; ++ ++ strcpy(buffer, "(none)"); ++ p = buffer; ++ for (i = 0; i < numBits; i++) { ++ if (mask & bits[i].bit) { ++ if (p > buffer) ++ *p++ = ','; ++ strcpy(p, bits[i].name); ++ p += strlen(bits[i].name); ++ } ++ } ++ ++ return buffer; ++} ++ ++/** ++ * Return string representation for the bitmask returned by ++ * GL_CONTEXT_PROFILE_MASK (OpenGL 3.2 or later). ++ */ ++const char * ++profile_mask_string(int mask) ++{ ++ const static struct bit_info bits[] = { ++#ifdef GL_CONTEXT_CORE_PROFILE_BIT ++ { GL_CONTEXT_CORE_PROFILE_BIT, "core profile"}, ++#endif ++#ifdef GL_CONTEXT_COMPATIBILITY_PROFILE_BIT ++ { GL_CONTEXT_COMPATIBILITY_PROFILE_BIT, "compatibility profile" } ++#endif ++ }; ++ ++ return bitmask_to_string(bits, ELEMENTS(bits), mask); ++} ++ ++ ++/** ++ * Return string representation for the bitmask returned by ++ * GL_CONTEXT_FLAGS (OpenGL 3.0 or later). ++ */ ++const char * ++context_flags_string(int mask) ++{ ++ const static struct bit_info bits[] = { ++#ifdef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT ++ { GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT, "forward-compatible" }, ++#endif ++#ifdef GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB ++ { GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB, "robust-access" }, ++#endif ++ }; ++ ++ return bitmask_to_string(bits, ELEMENTS(bits), mask); ++} ++ ++ ++static void ++usage(void) ++{ ++#ifdef _WIN32 ++ printf("Usage: wglinfo [-v] [-t] [-h] [-b] [-l] [-s]\n"); ++#else ++ printf("Usage: glxinfo [-v] [-t] [-h] [-b] [-l] [-s] [-i] [-display <dname>]\n"); ++ printf("\t-display <dname>: Print GLX visuals on specified server.\n"); ++ printf("\t-i: Force an indirect rendering context.\n"); ++#endif ++ printf("\t-B: brief output, print only the basics.\n"); ++ printf("\t-v: Print visuals info in verbose form.\n"); ++ printf("\t-t: Print verbose table.\n"); ++ printf("\t-h: This information.\n"); ++ printf("\t-b: Find the 'best' visual and print its number.\n"); ++ printf("\t-l: Print interesting OpenGL limits.\n"); ++ printf("\t-s: Print a single extension per line.\n"); ++} ++ ++void ++parse_args(int argc, char *argv[], struct options *options) ++{ ++ int i; ++ ++ options->mode = Normal; ++ options->findBest = GL_FALSE; ++ options->limits = GL_FALSE; ++ options->singleLine = GL_FALSE; ++ options->displayName = NULL; ++ options->allowDirect = GL_TRUE; ++ ++ for (i = 1; i < argc; i++) { ++#ifndef _WIN32 ++ if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) { ++ options->displayName = argv[i + 1]; ++ i++; ++ } ++ else if (strcmp(argv[i], "-i") == 0) { ++ options->allowDirect = GL_FALSE; ++ } ++ else ++#endif ++ if (strcmp(argv[i], "-t") == 0) { ++ options->mode = Wide; ++ } ++ else if (strcmp(argv[i], "-v") == 0) { ++ options->mode = Verbose; ++ } ++ else if (strcmp(argv[i], "-B") == 0) { ++ options->mode = Brief; ++ } ++ else if (strcmp(argv[i], "-b") == 0) { ++ options->findBest = GL_TRUE; ++ } ++ else if (strcmp(argv[i], "-l") == 0) { ++ options->limits = GL_TRUE; ++ } ++ else if (strcmp(argv[i], "-h") == 0) { ++ usage(); ++ exit(0); ++ } ++ else if(strcmp(argv[i], "-s") == 0) { ++ options->singleLine = GL_TRUE; ++ } ++ else { ++ printf("Unknown option `%s'\n", argv[i]); ++ usage(); ++ exit(0); ++ } ++ } ++} +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glinfo_common.h mesa-20.2.1/src/glx/xdemos/glinfo_common.h +--- mesa-20.2.1-orig/src/glx/xdemos/glinfo_common.h 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glinfo_common.h 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,142 @@ ++/* ++ * Copyright (C) 1999-2014 Brian Paul All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++ ++/** ++ * Common code shared by glxinfo and wglinfo. ++ */ ++ ++#ifndef GLINFO_COMMON_H ++#define GLINFO_COMMON_H ++ ++ ++#ifdef _WIN32 ++/* GL/glext.h is not commonly available on Windows. */ ++#include <GL/glew.h> ++#else ++#include <GL/gl.h> ++#include <GL/glext.h> ++#endif ++ ++typedef void (APIENTRY * GETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); ++typedef const GLubyte *(APIENTRY * GETSTRINGIPROC) (GLenum name, GLuint index); ++typedef void (APIENTRY * GETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); ++ ++ ++/** ++ * Ext functions needed in common code but must be provided by ++ * glxinfo or wglinfo. ++ */ ++struct ext_functions ++{ ++ GETPROGRAMIVARBPROC GetProgramivARB; ++ GETSTRINGIPROC GetStringi; ++ GETCONVOLUTIONPARAMETERIVPROC GetConvolutionParameteriv; ++}; ++ ++ ++#define ELEMENTS(array) (sizeof(array) / sizeof(array[0])) ++ ++ ++struct bit_info ++{ ++ int bit; ++ const char *name; ++}; ++ ++ ++typedef enum ++{ ++ Normal, ++ Wide, ++ Verbose, ++ Brief ++} InfoMode; ++ ++ ++struct options ++{ ++ InfoMode mode; ++ GLboolean findBest; ++ GLboolean limits; ++ GLboolean singleLine; ++ /* GLX only */ ++ char *displayName; ++ GLboolean allowDirect; ++}; ++ ++ ++/** list of known OpenGL versions */ ++static const struct { int major, minor; } gl_versions[] = { ++ {4, 5}, ++ {4, 4}, ++ {4, 3}, ++ {4, 2}, ++ {4, 1}, ++ {4, 0}, ++ ++ {3, 3}, ++ {3, 2}, ++ {3, 1}, ++ {3, 0}, ++ ++ {2, 1}, ++ {2, 0}, ++ ++ {1, 5}, ++ {1, 4}, ++ {1, 3}, ++ {1, 2}, ++ {1, 1}, ++ {1, 0}, ++ ++ {0, 0} /* end of list */ ++}; ++ ++ ++void ++print_extension_list(const char *ext, GLboolean singleLine); ++ ++char * ++build_core_profile_extension_list(const struct ext_functions *extfuncs); ++ ++GLboolean ++extension_supported(const char *ext, const char *extensionsList); ++ ++void ++print_limits(const char *extensions, const char *oglstring, int version, ++ const struct ext_functions *extfuncs); ++ ++const char * ++bitmask_to_string(const struct bit_info bits[], int numBits, int mask); ++ ++const char * ++profile_mask_string(int mask); ++ ++const char * ++context_flags_string(int mask); ++ ++ ++void ++parse_args(int argc, char *argv[], struct options *options); ++ ++ ++#endif /* GLINFO_COMMON_H */ +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glxgears.1 mesa-20.2.1/src/glx/xdemos/glxgears.1 +--- mesa-20.2.1-orig/src/glx/xdemos/glxgears.1 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glxgears.1 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,37 @@ ++.TH glxgears 1 "2006-11-29" ++.SH NAME ++glxgears \- ``gears'' demo for GLX ++.SH SYNOPSIS ++.B glxgears ++.RI [ options ] ++.SH DESCRIPTION ++The \fIglxgears\fP program is a port of the ``gears'' demo to GLX. It displays ++a set of rotating gears and prints out the frame rate at regular intervals. It ++has become quite popular as basic benchmarking tool. ++.SH OPTIONS ++.TP 8 ++.B \-display \fIdisplay\fP ++Specify which X display to run on. ++.TP 8 ++.B \-stereo ++Use a stereo enabled GLX visual. ++.TP 8 ++.B \-samples \fIN\fP ++Run in multisample mode with at least N samples. ++.TP 8 ++.B \-fullscreen ++Run in fullscreen mode. ++.TP 8 ++.B \-info ++Display OpenGL renderer information. ++.TP 8 ++.B \-geometry \fIWxH+X+Y\fP ++Window geometry. ++.SH AUTHOR ++glxgears was written by Brian Paul <brian.paul@tungstengraphics.com>. ++.PP ++This manual page was written by Thierry Reding <thierry@gilfi.de>, for the ++Debian project and updated by Fernando de Oliveira <famobr at yahoo dot ++com dot br>, for the Linux From Scratch (LFS) project (but may be used by ++others). ++ +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glxgears.c mesa-20.2.1/src/glx/xdemos/glxgears.c +--- mesa-20.2.1-orig/src/glx/xdemos/glxgears.c 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glxgears.c 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,809 @@ ++/* ++ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++/* ++ * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT) ++ * Port by Brian Paul 23 March 2001 ++ * ++ * See usage() below for command line options. ++ */ ++ ++ ++#include <math.h> ++#include <stdlib.h> ++#include <stdio.h> ++#include <string.h> ++#include <X11/Xlib.h> ++#include <X11/keysym.h> ++#include <GL/gl.h> ++#include <GL/glx.h> ++#include <GL/glxext.h> ++ ++#ifndef GLX_MESA_swap_control ++#define GLX_MESA_swap_control 1 ++typedef int (*PFNGLXGETSWAPINTERVALMESAPROC)(void); ++#endif ++ ++ ++#define BENCHMARK ++ ++#ifdef BENCHMARK ++ ++/* XXX this probably isn't very portable */ ++ ++#include <sys/time.h> ++#include <unistd.h> ++ ++/* return current time (in seconds) */ ++static double ++current_time(void) ++{ ++ struct timeval tv; ++#ifdef __VMS ++ (void) gettimeofday(&tv, NULL ); ++#else ++ struct timezone tz; ++ (void) gettimeofday(&tv, &tz); ++#endif ++ return (double) tv.tv_sec + tv.tv_usec / 1000000.0; ++} ++ ++#else /*BENCHMARK*/ ++ ++/* dummy */ ++static double ++current_time(void) ++{ ++ /* update this function for other platforms! */ ++ static double t = 0.0; ++ static int warn = 1; ++ if (warn) { ++ fprintf(stderr, "Warning: current_time() not implemented!!\n"); ++ warn = 0; ++ } ++ return t += 1.0; ++} ++ ++#endif /*BENCHMARK*/ ++ ++ ++ ++#ifndef M_PI ++#define M_PI 3.14159265 ++#endif ++ ++ ++/** Event handler results: */ ++#define NOP 0 ++#define EXIT 1 ++#define DRAW 2 ++ ++static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; ++static GLint gear1, gear2, gear3; ++static GLfloat angle = 0.0; ++ ++static GLboolean fullscreen = GL_FALSE; /* Create a single fullscreen window */ ++static GLboolean stereo = GL_FALSE; /* Enable stereo. */ ++static GLint samples = 0; /* Choose visual with at least N samples. */ ++static GLboolean animate = GL_TRUE; /* Animation */ ++static GLfloat eyesep = 5.0; /* Eye separation. */ ++static GLfloat fix_point = 40.0; /* Fixation point distance. */ ++static GLfloat left, right, asp; /* Stereo frustum params. */ ++ ++ ++/* ++ * ++ * Draw a gear wheel. You'll probably want to call this function when ++ * building a display list since we do a lot of trig here. ++ * ++ * Input: inner_radius - radius of hole at center ++ * outer_radius - radius at center of teeth ++ * width - width of gear ++ * teeth - number of teeth ++ * tooth_depth - depth of tooth ++ */ ++static void ++gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, ++ GLint teeth, GLfloat tooth_depth) ++{ ++ GLint i; ++ GLfloat r0, r1, r2; ++ GLfloat angle, da; ++ GLfloat u, v, len; ++ ++ r0 = inner_radius; ++ r1 = outer_radius - tooth_depth / 2.0; ++ r2 = outer_radius + tooth_depth / 2.0; ++ ++ da = 2.0 * M_PI / teeth / 4.0; ++ ++ glShadeModel(GL_FLAT); ++ ++ glNormal3f(0.0, 0.0, 1.0); ++ ++ /* draw front face */ ++ glBegin(GL_QUAD_STRIP); ++ for (i = 0; i <= teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); ++ if (i < teeth) { ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ width * 0.5); ++ } ++ } ++ glEnd(); ++ ++ /* draw front sides of teeth */ ++ glBegin(GL_QUADS); ++ da = 2.0 * M_PI / teeth / 4.0; ++ for (i = 0; i < teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); ++ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); ++ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), ++ width * 0.5); ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ width * 0.5); ++ } ++ glEnd(); ++ ++ glNormal3f(0.0, 0.0, -1.0); ++ ++ /* draw back face */ ++ glBegin(GL_QUAD_STRIP); ++ for (i = 0; i <= teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); ++ if (i < teeth) { ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ -width * 0.5); ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); ++ } ++ } ++ glEnd(); ++ ++ /* draw back sides of teeth */ ++ glBegin(GL_QUADS); ++ da = 2.0 * M_PI / teeth / 4.0; ++ for (i = 0; i < teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ -width * 0.5); ++ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), ++ -width * 0.5); ++ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); ++ } ++ glEnd(); ++ ++ /* draw outward faces of teeth */ ++ glBegin(GL_QUAD_STRIP); ++ for (i = 0; i < teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); ++ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); ++ u = r2 * cos(angle + da) - r1 * cos(angle); ++ v = r2 * sin(angle + da) - r1 * sin(angle); ++ len = sqrt(u * u + v * v); ++ u /= len; ++ v /= len; ++ glNormal3f(v, -u, 0.0); ++ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); ++ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); ++ glNormal3f(cos(angle), sin(angle), 0.0); ++ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), ++ width * 0.5); ++ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), ++ -width * 0.5); ++ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); ++ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); ++ glNormal3f(v, -u, 0.0); ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ width * 0.5); ++ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), ++ -width * 0.5); ++ glNormal3f(cos(angle), sin(angle), 0.0); ++ } ++ ++ glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); ++ glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); ++ ++ glEnd(); ++ ++ glShadeModel(GL_SMOOTH); ++ ++ /* draw inside radius cylinder */ ++ glBegin(GL_QUAD_STRIP); ++ for (i = 0; i <= teeth; i++) { ++ angle = i * 2.0 * M_PI / teeth; ++ glNormal3f(-cos(angle), -sin(angle), 0.0); ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); ++ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); ++ } ++ glEnd(); ++} ++ ++ ++static void ++draw(void) ++{ ++ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ++ ++ glPushMatrix(); ++ glRotatef(view_rotx, 1.0, 0.0, 0.0); ++ glRotatef(view_roty, 0.0, 1.0, 0.0); ++ glRotatef(view_rotz, 0.0, 0.0, 1.0); ++ ++ glPushMatrix(); ++ glTranslatef(-3.0, -2.0, 0.0); ++ glRotatef(angle, 0.0, 0.0, 1.0); ++ glCallList(gear1); ++ glPopMatrix(); ++ ++ glPushMatrix(); ++ glTranslatef(3.1, -2.0, 0.0); ++ glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0); ++ glCallList(gear2); ++ glPopMatrix(); ++ ++ glPushMatrix(); ++ glTranslatef(-3.1, 4.2, 0.0); ++ glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0); ++ glCallList(gear3); ++ glPopMatrix(); ++ ++ glPopMatrix(); ++} ++ ++ ++static void ++draw_gears(void) ++{ ++ if (stereo) { ++ /* First left eye. */ ++ glDrawBuffer(GL_BACK_LEFT); ++ ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ glFrustum(left, right, -asp, asp, 5.0, 60.0); ++ ++ glMatrixMode(GL_MODELVIEW); ++ ++ glPushMatrix(); ++ glTranslated(+0.5 * eyesep, 0.0, 0.0); ++ draw(); ++ glPopMatrix(); ++ ++ /* Then right eye. */ ++ glDrawBuffer(GL_BACK_RIGHT); ++ ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ glFrustum(-right, -left, -asp, asp, 5.0, 60.0); ++ ++ glMatrixMode(GL_MODELVIEW); ++ ++ glPushMatrix(); ++ glTranslated(-0.5 * eyesep, 0.0, 0.0); ++ draw(); ++ glPopMatrix(); ++ } ++ else { ++ draw(); ++ } ++} ++ ++ ++/** Draw single frame, do SwapBuffers, compute FPS */ ++static void ++draw_frame(Display *dpy, Window win) ++{ ++ static int frames = 0; ++ static double tRot0 = -1.0, tRate0 = -1.0; ++ double dt, t = current_time(); ++ ++ if (tRot0 < 0.0) ++ tRot0 = t; ++ dt = t - tRot0; ++ tRot0 = t; ++ ++ if (animate) { ++ /* advance rotation for next frame */ ++ angle += 70.0 * dt; /* 70 degrees per second */ ++ if (angle > 3600.0) ++ angle -= 3600.0; ++ } ++ ++ draw_gears(); ++ glXSwapBuffers(dpy, win); ++ ++ frames++; ++ ++ if (tRate0 < 0.0) ++ tRate0 = t; ++ if (t - tRate0 >= 5.0) { ++ GLfloat seconds = t - tRate0; ++ GLfloat fps = frames / seconds; ++ printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, ++ fps); ++ fflush(stdout); ++ tRate0 = t; ++ frames = 0; ++ } ++} ++ ++ ++/* new window size or exposure */ ++static void ++reshape(int width, int height) ++{ ++ glViewport(0, 0, (GLint) width, (GLint) height); ++ ++ if (stereo) { ++ GLfloat w; ++ ++ asp = (GLfloat) height / (GLfloat) width; ++ w = fix_point * (1.0 / 5.0); ++ ++ left = -5.0 * ((w - 0.5 * eyesep) / fix_point); ++ right = 5.0 * ((w + 0.5 * eyesep) / fix_point); ++ } ++ else { ++ GLfloat h = (GLfloat) height / (GLfloat) width; ++ ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); ++ } ++ ++ glMatrixMode(GL_MODELVIEW); ++ glLoadIdentity(); ++ glTranslatef(0.0, 0.0, -40.0); ++} ++ ++ ++ ++static void ++init(void) ++{ ++ static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; ++ static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; ++ static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; ++ static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; ++ ++ glLightfv(GL_LIGHT0, GL_POSITION, pos); ++ glEnable(GL_CULL_FACE); ++ glEnable(GL_LIGHTING); ++ glEnable(GL_LIGHT0); ++ glEnable(GL_DEPTH_TEST); ++ ++ /* make the gears */ ++ gear1 = glGenLists(1); ++ glNewList(gear1, GL_COMPILE); ++ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); ++ gear(1.0, 4.0, 1.0, 20, 0.7); ++ glEndList(); ++ ++ gear2 = glGenLists(1); ++ glNewList(gear2, GL_COMPILE); ++ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); ++ gear(0.5, 2.0, 2.0, 10, 0.7); ++ glEndList(); ++ ++ gear3 = glGenLists(1); ++ glNewList(gear3, GL_COMPILE); ++ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); ++ gear(1.3, 2.0, 0.5, 10, 0.7); ++ glEndList(); ++ ++ glEnable(GL_NORMALIZE); ++} ++ ++ ++/** ++ * Remove window border/decorations. ++ */ ++static void ++no_border( Display *dpy, Window w) ++{ ++ static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); ++ static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; ++ ++ typedef struct ++ { ++ unsigned long flags; ++ unsigned long functions; ++ unsigned long decorations; ++ long inputMode; ++ unsigned long status; ++ } PropMotifWmHints; ++ ++ PropMotifWmHints motif_hints; ++ Atom prop, proptype; ++ unsigned long flags = 0; ++ ++ /* setup the property */ ++ motif_hints.flags = MWM_HINTS_DECORATIONS; ++ motif_hints.decorations = flags; ++ ++ /* get the atom for the property */ ++ prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True ); ++ if (!prop) { ++ /* something went wrong! */ ++ return; ++ } ++ ++ /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ ++ proptype = prop; ++ ++ XChangeProperty( dpy, w, /* display, window */ ++ prop, proptype, /* property, type */ ++ 32, /* format: 32-bit datums */ ++ PropModeReplace, /* mode */ ++ (unsigned char *) &motif_hints, /* data */ ++ PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ ++ ); ++} ++ ++ ++/* ++ * Create an RGB, double-buffered window. ++ * Return the window and context handles. ++ */ ++static void ++make_window( Display *dpy, const char *name, ++ int x, int y, int width, int height, ++ Window *winRet, GLXContext *ctxRet, VisualID *visRet) ++{ ++ int attribs[64]; ++ int i = 0; ++ ++ int scrnum; ++ XSetWindowAttributes attr; ++ unsigned long mask; ++ Window root; ++ Window win; ++ GLXContext ctx; ++ XVisualInfo *visinfo; ++ ++ /* Singleton attributes. */ ++ attribs[i++] = GLX_RGBA; ++ attribs[i++] = GLX_DOUBLEBUFFER; ++ if (stereo) ++ attribs[i++] = GLX_STEREO; ++ ++ /* Key/value attributes. */ ++ attribs[i++] = GLX_RED_SIZE; ++ attribs[i++] = 1; ++ attribs[i++] = GLX_GREEN_SIZE; ++ attribs[i++] = 1; ++ attribs[i++] = GLX_BLUE_SIZE; ++ attribs[i++] = 1; ++ attribs[i++] = GLX_DEPTH_SIZE; ++ attribs[i++] = 1; ++ if (samples > 0) { ++ attribs[i++] = GLX_SAMPLE_BUFFERS; ++ attribs[i++] = 1; ++ attribs[i++] = GLX_SAMPLES; ++ attribs[i++] = samples; ++ } ++ ++ attribs[i++] = None; ++ ++ scrnum = DefaultScreen( dpy ); ++ root = RootWindow( dpy, scrnum ); ++ ++ visinfo = glXChooseVisual(dpy, scrnum, attribs); ++ if (!visinfo) { ++ printf("Error: couldn't get an RGB, Double-buffered"); ++ if (stereo) ++ printf(", Stereo"); ++ if (samples > 0) ++ printf(", Multisample"); ++ printf(" visual\n"); ++ exit(1); ++ } ++ ++ /* window attributes */ ++ attr.background_pixel = 0; ++ attr.border_pixel = 0; ++ attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); ++ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; ++ /* XXX this is a bad way to get a borderless window! */ ++ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; ++ ++ win = XCreateWindow( dpy, root, x, y, width, height, ++ 0, visinfo->depth, InputOutput, ++ visinfo->visual, mask, &attr ); ++ ++ if (fullscreen) ++ no_border(dpy, win); ++ ++ /* set hints and properties */ ++ { ++ XSizeHints sizehints; ++ sizehints.x = x; ++ sizehints.y = y; ++ sizehints.width = width; ++ sizehints.height = height; ++ sizehints.flags = USSize | USPosition; ++ XSetNormalHints(dpy, win, &sizehints); ++ XSetStandardProperties(dpy, win, name, name, ++ None, (char **)NULL, 0, &sizehints); ++ } ++ ++ ctx = glXCreateContext( dpy, visinfo, NULL, True ); ++ if (!ctx) { ++ printf("Error: glXCreateContext failed\n"); ++ exit(1); ++ } ++ ++ *winRet = win; ++ *ctxRet = ctx; ++ *visRet = visinfo->visualid; ++ ++ XFree(visinfo); ++} ++ ++ ++/** ++ * Determine whether or not a GLX extension is supported. ++ */ ++static int ++is_glx_extension_supported(Display *dpy, const char *query) ++{ ++ const int scrnum = DefaultScreen(dpy); ++ const char *glx_extensions = NULL; ++ const size_t len = strlen(query); ++ const char *ptr; ++ ++ if (glx_extensions == NULL) { ++ glx_extensions = glXQueryExtensionsString(dpy, scrnum); ++ } ++ ++ ptr = strstr(glx_extensions, query); ++ return ((ptr != NULL) && ((ptr[len] == ' ') || (ptr[len] == '\0'))); ++} ++ ++ ++/** ++ * Attempt to determine whether or not the display is synched to vblank. ++ */ ++static void ++query_vsync(Display *dpy, GLXDrawable drawable) ++{ ++ int interval = 0; ++ ++#if defined(GLX_EXT_swap_control) ++ if (is_glx_extension_supported(dpy, "GLX_EXT_swap_control")) { ++ unsigned int tmp = -1; ++ glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &tmp); ++ interval = tmp; ++ } else ++#endif ++ if (is_glx_extension_supported(dpy, "GLX_MESA_swap_control")) { ++ PFNGLXGETSWAPINTERVALMESAPROC pglXGetSwapIntervalMESA = ++ (PFNGLXGETSWAPINTERVALMESAPROC) ++ glXGetProcAddressARB((const GLubyte *) "glXGetSwapIntervalMESA"); ++ ++ interval = (*pglXGetSwapIntervalMESA)(); ++ } else if (is_glx_extension_supported(dpy, "GLX_SGI_swap_control")) { ++ /* The default swap interval with this extension is 1. Assume that it ++ * is set to the default. ++ * ++ * Many Mesa-based drivers default to 0, but all of these drivers also ++ * export GLX_MESA_swap_control. In that case, this branch will never ++ * be taken, and the correct result should be reported. ++ */ ++ interval = 1; ++ } ++ ++ ++ if (interval > 0) { ++ printf("Running synchronized to the vertical refresh. The framerate should be\n"); ++ if (interval == 1) { ++ printf("approximately the same as the monitor refresh rate.\n"); ++ } else if (interval > 1) { ++ printf("approximately 1/%d the monitor refresh rate.\n", ++ interval); ++ } ++ } ++} ++ ++/** ++ * Handle one X event. ++ * \return NOP, EXIT or DRAW ++ */ ++static int ++handle_event(Display *dpy, Window win, XEvent *event) ++{ ++ (void) dpy; ++ (void) win; ++ ++ switch (event->type) { ++ case Expose: ++ return DRAW; ++ case ConfigureNotify: ++ reshape(event->xconfigure.width, event->xconfigure.height); ++ break; ++ case KeyPress: ++ { ++ char buffer[10]; ++ int code; ++ code = XLookupKeysym(&event->xkey, 0); ++ if (code == XK_Left) { ++ view_roty += 5.0; ++ } ++ else if (code == XK_Right) { ++ view_roty -= 5.0; ++ } ++ else if (code == XK_Up) { ++ view_rotx += 5.0; ++ } ++ else if (code == XK_Down) { ++ view_rotx -= 5.0; ++ } ++ else { ++ XLookupString(&event->xkey, buffer, sizeof(buffer), ++ NULL, NULL); ++ if (buffer[0] == 27) { ++ /* escape */ ++ return EXIT; ++ } ++ else if (buffer[0] == 'a' || buffer[0] == 'A') { ++ animate = !animate; ++ } ++ } ++ return DRAW; ++ } ++ } ++ return NOP; ++} ++ ++ ++static void ++event_loop(Display *dpy, Window win) ++{ ++ while (1) { ++ int op; ++ while (!animate || XPending(dpy) > 0) { ++ XEvent event; ++ XNextEvent(dpy, &event); ++ op = handle_event(dpy, win, &event); ++ if (op == EXIT) ++ return; ++ else if (op == DRAW) ++ break; ++ } ++ ++ draw_frame(dpy, win); ++ } ++} ++ ++ ++static void ++usage(void) ++{ ++ printf("Usage:\n"); ++ printf(" -display <displayname> set the display to run on\n"); ++ printf(" -stereo run in stereo mode\n"); ++ printf(" -samples N run in multisample mode with at least N samples\n"); ++ printf(" -fullscreen run in fullscreen mode\n"); ++ printf(" -info display OpenGL renderer info\n"); ++ printf(" -geometry WxH+X+Y window geometry\n"); ++} ++ ++ ++int ++main(int argc, char *argv[]) ++{ ++ unsigned int winWidth = 300, winHeight = 300; ++ int x = 0, y = 0; ++ Display *dpy; ++ Window win; ++ GLXContext ctx; ++ char *dpyName = NULL; ++ GLboolean printInfo = GL_FALSE; ++ VisualID visId; ++ int i; ++ ++ for (i = 1; i < argc; i++) { ++ if (strcmp(argv[i], "-display") == 0) { ++ dpyName = argv[i+1]; ++ i++; ++ } ++ else if (strcmp(argv[i], "-info") == 0) { ++ printInfo = GL_TRUE; ++ } ++ else if (strcmp(argv[i], "-stereo") == 0) { ++ stereo = GL_TRUE; ++ } ++ else if (i < argc-1 && strcmp(argv[i], "-samples") == 0) { ++ samples = strtod(argv[i+1], NULL ); ++ ++i; ++ } ++ else if (strcmp(argv[i], "-fullscreen") == 0) { ++ fullscreen = GL_TRUE; ++ } ++ else if (i < argc-1 && strcmp(argv[i], "-geometry") == 0) { ++ XParseGeometry(argv[i+1], &x, &y, &winWidth, &winHeight); ++ i++; ++ } ++ else { ++ usage(); ++ return -1; ++ } ++ } ++ ++ dpy = XOpenDisplay(dpyName); ++ if (!dpy) { ++ printf("Error: couldn't open display %s\n", ++ dpyName ? dpyName : getenv("DISPLAY")); ++ return -1; ++ } ++ ++ if (fullscreen) { ++ int scrnum = DefaultScreen(dpy); ++ ++ x = 0; y = 0; ++ winWidth = DisplayWidth(dpy, scrnum); ++ winHeight = DisplayHeight(dpy, scrnum); ++ } ++ ++ make_window(dpy, "glxgears", x, y, winWidth, winHeight, &win, &ctx, &visId); ++ XMapWindow(dpy, win); ++ glXMakeCurrent(dpy, win, ctx); ++ query_vsync(dpy, win); ++ ++ if (printInfo) { ++ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); ++ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); ++ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); ++ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); ++ printf("VisualID %d, 0x%x\n", (int) visId, (int) visId); ++ } ++ ++ init(); ++ ++ /* Set initial projection/viewing transformation. ++ * We can't be sure we'll get a ConfigureNotify event when the window ++ * first appears. ++ */ ++ reshape(winWidth, winHeight); ++ ++ event_loop(dpy, win); ++ ++ glDeleteLists(gear1, 1); ++ glDeleteLists(gear2, 1); ++ glDeleteLists(gear3, 1); ++ glXMakeCurrent(dpy, None, NULL); ++ glXDestroyContext(dpy, ctx); ++ XDestroyWindow(dpy, win); ++ XCloseDisplay(dpy); ++ ++ return 0; ++} +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glxinfo.1 mesa-20.2.1/src/glx/xdemos/glxinfo.1 +--- mesa-20.2.1-orig/src/glx/xdemos/glxinfo.1 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glxinfo.1 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,46 @@ ++.TH glxinfo 1 "2006-11-29" ++.SH NAME ++glxinfo \- show information about the GLX implementation ++.SH SYNOPSIS ++.B glxinfo ++.RI [ options ] ++.SH DESCRIPTION ++The \fIglxinfo\fP program shows information about the OpenGL and GLX ++implementations running on a given X display. ++.PP ++The information includes details about the server- and client-side GLX ++implementation, the OpenGL and GLU implementations as well as a list ++of available GLX visuals. ++.SH OPTIONS ++.TP 8 ++.B \-v ++Print visuals info in verbose form. ++.TP 8 ++.B \-t ++Print verbose table. ++.TP 8 ++.B \-display \fIdisplay\fP ++Specify the X display to interrogate. ++.TP 8 ++.B \-h ++Print usage information. ++.TP 8 ++.B \-i ++Force an indirect rendering context. ++.TP 8 ++.B \-b ++Find the "best" visual and print its number. ++.TP 8 ++.B \-l ++Print interesting OpenGL limits. ++.TP 8 ++.B \-s ++Print a single extension per line. ++.SH AUTHOR ++glxinfo was written by Brian Paul <brian.paul@tungstengraphics.com>. ++.PP ++This manual page was written by Thierry Reding <thierry@gilfi.de>, for the ++Debian project and updated by Fernando de Oliveira <famobr at yahoo dot ++com dot br>, for the Linux From Scratch (LFS) project (but may be used by ++others). ++ +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/glxinfo.c mesa-20.2.1/src/glx/xdemos/glxinfo.c +--- mesa-20.2.1-orig/src/glx/xdemos/glxinfo.c 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/glxinfo.c 2020-10-15 23:06:45.826695773 -0500 +@@ -0,0 +1,1281 @@ ++/* ++ * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included ++ * in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN ++ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++ ++/* ++ * This program is a work-alike of the IRIX glxinfo program. ++ * Command line options: ++ * -t print wide table ++ * -v print verbose information ++ * -display DisplayName specify the X display to interogate ++ * -B brief, print only the basics ++ * -b only print ID of "best" visual on screen 0 ++ * -i use indirect rendering connection only ++ * -l print interesting OpenGL limits (added 5 Sep 2002) ++ * ++ * Brian Paul 26 January 2000 ++ */ ++ ++#define GLX_GLXEXT_PROTOTYPES ++#define GL_GLEXT_PROTOTYPES ++ ++#include <assert.h> ++#include <X11/Xlib.h> ++#include <X11/Xutil.h> ++#include <GL/gl.h> ++#include <GL/glx.h> ++#include <stdio.h> ++#include <string.h> ++#include <stdlib.h> ++#include "glinfo_common.h" ++ ++ ++#ifndef GLX_NONE_EXT ++#define GLX_NONE_EXT 0x8000 ++#endif ++ ++#ifndef GLX_TRANSPARENT_RGB ++#define GLX_TRANSPARENT_RGB 0x8008 ++#endif ++ ++#ifndef GLX_RGBA_BIT ++#define GLX_RGBA_BIT 0x00000001 ++#endif ++ ++#ifndef GLX_COLOR_INDEX_BIT ++#define GLX_COLOR_INDEX_BIT 0x00000002 ++#endif ++ ++ ++struct visual_attribs ++{ ++ /* X visual attribs */ ++ int id; /* May be visual ID or FBConfig ID */ ++ int vis_id; /* Visual ID. Only set for FBConfigs */ ++ int klass; ++ int depth; ++ int redMask, greenMask, blueMask; ++ int colormapSize; ++ int bitsPerRGB; ++ ++ /* GL visual attribs */ ++ int supportsGL; ++ int drawableType; ++ int transparentType; ++ int transparentRedValue; ++ int transparentGreenValue; ++ int transparentBlueValue; ++ int transparentAlphaValue; ++ int transparentIndexValue; ++ int bufferSize; ++ int level; ++ int render_type; ++ int doubleBuffer; ++ int stereo; ++ int auxBuffers; ++ int redSize, greenSize, blueSize, alphaSize; ++ int depthSize; ++ int stencilSize; ++ int accumRedSize, accumGreenSize, accumBlueSize, accumAlphaSize; ++ int numSamples, numMultisample; ++ int visualCaveat; ++ int floatComponents; ++ int packedfloatComponents; ++ int srgb; ++}; ++ ++ ++/** ++ * Version of the context that was created ++ * ++ * 20, 21, 30, 31, 32, etc. ++ */ ++static int version; ++ ++/** ++ * GL Error checking/warning. ++ */ ++static void ++CheckError(int line) ++{ ++ int n; ++ n = glGetError(); ++ if (n) ++ printf("Warning: GL error 0x%x at line %d\n", n, line); ++} ++ ++ ++static void ++print_display_info(Display *dpy) ++{ ++ printf("name of display: %s\n", DisplayString(dpy)); ++} ++ ++ ++/** ++ * Choose a simple FB Config. ++ */ ++static GLXFBConfig * ++choose_fb_config(Display *dpy, int scrnum) ++{ ++ int fbAttribSingle[] = { ++ GLX_RENDER_TYPE, GLX_RGBA_BIT, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ GLX_DOUBLEBUFFER, False, ++ None }; ++ int fbAttribDouble[] = { ++ GLX_RENDER_TYPE, GLX_RGBA_BIT, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ GLX_DOUBLEBUFFER, True, ++ None }; ++ GLXFBConfig *configs; ++ int nConfigs; ++ ++ configs = glXChooseFBConfig(dpy, scrnum, fbAttribSingle, &nConfigs); ++ if (!configs) ++ configs = glXChooseFBConfig(dpy, scrnum, fbAttribDouble, &nConfigs); ++ ++ return configs; ++} ++ ++ ++static Bool CreateContextErrorFlag; ++ ++static int ++create_context_error_handler(Display *dpy, XErrorEvent *error) ++{ ++ (void) dpy; ++ (void) error->error_code; ++ CreateContextErrorFlag = True; ++ return 0; ++} ++ ++ ++/** ++ * Try to create a GLX context of the given version with flags/options. ++ * Note: A version number is required in order to get a core profile ++ * (at least w/ NVIDIA). ++ */ ++static GLXContext ++create_context_flags(Display *dpy, GLXFBConfig fbconfig, int major, int minor, ++ int contextFlags, int profileMask, Bool direct) ++{ ++#ifdef GLX_ARB_create_context ++ static PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB_func = 0; ++ static Bool firstCall = True; ++ int (*old_handler)(Display *, XErrorEvent *); ++ GLXContext context; ++ int attribs[20]; ++ int n = 0; ++ ++ if (firstCall) { ++ /* See if we have GLX_ARB_create_context_profile and get pointer to ++ * glXCreateContextAttribsARB() function. ++ */ ++ const char *glxExt = glXQueryExtensionsString(dpy, 0); ++ if (extension_supported("GLX_ARB_create_context_profile", glxExt)) { ++ glXCreateContextAttribsARB_func = (PFNGLXCREATECONTEXTATTRIBSARBPROC) ++ glXGetProcAddress((const GLubyte *) "glXCreateContextAttribsARB"); ++ } ++ firstCall = False; ++ } ++ ++ if (!glXCreateContextAttribsARB_func) ++ return 0; ++ ++ /* setup attribute array */ ++ if (major) { ++ attribs[n++] = GLX_CONTEXT_MAJOR_VERSION_ARB; ++ attribs[n++] = major; ++ attribs[n++] = GLX_CONTEXT_MINOR_VERSION_ARB; ++ attribs[n++] = minor; ++ } ++ if (contextFlags) { ++ attribs[n++] = GLX_CONTEXT_FLAGS_ARB; ++ attribs[n++] = contextFlags; ++ } ++#ifdef GLX_ARB_create_context_profile ++ if (profileMask) { ++ attribs[n++] = GLX_CONTEXT_PROFILE_MASK_ARB; ++ attribs[n++] = profileMask; ++ } ++#endif ++ attribs[n++] = 0; ++ ++ /* install X error handler */ ++ old_handler = XSetErrorHandler(create_context_error_handler); ++ CreateContextErrorFlag = False; ++ ++ /* try creating context */ ++ context = glXCreateContextAttribsARB_func(dpy, ++ fbconfig, ++ 0, /* share_context */ ++ direct, ++ attribs); ++ ++ /* restore error handler */ ++ XSetErrorHandler(old_handler); ++ ++ if (CreateContextErrorFlag) ++ context = 0; ++ ++ if (context && direct) { ++ if (!glXIsDirect(dpy, context)) { ++ glXDestroyContext(dpy, context); ++ return 0; ++ } ++ } ++ ++ return context; ++#else ++ return 0; ++#endif ++} ++ ++ ++/** ++ * Try to create a GLX context of the newest version. ++ */ ++static GLXContext ++create_context_with_config(Display *dpy, GLXFBConfig config, ++ Bool coreProfile, Bool es2Profile, Bool direct) ++{ ++ GLXContext ctx = 0; ++ ++ if (coreProfile) { ++ /* Try to create a core profile, starting with the newest version of ++ * GL that we're aware of. If we don't specify the version ++ */ ++ int i; ++ for (i = 0; gl_versions[i].major > 0; i++) { ++ /* don't bother below GL 3.0 */ ++ if (gl_versions[i].major == 3 && ++ gl_versions[i].minor == 0) ++ return 0; ++ ctx = create_context_flags(dpy, config, ++ gl_versions[i].major, ++ gl_versions[i].minor, ++ 0x0, ++ GLX_CONTEXT_CORE_PROFILE_BIT_ARB, ++ direct); ++ if (ctx) ++ return ctx; ++ } ++ /* couldn't get core profile context */ ++ return 0; ++ } ++ ++ if (es2Profile) { ++#ifdef GLX_CONTEXT_ES2_PROFILE_BIT_EXT ++ if (extension_supported("GLX_EXT_create_context_es2_profile", ++ glXQueryExtensionsString(dpy, 0))) { ++ ctx = create_context_flags(dpy, config, 2, 0, 0x0, ++ GLX_CONTEXT_ES2_PROFILE_BIT_EXT, ++ direct); ++ return ctx; ++ } ++#endif ++ return 0; ++ } ++ ++ /* GLX should return a context of the latest GL version that supports ++ * the full profile. ++ */ ++ ctx = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, direct); ++ ++ /* make sure the context is direct, if direct was requested */ ++ if (ctx && direct) { ++ if (!glXIsDirect(dpy, ctx)) { ++ glXDestroyContext(dpy, ctx); ++ return 0; ++ } ++ } ++ ++ return ctx; ++} ++ ++ ++static XVisualInfo * ++choose_xvisinfo(Display *dpy, int scrnum) ++{ ++ int attribSingle[] = { ++ GLX_RGBA, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ None }; ++ int attribDouble[] = { ++ GLX_RGBA, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ GLX_DOUBLEBUFFER, ++ None }; ++ XVisualInfo *visinfo; ++ ++ visinfo = glXChooseVisual(dpy, scrnum, attribSingle); ++ if (!visinfo) ++ visinfo = glXChooseVisual(dpy, scrnum, attribDouble); ++ ++ return visinfo; ++} ++ ++ ++static void ++query_renderer(void) ++{ ++#ifdef GLX_MESA_query_renderer ++ PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger; ++ PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC queryString; ++ unsigned int v[3]; ++ ++ queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) ++ glXGetProcAddressARB((const GLubyte *) ++ "glXQueryCurrentRendererIntegerMESA"); ++ queryString = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) ++ glXGetProcAddressARB((const GLubyte *) ++ "glXQueryCurrentRendererStringMESA"); ++ ++ printf("Extended renderer info (GLX_MESA_query_renderer):\n"); ++ queryInteger(GLX_RENDERER_VENDOR_ID_MESA, v); ++ printf(" Vendor: %s (0x%x)\n", ++ queryString(GLX_RENDERER_VENDOR_ID_MESA), *v); ++ queryInteger(GLX_RENDERER_DEVICE_ID_MESA, v); ++ printf(" Device: %s (0x%x)\n", ++ queryString(GLX_RENDERER_DEVICE_ID_MESA), *v); ++ queryInteger(GLX_RENDERER_VERSION_MESA, v); ++ printf(" Version: %d.%d.%d\n", v[0], v[1], v[2]); ++ queryInteger(GLX_RENDERER_ACCELERATED_MESA, v); ++ printf(" Accelerated: %s\n", *v ? "yes" : "no"); ++ queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, v); ++ printf(" Video memory: %dMB\n", *v); ++ queryInteger(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA, v); ++ printf(" Unified memory: %s\n", *v ? "yes" : "no"); ++ queryInteger(GLX_RENDERER_PREFERRED_PROFILE_MESA, v); ++ printf(" Preferred profile: %s (0x%x)\n", ++ *v == GLX_CONTEXT_CORE_PROFILE_BIT_ARB ? "core" : ++ *v == GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ? "compat" : ++ "unknown", *v); ++ queryInteger(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA, v); ++ printf(" Max core profile version: %d.%d\n", v[0], v[1]); ++ queryInteger(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA, v); ++ printf(" Max compat profile version: %d.%d\n", v[0], v[1]); ++ queryInteger(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA, v); ++ printf(" Max GLES1 profile version: %d.%d\n", v[0], v[1]); ++ queryInteger(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA, v); ++ printf(" Max GLES[23] profile version: %d.%d\n", v[0], v[1]); ++#endif ++} ++ ++ ++static Bool ++print_screen_info(Display *dpy, int scrnum, ++ const struct options *opts, ++ Bool coreProfile, Bool es2Profile, Bool limits, ++ Bool coreWorked) ++{ ++ Window win; ++ XSetWindowAttributes attr; ++ unsigned long mask; ++ Window root; ++ GLXContext ctx = NULL; ++ XVisualInfo *visinfo; ++ int width = 100, height = 100; ++ GLXFBConfig *fbconfigs; ++ const char *oglstring = coreProfile ? "OpenGL core profile" : ++ es2Profile ? "OpenGL ES profile" : "OpenGL"; ++ ++ root = RootWindow(dpy, scrnum); ++ ++ /* ++ * Choose FBConfig or XVisualInfo and create a context. ++ */ ++ fbconfigs = choose_fb_config(dpy, scrnum); ++ if (fbconfigs) { ++ ctx = create_context_with_config(dpy, fbconfigs[0], ++ coreProfile, es2Profile, ++ opts->allowDirect); ++ if (!ctx && opts->allowDirect && !coreProfile) { ++ /* try indirect */ ++ ctx = create_context_with_config(dpy, fbconfigs[0], ++ coreProfile, es2Profile, False); ++ } ++ ++ visinfo = glXGetVisualFromFBConfig(dpy, fbconfigs[0]); ++ XFree(fbconfigs); ++ } ++ else if (!coreProfile && !es2Profile) { ++ visinfo = choose_xvisinfo(dpy, scrnum); ++ if (visinfo) ++ ctx = glXCreateContext(dpy, visinfo, NULL, opts->allowDirect); ++ } else ++ visinfo = NULL; ++ ++ if (!visinfo && !coreProfile && !es2Profile) { ++ fprintf(stderr, "Error: couldn't find RGB GLX visual or fbconfig\n"); ++ return False; ++ } ++ ++ if (!ctx) { ++ if (!coreProfile && !es2Profile) ++ fprintf(stderr, "Error: glXCreateContext failed\n"); ++ XFree(visinfo); ++ return False; ++ } ++ ++ /* ++ * Create a window so that we can just bind the context. ++ */ ++ attr.background_pixel = 0; ++ attr.border_pixel = 0; ++ attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); ++ attr.event_mask = StructureNotifyMask | ExposureMask; ++ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; ++ win = XCreateWindow(dpy, root, 0, 0, width, height, ++ 0, visinfo->depth, InputOutput, ++ visinfo->visual, mask, &attr); ++ ++ if (glXMakeCurrent(dpy, win, ctx)) { ++ const char *serverVendor = glXQueryServerString(dpy, scrnum, GLX_VENDOR); ++ const char *serverVersion = glXQueryServerString(dpy, scrnum, GLX_VERSION); ++ const char *serverExtensions = glXQueryServerString(dpy, scrnum, GLX_EXTENSIONS); ++ const char *clientVendor = glXGetClientString(dpy, GLX_VENDOR); ++ const char *clientVersion = glXGetClientString(dpy, GLX_VERSION); ++ const char *clientExtensions = glXGetClientString(dpy, GLX_EXTENSIONS); ++ const char *glxExtensions = glXQueryExtensionsString(dpy, scrnum); ++ const char *glVendor = (const char *) glGetString(GL_VENDOR); ++ const char *glRenderer = (const char *) glGetString(GL_RENDERER); ++ const char *glVersion = (const char *) glGetString(GL_VERSION); ++ char *glExtensions = NULL; ++ int glxVersionMajor = 0; ++ int glxVersionMinor = 0; ++ char *displayName = NULL; ++ char *colon = NULL, *period = NULL; ++ struct ext_functions extfuncs; ++ ++ CheckError(__LINE__); ++ ++ /* Get some ext functions */ ++ extfuncs.GetProgramivARB = (GETPROGRAMIVARBPROC) ++ glXGetProcAddressARB((GLubyte *) "glGetProgramivARB"); ++ extfuncs.GetStringi = (GETSTRINGIPROC) ++ glXGetProcAddressARB((GLubyte *) "glGetStringi"); ++ extfuncs.GetConvolutionParameteriv = (GETCONVOLUTIONPARAMETERIVPROC) ++ glXGetProcAddressARB((GLubyte *) "glGetConvolutionParameteriv"); ++ ++ if (!glXQueryVersion(dpy, & glxVersionMajor, & glxVersionMinor)) { ++ fprintf(stderr, "Error: glXQueryVersion failed\n"); ++ exit(1); ++ } ++ ++ /* Get list of GL extensions */ ++ if (coreProfile && extfuncs.GetStringi) ++ glExtensions = build_core_profile_extension_list(&extfuncs); ++ if (!glExtensions) { ++ coreProfile = False; ++ glExtensions = (char *) glGetString(GL_EXTENSIONS); ++ } ++ ++ CheckError(__LINE__); ++ ++ if (!coreWorked) { ++ /* Strip the screen number from the display name, if present. */ ++ if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) + 1))) { ++ fprintf(stderr, "Error: malloc() failed\n"); ++ exit(1); ++ } ++ strcpy(displayName, DisplayString(dpy)); ++ colon = strrchr(displayName, ':'); ++ if (colon) { ++ period = strchr(colon, '.'); ++ if (period) ++ *period = '\0'; ++ } ++ ++ printf("display: %s screen: %d\n", displayName, scrnum); ++ free(displayName); ++ printf("direct rendering: "); ++ if (glXIsDirect(dpy, ctx)) { ++ printf("Yes\n"); ++ } ++ else { ++ if (!opts->allowDirect) { ++ printf("No (-i specified)\n"); ++ } ++ else if (getenv("LIBGL_ALWAYS_INDIRECT")) { ++ printf("No (LIBGL_ALWAYS_INDIRECT set)\n"); ++ } ++ else { ++ printf("No (If you want to find out why, try setting " ++ "LIBGL_DEBUG=verbose)\n"); ++ } ++ } ++ if (opts->mode != Brief) { ++ printf("server glx vendor string: %s\n", serverVendor); ++ printf("server glx version string: %s\n", serverVersion); ++ printf("server glx extensions:\n"); ++ print_extension_list(serverExtensions, opts->singleLine); ++ printf("client glx vendor string: %s\n", clientVendor); ++ printf("client glx version string: %s\n", clientVersion); ++ printf("client glx extensions:\n"); ++ print_extension_list(clientExtensions, opts->singleLine); ++ printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor); ++ printf("GLX extensions:\n"); ++ print_extension_list(glxExtensions, opts->singleLine); ++ } ++ if (strstr(glxExtensions, "GLX_MESA_query_renderer")) ++ query_renderer(); ++ printf("OpenGL vendor string: %s\n", glVendor); ++ printf("OpenGL renderer string: %s\n", glRenderer); ++ } else ++ printf("\n"); ++ ++ printf("%s version string: %s\n", oglstring, glVersion); ++ ++ version = (glVersion[0] - '0') * 10 + (glVersion[2] - '0'); ++ ++ CheckError(__LINE__); ++ ++#ifdef GL_VERSION_2_0 ++ if (version >= 20) { ++ char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION); ++ printf("%s shading language version string: %s\n", oglstring, v); ++ } ++#endif ++ CheckError(__LINE__); ++#ifdef GL_VERSION_3_0 ++ if (version >= 30 && !es2Profile) { ++ GLint flags; ++ glGetIntegerv(GL_CONTEXT_FLAGS, &flags); ++ printf("%s context flags: %s\n", oglstring, context_flags_string(flags)); ++ } ++#endif ++ CheckError(__LINE__); ++#ifdef GL_VERSION_3_2 ++ if (version >= 32 && !es2Profile) { ++ GLint mask; ++ glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); ++ printf("%s profile mask: %s\n", oglstring, profile_mask_string(mask)); ++ } ++#endif ++ ++ CheckError(__LINE__); ++ ++ if (opts->mode != Brief) { ++ printf("%s extensions:\n", oglstring); ++ print_extension_list(glExtensions, opts->singleLine); ++ } ++ ++ if (limits) { ++ print_limits(glExtensions, oglstring, version, &extfuncs); ++ } ++ ++ if (coreProfile) ++ free(glExtensions); ++ } ++ else { ++ fprintf(stderr, "Error: glXMakeCurrent failed\n"); ++ } ++ ++ glXDestroyContext(dpy, ctx); ++ XFree(visinfo); ++ XDestroyWindow(dpy, win); ++ XSync(dpy, 1); ++ return True; ++} ++ ++ ++static const char * ++visual_class_name(int cls) ++{ ++ switch (cls) { ++ case StaticColor: ++ return "StaticColor"; ++ case PseudoColor: ++ return "PseudoColor"; ++ case StaticGray: ++ return "StaticGray"; ++ case GrayScale: ++ return "GrayScale"; ++ case TrueColor: ++ return "TrueColor"; ++ case DirectColor: ++ return "DirectColor"; ++ default: ++ return ""; ++ } ++} ++ ++static const char * ++visual_drawable_type(int type) ++{ ++ const static struct bit_info bits[] = { ++ { GLX_WINDOW_BIT, "window" }, ++ { GLX_PIXMAP_BIT, "pixmap" }, ++ { GLX_PBUFFER_BIT, "pbuffer" } ++ }; ++ ++ return bitmask_to_string(bits, ELEMENTS(bits), type); ++} ++ ++static const char * ++visual_class_abbrev(int cls) ++{ ++ switch (cls) { ++ case StaticColor: ++ return "sc"; ++ case PseudoColor: ++ return "pc"; ++ case StaticGray: ++ return "sg"; ++ case GrayScale: ++ return "gs"; ++ case TrueColor: ++ return "tc"; ++ case DirectColor: ++ return "dc"; ++ default: ++ return ""; ++ } ++} ++ ++static const char * ++visual_render_type_name(int type) ++{ ++ switch (type) { ++ case GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT: ++ return "ufloat"; ++ case GLX_RGBA_FLOAT_BIT_ARB: ++ return "float"; ++ case GLX_RGBA_BIT: ++ return "rgba"; ++ case GLX_COLOR_INDEX_BIT: ++ return "ci"; ++ case GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT: ++ return "rgba|ci"; ++ default: ++ return ""; ++ } ++} ++ ++static const char * ++caveat_string(int caveat) ++{ ++ switch (caveat) { ++#ifdef GLX_EXT_visual_rating ++ case GLX_SLOW_VISUAL_EXT: ++ return "Slow"; ++ case GLX_NON_CONFORMANT_VISUAL_EXT: ++ return "Ncon"; ++ case GLX_NONE_EXT: ++ /* fall-through */ ++#endif ++ case 0: ++ /* fall-through */ ++ default: ++ return "None"; ++ } ++} ++ ++ ++static Bool ++get_visual_attribs(Display *dpy, XVisualInfo *vInfo, ++ struct visual_attribs *attribs) ++{ ++ const char *ext = glXQueryExtensionsString(dpy, vInfo->screen); ++ int rgba; ++ ++ memset(attribs, 0, sizeof(struct visual_attribs)); ++ ++ attribs->id = vInfo->visualid; ++#if defined(__cplusplus) || defined(c_plusplus) ++ attribs->klass = vInfo->c_class; ++#else ++ attribs->klass = vInfo->class; ++#endif ++ attribs->depth = vInfo->depth; ++ attribs->redMask = vInfo->red_mask; ++ attribs->greenMask = vInfo->green_mask; ++ attribs->blueMask = vInfo->blue_mask; ++ attribs->colormapSize = vInfo->colormap_size; ++ attribs->bitsPerRGB = vInfo->bits_per_rgb; ++ ++ if (glXGetConfig(dpy, vInfo, GLX_USE_GL, &attribs->supportsGL) != 0 || ++ !attribs->supportsGL) ++ return False; ++ glXGetConfig(dpy, vInfo, GLX_BUFFER_SIZE, &attribs->bufferSize); ++ glXGetConfig(dpy, vInfo, GLX_LEVEL, &attribs->level); ++ glXGetConfig(dpy, vInfo, GLX_RGBA, &rgba); ++ if (rgba) ++ attribs->render_type = GLX_RGBA_BIT; ++ else ++ attribs->render_type = GLX_COLOR_INDEX_BIT; ++ ++ glXGetConfig(dpy, vInfo, GLX_DRAWABLE_TYPE, &attribs->drawableType); ++ glXGetConfig(dpy, vInfo, GLX_DOUBLEBUFFER, &attribs->doubleBuffer); ++ glXGetConfig(dpy, vInfo, GLX_STEREO, &attribs->stereo); ++ glXGetConfig(dpy, vInfo, GLX_AUX_BUFFERS, &attribs->auxBuffers); ++ glXGetConfig(dpy, vInfo, GLX_RED_SIZE, &attribs->redSize); ++ glXGetConfig(dpy, vInfo, GLX_GREEN_SIZE, &attribs->greenSize); ++ glXGetConfig(dpy, vInfo, GLX_BLUE_SIZE, &attribs->blueSize); ++ glXGetConfig(dpy, vInfo, GLX_ALPHA_SIZE, &attribs->alphaSize); ++ glXGetConfig(dpy, vInfo, GLX_DEPTH_SIZE, &attribs->depthSize); ++ glXGetConfig(dpy, vInfo, GLX_STENCIL_SIZE, &attribs->stencilSize); ++ glXGetConfig(dpy, vInfo, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize); ++ glXGetConfig(dpy, vInfo, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize); ++ glXGetConfig(dpy, vInfo, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize); ++ glXGetConfig(dpy, vInfo, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize); ++ ++ /* get transparent pixel stuff */ ++ glXGetConfig(dpy, vInfo,GLX_TRANSPARENT_TYPE, &attribs->transparentType); ++ if (attribs->transparentType == GLX_TRANSPARENT_RGB) { ++ glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_RED_VALUE, &attribs->transparentRedValue); ++ glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_GREEN_VALUE, &attribs->transparentGreenValue); ++ glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_BLUE_VALUE, &attribs->transparentBlueValue); ++ glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_ALPHA_VALUE, &attribs->transparentAlphaValue); ++ } ++ else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { ++ glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_INDEX_VALUE, &attribs->transparentIndexValue); ++ } ++ ++ /* multisample attribs */ ++#ifdef GLX_ARB_multisample ++ if (ext && strstr(ext, "GLX_ARB_multisample")) { ++ glXGetConfig(dpy, vInfo, GLX_SAMPLE_BUFFERS_ARB, &attribs->numMultisample); ++ glXGetConfig(dpy, vInfo, GLX_SAMPLES_ARB, &attribs->numSamples); ++ } ++#endif ++ else { ++ attribs->numSamples = 0; ++ attribs->numMultisample = 0; ++ } ++ ++#if defined(GLX_EXT_visual_rating) ++ if (ext && strstr(ext, "GLX_EXT_visual_rating")) { ++ glXGetConfig(dpy, vInfo, GLX_VISUAL_CAVEAT_EXT, &attribs->visualCaveat); ++ } ++ else { ++ attribs->visualCaveat = GLX_NONE_EXT; ++ } ++#else ++ attribs->visualCaveat = 0; ++#endif ++ ++#if defined(GLX_EXT_framebuffer_sRGB) ++ if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) { ++ glXGetConfig(dpy, vInfo, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb); ++ } ++#endif ++ ++ return True; ++} ++ ++#ifdef GLX_VERSION_1_3 ++ ++static int ++glx_token_to_visual_class(int visual_type) ++{ ++ switch (visual_type) { ++ case GLX_TRUE_COLOR: ++ return TrueColor; ++ case GLX_DIRECT_COLOR: ++ return DirectColor; ++ case GLX_PSEUDO_COLOR: ++ return PseudoColor; ++ case GLX_STATIC_COLOR: ++ return StaticColor; ++ case GLX_GRAY_SCALE: ++ return GrayScale; ++ case GLX_STATIC_GRAY: ++ return StaticGray; ++ case GLX_NONE: ++ default: ++ return None; ++ } ++} ++ ++static Bool ++get_fbconfig_attribs(Display *dpy, GLXFBConfig fbconfig, ++ struct visual_attribs *attribs) ++{ ++ const char *ext = glXQueryExtensionsString(dpy, 0); ++ int visual_type; ++ XVisualInfo *vInfo; ++ ++ memset(attribs, 0, sizeof(struct visual_attribs)); ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FBCONFIG_ID, &attribs->id); ++ ++ vInfo = glXGetVisualFromFBConfig(dpy, fbconfig); ++ ++ if (vInfo != NULL) { ++ attribs->vis_id = vInfo->visualid; ++ attribs->depth = vInfo->depth; ++ attribs->redMask = vInfo->red_mask; ++ attribs->greenMask = vInfo->green_mask; ++ attribs->blueMask = vInfo->blue_mask; ++ attribs->colormapSize = vInfo->colormap_size; ++ attribs->bitsPerRGB = vInfo->bits_per_rgb; ++ } ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_X_VISUAL_TYPE, &visual_type); ++ attribs->klass = glx_token_to_visual_class(visual_type); ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_DRAWABLE_TYPE, &attribs->drawableType); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_BUFFER_SIZE, &attribs->bufferSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_LEVEL, &attribs->level); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_RENDER_TYPE, &attribs->render_type); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_DOUBLEBUFFER, &attribs->doubleBuffer); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_STEREO, &attribs->stereo); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_AUX_BUFFERS, &attribs->auxBuffers); ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_RED_SIZE, &attribs->redSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_GREEN_SIZE, &attribs->greenSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_BLUE_SIZE, &attribs->blueSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_ALPHA_SIZE, &attribs->alphaSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_DEPTH_SIZE, &attribs->depthSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_STENCIL_SIZE, &attribs->stencilSize); ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize); ++ ++ /* get transparent pixel stuff */ ++ glXGetFBConfigAttrib(dpy, fbconfig,GLX_TRANSPARENT_TYPE, &attribs->transparentType); ++ if (attribs->transparentType == GLX_TRANSPARENT_RGB) { ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_RED_VALUE, &attribs->transparentRedValue); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_GREEN_VALUE, &attribs->transparentGreenValue); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_BLUE_VALUE, &attribs->transparentBlueValue); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_ALPHA_VALUE, &attribs->transparentAlphaValue); ++ } ++ else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_INDEX_VALUE, &attribs->transparentIndexValue); ++ } ++ ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_SAMPLE_BUFFERS, &attribs->numMultisample); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_SAMPLES, &attribs->numSamples); ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_CONFIG_CAVEAT, &attribs->visualCaveat); ++ ++#if defined(GLX_NV_float_buffer) ++ if (ext && strstr(ext, "GLX_NV_float_buffer")) { ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FLOAT_COMPONENTS_NV, &attribs->floatComponents); ++ } ++#endif ++#if defined(GLX_ARB_fbconfig_float) ++ if (ext && strstr(ext, "GLX_ARB_fbconfig_float")) { ++ if (attribs->render_type & GLX_RGBA_FLOAT_BIT_ARB) { ++ attribs->floatComponents = True; ++ } ++ } ++#endif ++#if defined(GLX_EXT_fbconfig_packed_float) ++ if (ext && strstr(ext, "GLX_EXT_fbconfig_packed_float")) { ++ if (attribs->render_type & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) { ++ attribs->packedfloatComponents = True; ++ } ++ } ++#endif ++ ++#if defined(GLX_EXT_framebuffer_sRGB) ++ if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) { ++ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb); ++ } ++#endif ++ return True; ++} ++ ++#endif ++ ++ ++ ++static void ++print_visual_attribs_verbose(const struct visual_attribs *attribs, ++ int fbconfigs) ++{ ++ if (fbconfigs) { ++ printf("FBConfig ID: %x Visual ID=%x depth=%d class=%s, type=%s\n", ++ attribs->id, attribs->vis_id, attribs->depth, ++ visual_class_name(attribs->klass), ++ visual_drawable_type(attribs->drawableType)); ++ } ++ else { ++ printf("Visual ID: %x depth=%d class=%s, type=%s\n", ++ attribs->id, attribs->depth, visual_class_name(attribs->klass), ++ visual_drawable_type(attribs->drawableType)); ++ } ++ printf(" bufferSize=%d level=%d renderType=%s doubleBuffer=%d stereo=%d\n", ++ attribs->bufferSize, attribs->level, ++ visual_render_type_name(attribs->render_type), ++ attribs->doubleBuffer, attribs->stereo); ++ printf(" rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d float=%c sRGB=%c\n", ++ attribs->redSize, attribs->greenSize, ++ attribs->blueSize, attribs->alphaSize, ++ attribs->packedfloatComponents ? 'P' : attribs->floatComponents ? 'Y' : 'N', ++ attribs->srgb ? 'Y' : 'N'); ++ printf(" auxBuffers=%d depthSize=%d stencilSize=%d\n", ++ attribs->auxBuffers, attribs->depthSize, attribs->stencilSize); ++ printf(" accum: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\n", ++ attribs->accumRedSize, attribs->accumGreenSize, ++ attribs->accumBlueSize, attribs->accumAlphaSize); ++ printf(" multiSample=%d multiSampleBuffers=%d\n", ++ attribs->numSamples, attribs->numMultisample); ++#ifdef GLX_EXT_visual_rating ++ if (attribs->visualCaveat == GLX_NONE_EXT || attribs->visualCaveat == 0) ++ printf(" visualCaveat=None\n"); ++ else if (attribs->visualCaveat == GLX_SLOW_VISUAL_EXT) ++ printf(" visualCaveat=Slow\n"); ++ else if (attribs->visualCaveat == GLX_NON_CONFORMANT_VISUAL_EXT) ++ printf(" visualCaveat=Nonconformant\n"); ++#endif ++ if (attribs->transparentType == GLX_NONE) { ++ printf(" Opaque.\n"); ++ } ++ else if (attribs->transparentType == GLX_TRANSPARENT_RGB) { ++ printf(" Transparent RGB: Red=%d Green=%d Blue=%d Alpha=%d\n",attribs->transparentRedValue,attribs->transparentGreenValue,attribs->transparentBlueValue,attribs->transparentAlphaValue); ++ } ++ else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { ++ printf(" Transparent index=%d\n",attribs->transparentIndexValue); ++ } ++} ++ ++ ++static void ++print_visual_attribs_short_header(void) ++{ ++ printf(" visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav\n"); ++ printf(" id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat\n"); ++ printf("----------------------------------------------------------------------------\n"); ++} ++ ++ ++static void ++print_visual_attribs_short(const struct visual_attribs *attribs) ++{ ++ const char *caveat = caveat_string(attribs->visualCaveat); ++ ++ printf("0x%03x %2d %2s %2d %3d %2d %c%c %c %c %2d %2d %2d %2d %c %c %2d %2d %2d", ++ attribs->id, ++ attribs->depth, ++ visual_class_abbrev(attribs->klass), ++ attribs->transparentType != GLX_NONE, ++ attribs->bufferSize, ++ attribs->level, ++ (attribs->render_type & GLX_RGBA_BIT) ? 'r' : ' ', ++ (attribs->render_type & GLX_COLOR_INDEX_BIT) ? 'c' : ' ', ++ attribs->doubleBuffer ? 'y' : '.', ++ attribs->stereo ? 'y' : '.', ++ attribs->redSize, attribs->greenSize, ++ attribs->blueSize, attribs->alphaSize, ++ attribs->packedfloatComponents ? 'u' : attribs->floatComponents ? 'f' : '.', ++ attribs->srgb ? 's' : '.', ++ attribs->auxBuffers, ++ attribs->depthSize, ++ attribs->stencilSize ++ ); ++ ++ printf(" %2d %2d %2d %2d %2d %1d %s\n", ++ attribs->accumRedSize, attribs->accumGreenSize, ++ attribs->accumBlueSize, attribs->accumAlphaSize, ++ attribs->numSamples, attribs->numMultisample, ++ caveat ++ ); ++} ++ ++ ++static void ++print_visual_attribs_long_header(void) ++{ ++ printf("Vis Vis Visual Trans buff lev render DB ste r g b a s aux dep ste accum buffer MS MS \n"); ++ printf(" ID Depth Type parent size el type reo sz sz sz sz flt rgb buf th ncl r g b a num bufs caveats\n"); ++ printf("--------------------------------------------------------------------------------------------------------------------\n"); ++} ++ ++ ++static void ++print_visual_attribs_long(const struct visual_attribs *attribs) ++{ ++ const char *caveat = caveat_string(attribs->visualCaveat); ++ ++ printf("0x%3x %2d %-11s %2d %3d %2d %4s %3d %3d %3d %3d %3d %3d", ++ attribs->id, ++ attribs->depth, ++ visual_class_name(attribs->klass), ++ attribs->transparentType != GLX_NONE, ++ attribs->bufferSize, ++ attribs->level, ++ visual_render_type_name(attribs->render_type), ++ attribs->doubleBuffer, ++ attribs->stereo, ++ attribs->redSize, attribs->greenSize, ++ attribs->blueSize, attribs->alphaSize ++ ); ++ ++ printf(" %c %c %3d %4d %2d %3d %3d %3d %3d %2d %2d %6s\n", ++ attribs->floatComponents ? 'f' : '.', ++ attribs->srgb ? 's' : '.', ++ attribs->auxBuffers, ++ attribs->depthSize, ++ attribs->stencilSize, ++ attribs->accumRedSize, attribs->accumGreenSize, ++ attribs->accumBlueSize, attribs->accumAlphaSize, ++ attribs->numSamples, attribs->numMultisample, ++ caveat ++ ); ++} ++ ++ ++static void ++print_visual_info(Display *dpy, int scrnum, InfoMode mode) ++{ ++ XVisualInfo theTemplate; ++ XVisualInfo *visuals; ++ int numVisuals, numGlxVisuals; ++ long mask; ++ int i; ++ struct visual_attribs attribs; ++ ++ /* get list of all visuals on this screen */ ++ theTemplate.screen = scrnum; ++ mask = VisualScreenMask; ++ visuals = XGetVisualInfo(dpy, mask, &theTemplate, &numVisuals); ++ ++ numGlxVisuals = 0; ++ for (i = 0; i < numVisuals; i++) { ++ if (get_visual_attribs(dpy, &visuals[i], &attribs)) ++ numGlxVisuals++; ++ } ++ ++ if (numGlxVisuals == 0) ++ return; ++ ++ printf("%d GLX Visuals\n", numGlxVisuals); ++ ++ if (mode == Normal) ++ print_visual_attribs_short_header(); ++ else if (mode == Wide) ++ print_visual_attribs_long_header(); ++ ++ for (i = 0; i < numVisuals; i++) { ++ if (!get_visual_attribs(dpy, &visuals[i], &attribs)) ++ continue; ++ ++ if (mode == Verbose) ++ print_visual_attribs_verbose(&attribs, False); ++ else if (mode == Normal) ++ print_visual_attribs_short(&attribs); ++ else if (mode == Wide) ++ print_visual_attribs_long(&attribs); ++ } ++ printf("\n"); ++ ++ XFree(visuals); ++} ++ ++#ifdef GLX_VERSION_1_3 ++ ++static void ++print_fbconfig_info(Display *dpy, int scrnum, InfoMode mode) ++{ ++ int numFBConfigs = 0; ++ struct visual_attribs attribs; ++ GLXFBConfig *fbconfigs; ++ int i; ++ ++ /* get list of all fbconfigs on this screen */ ++ fbconfigs = glXGetFBConfigs(dpy, scrnum, &numFBConfigs); ++ ++ if (numFBConfigs == 0) { ++ XFree(fbconfigs); ++ return; ++ } ++ ++ printf("%d GLXFBConfigs:\n", numFBConfigs); ++ if (mode == Normal) ++ print_visual_attribs_short_header(); ++ else if (mode == Wide) ++ print_visual_attribs_long_header(); ++ ++ for (i = 0; i < numFBConfigs; i++) { ++ get_fbconfig_attribs(dpy, fbconfigs[i], &attribs); ++ ++ if (mode == Verbose) ++ print_visual_attribs_verbose(&attribs, True); ++ else if (mode == Normal) ++ print_visual_attribs_short(&attribs); ++ else if (mode == Wide) ++ print_visual_attribs_long(&attribs); ++ } ++ printf("\n"); ++ ++ XFree(fbconfigs); ++} ++ ++#endif ++ ++/* ++ * Stand-alone Mesa doesn't really implement the GLX protocol so it ++ * doesn't really know the GLX attributes associated with an X visual. ++ * The first time a visual is presented to Mesa's pseudo-GLX it ++ * attaches ancilliary buffers to it (like depth and stencil). ++ * But that usually only works if glXChooseVisual is used. ++ * This function calls glXChooseVisual() to sort of "prime the pump" ++ * for Mesa's GLX so that the visuals that get reported actually ++ * reflect what applications will see. ++ * This has no effect when using true GLX. ++ */ ++static void ++mesa_hack(Display *dpy, int scrnum) ++{ ++ static int attribs[] = { ++ GLX_RGBA, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ GLX_DEPTH_SIZE, 1, ++ GLX_STENCIL_SIZE, 1, ++ GLX_ACCUM_RED_SIZE, 1, ++ GLX_ACCUM_GREEN_SIZE, 1, ++ GLX_ACCUM_BLUE_SIZE, 1, ++ GLX_ACCUM_ALPHA_SIZE, 1, ++ GLX_DOUBLEBUFFER, ++ None ++ }; ++ XVisualInfo *visinfo; ++ ++ visinfo = glXChooseVisual(dpy, scrnum, attribs); ++ if (visinfo) ++ XFree(visinfo); ++} ++ ++ ++/* ++ * Examine all visuals to find the so-called best one. ++ * We prefer deepest RGBA buffer with depth, stencil and accum ++ * that has no caveats. ++ */ ++static int ++find_best_visual(Display *dpy, int scrnum) ++{ ++ XVisualInfo theTemplate; ++ XVisualInfo *visuals; ++ int numVisuals; ++ long mask; ++ int i; ++ struct visual_attribs bestVis; ++ ++ /* get list of all visuals on this screen */ ++ theTemplate.screen = scrnum; ++ mask = VisualScreenMask; ++ visuals = XGetVisualInfo(dpy, mask, &theTemplate, &numVisuals); ++ ++ /* init bestVis with first visual info */ ++ get_visual_attribs(dpy, &visuals[0], &bestVis); ++ ++ /* try to find a "better" visual */ ++ for (i = 1; i < numVisuals; i++) { ++ struct visual_attribs vis; ++ ++ get_visual_attribs(dpy, &visuals[i], &vis); ++ ++ /* always skip visuals with caveats */ ++ if (vis.visualCaveat != GLX_NONE_EXT) ++ continue; ++ ++ /* see if this vis is better than bestVis */ ++ if ((!bestVis.supportsGL && vis.supportsGL) || ++ (bestVis.visualCaveat != GLX_NONE_EXT) || ++ (!(bestVis.render_type & GLX_RGBA_BIT) && (vis.render_type & GLX_RGBA_BIT)) || ++ (!bestVis.doubleBuffer && vis.doubleBuffer) || ++ (bestVis.redSize < vis.redSize) || ++ (bestVis.greenSize < vis.greenSize) || ++ (bestVis.blueSize < vis.blueSize) || ++ (bestVis.alphaSize < vis.alphaSize) || ++ (bestVis.depthSize < vis.depthSize) || ++ (bestVis.stencilSize < vis.stencilSize) || ++ (bestVis.accumRedSize < vis.accumRedSize)) { ++ /* found a better visual */ ++ bestVis = vis; ++ } ++ } ++ ++ XFree(visuals); ++ ++ return bestVis.id; ++} ++ ++ ++int ++main(int argc, char *argv[]) ++{ ++ Display *dpy; ++ int numScreens, scrnum; ++ struct options opts; ++ Bool coreWorked; ++ ++ parse_args(argc, argv, &opts); ++ ++ dpy = XOpenDisplay(opts.displayName); ++ if (!dpy) { ++ fprintf(stderr, "Error: unable to open display %s\n", ++ XDisplayName(opts.displayName)); ++ return -1; ++ } ++ ++ if (opts.findBest) { ++ int b; ++ mesa_hack(dpy, 0); ++ b = find_best_visual(dpy, 0); ++ printf("%d\n", b); ++ } ++ else { ++ numScreens = ScreenCount(dpy); ++ print_display_info(dpy); ++ for (scrnum = 0; scrnum < numScreens; scrnum++) { ++ mesa_hack(dpy, scrnum); ++ coreWorked = print_screen_info(dpy, scrnum, &opts, ++ True, False, opts.limits, False); ++ print_screen_info(dpy, scrnum, &opts, False, False, ++ opts.limits, coreWorked); ++ print_screen_info(dpy, scrnum, &opts, False, True, False, True); ++ ++ printf("\n"); ++ ++ if (opts.mode != Brief) { ++ print_visual_info(dpy, scrnum, opts.mode); ++#ifdef GLX_VERSION_1_3 ++ print_fbconfig_info(dpy, scrnum, opts.mode); ++#endif ++ } ++ ++ if (scrnum + 1 < numScreens) ++ printf("\n\n"); ++ } ++ } ++ ++ XCloseDisplay(dpy); ++ ++ return 0; ++} +diff -Naurp mesa-20.2.1-orig/src/glx/xdemos/meson.build mesa-20.2.1/src/glx/xdemos/meson.build +--- mesa-20.2.1-orig/src/glx/xdemos/meson.build 1969-12-31 18:00:00.000000000 -0600 ++++ mesa-20.2.1/src/glx/xdemos/meson.build 2020-10-15 23:07:14.486696790 -0500 +@@ -0,0 +1,32 @@ ++inc_xdemos = include_directories('.') ++ ++glxinfo_files = files( ++ 'glxinfo.c', ++ 'glinfo_common.c', ++) ++ ++x11_dep = dependency('x11', required: true) ++ ++executable('glxinfo', glxinfo_files, ++ install : true, ++ #c_args : gl_lib_cargs, ++ link_args : [ld_args_bsymbolic, ld_args_gc_sections, extra_ld_args_libgl, '-lm'], ++ link_with : libgl, ++ include_directories : [ inc_src, inc_include, inc_mesa, inc_glx], ++ dependencies : [x11_dep] ++) ++ ++executable('glxgears', 'glxgears.c', ++ install : true, ++ #c_args : gl_lib_cargs, ++ link_args : [ld_args_bsymbolic, ld_args_gc_sections, extra_ld_args_libgl, '-lm'], ++ link_with : libgl, ++ include_directories : [inc_src, inc_include, inc_mesa, inc_glx], ++ dependencies : [x11_dep] ++) ++ ++man_dir = get_option('prefix') + '/share/man/man1' ++install_data(['glxinfo.1', 'glxgears.1'], ++ install_dir : man_dir ++) ++ diff --git a/repo/x11/mesa/mesa-21.3.7-nouveau_fixes-1.patch b/repo/x11/mesa/mesa-21.3.7-nouveau_fixes-1.patch new file mode 100644 index 0000000..ecf6008 --- /dev/null +++ b/repo/x11/mesa/mesa-21.3.7-nouveau_fixes-1.patch @@ -0,0 +1,2878 @@ +Submitted By: Douglas R. Reno <renodr at linuxfromscratch dot org> +Date: 2022-02-11 +Initial Package Version: 21.3.6 +Upstream Status: Merge Request (Partial), Self +Origin: Upstream MR (#10752) with modifications +Description: Fixes several multi-threading related issues in the + Nouveau driver in Mesa. These issues can lead to + kernel panics and application crashes, and also cause + KDE Plasma in Wayland mode to instantly crash the system + once launched on a NVC0 or later card (NV50 is + unaffected). My changes include additional PUSH commands + to fix timing issues, which will be picked up upstream + shortly. Tested with KDE Plasma/Wayland, GNOME, VLC, + MPlayer, Minecraft, Discord, Zoom, XINE, and Kdenlive. + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_buffer.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_buffer.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_buffer.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_buffer.c 2022-02-11 16:51:08.220134863 -0600 +@@ -91,12 +91,8 @@ nouveau_buffer_release_gpu_storage(struc + { + assert(!(buf->status & NOUVEAU_BUFFER_STATUS_USER_PTR)); + +- if (buf->fence && buf->fence->state < NOUVEAU_FENCE_STATE_FLUSHED) { +- nouveau_fence_work(buf->fence, nouveau_fence_unref_bo, buf->bo); +- buf->bo = NULL; +- } else { +- nouveau_bo_ref(NULL, &buf->bo); +- } ++ nouveau_fence_work(buf->fence, nouveau_fence_unref_bo, buf->bo); ++ buf->bo = NULL; + + if (buf->mm) + release_allocation(&buf->mm, buf->fence); +@@ -172,7 +168,7 @@ nouveau_transfer_staging(struct nouveau_ + nouveau_mm_allocate(nv->screen->mm_GART, size, &tx->bo, &tx->offset); + if (tx->bo) { + tx->offset += adj; +- if (!nouveau_bo_map(tx->bo, 0, NULL)) ++ if (!BO_MAP(nv->screen, tx->bo, 0, NULL)) + tx->map = (uint8_t *)tx->bo->map + tx->offset; + } + } +@@ -195,7 +191,7 @@ nouveau_transfer_read(struct nouveau_con + nv->copy_data(nv, tx->bo, tx->offset, NOUVEAU_BO_GART, + buf->bo, buf->offset + base, buf->domain, size); + +- if (nouveau_bo_wait(tx->bo, NOUVEAU_BO_RD, nv->client)) ++ if (BO_WAIT(nv->screen, tx->bo, NOUVEAU_BO_RD, nv->client)) + return false; + + if (buf->data) +@@ -233,8 +229,8 @@ nouveau_transfer_write(struct nouveau_co + else + nv->push_data(nv, buf->bo, buf->offset + base, buf->domain, size, data); + +- nouveau_fence_ref(nv->screen->fence.current, &buf->fence); +- nouveau_fence_ref(nv->screen->fence.current, &buf->fence_wr); ++ nouveau_fence_ref(nv->fence, &buf->fence); ++ nouveau_fence_ref(nv->fence, &buf->fence_wr); + } + + /* Does a CPU wait for the buffer's backing data to become reliably accessible +@@ -303,10 +299,9 @@ nouveau_buffer_transfer_del(struct nouve + { + if (tx->map) { + if (likely(tx->bo)) { +- nouveau_fence_work(nv->screen->fence.current, +- nouveau_fence_unref_bo, tx->bo); ++ nouveau_fence_work(nv->fence, nouveau_fence_unref_bo, tx->bo); + if (tx->mm) +- release_allocation(&tx->mm, nv->screen->fence.current); ++ release_allocation(&tx->mm, nv->fence); + } else { + align_free(tx->map - + (tx->base.box.x & NOUVEAU_MIN_BUFFER_MAP_ALIGN_MASK)); +@@ -475,9 +470,9 @@ nouveau_buffer_transfer_map(struct pipe_ + * wait on the whole slab and instead use the logic below to return a + * reasonable buffer for that case. + */ +- ret = nouveau_bo_map(buf->bo, +- buf->mm ? 0 : nouveau_screen_transfer_flags(usage), +- nv->client); ++ ret = BO_MAP(nv->screen, buf->bo, ++ buf->mm ? 0 : nouveau_screen_transfer_flags(usage), ++ nv->client); + if (ret) { + FREE(tx); + return NULL; +@@ -601,11 +596,11 @@ nouveau_copy_buffer(struct nouveau_conte + src->bo, src->offset + srcx, src->domain, size); + + dst->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; +- nouveau_fence_ref(nv->screen->fence.current, &dst->fence); +- nouveau_fence_ref(nv->screen->fence.current, &dst->fence_wr); ++ nouveau_fence_ref(nv->fence, &dst->fence); ++ nouveau_fence_ref(nv->fence, &dst->fence_wr); + + src->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; +- nouveau_fence_ref(nv->screen->fence.current, &src->fence); ++ nouveau_fence_ref(nv->fence, &src->fence); + } else { + struct pipe_box src_box; + src_box.x = srcx; +@@ -643,10 +638,10 @@ nouveau_resource_map_offset(struct nouve + unsigned rw; + rw = (flags & NOUVEAU_BO_WR) ? PIPE_MAP_WRITE : PIPE_MAP_READ; + nouveau_buffer_sync(nv, res, rw); +- if (nouveau_bo_map(res->bo, 0, NULL)) ++ if (BO_MAP(nv->screen, res->bo, 0, NULL)) + return NULL; + } else { +- if (nouveau_bo_map(res->bo, flags, nv->client)) ++ if (BO_MAP(nv->screen, res->bo, flags, nv->client)) + return NULL; + } + return (uint8_t *)res->bo->map + res->offset + offset; +@@ -802,7 +797,7 @@ nouveau_buffer_data_fetch(struct nouveau + { + if (!nouveau_buffer_malloc(buf)) + return false; +- if (nouveau_bo_map(bo, NOUVEAU_BO_RD, nv->client)) ++ if (BO_MAP(nv->screen, bo, NOUVEAU_BO_RD, nv->client)) + return false; + memcpy(buf->data, (uint8_t *)bo->map + offset, size); + return true; +@@ -827,7 +822,7 @@ nouveau_buffer_migrate(struct nouveau_co + if (new_domain == NOUVEAU_BO_GART && old_domain == 0) { + if (!nouveau_buffer_allocate(screen, buf, new_domain)) + return false; +- ret = nouveau_bo_map(buf->bo, 0, nv->client); ++ ret = BO_MAP(nv->screen, buf->bo, 0, nv->client); + if (ret) + return ret; + memcpy((uint8_t *)buf->bo->map + buf->offset, buf->data, size); +@@ -853,9 +848,9 @@ nouveau_buffer_migrate(struct nouveau_co + nv->copy_data(nv, buf->bo, buf->offset, new_domain, + bo, offset, old_domain, buf->base.width0); + +- nouveau_fence_work(screen->fence.current, nouveau_fence_unref_bo, bo); ++ nouveau_fence_work(nv->fence, nouveau_fence_unref_bo, bo); + if (mm) +- release_allocation(&mm, screen->fence.current); ++ release_allocation(&mm, nv->fence); + } else + if (new_domain == NOUVEAU_BO_VRAM && old_domain == 0) { + struct nouveau_transfer tx; +@@ -897,7 +892,7 @@ nouveau_user_buffer_upload(struct nouvea + if (!nouveau_buffer_reallocate(screen, buf, NOUVEAU_BO_GART)) + return false; + +- ret = nouveau_bo_map(buf->bo, 0, nv->client); ++ ret = BO_MAP(nv->screen, buf->bo, 0, nv->client); + if (ret) + return false; + memcpy((uint8_t *)buf->bo->map + buf->offset + base, buf->data + base, size); +@@ -964,7 +959,7 @@ nouveau_scratch_runout_release(struct no + if (!nv->scratch.runout) + return; + +- if (!nouveau_fence_work(nv->screen->fence.current, nouveau_scratch_unref_bos, ++ if (!nouveau_fence_work(nv->fence, nouveau_scratch_unref_bos, + nv->scratch.runout)) + return; + +@@ -993,7 +988,7 @@ nouveau_scratch_runout(struct nouveau_co + + ret = nouveau_scratch_bo_alloc(nv, &nv->scratch.runout->bo[n], size); + if (!ret) { +- ret = nouveau_bo_map(nv->scratch.runout->bo[n], 0, NULL); ++ ret = BO_MAP(nv->screen, nv->scratch.runout->bo[n], 0, NULL); + if (ret) + nouveau_bo_ref(NULL, &nv->scratch.runout->bo[--nv->scratch.runout->nr]); + } +@@ -1031,7 +1026,7 @@ nouveau_scratch_next(struct nouveau_cont + nv->scratch.offset = 0; + nv->scratch.end = nv->scratch.bo_size; + +- ret = nouveau_bo_map(bo, NOUVEAU_BO_WR, nv->client); ++ ret = BO_MAP(nv->screen, bo, NOUVEAU_BO_WR, nv->client); + if (!ret) + nv->scratch.map = bo->map; + return !ret; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_context.h mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_context.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_context.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_context.h 2022-02-11 16:51:52.682577582 -0600 +@@ -15,6 +15,7 @@ struct nouveau_context { + + struct nouveau_client *client; + struct nouveau_pushbuf *pushbuf; ++ struct nouveau_fence *fence; + struct pipe_debug_callback debug; + + bool vbo_dirty; +@@ -66,7 +67,7 @@ void + nouveau_context_init_vdec(struct nouveau_context *); + + void +-nouveau_context_init(struct nouveau_context *); ++nouveau_context_init(struct nouveau_context *, struct nouveau_screen *); + + void + nouveau_scratch_runout_release(struct nouveau_context *); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_fence.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_fence.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_fence.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_fence.c 2022-02-11 17:03:39.714131948 -0600 +@@ -21,6 +21,7 @@ + */ + + #include "nouveau_screen.h" ++#include "nouveau_context.h" + #include "nouveau_winsys.h" + #include "nouveau_fence.h" + #include "util/os_time.h" +@@ -30,13 +31,14 @@ + #endif + + bool +-nouveau_fence_new(struct nouveau_screen *screen, struct nouveau_fence **fence) ++nouveau_fence_new(struct nouveau_context *nv, struct nouveau_fence **fence) + { + *fence = CALLOC_STRUCT(nouveau_fence); + if (!*fence) + return false; + +- (*fence)->screen = screen; ++ (*fence)->screen = nv->screen; ++ (*fence)->context = nv; + (*fence)->ref = 1; + list_inithead(&(*fence)->work); + +@@ -59,22 +61,25 @@ void + nouveau_fence_emit(struct nouveau_fence *fence) + { + struct nouveau_screen *screen = fence->screen; ++ struct nouveau_fence_list *fence_list = &screen->fence; + +- assert(fence->state == NOUVEAU_FENCE_STATE_AVAILABLE); ++ assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); ++ if (fence->state >= NOUVEAU_FENCE_STATE_EMITTED) ++ return; + + /* set this now, so that if fence.emit triggers a flush we don't recurse */ + fence->state = NOUVEAU_FENCE_STATE_EMITTING; + + ++fence->ref; + +- if (screen->fence.tail) +- screen->fence.tail->next = fence; ++ if (fence_list->tail) ++ fence_list->tail->next = fence; + else +- screen->fence.head = fence; ++ fence_list->head = fence; + +- screen->fence.tail = fence; ++ fence_list->tail = fence; + +- screen->fence.emit(&screen->base, &fence->sequence); ++ fence_list->emit(&screen->base, &fence->sequence); + + assert(fence->state == NOUVEAU_FENCE_STATE_EMITTING); + fence->state = NOUVEAU_FENCE_STATE_EMITTED; +@@ -84,19 +89,19 @@ void + nouveau_fence_del(struct nouveau_fence *fence) + { + struct nouveau_fence *it; +- struct nouveau_screen *screen = fence->screen; ++ struct nouveau_fence_list *fence_list = &fence->screen->fence; + + if (fence->state == NOUVEAU_FENCE_STATE_EMITTED || + fence->state == NOUVEAU_FENCE_STATE_FLUSHED) { +- if (fence == screen->fence.head) { +- screen->fence.head = fence->next; +- if (!screen->fence.head) +- screen->fence.tail = NULL; ++ if (fence == fence_list->head) { ++ fence_list->head = fence->next; ++ if (!fence_list->head) ++ fence_list->tail = NULL; + } else { +- for (it = screen->fence.head; it && it->next != fence; it = it->next); ++ for (it = fence_list->head; it && it->next != fence; it = it->next); + it->next = fence->next; +- if (screen->fence.tail == fence) +- screen->fence.tail = it; ++ if (fence_list->tail == fence) ++ fence_list->tail = it; + } + } + +@@ -109,18 +114,19 @@ nouveau_fence_del(struct nouveau_fence * + } + + void +-nouveau_fence_cleanup(struct nouveau_screen *screen) ++nouveau_fence_cleanup(struct nouveau_context *nv) + { +- if (screen->fence.current) { ++ struct nouveau_fence_list *fence_list = &nv->screen->fence; ++ if (nv->fence) { + struct nouveau_fence *current = NULL; + + /* nouveau_fence_wait will create a new current fence, so wait on the + * _current_ one, and remove both. + */ +- nouveau_fence_ref(screen->fence.current, ¤t); ++ nouveau_fence_ref(nv->fence, ¤t); + nouveau_fence_wait(current, NULL); + nouveau_fence_ref(NULL, ¤t); +- nouveau_fence_ref(NULL, &screen->fence.current); ++ nouveau_fence_ref(NULL, &nv->fence); + } + } + +@@ -129,13 +135,14 @@ nouveau_fence_update(struct nouveau_scre + { + struct nouveau_fence *fence; + struct nouveau_fence *next = NULL; +- u32 sequence = screen->fence.update(&screen->base); ++ struct nouveau_fence_list *fence_list = &screen->fence; ++ u32 sequence = fence_list->update(&screen->base); + +- if (screen->fence.sequence_ack == sequence) ++ if (fence_list->sequence_ack == sequence) + return; +- screen->fence.sequence_ack = sequence; ++ fence_list->sequence_ack = sequence; + +- for (fence = screen->fence.head; fence; fence = next) { ++ for (fence = fence_list->head; fence; fence = next) { + next = fence->next; + sequence = fence->sequence; + +@@ -144,12 +151,12 @@ nouveau_fence_update(struct nouveau_scre + nouveau_fence_trigger_work(fence); + nouveau_fence_ref(NULL, &fence); + +- if (sequence == screen->fence.sequence_ack) ++ if (sequence == fence_list->sequence_ack) + break; + } +- screen->fence.head = next; ++ fence_list->head = next; + if (!next) +- screen->fence.tail = NULL; ++ fence_list->tail = NULL; + + if (flushed) { + for (fence = next; fence; fence = fence->next) +@@ -178,25 +185,23 @@ static bool + nouveau_fence_kick(struct nouveau_fence *fence) + { + struct nouveau_screen *screen = fence->screen; ++ struct nouveau_fence_list *fence_list = &screen->fence; ++ bool current = !fence->sequence; + + /* wtf, someone is waiting on a fence in flush_notify handler? */ + assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); + + if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) { + PUSH_SPACE(screen->pushbuf, 8); +- /* The space allocation might trigger a flush, which could emit the +- * current fence. So check again. +- */ +- if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) +- nouveau_fence_emit(fence); ++ nouveau_fence_emit(fence); + } + + if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED) + if (nouveau_pushbuf_kick(screen->pushbuf, screen->pushbuf->channel)) + return false; + +- if (fence == screen->fence.current) +- nouveau_fence_next(screen); ++ if (current) ++ nouveau_fence_next(fence->context); + + nouveau_fence_update(screen, false); + +@@ -207,6 +212,7 @@ bool + nouveau_fence_wait(struct nouveau_fence *fence, struct pipe_debug_callback *debug) + { + struct nouveau_screen *screen = fence->screen; ++ struct nouveau_fence_list *fence_list = &screen->fence; + uint32_t spins = 0; + int64_t start = 0; + +@@ -237,24 +243,26 @@ nouveau_fence_wait(struct nouveau_fence + + debug_printf("Wait on fence %u (ack = %u, next = %u) timed out !\n", + fence->sequence, +- screen->fence.sequence_ack, screen->fence.sequence); ++ fence_list->sequence_ack, fence_list->sequence); + + return false; + } + + void +-nouveau_fence_next(struct nouveau_screen *screen) ++nouveau_fence_next(struct nouveau_context *nv) + { +- if (screen->fence.current->state < NOUVEAU_FENCE_STATE_EMITTING) { +- if (screen->fence.current->ref > 1) +- nouveau_fence_emit(screen->fence.current); ++ struct nouveau_fence_list *fence_list = &nv->screen->fence; ++ ++ if (nv->fence->state < NOUVEAU_FENCE_STATE_EMITTING) { ++ if (nv->fence->ref > 1) ++ nouveau_fence_emit(nv->fence); + else + return; + } + +- nouveau_fence_ref(NULL, &screen->fence.current); ++ nouveau_fence_ref(NULL, &nv->fence); + +- nouveau_fence_new(screen, &screen->fence.current); ++ nouveau_fence_new(nv, &nv->fence); + } + + void +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_fence.h mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_fence.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_fence.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_fence.h 2022-02-11 17:06:52.375811111 -0600 +@@ -22,6 +22,7 @@ struct nouveau_fence_work { + struct nouveau_fence { + struct nouveau_fence *next; + struct nouveau_screen *screen; ++ struct nouveau_context *context; + int state; + int ref; + uint32_t sequence; +@@ -29,14 +30,23 @@ struct nouveau_fence { + struct list_head work; + }; + ++struct nouveau_fence_list { ++ struct nouveau_fence *head; ++ struct nouveau_fence *tail; ++ uint32_t sequence; ++ uint32_t sequence_ack; ++ void (*emit)(struct pipe_screen *, uint32_t *sequence); ++ uint32_t (*update)(struct pipe_screen *); ++}; ++ + void nouveau_fence_emit(struct nouveau_fence *); + void nouveau_fence_del(struct nouveau_fence *); + +-bool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **); +-void nouveau_fence_cleanup(struct nouveau_screen *); ++bool nouveau_fence_new(struct nouveau_context *, struct nouveau_fence **); ++void nouveau_fence_cleanup(struct nouveau_context *); + bool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); + void nouveau_fence_update(struct nouveau_screen *, bool flushed); +-void nouveau_fence_next(struct nouveau_screen *); ++void nouveau_fence_next(struct nouveau_context *); + bool nouveau_fence_wait(struct nouveau_fence *, struct pipe_debug_callback *); + bool nouveau_fence_signalled(struct nouveau_fence *); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_mm.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_mm.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_mm.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_mm.c 2022-02-11 17:09:55.188637737 -0600 +@@ -1,6 +1,7 @@ + + #include <inttypes.h> + ++#include "util/simple_mtx.h" + #include "util/u_inlines.h" + #include "util/u_memory.h" + #include "util/list.h" +@@ -29,6 +30,7 @@ struct mm_bucket { + struct list_head used; + struct list_head full; + int num_free; ++ simple_mtx_t lock; + }; + + struct nouveau_mman { +@@ -124,6 +126,8 @@ mm_slab_new(struct nouveau_mman *cache, + int words, ret; + const uint32_t size = mm_default_slab_size(chunk_order); + ++ simple_mtx_assert_locked(&bucket->lock); ++ + words = ((size >> chunk_order) + 31) / 32; + assert(words); + +@@ -151,7 +155,7 @@ mm_slab_new(struct nouveau_mman *cache, + assert(bucket == mm_bucket_by_order(cache, chunk_order)); + list_add(&slab->head, &bucket->free); + +- cache->allocated += size; ++ p_atomic_add(&cache->allocated, size); + + if (nouveau_mesa_debug) + debug_printf("MM: new slab, total memory = %"PRIu64" KiB\n", +@@ -182,6 +186,11 @@ nouveau_mm_allocate(struct nouveau_mman + return NULL; + } + ++ alloc = MALLOC_STRUCT(nouveau_mm_allocation); ++ if (!alloc) ++ return NULL; ++ ++ simple_mtx_lock(&bucket->lock); + if (!list_is_empty(&bucket->used)) { + slab = LIST_ENTRY(struct mm_slab, bucket->used.next, head); + } else { +@@ -196,16 +205,13 @@ nouveau_mm_allocate(struct nouveau_mman + + *offset = mm_slab_alloc(slab) << slab->order; + +- alloc = MALLOC_STRUCT(nouveau_mm_allocation); +- if (!alloc) +- return NULL; +- + nouveau_bo_ref(slab->bo, bo); + + if (slab->free == 0) { + list_del(&slab->head); + list_add(&slab->head, &bucket->full); + } ++ simple_mtx_unlock(&bucket->lock); + + alloc->offset = *offset; + alloc->priv = (void *)slab; +@@ -229,6 +235,7 @@ nouveau_mm_free(struct nouveau_mm_alloca + list_del(&slab->head); + list_addtail(&slab->head, &bucket->used); + } ++ simple_mtx_unlock(&bucket->lock); + + FREE(alloc); + } +@@ -258,6 +265,7 @@ nouveau_mm_create(struct nouveau_device + list_inithead(&cache->bucket[i].free); + list_inithead(&cache->bucket[i].used); + list_inithead(&cache->bucket[i].full); ++ simple_mtx_init(&cache->bucket[i].lock, mtx_plain); + } + + return cache; +@@ -292,6 +300,7 @@ nouveau_mm_destroy(struct nouveau_mman * + nouveau_mm_free_slabs(&cache->bucket[i].free); + nouveau_mm_free_slabs(&cache->bucket[i].used); + nouveau_mm_free_slabs(&cache->bucket[i].full); ++ simple_mtx_destroy(&cache->bucket[i].lock); + } + + FREE(cache); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_screen.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_screen.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_screen.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_screen.c 2022-02-11 17:11:30.951045828 -0600 +@@ -394,7 +394,11 @@ nouveau_set_debug_callback(struct pipe_c + } + + void +-nouveau_context_init(struct nouveau_context *context) ++nouveau_context_init(struct nouveau_context *context, struct nouveau_screen *screen) + { + context->pipe.set_debug_callback = nouveau_set_debug_callback; ++ ++ context->screen = screen; ++ context->client = screen->client; ++ context->pushbuf = screen->pushbuf; + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_screen.h mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_screen.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_screen.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_screen.h 2022-02-11 17:12:22.999729379 -0600 +@@ -6,6 +6,8 @@ + #include "util/u_atomic.h" + #include "util/u_memory.h" + ++#include "nouveau_fence.h" ++ + #ifndef NDEBUG + # define NOUVEAU_ENABLE_DRIVER_STATISTICS + #endif +@@ -44,15 +46,7 @@ struct nouveau_screen { + + uint16_t class_3d; + +- struct { +- struct nouveau_fence *head; +- struct nouveau_fence *tail; +- struct nouveau_fence *current; +- u32 sequence; +- u32 sequence_ack; +- void (*emit)(struct pipe_screen *, u32 *sequence); +- u32 (*update)(struct pipe_screen *); +- } fence; ++ struct nouveau_fence_list fence; + + struct nouveau_mman *mm_VRAM; + struct nouveau_mman *mm_GART; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_video.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_video.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_video.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_video.c 2022-02-11 17:13:47.703221196 -0600 +@@ -37,12 +37,12 @@ nouveau_vpe_init(struct nouveau_decoder + int ret; + if (dec->cmds) + return 0; +- ret = nouveau_bo_map(dec->cmd_bo, NOUVEAU_BO_RDWR, dec->client); ++ ret = BO_MAP(dec->screen, dec->cmd_bo, NOUVEAU_BO_RDWR, dec->client); + if (ret) { + debug_printf("Mapping cmd bo: %s\n", strerror(-ret)); + return ret; + } +- ret = nouveau_bo_map(dec->data_bo, NOUVEAU_BO_RDWR, dec->client); ++ ret = BO_MAP(dec->screen, dec->data_bo, NOUVEAU_BO_RDWR, dec->client); + if (ret) { + debug_printf("Mapping data bo: %s\n", strerror(-ret)); + return ret; +@@ -73,7 +73,7 @@ nouveau_vpe_fini(struct nouveau_decoder + if (!dec->cmds) + return; + +- nouveau_pushbuf_space(push, 16, 2, 0); ++ PUSH_SPACE_EX(push, 16, 2, 0); + nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_CMD); + + #define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_CMD, NOUVEAU_BO_RD +@@ -88,7 +88,7 @@ nouveau_vpe_fini(struct nouveau_decoder + + #undef BCTX_ARGS + +- if (unlikely(nouveau_pushbuf_validate(dec->push))) ++ if (unlikely(PUSH_VAL(dec->push))) + return; + + BEGIN_NV04(push, NV31_MPEG(EXEC), 1); +@@ -582,13 +582,13 @@ nouveau_create_decoder(struct pipe_conte + 0, 4096, NULL, &dec->fence_bo); + if (ret) + goto fail; +- nouveau_bo_map(dec->fence_bo, NOUVEAU_BO_RDWR, NULL); ++ BO_MAP(dec->fence_bo, NOUVEAU_BO_RDWR, NULL); + dec->fence_map = dec->fence_bo->map; + dec->fence_map[0] = 0; + #endif + + nouveau_pushbuf_bufctx(dec->push, dec->bufctx); +- nouveau_pushbuf_space(push, 32, 4, 0); ++ PUSH_SPACE_EX(push, 32, 4, 0); + + BEGIN_NV04(push, SUBC_MPEG(NV01_SUBCHAN_OBJECT), 1); + PUSH_DATA (push, dec->mpeg->handle); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_vp3_video.c mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_vp3_video.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_vp3_video.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_vp3_video.c 2022-02-11 17:14:38.549919717 -0600 +@@ -27,6 +27,7 @@ + + #include <nvif/class.h> + ++#include "nouveau_winsys.h" + #include "nouveau_screen.h" + #include "nouveau_context.h" + #include "nouveau_vp3_video.h" +@@ -284,13 +285,14 @@ nouveau_vp3_load_firmware(struct nouveau + char path[PATH_MAX]; + ssize_t r; + uint32_t *end, endval; ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + + if (chipset >= 0xa3 && chipset != 0xaa && chipset != 0xac) + vp4_getpath(profile, path); + else + vp3_getpath(profile, path); + +- if (nouveau_bo_map(dec->fw_bo, NOUVEAU_BO_WR, dec->client)) ++ if (BO_MAP(screen, dec->fw_bo, NOUVEAU_BO_WR, dec->client)) + return 1; + + fd = open(path, O_RDONLY | O_CLOEXEC); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_winsys.h mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_winsys.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nouveau_winsys.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nouveau_winsys.h 2022-02-11 17:17:15.566002822 -0600 +@@ -9,6 +9,8 @@ + #include "drm-uapi/drm.h" + #include <nouveau.h> + ++#include "nouveau_screen.h" ++ + #ifndef NV04_PFIFO_MAX_PACKET_LEN + #define NV04_PFIFO_MAX_PACKET_LEN 2047 + #endif +@@ -23,12 +25,18 @@ PUSH_AVAIL(struct nouveau_pushbuf *push) + } + + static inline bool ++PUSH_SPACE_EX(struct nouveau_pushbuf *push, uint32_t size, uint32_t relocs, uint32_t pushes) ++{ ++ return nouveau_pushbuf_space(push, size, relocs, pushes) == 0; ++} ++ ++static inline bool + PUSH_SPACE(struct nouveau_pushbuf *push, uint32_t size) + { + /* Provide a buffer so that fences always have room to be emitted */ + size += 8; + if (PUSH_AVAIL(push) < size) +- return nouveau_pushbuf_space(push, size, 0, 0) == 0; ++ return PUSH_SPACE_EX(push, size, 0, 0); + return true; + } + +@@ -66,6 +74,23 @@ PUSH_KICK(struct nouveau_pushbuf *push) + nouveau_pushbuf_kick(push, push->channel); + } + ++static inline int ++PUSH_VAL(struct nouveau_pushbuf *push) ++{ ++ return nouveau_pushbuf_validate(push); ++} ++ ++static inline int ++BO_MAP(struct nouveau_screen *screen, struct nouveau_bo *bo, uint32_t access, struct nouveau_client *client) ++{ ++ return nouveau_bo_map(bo, access, client); ++} ++ ++static inline int ++BO_WAIT(struct nouveau_screen *screen, struct nouveau_bo *bo, uint32_t access, struct nouveau_client *client) ++{ ++ return nouveau_bo_wait(bo, access, client); ++} + + #define NOUVEAU_RESOURCE_FLAG_LINEAR (PIPE_RESOURCE_FLAG_DRV_PRIV << 0) + #define NOUVEAU_RESOURCE_FLAG_DRV_PRIV (PIPE_RESOURCE_FLAG_DRV_PRIV << 1) +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_clear.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_clear.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_clear.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_clear.c 2022-02-11 14:24:23.189190438 -0600 +@@ -128,7 +128,7 @@ nv30_clear_render_target(struct pipe_con + + refn.bo = mt->base.bo; + refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR; +- if (nouveau_pushbuf_space(push, 32, 1, 0) || ++ if (!PUSH_SPACE_EX(push, 32, 1, 0) || + nouveau_pushbuf_refn (push, &refn, 1)) + return; + +@@ -193,7 +193,7 @@ nv30_clear_depth_stencil(struct pipe_con + + refn.bo = mt->base.bo; + refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR; +- if (nouveau_pushbuf_space(push, 32, 1, 0) || ++ if (!PUSH_SPACE_EX(push, 32, 1, 0) || + nouveau_pushbuf_refn (push, &refn, 1)) + return; + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_context.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_context.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_context.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_context.c 2022-02-11 14:28:00.534301647 -0600 +@@ -45,7 +45,7 @@ nv30_context_kick_notify(struct nouveau_ + nv30 = container_of(push->user_priv, struct nv30_context, bufctx); + screen = &nv30->screen->base; + +- nouveau_fence_next(screen); ++ nouveau_fence_next(&nv30->base); + nouveau_fence_update(screen, true); + + if (push->bufctx) { +@@ -53,13 +53,13 @@ nv30_context_kick_notify(struct nouveau_ + LIST_FOR_EACH_ENTRY(bref, &push->bufctx->current, thead) { + struct nv04_resource *res = bref->priv; + if (res && res->mm) { +- nouveau_fence_ref(screen->fence.current, &res->fence); ++ nouveau_fence_ref(nv30->base.fence, &res->fence); + + if (bref->flags & NOUVEAU_BO_RD) + res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; + + if (bref->flags & NOUVEAU_BO_WR) { +- nouveau_fence_ref(screen->fence.current, &res->fence_wr); ++ nouveau_fence_ref(nv30->base.fence, &res->fence_wr); + res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING | + NOUVEAU_BUFFER_STATUS_DIRTY; + } +@@ -76,7 +76,7 @@ nv30_context_flush(struct pipe_context * + struct nouveau_pushbuf *push = nv30->base.pushbuf; + + if (fence) +- nouveau_fence_ref(nv30->screen->base.fence.current, ++ nouveau_fence_ref(nv30->base.fence, + (struct nouveau_fence **)fence); + + PUSH_KICK(push); +@@ -176,6 +176,7 @@ nv30_context_destroy(struct pipe_context + if (nv30->screen->cur_ctx == nv30) + nv30->screen->cur_ctx = NULL; + ++ nouveau_fence_cleanup(&nv30->base); + nouveau_context_destroy(&nv30->base); + } + +@@ -191,7 +192,6 @@ nv30_context_create(struct pipe_screen * + { + struct nv30_screen *screen = nv30_screen(pscreen); + struct nv30_context *nv30 = CALLOC_STRUCT(nv30_context); +- struct nouveau_pushbuf *push; + struct pipe_context *pipe; + int ret; + +@@ -199,7 +199,6 @@ nv30_context_create(struct pipe_screen * + return NULL; + + nv30->screen = screen; +- nv30->base.screen = &screen->base; + nv30->base.copy_data = nv30_transfer_copy_data; + + pipe = &nv30->base.pipe; +@@ -208,6 +207,9 @@ nv30_context_create(struct pipe_screen * + pipe->destroy = nv30_context_destroy; + pipe->flush = nv30_context_flush; + ++ nouveau_context_init(&nv30->base, &screen->base); ++ nv30->base.pushbuf->kick_notify = nv30_context_kick_notify; ++ + nv30->base.pipe.stream_uploader = u_upload_create_default(&nv30->base.pipe); + if (!nv30->base.pipe.stream_uploader) { + nv30_context_destroy(pipe); +@@ -215,14 +217,6 @@ nv30_context_create(struct pipe_screen * + } + nv30->base.pipe.const_uploader = nv30->base.pipe.stream_uploader; + +- /*XXX: *cough* per-context client */ +- nv30->base.client = screen->base.client; +- +- /*XXX: *cough* per-context pushbufs */ +- push = screen->base.pushbuf; +- nv30->base.pushbuf = push; +- push->kick_notify = nv30_context_kick_notify; +- + nv30->base.invalidate_resource_storage = nv30_invalidate_resource_storage; + + ret = nouveau_bufctx_new(nv30->base.client, 64, &nv30->bufctx); +@@ -244,7 +238,6 @@ nv30_context_create(struct pipe_screen * + if (debug_get_bool_option("NV30_SWTNL", false)) + nv30->draw_flags |= NV30_NEW_SWTNL; + +- nouveau_context_init(&nv30->base); + nv30->sample_mask = 0xffff; + nv30_vbo_init(pipe); + nv30_query_init(pipe); +@@ -265,6 +258,7 @@ nv30_context_create(struct pipe_screen * + } + + nouveau_context_init_vdec(&nv30->base); ++ nouveau_fence_new(&nv30->base, &nv30->base.fence); + + return pipe; + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_draw.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_draw.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_draw.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_draw.c 2022-02-11 14:28:44.868118544 -0600 +@@ -124,7 +124,7 @@ nv30_render_draw_elements(struct vbuf_re + { + struct nv30_render *r = nv30_render(render); + struct nv30_context *nv30 = r->nv30; +- struct nouveau_pushbuf *push = nv30->screen->base.pushbuf; ++ struct nouveau_pushbuf *push = nv30->base.pushbuf; + unsigned i; + + BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs); +@@ -280,7 +280,7 @@ nv30_render_validate(struct nv30_context + struct nv30_render *r = nv30_render(nv30->draw->render); + struct nv30_rasterizer_stateobj *rast = nv30->rast; + struct pipe_screen *pscreen = &nv30->screen->base.base; +- struct nouveau_pushbuf *push = nv30->screen->base.pushbuf; ++ struct nouveau_pushbuf *push = nv30->base.pushbuf; + struct nouveau_object *eng3d = nv30->screen->eng3d; + struct nv30_vertprog *vp = nv30->vertprog.program; + struct vertex_info *vinfo = &r->vertex_info; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_miptree.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_miptree.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_miptree.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_miptree.c 2022-02-11 14:29:22.740961717 -0600 +@@ -359,7 +359,7 @@ nv30_miptree_transfer_map(struct pipe_co + if (usage & PIPE_MAP_WRITE) + access |= NOUVEAU_BO_WR; + +- ret = nouveau_bo_map(tx->tmp.bo, access, nv30->base.client); ++ ret = BO_MAP(nv30->base.screen, tx->tmp.bo, access, nv30->base.client); + if (ret) { + pipe_resource_reference(&tx->base.resource, NULL); + FREE(tx); +@@ -393,7 +393,7 @@ nv30_miptree_transfer_unmap(struct pipe_ + } + + /* Allow the copies above to finish executing before freeing the source */ +- nouveau_fence_work(nv30->screen->base.fence.current, ++ nouveau_fence_work(nv30->base.fence, + nouveau_fence_unref_bo, tx->tmp.bo); + } else { + nouveau_bo_ref(NULL, &tx->tmp.bo); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_screen.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_screen.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_screen.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_screen.c 2022-02-11 14:30:44.381622525 -0600 +@@ -508,8 +508,6 @@ nv30_screen_destroy(struct pipe_screen * + if (!nouveau_drm_screen_unref(&screen->base)) + return; + +- nouveau_fence_cleanup(&screen->base); +- + nouveau_bo_ref(NULL, &screen->notify); + + nouveau_heap_destroy(&screen->query_heap); +@@ -684,7 +682,7 @@ nv30_screen_create(struct nouveau_device + + ret = nouveau_bo_wrap(screen->base.device, fifo->notify, &screen->notify); + if (ret == 0) +- ret = nouveau_bo_map(screen->notify, 0, screen->base.client); ++ ret = BO_MAP(&screen->base, screen->notify, 0, screen->base.client); + if (ret) + FAIL_SCREEN_INIT("error mapping notifier memory: %d\n", ret); + +@@ -811,9 +809,7 @@ nv30_screen_create(struct nouveau_device + PUSH_DATA (push, screen->ntfy->handle); + BEGIN_NV04(push, NV05_SIFM(COLOR_CONVERSION), 1); + PUSH_DATA (push, NV05_SIFM_COLOR_CONVERSION_TRUNCATE); ++ PUSH_KICK (push); + +- nouveau_pushbuf_kick(push, push->channel); +- +- nouveau_fence_new(&screen->base, &screen->base.fence.current); + return &screen->base; + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c 2022-02-11 14:32:00.766303956 -0600 +@@ -463,7 +463,6 @@ nv30_state_context_switch(struct nv30_co + bool + nv30_state_validate(struct nv30_context *nv30, uint32_t mask, bool hwtnl) + { +- struct nouveau_screen *screen = &nv30->screen->base; + struct nouveau_pushbuf *push = nv30->base.pushbuf; + struct nouveau_bufctx *bctx = nv30->bufctx; + struct nouveau_bufref *bref; +@@ -499,7 +498,7 @@ nv30_state_validate(struct nv30_context + } + + nouveau_pushbuf_bufctx(push, bctx); +- if (nouveau_pushbuf_validate(push)) { ++ if (PUSH_VAL(push)) { + nouveau_pushbuf_bufctx(push, NULL); + return false; + } +@@ -523,13 +522,13 @@ nv30_state_validate(struct nv30_context + LIST_FOR_EACH_ENTRY(bref, &bctx->current, thead) { + struct nv04_resource *res = bref->priv; + if (res && res->mm) { +- nouveau_fence_ref(screen->fence.current, &res->fence); ++ nouveau_fence_ref(nv30->base.fence, &res->fence); + + if (bref->flags & NOUVEAU_BO_RD) + res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; + + if (bref->flags & NOUVEAU_BO_WR) { +- nouveau_fence_ref(screen->fence.current, &res->fence_wr); ++ nouveau_fence_ref(nv30->base.fence, &res->fence_wr); + res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; + } + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_transfer.c mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_transfer.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv30/nv30_transfer.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv30/nv30_transfer.c 2022-02-11 14:35:05.786902168 -0600 +@@ -155,7 +155,7 @@ nv30_transfer_rect_blit(XFER_ARGS) + u32 texfmt, texswz; + u32 format, stride; + +- if (nouveau_pushbuf_space(push, 512, 8, 0) || ++ if (!PUSH_SPACE_EX(push, 512, 8, 0) || + nouveau_pushbuf_refn (push, refs, ARRAY_SIZE(refs))) + return; + +@@ -431,7 +431,7 @@ nv30_transfer_rect_sifm(XFER_ARGS) + si_arg |= NV03_SIFM_FORMAT_FILTER_BILINEAR; + } + +- if (nouveau_pushbuf_space(push, 64, 6, 0) || ++ if (!PUSH_SPACE_EX(push, 64, 6, 0) || + nouveau_pushbuf_refn (push, refs, 2)) + return; + +@@ -516,7 +516,7 @@ nv30_transfer_rect_m2mf(XFER_ARGS) + while (h) { + unsigned lines = (h > 2047) ? 2047 : h; + +- if (nouveau_pushbuf_space(push, 32, 2, 0) || ++ if (!PUSH_SPACE_EX(push, 32, 2, 0) || + nouveau_pushbuf_refn (push, refs, 2)) + return; + +@@ -635,8 +635,8 @@ nv30_transfer_rect_cpu(XFER_ARGS) + char *srcmap, *dstmap; + int x, y; + +- nouveau_bo_map(src->bo, NOUVEAU_BO_RD, nv30->base.client); +- nouveau_bo_map(dst->bo, NOUVEAU_BO_WR, nv30->base.client); ++ BO_MAP(nv30->base.screen, src->bo, NOUVEAU_BO_RD, nv30->base.client); ++ BO_MAP(nv30->base.screen, dst->bo, NOUVEAU_BO_WR, nv30->base.client); + srcmap = src->bo->map + src->offset; + dstmap = dst->bo->map + dst->offset; + +@@ -708,7 +708,7 @@ nv30_transfer_copy_data(struct nouveau_c + lines = (pages > 2047) ? 2047 : pages; + pages -= lines; + +- if (nouveau_pushbuf_space(push, 32, 2, 0) || ++ if (!PUSH_SPACE_EX(push, 32, 2, 0) || + nouveau_pushbuf_refn (push, refs, 2)) + return; + +@@ -732,7 +732,7 @@ nv30_transfer_copy_data(struct nouveau_c + } + + if (size) { +- if (nouveau_pushbuf_space(push, 32, 2, 0) || ++ if (!PUSH_SPACE_EX(push, 32, 2, 0) || + nouveau_pushbuf_refn (push, refs, 2)) + return; + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_compute.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_compute.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_compute.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_compute.c 2022-02-11 14:39:27.849132704 -0600 +@@ -518,7 +518,7 @@ nv50_state_validate_cp(struct nv50_conte + nv50->bufctx_cp); + + if (unlikely(nv50->state.flushed)) +- nv50_bufctx_fence(nv50->bufctx_cp, true); ++ nv50_bufctx_fence(nv50, nv50->bufctx_cp, true); + return ret; + } + +@@ -526,7 +526,7 @@ static void + nv50_compute_upload_input(struct nv50_context *nv50, const uint32_t *input) + { + struct nv50_screen *screen = nv50->screen; +- struct nouveau_pushbuf *push = screen->base.pushbuf; ++ struct nouveau_pushbuf *push = nv50->base.pushbuf; + unsigned size = align(nv50->compprog->parm_size, 0x4); + + BEGIN_NV04(push, NV50_CP(USER_PARAM_COUNT), 1); +@@ -540,19 +540,19 @@ nv50_compute_upload_input(struct nv50_co + mm = nouveau_mm_allocate(screen->base.mm_GART, size, &bo, &offset); + assert(mm); + +- nouveau_bo_map(bo, 0, screen->base.client); ++ BO_MAP(&screen->base, bo, 0, nv50->base.client); + memcpy(bo->map + offset, input, size); + + nouveau_bufctx_refn(nv50->bufctx, 0, bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD); + nouveau_pushbuf_bufctx(push, nv50->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + +- nouveau_pushbuf_space(push, 0, 0, 1); ++ PUSH_SPACE_EX(push, 0, 0, 1); + + BEGIN_NV04(push, NV50_CP(USER_PARAM(1)), size / 4); + nouveau_pushbuf_data(push, bo, offset, size); + +- nouveau_fence_work(screen->base.fence.current, nouveau_mm_free_work, mm); ++ nouveau_fence_work(nv50->base.fence, nouveau_mm_free_work, mm); + nouveau_bo_ref(NULL, &bo); + nouveau_bufctx_reset(nv50->bufctx, 0); + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_context.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_context.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_context.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_context.c 2022-02-11 17:44:52.706228555 -0600 +@@ -34,9 +34,10 @@ nv50_flush(struct pipe_context *pipe, + unsigned flags) + { + struct nouveau_screen *screen = nouveau_screen(pipe->screen); ++ struct nouveau_context *context = nouveau_context(pipe); + + if (fence) +- nouveau_fence_ref(screen->fence.current, (struct nouveau_fence **)fence); ++ nouveau_fence_ref(context->fence, (struct nouveau_fence **)fence); + + PUSH_KICK(screen->pushbuf); + +@@ -135,12 +136,12 @@ void + nv50_default_kick_notify(struct nouveau_pushbuf *push) + { + struct nv50_screen *screen = push->user_priv; ++ struct nv50_context *context = screen->cur_ctx; + +- if (screen) { +- nouveau_fence_next(&screen->base); ++ if (context) { ++ nouveau_fence_next(&context->base); + nouveau_fence_update(&screen->base, true); +- if (screen->cur_ctx) +- screen->cur_ctx->state.flushed = true; ++ context->state.flushed = true; + } + } + +@@ -193,12 +194,13 @@ nv50_destroy(struct pipe_context *pipe) + u_upload_destroy(nv50->base.pipe.stream_uploader); + + nouveau_pushbuf_bufctx(nv50->base.pushbuf, NULL); +- nouveau_pushbuf_kick(nv50->base.pushbuf, nv50->base.pushbuf->channel); ++ PUSH_KICK(nv50->base.pushbuf); + + nv50_context_unreference_resources(nv50); + + FREE(nv50->blit); + ++ nouveau_fence_cleanup(&nv50->base); + nouveau_context_destroy(&nv50->base); + } + +@@ -312,20 +314,18 @@ nv50_create(struct pipe_screen *pscreen, + if (!nv50_blitctx_create(nv50)) + goto out_err; + +- nv50->base.pushbuf = screen->base.pushbuf; +- nv50->base.client = screen->base.client; ++ nouveau_context_init(&nv50->base, &screen->base); + +- ret = nouveau_bufctx_new(screen->base.client, 2, &nv50->bufctx); ++ ret = nouveau_bufctx_new(nv50->base.client, 2, &nv50->bufctx); + if (!ret) +- ret = nouveau_bufctx_new(screen->base.client, NV50_BIND_3D_COUNT, ++ ret = nouveau_bufctx_new(nv50->base.client, NV50_BIND_3D_COUNT, + &nv50->bufctx_3d); + if (!ret) +- ret = nouveau_bufctx_new(screen->base.client, NV50_BIND_CP_COUNT, ++ ret = nouveau_bufctx_new(nv50->base.client, NV50_BIND_CP_COUNT, + &nv50->bufctx_cp); + if (ret) + goto out_err; + +- nv50->base.screen = &screen->base; + nv50->base.copy_data = nv50_m2mf_copy_linear; + nv50->base.push_data = nv50_sifc_linear_u8; + nv50->base.push_cb = nv50_cb_push; +@@ -360,7 +360,6 @@ nv50_create(struct pipe_screen *pscreen, + } + nv50->base.pushbuf->kick_notify = nv50_default_kick_notify; + +- nouveau_context_init(&nv50->base); + nv50_init_query_functions(nv50); + nv50_init_surface_functions(nv50); + nv50_init_state_functions(nv50); +@@ -416,6 +415,8 @@ nv50_create(struct pipe_screen *pscreen, + // zero entry if it's not otherwise set. + nv50->dirty_3d |= NV50_NEW_3D_SAMPLERS; + ++ nouveau_fence_new(&nv50->base, &nv50->base.fence); ++ + return pipe; + + out_err: +@@ -433,7 +434,7 @@ out_err: + } + + void +-nv50_bufctx_fence(struct nouveau_bufctx *bufctx, bool on_flush) ++nv50_bufctx_fence(struct nv50_context *nv50, struct nouveau_bufctx *bufctx, bool on_flush) + { + struct nouveau_list *list = on_flush ? &bufctx->current : &bufctx->pending; + struct nouveau_list *it; +@@ -442,7 +443,7 @@ nv50_bufctx_fence(struct nouveau_bufctx + struct nouveau_bufref *ref = (struct nouveau_bufref *)it; + struct nv04_resource *res = ref->priv; + if (res) +- nv50_resource_validate(res, (unsigned)ref->priv_data); ++ nv50_resource_validate(nv50, res, (unsigned)ref->priv_data); + } + } + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_context.h mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_context.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_context.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_context.h 2022-02-11 14:48:38.488869249 -0600 +@@ -254,10 +254,28 @@ nv50_context_shader_stage(unsigned pipe) + } + } + ++static inline void ++nv50_resource_validate(struct nv50_context *context, struct nv04_resource *res, uint32_t flags) ++{ ++ if (likely(res->bo)) { ++ if (flags & NOUVEAU_BO_WR) ++ res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING | ++ NOUVEAU_BUFFER_STATUS_DIRTY; ++ if (flags & NOUVEAU_BO_RD) ++ res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; ++ ++ if (res->mm) { ++ nouveau_fence_ref(context->base.fence, &res->fence); ++ if (flags & NOUVEAU_BO_WR) ++ nouveau_fence_ref(context->base.fence, &res->fence_wr); ++ } ++ } ++} ++ + /* nv50_context.c */ + struct pipe_context *nv50_create(struct pipe_screen *, void *, unsigned flags); + +-void nv50_bufctx_fence(struct nouveau_bufctx *, bool on_flush); ++void nv50_bufctx_fence(struct nv50_context *, struct nouveau_bufctx *, bool on_flush); + + void nv50_default_kick_notify(struct nouveau_pushbuf *); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_miptree.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_miptree.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_miptree.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_miptree.c 2022-02-11 14:49:23.116575689 -0600 +@@ -163,11 +163,7 @@ nv50_miptree_destroy(struct pipe_screen + { + struct nv50_miptree *mt = nv50_miptree(pt); + +- if (mt->base.fence && mt->base.fence->state < NOUVEAU_FENCE_STATE_FLUSHED) +- nouveau_fence_work(mt->base.fence, nouveau_fence_unref_bo, mt->base.bo); +- else +- nouveau_bo_ref(NULL, &mt->base.bo); +- ++ nouveau_fence_work(mt->base.fence, nouveau_fence_unref_bo, mt->base.bo); + nouveau_fence_ref(NULL, &mt->base.fence); + nouveau_fence_ref(NULL, &mt->base.fence_wr); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c 2022-02-11 14:53:02.848195107 -0600 +@@ -52,7 +52,7 @@ nv50_hw_query_allocate(struct nv50_conte + if (hq->state == NV50_HW_QUERY_STATE_READY) + nouveau_mm_free(hq->mm); + else +- nouveau_fence_work(screen->base.fence.current, ++ nouveau_fence_work(nv50->base.fence, + nouveau_mm_free_work, hq->mm); + } + } +@@ -63,7 +63,7 @@ nv50_hw_query_allocate(struct nv50_conte + return false; + hq->offset = hq->base_offset; + +- ret = nouveau_bo_map(hq->bo, 0, screen->base.client); ++ ret = BO_MAP(&screen->base, hq->bo, 0, nv50->base.client); + if (ret) { + nv50_hw_query_allocate(nv50, q, 0); + return false; +@@ -265,7 +265,7 @@ nv50_hw_end_query(struct nv50_context *n + break; + } + if (hq->is64bit) +- nouveau_fence_ref(nv50->screen->base.fence.current, &hq->fence); ++ nouveau_fence_ref(nv50->base.fence, &hq->fence); + } + + static bool +@@ -294,7 +294,7 @@ nv50_hw_get_query_result(struct nv50_con + } + return false; + } +- if (nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, nv50->screen->base.client)) ++ if (BO_WAIT(&nv50->screen->base, hq->bo, NOUVEAU_BO_RD, nv50->base.client)) + return false; + } + hq->state = NV50_HW_QUERY_STATE_READY; +@@ -447,14 +447,15 @@ nv50_hw_get_driver_query_info(struct nv5 + } + + void +-nv50_hw_query_pushbuf_submit(struct nouveau_pushbuf *push, uint16_t method, ++nv50_hw_query_pushbuf_submit(struct nv50_context *nv50, uint16_t method, + struct nv50_query *q, unsigned result_offset) + { ++ struct nouveau_pushbuf *push = nv50->base.pushbuf; + struct nv50_hw_query *hq = nv50_hw_query(q); + + nv50_hw_query_update(q); + if (hq->state != NV50_HW_QUERY_STATE_READY) +- nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, push->client); ++ BO_WAIT(&nv50->screen->base, hq->bo, NOUVEAU_BO_RD, push->client); + hq->state = NV50_HW_QUERY_STATE_READY; + + BEGIN_NV04(push, SUBC_3D(method), 1); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw.h 2022-02-11 14:53:21.749080536 -0600 +@@ -52,7 +52,7 @@ nv50_hw_get_driver_query_info(struct nv5 + bool + nv50_hw_query_allocate(struct nv50_context *, struct nv50_query *, int); + void +-nv50_hw_query_pushbuf_submit(struct nouveau_pushbuf *, uint16_t, ++nv50_hw_query_pushbuf_submit(struct nv50_context *, uint16_t, + struct nv50_query *, unsigned); + void + nv84_hw_query_fifo_wait(struct nouveau_pushbuf *, struct nv50_query *); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_query_hw_sm.c 2022-02-11 14:54:28.454680509 -0600 +@@ -321,7 +321,7 @@ nv50_hw_sm_query_read_data(uint32_t coun + if (hq->data[b + 4] != hq->sequence) { + if (!wait) + return false; +- if (nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, nv50->base.client)) ++ if (BO_WAIT(&nv50->screen->base, hq->bo, NOUVEAU_BO_RD, nv50->base.client)) + return false; + } + count[p][c] = hq->data[b + hsq->ctr[c]]; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_screen.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_screen.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_screen.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_screen.c 2022-02-11 14:55:45.692224889 -0600 +@@ -595,8 +595,6 @@ nv50_screen_destroy(struct pipe_screen * + if (!nouveau_drm_screen_unref(&screen->base)) + return; + +- nouveau_fence_cleanup(&screen->base); +- + if (screen->base.pushbuf) + screen->base.pushbuf->user_priv = NULL; + +@@ -1074,7 +1072,7 @@ nv50_screen_create(struct nouveau_device + goto fail; + } + +- nouveau_bo_map(screen->fence.bo, 0, NULL); ++ BO_MAP(&screen->base, screen->fence.bo, 0, NULL); + screen->fence.map = screen->fence.bo->map; + screen->base.fence.emit = nv50_screen_fence_emit; + screen->base.fence.update = nv50_screen_fence_update; +@@ -1217,8 +1215,6 @@ nv50_screen_create(struct nouveau_device + goto fail; + } + +- nouveau_fence_new(&screen->base, &screen->base.fence.current); +- + return &screen->base; + + fail: +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_screen.h mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_screen.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_screen.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_screen.h 2022-02-11 14:56:32.391952891 -0600 +@@ -133,32 +133,6 @@ int nv50_screen_tsc_alloc(struct nv50_sc + + int nv50_screen_compute_setup(struct nv50_screen *, struct nouveau_pushbuf *); + +-static inline void +-nv50_resource_fence(struct nv04_resource *res, uint32_t flags) +-{ +- struct nv50_screen *screen = nv50_screen(res->base.screen); +- +- if (res->mm) { +- nouveau_fence_ref(screen->base.fence.current, &res->fence); +- if (flags & NOUVEAU_BO_WR) +- nouveau_fence_ref(screen->base.fence.current, &res->fence_wr); +- } +-} +- +-static inline void +-nv50_resource_validate(struct nv04_resource *res, uint32_t flags) +-{ +- if (likely(res->bo)) { +- if (flags & NOUVEAU_BO_WR) +- res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING | +- NOUVEAU_BUFFER_STATUS_DIRTY; +- if (flags & NOUVEAU_BO_RD) +- res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; +- +- nv50_resource_fence(res, flags); +- } +-} +- + struct nv50_format { + uint32_t rt; + struct { +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c 2022-02-11 14:56:59.654795192 -0600 +@@ -717,7 +717,7 @@ nv50_stream_output_validate(struct nv50_ + PUSH_DATA(push, targ->pipe.buffer_size); + if (!targ->clean) { + assert(targ->pq); +- nv50_hw_query_pushbuf_submit(push, NVA0_3D_STRMOUT_OFFSET(i), ++ nv50_hw_query_pushbuf_submit(nv50, NVA0_3D_STRMOUT_OFFSET(i), + nv50_query(targ->pq), 0x4); + } else { + BEGIN_NV04(push, NVA0_3D(STRMOUT_OFFSET(i)), 1); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c 2022-02-11 14:58:09.012397327 -0600 +@@ -556,10 +556,10 @@ nv50_state_validate(struct nv50_context + PUSH_DATA (nv50->base.pushbuf, 0); + } + +- nv50_bufctx_fence(bufctx, false); ++ nv50_bufctx_fence(nv50, bufctx, false); + } + nouveau_pushbuf_bufctx(nv50->base.pushbuf, bufctx); +- ret = nouveau_pushbuf_validate(nv50->base.pushbuf); ++ ret = PUSH_VAL(nv50->base.pushbuf); + + return !ret; + } +@@ -575,7 +575,7 @@ nv50_state_validate_3d(struct nv50_conte + + if (unlikely(nv50->state.flushed)) { + nv50->state.flushed = false; +- nv50_bufctx_fence(nv50->bufctx_3d, true); ++ nv50_bufctx_fence(nv50, nv50->bufctx_3d, true); + } + return ret; + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_surface.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_surface.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_surface.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_surface.c 2022-02-11 18:05:39.993075211 -0600 +@@ -257,7 +257,7 @@ nv50_resource_copy_region(struct pipe_co + BCTX_REFN(nv50->bufctx, 2D, nv04_resource(src), RD); + BCTX_REFN(nv50->bufctx, 2D, nv04_resource(dst), WR); + nouveau_pushbuf_bufctx(nv50->base.pushbuf, nv50->bufctx); +- nouveau_pushbuf_validate(nv50->base.pushbuf); ++ PUSH_VAL(nv50->base.pushbuf); + + for (; dst_layer < dstz + src_box->depth; ++dst_layer, ++src_layer) { + ret = nv50_2d_texture_do_copy(nv50->base.pushbuf, +@@ -295,7 +295,7 @@ nv50_clear_render_target(struct pipe_con + PUSH_DATAf(push, color->f[2]); + PUSH_DATAf(push, color->f[3]); + +- if (nouveau_pushbuf_space(push, 64 + sf->depth, 1, 0)) ++ if (!PUSH_SPACE_EX(push, 64 + sf->depth, 1, 0)) + return; + + PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); +@@ -394,7 +394,7 @@ nv50_clear_depth_stencil(struct pipe_con + mode |= NV50_3D_CLEAR_BUFFERS_S; + } + +- if (nouveau_pushbuf_space(push, 64 + sf->depth, 1, 0)) ++ if (!PUSH_SPACE_EX(push, 64 + sf->depth, 1, 0)) + return; + + PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); +@@ -653,7 +653,7 @@ nv50_clear_buffer_push(struct pipe_conte + + nouveau_bufctx_refn(nv50->bufctx, 0, buf->bo, buf->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nv50->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + offset &= ~0xff; + +@@ -692,7 +692,7 @@ nv50_clear_buffer_push(struct pipe_conte + count -= nr; + } + +- nv50_resource_validate(buf, NOUVEAU_BO_WR); ++ nv50_resource_validate(nv50, buf, NOUVEAU_BO_WR); + + nouveau_bufctx_reset(nv50->bufctx, 0); + } +@@ -771,7 +771,7 @@ nv50_clear_buffer(struct pipe_context *p + PUSH_DATA (push, color.ui[2]); + PUSH_DATA (push, color.ui[3]); + +- if (nouveau_pushbuf_space(push, 64, 1, 0)) ++ if (!PUSH_SPACE_EX(push, 64, 1, 0)) + return; + + PUSH_REFN(push, buf->bo, buf->domain | NOUVEAU_BO_WR); +@@ -815,7 +815,7 @@ nv50_clear_buffer(struct pipe_context *p + BEGIN_NV04(push, NV50_3D(COND_MODE), 1); + PUSH_DATA (push, nv50->cond_condmode); + +- nv50_resource_validate(buf, NOUVEAU_BO_WR); ++ nv50_resource_validate(nv50, buf, NOUVEAU_BO_WR); + + if (width * height != elements) { + offset += width * height * data_size; +@@ -1639,7 +1639,7 @@ nv50_blit_eng2d(struct nv50_context *nv5 + BCTX_REFN(nv50->bufctx, 2D, &dst->base, WR); + BCTX_REFN(nv50->bufctx, 2D, &src->base, RD); + nouveau_pushbuf_bufctx(nv50->base.pushbuf, nv50->bufctx); +- if (nouveau_pushbuf_validate(nv50->base.pushbuf)) ++ if (PUSH_VAL(nv50->base.pushbuf)) + return; + + for (i = 0; i < info->dst.box.depth; ++i) { +@@ -1679,7 +1679,7 @@ nv50_blit_eng2d(struct nv50_context *nv5 + PUSH_DATA (push, srcy >> 32); + } + } +- nv50_bufctx_fence(nv50->bufctx, false); ++ nv50_bufctx_fence(nv50, nv50->bufctx, false); + + nouveau_bufctx_reset(nv50->bufctx, NV50_BIND_2D); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_transfer.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_transfer.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_transfer.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_transfer.c 2022-02-11 15:02:10.331043100 -0600 +@@ -67,7 +67,7 @@ nv50_2d_transfer_rect(struct nv50_contex + nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + uint32_t format; + switch (cpp) { +@@ -197,7 +197,7 @@ nv50_m2mf_transfer_rect(struct nv50_cont + nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + if (nouveau_bo_memtype(src->bo)) { + BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 6); +@@ -284,7 +284,7 @@ nv50_sifc_linear_u8(struct nouveau_conte + + nouveau_bufctx_refn(nv50->bufctx, 0, dst, domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nv50->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + offset &= ~0xff; + +@@ -337,7 +337,7 @@ nv50_m2mf_copy_linear(struct nouveau_con + nouveau_bufctx_refn(bctx, 0, src, srcdom | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst, dstdom | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 1); + PUSH_DATA (push, 1); +@@ -375,7 +375,6 @@ nv50_miptree_transfer_map(struct pipe_co + const struct pipe_box *box, + struct pipe_transfer **ptransfer) + { +- struct nv50_screen *screen = nv50_screen(pctx->screen); + struct nv50_context *nv50 = nv50_context(pctx); + struct nouveau_device *dev = nv50->screen->base.device; + const struct nv50_miptree *mt = nv50_miptree(res); +@@ -454,7 +453,7 @@ nv50_miptree_transfer_map(struct pipe_co + if (usage & PIPE_MAP_WRITE) + flags |= NOUVEAU_BO_WR; + +- ret = nouveau_bo_map(tx->rect[1].bo, flags, screen->base.client); ++ ret = BO_MAP(nv50->base.screen, tx->rect[1].bo, flags, nv50->base.client); + if (ret) { + nouveau_bo_ref(NULL, &tx->rect[1].bo); + FREE(tx); +@@ -486,7 +485,7 @@ nv50_miptree_transfer_unmap(struct pipe_ + } + + /* Allow the copies above to finish executing before freeing the source */ +- nouveau_fence_work(nv50->screen->base.fence.current, ++ nouveau_fence_work(nv50->base.fence, + nouveau_fence_unref_bo, tx->rect[1].bo); + } else { + nouveau_bo_ref(NULL, &tx->rect[1].bo); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_vbo.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_vbo.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv50_vbo.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv50_vbo.c 2022-02-11 15:03:36.446568575 -0600 +@@ -624,14 +624,14 @@ nv50_draw_elements(struct nv50_context * + * the not-yet-written data. Ideally this wait would only happen on + * pushbuf submit, but it's probably not a big performance difference. + */ +- if (buf->fence_wr && !nouveau_fence_signalled(buf->fence_wr)) ++ if (buf->fence_wr) + nouveau_fence_wait(buf->fence_wr, &nv50->base.debug); + + while (instance_count--) { + BEGIN_NV04(push, NV50_3D(VERTEX_BEGIN_GL), 1); + PUSH_DATA (push, prim); + +- nouveau_pushbuf_space(push, 16, 0, 1); ++ PUSH_SPACE_EX(push, 16, 0, 1); + PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain); + + switch (index_size) { +@@ -737,7 +737,7 @@ nva0_draw_stream_output(struct nv50_cont + PUSH_DATA (push, 0); + BEGIN_NV04(push, NVA0_3D(DRAW_TFB_STRIDE), 1); + PUSH_DATA (push, so->stride); +- nv50_hw_query_pushbuf_submit(push, NVA0_3D_DRAW_TFB_BYTES, ++ nv50_hw_query_pushbuf_submit(nv50, NVA0_3D_DRAW_TFB_BYTES, + nv50_query(so->pq), 0x4); + BEGIN_NV04(push, NV50_3D(VERTEX_END_GL), 1); + PUSH_DATA (push, 0); +@@ -752,8 +752,6 @@ nv50_draw_vbo_kick_notify(struct nouveau + struct nv50_screen *screen = chan->user_priv; + + nouveau_fence_update(&screen->base, true); +- +- nv50_bufctx_fence(screen->cur_ctx->bufctx_3d, true); + } + + void +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv84_video_bsp.c 2022-02-11 15:09:14.426111024 -0600 +@@ -89,6 +89,7 @@ nv84_decoder_bsp(struct nv84_decoder *de + const unsigned *num_bytes, + struct nv84_video_buffer *dest) + { ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + struct iparm params; + uint32_t more_params[0x44 / 4] = {0}; + unsigned total_bytes = 0; +@@ -103,7 +104,7 @@ nv84_decoder_bsp(struct nv84_decoder *de + { dec->fence, NOUVEAU_BO_RDWR | NOUVEAU_BO_VRAM }, + }; + +- nouveau_bo_wait(dec->fence, NOUVEAU_BO_RDWR, dec->client); ++ BO_WAIT(screen, dec->fence, NOUVEAU_BO_RDWR, dec->client); + + STATIC_ASSERT(sizeof(struct iparm) == 0x530); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv84_video.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv84_video.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv84_video.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv84_video.c 2022-02-11 15:08:27.115135546 -0600 +@@ -69,6 +69,7 @@ nv84_load_firmwares(struct nouveau_devic + { + int ret, size1, size2 = 0; + struct nouveau_bo *fw; ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + + size1 = filesize(fw1); + if (fw2) +@@ -81,7 +82,7 @@ nv84_load_firmwares(struct nouveau_devic + ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 0, dec->vp_fw2_offset + size2, NULL, &fw); + if (ret) + return NULL; +- ret = nouveau_bo_map(fw, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, fw, NOUVEAU_BO_WR, dec->client); + if (ret) + goto error; + +@@ -183,11 +184,12 @@ nv84_decoder_begin_frame_mpeg12(struct p + struct pipe_video_buffer *target, + struct pipe_picture_desc *picture) + { ++ struct nouveau_screen *screen = nouveau_screen(decoder->context->screen); + struct nv84_decoder *dec = (struct nv84_decoder *)decoder; + struct pipe_mpeg12_picture_desc *desc = (struct pipe_mpeg12_picture_desc *)picture; + int i; + +- nouveau_bo_wait(dec->mpeg12_bo, NOUVEAU_BO_RDWR, dec->client); ++ BO_WAIT(screen, dec->mpeg12_bo, NOUVEAU_BO_RDWR, dec->client); + dec->mpeg12_mb_info = dec->mpeg12_bo->map + 0x100; + dec->mpeg12_data = dec->mpeg12_bo->map + 0x100 + + align(0x20 * mb(dec->base.width) * mb(dec->base.height), 0x100); +@@ -406,14 +408,14 @@ nv84_create_decoder(struct pipe_context + NULL, &dec->bitstream); + if (ret) + goto fail; +- ret = nouveau_bo_map(dec->bitstream, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, dec->bitstream, NOUVEAU_BO_WR, dec->client); + if (ret) + goto fail; + ret = nouveau_bo_new(screen->device, NOUVEAU_BO_GART, + 0, 0x2000, NULL, &dec->vp_params); + if (ret) + goto fail; +- ret = nouveau_bo_map(dec->vp_params, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, dec->vp_params, NOUVEAU_BO_WR, dec->client); + if (ret) + goto fail; + } +@@ -425,7 +427,7 @@ nv84_create_decoder(struct pipe_context + NULL, &dec->mpeg12_bo); + if (ret) + goto fail; +- ret = nouveau_bo_map(dec->mpeg12_bo, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen,dec->mpeg12_bo, NOUVEAU_BO_WR, dec->client); + if (ret) + goto fail; + } +@@ -434,7 +436,7 @@ nv84_create_decoder(struct pipe_context + 0, 0x1000, NULL, &dec->fence); + if (ret) + goto fail; +- ret = nouveau_bo_map(dec->fence, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, dec->fence, NOUVEAU_BO_WR, dec->client); + if (ret) + goto fail; + *(uint32_t *)dec->fence->map = 0; +@@ -493,17 +495,17 @@ nv84_create_decoder(struct pipe_context + surf.offset = dec->vpring->size - 0x1000; + context->clear_render_target(context, &surf.base, &color, 0, 0, 1024, 1, false); + +- PUSH_SPACE(screen->pushbuf, 5); +- PUSH_REFN(screen->pushbuf, dec->fence, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR); ++ PUSH_SPACE(nv50->base.pushbuf, 5); ++ PUSH_REFN(nv50->base.pushbuf, dec->fence, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR); + /* The clear_render_target is done via 3D engine, so use it to write to a + * sempahore to indicate that it's done. + */ +- BEGIN_NV04(screen->pushbuf, NV50_3D(QUERY_ADDRESS_HIGH), 4); +- PUSH_DATAh(screen->pushbuf, dec->fence->offset); +- PUSH_DATA (screen->pushbuf, dec->fence->offset); +- PUSH_DATA (screen->pushbuf, 1); +- PUSH_DATA (screen->pushbuf, 0xf010); +- PUSH_KICK (screen->pushbuf); ++ BEGIN_NV04(nv50->base.pushbuf, NV50_3D(QUERY_ADDRESS_HIGH), 4); ++ PUSH_DATAh(nv50->base.pushbuf, dec->fence->offset); ++ PUSH_DATA (nv50->base.pushbuf, dec->fence->offset); ++ PUSH_DATA (nv50->base.pushbuf, 1); ++ PUSH_DATA (nv50->base.pushbuf, 0xf010); ++ PUSH_KICK (nv50->base.pushbuf); + + PUSH_SPACE(bsp_push, 2 + 12 + 2 + 4 + 3); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c 2022-02-11 15:12:36.619828402 -0600 +@@ -39,6 +39,7 @@ nv98_decoder_bsp(struct nouveau_vp3_deco + unsigned *vp_caps, unsigned *is_ref, + struct nouveau_vp3_video_buffer *refs[16]) + { ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + struct nouveau_pushbuf *push = dec->pushbuf[0]; + enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile); + uint32_t bsp_addr, comm_addr, inter_addr; +@@ -95,7 +96,7 @@ nv98_decoder_bsp(struct nouveau_vp3_deco + bo_refs[1].bo = dec->inter_bo[comm_seq & 1] = inter_bo = tmp_bo; + } + +- ret = nouveau_bo_map(bsp_bo, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, bsp_bo, NOUVEAU_BO_WR, dec->client); + if (ret) { + debug_printf("map failed: %i %s\n", ret, strerror(-ret)); + return -1; +@@ -107,7 +108,7 @@ nv98_decoder_bsp(struct nouveau_vp3_deco + + nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs); + +- nouveau_pushbuf_space(push, 32, num_refs, 0); ++ PUSH_SPACE_EX(push, 32, num_refs, 0); + nouveau_pushbuf_refn(push, bo_refs, num_refs); + + bsp_addr = bsp_bo->offset >> 8; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video.c 2022-02-11 15:11:41.428930690 -0600 +@@ -85,7 +85,8 @@ struct pipe_video_codec * + nv98_create_decoder(struct pipe_context *context, + const struct pipe_video_codec *templ) + { +- struct nouveau_screen *screen = &((struct nv50_context *)context)->screen->base; ++ struct nv50_context *nv50 = nv50_context(context); ++ struct nouveau_screen *screen = &nv50->screen->base; + struct nouveau_vp3_decoder *dec; + struct nouveau_pushbuf **push; + struct nv04_fifo nv04_data = {.vram = 0xbeef0201, .gart = 0xbeef0202}; +@@ -106,7 +107,7 @@ nv98_create_decoder(struct pipe_context + dec = CALLOC_STRUCT(nouveau_vp3_decoder); + if (!dec) + return NULL; +- dec->client = screen->client; ++ dec->client = nv50->base.client; + dec->base = *templ; + nouveau_vp3_decoder_init_common(&dec->base); + +@@ -119,7 +120,7 @@ nv98_create_decoder(struct pipe_context + &nv04_data, sizeof(nv04_data), &dec->channel[0]); + + if (!ret) +- ret = nouveau_pushbuf_new(screen->client, dec->channel[0], 4, ++ ret = nouveau_pushbuf_new(nv50->base.client, dec->channel[0], 4, + 32 * 1024, true, &dec->pushbuf[0]); + + for (i = 1; i < 3; ++i) { +@@ -268,13 +269,13 @@ nv98_create_decoder(struct pipe_context + if (ret) + goto fail; + +- nouveau_bo_map(dec->fence_bo, NOUVEAU_BO_RDWR, screen->client); ++ BO_MAP(dec->fence_bo, NOUVEAU_BO_RDWR, screen->client); + dec->fence_map = dec->fence_bo->map; + dec->fence_map[0] = dec->fence_map[4] = dec->fence_map[8] = 0; + dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map))); + + /* So lets test if the fence is working? */ +- nouveau_pushbuf_space(push[0], 16, 1, 0); ++ PUSH_SPACE_EX(push[0], 16, 1, 0); + PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NV04(push[0], SUBC_BSP(0x240), 3); + PUSH_DATAh(push[0], dec->fence_bo->offset); +@@ -285,7 +286,7 @@ nv98_create_decoder(struct pipe_context + PUSH_DATA (push[0], 0); + PUSH_KICK (push[0]); + +- nouveau_pushbuf_space(push[1], 16, 1, 0); ++ PUSH_SPACE_EX(push[1], 16, 1, 0); + PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NV04(push[1], SUBC_VP(0x240), 3); + PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10)); +@@ -296,7 +297,7 @@ nv98_create_decoder(struct pipe_context + PUSH_DATA (push[1], 0); + PUSH_KICK (push[1]); + +- nouveau_pushbuf_space(push[2], 16, 1, 0); ++ PUSH_SPACE_EX(push[2], 16, 1, 0); + PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NV04(push[2], SUBC_PPP(0x240), 3); + PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20)); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c 2022-02-11 15:12:49.083803035 -0600 +@@ -94,7 +94,7 @@ nv98_decoder_ppp(struct nouveau_vp3_deco + struct nouveau_pushbuf *push = dec->pushbuf[2]; + unsigned ppp_caps = 0x10; + +- nouveau_pushbuf_space(push, 32, 4, 0); ++ PUSH_SPACE_EX(push, 32, 4, 0); + + switch (codec) { + case PIPE_VIDEO_FORMAT_MPEG12: { +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c 2022-02-11 15:13:28.216718331 -0600 +@@ -44,7 +44,7 @@ static void dump_comm_vp(struct nouveau_ + + if ((comm->pvp_stage & 0xff) != 0xff) { + unsigned *map; +- int ret = nouveau_bo_map(inter_bo, NOUVEAU_BO_RD|NOUVEAU_BO_NOBLOCK, dec->client); ++ int ret = BO_MAP(inter_bo, NOUVEAU_BO_RD|NOUVEAU_BO_NOBLOCK, dec->client); + assert(ret >= 0); + map = inter_bo->map; + for (i = 0; i < comm->byte_ofs + slice_size; i += 0x10) { +@@ -111,7 +111,7 @@ nv98_decoder_vp(struct nouveau_vp3_decod + if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom)) + nv98_decoder_kick_ref(dec, target); + +- nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0); ++ PUSH_SPACE_EX(push, 32 + codec_extra, num_refs, 0); + + nouveau_pushbuf_refn(push, bo_refs, num_refs); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c 2022-02-11 15:16:25.426251672 -0600 +@@ -428,10 +428,11 @@ nvc0_launch_grid(struct pipe_context *pi + struct nvc0_program *cp = nvc0->compprog; + int ret; + ++ simple_mtx_lock(&screen->state_lock); + ret = !nvc0_state_validate_cp(nvc0, ~0); + if (ret) { + NOUVEAU_ERR("Failed to launch grid !\n"); +- return; ++ goto out; + } + + nvc0_compute_upload_input(nvc0, info); +@@ -464,7 +465,7 @@ nvc0_launch_grid(struct pipe_context *pi + PUSH_DATA (push, (info->block[1] << 16) | info->block[0]); + PUSH_DATA (push, info->block[2]); + +- nouveau_pushbuf_space(push, 32, 2, 1); ++ PUSH_SPACE_EX(push, 32, 2, 1); + PUSH_REFN(push, screen->text, NV_VRAM_DOMAIN(&screen->base) | NOUVEAU_BO_RD); + + if (unlikely(info->indirect)) { +@@ -502,6 +503,9 @@ nvc0_launch_grid(struct pipe_context *pi + nvc0->images_dirty[5] |= nvc0->images_valid[5]; + + nvc0_update_compute_invocations_counter(nvc0, info); ++ ++out: ++ simple_mtx_unlock(&screen->state_lock); + } + + static void +@@ -511,7 +515,7 @@ nvc0_compute_update_indirect_invocations + struct nv04_resource *res = nv04_resource(info->indirect); + uint32_t offset = res->offset + info->indirect_offset; + +- nouveau_pushbuf_space(push, 16, 0, 8); ++ PUSH_SPACE_EX(push, 16, 0, 8); + PUSH_REFN(push, res->bo, NOUVEAU_BO_RD | res->domain); + BEGIN_1IC0(push, NVC0_3D(MACRO_COMPUTE_COUNTER), 7); + PUSH_DATA(push, 6); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_context.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_context.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_context.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_context.c 2022-02-11 18:08:12.440206042 -0600 +@@ -81,10 +81,9 @@ nvc0_flush(struct pipe_context *pipe, + unsigned flags) + { + struct nvc0_context *nvc0 = nvc0_context(pipe); +- struct nouveau_screen *screen = &nvc0->screen->base; + + if (fence) +- nouveau_fence_ref(screen->fence.current, (struct nouveau_fence **)fence); ++ nouveau_fence_ref(nvc0->base.fence, (struct nouveau_fence **)fence); + + PUSH_KICK(nvc0->base.pushbuf); /* fencing handled in kick_notify */ + +@@ -257,7 +256,7 @@ nvc0_destroy(struct pipe_context *pipe) + * Other contexts will always set their bufctx again on action calls. + */ + nouveau_pushbuf_bufctx(nvc0->base.pushbuf, NULL); +- nouveau_pushbuf_kick(nvc0->base.pushbuf, nvc0->base.pushbuf->channel); ++ PUSH_KICK(nvc0->base.pushbuf); + + nvc0_context_unreference_resources(nvc0); + nvc0_blitctx_destroy(nvc0); +@@ -272,6 +271,7 @@ nvc0_destroy(struct pipe_context *pipe) + free(pos); + } + ++ nouveau_fence_cleanup(&nvc0->base); + nouveau_context_destroy(&nvc0->base); + } + +@@ -279,12 +279,12 @@ void + nvc0_default_kick_notify(struct nouveau_pushbuf *push) + { + struct nvc0_screen *screen = push->user_priv; ++ struct nvc0_context *nvc0 = screen->cur_ctx; + +- if (screen) { +- nouveau_fence_next(&screen->base); ++ if (nvc0) { ++ nouveau_fence_next(&nvc0->base); + nouveau_fence_update(&screen->base, true); +- if (screen->cur_ctx) +- screen->cur_ctx->state.flushed = true; ++ nvc0->state.flushed = true; + NOUVEAU_DRV_STAT(&screen->base, pushbuf_count, 1); + } + } +@@ -425,22 +425,19 @@ nvc0_create(struct pipe_screen *pscreen, + if (!nvc0_blitctx_create(nvc0)) + goto out_err; + +- nvc0->base.pushbuf = screen->base.pushbuf; +- nvc0->base.client = screen->base.client; ++ nouveau_context_init(&nvc0->base, &screen->base); + +- ret = nouveau_bufctx_new(screen->base.client, 2, &nvc0->bufctx); ++ ret = nouveau_bufctx_new(nvc0->base.client, 2, &nvc0->bufctx); + if (!ret) +- ret = nouveau_bufctx_new(screen->base.client, NVC0_BIND_3D_COUNT, ++ ret = nouveau_bufctx_new(nvc0->base.client, NVC0_BIND_3D_COUNT, + &nvc0->bufctx_3d); + if (!ret) +- ret = nouveau_bufctx_new(screen->base.client, NVC0_BIND_CP_COUNT, ++ ret = nouveau_bufctx_new(nvc0->base.client, NVC0_BIND_CP_COUNT, + &nvc0->bufctx_cp); + if (ret) + goto out_err; + + nvc0->screen = screen; +- nvc0->base.screen = &screen->base; +- + pipe->screen = pscreen; + pipe->priv = priv; + pipe->stream_uploader = u_upload_create_default(pipe); +@@ -464,7 +461,6 @@ nvc0_create(struct pipe_screen *pscreen, + pipe->emit_string_marker = nvc0_emit_string_marker; + pipe->get_device_reset_status = nvc0_get_device_reset_status; + +- nouveau_context_init(&nvc0->base); + nvc0_init_query_functions(nvc0); + nvc0_init_surface_functions(nvc0); + nvc0_init_state_functions(nvc0); +@@ -553,6 +549,8 @@ nvc0_create(struct pipe_screen *pscreen, + nvc0->dirty_cp |= NVC0_NEW_CP_SAMPLERS; + } + ++ nouveau_fence_new(&nvc0->base, &nvc0->base.fence); ++ + return pipe; + + out_err: +@@ -583,7 +581,7 @@ nvc0_bufctx_fence(struct nvc0_context *n + struct nouveau_bufref *ref = (struct nouveau_bufref *)it; + struct nv04_resource *res = ref->priv; + if (res) +- nvc0_resource_validate(res, (unsigned)ref->priv_data); ++ nvc0_resource_validate(nvc0, res, (unsigned)ref->priv_data); + NOUVEAU_DRV_STAT_IFD(count++); + } + NOUVEAU_DRV_STAT(&nvc0->screen->base, resource_validate_count, count); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_context.h mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_context.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_context.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_context.h 2022-02-11 15:23:13.508824215 -0600 +@@ -311,6 +311,30 @@ nvc0_shader_stage(unsigned pipe) + } + + ++static inline void ++nvc0_resource_fence(struct nvc0_context *nvc0, struct nv04_resource *res, uint32_t flags) ++{ ++ if (res->mm) { ++ nouveau_fence_ref(nvc0->base.fence, &res->fence); ++ if (flags & NOUVEAU_BO_WR) ++ nouveau_fence_ref(nvc0->base.fence, &res->fence_wr); ++ } ++} ++ ++static inline void ++nvc0_resource_validate(struct nvc0_context *nvc0, struct nv04_resource *res, uint32_t flags) ++{ ++ if (likely(res->bo)) { ++ if (flags & NOUVEAU_BO_WR) ++ res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING | ++ NOUVEAU_BUFFER_STATUS_DIRTY; ++ if (flags & NOUVEAU_BO_RD) ++ res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; ++ ++ nvc0_resource_fence(nvc0, res, flags); ++ } ++} ++ + /* nvc0_context.c */ + struct pipe_context *nvc0_create(struct pipe_screen *, void *, unsigned flags); + void nvc0_bufctx_fence(struct nvc0_context *, struct nouveau_bufctx *, +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_program.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_program.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_program.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_program.c 2022-02-11 15:25:32.848266636 -0600 +@@ -884,6 +884,7 @@ nvc0_program_upload(struct nvc0_context + size += TU102_SHADER_HEADER_SIZE; + } + ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); + ret = nvc0_program_alloc_code(nvc0, prog); + if (ret) { + struct nouveau_heap *heap = screen->text_heap; +@@ -990,8 +991,11 @@ nvc0_program_destroy(struct nvc0_context + const struct pipe_shader_state pipe = prog->pipe; + const ubyte type = prog->type; + +- if (prog->mem) ++ if (prog->mem) { ++ if (nvc0) ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); + nouveau_heap_free(&prog->mem); ++ } + FREE(prog->code); /* may be 0 for hardcoded shaders */ + FREE(prog->relocs); + FREE(prog->fixups); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c 2022-02-11 15:30:18.641058844 -0600 +@@ -44,7 +44,7 @@ nvc0_hw_query_allocate(struct nvc0_conte + if (hq->state == NVC0_HW_QUERY_STATE_READY) + nouveau_mm_free(hq->mm); + else +- nouveau_fence_work(screen->base.fence.current, ++ nouveau_fence_work(nvc0->base.fence, + nouveau_mm_free_work, hq->mm); + } + } +@@ -55,7 +55,7 @@ nvc0_hw_query_allocate(struct nvc0_conte + return false; + hq->offset = hq->base_offset; + +- ret = nouveau_bo_map(hq->bo, 0, screen->base.client); ++ ret = BO_MAP(&screen->base, hq->bo, 0, nvc0->base.client); + if (ret) { + nvc0_hw_query_allocate(nvc0, q, 0); + return false; +@@ -129,7 +129,7 @@ nvc0_hw_query_write_compute_invocations( + { + struct nouveau_pushbuf *push = nvc0->base.pushbuf; + +- nouveau_pushbuf_space(push, 16, 0, 8); ++ PUSH_SPACE_EX(push, 16, 0, 8); + PUSH_REFN(push, hq->bo, NOUVEAU_BO_GART | NOUVEAU_BO_WR); + BEGIN_1IC0(push, NVC0_3D(MACRO_COMPUTE_COUNTER_TO_QUERY), 4); + PUSH_DATA (push, nvc0->compute_invocations); +@@ -301,7 +301,7 @@ nvc0_hw_end_query(struct nvc0_context *n + break; + } + if (hq->is64bit) +- nouveau_fence_ref(nvc0->screen->base.fence.current, &hq->fence); ++ nouveau_fence_ref(nvc0->base.fence, &hq->fence); + } + + static bool +@@ -319,7 +319,7 @@ nvc0_hw_get_query_result(struct nvc0_con + return hq->funcs->get_query_result(nvc0, hq, wait, result); + + if (hq->state != NVC0_HW_QUERY_STATE_READY) +- nvc0_hw_query_update(nvc0->screen->base.client, q); ++ nvc0_hw_query_update(nvc0->base.client, q); + + if (hq->state != NVC0_HW_QUERY_STATE_READY) { + if (!wait) { +@@ -330,7 +330,7 @@ nvc0_hw_get_query_result(struct nvc0_con + } + return false; + } +- if (nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, nvc0->screen->base.client)) ++ if (BO_WAIT(&nvc0->screen->base, hq->bo, NOUVEAU_BO_RD, nvc0->base.client)) + return false; + NOUVEAU_DRV_STAT(&nvc0->screen->base, query_sync_count, 1); + } +@@ -403,7 +403,7 @@ nvc0_hw_get_query_result_resource(struct + if (index == -1) { + /* TODO: Use a macro to write the availability of the query */ + if (hq->state != NVC0_HW_QUERY_STATE_READY) +- nvc0_hw_query_update(nvc0->screen->base.client, q); ++ nvc0_hw_query_update(nvc0->base.client, q); + uint32_t ready[2] = {hq->state == NVC0_HW_QUERY_STATE_READY}; + nvc0->base.push_cb(&nvc0->base, buf, offset, + result_type >= PIPE_QUERY_TYPE_I64 ? 2 : 1, +@@ -412,7 +412,7 @@ nvc0_hw_get_query_result_resource(struct + util_range_add(&buf->base, &buf->valid_buffer_range, offset, + offset + (result_type >= PIPE_QUERY_TYPE_I64 ? 8 : 4)); + +- nvc0_resource_validate(buf, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, buf, NOUVEAU_BO_WR); + + return; + } +@@ -420,7 +420,7 @@ nvc0_hw_get_query_result_resource(struct + /* If the fence guarding this query has not been emitted, that makes a lot + * of the following logic more complicated. + */ +- if (hq->is64bit && hq->fence->state < NOUVEAU_FENCE_STATE_EMITTED) ++ if (hq->is64bit) + nouveau_fence_emit(hq->fence); + + /* We either need to compute a 32- or 64-bit difference between 2 values, +@@ -430,12 +430,12 @@ nvc0_hw_get_query_result_resource(struct + * outputs the difference (no need to worry about 64-bit clamping). + */ + if (hq->state != NVC0_HW_QUERY_STATE_READY) +- nvc0_hw_query_update(nvc0->screen->base.client, q); ++ nvc0_hw_query_update(nvc0->base.client, q); + + if (wait && hq->state != NVC0_HW_QUERY_STATE_READY) + nvc0_hw_query_fifo_wait(nvc0, q); + +- nouveau_pushbuf_space(push, 32, 2, 3); ++ PUSH_SPACE_EX(push, 32, 2, 3); + PUSH_REFN (push, hq->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD); + PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR); + BEGIN_1IC0(push, NVC0_3D(MACRO_QUERY_BUFFER_WRITE), 9); +@@ -511,7 +511,7 @@ nvc0_hw_get_query_result_resource(struct + util_range_add(&buf->base, &buf->valid_buffer_range, offset, + offset + (result_type >= PIPE_QUERY_TYPE_I64 ? 8 : 4)); + +- nvc0_resource_validate(buf, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, buf, NOUVEAU_BO_WR); + } + + static const struct nvc0_query_funcs hw_query_funcs = { +@@ -642,7 +642,7 @@ nvc0_hw_query_fifo_wait(struct nvc0_cont + unsigned offset = hq->offset; + + /* ensure the query's fence has been emitted */ +- if (hq->is64bit && hq->fence->state < NOUVEAU_FENCE_STATE_EMITTED) ++ if (hq->is64bit) + nouveau_fence_emit(hq->fence); + + PUSH_SPACE(push, 5); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw_sm.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw_sm.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw_sm.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw_sm.c 2022-02-11 15:31:39.237707036 -0600 +@@ -2636,7 +2636,7 @@ nvc0_hw_sm_query_read_data(uint32_t coun + if (hq->data[b + 8] != hq->sequence) { + if (!wait) + return false; +- if (nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, nvc0->base.client)) ++ if (BO_WAIT(&nvc0->screen->base, hq->bo, NOUVEAU_BO_RD, nvc0->base.client)) + return false; + } + count[p][c] = hq->data[b + hsq->ctr[c]] * (1 << c); +@@ -2664,7 +2664,7 @@ nve4_hw_sm_query_read_data(uint32_t coun + if (hq->data[b + 20 + d] != hq->sequence) { + if (!wait) + return false; +- if (nouveau_bo_wait(hq->bo, NOUVEAU_BO_RD, nvc0->base.client)) ++ if (BO_WAIT(&nvc0->screen->base, hq->bo, NOUVEAU_BO_RD, nvc0->base.client)) + return false; + } + if (hsq->ctr[c] & ~0x3) +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 2022-02-11 16:20:30.965275088 -0600 +@@ -701,8 +701,6 @@ nvc0_screen_destroy(struct pipe_screen * + if (!nouveau_drm_screen_unref(&screen->base)) + return; + +- nouveau_fence_cleanup(&screen->base); +- + if (screen->base.pushbuf) + screen->base.pushbuf->user_priv = NULL; + +@@ -733,6 +731,7 @@ nvc0_screen_destroy(struct pipe_screen * + nouveau_object_del(&screen->nvsw); + + nouveau_screen_fini(&screen->base); ++ simple_mtx_destroy(&screen->state_lock); + + FREE(screen); + } +@@ -1058,6 +1057,8 @@ nvc0_screen_create(struct nouveau_device + return NULL; + pscreen = &screen->base.base; + pscreen->destroy = nvc0_screen_destroy; ++ ++ simple_mtx_init(&screen->state_lock, mtx_plain); + + ret = nouveau_screen_init(&screen->base, dev); + if (ret) +@@ -1109,7 +1110,7 @@ nvc0_screen_create(struct nouveau_device + ret = nouveau_bo_new(dev, flags, 0, 4096, NULL, &screen->fence.bo); + if (ret) + FAIL_SCREEN_INIT("Error allocating fence BO: %d\n", ret); +- nouveau_bo_map(screen->fence.bo, 0, NULL); ++ BO_MAP(&screen->base, screen->fence.bo, 0, NULL); + screen->fence.map = screen->fence.bo->map; + screen->base.fence.emit = nvc0_screen_fence_emit; + screen->base.fence.update = nvc0_screen_fence_update; +@@ -1558,8 +1559,6 @@ nvc0_screen_create(struct nouveau_device + if (!nvc0_blitter_create(screen)) + goto fail; + +- nouveau_fence_new(&screen->base, &screen->base.fence.current); +- + return &screen->base; + + fail: +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h 2022-02-11 16:21:46.650277251 -0600 +@@ -71,6 +71,7 @@ struct nvc0_screen { + + struct nvc0_context *cur_ctx; + struct nvc0_graph_state save_state; ++ simple_mtx_t state_lock; + + int num_occlusion_queries_active; + +@@ -157,32 +158,6 @@ int nvc0_screen_resize_text_area(struct + // 3D Only + void nvc0_screen_bind_cb_3d(struct nvc0_screen *, bool *, int, int, int, uint64_t); + +-static inline void +-nvc0_resource_fence(struct nv04_resource *res, uint32_t flags) +-{ +- struct nvc0_screen *screen = nvc0_screen(res->base.screen); +- +- if (res->mm) { +- nouveau_fence_ref(screen->base.fence.current, &res->fence); +- if (flags & NOUVEAU_BO_WR) +- nouveau_fence_ref(screen->base.fence.current, &res->fence_wr); +- } +-} +- +-static inline void +-nvc0_resource_validate(struct nv04_resource *res, uint32_t flags) +-{ +- if (likely(res->bo)) { +- if (flags & NOUVEAU_BO_WR) +- res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING | +- NOUVEAU_BUFFER_STATUS_DIRTY; +- if (flags & NOUVEAU_BO_RD) +- res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; +- +- nvc0_resource_fence(res, flags); +- } +-} +- + struct nvc0_format { + uint32_t rt; + struct { +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c 2022-02-11 16:24:08.657161261 -0600 +@@ -71,6 +71,7 @@ nvc0_program_sp_start_id(struct nvc0_con + { + struct nouveau_pushbuf *push = nvc0->base.pushbuf; + ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); + if (nvc0->screen->eng3d->oclass < GV100_3D_CLASS) { + BEGIN_NVC0(push, NVC0_3D(SP_START_ID(stage)), 1); + PUSH_DATA (push, prog->code_base); +@@ -338,6 +339,8 @@ nvc0_tfb_validate(struct nvc0_context *n + } + } + } ++ ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); + nvc0->state.tfb = tfb; + + if (!(nvc0->dirty_3d & NVC0_NEW_3D_TFB_TARGETS)) +@@ -364,7 +367,7 @@ nvc0_tfb_validate(struct nvc0_context *n + + if (!targ->clean) + nvc0_hw_query_fifo_wait(nvc0, nvc0_query(targ->pq)); +- nouveau_pushbuf_space(push, 0, 0, 1); ++ PUSH_SPACE_EX(push, 0, 0, 1); + BEGIN_NVC0(push, NVC0_3D(TFB_BUFFER_ENABLE(b)), 5); + PUSH_DATA (push, 1); + PUSH_DATAh(push, buf->address + targ->pipe.buffer_offset); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_state.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_state.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_state.c 2022-02-11 16:25:08.106073895 -0600 +@@ -635,9 +635,12 @@ nvc0_sp_state_create(struct pipe_context + static void + nvc0_sp_state_delete(struct pipe_context *pipe, void *hwcso) + { ++ struct nvc0_context *nvc0 = nvc0_context(pipe); + struct nvc0_program *prog = (struct nvc0_program *)hwcso; + ++ simple_mtx_lock(&nvc0->screen->state_lock); + nvc0_program_destroy(nvc0_context(pipe), prog); ++ simple_mtx_unlock(&nvc0->screen->state_lock); + + if (prog->pipe.type == PIPE_SHADER_IR_TGSI) + FREE((void *)prog->pipe.tokens); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c 2022-02-11 16:26:48.061884623 -0600 +@@ -253,7 +253,7 @@ nvc0_validate_fb(struct nvc0_context *nv + PUSH_DATA(push, 0); + PUSH_DATA(push, 0); + +- nvc0_resource_fence(res, NOUVEAU_BO_WR); ++ nvc0_resource_fence(nvc0, res, NOUVEAU_BO_WR); + + assert(!fb->zsbuf); + } +@@ -871,6 +871,7 @@ nvc0_switch_pipe_context(struct nvc0_con + struct nvc0_context *ctx_from = ctx_to->screen->cur_ctx; + unsigned s; + ++ simple_mtx_assert_locked(&ctx_to->screen->state_lock); + if (ctx_from) + ctx_to->state = ctx_from->state; + else +@@ -967,6 +968,8 @@ nvc0_state_validate(struct nvc0_context + int ret; + unsigned i; + ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); ++ + if (nvc0->screen->cur_ctx != nvc0) + nvc0_switch_pipe_context(nvc0); + +@@ -985,7 +988,7 @@ nvc0_state_validate(struct nvc0_context + } + + nouveau_pushbuf_bufctx(nvc0->base.pushbuf, bufctx); +- ret = nouveau_pushbuf_validate(nvc0->base.pushbuf); ++ ret = PUSH_VAL(nvc0->base.pushbuf); + + return !ret; + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c 2022-02-11 16:33:12.692802344 -0600 +@@ -267,7 +267,7 @@ nvc0_resource_copy_region(struct pipe_co + BCTX_REFN(nvc0->bufctx, 2D, nv04_resource(src), RD); + BCTX_REFN(nvc0->bufctx, 2D, nv04_resource(dst), WR); + nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx); +- nouveau_pushbuf_validate(nvc0->base.pushbuf); ++ PUSH_VAL(nvc0->base.pushbuf); + + for (; dst_layer < dstz + src_box->depth; ++dst_layer, ++src_layer) { + ret = nvc0_2d_texture_do_copy(nvc0->base.pushbuf, +@@ -348,7 +348,7 @@ nvc0_clear_render_target(struct pipe_con + IMMED_NVC0(push, NVC0_3D(MULTISAMPLE_MODE), 0); + + /* tiled textures don't have to be fenced, they're not mapped directly */ +- nvc0_resource_fence(res, NOUVEAU_BO_WR); ++ nvc0_resource_fence(nvc0, res, NOUVEAU_BO_WR); + } + + if (!render_condition_enabled) +@@ -379,7 +379,7 @@ nvc0_clear_buffer_push_nvc0(struct pipe_ + + nouveau_bufctx_refn(nvc0->bufctx, 0, buf->bo, buf->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nvc0->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + unsigned count = (size + 3) / 4; + unsigned data_words = data_size / 4; +@@ -410,7 +410,7 @@ nvc0_clear_buffer_push_nvc0(struct pipe_ + size -= nr * 4; + } + +- nvc0_resource_validate(buf, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, buf, NOUVEAU_BO_WR); + + nouveau_bufctx_reset(nvc0->bufctx, 0); + } +@@ -428,7 +428,7 @@ nvc0_clear_buffer_push_nve4(struct pipe_ + + nouveau_bufctx_refn(nvc0->bufctx, 0, buf->bo, buf->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nvc0->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + unsigned count = (size + 3) / 4; + unsigned data_words = data_size / 4; +@@ -457,7 +457,7 @@ nvc0_clear_buffer_push_nve4(struct pipe_ + size -= nr * 4; + } + +- nvc0_resource_validate(buf, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, buf, NOUVEAU_BO_WR); + + nouveau_bufctx_reset(nvc0->bufctx, 0); + } +@@ -604,7 +604,7 @@ nvc0_clear_buffer(struct pipe_context *p + + IMMED_NVC0(push, NVC0_3D(COND_MODE), nvc0->cond_condmode); + +- nvc0_resource_validate(buf, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, buf, NOUVEAU_BO_WR); + + if (width * height != elements) { + offset += width * height * data_size; +@@ -700,9 +700,11 @@ nvc0_clear(struct pipe_context *pipe, un + unsigned i, j, k; + uint32_t mode = 0; + ++ simple_mtx_lock(&nvc0->screen->state_lock); ++ + /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */ + if (!nvc0_state_validate_3d(nvc0, NVC0_NEW_3D_FRAMEBUFFER)) +- return; ++ goto out; + + if (scissor_state) { + uint32_t minx = scissor_state->minx; +@@ -710,7 +712,7 @@ nvc0_clear(struct pipe_context *pipe, un + uint32_t miny = scissor_state->miny; + uint32_t maxy = MIN2(fb->height, scissor_state->maxy); + if (maxx <= minx || maxy <= miny) +- return; ++ goto out; + + BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2); + PUSH_DATA (push, minx | (maxx - minx) << 16); +@@ -781,6 +783,9 @@ nvc0_clear(struct pipe_context *pipe, un + PUSH_DATA (push, fb->width << 16); + PUSH_DATA (push, fb->height << 16); + } ++ ++out: ++ simple_mtx_unlock(&nvc0->screen->state_lock); + } + + static void +@@ -789,8 +794,10 @@ gm200_evaluate_depth_buffer(struct pipe_ + struct nvc0_context *nvc0 = nvc0_context(pipe); + struct nouveau_pushbuf *push = nvc0->base.pushbuf; + ++ simple_mtx_lock(&nvc0->screen->state_lock); + nvc0_state_validate_3d(nvc0, NVC0_NEW_3D_FRAMEBUFFER); + IMMED_NVC0(push, SUBC_3D(0x11fc), 1); ++ simple_mtx_unlock(&nvc0->screen->state_lock); + } + + +@@ -1327,7 +1334,7 @@ nvc0_blit_3d(struct nvc0_context *nvc0, + NOUVEAU_BO_GART | NOUVEAU_BO_RD, vtxbuf_bo); + BCTX_REFN_bo(nvc0->bufctx_3d, 3D_TEXT, + NV_VRAM_DOMAIN(&screen->base) | NOUVEAU_BO_RD, screen->text); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(0)), 4); + PUSH_DATA (push, NVC0_3D_VERTEX_ARRAY_FETCH_ENABLE | stride << +@@ -1549,7 +1556,7 @@ nvc0_blit_eng2d(struct nvc0_context *nvc + BCTX_REFN(nvc0->bufctx, 2D, &dst->base, WR); + BCTX_REFN(nvc0->bufctx, 2D, &src->base, RD); + nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx); +- if (nouveau_pushbuf_validate(nvc0->base.pushbuf)) ++ if (PUSH_VAL(nvc0->base.pushbuf)) + return; + + for (i = 0; i < info->dst.box.depth; ++i) { +@@ -1589,8 +1596,8 @@ nvc0_blit_eng2d(struct nvc0_context *nvc + PUSH_DATA (push, srcy >> 32); + } + } +- nvc0_resource_validate(&dst->base, NOUVEAU_BO_WR); +- nvc0_resource_validate(&src->base, NOUVEAU_BO_RD); ++ nvc0_resource_validate(nvc0, &dst->base, NOUVEAU_BO_WR); ++ nvc0_resource_validate(nvc0, &src->base, NOUVEAU_BO_RD); + + nouveau_bufctx_reset(nvc0->bufctx, NVC0_BIND_2D); + +@@ -1684,6 +1691,7 @@ nvc0_blit(struct pipe_context *pipe, con + if (info->num_window_rectangles > 0 || info->window_rectangle_include) + eng3d = true; + ++ simple_mtx_lock(&nvc0->screen->state_lock); + if (nvc0->screen->num_occlusion_queries_active) + IMMED_NVC0(push, NVC0_3D(SAMPLECNT_ENABLE), 0); + +@@ -1694,6 +1702,7 @@ nvc0_blit(struct pipe_context *pipe, con + + if (nvc0->screen->num_occlusion_queries_active) + IMMED_NVC0(push, NVC0_3D(SAMPLECNT_ENABLE), 1); ++ simple_mtx_unlock(&nvc0->screen->state_lock); + + NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_blit_count, 1); + } +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c 2022-02-11 16:36:06.082194000 -0600 +@@ -32,7 +32,7 @@ nvc0_m2mf_transfer_rect(struct nvc0_cont + nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + if (nouveau_bo_memtype(src->bo)) { + BEGIN_NVC0(push, NVC0_M2MF(TILING_MODE_IN), 5); +@@ -138,7 +138,7 @@ nve4_m2mf_transfer_rect(struct nvc0_cont + nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); + nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + exec = NVE4_COPY_EXEC_SWIZZLE_ENABLE | NVE4_COPY_EXEC_2D_ENABLE | NVE4_COPY_EXEC_FLUSH | NVE4_COPY_EXEC_COPY_MODE_NON_PIPELINED; + +@@ -207,7 +207,7 @@ nvc0_m2mf_push_linear(struct nouveau_con + + nouveau_bufctx_refn(nvc0->bufctx, 0, dst, domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nvc0->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + while (count) { + unsigned nr = MIN2(count, NV04_PFIFO_MAX_PACKET_LEN); +@@ -249,7 +249,7 @@ nve4_p2mf_push_linear(struct nouveau_con + + nouveau_bufctx_refn(nvc0->bufctx, 0, dst, domain | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, nvc0->bufctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + while (count) { + unsigned nr = MIN2(count, (NV04_PFIFO_MAX_PACKET_LEN - 1)); +@@ -289,7 +289,7 @@ nvc0_m2mf_copy_linear(struct nouveau_con + nouveau_bufctx_refn(bctx, 0, src, srcdom | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst, dstdom | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + while (size) { + unsigned bytes = MIN2(size, 1 << 17); +@@ -327,7 +327,7 @@ nve4_m2mf_copy_linear(struct nouveau_con + nouveau_bufctx_refn(bctx, 0, src, srcdom | NOUVEAU_BO_RD); + nouveau_bufctx_refn(bctx, 0, dst, dstdom | NOUVEAU_BO_WR); + nouveau_pushbuf_bufctx(push, bctx); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + BEGIN_NVC0(push, NVE4_COPY(SRC_ADDRESS_HIGH), 4); + PUSH_DATAh(push, src->offset + srcoff); +@@ -362,7 +362,7 @@ nvc0_mt_sync(struct nvc0_context *nvc0, + if (!mt->base.mm) { + uint32_t access = (usage & PIPE_MAP_WRITE) ? + NOUVEAU_BO_WR : NOUVEAU_BO_RD; +- return !nouveau_bo_wait(mt->base.bo, access, nvc0->base.client); ++ return !BO_WAIT(&nvc0->screen->base, mt->base.bo, access, nvc0->base.client); + } + if (usage & PIPE_MAP_WRITE) + return !mt->base.fence || nouveau_fence_wait(mt->base.fence, &nvc0->base.debug); +@@ -388,7 +388,7 @@ nvc0_miptree_transfer_map(struct pipe_co + if (nvc0_mt_transfer_can_map_directly(mt)) { + ret = !nvc0_mt_sync(nvc0, mt, usage); + if (!ret) +- ret = nouveau_bo_map(mt->base.bo, 0, NULL); ++ ret = BO_MAP(nvc0->base.screen, mt->base.bo, 0, NULL); + if (ret && + (usage & PIPE_MAP_DIRECTLY)) + return NULL; +@@ -480,7 +480,7 @@ nvc0_miptree_transfer_map(struct pipe_co + if (usage & PIPE_MAP_WRITE) + flags |= NOUVEAU_BO_WR; + +- ret = nouveau_bo_map(tx->rect[1].bo, flags, nvc0->screen->base.client); ++ ret = BO_MAP(nvc0->base.screen, tx->rect[1].bo, flags, nvc0->screen->base.client); + if (ret) { + pipe_resource_reference(&tx->base.resource, NULL); + nouveau_bo_ref(NULL, &tx->rect[1].bo); +@@ -521,7 +521,7 @@ nvc0_miptree_transfer_unmap(struct pipe_ + NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_transfers_wr, 1); + + /* Allow the copies above to finish executing before freeing the source */ +- nouveau_fence_work(nvc0->screen->base.fence.current, ++ nouveau_fence_work(nvc0->base.fence, + nouveau_fence_unref_bo, tx->rect[1].bo); + } else { + nouveau_bo_ref(NULL, &tx->rect[1].bo); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c 2022-02-11 16:37:55.523785563 -0600 +@@ -462,6 +462,7 @@ nvc0_vertex_arrays_validate(struct nvc0_ + if (update_vertex) { + const unsigned n = MAX2(vertex->num_elements, nvc0->state.num_vtxelts); + ++ simple_mtx_assert_locked(&nvc0->screen->state_lock); + nvc0->state.constant_vbos = const_vbos; + nvc0->state.constant_elts = 0; + nvc0->state.num_vtxelts = vertex->num_elements; +@@ -788,7 +789,7 @@ nvc0_draw_stream_output(struct nvc0_cont + } + + while (num_instances--) { +- nouveau_pushbuf_space(push, 16, 0, 1); ++ PUSH_SPACE_EX(push, 16, 0, 1); + BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); + PUSH_DATA (push, mode); + BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BASE), 1); +@@ -869,7 +870,7 @@ nvc0_draw_indirect(struct nvc0_context * + pushes = draws; + } + +- nouveau_pushbuf_space(push, 16, 0, pushes + !!buf_count); ++ PUSH_SPACE_EX(push, 16, 0, pushes + !!buf_count); + PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain); + if (buf_count) + PUSH_REFN(push, buf_count->bo, NOUVEAU_BO_RD | buf_count->domain); +@@ -1024,6 +1025,8 @@ nvc0_draw_vbo(struct pipe_context *pipe, + BCTX_REFN_bo(nvc0->bufctx_3d, 3D_TEXT, vram_domain | NOUVEAU_BO_RD, + screen->text); + ++ simple_mtx_lock(&nvc0->screen->state_lock); ++ + nvc0_state_validate_3d(nvc0, ~0); + + if (nvc0->vertprog->vp.need_draw_parameters && (!indirect || indirect->count_from_stream_output)) { +@@ -1131,6 +1134,8 @@ nvc0_draw_vbo(struct pipe_context *pipe, + } + + cleanup: ++ simple_mtx_unlock(&nvc0->screen->state_lock); ++ + push->kick_notify = nvc0_default_kick_notify; + + nvc0_release_user_vbufs(nvc0); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_vbo_translate.c 2022-02-11 16:38:16.159706821 -0600 +@@ -239,7 +239,7 @@ nvc0_push_setup_vertex_array(struct nvc0 + + BCTX_REFN_bo(nvc0->bufctx_3d, 3D_VTX_TMP, NOUVEAU_BO_GART | NOUVEAU_BO_RD, + bo); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + return dest; + } +@@ -731,7 +731,7 @@ nvc0_push_upload_vertex_ids(struct push_ + + BCTX_REFN_bo(nvc0->bufctx_3d, 3D_VTX_TMP, NOUVEAU_BO_GART | NOUVEAU_BO_RD, + bo); +- nouveau_pushbuf_validate(push); ++ PUSH_VAL(push); + + if (info->index_size) { + if (!draw->index_bias) { +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c 2022-02-11 16:42:26.561716987 -0600 +@@ -34,10 +34,11 @@ static void dump_comm_bsp(struct comm *c + unsigned + nvc0_decoder_bsp_begin(struct nouveau_vp3_decoder *dec, unsigned comm_seq) + { ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; + unsigned ret = 0; + +- ret = nouveau_bo_map(bsp_bo, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, bsp_bo, NOUVEAU_BO_WR, dec->client); + if (ret) { + debug_printf("map failed: %i %s\n", ret, strerror(-ret)); + return -1; +@@ -53,6 +54,7 @@ nvc0_decoder_bsp_next(struct nouveau_vp3 + unsigned comm_seq, unsigned num_buffers, + const void *const *data, const unsigned *num_bytes) + { ++ struct nouveau_screen *screen = nouveau_screen(dec->base.context->screen); + struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; + struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1]; + uint32_t bsp_size = 0; +@@ -82,7 +84,7 @@ nvc0_decoder_bsp_next(struct nouveau_vp3 + return -1; + } + +- ret = nouveau_bo_map(tmp_bo, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen,tmp_bo, NOUVEAU_BO_WR, dec->client); + if (ret) { + debug_printf("map failed: %i %s\n", ret, strerror(-ret)); + return -1; +@@ -114,7 +116,7 @@ nvc0_decoder_bsp_next(struct nouveau_vp3 + return -1; + } + +- ret = nouveau_bo_map(tmp_bo, NOUVEAU_BO_WR, dec->client); ++ ret = BO_MAP(screen, tmp_bo, NOUVEAU_BO_WR, dec->client); + if (ret) { + debug_printf("map failed: %i %s\n", ret, strerror(-ret)); + return -1; +@@ -160,7 +162,7 @@ nvc0_decoder_bsp_end(struct nouveau_vp3_ + + nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs); + +- nouveau_pushbuf_space(push, 32, num_refs, 0); ++ PUSH_SPACE_EX(push, 32, num_refs, 0); + nouveau_pushbuf_refn(push, bo_refs, num_refs); + + bsp_addr = bsp_bo->offset >> 8; +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video.c 2022-02-11 18:09:21.787821149 -0600 +@@ -91,7 +91,8 @@ struct pipe_video_codec * + nvc0_create_decoder(struct pipe_context *context, + const struct pipe_video_codec *templ) + { +- struct nouveau_screen *screen = &((struct nvc0_context *)context)->screen->base; ++ struct nvc0_context *nvc0 = nvc0_context(context); ++ struct nouveau_screen *screen = &nvc0->screen->base; + struct nouveau_vp3_decoder *dec; + struct nouveau_pushbuf **push; + union nouveau_bo_config cfg; +@@ -116,7 +117,7 @@ nvc0_create_decoder(struct pipe_context + dec = CALLOC_STRUCT(nouveau_vp3_decoder); + if (!dec) + return NULL; +- dec->client = screen->client; ++ dec->client = nvc0->base.client; + dec->base = *templ; + nouveau_vp3_decoder_init_common(&dec->base); + +@@ -160,7 +161,7 @@ nvc0_create_decoder(struct pipe_context + data, size, &dec->channel[i]); + + if (!ret) +- ret = nouveau_pushbuf_new(screen->client, dec->channel[i], 4, ++ ret = nouveau_pushbuf_new(nvc0->base.client, dec->channel[i], 4, + 32 * 1024, true, &dec->pushbuf[i]); + if (ret) + break; +@@ -292,13 +293,13 @@ nvc0_create_decoder(struct pipe_context + if (ret) + goto fail; + +- nouveau_bo_map(dec->fence_bo, NOUVEAU_BO_RDWR, screen->client); ++ BO_MAP(dec->fence_bo, NOUVEAU_BO_RDWR, screen->client); + dec->fence_map = dec->fence_bo->map; + dec->fence_map[0] = dec->fence_map[4] = dec->fence_map[8] = 0; + dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map))); + + /* So lets test if the fence is working? */ +- nouveau_pushbuf_space(push[0], 16, 1, 0); ++ PUSH_SPACE_EX(push[0], 16, 1, 0); + PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NVC0(push[0], SUBC_BSP(0x240), 3); + PUSH_DATAh(push[0], dec->fence_bo->offset); +@@ -309,7 +310,7 @@ nvc0_create_decoder(struct pipe_context + PUSH_DATA (push[0], 0); + PUSH_KICK (push[0]); + +- nouveau_pushbuf_space(push[1], 16, 1, 0); ++ PUSH_SPACE_EX(push[1], 16, 1, 0); + PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NVC0(push[1], SUBC_VP(0x240), 3); + PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10)); +@@ -320,7 +321,7 @@ nvc0_create_decoder(struct pipe_context + PUSH_DATA (push[1], 0); + PUSH_KICK (push[1]); + +- nouveau_pushbuf_space(push[2], 16, 1, 0); ++ PUSH_SPACE_EX(push[2], 16, 1, 0); + PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); + BEGIN_NVC0(push[2], SUBC_PPP(0x240), 3); + PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20)); +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c 2022-02-11 16:42:38.048670313 -0600 +@@ -94,7 +94,7 @@ nvc0_decoder_ppp(struct nouveau_vp3_deco + struct nouveau_pushbuf *push = dec->pushbuf[2]; + unsigned ppp_caps = 0x10; + +- nouveau_pushbuf_space(push, 32, 4, 0); ++ PUSH_SPACE_EX(push, 32, 4, 0); + + switch (codec) { + case PIPE_VIDEO_FORMAT_MPEG12: { +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c 2022-02-11 16:43:16.978511453 -0600 +@@ -44,7 +44,7 @@ static void dump_comm_vp(struct nouveau_ + + if ((comm->pvp_stage & 0xff) != 0xff) { + unsigned *map; +- int ret = nouveau_bo_map(inter_bo, NOUVEAU_BO_RD|NOUVEAU_BO_NOBLOCK, dec->client); ++ int ret = BO_MAP(inter_bo, NOUVEAU_BO_RD|NOUVEAU_BO_NOBLOCK, dec->client); + assert(ret >= 0); + map = inter_bo->map; + for (i = 0; i < comm->byte_ofs + slice_size; i += 0x10) { +@@ -111,7 +111,7 @@ nvc0_decoder_vp(struct nouveau_vp3_decod + if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom)) + nvc0_decoder_kick_ref(dec, target); + +- nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0); ++ PUSH_SPACE_EX(push, 32 + codec_extra, num_refs, 0); + + nouveau_pushbuf_refn(push, bo_refs, num_refs); + +diff -Naurp mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nve4_compute.c mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nve4_compute.c +--- mesa-21.3.6.orig/src/gallium/drivers/nouveau/nvc0/nve4_compute.c 2022-02-09 14:10:39.000000000 -0600 ++++ mesa-21.3.6/src/gallium/drivers/nouveau/nvc0/nve4_compute.c 2022-02-11 16:44:39.346172201 -0600 +@@ -545,7 +545,7 @@ nve4_compute_upload_input(struct nvc0_co + struct nv04_resource *res = nv04_resource(info->indirect); + uint32_t offset = res->offset + info->indirect_offset; + +- nouveau_pushbuf_space(push, 32, 0, 1); ++ PUSH_SPACE_EX(push, 32, 0, 1); + PUSH_REFN(push, res->bo, NOUVEAU_BO_RD | res->domain); + + BEGIN_1IC0(push, NVE4_CP(UPLOAD_EXEC), 1 + 8); +@@ -829,7 +829,7 @@ nve4_upload_indirect_desc(struct nouveau + PUSH_DATA (push, length); + PUSH_DATA (push, 1); + +- nouveau_pushbuf_space(push, 32, 0, 1); ++ PUSH_SPACE_EX(push, 32, 0, 1); + PUSH_REFN(push, res->bo, NOUVEAU_BO_RD | res->domain); + + BEGIN_1IC0(push, NVE4_CP(UPLOAD_EXEC), 1 + (length / 4)); +@@ -867,9 +867,10 @@ nve4_launch_grid(struct pipe_context *pi + resident->flags); + } + ++ simple_mtx_lock(&screen->state_lock); + ret = !nve4_state_validate_cp(nvc0, ~0); + if (ret) +- goto out; ++ goto out_unlock; + + if (nvc0->screen->compute->oclass >= GV100_COMPUTE_CLASS) + gv100_compute_setup_launch_desc(nvc0, desc, info); +@@ -923,7 +924,7 @@ nve4_launch_grid(struct pipe_context *pi + } + + /* upload descriptor and flush */ +- nouveau_pushbuf_space(push, 32, 1, 0); ++ PUSH_SPACE_EX(push, 32, 1, 0); + PUSH_REFN(push, screen->text, NV_VRAM_DOMAIN(&screen->base) | NOUVEAU_BO_RD); + BEGIN_NVC0(push, NVE4_CP(LAUNCH_DESC_ADDRESS), 1); + PUSH_DATA (push, desc_gpuaddr >> 8); +@@ -934,6 +935,9 @@ nve4_launch_grid(struct pipe_context *pi + + nvc0_update_compute_invocations_counter(nvc0, info); + ++out_unlock: ++ simple_mtx_unlock(&screen->state_lock); ++ + out: + if (ret) + NOUVEAU_ERR("Failed to launch grid !\n"); +@@ -1031,7 +1035,7 @@ nve4_compute_trap_info(struct nvc0_conte + volatile struct nve4_mp_trap_info *info; + uint8_t *map; + +- ret = nouveau_bo_map(bo, NOUVEAU_BO_RDWR, nvc0->base.client); ++ ret = BO_MAP(bo, NOUVEAU_BO_RDWR, nvc0->base.client); + if (ret) + return; + map = (uint8_t *)bo->map; diff --git a/repo/x11/mesa.xibuild b/repo/x11/mesa/mesa.xibuild index 1177345..1177345 100644 --- a/repo/x11/mesa.xibuild +++ b/repo/x11/mesa/mesa.xibuild diff --git a/repo/x11/mesa/musl-fix-includes.patch b/repo/x11/mesa/musl-fix-includes.patch new file mode 100644 index 0000000..8553d44 --- /dev/null +++ b/repo/x11/mesa/musl-fix-includes.patch @@ -0,0 +1,13 @@ +diff --git a/src/util/rand_xor.c b/src/util/rand_xor.c +index 81b64f1ea71..14e6c9d27c3 100644 +--- a/src/util/rand_xor.c ++++ b/src/util/rand_xor.c +@@ -27,6 +27,8 @@ + #if !DETECT_OS_WINDOWS + #if defined(HAVE_GETRANDOM) + #include <sys/random.h> ++#include <sys/types.h> ++#include <sys/stat.h> + #endif + #include <unistd.h> + #include <fcntl.h> diff --git a/repo/x11/mkfontscale.xibuild b/repo/x11/mkfontscale/mkfontscale.xibuild index 4f32c83..4f32c83 100644 --- a/repo/x11/mkfontscale.xibuild +++ b/repo/x11/mkfontscale/mkfontscale.xibuild diff --git a/repo/x11/motif/02-fix-format-security.patch b/repo/x11/motif/02-fix-format-security.patch new file mode 100644 index 0000000..18c4abd --- /dev/null +++ b/repo/x11/motif/02-fix-format-security.patch @@ -0,0 +1,607 @@ +Description: Fix unsafe uses of fprintf and sprintf + prevent 'format not a string literal and no format arguments' errors +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1574 +Author: Graham Inggs <graham@nerve.org.za> +Last-Update: 2012-12-25 +--- a/lib/Mrm/Mrmhier.c ++++ b/lib/Mrm/Mrmhier.c +@@ -264,10 +264,10 @@ + case MrmSUCCESS: + break; + case MrmNOT_VALID: +- sprintf (err_stg, _MrmMMsg_0113); ++ sprintf (err_stg, "%s", _MrmMMsg_0113); + break; + default: +- sprintf (err_stg, _MrmMMsg_0114); ++ sprintf (err_stg, "%s", _MrmMMsg_0114); + break; + } + } +--- a/lib/Mrm/Mrmicon.c ++++ b/lib/Mrm/Mrmicon.c +@@ -1176,7 +1176,7 @@ + } + break; + default: +- sprintf(err_msg, _MrmMMsg_0040); ++ sprintf(err_msg, "%s", _MrmMMsg_0040); + return Urm__UT_Error ("Urm__RelizeColorTable", + err_msg, NULL, NULL, MrmFAILURE) ; + } +@@ -1252,7 +1252,7 @@ + break; + default: + result = MrmFAILURE; +- sprintf (err_msg, _MrmMMsg_0040); ++ sprintf (err_msg, "%s", _MrmMMsg_0040); + Urm__UT_Error ("Urm__RelizeColorTable", + err_msg, NULL, NULL, MrmFAILURE) ; + } +--- a/lib/Mrm/Mrmlread.c ++++ b/lib/Mrm/Mrmlread.c +@@ -698,7 +698,7 @@ + XBlackPixelOfScreen(XDefaultScreenOfDisplay(display))); + break; + default: +- sprintf(err_msg, _MrmMMsg_0040); ++ sprintf(err_msg, "%s", _MrmMMsg_0040); + result = Urm__UT_Error ("MrmFetchColorLiteral", + err_msg, NULL, NULL, MrmFAILURE) ; + _MrmAppUnlock(app); +--- a/lib/Mrm/Mrmwcrw.c ++++ b/lib/Mrm/Mrmwcrw.c +@@ -1390,7 +1390,7 @@ + } + break; + default: +- sprintf (err_msg, _MrmMMsg_0040); ++ sprintf (err_msg, "%s", _MrmMMsg_0040); + result = Urm__UT_Error ("Urm__CW_ConvertValue", + err_msg, NULL, NULL, MrmFAILURE) ; + }; +@@ -2426,7 +2426,7 @@ + } + break; + default: +- sprintf(err_msg, _MrmMMsg_0040); ++ sprintf(err_msg, "%s", _MrmMMsg_0040); + return Urm__UT_Error ("Urm__CW_ConvertValue", + err_msg, NULL, NULL, MrmFAILURE) ; + }; +--- a/tools/wml/wmlouth.c ++++ b/tools/wml/wmlouth.c +@@ -225,12 +225,12 @@ + printf ("\nCouldn't open UilSymGen.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Write the sym_k..._object literals + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ ) + { + clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr; +@@ -244,7 +244,7 @@ + /* + * Define the sym_k_..._reason literals + */ +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + for ( ndx=0 ; ndx<wml_obj_reason_ptr->cnt ; ndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_reason_ptr->hvec[ndx].objptr; +@@ -258,7 +258,7 @@ + /* + * Define the sym_k_..._arg literals + */ +-fprintf (outfil, canned4); ++fprintf (outfil, "%s", canned4); + for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr; +@@ -272,7 +272,7 @@ + /* + * Define the sym_k_..._enumset structs and literals + */ +-fprintf (outfil, canned5); ++fprintf (outfil, "%s", canned5); + for ( ndx=0 ; ndx<wml_obj_enumset_ptr->cnt ; ndx++ ) + { + enumsetobj = (WmlEnumSetDefPtr) wml_obj_enumset_ptr->hvec[ndx].objptr; +@@ -286,7 +286,7 @@ + /* + * Define the sym_k_..._enumval literals + */ +-fprintf (outfil, canned6); ++fprintf (outfil, "%s", canned6); + for ( ndx=0 ; ndx<wml_obj_enumval_ptr->cnt ; ndx++ ) + { + enumvalobj = (WmlEnumValueDefPtr) wml_obj_enumval_ptr->hvec[ndx].objptr; +@@ -301,7 +301,7 @@ + * Define the sym_k_..._charsize literals + * Define the sym_k_..._charset literals + */ +-fprintf (outfil, canned7); ++fprintf (outfil, "%s", canned7); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + charsetobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +@@ -315,7 +315,7 @@ + /* + * Define the sym_k_..._child literals + */ +-fprintf (outfil, canned8); ++fprintf (outfil, "%s", canned8); + for ( ndx=0 ; ndx<wml_obj_child_ptr->cnt ; ndx++ ) + { + childobj = (WmlChildDefPtr) wml_obj_child_ptr->hvec[ndx].objptr; +@@ -379,12 +379,12 @@ + printf ("\nCouldn't open UilSymChCL.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Create table entries, similar to writing sym_k... + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_child_ptr->cnt ; ndx++ ) + { + childobj = (WmlChildDefPtr) wml_obj_child_ptr->hvec[ndx].objptr; +@@ -392,7 +392,7 @@ + fprintf (outfil, " sym_k_%s_object,\n", + classobj->tkname); + } +-fprintf (outfil, canned1a); ++fprintf (outfil, "%s", canned1a); + + /* + * close the output file +@@ -446,12 +446,12 @@ + printf ("\nCouldn't open UilSymArTy.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Create table entries, similar to writing sym_k... + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr; +@@ -459,7 +459,7 @@ + fprintf (outfil, " sym_k_%s_value,\n", + datobj->tkname); + } +-fprintf (outfil, canned1a); ++fprintf (outfil, "%s", canned1a); + + /* + * close the output file +@@ -509,19 +509,19 @@ + printf ("\nCouldn't open UilSymRArg.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Create table entries, similar to writing sym_k... + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr; + fprintf (outfil, " %d,\n", + resobj->related_code); + } +-fprintf (outfil, canned1a); ++fprintf (outfil, "%s", canned1a); + + /* + * close the output file +@@ -621,12 +621,12 @@ + printf ("\nCouldn't open UilUrmClas.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Write entries for widgets + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ ) + { + clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr; +@@ -637,7 +637,7 @@ + else + fprintf (outfil, " \"%s\",\t\n", synobj->convfunc); + } +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + + /* + * Write entries for gadget variants of widget classes +@@ -661,7 +661,7 @@ + synobj->name); + } + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * Write entries for non-dialog widgets +@@ -685,7 +685,7 @@ + synobj->name); + } + } +-fprintf (outfil, canned4); ++fprintf (outfil, "%s", canned4); + + /* + * Write entries for the resource a widget's controls map to +@@ -701,7 +701,7 @@ + else + fprintf (outfil, " sym_k_%s_arg,\n", mapresobj->tkname); + } +-fprintf (outfil, canned5); ++fprintf (outfil, "%s", canned5); + + /* + * Write entries for arguments +@@ -714,7 +714,7 @@ + fprintf (outfil, " %s,\n", + synres->resliteral); + } +-fprintf (outfil, canned6); ++fprintf (outfil, "%s", canned6); + + /* + * Write entries for reasons +@@ -727,7 +727,7 @@ + fprintf (outfil, " %s,\n", + synres->resliteral); + } +-fprintf (outfil, canned7); ++fprintf (outfil, "%s", canned7); + + /* + * close the output file +@@ -781,13 +781,13 @@ + printf ("\nCouldn't open UilConst.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Process the arguments in code order. We start with 1, and write out + * the mask after processing 8 codes. + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + strcpy (maskbuf, "0"); + for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ ) + { +@@ -805,7 +805,7 @@ + } + if ( bitno != 8 ) + fprintf (outfil, "%s", maskbuf); +-fprintf (outfil, canned1a); ++fprintf (outfil, "%s", canned1a); + + /* + * close the output file +@@ -878,8 +878,8 @@ + printf ("\nCouldn't open UilSymReas.h"); + return; + } +-fprintf (outfil, canned_warn); +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned_warn); ++fprintf (outfil, "%s", canned1); + + /* + * Generate the bit vectors for each class. Outer loop on the reason code, +@@ -925,13 +925,13 @@ + /* + * Write the vector of vectors. + */ +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + for ( resndx=0 ; resndx<wml_obj_reason_ptr->cnt ; resndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_reason_ptr->hvec[resndx].objptr; + fprintf (outfil, " reason_class_vec%d,\n", resobj->sym_code); + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * close the output file +@@ -1004,8 +1004,8 @@ + printf ("\nCouldn't open UilSymArTa.h"); + return; + } +-fprintf (outfil, canned_warn); +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned_warn); ++fprintf (outfil, "%s", canned1); + + /* + * Generate the bit vectors for each class. Outer loop on the argument code, +@@ -1051,13 +1051,13 @@ + /* + * Write the vector of vectors. + */ +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + for ( resndx=0 ; resndx<wml_obj_arg_ptr->cnt ; resndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[resndx].objptr; + fprintf (outfil, " arg_class_vec%d,\n", resobj->sym_code); + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * close the output file +@@ -1129,8 +1129,8 @@ + printf ("\nCouldn't open UilSymChTa.h"); + return; + } +-fprintf (outfil, canned_warn); +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned_warn); ++fprintf (outfil, "%s", canned1); + + /* + * Generate the bit vectors for each class. Outer loop on the child code, +@@ -1174,13 +1174,13 @@ + /* + * Write the vector of vectors. + */ +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + for ( childndx=0 ; childndx<wml_obj_child_ptr->cnt ; childndx++ ) + { + childobj = (WmlChildDefPtr) wml_obj_child_ptr->hvec[childndx].objptr; + fprintf (outfil, " child_class_vec%d,\n", childobj->sym_code); + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * close the output file +@@ -1251,8 +1251,8 @@ + printf ("\nCouldn't open UilSymCtl.h"); + return; + } +-fprintf (outfil, canned_warn); +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned_warn); ++fprintf (outfil, "%s", canned1); + + /* + * Generate the bit vectors for each class. Outer loop on the class code, +@@ -1296,13 +1296,13 @@ + /* + * Write the vector of vectors. + */ +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + for ( ctlndx=0 ; ctlndx<wml_obj_class_ptr->cnt ; ctlndx++ ) + { + clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ctlndx].objptr; + fprintf (outfil, " object_class_vec%d,\n", clsobj->sym_code); + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * close the output file +@@ -1438,7 +1438,7 @@ + printf ("\nCouldn't open UilSymNam.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Write entries for widgets +@@ -1517,7 +1517,7 @@ + fprintf (outfil, " \"%s\",\n", + synch->name); + } +-fprintf (outfil, canned7); ++fprintf (outfil, "%s", canned7); + + /* + * close the output file +@@ -1621,12 +1621,12 @@ + printf ("\nCouldn't open UilSymEnum.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Generate the enumeration value vectors for each enumeration set. + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_enumset_ptr->cnt ; ndx++ ) + { + enumsetobj = (WmlEnumSetDefPtr) wml_obj_enumset_ptr->hvec[ndx].objptr; +@@ -1643,7 +1643,7 @@ + /* + * Generate the enumeration set tables + */ +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + for ( ndx=0 ; ndx<wml_obj_enumset_ptr->cnt ; ndx++ ) + { + enumsetobj = (WmlEnumSetDefPtr) wml_obj_enumset_ptr->hvec[ndx].objptr; +@@ -1655,7 +1655,7 @@ + /* + * Create enumset table entries for arguments, similar to writing sym_k... + */ +-fprintf (outfil, canned4); ++fprintf (outfil, "%s", canned4); + for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ ) + { + resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr; +@@ -1669,13 +1669,13 @@ + /* + * Create the enumval values table. + */ +-fprintf (outfil, canned5); ++fprintf (outfil, "%s", canned5); + for ( ndx=0 ; ndx<wml_obj_enumval_ptr->cnt ; ndx++ ) + { + evobj = (WmlEnumValueDefPtr) wml_obj_enumval_ptr->hvec[ndx].objptr; + fprintf (outfil, " %s,\n", evobj->syndef->enumlit); + } +-fprintf (outfil, canned5a); ++fprintf (outfil, "%s", canned5a); + + /* + * close the output file +@@ -1813,12 +1813,12 @@ + printf ("\nCouldn't open UilSymCSet.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Generate the standards name table + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + csobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +@@ -1836,7 +1836,7 @@ + /* + * Generate the writing direction table + */ +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + csobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +@@ -1858,7 +1858,7 @@ + /* + * Generate the parsing direction table + */ +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + csobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +@@ -1880,7 +1880,7 @@ + /* + * Generate the character size table + */ +-fprintf (outfil, canned4); ++fprintf (outfil, "%s", canned4); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + csobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +@@ -1906,7 +1906,7 @@ + /* + * Generate the $LANG name recognition table + */ +-fprintf (outfil, canned5); ++fprintf (outfil, "%s", canned5); + lang_max = 0; + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { +@@ -1936,7 +1936,7 @@ + /* + * Generate the $LANG code lookup table, in upper case + */ +-fprintf (outfil, canned6); ++fprintf (outfil, "%s", canned6); + for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ ) + { + csobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr; +--- a/tools/wml/wmloutkey.c ++++ b/tools/wml/wmloutkey.c +@@ -574,16 +574,16 @@ + printf ("\nCouldn't open UilKeyTab.h"); + return; + } +-fprintf (outfil, canned_warn); ++fprintf (outfil, "%s", canned_warn); + + /* + * Print the case sensitive and insensitive tables + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + wmlOutputUilKeyTabBody (outfil, wml_tok_sens_ptr, &maxlen, &maxkey); + fprintf (outfil, canned2, maxlen, maxkey); + wmlOutputUilKeyTabBody (outfil, wml_tok_insens_ptr, &maxlen, &maxkey); +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * close the output file +@@ -812,8 +812,8 @@ + printf ("\nCouldn't open UilTokName.h"); + return; + } +-fprintf (outfil, canned_warn); +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned_warn); ++fprintf (outfil, "%s", canned1); + + /* + * Print the token name entries +--- a/tools/wml/wmloutmm.c ++++ b/tools/wml/wmloutmm.c +@@ -209,9 +209,9 @@ + /* + * Write out header information + */ +-fprintf (outfil, canned1); ++fprintf (outfil, "%s", canned1); + fprintf (outfil, "%s\n", name); +-fprintf (outfil, canned2); ++fprintf (outfil, "%s", canned2); + + /* + * Alphabetize the controls, reason, and argument lists +@@ -287,7 +287,7 @@ + else + fprintf (outfil, "\n"); + } +-fprintf (outfil, canned3); ++fprintf (outfil, "%s", canned3); + + /* + * Write out the argument table +@@ -323,7 +323,7 @@ + } + argndx += 1; + } +-fprintf (outfil, canned4); ++fprintf (outfil, "%s", canned4); + + } + diff --git a/repo/x11/motif/03-no-demos.patch b/repo/x11/motif/03-no-demos.patch new file mode 100644 index 0000000..03953c4 --- /dev/null +++ b/repo/x11/motif/03-no-demos.patch @@ -0,0 +1,53 @@ +Description: Add option to disable building of demos +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1575 +Author: Graham Inggs <graham@nerve.org.za> +Last-Update: 2013-01-09 +--- a/configure.ac ++++ b/configure.ac +@@ -311,7 +311,20 @@ + doc/man/man5/Makefile \ + tools/Makefile \ + tools/wml/Makefile \ +-demos/Makefile \ ++lib/Xm/xmstring.list \ ++]) ++ ++AC_ARG_ENABLE(demos, [ --disable-demos ++ Disable building demos]) ++ ++if test x$enable_demos = x ++then ++ enable_demos="yes" ++fi ++ ++if test "$enable_demos" = "yes" ++then ++ AC_CONFIG_FILES([demos/Makefile + demos/lib/Makefile \ + demos/lib/Xmd/Makefile \ + demos/lib/Wsm/Makefile \ +@@ -395,6 +408,11 @@ + demos/doc/programGuide/ch17/Makefile \ + demos/doc/programGuide/ch17/simple_drop/Makefile \ + demos/doc/programGuide/ch17/simple_drag/Makefile \ +-lib/Xm/xmstring.list \ +-]) ++ ]) ++ MAYBE_DEMOS=demos ++else ++ MAYBE_DEMOS= ++fi ++AC_SUBST(MAYBE_DEMOS) ++ + AC_OUTPUT +--- a/Makefile.am ++++ b/Makefile.am +@@ -29,6 +29,7 @@ + tools \ + clients \ + doc \ +- demos ++ $(MAYBE_DEMOS) ++ + AUTOMAKE_OPTIONS = 1.4 + ACLOCAL_AMFLAGS = -I . diff --git a/repo/x11/motif/06-cast-size_t-to-int.patch b/repo/x11/motif/06-cast-size_t-to-int.patch new file mode 100644 index 0000000..b5ce9c6 --- /dev/null +++ b/repo/x11/motif/06-cast-size_t-to-int.patch @@ -0,0 +1,17 @@ +Description: To prevent build failure during building with Hardening options + enabled due to "format '%d' expects argument of type 'int', but argument 5 has + type 'size_t'", the fifth argument is cast to integer on the input. +Author: Paul Gevers <elbrus@debian.org> +Updated: 13-01-2013 + +--- a/tools/wml/wmloutkey.c ++++ b/tools/wml/wmloutkey.c +@@ -627,7 +627,7 @@ + fprintf (outfil, " {%s, %s, %d, %s, \"%s\"},\n", + tkclass, + tksym, +- strlen(tokstg), ++ (int)strlen(tokstg), + tktoken, + tokstg); + if ( (int)strlen(tokstg) > *maxlen ) diff --git a/repo/x11/motif/07-fix_lintian_reported_manpage_typos.patch b/repo/x11/motif/07-fix_lintian_reported_manpage_typos.patch new file mode 100644 index 0000000..5ddfd76 --- /dev/null +++ b/repo/x11/motif/07-fix_lintian_reported_manpage_typos.patch @@ -0,0 +1,118 @@ +Description: lintian reports several typos in manpages. This patch fixes those + reported +Author: Paul Gevers <elbrus@debian.org> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1587 +Last-reviewed: 14 Jan 2013 + +--- a/doc/man/man1/mwm.1 ++++ b/doc/man/man1/mwm.1 +@@ -359,7 +359,7 @@ + (and other associated messages) by saving the geometries of its clients to a state file\&. + \fBmwm\fP can then be restarted by the XSMP session manager\&. + The default location for the state file is \fB$HOME/\&.mwmclientdb\fP\&. +-This location can be overriden with the resource \fBsessionClientDB\fP\&. ++This location can be overridden with the resource \fBsessionClientDB\fP\&. + .SS "X Resources" + .PP + The \fBmwm\fP command is configured from its resource +--- a/doc/man/man3/VendorShell.3 ++++ b/doc/man/man3/VendorShell.3 +@@ -76,7 +76,7 @@ + to the VendorShell resources for controlling toolTips. VendorShell displays + the XmNtooTipString in an XmLabel that is a child of a transientShell. The name + of the transientShell is TipShell, and the name of the XmLabel is TipLabel. +-The appearance of the tip can be controlled by specifing resources on these ++The appearance of the tip can be controlled by specifying resources on these + widgets. + .PP + If an application uses the \fBXmNmwmDecorations\fP, +--- a/doc/man/man3/XmComboBox.3 ++++ b/doc/man/man3/XmComboBox.3 +@@ -581,7 +581,7 @@ + ComboBox \fBXmNcomboBoxType\fP is + \fBXmDROP_DOWN_LIST\fP, + \fB<osfActivate>\fP, \fB<osfCancel>\fP, and +-\fBReturn\fP are overriden by ComboBox actions\&. ++\fBReturn\fP are overridden by ComboBox actions\&. + .IP "\fB:c\fP <Key>\fB<osfDown>\fP:" 10 + CBDropDownList() + .IP "\fB:c\fP <Key>\fB<osfUp>\fP:" 10 +--- a/doc/man/man3/XmGetPixmap.3 ++++ b/doc/man/man3/XmGetPixmap.3 +@@ -109,7 +109,7 @@ + In addition to X bitmap files (XBM), Motif also supports XPM (X + Pixmap) file formats and, from version 2.3, JPEG and PNG image formats\&. + (Note that support of JPEG and PNG image format is an optional feature +-of Motif, in order to check if current version supports PNG ang JPEG ++of Motif, in order to check if current version supports PNG and JPEG + image formats the PNG_SUPPORT and JPEG_SUPPORT macros should be checked + correspondingly.) + The \fBXBMLANGPATH\fP specifies the path for +--- a/doc/man/man3/XmGetPixmapByDepth.3 ++++ b/doc/man/man3/XmGetPixmapByDepth.3 +@@ -111,7 +111,7 @@ + In addition to X bitmap files (XBM), Motif also supports XPM (X + Pixmap) file formats, and, from version 2.3, JPEG and PNG image formats\&. + (Note that support of JPEG and PNG image format is an optional feature +-of Motif, in order to check if current version supports PNG ang JPEG ++of Motif, in order to check if current version supports PNG and JPEG + image formats the PNG_SUPPORT and JPEG_SUPPORT macros should be checked + correspondingly.) + The \fBXBMLANGPATH\fP specifies the path for +--- a/doc/man/man3/XmHierarchyGetChildNodes.3 ++++ b/doc/man/man3/XmHierarchyGetChildNodes.3 +@@ -69,8 +69,8 @@ + \fBXmHierarchy\fP(3)\&. + .SH "RETURN" + .PP +-Returns WidgetList with child nodes of the hierachy, or NULL +-if the hierachy contains no children\&. ++Returns WidgetList with child nodes of the hierarchy, or NULL ++if the hierarchy contains no children\&. + .SH "RELATED" + .PP + \fBXmHierarchy\fP(3)\&. +--- a/doc/man/man3/XmManager.3 ++++ b/doc/man/man3/XmManager.3 +@@ -502,7 +502,7 @@ + Indicates whether the posting process should continue\&. The + application may modify this field\&. + .IP "\fItarget\fP" 10 +-Specifies the most specific widget or gadget that the menu sytem found ++Specifies the most specific widget or gadget that the menu system found + from the event that matches the event\&. + .SS "Translations" + .PP +--- a/doc/man/man3/XmPrimitive.3 ++++ b/doc/man/man3/XmPrimitive.3 +@@ -609,7 +609,7 @@ + Indicates whether the posting process should continue\&. The + application may modify this field\&. + .IP "\fItarget\fP" 10 +-Specifies the most specific widget or gadget that the menu sytem found ++Specifies the most specific widget or gadget that the menu system found + from the event that matches the event\&. + .SS "Translations" + .PP +--- a/doc/man/man3/XmRendition.3 ++++ b/doc/man/man3/XmRendition.3 +@@ -71,7 +71,7 @@ + If a resource in a rendition is unspecified, usually by setting it to + \fBXmAS_IS\fP or \fBXmUNSPECIFIED_PIXEL\fP, + then the value to be used for that resource is the value of the +-immediately preceeding rendition in \fBXmString\fR\&. If that value ++immediately preceding rendition in \fBXmString\fR\&. If that value + is unspecified, then the preceding value is used, and so on\&. If + no renditions specify a value for a resource, then a default value + will be used\&. +--- a/doc/man/man3/XmStringGetNextComponent.3 ++++ b/doc/man/man3/XmStringGetNextComponent.3 +@@ -111,7 +111,7 @@ + \fBXmSTRING_COMPONENT_UNKNOWN\fP\&. The data returned by these + components is returned in the \fIunknown_tag\fP, \fIunknown_length\fP, + and \fIunknown_value\fP fields\&. This apparent inconsistency is +-designed to accomodate older applications that may not be equipped to ++designed to accommodate older applications that may not be equipped to + handle the newer component types of Motif version 2\&.0 and beyond\&. + Consequently, the use of this procedure is not recommended\&. Instead, + use the \fBXmStringGetNextTriple\fP procedure, which provides all the diff --git a/repo/x11/motif/08-fix_hyphen_in_man_pages.patch b/repo/x11/motif/08-fix_hyphen_in_man_pages.patch new file mode 100644 index 0000000..bc1beb0 --- /dev/null +++ b/repo/x11/motif/08-fix_hyphen_in_man_pages.patch @@ -0,0 +1,156 @@ +Description: lintian reports hyphen misuse in manpages. This patch fixes those + reported. +Author: Paul Gevers <elbrus@debian.org> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1588 +Last-reviewed: 06 Feb 2013 + +--- a/doc/man/man1/mwm.1 ++++ b/doc/man/man1/mwm.1 +@@ -904,7 +904,7 @@ + resizeCursorsResizeCursorsT/FT + transientDecorationTransientDecorationstringmenu title + transientFunctionsTransientFunctionsstringT{ +--minimize-maximize ++\-minimize-maximize + T} + useIconBoxUseIconBoxT/FF + .TE +@@ -941,7 +941,7 @@ + screen size of the icon box window depends on the iconImageMaximum (size) + and \fIiconDecoration\fP resources\&. The default value for size + is (6 * iconWidth + padding) wide by (1 * iconHeight + padding) high\&. The +-default value of the location is +0 -0\&. ++default value of the location is +0 \-0\&. + .IP "\fIiconBoxName\fP\ (class\ \fIIconBoxName\fP)" 10 + This resource specifies the name that is used to look up icon box resources\&. + The default name is iconbox\&. +@@ -1059,7 +1059,7 @@ + This resource is used to indicate which window management functions + are applicable (or not applicable) to transient windows\&. The function specification + is exactly the same as for the \fIclientFunctions\fP (client +-specific) resource\&. The default value for this resource is -minimize -maximize\&. ++specific) resource\&. The default value for this resource is \-minimize \-maximize\&. + .IP "" 10 + An application can also specify which functions \fBmwm\fP + should apply to its windows\&. If it does so, \fBmwm\fP applies +@@ -1176,7 +1176,7 @@ + titleTitle bar (includes border)\&. + .TE + .PP +-Examples: \fIMwm*XClock\&.clientDecoration: -resizeh -maximize\fP This removes the resize handles and maximize button from XClock ++Examples: \fIMwm*XClock\&.clientDecoration: \-resizeh \-maximize\fP This removes the resize handles and maximize button from XClock + windows\&. \fIMwm*XClock\&.clientDecoration: menu minimize border\fP This does the same thing as above\&. Note that either \fImenu\fP or \fIminimize\fP implies + \fItitle\fP\&. + .IP "\fIclientFunctions\fP\ (class\ \fIClientFunctions\fP)" 10 +--- a/doc/man/man4/mwmrc.4 ++++ b/doc/man/man4/mwmrc.4 +@@ -84,7 +84,7 @@ + be specified from the command line: + .PP + .nf +-\f(CW/usr/X11R6/bin/X11/mwm -xrm "mwm*configFile: mymwmrc"\fR ++\f(CW/usr/X11R6/bin/X11/mwm \-xrm "mwm*configFile: mymwmrc"\fR + .fi + .PP + .SS "Resource Types" +--- a/doc/man/man3/XmFontList.3 ++++ b/doc/man/man3/XmFontList.3 +@@ -119,7 +119,7 @@ + without a font list entry tag; + .PP + .nf +-\f(CW*fontList: -Adobe-Times-Medium-I-Normal--10*\fR ++\f(CW*fontList: \-Adobe\-Times\-Medium\-I\-Normal\-\-10*\fR + .fi + .PP + .PP +@@ -138,9 +138,9 @@ + and an explicit font list entry tag\&. + .PP + .nf +-\f(CW*fontList: -Adobe-Courier-Bold-R-Normal--25-180-100-100-M-150;\ +--JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240;\ +--JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120:MY_TAG\fR ++\f(CW*fontList: \-Adobe\-Courier\-Bold\-R\-Normal\-\-25\-180\-100\-100\-M\-150;\ ++\-JIS\-Fixed\-Medium\-R\-Normal\-\-26\-180\-100\-100\-C\-240;\ ++\-JIS\-Fixed\-Medium\-R\-Normal\-\-26\-180\-100\-100\-C\-120:MY_TAG\fR + .fi + .PP + .PP +--- a/doc/man/man3/XmGetPixmapByDepth.3 ++++ b/doc/man/man3/XmGetPixmapByDepth.3 +@@ -245,8 +245,8 @@ + \f(CW/* XBM file */ + #define plaid_width 22 + #define plaid_height 22 +-#define plaid_x_hot -1 +-#define plaid_y_hot -1 ++#define plaid_x_hot \-1 ++#define plaid_y_hot \-1 + static char plaid_bits[] = { + 0x75, 0xfd, 0x3f, 0xaa, 0xfa, 0x3e, 0x75, 0xfd, 0x3f, 0xaa, 0xfa, 0x3e, + 0x75, 0xfd, 0x3f, 0xff, 0x57, 0x15, 0x75, 0xfd, 0x3f, 0xaa, 0xfa, 0x3e, +--- a/doc/man/man3/XmList.3 ++++ b/doc/man/man3/XmList.3 +@@ -182,7 +182,7 @@ + A value of 1 transfers the first item in the List; a value of 2 + transfers the second item; and so on\&. + If the entire contents of the List are being transferred, the value is +--1\&. ++\-1\&. + .PP + As a source of data, List supports the following targets and associated + conversions of data to these targets: +--- a/doc/man/man3/XmScreen.3 ++++ b/doc/man/man3/XmScreen.3 +@@ -300,7 +300,7 @@ + startup time, either by placing it within a defaults file or by using the + \fB-xrm\fP command line argument\&. For example: + .IP "" 10 +-\fBmyProg -xrm "*menuCursor: arrow"\fP ++\fBmyProg \-xrm "*menuCursor: arrow"\fP + .IP "" 10 + The menu cursor can also be selected in the program through + the function \fBXmSetMenuCursor\fP\&. +--- a/doc/man/man3/XmTabListCopy.3 ++++ b/doc/man/man3/XmTabListCopy.3 +@@ -71,7 +71,7 @@ + Specifies where to start copying\&. A value of 0 (zero) indicates begin + at the beginning, a value of 1 indicates to skip the first tab, and so + on\&. A negative indicates to begin counting backwards from the end\&. +-A value of -1 indicates to start copying from the last tab\&. ++A value of \-1 indicates to start copying from the last tab\&. + .IP "\fIcount\fP" 10 + Specifies the number of tabs to copy\&. A value of 0 (zero) indicates + to copy all elements from the starting point to the end (beginning if +--- a/doc/man/man3/XmTabListInsertTabs.3 ++++ b/doc/man/man3/XmTabListInsertTabs.3 +@@ -83,7 +83,7 @@ + value of 1 makes it the second tab, and so on\&. If \fIposition\fP is + greater than the number of tabs in \fIoldlist\fP, then the tabs will + be inserted at the end\&. If \fIposition\fP is negative, the count will +-be backwards from the end\&. A value of -1 makes the first new tab ++be backwards from the end\&. A value of \-1 makes the first new tab + the last tab, and so on\&. + .SH "RETURN" + .PP +--- a/doc/man/man5/UIL.5 ++++ b/doc/man/man5/UIL.5 +@@ -1211,7 +1211,7 @@ + 3\&.1415E-2 (equals \&.031415) + T}2\&.87 e6 (embedded blanks) + T{ +--6\&.29e7 (equals -62900000) ++\-6\&.29e7 (equals \-62900000) + T}2\&.0e100 (out of range) + .TE + .PP +@@ -1322,7 +1322,7 @@ + You can use parentheses to override the normal precedence of operators\&. + In a sequence of unary operators, the operations are performed in + right-to-left +-order\&. For example, \fB- + -A\fP is equivalent to \fB-(+(-A))\fP\&. ++order\&. For example, \fB- + \-A\fP is equivalent to \fB\-(+(\-A))\fP\&. + In a sequence of binary operators of the same precedence, the operations + are performed in left-to-right order\&. For example, \fBA*B/C*D\fP is + equivalent to \fB((A*B)/C)*D\fP\&. diff --git a/repo/x11/motif/09-fix_typo_in_libxm.patch b/repo/x11/motif/09-fix_typo_in_libxm.patch new file mode 100644 index 0000000..90d39a3 --- /dev/null +++ b/repo/x11/motif/09-fix_typo_in_libxm.patch @@ -0,0 +1,25 @@ +Description: lintian reports a typo in libXm. This patch fixes it. +Author: Paul Gevers <elbrus@debian.org> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1589 +Last-reviewed: 06 Feb 2013 + +--- a/lib/Xm/FontS.c ++++ b/lib/Xm/FontS.c +@@ -1225,7 +1225,7 @@ + + if ((fontdata = XLoadQueryFont(XtDisplay((Widget) fsw), font)) == NULL) + { +- sprintf(buf, "Font '%s'\nis not availiable on this machine", font); ++ sprintf(buf, "Font '%s'\nis not available on this machine", font); + DisplayUserError(fsw, buf); + err = True; + } +@@ -1275,7 +1275,7 @@ + fbuf)) == NULL) + { + sprintf(buf, +- "Font '%s'\nis not availiable on this machine", ++ "Font '%s'\nis not available on this machine", + font); + DisplayUserError(fsw, buf); + err = True; diff --git a/repo/x11/motif/10-fix_manpage-has-bad-whatis-entry.patch b/repo/x11/motif/10-fix_manpage-has-bad-whatis-entry.patch new file mode 100644 index 0000000..cf51d1f --- /dev/null +++ b/repo/x11/motif/10-fix_manpage-has-bad-whatis-entry.patch @@ -0,0 +1,49 @@ +Description: lintian reports bad whatis entries in manpages. Fixing here +Author: Paul Gevers <elbrus@debian.org> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1590 +Last-reviewed: 17 Feb 2013 + +--- a/doc/man/man3/XmColorSelector.3 ++++ b/doc/man/man3/XmColorSelector.3 +@@ -1,7 +1,7 @@ + .DT + .TH XmColorSelector 3X "" + .SH NAME +-The Color Selector widget ++XmColorSelector \- The Color Selector widget + .SH SYNOPSIS + #include <Xm/ColorS.h> + .SH DESCRIPTION +--- a/doc/man/man3/XmExt18List.3 ++++ b/doc/man/man3/XmExt18List.3 +@@ -1,7 +1,7 @@ + .DT + .TH XxExt18LIst 3x "" + .SH NAME +-The Internationalized Extended List widget ++XmExt18List \- The Internationalized Extended List widget + .SH SYNOPSIS + #include <Xm/Ext18List.h> + .SH DESCRIPTION +--- a/doc/man/man3/XmFontSelector.3 ++++ b/doc/man/man3/XmFontSelector.3 +@@ -1,7 +1,7 @@ + .DT + .TH XmFontSelector 3X "" + .SH NAME +-The Font Selector widget ++XmFontSelector \- The Font Selector widget + .SH SYNOPSIS + #include <Xm/FontS.h> + .SH DESCRIPTION +--- a/doc/man/man3/XmIconButton.3 ++++ b/doc/man/man3/XmIconButton.3 +@@ -1,7 +1,7 @@ + .DT + .TH XmIconButton 3X "15 July 1992" + .SH NAME +-The Icon Button widget ++XmIconButton \- The Icon Button widget + .SH SYNOPSIS + Documents the XmIconButton widget + .SH DESCRIPTION diff --git a/repo/x11/motif/11-fix_underlinking.patch b/repo/x11/motif/11-fix_underlinking.patch new file mode 100644 index 0000000..601b091 --- /dev/null +++ b/repo/x11/motif/11-fix_underlinking.patch @@ -0,0 +1,564 @@ +Description: Fix underlinking of libXt, libXext and libX11
+ Recent changes to default linker behaviour prevent shared libraries from being
+ indirectly linked, resulting in FTBFS in Ubuntu Raring.
+ .
+ This patch fixes this by explicitly linking libXt, libXext and libX11 wherever
+ necessary. Demos are patched even though they are not built for distribution.
+Author: Graham Inggs <graham@nerve.org.za>
+Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1583
+Last-Update: 2013-02-26
+--- a/clients/mwm/Makefile.am ++++ b/clients/mwm/Makefile.am +@@ -9,7 +9,7 @@ + rc_DATA = system.mwmrc + + bin_PROGRAMS = mwm +-mwm_LDADD = ./WmWsmLib/libWsm.a ../../lib/Xm/libXm.la ++mwm_LDADD = ./WmWsmLib/libWsm.a ../../lib/Xm/libXm.la -lXt -lXext -lX11 + + INCLUDES = -DLARGECURSORS -DR2_COMPAT -DUNMAP_ON_RESTART \ + -DCDE_INSTALLATION_TOP=\"@CDE_INSTALLATION_TOP@\" \ +--- a/clients/uil/Makefile.am ++++ b/clients/uil/Makefile.am +@@ -11,9 +11,9 @@ + UilParser.lo: UilParser.c + $(LTCOMPILE) -DCALLABLE -c UilParser.c + +-libUil_la_LIBADD = UilParser.lo ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la ++libUil_la_LIBADD = UilParser.lo ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la -lXt + +-uil_LDADD = ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la ++uil_LDADD = ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la -lXt + + INCLUDES = -DINCDIR=\"@INCDIR@\" \ + -DLIBDIR=\"@LIBDIR@\" \ +--- a/clients/xmbind/Makefile.am ++++ b/clients/xmbind/Makefile.am +@@ -2,6 +2,6 @@ + + bin_PROGRAMS = xmbind + +-LDADD = ../../lib/Xm/libXm.la ++LDADD = ../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/doc/programGuide/ch05/Scale/Makefile.am ++++ b/demos/doc/programGuide/ch05/Scale/Makefile.am +@@ -8,4 +8,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch06/combo_box/Makefile.am ++++ b/demos/doc/programGuide/ch06/combo_box/Makefile.am +@@ -9,4 +9,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch06/spin_box/Makefile.am ++++ b/demos/doc/programGuide/ch06/spin_box/Makefile.am +@@ -9,4 +9,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch08/Container/Makefile.am ++++ b/demos/doc/programGuide/ch08/Container/Makefile.am +@@ -8,4 +8,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch08/Notebook/Makefile.am ++++ b/demos/doc/programGuide/ch08/Notebook/Makefile.am +@@ -8,4 +8,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch16/Makefile.am ++++ b/demos/doc/programGuide/ch16/Makefile.am +@@ -9,4 +9,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch17/simple_drag/Makefile.am ++++ b/demos/doc/programGuide/ch17/simple_drag/Makefile.am +@@ -9,4 +9,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/doc/programGuide/ch17/simple_drop/Makefile.am ++++ b/demos/doc/programGuide/ch17/simple_drop/Makefile.am +@@ -9,4 +9,4 @@ + + INCLUDES = -I$(top_builddir)/lib -I$(top_srcdir)/lib -I$(top_srcdir)/demos/lib $(X_CFLAGS) + +-LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la ++LDADD = -L$(top_builddir)/demos/lib/Xmd -lXmd $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 +--- a/demos/lib/Exm/wml/Makefile.am ++++ b/demos/lib/Exm/wml/Makefile.am +@@ -18,7 +18,7 @@ + -I$(top_builddir)/clients/uil \ + ${X_CFLAGS} + +-LDADD = $(top_builddir)/lib/Xm/libXm.la ++LDADD = $(top_builddir)/lib/Xm/libXm.la -lXt + + DISTCLEANFILES = motif.wmd + +--- a/demos/lib/Xmd/Makefile.am ++++ b/demos/lib/Xmd/Makefile.am +@@ -12,7 +12,7 @@ + Print.h PrintP.h \ + RegEdit.h RegEditI.h + +-LDADD = libXmd.a ../../../lib/Xm/libXm.la ++LDADD = libXmd.a ../../../lib/Xm/libXm.la -lXt + + INCLUDES = -I$(top_builddir)/lib -I$(srcdir)/../../../lib ${X_CFLAGS} + +--- a/demos/programs/ButtonBox/Makefile.am ++++ b/demos/programs/ButtonBox/Makefile.am +@@ -8,6 +8,6 @@ + bboxdemo_SOURCES = bboxdemo.c + data_DATA = $(EXTRA_DIST) $(bboxdemo_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt + + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/ColorSel/Makefile.am ++++ b/demos/programs/ColorSel/Makefile.am +@@ -7,6 +7,6 @@ + colordemo_SOURCES = util-c.c colordemo.c + EXTRA_DIST = Imakefile + data_DATA = $(colordemo_SOURCES) $(EXTRA_DIST) +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + TOPDIR = ../../.. + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/Column/Makefile.am ++++ b/demos/programs/Column/Makefile.am +@@ -8,5 +8,5 @@ + EXTRA_DIST = Imakefile Column.ad + data_DATA = $(EXTRA_DIST) $(column_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/Combo2/Makefile.am ++++ b/demos/programs/Combo2/Makefile.am +@@ -8,5 +8,5 @@ + combo_SOURCES = combo.c + data_DATA = $(EXTRA_DIST) $(combo_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/Exm/app_in_c/Makefile.am ++++ b/demos/programs/Exm/app_in_c/Makefile.am +@@ -14,4 +14,4 @@ + -I$(top_builddir)/lib \ + ${X_CFLAGS} + LDADD = ../../../lib/Exm/libExm.a \ +- ../../../../lib/Xm/libXm.la ++ ../../../../lib/Xm/libXm.la -lXt -lXext -lX11 +--- a/demos/programs/Exm/simple_app/Makefile.am ++++ b/demos/programs/Exm/simple_app/Makefile.am +@@ -14,5 +14,6 @@ + -I$(srcdir)/../../../lib \ + -I$(top_builddir)/lib \ + ${X_CFLAGS} +-LDADD = ../../../../lib/Xm/libXm.la \ +- ../../../lib/Exm/libExm.a ++LDADD = ../../../lib/Exm/libExm.a \ ++ ../../../../lib/Xm/libXm.la -lXt -lX11 ++ +--- a/demos/programs/Ext18List/Makefile.am ++++ b/demos/programs/Ext18List/Makefile.am +@@ -10,6 +10,6 @@ + EXTRA_DIST = Imakefile + data_DATA = $(EXTRA_DIST) $(ext18list_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(TOPDIR)/lib -I.. -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/FontSel/Makefile.am ++++ b/demos/programs/FontSel/Makefile.am +@@ -7,6 +7,6 @@ + fontsel_SOURCES = callbacks-c.c creation-c.c fontsel.c fontsel.h + EXTRA_DIST = Imakefile + data_DATA = $(EXTRA_DIST) $(fontsel_SOURCES) +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt + TOPDIR = ../../.. + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/IconB/Makefile.am ++++ b/demos/programs/IconB/Makefile.am +@@ -8,7 +8,7 @@ + iconbuttondemo_SOURCES = misc.c iconbuttondemo.c + data_DATA = $(iconbuttondemo_SOURCES) $(EXTRA_DIST) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/.. \ + -I$(srcdir)/$(TOPDIR)/lib \ +--- a/demos/programs/Outline/Makefile.am ++++ b/demos/programs/Outline/Makefile.am +@@ -7,6 +7,6 @@ + bin_PROGRAMS = outline + outline_SOURCES = outline.c + data_DATA = $(outline_SOURCES) $(EXTRA_DIST) +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt + TOPDIR = ../../.. + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/Paned/Makefile.am ++++ b/demos/programs/Paned/Makefile.am +@@ -8,6 +8,6 @@ + paned_SOURCES = creation-c.c paned.c + data_DATA = $(EXTRA_DIST) $(paned_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt + + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/TabStack/Makefile.am ++++ b/demos/programs/TabStack/Makefile.am +@@ -8,6 +8,6 @@ + EXTRA_DIST = Imakefile + data_DATA = $(tabstack_SOURCES) $(EXTRA_DIST) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/Tree/Makefile.am ++++ b/demos/programs/Tree/Makefile.am +@@ -8,6 +8,6 @@ + tree_SOURCES = bxutil-c.c tree.c + data_DATA = $(EXTRA_DIST) $(tree_SOURCES) + TOPDIR = ../../.. +-LDADD = $(TOPDIR)/lib/Xm/libXm.la ++LDADD = $(TOPDIR)/lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(TOPDIR)/lib -I$(srcdir)/.. -I$(srcdir)/$(TOPDIR)/lib ${X_CFLAGS} +--- a/demos/programs/airport/Makefile.am ++++ b/demos/programs/airport/Makefile.am +@@ -8,5 +8,5 @@ + dragsource.h dropsite.h main.h + EXTRA_DIST = Imakefile XmdAirport.ad README + data_DATA = $(airport_SOURCES) $(EXTRA_DIST) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/animate/Makefile.am ++++ b/demos/programs/animate/Makefile.am +@@ -17,7 +17,7 @@ + + bin_PROGRAMS = xmanimate + +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Mrm/libMrm.la ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Mrm/libMrm.la ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib \ + -I$(srcdir)/../../lib \ +--- a/demos/programs/drag_and_drop/Makefile.am ++++ b/demos/programs/drag_and_drop/Makefile.am +@@ -10,6 +10,6 @@ + simpledrop_SOURCES = simpledrop.c + data_DATA = $(EXTRA_DIST) $(DNDDemo_SOURCES) $(simpledrop_SOURCES) + noinst_HEADERS = DNDDemo.h +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/draw/Makefile.am ++++ b/demos/programs/draw/Makefile.am +@@ -7,5 +7,5 @@ + draw_SOURCES = draw.c + EXTRA_DIST = Imakefile XmdDraw.ad README draw.help draw.man + data_DATA = $(EXTRA_DIST) $(draw_SOURCES) +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(srcdir)/../../lib -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/earth/Makefile.am ++++ b/demos/programs/earth/Makefile.am +@@ -7,5 +7,5 @@ + earth_SOURCES = earth.c + EXTRA_DIST = terre.xbm earth.man Imakefile README + data_DATA = $(EXTRA_DIST) $(earth_SOURCES) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lXext -lX11 + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/filemanager/Makefile.am ++++ b/demos/programs/filemanager/Makefile.am +@@ -11,7 +11,7 @@ + obj.xpm pix.xpm s_dir.xpm s_exec.xpm s_file.xpm \ + s_none.xpm s_pix.xpm + data_DATA = $(EXTRA_DIST) $(filemanager_SOURCES) +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(srcdir)/../../lib -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} + + +--- a/demos/programs/fileview/Makefile.am ++++ b/demos/programs/fileview/Makefile.am +@@ -11,7 +11,7 @@ + + UILS= French.uil German.uil English.uil + +-LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la ++LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} + +--- a/demos/programs/getsubres/Makefile.am ++++ b/demos/programs/getsubres/Makefile.am +@@ -7,5 +7,5 @@ + EXTRA_DIST = getsubres.help getsubres.man README Imakefile + getsubres_SOURCES = getsubres.c + data_DATA = $(EXTRA_DIST) $(getsubres_SOURCES) +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(srcdir)/../../lib -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/hellomotif/Makefile.am ++++ b/demos/programs/hellomotif/Makefile.am +@@ -7,7 +7,7 @@ + EXTRA_DIST = hellomotif.uil Imakefile README + hellomotif_SOURCES = hellomotif.c + data_DATA = $(EXTRA_DIST) $(hellomotif_SOURCES) hellomotif.uid +-LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la ++LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la -lXt + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} + + all: hellomotif.uid +--- a/demos/programs/hellomotifi18n/Makefile.am ++++ b/demos/programs/hellomotifi18n/Makefile.am +@@ -12,7 +12,7 @@ + helloint_DEPENDENCIES = helloint.uid C/uid/l_strings.uid english/uid/l_strings.uid french/uid/l_strings.uid hebrew/uid/l_strings.uid japan/uid/l_strings.uid japanese/uid/l_strings.uid swedish/uid/l_strings.uid + + INCLUDES = -I$(top_srcdir)/lib -I$(top_builddir)/lib ${X_CFLAGS} +-LDADD = $(top_builddir)/lib/Mrm/libMrm.la $(top_builddir)/lib/Xm/libXm.la ++LDADD = $(top_builddir)/lib/Mrm/libMrm.la $(top_builddir)/lib/Xm/libXm.la -lXt + + SUFFIXES = .uil .uid + +--- a/demos/programs/i18ninput/Makefile.am ++++ b/demos/programs/i18ninput/Makefile.am +@@ -8,6 +8,6 @@ + EXTRA_DIST = XmdI18nInput.ad README i18ninput.man i18ninput.help \ + Imakefile + data_DATA = $(EXTRA_DIST) $(i18ninput_SOURCES) +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../lib -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/panner/Makefile.am ++++ b/demos/programs/panner/Makefile.am +@@ -7,5 +7,5 @@ + panner_SOURCES = panner.c + EXTRA_DIST = README panner.man Imakefile + data_DATA = $(EXTRA_DIST) $(panner_SOURCES) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/periodic/Makefile.am ++++ b/demos/programs/periodic/Makefile.am +@@ -7,7 +7,7 @@ + EXTRA_DIST = periodic.uil periodic_l.uil XmdPeriodic.ad Imakefile README + periodic_SOURCES = periodic.c + data_DATA = $(EXTRA_DIST) $(periodic_SOURCES) periodic.uid +-LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la ++LDADD = ../../../lib/Xm/libXm.la ../../../lib/Mrm/libMrm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} + +--- a/demos/programs/piano/Makefile.am ++++ b/demos/programs/piano/Makefile.am +@@ -8,6 +8,6 @@ + EXTRA_DIST = piano.images README Inv8_part1.piano Inv8_part2.piano \ + piano.man Imakefile + data_DATA = $(EXTRA_DIST) $(piano_SOURCES) +-LDADD = ../../../lib/Xm/libXm.la -lm ++LDADD = ../../../lib/Xm/libXm.la -lm -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/popups/Makefile.am ++++ b/demos/programs/popups/Makefile.am +@@ -7,6 +7,6 @@ + autopopups_SOURCES = autopopups.c + EXTRA_DIST = README autopopups.man Imakefile + data_DATA = $(EXTRA_DIST) $(autopopups_SOURCES) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/sampler2_0/Makefile.am ++++ b/demos/programs/sampler2_0/Makefile.am +@@ -10,6 +10,6 @@ + bin_PROGRAMS = sampler2_0 + sampler2_0_SOURCES = sampler2_0.c + data_DATA = $(sampler2_0_SOURCES) $(EXTRA_DIST) +-LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la ++LDADD = ../../lib/Xmd/libXmd.a ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../lib -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/setdate/Makefile.am ++++ b/demos/programs/setdate/Makefile.am +@@ -7,6 +7,6 @@ + EXTRA_DIST = XmdSetDate.ad README setDate.man Imakefile + setDate_SOURCES = setDate.c + data_DATA = $(EXTRA_DIST) $(setDate_SOURCES) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/todo/Makefile.am ++++ b/demos/programs/todo/Makefile.am +@@ -9,4 +9,4 @@ + data_DATA = $(EXTRA_DIST) $(todo_SOURCES) + + INCLUDES = -I$(srcdir)/../../../lib -I$(srcdir)/../../lib -I$(top_builddir)/lib ${X_CFLAGS} +-LDADD = -L../../lib/Xmd -lXmd -L../../lib/Exm -lExm ../../../lib/Xm/libXm.la ++LDADD = -L../../lib/Xmd -lXmd -L../../lib/Exm -lExm ../../../lib/Xm/libXm.la -lXt -lXext -lX11 +--- a/demos/programs/tooltips/Makefile.am ++++ b/demos/programs/tooltips/Makefile.am +@@ -7,6 +7,6 @@ + bin_PROGRAMS = tooltips + tooltips_SOURCES = tooltips.c + data_DATA = $(tooltips_SOURCES) $(EXTRA_DIST) +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/demos/programs/workspace/Makefile.am ++++ b/demos/programs/workspace/Makefile.am +@@ -11,4 +11,4 @@ + wsm.h wsmSend.h wsmStruct.h wsm_ui.h xrmLib.h + data_DATA = $(wsm_SOURCES) $(EXTRA_DIST) + INCLUDES = -I$(srcdir)/../../../lib -I$(srcdir)/../../lib -I$(top_builddir)/lib ${X_CFLAGS} +-LDADD = ../../../lib/Xm/libXm.la -L../../lib/Wsm -lWsm ++LDADD = ../../../lib/Xm/libXm.la -L../../lib/Wsm -lWsm -lXt -lX11 +--- a/demos/unsupported/aicon/Makefile.am ++++ b/demos/unsupported/aicon/Makefile.am +@@ -2,7 +2,7 @@ + + noinst_PROGRAMS = aicon + +-LDADD = -L../../lib/Xmd -lXmd ../../../lib/Xm/libXm.la ++LDADD = -L../../lib/Xmd -lXmd ../../../lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(srcdir)/../../lib -I$(top_builddir)/lib ${X_CFLAGS} + +--- a/demos/unsupported/dainput/Makefile.am ++++ b/demos/unsupported/dainput/Makefile.am +@@ -4,7 +4,7 @@ + + dainput_SOURCES = dainput.c dainput_dlg.c dainput_ui.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/dogs/Makefile.am ++++ b/demos/unsupported/dogs/Makefile.am +@@ -16,7 +16,7 @@ + + dogs_DEPENDENCIES = dogs.uid + +-LDADD = $(top_builddir)/lib/Mrm/libMrm.la $(top_builddir)/lib/Xm/libXm.la ++LDADD = $(top_builddir)/lib/Mrm/libMrm.la $(top_builddir)/lib/Xm/libXm.la -lXt -lX11 + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} + +--- a/demos/unsupported/hellomotif/Makefile.am ++++ b/demos/unsupported/hellomotif/Makefile.am +@@ -4,7 +4,7 @@ + + SOURCES = hellomotif.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/motifshell/Makefile.am ++++ b/demos/unsupported/motifshell/Makefile.am +@@ -4,7 +4,7 @@ + + SOURCES = motifshell.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/xmapdef/Makefile.am ++++ b/demos/unsupported/xmapdef/Makefile.am +@@ -4,7 +4,7 @@ + + SOURCES = xmapdef.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/xmfonts/Makefile.am ++++ b/demos/unsupported/xmfonts/Makefile.am +@@ -4,7 +4,7 @@ + + SOURCES = xmfonts.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt -lX11 + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/xmforc/Makefile.am ++++ b/demos/unsupported/xmforc/Makefile.am +@@ -4,7 +4,7 @@ + + SOURCES = xmforc.c + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt + + EXTRA_DIST = Imakefile + +--- a/demos/unsupported/xmform/Makefile.am ++++ b/demos/unsupported/xmform/Makefile.am +@@ -6,6 +6,6 @@ + + EXTRA_DIST = Imakefile + +-LDADD = ../../../lib/Xm/libXm.la ++LDADD = ../../../lib/Xm/libXm.la -lXt + + INCLUDES = -I$(srcdir)/../../../lib -I$(top_builddir)/lib ${X_CFLAGS} +--- a/tools/wml/Makefile.am ++++ b/tools/wml/Makefile.am +@@ -30,7 +30,7 @@ + wml_LDADD = -L. -lwml + wml_DEPENDENCIES = libwml.a + +-wmldbcreate_LDADD = ../../lib/Xm/libXm.la ++wmldbcreate_LDADD = ../../lib/Xm/libXm.la -lXt + + INCLUDES = -I../../lib -I$(srcdir)/../../lib -I$(srcdir)/../../include ${X_CFLAGS} + diff --git a/repo/x11/motif/13-fix_hardcoded_x11rgb_path.patch b/repo/x11/motif/13-fix_hardcoded_x11rgb_path.patch new file mode 100644 index 0000000..6d53285 --- /dev/null +++ b/repo/x11/motif/13-fix_hardcoded_x11rgb_path.patch @@ -0,0 +1,54 @@ +Description: Fix hardcoded path to /usr/lib/X11/rgb.txt in lib/Xm/ColorS.c + LibXm is hardcoded to read rgb.txt from /usr/lib/X11 but this file, provided + by x11-common in Debian, is located in /etc/X11 and /usr/share/X11 via symlink. + . + This patch fixes this by allowing the directory in which rgb.txt resides to be + customized by the --with-x11rgbdir=DIR configure option. +Author: Graham Inggs <graham@nerve.org.za> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1585 +Last-Update: 2013-03-12 +--- a/configure.ac ++++ b/configure.ac +@@ -189,6 +189,10 @@ + XMBINDDIR_FALLBACK="$xmbinddir" + AC_SUBST(XMBINDDIR_FALLBACK) + ++AC_ARG_WITH(x11rgbdir, [ --with-x11rgbdir=DIR rgb.txt is located in DIR], x11rgbdir=$withval, x11rgbdir="/usr/lib/X11") ++X11RGBPATH="$x11rgbdir/rgb.txt" ++AC_SUBST(X11RGBPATH) ++ + RM="rm -f" + AC_SUBST(RM) + +--- a/lib/Xm/ColorS.c ++++ b/lib/Xm/ColorS.c +@@ -123,6 +123,10 @@ + * STATIC DECLARATIONS + ************************************************************/ + ++#ifndef X11RGBPATH ++#define X11RGBPATH "/usr/lib/X11/rgb.txt" ++#endif ++ + static XtResource resources[] = + { + { +@@ -146,7 +150,7 @@ + { + XmNrgbFile, XmCString, XmRString, + sizeof(String), XtOffsetOf(XmColorSelectorRec, cs.rgb_file), +- XmRString, (XtPointer) "/usr/lib/X11/rgb.txt" ++ XmRString, (XtPointer) X11RGBPATH + }, + #endif + { +--- a/lib/Xm/Makefile.am ++++ b/lib/Xm/Makefile.am +@@ -8,6 +8,7 @@ + INCLUDES = -I.. -I$(srcdir)/.. -DXMBINDDIR_FALLBACK=\"@XMBINDDIR_FALLBACK@\" \ + -DINCDIR=\"@INCDIR@\" \ + -DLIBDIR=\"@LIBDIR@\" \ ++ -DX11RGBPATH=\"@X11RGBPATH@\" \ + ${X_CFLAGS} + xmdir = $(includedir)/Xm + diff --git a/repo/x11/motif/15-link_uil_against_libuil.patch b/repo/x11/motif/15-link_uil_against_libuil.patch new file mode 100644 index 0000000..11792a7 --- /dev/null +++ b/repo/x11/motif/15-link_uil_against_libuil.patch @@ -0,0 +1,29 @@ +Description: Link the uil executable against libUil + Linking the uil executable againt libUil instead of compiling with the libUil + code results in a reduction in size of the uil executable from about 348KB + to about 16KB. + . + This patch originates from Red Hat. +Author: Graham Inggs <graham@nerve.org.za> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1586 +Last-Update: 2013-03-12 +--- a/clients/uil/Makefile.am ++++ b/clients/uil/Makefile.am +@@ -13,7 +13,7 @@ + + libUil_la_LIBADD = UilParser.lo ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la -lXt + +-uil_LDADD = ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la -lXt ++uil_LDADD = libUil.la ../../lib/Mrm/libMrm.la ../../lib/Xm/libXm.la -lXt + + INCLUDES = -DINCDIR=\"@INCDIR@\" \ + -DLIBDIR=\"@LIBDIR@\" \ +@@ -42,7 +42,7 @@ + UilLstMac.c UilSemVal.c UilSemCSet.c UilDB.c + + SRCS = $(COMMON_SRC) +-SRCS2 = $(COMMON_SRC) UilMain.c ++SRCS2 = UilMain.c + + HEADERS_1 = Uil.h UilSymGl.h UilSymDef.h \ + UilDef.h XmAppl.uil diff --git a/repo/x11/motif/16-fix-undefined-use-of-sprintf.patch b/repo/x11/motif/16-fix-undefined-use-of-sprintf.patch new file mode 100644 index 0000000..95a753e --- /dev/null +++ b/repo/x11/motif/16-fix-undefined-use-of-sprintf.patch @@ -0,0 +1,17 @@ +Description: Fix undefined use of sprintf + This patch fixes the undefined use of sprintf when the + source and destination buffers overlap. +Author: Graham Inggs <graham@nerve.org.za> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1628 +Last-Update: 2013-09-24 +--- a/lib/Xm/XmRenderT.c ++++ b/lib/Xm/XmRenderT.c +@@ -2703,7 +2703,7 @@ + number = tlist -> count; + tab = (_XmTab) tlist -> start; + while(number > 0) { +- sprintf(temp, "%s %f %d %d %d, ", temp, tab -> value, ++ sprintf(temp + strlen(temp), " %f %d %d %d, ", tab -> value, + tab -> units, tab -> alignment, tab -> offsetModel); + tab = (_XmTab) tab -> next; + number--; diff --git a/repo/x11/motif/17-switch-to-system-iswspace.patch b/repo/x11/motif/17-switch-to-system-iswspace.patch new file mode 100644 index 0000000..a77b879 --- /dev/null +++ b/repo/x11/motif/17-switch-to-system-iswspace.patch @@ -0,0 +1,384 @@ +Description: Switch to system iswspace() function + This patch replaces calls to _XmDataFieldIsWSpace() in lib/Xm/DataF.c + and _XmTextFieldIsWSpace() in lib/Xm/TextF.c with calls to the system + iswspace() function. + . + It fixes an array bounds error in lib/Xm/DataF.c where + _XmDataFieldIsWSpace() is called with num_entries = 3. +Author: Graham Inggs <graham@nerve.org.za> +Forwarded: http://bugs.motifzone.net/show_bug.cgi?id=1629 +Last-Update: 2013-11-18 +--- a/lib/Xm/DataF.c ++++ b/lib/Xm/DataF.c +@@ -208,7 +208,6 @@ + static Boolean df_VerifyLeave() ; + static Boolean _XmDataFieldIsWordBoundary() ; + static int _XmGetImage(Screen *, char *, XImage **); +-static Boolean _XmDataFieldIsWSpace() ; + static void df_FindWord() ; + static void df_FindPrevWord() ; + static void df_FindNextWord() ; +@@ -549,10 +548,6 @@ + XmDataFieldWidget tf, + XmTextPosition pos1, + XmTextPosition pos2) ; +-static Boolean _XmDataFieldIsWSpace( +- wchar_t wide_char, +- wchar_t *white_space, +- int num_entries) ; + static void df_FindWord( + XmDataFieldWidget tf, + XmTextPosition begin, +@@ -4549,40 +4544,6 @@ + return False; + } + +-/* This routine accepts an array of wchar_t's containing wchar encodings +- * of whitespace characters (and the number of array elements), comparing +- * the wide character passed to each element of the array. If a match +- * is found, we got a white space. This routine exists only because +- * iswspace(3c) is not yet standard. If a system has isw* available, +- * calls to this routine should be changed to iswspace(3c) (and callers +- * should delete initialization of the array), and this routine should +- * be deleted. Its a stop gap measure to avoid allocating an instance +- * variable for the white_space array and/or declaring a widget wide +- * global for the data and using a macro. Its ugly, but it works and +- * in the long run will be replaced by standard functionality. */ +- +-/* ARGSUSED */ +-static Boolean +-#ifdef _NO_PROTO +-_XmDataFieldIsWSpace( wide_char, white_space, num_entries ) +- wchar_t wide_char ; +- wchar_t * white_space ; +- int num_entries ; +-#else +-_XmDataFieldIsWSpace( +- wchar_t wide_char, +- wchar_t * white_space , +- int num_entries ) +-#endif /* _NO_PROTO */ +-{ +- int i; +- +- for (i=num_entries; i > 0; i--){ +- if (wide_char == white_space[i]) return True; +- } +- return False; +-} +- + static void + #ifdef _NO_PROTO + df_FindWord( tf, begin, left, right ) +@@ -4599,7 +4560,6 @@ + #endif /* _NO_PROTO */ + { + XmTextPosition start, end; +- wchar_t white_space[3]; + + if (XmTextF_max_char_size(tf) == 1) { + for (start = begin; start > 0; start--) { +@@ -4617,11 +4577,8 @@ + } + *right = end - 1; + } else { /* check for iswspace and iswordboundary in each direction */ +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); + for (start = begin; start > 0; start --) { +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start-1],white_space, 3) ++ if (iswspace(XmTextF_wc_value(tf)[start-1]) + || _XmDataFieldIsWordBoundary(tf, (XmTextPosition) start - 1, + start)) { + break; +@@ -4630,7 +4587,7 @@ + *left = start; + + for (end = begin; end <= XmTextF_string_length(tf); end++) { +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)){ ++ if (iswspace(XmTextF_wc_value(tf)[end])){ + end++; + break; + } else if (end < XmTextF_string_length(tf)) { +@@ -4659,14 +4616,6 @@ + { + + XmTextPosition start = XmTextF_cursor_position(tf); +- wchar_t white_space[3]; +- +- if (XmTextF_max_char_size(tf) != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } +- + + if (XmTextF_max_char_size(tf) == 1) { + if ((start > 0) && +@@ -4680,11 +4629,9 @@ + } + df_FindWord(tf, start, left, right); + } else { +- if ((start > 0) && (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start - 1], +- white_space, 3))) { ++ if ((start > 0) && (iswspace(XmTextF_wc_value(tf)[start - 1]))) { + for (; start > 0; start--) { +- if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[start -1], +- white_space, 3)){ ++ if (!iswspace(XmTextF_wc_value(tf)[start -1])){ + start--; + break; + } +@@ -4713,14 +4660,6 @@ + { + + XmTextPosition end = XmTextF_cursor_position(tf); +- wchar_t white_space[3]; +- +- if (XmTextF_max_char_size(tf) != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } +- + + if(XmTextF_max_char_size(tf) == 1) { + if (isspace((int)(unsigned char)XmTextF_value(tf)[end])) { +@@ -4742,9 +4681,9 @@ + if (*right < XmTextF_string_length(tf)) + *right = *right - 1; + } else { +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)) { ++ if (iswspace(XmTextF_wc_value(tf)[end])) { + for ( ; end < XmTextF_string_length(tf); end ++) { +- if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[end], white_space, 3)) { ++ if (!iswspace(XmTextF_wc_value(tf)[end])) { + break; + } + } +@@ -4758,10 +4697,9 @@ + * If word boundary caused by whitespace, set right to the last + * whitespace following the end of the current word. + */ +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[(int)*right], white_space, 3)) { ++ if (iswspace(XmTextF_wc_value(tf)[(int)*right])) { + while (*right < XmTextF_string_length(tf) && +- _XmDataFieldIsWSpace(XmTextF_wc_value(tf)[(int)*right], +- white_space, 3)) { ++ iswspace(XmTextF_wc_value(tf)[(int)*right])) { + *right = *right + 1; + } + if (*right < XmTextF_string_length(tf)) +@@ -5872,13 +5810,6 @@ + { + XmDataFieldWidget tf = (XmDataFieldWidget) w; + XmTextPosition cursorPos, position, dummy; +- wchar_t white_space[3]; +- +- if (XmTextF_max_char_size(tf) != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } + + cursorPos = XmTextF_cursor_position(tf); + +@@ -5896,16 +5827,13 @@ + } + } + } else { +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[cursorPos], +- white_space, 3)) ++ if (iswspace(XmTextF_wc_value(tf)[cursorPos])) + df_FindWord(tf, cursorPos, &dummy, &position); + else + df_FindNextWord(tf, &dummy, &position); +- if (_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[position], +- white_space, 3)){ ++ if (iswspace(XmTextF_wc_value(tf)[position])){ + for (; position < XmTextF_string_length(tf); position++) { +- if (!_XmDataFieldIsWSpace(XmTextF_wc_value(tf)[position], +- white_space, 3)) ++ if (!iswspace(XmTextF_wc_value(tf)[position])) + break; + } + } +--- a/lib/Xm/TextF.c ++++ b/lib/Xm/TextF.c +@@ -360,10 +360,6 @@ + XmTextPosition pos1, + XmTextPosition pos2); + +-static Boolean _XmTextFieldIsWSpace(wchar_t wide_char, +- wchar_t *white_space, +- int num_entries); +- + static void FindWord(XmTextFieldWidget tf, + XmTextPosition begin, + XmTextPosition *left, +@@ -3514,32 +3510,6 @@ + return False; + } + +-/* This routine accepts an array of wchar_t's containing wchar encodings +- * of whitespace characters (and the number of array elements), comparing +- * the wide character passed to each element of the array. If a match +- * is found, we got a white space. This routine exists only because +- * iswspace(3c) is not yet standard. If a system has isw* available, +- * calls to this routine should be changed to iswspace(3c) (and callers +- * should delete initialization of the array), and this routine should +- * be deleted. Its a stop gap measure to avoid allocating an instance +- * variable for the white_space array and/or declaring a widget wide +- * global for the data and using a macro. Its ugly, but it works and +- * in the long run will be replaced by standard functionality. */ +- +-/* ARGSUSED */ +-static Boolean +-_XmTextFieldIsWSpace(wchar_t wide_char, +- wchar_t * white_space , +- int num_entries) +-{ +- int i; +- +- for (i=0; i < num_entries; i++) { +- if (wide_char == white_space[i]) return True; +- } +- return False; +-} +- + static void + FindWord(XmTextFieldWidget tf, + XmTextPosition begin, +@@ -3547,7 +3517,6 @@ + XmTextPosition *right) + { + XmTextPosition start, end; +- wchar_t white_space[3]; + + if (tf->text.max_char_size == 1) { + for (start = begin; start > 0; start--) { +@@ -3565,11 +3534,8 @@ + } + *right = end - 1; + } else { /* check for iswspace and iswordboundary in each direction */ +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); + for (start = begin; start > 0; start --) { +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[start-1],white_space, 3) ++ if (iswspace(TextF_WcValue(tf)[start-1]) + || _XmTextFieldIsWordBoundary(tf, (XmTextPosition) start - 1, + start)) { + break; +@@ -3578,7 +3544,7 @@ + *left = start; + + for (end = begin; end <= tf->text.string_length; end++) { +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { ++ if (iswspace(TextF_WcValue(tf)[end])) { + end++; + break; + } else if (end < tf->text.string_length) { +@@ -3599,14 +3565,6 @@ + { + + XmTextPosition start = TextF_CursorPosition(tf); +- wchar_t white_space[3]; +- +- if (tf->text.max_char_size != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } +- + + if (tf->text.max_char_size == 1) { + if ((start > 0) && +@@ -3620,11 +3578,9 @@ + } + FindWord(tf, start, left, right); + } else { +- if ((start > 0) && (_XmTextFieldIsWSpace(TextF_WcValue(tf)[start - 1], +- white_space, 3))) { ++ if ((start > 0) && (iswspace(TextF_WcValue(tf)[start - 1]))) { + for (; start > 0; start--) { +- if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[start -1], +- white_space, 3)) { ++ if (!iswspace(TextF_WcValue(tf)[start -1])) { + start--; + break; + } +@@ -3645,14 +3601,6 @@ + { + + XmTextPosition end = TextF_CursorPosition(tf); +- wchar_t white_space[3]; +- +- if (tf->text.max_char_size != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } +- + + if(tf->text.max_char_size == 1) { + if (isspace((unsigned char)TextF_Value(tf)[end])) { +@@ -3674,9 +3622,9 @@ + if (*right < tf->text.string_length) + *right = *right - 1; + } else { +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { ++ if (iswspace(TextF_WcValue(tf)[end])) { + for (; end < tf->text.string_length; end ++) { +- if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[end], white_space, 3)) { ++ if (!iswspace(TextF_WcValue(tf)[end])) { + break; + } + } +@@ -3690,10 +3638,9 @@ + * If word boundary caused by whitespace, set right to the last + * whitespace following the end of the current word. + */ +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[(int)*right], white_space, 3)) { ++ if (iswspace(TextF_WcValue(tf)[(int)*right])) { + while (*right < tf->text.string_length && +- _XmTextFieldIsWSpace(TextF_WcValue(tf)[(int)*right], +- white_space, 3)) { ++ iswspace(TextF_WcValue(tf)[(int)*right])) { + *right = *right + 1; + } + if (*right < tf->text.string_length) +@@ -4546,13 +4493,6 @@ + { + XmTextFieldWidget tf = (XmTextFieldWidget) w; + XmTextPosition cursorPos, position, dummy; +- wchar_t white_space[3]; +- +- if (tf->text.max_char_size != 1) { +- (void)mbtowc(&white_space[0], " ", 1); +- (void)mbtowc(&white_space[1], "\n", 1); +- (void)mbtowc(&white_space[2], "\t", 1); +- } + + cursorPos = TextF_CursorPosition(tf); + +@@ -4570,16 +4510,13 @@ + } + } + } else { +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[cursorPos], +- white_space, 3)) ++ if (iswspace(TextF_WcValue(tf)[cursorPos])) + FindWord(tf, cursorPos, &dummy, &position); + else + FindNextWord(tf, &dummy, &position); +- if (_XmTextFieldIsWSpace(TextF_WcValue(tf)[position], +- white_space, 3)) { ++ if (iswspace(TextF_WcValue(tf)[position])) { + for (; position < tf->text.string_length; position++) { +- if (!_XmTextFieldIsWSpace(TextF_WcValue(tf)[position], +- white_space, 3)) ++ if (!iswspace(TextF_WcValue(tf)[position])) + break; + } + } diff --git a/repo/x11/motif/18-option-main.patch b/repo/x11/motif/18-option-main.patch new file mode 100644 index 0000000..3ad059c --- /dev/null +++ b/repo/x11/motif/18-option-main.patch @@ -0,0 +1,9 @@ +diff -urN motif-2.3.8.orig/tools/wml/wmluiltok.l motif-2.3.8/tools/wml/wmluiltok.l +--- motif-2.3.8.orig/tools/wml/wmluiltok.l 2021-05-25 13:51:53.464073407 -0600 ++++ motif-2.3.8/tools/wml/wmluiltok.l 2021-05-25 13:52:25.354192799 -0600 +@@ -1,3 +1,5 @@ ++%option main ++ + %{ + /* + * Motif diff --git a/repo/x11/motif.xibuild b/repo/x11/motif/motif.xibuild index a283ca0..a283ca0 100644 --- a/repo/x11/motif.xibuild +++ b/repo/x11/motif/motif.xibuild diff --git a/repo/x11/pango/disable-broken-test.patch b/repo/x11/pango/disable-broken-test.patch new file mode 100644 index 0000000..db3d6c3 --- /dev/null +++ b/repo/x11/pango/disable-broken-test.patch @@ -0,0 +1,15 @@ +--- a/tests/meson.build ++++ b/tests/meson.build +@@ -58,12 +58,6 @@ + [ 'testmisc', [ 'testmisc.c' ], [ libpangocairo_dep, libpangoft2_dep, glib_dep, harfbuzz_dep ] ], + [ 'testserialize', [ 'testserialize.c' ], [ libpangocairo_dep, libpangoft2_dep ] ], + ] +- +- if host_system != 'darwin' +- tests += [ +- [ 'test-layout', [ 'test-layout.c', 'test-common.c' ], [ libpangocairo_dep, libpangoft2_dep ] ], +- ] +- endif + endif + + if host_system != 'darwin' diff --git a/repo/x11/pango.xibuild b/repo/x11/pango/pango.xibuild index 8b507dc..8b507dc 100644 --- a/repo/x11/pango.xibuild +++ b/repo/x11/pango/pango.xibuild diff --git a/repo/x11/picom.xibuild b/repo/x11/picom/picom.xibuild index 2c3eb28..2c3eb28 100644 --- a/repo/x11/picom.xibuild +++ b/repo/x11/picom/picom.xibuild diff --git a/repo/x11/pixman.xibuild b/repo/x11/pixman/pixman.xibuild index c502b84..c502b84 100644 --- a/repo/x11/pixman.xibuild +++ b/repo/x11/pixman/pixman.xibuild diff --git a/repo/x11/rofi/rofi-sensible-terminal-use-sh.patch b/repo/x11/rofi/rofi-sensible-terminal-use-sh.patch new file mode 100644 index 0000000..926aa7a --- /dev/null +++ b/repo/x11/rofi/rofi-sensible-terminal-use-sh.patch @@ -0,0 +1,23 @@ +From 34d5779d41a902be21cef3fc3e70d8f6881ca05c Mon Sep 17 00:00:00 2001 +From: Jakub Jirutka <jakub@jirutka.cz> +Date: Mon, 27 Sep 2021 01:00:43 +0200 +Subject: [PATCH] [rofi-sensible-terminal] Use /bin/sh instead of /usr/bin/env bash +Patch-Source: https://github.com/davatorium/rofi/pull/1478 + +This script is fully POSIX-sh compatible, i.e. it's portable and can be +run in any shell, not just bash. It's incorrect to assume that bash is +available on every *nix system (it's not), but /bin/sh is. +--- + script/rofi-sensible-terminal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/script/rofi-sensible-terminal b/script/rofi-sensible-terminal +index 112e1d14e..e2b6cc4b9 100755 +--- a/script/rofi-sensible-terminal ++++ b/script/rofi-sensible-terminal +@@ -1,4 +1,4 @@ +-#!/usr/bin/env bash ++#!/bin/sh + # + # This code is released in public domain by Han Boetes <han@mijncomputer.nl> + # Updated by Dave Davenport <qball@gmpclient.org> diff --git a/repo/x11/rofi.xibuild b/repo/x11/rofi/rofi.xibuild index e377909..e377909 100644 --- a/repo/x11/rofi.xibuild +++ b/repo/x11/rofi/rofi.xibuild diff --git a/repo/x11/rofi/scrollbar-test.patch b/repo/x11/rofi/scrollbar-test.patch new file mode 100644 index 0000000..40f9dec --- /dev/null +++ b/repo/x11/rofi/scrollbar-test.patch @@ -0,0 +1,31 @@ +Subject: the test fails on x86 + +diff --git a/meson.build b/meson.build +index 6e1105a..f707cd9 100644 +--- a/meson.build ++++ b/meson.build +@@ -345,24 +345,6 @@ test('box test', executable('box.test', [ + dependencies: deps, + )) + +-test('scrollbar test', executable('scrollbar.test', [ +- 'test/scrollbar-test.c', +- theme_parser, +- theme_lexer, +- default_theme, +- ], +- objects: rofi.extract_objects([ +- 'source/widgets/widget.c', +- 'source/widgets/scrollbar.c', +- 'source/theme.c', +- 'source/css-colors.c', +- 'source/rofi-types.c', +- 'source/css-colors.c', +- 'config/config.c', +- ]), +- dependencies: deps, +-)) +- + test('textbox test', executable('textbox.test', [ + 'test/textbox-test.c', + theme_parser, diff --git a/repo/x11/sdl2/directfb-cflags.patch b/repo/x11/sdl2/directfb-cflags.patch new file mode 100644 index 0000000..037667d --- /dev/null +++ b/repo/x11/sdl2/directfb-cflags.patch @@ -0,0 +1,10 @@ +--- a/cmake/sdlchecks.cmake ++++ b/cmake/sdlchecks.cmake +@@ -745,6 +745,7 @@ + set(SDL_VIDEO_DRIVER_DIRECTFB 1) + set(SDL_VIDEO_RENDER_DIRECTFB 1) + list(APPEND EXTRA_CFLAGS ${PKG_DIRECTFB_CFLAGS}) ++ list(JOIN PKG_DIRECTFB_CFLAGS " " SDL_CFLAGS) + if(SDL_DIRECTFB_SHARED AND NOT HAVE_SDL_LOADSO) + message_warn("You must have SDL_LoadObject() support for dynamic DirectFB loading") + endif() diff --git a/repo/x11/sdl2.xibuild b/repo/x11/sdl2/sdl2.xibuild index 0f0778f..0f0778f 100644 --- a/repo/x11/sdl2.xibuild +++ b/repo/x11/sdl2/sdl2.xibuild diff --git a/repo/x11/sessreg.xibuild b/repo/x11/sessreg/sessreg.xibuild index 08d3e4e..08d3e4e 100644 --- a/repo/x11/sessreg.xibuild +++ b/repo/x11/sessreg/sessreg.xibuild diff --git a/repo/x11/setxkbmap.xibuild b/repo/x11/setxkbmap/setxkbmap.xibuild index 42c0200..42c0200 100644 --- a/repo/x11/setxkbmap.xibuild +++ b/repo/x11/setxkbmap/setxkbmap.xibuild diff --git a/repo/x11/slock.xibuild b/repo/x11/slock/slock.xibuild index 596cdcf..596cdcf 100644 --- a/repo/x11/slock.xibuild +++ b/repo/x11/slock/slock.xibuild diff --git a/repo/x11/slop.xibuild b/repo/x11/slop/slop.xibuild index 263118b..263118b 100644 --- a/repo/x11/slop.xibuild +++ b/repo/x11/slop/slop.xibuild diff --git a/repo/x11/smproxy.xibuild b/repo/x11/smproxy/smproxy.xibuild index 8d1867e..8d1867e 100644 --- a/repo/x11/smproxy.xibuild +++ b/repo/x11/smproxy/smproxy.xibuild diff --git a/repo/x11/spice-protocol.xibuild b/repo/x11/spice-protocol/spice-protocol.xibuild index 8656080..8656080 100644 --- a/repo/x11/spice-protocol.xibuild +++ b/repo/x11/spice-protocol/spice-protocol.xibuild diff --git a/repo/x11/sxhkd.xibuild b/repo/x11/sxhkd/sxhkd.xibuild index a18247a..a18247a 100644 --- a/repo/x11/sxhkd.xibuild +++ b/repo/x11/sxhkd/sxhkd.xibuild diff --git a/repo/x11/wayland-protocols.xibuild b/repo/x11/wayland-protocols/wayland-protocols.xibuild index 764fa29..764fa29 100644 --- a/repo/x11/wayland-protocols.xibuild +++ b/repo/x11/wayland-protocols/wayland-protocols.xibuild diff --git a/repo/x11/wayland.xibuild b/repo/x11/wayland/wayland.xibuild index c26f903..c26f903 100644 --- a/repo/x11/wayland.xibuild +++ b/repo/x11/wayland/wayland.xibuild diff --git a/repo/x11/x11perf.xibuild b/repo/x11/x11perf/x11perf.xibuild index ebb5ede..ebb5ede 100644 --- a/repo/x11/x11perf.xibuild +++ b/repo/x11/x11perf/x11perf.xibuild diff --git a/repo/x11/xauth.xibuild b/repo/x11/xauth/xauth.xibuild index a9c14d7..a9c14d7 100644 --- a/repo/x11/xauth.xibuild +++ b/repo/x11/xauth/xauth.xibuild diff --git a/repo/x11/xautolock/processwait.patch b/repo/x11/xautolock/processwait.patch new file mode 100644 index 0000000..a288d9a --- /dev/null +++ b/repo/x11/xautolock/processwait.patch @@ -0,0 +1,33 @@ +--- a/src/engine.c.orig 2014-08-28 12:50:56.086307943 +0000 ++++ b/src/engine.c 2014-08-28 12:50:59.496333650 +0000 +@@ -209,24 +209,24 @@ evaluateTriggers (Display* d) + { + #else /* VMS */ + if (lockerPid) + { +-#if !defined (UTEKV) && !defined (SYSV) && !defined (SVR4) ++#if (!defined (UTEKV) && !defined (SYSV) && !defined (SVR4)) && defined (__GLIBC__) + union wait status; /* childs process status */ +-#else /* !UTEKV && !SYSV && !SVR4 */ ++#else /* (!UTEKV && !SYSV && !SVR4) && __GLIBC__ */ + int status = 0; /* childs process status */ +-#endif /* !UTEKV && !SYSV && !SVR4 */ ++#endif /* (!UTEKV && !SYSV && !SVR4) && __GLIBC__ */ + + if (unlockNow && !disabled) + { + (void) kill (lockerPid, SIGTERM); + } + +-#if !defined (UTEKV) && !defined (SYSV) && !defined (SVR4) ++#if (!defined (UTEKV) && !defined (SYSV) && !defined (SVR4)) && defined (__GLIBC__) + if (wait3 (&status, WNOHANG, 0)) +-#else /* !UTEKV && !SYSV && !SVR4 */ ++#else /* (!UTEKV && !SYSV && !SVR4) && __GLIBC__ */ + if (waitpid (-1, &status, WNOHANG)) +-#endif /* !UTEKV && !SYSV && !SVR4 */ ++#endif /* (!UTEKV && !SYSV && !SVR4) && __GLIBC__ */ + { + /* + * If the locker exited normally, we disable any pending kill + * trigger. Otherwise, we assume that it either has crashed or diff --git a/repo/x11/xautolock.xibuild b/repo/x11/xautolock/xautolock.xibuild index 75476d6..75476d6 100644 --- a/repo/x11/xautolock.xibuild +++ b/repo/x11/xautolock/xautolock.xibuild diff --git a/repo/x11/xbacklight.xibuild b/repo/x11/xbacklight/xbacklight.xibuild index 7f79bc0..7f79bc0 100644 --- a/repo/x11/xbacklight.xibuild +++ b/repo/x11/xbacklight/xbacklight.xibuild diff --git a/repo/x11/xbitmaps.xibuild b/repo/x11/xbitmaps/xbitmaps.xibuild index 591adc8..591adc8 100644 --- a/repo/x11/xbitmaps.xibuild +++ b/repo/x11/xbitmaps/xbitmaps.xibuild diff --git a/repo/x11/xcb-proto.xibuild b/repo/x11/xcb-proto/xcb-proto.xibuild index 01ece2a..01ece2a 100644 --- a/repo/x11/xcb-proto.xibuild +++ b/repo/x11/xcb-proto/xcb-proto.xibuild diff --git a/repo/x11/xcb-util-cursor.xibuild b/repo/x11/xcb-util-cursor/xcb-util-cursor.xibuild index cae954b..cae954b 100644 --- a/repo/x11/xcb-util-cursor.xibuild +++ b/repo/x11/xcb-util-cursor/xcb-util-cursor.xibuild diff --git a/repo/x11/xcb-util-image.xibuild b/repo/x11/xcb-util-image/xcb-util-image.xibuild index e11280a..e11280a 100644 --- a/repo/x11/xcb-util-image.xibuild +++ b/repo/x11/xcb-util-image/xcb-util-image.xibuild diff --git a/repo/x11/xcb-util-keysyms.xibuild b/repo/x11/xcb-util-keysyms/xcb-util-keysyms.xibuild index 31bc072..31bc072 100644 --- a/repo/x11/xcb-util-keysyms.xibuild +++ b/repo/x11/xcb-util-keysyms/xcb-util-keysyms.xibuild diff --git a/repo/x11/xcb-util-renderutil.xibuild b/repo/x11/xcb-util-renderutil/xcb-util-renderutil.xibuild index 293f41d..293f41d 100644 --- a/repo/x11/xcb-util-renderutil.xibuild +++ b/repo/x11/xcb-util-renderutil/xcb-util-renderutil.xibuild diff --git a/repo/x11/xcb-util-wm.xibuild b/repo/x11/xcb-util-wm/xcb-util-wm.xibuild index 7180dec..7180dec 100644 --- a/repo/x11/xcb-util-wm.xibuild +++ b/repo/x11/xcb-util-wm/xcb-util-wm.xibuild diff --git a/repo/x11/xcb-util.xibuild b/repo/x11/xcb-util/xcb-util.xibuild index 04321d1..04321d1 100644 --- a/repo/x11/xcb-util.xibuild +++ b/repo/x11/xcb-util/xcb-util.xibuild diff --git a/repo/x11/xclip.xibuild b/repo/x11/xclip/xclip.xibuild index 28de291..28de291 100644 --- a/repo/x11/xclip.xibuild +++ b/repo/x11/xclip/xclip.xibuild diff --git a/repo/x11/xclock.xibuild b/repo/x11/xclock/xclock.xibuild index 14e1307..14e1307 100644 --- a/repo/x11/xclock.xibuild +++ b/repo/x11/xclock/xclock.xibuild diff --git a/repo/x11/xcmsdb.xibuild b/repo/x11/xcmsdb/xcmsdb.xibuild index ddaadef..ddaadef 100644 --- a/repo/x11/xcmsdb.xibuild +++ b/repo/x11/xcmsdb/xcmsdb.xibuild diff --git a/repo/x11/xcursor-themes.xibuild b/repo/x11/xcursor-themes/xcursor-themes.xibuild index f3ecb0b..f3ecb0b 100644 --- a/repo/x11/xcursor-themes.xibuild +++ b/repo/x11/xcursor-themes/xcursor-themes.xibuild diff --git a/repo/x11/xcursorgen.xibuild b/repo/x11/xcursorgen/xcursorgen.xibuild index 13c14a0..13c14a0 100644 --- a/repo/x11/xcursorgen.xibuild +++ b/repo/x11/xcursorgen/xcursorgen.xibuild diff --git a/repo/x11/xdg-utils/xdg-screensaver-mv-T.patch b/repo/x11/xdg-utils/xdg-screensaver-mv-T.patch new file mode 100644 index 0000000..9e209f7 --- /dev/null +++ b/repo/x11/xdg-utils/xdg-screensaver-mv-T.patch @@ -0,0 +1,25 @@ +--- ./scripts/xdg-screensaver.in.orig ++++ ./scripts/xdg-screensaver.in +@@ -26,18 +26,10 @@ + + #@xdg-utils-common@ + +-# Check if we can use "mv -T" +-if mv -T ... ... 2>&1 | grep '\.\.\.' > /dev/null ; then +- # We can securely move files in /tmp with mv -T +- DEBUG 1 "mv -T available" +- MV="mv -T" +- screensaver_file="/tmp/xdg-screensaver-$USER-"`echo $DISPLAY | sed 's/:/-/g'` +-else +- # No secure moves available, use home dir +- DEBUG 1 "mv -T not available" +- MV="mv" +- screensaver_file="$HOME/.xdg-screensaver-"`echo $(hostname)-$DISPLAY | sed 's/:/-/g'` +-fi ++# No secure moves available, use home dir ++DEBUG 1 "mv -T not available" ++MV="mv" ++screensaver_file="$HOME/.xdg-screensaver-"`echo $(hostname)-$DISPLAY | sed 's/:/-/g'` + lockfile_command=`which lockfile 2> /dev/null` + + lockfile() diff --git a/repo/x11/xdg-utils.xibuild b/repo/x11/xdg-utils/xdg-utils.xibuild index ad51ab4..ad51ab4 100644 --- a/repo/x11/xdg-utils.xibuild +++ b/repo/x11/xdg-utils/xdg-utils.xibuild diff --git a/repo/x11/xdpyinfo.xibuild b/repo/x11/xdpyinfo/xdpyinfo.xibuild index 3784477..3784477 100644 --- a/repo/x11/xdpyinfo.xibuild +++ b/repo/x11/xdpyinfo/xdpyinfo.xibuild diff --git a/repo/x11/xdriinfo.xibuild b/repo/x11/xdriinfo/xdriinfo.xibuild index f32f3c0..f32f3c0 100644 --- a/repo/x11/xdriinfo.xibuild +++ b/repo/x11/xdriinfo/xdriinfo.xibuild diff --git a/repo/x11/xev.xibuild b/repo/x11/xev/xev.xibuild index 5f8e8d9..5f8e8d9 100644 --- a/repo/x11/xev.xibuild +++ b/repo/x11/xev/xev.xibuild diff --git a/repo/x11/xeyes.xibuild b/repo/x11/xeyes/xeyes.xibuild index 39a175e..39a175e 100644 --- a/repo/x11/xeyes.xibuild +++ b/repo/x11/xeyes/xeyes.xibuild diff --git a/repo/x11/xf86-input-evdev.xibuild b/repo/x11/xf86-input-evdev/xf86-input-evdev.xibuild index de4aeed..de4aeed 100644 --- a/repo/x11/xf86-input-evdev.xibuild +++ b/repo/x11/xf86-input-evdev/xf86-input-evdev.xibuild diff --git a/repo/x11/xf86-input-libinput.xibuild b/repo/x11/xf86-input-libinput/xf86-input-libinput.xibuild index 9385bc0..9385bc0 100644 --- a/repo/x11/xf86-input-libinput.xibuild +++ b/repo/x11/xf86-input-libinput/xf86-input-libinput.xibuild diff --git a/repo/x11/xf86-input-synaptics.xibuild b/repo/x11/xf86-input-synaptics/xf86-input-synaptics.xibuild index 27ed0ec..27ed0ec 100644 --- a/repo/x11/xf86-input-synaptics.xibuild +++ b/repo/x11/xf86-input-synaptics/xf86-input-synaptics.xibuild diff --git a/repo/x11/xf86-input-wacom.xibuild b/repo/x11/xf86-input-wacom/xf86-input-wacom.xibuild index 77e3f55..77e3f55 100644 --- a/repo/x11/xf86-input-wacom.xibuild +++ b/repo/x11/xf86-input-wacom/xf86-input-wacom.xibuild diff --git a/repo/x11/xf86-video-amdgpu.xibuild b/repo/x11/xf86-video-amdgpu/xf86-video-amdgpu.xibuild index 89b8e80..89b8e80 100644 --- a/repo/x11/xf86-video-amdgpu.xibuild +++ b/repo/x11/xf86-video-amdgpu/xf86-video-amdgpu.xibuild diff --git a/repo/x11/xf86-video-ati.xibuild b/repo/x11/xf86-video-ati/xf86-video-ati.xibuild index 421bf3e..421bf3e 100644 --- a/repo/x11/xf86-video-ati.xibuild +++ b/repo/x11/xf86-video-ati/xf86-video-ati.xibuild diff --git a/repo/x11/xf86-video-fbdev.xibuild b/repo/x11/xf86-video-fbdev/xf86-video-fbdev.xibuild index 050aa76..050aa76 100644 --- a/repo/x11/xf86-video-fbdev.xibuild +++ b/repo/x11/xf86-video-fbdev/xf86-video-fbdev.xibuild diff --git a/repo/x11/xf86-video-intel.xibuild b/repo/x11/xf86-video-intel/xf86-video-intel.xibuild index ac5fce2..ac5fce2 100644 --- a/repo/x11/xf86-video-intel.xibuild +++ b/repo/x11/xf86-video-intel/xf86-video-intel.xibuild diff --git a/repo/x11/xf86-video-nouveau.xibuild b/repo/x11/xf86-video-nouveau/xf86-video-nouveau.xibuild index e2f593c..e2f593c 100644 --- a/repo/x11/xf86-video-nouveau.xibuild +++ b/repo/x11/xf86-video-nouveau/xf86-video-nouveau.xibuild diff --git a/repo/x11/xf86-video-nouveau/xorg-server-21.1.patch b/repo/x11/xf86-video-nouveau/xorg-server-21.1.patch new file mode 100644 index 0000000..03d0b80 --- /dev/null +++ b/repo/x11/xf86-video-nouveau/xorg-server-21.1.patch @@ -0,0 +1,50 @@ +diff --git a/src/compat-api.h b/src/compat-api.h +index fde2f4b1cfde75875c07bfe13524dc6ba2661382..8a1fcf9be1c5d1ceb48a50f2ed533d93ec7ff4c7 100644 +--- a/src/compat-api.h ++++ b/src/compat-api.h +@@ -102,4 +102,8 @@ + + #endif + ++#if ABI_VIDEODRV_VERSION < SET_ABI_VERSION(25, 2) ++#define secondary_dst slave_dst ++#endif ++ + #endif +diff --git a/src/nouveau_exa.c b/src/nouveau_exa.c +index 55df6f8f11c9e14b1891e5c841faef10c17f0a35..db3b112a2db70f8e902e54aa3af99e51e7d0c6f7 100644 +--- a/src/nouveau_exa.c ++++ b/src/nouveau_exa.c +@@ -157,7 +157,7 @@ nouveau_exa_destroy_pixmap(ScreenPtr pScreen, void *priv) + + #ifdef NOUVEAU_PIXMAP_SHARING + static Bool +-nouveau_exa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **handle_p) ++nouveau_exa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr secondary, void **handle_p) + { + struct nouveau_bo *bo = nouveau_pixmap_bo(ppix); + struct nouveau_pixmap *nvpix = nouveau_pixmap(ppix); +diff --git a/src/nv_driver.c b/src/nv_driver.c +index e72a6b65a81119f12f3608295a4547762a866ad7..f9ab4af19361d99d74f580d1ff3f28d49843e8b0 100644 +--- a/src/nv_driver.c ++++ b/src/nv_driver.c +@@ -559,16 +559,16 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) + { + RegionRec pixregion; + +- PixmapRegionInit(&pixregion, dirty->slave_dst); ++ PixmapRegionInit(&pixregion, dirty->secondary_dst); + +- DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); ++ DamageRegionAppend(&dirty->secondary_dst->drawable, &pixregion); + #ifdef HAS_DIRTYTRACKING_ROTATION + PixmapSyncDirtyHelper(dirty); + #else + PixmapSyncDirtyHelper(dirty, &pixregion); + #endif + +- DamageRegionProcessPending(&dirty->slave_dst->drawable); ++ DamageRegionProcessPending(&dirty->secondary_dst->drawable); + RegionUninit(&pixregion); + } + diff --git a/repo/x11/xf86-video-qxl/buildfix.patch b/repo/x11/xf86-video-qxl/buildfix.patch new file mode 100644 index 0000000..d1a8d7e --- /dev/null +++ b/repo/x11/xf86-video-qxl/buildfix.patch @@ -0,0 +1,101 @@ +From 4b083ede3c4a827a84295ff223e34ee3c2e581b2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zolt=C3=A1n=20B=C3=B6sz=C3=B6rm=C3=A9nyi?= + <zboszor@gmail.com> +Date: Sat, 28 Aug 2021 15:38:40 +0200 +Subject: [PATCH] Fix a build error with Xorg master +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use xf86ReturnOptValBool() in get_bool_option() instead of +options[option_index].value.bool to fix a compiler error with +current Xorg xserver master branch. + +Also use xf86GetOptValInteger() in get_int_option() and +xf86GetOptValString() in get_str_option() for consistency. + +The change causes a slight performance drop during option parsing +because the passed-in index_value is no longer used as an index +into the options array. + +Instead, it's used as a token now for the standard option getter +functions which works since the index_value to the get_*_option() +functions are identical to the value of options[n].token in the +passed-in OptionInfoRec array. + +Also rename "int option_index" to "int token" for clarity in all +three functions. + +Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> +--- + src/qxl_option_helpers.c | 13 +++++++------ + src/qxl_option_helpers.h | 6 +++--- + 2 files changed, 10 insertions(+), 9 deletions(-) + +diff --git a/src/qxl_option_helpers.c b/src/qxl_option_helpers.c +index 2aba677..7707b7c 100644 +--- a/src/qxl_option_helpers.c ++++ b/src/qxl_option_helpers.c +@@ -10,31 +10,32 @@ + + #include "qxl_option_helpers.h" + +-int get_int_option(OptionInfoPtr options, int option_index, ++int get_int_option(OptionInfoPtr options, int token, + const char *env_name) + { ++ int value; + if (env_name && getenv(env_name)) { + return atoi(getenv(env_name)); + } +- return options[option_index].value.num; ++ return xf86GetOptValInteger(options, token, &value) ? value : 0; + } + +-const char *get_str_option(OptionInfoPtr options, int option_index, ++const char *get_str_option(OptionInfoPtr options, int token, + const char *env_name) + { + if (getenv(env_name)) { + return getenv(env_name); + } +- return options[option_index].value.str; ++ return xf86GetOptValString(options, token); + } + +-int get_bool_option(OptionInfoPtr options, int option_index, ++int get_bool_option(OptionInfoPtr options, int token, + const char *env_name) + { + const char* value = getenv(env_name); + + if (!value) { +- return options[option_index].value.bool; ++ return xf86ReturnOptValBool(options, token, FALSE); + } + if (strcmp(value, "0") == 0 || + strcasecmp(value, "off") == 0 || +diff --git a/src/qxl_option_helpers.h b/src/qxl_option_helpers.h +index 7c54c72..66d0a17 100644 +--- a/src/qxl_option_helpers.h ++++ b/src/qxl_option_helpers.h +@@ -4,13 +4,13 @@ + #include <xf86Crtc.h> + #include <xf86Opt.h> + +-int get_int_option(OptionInfoPtr options, int option_index, ++int get_int_option(OptionInfoPtr options, int token, + const char *env_name); + +-const char *get_str_option(OptionInfoPtr options, int option_index, ++const char *get_str_option(OptionInfoPtr options, int token, + const char *env_name); + +-int get_bool_option(OptionInfoPtr options, int option_index, ++int get_bool_option(OptionInfoPtr options, int token, + const char *env_name); + + #endif // OPTION_HELPERS_H +-- +GitLab + diff --git a/repo/x11/xf86-video-qxl/convert-xspice-python3.patch b/repo/x11/xf86-video-qxl/convert-xspice-python3.patch new file mode 100644 index 0000000..145d3e3 --- /dev/null +++ b/repo/x11/xf86-video-qxl/convert-xspice-python3.patch @@ -0,0 +1,154 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau <cfergeau@redhat.com> +Date: Wed, 8 Feb 2017 15:23:56 +0100 +Subject: [PATCH] Xspice: Use print("") instead of print "" + +This allows Xspice to run when using python3 instead of python2 +--- + scripts/Xspice | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/scripts/Xspice b/scripts/Xspice +index ada99d1..30d10fa 100755 +--- a/scripts/Xspice ++++ b/scripts/Xspice +@@ -34,7 +34,7 @@ def which(x): + candidate = os.path.join(p, x) + if os.path.exists(candidate): + return candidate +- print 'Warning: failed to find executable %s' % x ++ print('Warning: failed to find executable %s' % x) + return None + + if 'XSPICE_ENABLE_GDB' in os.environ: +@@ -128,10 +128,10 @@ args, xorg_args = parser.parse_known_args(sys.argv[1:]) + def agents_new_enough(args): + for f in [args.vdagent_exec, args.vdagentd_exec]: + if not f: +- print 'please specify path to vdagent/vdagentd executables' ++ print('please specify path to vdagent/vdagentd executables') + return False + if not os.path.exists(f): +- print 'error: file not found ', f ++ print('error: file not found ', f) + return False + + for f in [args.vdagent_exec, args.vdagentd_exec]: +@@ -169,11 +169,11 @@ def tls_files(args): + # and it isn't supplied spice will still abort, and Xorg with it. + for key, filename in tls_files(args).items(): + if not os.path.exists(filename): +- print "missing %s - %s does not exist" % (key, filename) ++ print("missing %s - %s does not exist" % (key, filename)) + sys.exit(1) + + def error(msg, exit_code=1): +- print "Xspice: %s" % msg ++ print("Xspice: %s" % msg) + sys.exit(exit_code) + + if not args.xorg: +@@ -319,7 +319,7 @@ for arg in xorg_args: + if arg.startswith(":"): + display = arg + if not display: +- print "Error: missing display on line (i.e. :3)" ++ print("Error: missing display on line (i.e. :3)") + raise SystemExit + os.environ ['DISPLAY'] = display + +@@ -343,7 +343,7 @@ time.sleep(2) + + retpid,rc = os.waitpid(xorg.pid, os.WNOHANG) + if retpid != 0: +- print "Error: X server is not running" ++ print("Error: X server is not running") + else: + if args.vdagent_enabled and args.vdagent_launch: + # XXX use systemd --user for this? +@@ -361,4 +361,4 @@ else: + xorg.wait() + except KeyboardInterrupt: + # Catch Ctrl-C as that is the common way of ending this script +- print "Keyboard Interrupt" ++ print("Keyboard Interrupt") + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau <cfergeau@redhat.com> +Date: Wed, 8 Feb 2017 17:07:39 +0100 +Subject: [PATCH] Xspice: Remove extra space before assignment + +--- + scripts/Xspice | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/scripts/Xspice b/scripts/Xspice +index 30d10fa..41fd80c 100755 +--- a/scripts/Xspice ++++ b/scripts/Xspice +@@ -211,7 +211,7 @@ signal.signal(signal.SIGTERM, cleanup) + atexit.register(cleanup) + + if args.auto: +- temp_dir = tempfile.mkdtemp(prefix="Xspice-") ++ temp_dir = tempfile.mkdtemp(prefix="Xspice-") + cleanup_dirs.append(temp_dir) + + args.config = temp_dir + "/xorg.conf" +@@ -275,7 +275,7 @@ if args.vdagent_enabled: + os.unlink(f) + + if not temp_dir: +- temp_dir = tempfile.mkdtemp(prefix="Xspice-") ++ temp_dir = tempfile.mkdtemp(prefix="Xspice-") + cleanup_dirs.append(temp_dir) + + # Auto generate temporary files for vdagent + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau <cfergeau@redhat.com> +Date: Wed, 8 Feb 2017 17:07:56 +0100 +Subject: [PATCH] Xspice: Fix Python3 str() vs bytes() confusion + +With python3, without universal_newlines=True, Popen().stdout.read() +will return a byte array, while find(str) expects to operate on a +string. +I've checked that this still works with python2 as well. +--- + scripts/Xspice | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/Xspice b/scripts/Xspice +index 41fd80c..927dcb1 100755 +--- a/scripts/Xspice ++++ b/scripts/Xspice +@@ -135,7 +135,7 @@ def agents_new_enough(args): + return False + + for f in [args.vdagent_exec, args.vdagentd_exec]: +- if Popen(args=[f, '-h'], stdout=PIPE).stdout.read().find('-S') == -1: ++ if Popen(args=[f, '-h'], stdout=PIPE, universal_newlines=True).stdout.read().find('-S') == -1: + return False + return True + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau <cfergeau@redhat.com> +Date: Thu, 17 May 2018 15:31:05 +0200 +Subject: [PATCH] Xspice: Adjust shebang to explicitly mention python3 + +--- + scripts/Xspice | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/Xspice b/scripts/Xspice +index 927dcb1..78d0794 100755 +--- a/scripts/Xspice ++++ b/scripts/Xspice +@@ -1,4 +1,4 @@ +-#!/usr/bin/python ++#!/usr/bin/python3 + + """ + Xspice + + diff --git a/repo/x11/xf86-video-qxl.xibuild b/repo/x11/xf86-video-qxl/xf86-video-qxl.xibuild index f7fd090..f7fd090 100644 --- a/repo/x11/xf86-video-qxl.xibuild +++ b/repo/x11/xf86-video-qxl/xf86-video-qxl.xibuild diff --git a/repo/x11/xf86-video-vmware.xibuild b/repo/x11/xf86-video-vmware/xf86-video-vmware.xibuild index 569ab92..569ab92 100644 --- a/repo/x11/xf86-video-vmware.xibuild +++ b/repo/x11/xf86-video-vmware/xf86-video-vmware.xibuild diff --git a/repo/x11/xgamma.xibuild b/repo/x11/xgamma/xgamma.xibuild index 0f987b1..0f987b1 100644 --- a/repo/x11/xgamma.xibuild +++ b/repo/x11/xgamma/xgamma.xibuild diff --git a/repo/x11/xhost.xibuild b/repo/x11/xhost/xhost.xibuild index 5d1509d..5d1509d 100644 --- a/repo/x11/xhost.xibuild +++ b/repo/x11/xhost/xhost.xibuild diff --git a/repo/x11/xinput.xibuild b/repo/x11/xinput/xinput.xibuild index d52f202..d52f202 100644 --- a/repo/x11/xinput.xibuild +++ b/repo/x11/xinput/xinput.xibuild diff --git a/repo/x11/xkbcomp.xibuild b/repo/x11/xkbcomp/xkbcomp.xibuild index 35debf3..35debf3 100644 --- a/repo/x11/xkbcomp.xibuild +++ b/repo/x11/xkbcomp/xkbcomp.xibuild diff --git a/repo/x11/xkbevd.xibuild b/repo/x11/xkbevd/xkbevd.xibuild index 62452f5..62452f5 100644 --- a/repo/x11/xkbevd.xibuild +++ b/repo/x11/xkbevd/xkbevd.xibuild diff --git a/repo/x11/xkbutils.xibuild b/repo/x11/xkbutils/xkbutils.xibuild index 637bcf8..637bcf8 100644 --- a/repo/x11/xkbutils.xibuild +++ b/repo/x11/xkbutils/xkbutils.xibuild diff --git a/repo/x11/xkeyboardconfig.xibuild b/repo/x11/xkeyboardconfig/xkeyboardconfig.xibuild index 74f48e7..74f48e7 100644 --- a/repo/x11/xkeyboardconfig.xibuild +++ b/repo/x11/xkeyboardconfig/xkeyboardconfig.xibuild diff --git a/repo/x11/xkill.xibuild b/repo/x11/xkill/xkill.xibuild index 591ccb6..591ccb6 100644 --- a/repo/x11/xkill.xibuild +++ b/repo/x11/xkill/xkill.xibuild diff --git a/repo/x11/xlsatoms.xibuild b/repo/x11/xlsatoms/xlsatoms.xibuild index e9e20c2..e9e20c2 100644 --- a/repo/x11/xlsatoms.xibuild +++ b/repo/x11/xlsatoms/xlsatoms.xibuild diff --git a/repo/x11/xlsclients.xibuild b/repo/x11/xlsclients/xlsclients.xibuild index 9400313..9400313 100644 --- a/repo/x11/xlsclients.xibuild +++ b/repo/x11/xlsclients/xlsclients.xibuild diff --git a/repo/x11/xmessage.xibuild b/repo/x11/xmessage/xmessage.xibuild index 4cb6ab4..4cb6ab4 100644 --- a/repo/x11/xmessage.xibuild +++ b/repo/x11/xmessage/xmessage.xibuild diff --git a/repo/x11/xmodmap.xibuild b/repo/x11/xmodmap/xmodmap.xibuild index b940a85..b940a85 100644 --- a/repo/x11/xmodmap.xibuild +++ b/repo/x11/xmodmap/xmodmap.xibuild diff --git a/repo/x11/xorg-libs.xibuild b/repo/x11/xorg-libs/xorg-libs.xibuild index c97f3d9..c97f3d9 100644 --- a/repo/x11/xorg-libs.xibuild +++ b/repo/x11/xorg-libs/xorg-libs.xibuild diff --git a/repo/x11/xorg-server.xibuild b/repo/x11/xorg-server/xorg-server.xibuild index 11553aa..11553aa 100644 --- a/repo/x11/xorg-server.xibuild +++ b/repo/x11/xorg-server/xorg-server.xibuild diff --git a/repo/x11/xorg-util-macros.xibuild b/repo/x11/xorg-util-macros/xorg-util-macros.xibuild index b945b41..b945b41 100644 --- a/repo/x11/xorg-util-macros.xibuild +++ b/repo/x11/xorg-util-macros/xorg-util-macros.xibuild diff --git a/repo/x11/xorg-xinit.xibuild b/repo/x11/xorg-xinit/xorg-xinit.xibuild index ccd76a8..ccd76a8 100644 --- a/repo/x11/xorg-xinit.xibuild +++ b/repo/x11/xorg-xinit/xorg-xinit.xibuild diff --git a/repo/x11/xorgproto.xibuild b/repo/x11/xorgproto/xorgproto.xibuild index f49cf52..f49cf52 100644 --- a/repo/x11/xorgproto.xibuild +++ b/repo/x11/xorgproto/xorgproto.xibuild diff --git a/repo/x11/xpr.xibuild b/repo/x11/xpr/xpr.xibuild index 70d557e..70d557e 100644 --- a/repo/x11/xpr.xibuild +++ b/repo/x11/xpr/xpr.xibuild diff --git a/repo/x11/xprop.xibuild b/repo/x11/xprop/xprop.xibuild index d3133ac..d3133ac 100644 --- a/repo/x11/xprop.xibuild +++ b/repo/x11/xprop/xprop.xibuild diff --git a/repo/x11/xrandr.xibuild b/repo/x11/xrandr/xrandr.xibuild index 49f8a8d..49f8a8d 100644 --- a/repo/x11/xrandr.xibuild +++ b/repo/x11/xrandr/xrandr.xibuild diff --git a/repo/x11/xrdb.xibuild b/repo/x11/xrdb/xrdb.xibuild index b8a55ef..b8a55ef 100644 --- a/repo/x11/xrdb.xibuild +++ b/repo/x11/xrdb/xrdb.xibuild diff --git a/repo/x11/xrefresh.xibuild b/repo/x11/xrefresh/xrefresh.xibuild index cb6c224..cb6c224 100644 --- a/repo/x11/xrefresh.xibuild +++ b/repo/x11/xrefresh/xrefresh.xibuild diff --git a/repo/x11/xsel.xibuild b/repo/x11/xsel/xsel.xibuild index ee59b5b..ee59b5b 100644 --- a/repo/x11/xsel.xibuild +++ b/repo/x11/xsel/xsel.xibuild diff --git a/repo/x11/xset.xibuild b/repo/x11/xset/xset.xibuild index 403fcc9..403fcc9 100644 --- a/repo/x11/xset.xibuild +++ b/repo/x11/xset/xset.xibuild diff --git a/repo/x11/xsetroot.xibuild b/repo/x11/xsetroot/xsetroot.xibuild index 3fda50e..3fda50e 100644 --- a/repo/x11/xsetroot.xibuild +++ b/repo/x11/xsetroot/xsetroot.xibuild diff --git a/repo/x11/xtrans.xibuild b/repo/x11/xtrans/xtrans.xibuild index 52a0c9f..52a0c9f 100644 --- a/repo/x11/xtrans.xibuild +++ b/repo/x11/xtrans/xtrans.xibuild diff --git a/repo/x11/xvinfo.xibuild b/repo/x11/xvinfo/xvinfo.xibuild index 91269f9..91269f9 100644 --- a/repo/x11/xvinfo.xibuild +++ b/repo/x11/xvinfo/xvinfo.xibuild diff --git a/repo/x11/xwd.xibuild b/repo/x11/xwd/xwd.xibuild index 8b28ccf..8b28ccf 100644 --- a/repo/x11/xwd.xibuild +++ b/repo/x11/xwd/xwd.xibuild diff --git a/repo/x11/xwininfo.xibuild b/repo/x11/xwininfo/xwininfo.xibuild index 496ea6b..496ea6b 100644 --- a/repo/x11/xwininfo.xibuild +++ b/repo/x11/xwininfo/xwininfo.xibuild diff --git a/repo/x11/xwud.xibuild b/repo/x11/xwud/xwud.xibuild index f02ede7..f02ede7 100644 --- a/repo/x11/xwud.xibuild +++ b/repo/x11/xwud/xwud.xibuild diff --git a/repo/xi/mkinitramfs.xibuild b/repo/xi/mkinitramfs/mkinitramfs.xibuild index 79da979..79da979 100644 --- a/repo/xi/mkinitramfs.xibuild +++ b/repo/xi/mkinitramfs/mkinitramfs.xibuild diff --git a/repo/xi/sysconfigs.xibuild b/repo/xi/sysconfigs/sysconfigs.xibuild index 1dadea9..1dadea9 100644 --- a/repo/xi/sysconfigs.xibuild +++ b/repo/xi/sysconfigs/sysconfigs.xibuild diff --git a/repo/xi/xib.xibuild b/repo/xi/xib/xib.xibuild index 52ebdb9..52ebdb9 100644 --- a/repo/xi/xib.xibuild +++ b/repo/xi/xib/xib.xibuild diff --git a/repo/xi/xichroot.xibuild b/repo/xi/xichroot/xichroot.xibuild index 680262b..680262b 100644 --- a/repo/xi/xichroot.xibuild +++ b/repo/xi/xichroot/xichroot.xibuild diff --git a/repo/xi/xipkg.xibuild b/repo/xi/xipkg/xipkg.xibuild index be1e45f..be1e45f 100644 --- a/repo/xi/xipkg.xibuild +++ b/repo/xi/xipkg/xipkg.xibuild diff --git a/repo/xi/xiutils.xibuild b/repo/xi/xiutils/xiutils.xibuild index 3d69986..3d69986 100644 --- a/repo/xi/xiutils.xibuild +++ b/repo/xi/xiutils/xiutils.xibuild |