aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ANONYMITY_NETWORKS.md46
-rw-r--r--README.md12
-rw-r--r--contrib/depends/Makefile10
-rw-r--r--contrib/depends/builders/default.mk2
-rw-r--r--contrib/depends/funcs.mk9
-rw-r--r--contrib/depends/hosts/android.mk22
-rw-r--r--contrib/depends/hosts/darwin.mk1
-rw-r--r--contrib/depends/hosts/default.mk2
-rw-r--r--contrib/depends/hosts/freebsd.mk18
-rw-r--r--contrib/depends/hosts/linux.mk1
-rw-r--r--contrib/depends/hosts/mingw32.mk1
-rw-r--r--contrib/depends/packages/android_ndk.mk22
-rw-r--r--contrib/depends/packages/boost.mk7
-rw-r--r--contrib/depends/packages/eudev.mk2
-rw-r--r--contrib/depends/packages/freebsd_base.mk23
-rw-r--r--contrib/depends/packages/hidapi.mk2
-rw-r--r--contrib/depends/packages/libiconv.mk3
-rw-r--r--contrib/depends/packages/libusb.mk4
-rw-r--r--contrib/depends/packages/native_cctools.mk4
-rw-r--r--contrib/depends/packages/ncurses.mk12
-rw-r--r--contrib/depends/packages/openssl.mk11
-rw-r--r--contrib/depends/packages/packages.mk28
-rw-r--r--contrib/depends/packages/protobuf.mk2
-rw-r--r--contrib/depends/packages/readline.mk2
-rw-r--r--contrib/depends/packages/sodium-darwin.mk30
-rw-r--r--contrib/depends/packages/sodium.mk4
-rw-r--r--contrib/depends/packages/unwind.mk7
-rw-r--r--contrib/depends/packages/zeromq.mk6
-rw-r--r--contrib/depends/patches/boost/fix_aroptions.patch28
-rw-r--r--contrib/depends/patches/native_cctools/skip_otool.patch12
-rw-r--r--contrib/depends/patches/ncurses/fallback.c6621
-rw-r--r--contrib/depends/patches/openssl/fix_arflags.patch24
-rw-r--r--contrib/depends/patches/unwind/fix_obj_order.patch11
-rw-r--r--contrib/depends/patches/zeromq/ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch38
-rw-r--r--contrib/depends/toolchain.cmake.in41
-rw-r--r--contrib/epee/include/math_helper.h20
-rw-r--r--contrib/epee/include/net/abstract_tcp_server2.inl8
-rw-r--r--contrib/epee/include/span.h3
-rw-r--r--contrib/gitian/README.md31
-rw-r--r--contrib/gitian/gitian-android.yml136
-rwxr-xr-xcontrib/gitian/gitian-build.py108
-rw-r--r--contrib/gitian/gitian-freebsd.yml133
-rw-r--r--contrib/gitian/gitian-linux.yml58
-rw-r--r--contrib/gitian/gitian-osx.yml12
-rw-r--r--contrib/gitian/gitian-win.yml50
-rw-r--r--external/easylogging++/easylogging++.cc2
m---------external/randomx0
-rw-r--r--src/blockchain_db/blockchain_db.cpp84
-rw-r--r--src/blockchain_db/blockchain_db.h49
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp48
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.h10
-rw-r--r--src/blockchain_db/testdb.h10
-rw-r--r--src/blockchain_utilities/blockchain_import.cpp2
-rw-r--r--src/blocks/checkpoints.datbin234948 -> 244676 bytes
-rw-r--r--src/checkpoints/checkpoints.cpp1
-rw-r--r--src/cryptonote_basic/miner.cpp10
-rw-r--r--src/cryptonote_basic/miner.h8
-rw-r--r--src/cryptonote_core/blockchain.cpp33
-rw-r--r--src/cryptonote_core/blockchain.h9
-rw-r--r--src/cryptonote_core/cryptonote_core.cpp124
-rw-r--r--src/cryptonote_core/cryptonote_core.h73
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.cpp4
-rw-r--r--src/cryptonote_core/i_core_events.h44
-rw-r--r--src/cryptonote_core/tx_pool.cpp213
-rw-r--r--src/cryptonote_core/tx_pool.h53
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler.h3
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler.inl34
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler_common.h4
-rw-r--r--src/cryptonote_protocol/enums.h43
-rw-r--r--src/cryptonote_protocol/fwd.h37
-rw-r--r--src/cryptonote_protocol/levin_notify.h6
-rw-r--r--src/daemon/command_parser_executor.cpp4
-rw-r--r--src/daemon/rpc_command_executor.cpp36
-rw-r--r--src/daemon/rpc_command_executor.h2
-rw-r--r--src/daemonizer/posix_fork.cpp7
-rw-r--r--src/p2p/net_node.h3
-rw-r--r--src/p2p/net_node.inl11
-rw-r--r--src/p2p/net_node_common.h6
-rw-r--r--src/ringct/bulletproofs.cc61
-rw-r--r--src/ringct/rctTypes.cpp38
-rw-r--r--src/rpc/CMakeLists.txt2
-rw-r--r--src/rpc/core_rpc_server.cpp28
-rw-r--r--src/rpc/daemon_handler.cpp6
-rw-r--r--src/rpc/rpc_version_str.cpp55
-rw-r--r--src/rpc/rpc_version_str.h43
-rw-r--r--src/simplewallet/simplewallet.cpp71
-rw-r--r--src/simplewallet/simplewallet.h8
-rw-r--r--src/version.cpp.in4
-rw-r--r--src/wallet/node_rpc_proxy.cpp12
-rw-r--r--src/wallet/node_rpc_proxy.h1
-rw-r--r--src/wallet/wallet2.cpp67
-rw-r--r--src/wallet/wallet2.h7
-rw-r--r--src/wallet/wallet_rpc_server.cpp10
-rw-r--r--tests/core_proxy/core_proxy.cpp8
-rw-r--r--tests/core_proxy/core_proxy.h11
-rw-r--r--tests/core_tests/CMakeLists.txt2
-rw-r--r--tests/core_tests/chaingen.cpp8
-rw-r--r--tests/core_tests/chaingen.h44
-rw-r--r--tests/core_tests/chaingen_main.cpp7
-rw-r--r--tests/core_tests/double_spend.cpp3
-rw-r--r--tests/core_tests/double_spend.inl10
-rw-r--r--tests/core_tests/tx_pool.cpp561
-rw-r--r--tests/core_tests/tx_pool.h118
-rwxr-xr-xtests/functional_tests/mining.py12
-rw-r--r--tests/unit_tests/CMakeLists.txt3
-rw-r--r--tests/unit_tests/node_server.cpp34
-rw-r--r--tests/unit_tests/rpc_version_str.cpp49
107 files changed, 9196 insertions, 687 deletions
diff --git a/ANONYMITY_NETWORKS.md b/ANONYMITY_NETWORKS.md
index cb0e378c3..3337b5fc3 100644
--- a/ANONYMITY_NETWORKS.md
+++ b/ANONYMITY_NETWORKS.md
@@ -46,8 +46,10 @@ Connecting to an anonymous address requires the command line option
`--tx-proxy` which tells `monerod` the ip/port of a socks proxy provided by a
separate process. On most systems the configuration will look like:
-> `--tx-proxy tor,127.0.0.1:9050,10`
-> `--tx-proxy i2p,127.0.0.1:9000`
+```
+--tx-proxy tor,127.0.0.1:9050,10
+--tx-proxy i2p,127.0.0.1:9000
+```
which tells `monerod` that ".onion" p2p addresses can be forwarded to a socks
proxy at IP 127.0.0.1 port 9050 with a max of 10 outgoing connections and
@@ -55,12 +57,14 @@ proxy at IP 127.0.0.1 port 9050 with a max of 10 outgoing connections and
9000 with the default max outgoing connections. Since there are no seed nodes
for anonymity connections, peers must be manually specified:
-> `--add-exclusive-node rveahdfho7wo4b2m.onion:28083`
-> `--add-peer rveahdfho7wo4b2m.onion:28083`
+```
+--add-exclusive-node rveahdfho7wo4b2m.onion:28083
+--add-peer rveahdfho7wo4b2m.onion:28083
+```
Either option can be listed multiple times, and can specify any mix of Tor,
I2P, and IPv4 addresses. Using `--add-exclusive-node` will prevent the usage of
-seed nodes on ALL networks, which will typically be undesireable.
+seed nodes on ALL networks, which will typically be undesirable.
### Inbound Connections
@@ -68,8 +72,10 @@ Receiving anonymity connections is done through the option
`--anonymous-inbound`. This option tells `monerod` the inbound address, network
type, and max connections:
-> `--anonymous-inbound rveahdfho7wo4b2m.onion:28083,127.0.0.1:28083,25`
-> `--anonymous-inbound cmeua5767mz2q5jsaelk2rxhf67agrwuetaso5dzbenyzwlbkg2q.b32.i2p:5000,127.0.0.1:30000`
+```
+--anonymous-inbound rveahdfho7wo4b2m.onion:28083,127.0.0.1:28083,25
+--anonymous-inbound cmeua5767mz2q5jsaelk2rxhf67agrwuetaso5dzbenyzwlbkg2q.b32.i2p:5000,127.0.0.1:30000
+```
which tells `monerod` that a max of 25 inbound Tor connections are being
received at address "rveahdfho7wo4b2m.onion:28083" and forwarded to `monerod`
@@ -87,12 +93,16 @@ P2P anonymity connections. The anonymity network (Tor/i2p) is
[configured in the same manner](#configuration), except the localhost port
must be the RPC port (typically 18081 for mainnet) instead of the p2p port:
-> HiddenServiceDir /var/lib/tor/data/monero
-> HiddenServicePort 18081 127.0.0.1:18081
+```
+HiddenServiceDir /var/lib/tor/data/monero
+HiddenServicePort 18081 127.0.0.1:18081
+```
Then the wallet will be configured to use a Tor/i2p address:
-> `--proxy 127.0.0.1:9050`
-> `--daemon-address rveahdfho7wo4b2m.onion`
+```
+--proxy 127.0.0.1:9050
+--daemon-address rveahdfho7wo4b2m.onion
+```
The proxy must match the address type - a Tor proxy will not work properly with
i2p addresses, etc.
@@ -125,8 +135,10 @@ can distribute the address to its other peers.
Tor must be configured for hidden services. An example configuration ("torrc")
might look like:
-> HiddenServiceDir /var/lib/tor/data/monero
-> HiddenServicePort 28083 127.0.0.1:28083
+```
+HiddenServiceDir /var/lib/tor/data/monero
+HiddenServicePort 28083 127.0.0.1:28083
+```
This will store key information in `/var/lib/tor/data/monero` and will forward
"Tor port" 28083 to port 28083 of ip 127.0.0.1. The file
@@ -170,7 +182,7 @@ be used by an ISP to link a user to a transaction.
Run `monerod` as often as possible to conceal when transactions are being sent.
Future versions will also have peers that first receive a transaction over an
anonymity network delay the broadcast to public peers by a randomized amount.
-This will not completetely mitigate a user who syncs up sends then quits, in
+This will not completely mitigate a user who syncs up sends then quits, in
part because this rule is not enforceable, so this mitigation strategy is
simply a best effort attempt.
@@ -183,9 +195,9 @@ the connections are not circuit based.
#### Mitigation
-The best mitigiation is to use I2P instead of Tor. However, I2P
+The best mitigation is to use I2P instead of Tor. However, I2P
has a smaller set of users (less cover traffic) and academic reviews, so there
-is a tradeoff in potential isses. Also, anyone attempting this strategy really
+is a trade off in potential issues. Also, anyone attempting this strategy really
wants to uncover a user, it seems unlikely that this would be performed against
every Tor/I2P user.
@@ -213,7 +225,7 @@ key identity.
@secparam (twitter) recommended changing circuits (Tor) as an additional
precaution. This is likely not a good idea - forcibly requesting Tor to change
circuits is observable by the ISP. Instead, `monerod` should likely disconnect
-from peers ocassionally. Tor will rotate circuits every ~10 minutes, so
+from peers occasionally. Tor will rotate circuits every ~10 minutes, so
establishing new connections will use a new public key identity and make it
more difficult for the hidden service to link information. This process will
have to be done carefully because closing/reconnecting connections can also
diff --git a/README.md b/README.md
index e465d1ccc..7b6b252e0 100644
--- a/README.md
+++ b/README.md
@@ -153,9 +153,11 @@ Dates are provided in the format YYYY-MM-DD.
| 1686275 | 2018-10-19 | v9 | v0.13.0.0 | v0.13.0.4 | bulletproofs required
| 1788000 | 2019-03-09 | v10 | v0.14.0.0 | v0.14.1.2 | New PoW based on Cryptonight-R, new block weight algorithm, slightly more efficient RingCT format
| 1788720 | 2019-03-10 | v11 | v0.14.0.0 | v0.14.1.2 | forbid old RingCT transaction format
-| XXXXXXX | 2019-10-XX | XX | XXXXXXXXX | XXXXXXXXX | X
+| 1978433 | 2019-11-30* | v12 | v0.15.0.0 | v0.15.0.0 | New PoW based on RandomX, only allow >= 2 outputs, change to the block median used to calculate penalty, v1 coinbases are forbidden, rct sigs in coinbase forbidden, 10 block lock time for incoming transactions
+| XXXXXXX | XXX-XX-XX | XXX | vX.XX.X.X | vX.XX.X.X | XXX |
X's indicate that these details have not been determined as of commit date.
+* indicates estimate as of commit date
## Release staging schedule and protocol
@@ -237,7 +239,7 @@ invokes cmake commands as needed.
```bash
cd monero
- git checkout release-v0.14
+ git checkout release-v0.15
make
```
@@ -313,7 +315,7 @@ Tested on a Raspberry Pi Zero with a clean install of minimal Raspbian Stretch (
```bash
git clone https://github.com/monero-project/monero.git
cd monero
- git checkout tags/v0.14.1.2
+ git checkout tags/v0.15.0.0
```
* Build:
@@ -430,10 +432,10 @@ application.
cd monero
```
-* If you would like a specific [version/tag](https://github.com/monero-project/monero/tags), do a git checkout for that version. eg. 'v0.14.1.2'. If you don't care about the version and just want binaries from master, skip this step:
+* If you would like a specific [version/tag](https://github.com/monero-project/monero/tags), do a git checkout for that version. eg. 'v0.15.0.0'. If you don't care about the version and just want binaries from master, skip this step:
```bash
- git checkout v0.14.1.2
+ git checkout v0.15.0.0
```
* If you are on a 64-bit system, run:
diff --git a/contrib/depends/Makefile b/contrib/depends/Makefile
index ec0e4cfae..28ec972e4 100644
--- a/contrib/depends/Makefile
+++ b/contrib/depends/Makefile
@@ -53,8 +53,12 @@ endif
host_arch=$(firstword $(subst -, ,$(canonical_host)))
host_vendor=$(word 2,$(subst -, ,$(canonical_host)))
full_host_os:=$(subst $(host_arch)-$(host_vendor)-,,$(canonical_host))
+host_os:=$(findstring android,$(full_host_os))
+ifeq ($(host_os),)
host_os:=$(findstring linux,$(full_host_os))
+endif
host_os+=$(findstring darwin,$(full_host_os))
+host_os+=$(findstring freebsd,$(full_host_os))
host_os+=$(findstring mingw32,$(full_host_os))
host_os:=$(strip $(host_os))
ifeq ($(host_os),)
@@ -71,9 +75,15 @@ endif
ifeq ($(host_os),linux)
host_cmake=Linux
endif
+ifeq ($(host_os),freebsd)
+host_cmake=FreeBSD
+endif
ifeq ($(host_os),darwin)
host_cmake=Darwin
endif
+ifeq ($(host_os),android)
+host_cmake=Android
+endif
AT_$(V):=
AT_:=@
diff --git a/contrib/depends/builders/default.mk b/contrib/depends/builders/default.mk
index f097db65d..c4191435d 100644
--- a/contrib/depends/builders/default.mk
+++ b/contrib/depends/builders/default.mk
@@ -17,4 +17,4 @@ define add_build_flags_func
build_$(build_arch)_$(build_os)_$1 += $(build_$(build_os)_$1)
build_$1=$$(build_$(build_arch)_$(build_os)_$1)
endef
-$(foreach flags, CFLAGS CXXFLAGS LDFLAGS, $(eval $(call add_build_flags_func,$(flags))))
+$(foreach flags, CFLAGS CXXFLAGS ARFLAGS LDFLAGS, $(eval $(call add_build_flags_func,$(flags))))
diff --git a/contrib/depends/funcs.mk b/contrib/depends/funcs.mk
index 469144361..355ae07eb 100644
--- a/contrib/depends/funcs.mk
+++ b/contrib/depends/funcs.mk
@@ -10,6 +10,7 @@ $(1)_libtool=$($($(1)_type)_LIBTOOL)
$(1)_nm=$($($(1)_type)_NM)
$(1)_cflags=$($($(1)_type)_CFLAGS) $($($(1)_type)_$(release_type)_CFLAGS)
$(1)_cxxflags=$($($(1)_type)_CXXFLAGS) $($($(1)_type)_$(release_type)_CXXFLAGS)
+$(1)_arflags=$($($(1)_type)_ARFLAGS) $($($(1)_type)_$(release_type)_ARFLAGS)
$(1)_ldflags=$($($(1)_type)_LDFLAGS) $($($(1)_type)_$(release_type)_LDFLAGS) -L$($($(1)_type)_prefix)/lib
$(1)_cppflags=$($($(1)_type)_CPPFLAGS) $($($(1)_type)_$(release_type)_CPPFLAGS) -I$($($(1)_type)_prefix)/include
$(1)_recipe_hash:=
@@ -102,6 +103,11 @@ $(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(rele
$(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type))
$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type))
+$(1)_arflags+=$($(1)_arflags_$(release_type))
+$(1)_arflags+=$($(1)_arflags_$(host_arch)) $($(1)_arflags_$(host_arch)_$(release_type))
+$(1)_arflags+=$($(1)_arflags_$(host_os)) $($(1)_arflags_$(host_os)_$(release_type))
+$(1)_arflags+=$($(1)_arflags_$(host_arch)_$(host_os)) $($(1)_arflags_$(host_arch)_$(host_os)_$(release_type))
+
$(1)_cppflags+=$($(1)_cppflags_$(release_type))
$(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type))
$(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type))
@@ -143,6 +149,9 @@ endif
ifneq ($($(1)_ar),)
$(1)_autoconf += AR="$$($(1)_ar)"
endif
+ifneq ($($(1)_arflags),)
+$(1)_autoconf += ARFLAGS="$$($(1)_arflags)"
+endif
ifneq ($($(1)_cflags),)
$(1)_autoconf += CFLAGS="$$($(1)_cflags)"
endif
diff --git a/contrib/depends/hosts/android.mk b/contrib/depends/hosts/android.mk
new file mode 100644
index 000000000..d6f8b99dd
--- /dev/null
+++ b/contrib/depends/hosts/android.mk
@@ -0,0 +1,22 @@
+ANDROID_API=21
+
+ifeq ($(host_arch),arm)
+host_toolchain=arm-linux-androideabi-
+endif
+
+android_CC=$(host_toolchain)clang
+android_CXX=$(host_toolchain)clang++
+android_RANLIB=:
+
+android_CFLAGS=-pipe
+android_CXXFLAGS=$(android_CFLAGS)
+android_ARFLAGS=crsD
+
+android_release_CFLAGS=-O2
+android_release_CXXFLAGS=$(android_release_CFLAGS)
+
+android_debug_CFLAGS=-g -O0
+android_debug_CXXFLAGS=$(android_debug_CFLAGS)
+
+android_native_toolchain=android_ndk
+
diff --git a/contrib/depends/hosts/darwin.mk b/contrib/depends/hosts/darwin.mk
index 6f8f2ffe2..7b5c8b051 100644
--- a/contrib/depends/hosts/darwin.mk
+++ b/contrib/depends/hosts/darwin.mk
@@ -7,6 +7,7 @@ darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sys
darwin_CFLAGS=-pipe
darwin_CXXFLAGS=$(darwin_CFLAGS)
+darwin_ARFLAGS=cr
darwin_release_CFLAGS=-O1
darwin_release_CXXFLAGS=$(darwin_release_CFLAGS)
diff --git a/contrib/depends/hosts/default.mk b/contrib/depends/hosts/default.mk
index 6f60d6b3f..2e7f9fa23 100644
--- a/contrib/depends/hosts/default.mk
+++ b/contrib/depends/hosts/default.mk
@@ -23,4 +23,4 @@ host_$(release_type)_$1 = $$($(host_arch)_$(host_os)_$(release_type)_$1)
endef
$(foreach tool,CC CXX AR RANLIB STRIP NM LIBTOOL OTOOL INSTALL_NAME_TOOL,$(eval $(call add_host_tool_func,$(tool))))
-$(foreach flags,CFLAGS CXXFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags))))
+$(foreach flags,CFLAGS CXXFLAGS ARFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags))))
diff --git a/contrib/depends/hosts/freebsd.mk b/contrib/depends/hosts/freebsd.mk
new file mode 100644
index 000000000..2e3b5933e
--- /dev/null
+++ b/contrib/depends/hosts/freebsd.mk
@@ -0,0 +1,18 @@
+freebsd_CC=clang-8
+freebsd_CXX=clang++-8
+freebsd_AR=ar
+freebsd_RANLIB=ranlib
+freebsd_NM=nm
+
+freebsd_CFLAGS=-pipe
+freebsd_CXXFLAGS=$(freebsd_CFLAGS)
+freebsd_ARFLAGS=cr
+
+freebsd_release_CFLAGS=-O2
+freebsd_release_CXXFLAGS=$(freebsd_release_CFLAGS)
+
+freebsd_debug_CFLAGS=-g -O0
+freebsd_debug_CXXFLAGS=$(freebsd_debug_CFLAGS)
+
+freebsd_native_toolchain=freebsd_base
+
diff --git a/contrib/depends/hosts/linux.mk b/contrib/depends/hosts/linux.mk
index b13a0f1ad..912fdb03c 100644
--- a/contrib/depends/hosts/linux.mk
+++ b/contrib/depends/hosts/linux.mk
@@ -1,5 +1,6 @@
linux_CFLAGS=-pipe
linux_CXXFLAGS=$(linux_CFLAGS)
+linux_ARFLAGS=cr
linux_release_CFLAGS=-O2
linux_release_CXXFLAGS=$(linux_release_CFLAGS)
diff --git a/contrib/depends/hosts/mingw32.mk b/contrib/depends/hosts/mingw32.mk
index dbfb62fdc..ccc4c5082 100644
--- a/contrib/depends/hosts/mingw32.mk
+++ b/contrib/depends/hosts/mingw32.mk
@@ -1,5 +1,6 @@
mingw32_CFLAGS=-pipe
mingw32_CXXFLAGS=$(mingw32_CFLAGS)
+mingw32_ARFLAGS=cr
mingw32_release_CFLAGS=-O2
mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS)
diff --git a/contrib/depends/packages/android_ndk.mk b/contrib/depends/packages/android_ndk.mk
new file mode 100644
index 000000000..9b8a5332f
--- /dev/null
+++ b/contrib/depends/packages/android_ndk.mk
@@ -0,0 +1,22 @@
+package=android_ndk
+$(package)_version=17b
+$(package)_download_path=https://dl.google.com/android/repository/
+$(package)_file_name=android-ndk-r$($(package)_version)-linux-x86_64.zip
+$(package)_sha256_hash=5dfbbdc2d3ba859fed90d0e978af87c71a91a5be1f6e1c40ba697503d48ccecd
+
+define $(package)_set_vars
+$(package)_config_opts_arm=--arch arm
+$(package)_config_opts_aarch64=--arch arm64
+endef
+
+define $(package)_extract_cmds
+ echo $($(package)_sha256_hash) $($(1)_source_dir)/$($(package)_file_name) | sha256sum -c &&\
+ unzip -q $($(1)_source_dir)/$($(package)_file_name)
+endef
+
+define $(package)_stage_cmds
+ android-ndk-r$($(package)_version)/build/tools/make_standalone_toolchain.py --api 21 \
+ --install-dir $(build_prefix) --stl=libc++ $($(package)_config_opts) &&\
+ mv $(build_prefix) $($(package)_staging_dir)/$(host_prefix)
+endef
+
diff --git a/contrib/depends/packages/boost.mk b/contrib/depends/packages/boost.mk
index e60a1c677..0d241928e 100644
--- a/contrib/depends/packages/boost.mk
+++ b/contrib/depends/packages/boost.mk
@@ -3,6 +3,8 @@ $(package)_version=1_64_0
$(package)_download_path=https://dl.bintray.com/boostorg/release/1.64.0/source/
$(package)_file_name=$(package)_$($(package)_version).tar.bz2
$(package)_sha256_hash=7bcc5caace97baa948931d712ea5f37038dbb1c5d89b43ad4def4ed7cb683332
+$(package)_dependencies=libiconv
+$(package)_patches=fix_aroptions.patch
define $(package)_set_vars
$(package)_config_opts_release=variant=release
@@ -10,6 +12,7 @@ $(package)_config_opts_debug=variant=debug
$(package)_config_opts=--layout=tagged --build-type=complete --user-config=user-config.jam
$(package)_config_opts+=threading=multi link=static -sNO_BZIP2=1 -sNO_ZLIB=1
$(package)_config_opts_linux=threadapi=pthread runtime-link=shared
+$(package)_config_opts_android=threadapi=pthread runtime-link=static target-os=android
$(package)_config_opts_darwin=--toolset=darwin-4.2.1 runtime-link=shared
$(package)_config_opts_mingw32=binary-format=pe target-os=windows threadapi=win32 runtime-link=static
$(package)_config_opts_x86_64_mingw32=address-model=64
@@ -22,10 +25,12 @@ $(package)_archiver_darwin=$($(package)_libtool)
$(package)_config_libraries=chrono,filesystem,program_options,system,thread,test,date_time,regex,serialization,locale
$(package)_cxxflags=-std=c++11
$(package)_cxxflags_linux=-fPIC
+$(package)_cxxflags_freebsd=-fPIC
endef
define $(package)_preprocess_cmds
- echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : <cxxflags>\"$($(package)_cxxflags) $($(package)_cppflags)\" <linkflags>\"$($(package)_ldflags)\" <archiver>\"$(boost_archiver_$(host_os))\" <striper>\"$(host_STR IP)\" <ranlib>\"$(host_RANLIB)\" <rc>\"$(host_WINDRES)\" : ;" > user-config.jam
+ patch -p1 < $($(package)_patch_dir)/fix_aroptions.patch &&\
+ echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : <cxxflags>\"$($(package)_cxxflags) $($(package)_cppflags)\" <linkflags>\"$($(package)_ldflags)\" <archiver>\"$(boost_archiver_$(host_os))\" <arflags>\"$($(package)_arflags)\" <striper>\"$(host_STRIP)\" <ranlib>\"$(host_RANLIB)\" <rc>\"$(host_WINDRES)\" : ;" > user-config.jam
endef
define $(package)_config_cmds
diff --git a/contrib/depends/packages/eudev.mk b/contrib/depends/packages/eudev.mk
index a7795b777..0e930df93 100644
--- a/contrib/depends/packages/eudev.mk
+++ b/contrib/depends/packages/eudev.mk
@@ -9,7 +9,7 @@ define $(package)_set_vars
endef
define $(package)_config_cmds
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmd
diff --git a/contrib/depends/packages/freebsd_base.mk b/contrib/depends/packages/freebsd_base.mk
new file mode 100644
index 000000000..c6a209dcd
--- /dev/null
+++ b/contrib/depends/packages/freebsd_base.mk
@@ -0,0 +1,23 @@
+package=freebsd_base
+$(package)_version=11.3
+$(package)_download_path=https://download.freebsd.org/ftp/releases/amd64/$($(package)_version)-RELEASE/
+$(package)_download_file=base.txz
+$(package)_file_name=freebsd-base-$($(package)_version).txz
+$(package)_sha256_hash=4599023ac136325b86f2fddeec64c1624daa83657e40b00b2ef944c81463a4ff
+
+define $(package)_extract_cmds
+ echo $($(package)_sha256_hash) $($(1)_source_dir)/$($(package)_file_name) | sha256sum -c &&\
+ tar xf $($(1)_source_dir)/$($(package)_file_name) ./lib/ ./usr/lib/ ./usr/include/
+endef
+
+define $(package)_build_cmds
+ mkdir bin &&\
+ echo "exec /usr/bin/clang-8 -target x86_64-unknown-freebsd$($(package)_version) --sysroot=$(host_prefix)/native $$$$""@" > bin/clang-8 &&\
+ echo "exec /usr/bin/clang++-8 -target x86_64-unknown-freebsd$($(package)_version) --sysroot=$(host_prefix)/native $$$$""@" > bin/clang++-8 &&\
+ chmod 755 bin/*
+endef
+
+define $(package)_stage_cmds
+ mkdir $($(package)_staging_dir)/$(host_prefix)/native &&\
+ mv bin lib usr $($(package)_staging_dir)/$(host_prefix)/native
+endef
diff --git a/contrib/depends/packages/hidapi.mk b/contrib/depends/packages/hidapi.mk
index a27df04fa..b76ef1548 100644
--- a/contrib/depends/packages/hidapi.mk
+++ b/contrib/depends/packages/hidapi.mk
@@ -18,7 +18,7 @@ endef
define $(package)_config_cmds
./bootstrap &&\
- $($(package)_autoconf) $($(package)_config_opts)
+ $($(package)_autoconf) $($(package)_config_opts) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/packages/libiconv.mk b/contrib/depends/packages/libiconv.mk
index d4995c1b7..eac8b4331 100644
--- a/contrib/depends/packages/libiconv.mk
+++ b/contrib/depends/packages/libiconv.mk
@@ -10,6 +10,7 @@ define $(package)_set_vars
$(package)_config_opts=--enable-static
$(package)_config_opts=--disable-shared
$(package)_config_opts_linux=--with-pic
+ $(package)_config_opts_freebsd=--with-pic
endef
define $(package)_preprocess_cmds
@@ -18,7 +19,7 @@ define $(package)_preprocess_cmds
endef
define $(package)_config_cmds
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/packages/libusb.mk b/contrib/depends/packages/libusb.mk
index d865d2a17..348c410a7 100644
--- a/contrib/depends/packages/libusb.mk
+++ b/contrib/depends/packages/libusb.mk
@@ -19,11 +19,11 @@ ifneq ($(host_os),darwin)
define $(package)_config_cmds
cp -f $(BASEDIR)/config.guess config.guess &&\
cp -f $(BASEDIR)/config.sub config.sub &&\
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
else
define $(package)_config_cmds
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
endif
diff --git a/contrib/depends/packages/native_cctools.mk b/contrib/depends/packages/native_cctools.mk
index bcfe1af6b..8bf71254f 100644
--- a/contrib/depends/packages/native_cctools.mk
+++ b/contrib/depends/packages/native_cctools.mk
@@ -10,6 +10,7 @@ $(package)_clang_download_file=clang+llvm-$($(package)_clang_version)-x86_64-lin
$(package)_clang_file_name=clang-llvm-$($(package)_clang_version)-x86_64-linux-gnu-ubuntu-14.04.tar.xz
$(package)_clang_sha256_hash=99b28a6b48e793705228a390471991386daa33a9717cd9ca007fcdde69608fd9
$(package)_extra_sources=$($(package)_clang_file_name)
+$(package)_patches=skip_otool.patch
define $(package)_fetch_cmds
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \
@@ -37,7 +38,10 @@ $(package)_cc=$($(package)_extract_dir)/toolchain/bin/clang
$(package)_cxx=$($(package)_extract_dir)/toolchain/bin/clang++
endef
+# If clang gets updated to a version with a fix for https://reviews.llvm.org/D50559
+# then the patch that skips otool can be removed.
define $(package)_preprocess_cmds
+ patch -p0 < $($(package)_patch_dir)/skip_otool.patch && \
cd $($(package)_build_subdir); ./autogen.sh && \
sed -i.old "/define HAVE_PTHREADS/d" ld64/src/ld/InputFiles.h
endef
diff --git a/contrib/depends/packages/ncurses.mk b/contrib/depends/packages/ncurses.mk
index c3b16baab..d8fdf351c 100644
--- a/contrib/depends/packages/ncurses.mk
+++ b/contrib/depends/packages/ncurses.mk
@@ -3,10 +3,11 @@ $(package)_version=6.1
$(package)_download_path=https://ftp.gnu.org/gnu/ncurses
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=aa057eeeb4a14d470101eff4597d5833dcef5965331be3528c08d99cebaa0d17
+$(package)_patches=fallback.c
define $(package)_set_vars
$(package)_build_opts=CC="$($(package)_cc)"
- $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)"
+ $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" ARFLAGS=$($(package)_arflags) cf_cv_ar_flags=""
$(package)_config_env_darwin=RANLIB="$(host_prefix)/native/bin/x86_64-apple-darwin11-ranlib" AR="$(host_prefix)/native/bin/x86_64-apple-darwin11-ar" CC="$(host_prefix)/native/bin/$($(package)_cc)"
$(package)_config_opts=--prefix=$(host_prefix)
$(package)_config_opts+=--disable-shared
@@ -35,9 +36,8 @@ define $(package)_set_vars
$(pacakge)_config_opts+=--disable-symlinks
$(pacakge)_config_opts+=--enable-warnings
$(pacakge)_config_opts+=--enable-assertions
- $(pacakge)_config_opts+=--disable-home-terminfo
- $(package)_config_opts+=--with-default-terminfo-dir=/etc/terminfo
- $(package)_config_opts+=--with-terminfo-dirs="/etc/terminfo:/lib/terminfo:/usr/share/terminfo"
+ $(package)_config_opts+=--with-default-terminfo-dir=/etc/_terminfo_
+ $(package)_config_opts+=--with-terminfo-dirs=/etc/_terminfo_
$(pacakge)_config_opts+=--enable-database
$(pacakge)_config_opts+=--enable-sp-funcs
$(pacakge)_config_opts+=--disable-term-driver
@@ -46,6 +46,10 @@ define $(package)_set_vars
$(package)_build_opts=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC"
endef
+define $(package)_preprocess_cmds
+ cp $($(package)_patch_dir)/fallback.c ncurses
+endef
+
define $(package)_config_cmds
./configure $($(package)_config_opts)
endef
diff --git a/contrib/depends/packages/openssl.mk b/contrib/depends/packages/openssl.mk
index 8d08900f5..4b07d08ba 100644
--- a/contrib/depends/packages/openssl.mk
+++ b/contrib/depends/packages/openssl.mk
@@ -3,9 +3,10 @@ $(package)_version=1.0.2r
$(package)_download_path=https://www.openssl.org/source
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=ae51d08bba8a83958e894946f15303ff894d75c2b8bbd44a852b64e3fe11d0d6
+$(package)_patches=fix_arflags.patch
define $(package)_set_vars
-$(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)"
+$(package)_config_env=AR="$($(package)_ar)" ARFLAGS=$($(package)_arflags) RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)"
$(package)_config_opts=--prefix=$(host_prefix) --openssldir=$(host_prefix)/etc/openssl
$(package)_config_opts+=no-capieng
$(package)_config_opts+=no-dso
@@ -36,10 +37,13 @@ $(package)_config_opts+=no-zlib
$(package)_config_opts+=no-zlib-dynamic
$(package)_config_opts+=$($(package)_cflags) $($(package)_cppflags)
$(package)_config_opts_linux=-fPIC -Wa,--noexecstack
+$(package)_config_opts_freebsd=-fPIC -Wa,--noexecstack
$(package)_config_opts_x86_64_linux=linux-x86_64
$(package)_config_opts_i686_linux=linux-generic32
$(package)_config_opts_arm_linux=linux-generic32
$(package)_config_opts_aarch64_linux=linux-generic64
+$(package)_config_opts_arm_android=--static android-armv7 no-asm
+$(package)_config_opts_aarch64_android=--static android no-asm
$(package)_config_opts_riscv64_linux=linux-generic64
$(package)_config_opts_mipsel_linux=linux-generic32
$(package)_config_opts_mips_linux=linux-generic32
@@ -47,11 +51,14 @@ $(package)_config_opts_powerpc_linux=linux-generic32
$(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc
$(package)_config_opts_x86_64_mingw32=mingw64
$(package)_config_opts_i686_mingw32=mingw
+$(package)_config_opts_x86_64_freebsd=BSD-x86_64
endef
define $(package)_preprocess_cmds
sed -i.old "/define DATE/d" util/mkbuildinf.pl && \
- sed -i.old "s|engines apps test|engines|" Makefile.org
+ sed -i.old "s|engines apps test|engines|" Makefile.org && \
+ sed -i -e "s/-mandroid //" Configure && \
+ patch < $($(package)_patch_dir)/fix_arflags.patch
endef
define $(package)_config_cmds
diff --git a/contrib/depends/packages/packages.mk b/contrib/depends/packages/packages.mk
index f4b9c6407..95b23a37e 100644
--- a/contrib/depends/packages/packages.mk
+++ b/contrib/depends/packages/packages.mk
@@ -1,10 +1,22 @@
-packages:=boost openssl zeromq cppzmq expat ldns libiconv hidapi protobuf libusb
-native_packages := native_ccache native_protobuf
+packages:=boost openssl zeromq libiconv
-darwin_native_packages = native_biplist native_ds_store native_mac_alias
-darwin_packages = sodium-darwin ncurses readline
+native_packages := native_ccache
-linux_packages = eudev ncurses readline sodium
+hardware_packages := hidapi protobuf libusb
+hardware_native_packages := native_protobuf
+
+android_native_packages = android_ndk
+android_packages = ncurses readline sodium
+
+darwin_native_packages = native_biplist native_ds_store native_mac_alias $(hardware_native_packages)
+darwin_packages = sodium ncurses readline $(hardware_packages)
+
+# not really native...
+freebsd_native_packages = freebsd_base
+freebsd_packages = ncurses readline sodium
+
+linux_packages = eudev ncurses readline sodium $(hardware_packages)
+linux_native_packages = $(hardware_native_packages)
qt_packages = qt
ifeq ($(build_tests),ON)
@@ -15,10 +27,8 @@ ifneq ($(host_arch),riscv64)
linux_packages += unwind
endif
-ifeq ($(host_os),mingw32)
-packages += icu4c
-packages += sodium
-endif
+mingw32_packages = icu4c sodium $(hardware_packages)
+mingw32_native_packages = $(hardware_native_packages)
ifneq ($(build_os),darwin)
darwin_native_packages += native_cctools native_cdrkit native_libdmg-hfsplus
diff --git a/contrib/depends/packages/protobuf.mk b/contrib/depends/packages/protobuf.mk
index 81fa78a3f..ad1098975 100644
--- a/contrib/depends/packages/protobuf.mk
+++ b/contrib/depends/packages/protobuf.mk
@@ -12,7 +12,7 @@ define $(package)_set_vars
endef
define $(package)_config_cmds
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/packages/readline.mk b/contrib/depends/packages/readline.mk
index 8f234ab6a..b6e6a451a 100644
--- a/contrib/depends/packages/readline.mk
+++ b/contrib/depends/packages/readline.mk
@@ -7,7 +7,7 @@ $(package)_dependencies=ncurses
define $(package)_set_vars
$(package)_build_opts=CC="$($(package)_cc)"
- $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)"
+ $(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" LDFLAGS="-L$(host_prefix)/lib" ARFLAGS=$($(package)_arflags)
$(package)_config_env_darwin=RANLIB="$(host_prefix)/native/bin/x86_64-apple-darwin11-ranlib" AR="$(host_prefix)/native/bin/x86_64-apple-darwin11-ar" CC="$(host_prefix)/native/bin/$($(package)_cc)"
$(package)_config_opts+=--prefix=$(host_prefix)
$(package)_config_opts+=--exec-prefix=$(host_prefix)
diff --git a/contrib/depends/packages/sodium-darwin.mk b/contrib/depends/packages/sodium-darwin.mk
deleted file mode 100644
index 9f11a9426..000000000
--- a/contrib/depends/packages/sodium-darwin.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-package=sodium-darwin
-$(package)_version=1.0.16
-$(package)_download_path=https://download.libsodium.org/libsodium/releases/
-$(package)_file_name=libsodium-$($(package)_version).tar.gz
-$(package)_sha256_hash=eeadc7e1e1bcef09680fb4837d448fbdf57224978f865ac1c16745868fbd0533
-
-define $(package)_set_vars
-$(package)_build_opts_darwin=OS=Darwin LIBTOOL="$($(package)_libtool)"
-$(package)_config_opts=--enable-static --disable-shared
-$(package)_config_opts+=--prefix=$(host_prefix)
-endef
-
-define $(package)_config_cmds
- ./autogen.sh &&\
- $($(package)_autoconf) $($(package)_config_opts) RANLIB="$(host_prefix)/native/bin/x86_64-apple-darwin11-ranlib" AR="$(host_prefix)/native/bin/x86_64-apple-darwin11-ar" CC="$(host_prefix)/native/bin/$($(package)_cc)"
-endef
-
-define $(package)_build_cmds
- echo "path is problematic here" &&\
- make
-endef
-
-define $(package)_stage_cmds
- $(MAKE) DESTDIR=$($(package)_staging_dir) install
-endef
-
-define $(package)_postprocess_cmds
- rm lib/*.la
-endef
-
diff --git a/contrib/depends/packages/sodium.mk b/contrib/depends/packages/sodium.mk
index b71f4383e..dbf86fc5a 100644
--- a/contrib/depends/packages/sodium.mk
+++ b/contrib/depends/packages/sodium.mk
@@ -8,12 +8,14 @@ $(package)_patches=fix-whitespace.patch
define $(package)_set_vars
$(package)_config_opts=--enable-static --disable-shared
$(package)_config_opts+=--prefix=$(host_prefix)
+$(package)_config_opts_android=RANLIB=$($(package)_ranlib) AR=$($(package)_ar) CC=$($(package)_cc)
+$(package)_config_opts_darwin=RANLIB="$(host_prefix)/native/bin/x86_64-apple-darwin11-ranlib" AR="$(host_prefix)/native/bin/x86_64-apple-darwin11-ar" CC="$(host_prefix)/native/bin/$($(package)_cc)"
endef
define $(package)_config_cmds
./autogen.sh &&\
patch -p1 < $($(package)_patch_dir)/fix-whitespace.patch &&\
- $($(package)_autoconf) $($(package)_config_opts)
+ $($(package)_autoconf) $($(package)_config_opts) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/packages/unwind.mk b/contrib/depends/packages/unwind.mk
index fddbd0561..826a820c4 100644
--- a/contrib/depends/packages/unwind.mk
+++ b/contrib/depends/packages/unwind.mk
@@ -3,11 +3,16 @@ $(package)_version=1.2
$(package)_download_path=https://download.savannah.nongnu.org/releases/libunwind
$(package)_file_name=lib$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=1de38ffbdc88bd694d10081865871cd2bfbb02ad8ef9e1606aee18d65532b992
+$(package)_patches=fix_obj_order.patch
+
+define $(package)_preprocess_cmds
+ patch -p0 < $($(package)_patch_dir)/fix_obj_order.patch
+endef
define $(package)_config_cmds
cp -f $(BASEDIR)/config.guess config/config.guess &&\
cp -f $(BASEDIR)/config.sub config/config.sub &&\
- $($(package)_autoconf) --disable-shared --enable-static
+ $($(package)_autoconf) --disable-shared --enable-static AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/packages/zeromq.mk b/contrib/depends/packages/zeromq.mk
index c3a405a60..55941e67d 100644
--- a/contrib/depends/packages/zeromq.mk
+++ b/contrib/depends/packages/zeromq.mk
@@ -3,22 +3,24 @@ $(package)_version=4.1.7
$(package)_download_path=https://github.com/zeromq/zeromq4-1/releases/download/v$($(package)_version)/
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=31c383cfcd3be1dc8a66e448c403029e793687e70473b89c4cc0bd626e7da299
-$(package)_patches=9114d3957725acd34aa8b8d011585812f3369411.patch 9e6745c12e0b100cd38acecc16ce7db02905e27c.patch
+$(package)_patches=9114d3957725acd34aa8b8d011585812f3369411.patch 9e6745c12e0b100cd38acecc16ce7db02905e27c.patch ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch
define $(package)_set_vars
$(package)_config_opts=--without-documentation --disable-shared --without-libsodium --disable-curve
$(package)_config_opts_linux=--with-pic
+ $(package)_config_opts_freebsd=--with-pic
$(package)_cxxflags=-std=c++11
endef
define $(package)_preprocess_cmds
patch -p1 < $($(package)_patch_dir)/9114d3957725acd34aa8b8d011585812f3369411.patch && \
patch -p1 < $($(package)_patch_dir)/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch && \
+ patch -p1 < $($(package)_patch_dir)/ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch && \
./autogen.sh
endef
define $(package)_config_cmds
- $($(package)_autoconf)
+ $($(package)_autoconf) AR_FLAGS=$($(package)_arflags)
endef
define $(package)_build_cmds
diff --git a/contrib/depends/patches/boost/fix_aroptions.patch b/contrib/depends/patches/boost/fix_aroptions.patch
new file mode 100644
index 000000000..5b2ec1006
--- /dev/null
+++ b/contrib/depends/patches/boost/fix_aroptions.patch
@@ -0,0 +1,28 @@
+--- boost_1_64_0/tools/build/src/tools/gcc.jam.O 2017-04-17 03:22:26.000000000 +0100
++++ boost_1_64_0/tools/build/src/tools/gcc.jam 2019-11-15 15:46:16.957937137 +0000
+@@ -243,6 +243,8 @@
+ {
+ ECHO notice: using gcc archiver :: $(condition) :: $(archiver[1]) ;
+ }
++ local arflags = [ feature.get-values <arflags> : $(options) ] ;
++ toolset.flags gcc.archive .ARFLAGS $(condition) : $(arflags) ;
+
+ # - Ranlib.
+ local ranlib = [ common.get-invocation-command gcc
+@@ -970,6 +972,7 @@
+ # logic in intel-linux, but that is hardly worth the trouble as on Linux, 'ar'
+ # is always available.
+ .AR = ar ;
++.ARFLAGS = rc ;
+ .RANLIB = ranlib ;
+
+ toolset.flags gcc.archive AROPTIONS <archiveflags> ;
+@@ -1011,7 +1014,7 @@
+ #
+ actions piecemeal archive
+ {
+- "$(.AR)" $(AROPTIONS) rc "$(<)" "$(>)"
++ "$(.AR)" $(AROPTIONS) $(.ARFLAGS) "$(<)" "$(>)"
+ "$(.RANLIB)" "$(<)"
+ }
+
diff --git a/contrib/depends/patches/native_cctools/skip_otool.patch b/contrib/depends/patches/native_cctools/skip_otool.patch
new file mode 100644
index 000000000..30c4ee524
--- /dev/null
+++ b/contrib/depends/patches/native_cctools/skip_otool.patch
@@ -0,0 +1,12 @@
+--- cctools/Makefile.am.O 2016-06-09 15:06:16.000000000 +0100
++++ cctools/Makefile.am 2019-11-18 08:59:20.078663220 +0000
+@@ -1,7 +1,7 @@
+ if ISDARWIN
+-SUBDIRS=libstuff ar as misc otool ld64 $(LD_CLASSIC)
++SUBDIRS=libstuff ar as misc ld64 $(LD_CLASSIC)
+ else
+-SUBDIRS=libstuff ar as misc libobjc2 otool ld64 $(LD_CLASSIC)
++SUBDIRS=libstuff ar as misc ld64 $(LD_CLASSIC)
+ endif
+
+ ACLOCAL_AMFLAGS = -I m4
diff --git a/contrib/depends/patches/ncurses/fallback.c b/contrib/depends/patches/ncurses/fallback.c
new file mode 100644
index 000000000..fab108c37
--- /dev/null
+++ b/contrib/depends/patches/ncurses/fallback.c
@@ -0,0 +1,6621 @@
+/* This file was generated by tinfo/MKfallback.sh */
+
+/*
+ * DO NOT EDIT THIS FILE BY HAND!
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+/* fallback entries for: linux rxvt vt100 xterm xterm-256color screen screen.linux screen.rxvt screen.xterm-new screen.xterm-256color */
+/* linux */
+
+static char linux_alias_data[] = "linux|linux console";
+
+static char linux_s_bel [] = "\007";
+static char linux_s_cr [] = "\015";
+static char linux_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char linux_s_tbc [] = "\033[3g";
+static char linux_s_clear [] = "\033[H\033[J";
+static char linux_s_el [] = "\033[K";
+static char linux_s_ed [] = "\033[J";
+static char linux_s_hpa [] = "\033[%i%p1%dG";
+static char linux_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char linux_s_cud1 [] = "\012";
+static char linux_s_home [] = "\033[H";
+static char linux_s_civis [] = "\033[?25l\033[?1c";
+static char linux_s_cub1 [] = "\010";
+static char linux_s_cnorm [] = "\033[?25h\033[?0c";
+static char linux_s_cuf1 [] = "\033[C";
+static char linux_s_cuu1 [] = "\033[A";
+static char linux_s_cvvis [] = "\033[?25h\033[?8c";
+static char linux_s_dch1 [] = "\033[P";
+static char linux_s_dl1 [] = "\033[M";
+static char linux_s_smacs [] = "\016";
+static char linux_s_blink [] = "\033[5m";
+static char linux_s_bold [] = "\033[1m";
+static char linux_s_dim [] = "\033[2m";
+static char linux_s_smir [] = "\033[4h";
+static char linux_s_rev [] = "\033[7m";
+static char linux_s_smso [] = "\033[7m";
+static char linux_s_smul [] = "\033[4m";
+static char linux_s_ech [] = "\033[%p1%dX";
+static char linux_s_rmacs [] = "\017";
+static char linux_s_sgr0 [] = "\033[m\017";
+static char linux_s_rmir [] = "\033[4l";
+static char linux_s_rmso [] = "\033[27m";
+static char linux_s_rmul [] = "\033[24m";
+static char linux_s_flash [] = "\033[?5h$<200/>\033[?5l";
+static char linux_s_ich1 [] = "\033[@";
+static char linux_s_il1 [] = "\033[L";
+static char linux_s_kbs [] = "\177";
+static char linux_s_kdch1 [] = "\033[3~";
+static char linux_s_kcud1 [] = "\033[B";
+static char linux_s_kf1 [] = "\033[[A";
+static char linux_s_kf10 [] = "\033[21~";
+static char linux_s_kf2 [] = "\033[[B";
+static char linux_s_kf3 [] = "\033[[C";
+static char linux_s_kf4 [] = "\033[[D";
+static char linux_s_kf5 [] = "\033[[E";
+static char linux_s_kf6 [] = "\033[17~";
+static char linux_s_kf7 [] = "\033[18~";
+static char linux_s_kf8 [] = "\033[19~";
+static char linux_s_kf9 [] = "\033[20~";
+static char linux_s_khome [] = "\033[1~";
+static char linux_s_kich1 [] = "\033[2~";
+static char linux_s_kcub1 [] = "\033[D";
+static char linux_s_knp [] = "\033[6~";
+static char linux_s_kpp [] = "\033[5~";
+static char linux_s_kcuf1 [] = "\033[C";
+static char linux_s_kcuu1 [] = "\033[A";
+static char linux_s_nel [] = "\015\012";
+static char linux_s_dch [] = "\033[%p1%dP";
+static char linux_s_dl [] = "\033[%p1%dM";
+static char linux_s_cud [] = "\033[%p1%dB";
+static char linux_s_ich [] = "\033[%p1%d@";
+static char linux_s_il [] = "\033[%p1%dL";
+static char linux_s_cub [] = "\033[%p1%dD";
+static char linux_s_cuf [] = "\033[%p1%dC";
+static char linux_s_cuu [] = "\033[%p1%dA";
+static char linux_s_rs1 [] = "\033c\033]R";
+static char linux_s_rc [] = "\0338";
+static char linux_s_vpa [] = "\033[%i%p1%dd";
+static char linux_s_sc [] = "\0337";
+static char linux_s_ind [] = "\012";
+static char linux_s_ri [] = "\033M";
+static char linux_s_sgr [] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t\016%e\017%;";
+static char linux_s_hts [] = "\033H";
+static char linux_s_ht [] = "\011";
+static char linux_s_kb2 [] = "\033[G";
+static char linux_s_acsc [] = "++,,--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~";
+static char linux_s_kcbt [] = "\033[Z";
+static char linux_s_smam [] = "\033[?7h";
+static char linux_s_rmam [] = "\033[?7l";
+static char linux_s_enacs [] = "\033)0";
+static char linux_s_kend [] = "\033[4~";
+static char linux_s_kspd [] = "\032";
+static char linux_s_kf11 [] = "\033[23~";
+static char linux_s_kf12 [] = "\033[24~";
+static char linux_s_kf13 [] = "\033[25~";
+static char linux_s_kf14 [] = "\033[26~";
+static char linux_s_kf15 [] = "\033[28~";
+static char linux_s_kf16 [] = "\033[29~";
+static char linux_s_kf17 [] = "\033[31~";
+static char linux_s_kf18 [] = "\033[32~";
+static char linux_s_kf19 [] = "\033[33~";
+static char linux_s_kf20 [] = "\033[34~";
+static char linux_s_el1 [] = "\033[1K";
+static char linux_s_u6 [] = "\033[%i%d;%dR";
+static char linux_s_u7 [] = "\033[6n";
+static char linux_s_u8 [] = "\033[?6c";
+static char linux_s_u9 [] = "\033[c";
+static char linux_s_op [] = "\033[39;49m";
+static char linux_s_oc [] = "\033]R";
+static char linux_s_initc [] = "\033]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x";
+static char linux_s_kmous [] = "\033[M";
+static char linux_s_setaf [] = "\033[3%p1%dm";
+static char linux_s_setab [] = "\033[4%p1%dm";
+static char linux_s_smpch [] = "\033[11m";
+static char linux_s_rmpch [] = "\033[10m";
+
+static char linux_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ TRUE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ FALSE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ TRUE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ FALSE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ TRUE,
+ /* 28: bce */ TRUE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ FALSE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 linux_number_data[] = {
+ /* 0: cols */ ABSENT_NUMERIC,
+ /* 1: it */ 8,
+ /* 2: lines */ ABSENT_NUMERIC,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ 18,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * linux_string_data[] = {
+ /* 0: cbt */ ABSENT_STRING,
+ /* 1: bel */ linux_s_bel,
+ /* 2: cr */ linux_s_cr,
+ /* 3: csr */ linux_s_csr,
+ /* 4: tbc */ linux_s_tbc,
+ /* 5: clear */ linux_s_clear,
+ /* 6: el */ linux_s_el,
+ /* 7: ed */ linux_s_ed,
+ /* 8: hpa */ linux_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ linux_s_cup,
+ /* 11: cud1 */ linux_s_cud1,
+ /* 12: home */ linux_s_home,
+ /* 13: civis */ linux_s_civis,
+ /* 14: cub1 */ linux_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ linux_s_cnorm,
+ /* 17: cuf1 */ linux_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ linux_s_cuu1,
+ /* 20: cvvis */ linux_s_cvvis,
+ /* 21: dch1 */ linux_s_dch1,
+ /* 22: dl1 */ linux_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ linux_s_smacs,
+ /* 26: blink */ linux_s_blink,
+ /* 27: bold */ linux_s_bold,
+ /* 28: smcup */ ABSENT_STRING,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ linux_s_dim,
+ /* 31: smir */ linux_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ linux_s_rev,
+ /* 35: smso */ linux_s_smso,
+ /* 36: smul */ linux_s_smul,
+ /* 37: ech */ linux_s_ech,
+ /* 38: rmacs */ linux_s_rmacs,
+ /* 39: sgr0 */ linux_s_sgr0,
+ /* 40: rmcup */ ABSENT_STRING,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ linux_s_rmir,
+ /* 43: rmso */ linux_s_rmso,
+ /* 44: rmul */ linux_s_rmul,
+ /* 45: flash */ linux_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ ABSENT_STRING,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ linux_s_ich1,
+ /* 53: il1 */ linux_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ linux_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ linux_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ linux_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ linux_s_kf1,
+ /* 67: kf10 */ linux_s_kf10,
+ /* 68: kf2 */ linux_s_kf2,
+ /* 69: kf3 */ linux_s_kf3,
+ /* 70: kf4 */ linux_s_kf4,
+ /* 71: kf5 */ linux_s_kf5,
+ /* 72: kf6 */ linux_s_kf6,
+ /* 73: kf7 */ linux_s_kf7,
+ /* 74: kf8 */ linux_s_kf8,
+ /* 75: kf9 */ linux_s_kf9,
+ /* 76: khome */ linux_s_khome,
+ /* 77: kich1 */ linux_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ linux_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ linux_s_knp,
+ /* 82: kpp */ linux_s_kpp,
+ /* 83: kcuf1 */ linux_s_kcuf1,
+ /* 84: kind */ ABSENT_STRING,
+ /* 85: kri */ ABSENT_STRING,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ linux_s_kcuu1,
+ /* 88: rmkx */ ABSENT_STRING,
+ /* 89: smkx */ ABSENT_STRING,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ linux_s_nel,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ linux_s_dch,
+ /* 106: dl */ linux_s_dl,
+ /* 107: cud */ linux_s_cud,
+ /* 108: ich */ linux_s_ich,
+ /* 109: indn */ ABSENT_STRING,
+ /* 110: il */ linux_s_il,
+ /* 111: cub */ linux_s_cub,
+ /* 112: cuf */ linux_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ linux_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ ABSENT_STRING,
+ /* 119: mc4 */ ABSENT_STRING,
+ /* 120: mc5 */ ABSENT_STRING,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ linux_s_rs1,
+ /* 123: rs2 */ ABSENT_STRING,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ linux_s_rc,
+ /* 127: vpa */ linux_s_vpa,
+ /* 128: sc */ linux_s_sc,
+ /* 129: ind */ linux_s_ind,
+ /* 130: ri */ linux_s_ri,
+ /* 131: sgr */ linux_s_sgr,
+ /* 132: hts */ linux_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ linux_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ linux_s_kb2,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ linux_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ linux_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ linux_s_smam,
+ /* 152: rmam */ linux_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ linux_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ linux_s_kend,
+ /* 165: kent */ ABSENT_STRING,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ linux_s_kspd,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ ABSENT_STRING,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ ABSENT_STRING,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ ABSENT_STRING,
+ /* 200: kIC */ ABSENT_STRING,
+ /* 201: kLFT */ ABSENT_STRING,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ ABSENT_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ ABSENT_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ ABSENT_STRING,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ linux_s_kf11,
+ /* 217: kf12 */ linux_s_kf12,
+ /* 218: kf13 */ linux_s_kf13,
+ /* 219: kf14 */ linux_s_kf14,
+ /* 220: kf15 */ linux_s_kf15,
+ /* 221: kf16 */ linux_s_kf16,
+ /* 222: kf17 */ linux_s_kf17,
+ /* 223: kf18 */ linux_s_kf18,
+ /* 224: kf19 */ linux_s_kf19,
+ /* 225: kf20 */ linux_s_kf20,
+ /* 226: kf21 */ ABSENT_STRING,
+ /* 227: kf22 */ ABSENT_STRING,
+ /* 228: kf23 */ ABSENT_STRING,
+ /* 229: kf24 */ ABSENT_STRING,
+ /* 230: kf25 */ ABSENT_STRING,
+ /* 231: kf26 */ ABSENT_STRING,
+ /* 232: kf27 */ ABSENT_STRING,
+ /* 233: kf28 */ ABSENT_STRING,
+ /* 234: kf29 */ ABSENT_STRING,
+ /* 235: kf30 */ ABSENT_STRING,
+ /* 236: kf31 */ ABSENT_STRING,
+ /* 237: kf32 */ ABSENT_STRING,
+ /* 238: kf33 */ ABSENT_STRING,
+ /* 239: kf34 */ ABSENT_STRING,
+ /* 240: kf35 */ ABSENT_STRING,
+ /* 241: kf36 */ ABSENT_STRING,
+ /* 242: kf37 */ ABSENT_STRING,
+ /* 243: kf38 */ ABSENT_STRING,
+ /* 244: kf39 */ ABSENT_STRING,
+ /* 245: kf40 */ ABSENT_STRING,
+ /* 246: kf41 */ ABSENT_STRING,
+ /* 247: kf42 */ ABSENT_STRING,
+ /* 248: kf43 */ ABSENT_STRING,
+ /* 249: kf44 */ ABSENT_STRING,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ linux_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ linux_s_u6,
+ /* 294: u7 */ linux_s_u7,
+ /* 295: u8 */ linux_s_u8,
+ /* 296: u9 */ linux_s_u9,
+ /* 297: op */ linux_s_op,
+ /* 298: oc */ linux_s_oc,
+ /* 299: initc */ linux_s_initc,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ linux_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ linux_s_setaf,
+ /* 360: setab */ linux_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ linux_s_smpch,
+ /* 380: rmpch */ linux_s_rmpch,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* rxvt */
+
+static char rxvt_alias_data[] = "rxvt|rxvt terminal emulator (X Window System)";
+
+static char rxvt_s_bel [] = "\007";
+static char rxvt_s_cr [] = "\015";
+static char rxvt_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char rxvt_s_tbc [] = "\033[3g";
+static char rxvt_s_clear [] = "\033[H\033[2J";
+static char rxvt_s_el [] = "\033[K";
+static char rxvt_s_ed [] = "\033[J";
+static char rxvt_s_hpa [] = "\033[%i%p1%dG";
+static char rxvt_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char rxvt_s_cud1 [] = "\012";
+static char rxvt_s_home [] = "\033[H";
+static char rxvt_s_civis [] = "\033[?25l";
+static char rxvt_s_cub1 [] = "\010";
+static char rxvt_s_cnorm [] = "\033[?25h";
+static char rxvt_s_cuf1 [] = "\033[C";
+static char rxvt_s_cuu1 [] = "\033[A";
+static char rxvt_s_dl1 [] = "\033[M";
+static char rxvt_s_smacs [] = "\016";
+static char rxvt_s_blink [] = "\033[5m";
+static char rxvt_s_bold [] = "\033[1m";
+static char rxvt_s_smcup [] = "\0337\033[?47h";
+static char rxvt_s_smir [] = "\033[4h";
+static char rxvt_s_rev [] = "\033[7m";
+static char rxvt_s_smso [] = "\033[7m";
+static char rxvt_s_smul [] = "\033[4m";
+static char rxvt_s_rmacs [] = "\017";
+static char rxvt_s_sgr0 [] = "\033[m\017";
+static char rxvt_s_rmcup [] = "\033[2J\033[?47l\0338";
+static char rxvt_s_rmir [] = "\033[4l";
+static char rxvt_s_rmso [] = "\033[27m";
+static char rxvt_s_rmul [] = "\033[24m";
+static char rxvt_s_flash [] = "\033[?5h$<100/>\033[?5l";
+static char rxvt_s_is1 [] = "\033[?47l\033=\033[?1l";
+static char rxvt_s_is2 [] = "\033[r\033[m\033[2J\033[H\033[?7h\033[?1;3;4;6l\033[4l";
+static char rxvt_s_ich1 [] = "\033[@";
+static char rxvt_s_il1 [] = "\033[L";
+static char rxvt_s_kbs [] = "\010";
+static char rxvt_s_kdch1 [] = "\033[3~";
+static char rxvt_s_kcud1 [] = "\033[B";
+static char rxvt_s_kel [] = "\033[8^";
+static char rxvt_s_kf0 [] = "\033[21~";
+static char rxvt_s_kf1 [] = "\033[11~";
+static char rxvt_s_kf10 [] = "\033[21~";
+static char rxvt_s_kf2 [] = "\033[12~";
+static char rxvt_s_kf3 [] = "\033[13~";
+static char rxvt_s_kf4 [] = "\033[14~";
+static char rxvt_s_kf5 [] = "\033[15~";
+static char rxvt_s_kf6 [] = "\033[17~";
+static char rxvt_s_kf7 [] = "\033[18~";
+static char rxvt_s_kf8 [] = "\033[19~";
+static char rxvt_s_kf9 [] = "\033[20~";
+static char rxvt_s_khome [] = "\033[7~";
+static char rxvt_s_kich1 [] = "\033[2~";
+static char rxvt_s_kcub1 [] = "\033[D";
+static char rxvt_s_knp [] = "\033[6~";
+static char rxvt_s_kpp [] = "\033[5~";
+static char rxvt_s_kcuf1 [] = "\033[C";
+static char rxvt_s_kind [] = "\033[a";
+static char rxvt_s_kri [] = "\033[b";
+static char rxvt_s_kcuu1 [] = "\033[A";
+static char rxvt_s_rmkx [] = "\033>";
+static char rxvt_s_smkx [] = "\033=";
+static char rxvt_s_dl [] = "\033[%p1%dM";
+static char rxvt_s_cud [] = "\033[%p1%dB";
+static char rxvt_s_ich [] = "\033[%p1%d@";
+static char rxvt_s_il [] = "\033[%p1%dL";
+static char rxvt_s_cub [] = "\033[%p1%dD";
+static char rxvt_s_cuf [] = "\033[%p1%dC";
+static char rxvt_s_cuu [] = "\033[%p1%dA";
+static char rxvt_s_rs1 [] = "\033>\033[1;3;4;5;6l\033[?7h\033[m\033[r\033[2J\033[H";
+static char rxvt_s_rs2 [] = "\033[r\033[m\033[2J\033[H\033[?7h\033[?1;3;4;6l\033[4l\033>\033[?1000l\033[?25h";
+static char rxvt_s_rc [] = "\0338";
+static char rxvt_s_vpa [] = "\033[%i%p1%dd";
+static char rxvt_s_sc [] = "\0337";
+static char rxvt_s_ind [] = "\012";
+static char rxvt_s_ri [] = "\033M";
+static char rxvt_s_sgr [] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;";
+static char rxvt_s_hts [] = "\033H";
+static char rxvt_s_ht [] = "\011";
+static char rxvt_s_ka1 [] = "\033Ow";
+static char rxvt_s_ka3 [] = "\033Oy";
+static char rxvt_s_kb2 [] = "\033Ou";
+static char rxvt_s_kc1 [] = "\033Oq";
+static char rxvt_s_kc3 [] = "\033Os";
+static char rxvt_s_acsc [] = "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char rxvt_s_kcbt [] = "\033[Z";
+static char rxvt_s_enacs [] = "\033(B\033)0";
+static char rxvt_s_kend [] = "\033[8~";
+static char rxvt_s_kent [] = "\033OM";
+static char rxvt_s_kfnd [] = "\033[1~";
+static char rxvt_s_kDC [] = "\033[3$";
+static char rxvt_s_kslt [] = "\033[4~";
+static char rxvt_s_kEND [] = "\033[8$";
+static char rxvt_s_kHOM [] = "\033[7$";
+static char rxvt_s_kIC [] = "\033[2$";
+static char rxvt_s_kLFT [] = "\033[d";
+static char rxvt_s_kNXT [] = "\033[6$";
+static char rxvt_s_kPRV [] = "\033[5$";
+static char rxvt_s_kRIT [] = "\033[c";
+static char rxvt_s_kf11 [] = "\033[23~";
+static char rxvt_s_kf12 [] = "\033[24~";
+static char rxvt_s_kf13 [] = "\033[25~";
+static char rxvt_s_kf14 [] = "\033[26~";
+static char rxvt_s_kf15 [] = "\033[28~";
+static char rxvt_s_kf16 [] = "\033[29~";
+static char rxvt_s_kf17 [] = "\033[31~";
+static char rxvt_s_kf18 [] = "\033[32~";
+static char rxvt_s_kf19 [] = "\033[33~";
+static char rxvt_s_kf20 [] = "\033[34~";
+static char rxvt_s_kf21 [] = "\033[23$";
+static char rxvt_s_kf22 [] = "\033[24$";
+static char rxvt_s_kf23 [] = "\033[11^";
+static char rxvt_s_kf24 [] = "\033[12^";
+static char rxvt_s_kf25 [] = "\033[13^";
+static char rxvt_s_kf26 [] = "\033[14^";
+static char rxvt_s_kf27 [] = "\033[15^";
+static char rxvt_s_kf28 [] = "\033[17^";
+static char rxvt_s_kf29 [] = "\033[18^";
+static char rxvt_s_kf30 [] = "\033[19^";
+static char rxvt_s_kf31 [] = "\033[20^";
+static char rxvt_s_kf32 [] = "\033[21^";
+static char rxvt_s_kf33 [] = "\033[23^";
+static char rxvt_s_kf34 [] = "\033[24^";
+static char rxvt_s_kf35 [] = "\033[25^";
+static char rxvt_s_kf36 [] = "\033[26^";
+static char rxvt_s_kf37 [] = "\033[28^";
+static char rxvt_s_kf38 [] = "\033[29^";
+static char rxvt_s_kf39 [] = "\033[31^";
+static char rxvt_s_kf40 [] = "\033[32^";
+static char rxvt_s_kf41 [] = "\033[33^";
+static char rxvt_s_kf42 [] = "\033[34^";
+static char rxvt_s_kf43 [] = "\033[23@";
+static char rxvt_s_kf44 [] = "\033[24@";
+static char rxvt_s_el1 [] = "\033[1K";
+static char rxvt_s_u6 [] = "\033[%i%d;%dR";
+static char rxvt_s_u7 [] = "\033[6n";
+static char rxvt_s_u8 [] = "\033[?1;2c";
+static char rxvt_s_u9 [] = "\033[c";
+static char rxvt_s_op [] = "\033[39;49m";
+static char rxvt_s_kmous [] = "\033[M";
+static char rxvt_s_setaf [] = "\033[3%p1%dm";
+static char rxvt_s_setab [] = "\033[4%p1%dm";
+static char rxvt_s_s0ds [] = "\033(B";
+static char rxvt_s_s1ds [] = "\033(0";
+
+static char rxvt_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ TRUE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ FALSE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ TRUE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ FALSE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ TRUE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 rxvt_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ CANCELLED_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * rxvt_string_data[] = {
+ /* 0: cbt */ ABSENT_STRING,
+ /* 1: bel */ rxvt_s_bel,
+ /* 2: cr */ rxvt_s_cr,
+ /* 3: csr */ rxvt_s_csr,
+ /* 4: tbc */ rxvt_s_tbc,
+ /* 5: clear */ rxvt_s_clear,
+ /* 6: el */ rxvt_s_el,
+ /* 7: ed */ rxvt_s_ed,
+ /* 8: hpa */ rxvt_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ rxvt_s_cup,
+ /* 11: cud1 */ rxvt_s_cud1,
+ /* 12: home */ rxvt_s_home,
+ /* 13: civis */ rxvt_s_civis,
+ /* 14: cub1 */ rxvt_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ rxvt_s_cnorm,
+ /* 17: cuf1 */ rxvt_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ rxvt_s_cuu1,
+ /* 20: cvvis */ ABSENT_STRING,
+ /* 21: dch1 */ ABSENT_STRING,
+ /* 22: dl1 */ rxvt_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ rxvt_s_smacs,
+ /* 26: blink */ rxvt_s_blink,
+ /* 27: bold */ rxvt_s_bold,
+ /* 28: smcup */ rxvt_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ ABSENT_STRING,
+ /* 31: smir */ rxvt_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ rxvt_s_rev,
+ /* 35: smso */ rxvt_s_smso,
+ /* 36: smul */ rxvt_s_smul,
+ /* 37: ech */ ABSENT_STRING,
+ /* 38: rmacs */ rxvt_s_rmacs,
+ /* 39: sgr0 */ rxvt_s_sgr0,
+ /* 40: rmcup */ rxvt_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ rxvt_s_rmir,
+ /* 43: rmso */ rxvt_s_rmso,
+ /* 44: rmul */ rxvt_s_rmul,
+ /* 45: flash */ rxvt_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ rxvt_s_is1,
+ /* 49: is2 */ rxvt_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ rxvt_s_ich1,
+ /* 53: il1 */ rxvt_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ rxvt_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ rxvt_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ rxvt_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ rxvt_s_kel,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ rxvt_s_kf0,
+ /* 66: kf1 */ rxvt_s_kf1,
+ /* 67: kf10 */ rxvt_s_kf10,
+ /* 68: kf2 */ rxvt_s_kf2,
+ /* 69: kf3 */ rxvt_s_kf3,
+ /* 70: kf4 */ rxvt_s_kf4,
+ /* 71: kf5 */ rxvt_s_kf5,
+ /* 72: kf6 */ rxvt_s_kf6,
+ /* 73: kf7 */ rxvt_s_kf7,
+ /* 74: kf8 */ rxvt_s_kf8,
+ /* 75: kf9 */ rxvt_s_kf9,
+ /* 76: khome */ rxvt_s_khome,
+ /* 77: kich1 */ rxvt_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ rxvt_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ rxvt_s_knp,
+ /* 82: kpp */ rxvt_s_kpp,
+ /* 83: kcuf1 */ rxvt_s_kcuf1,
+ /* 84: kind */ rxvt_s_kind,
+ /* 85: kri */ rxvt_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ rxvt_s_kcuu1,
+ /* 88: rmkx */ rxvt_s_rmkx,
+ /* 89: smkx */ rxvt_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ ABSENT_STRING,
+ /* 106: dl */ rxvt_s_dl,
+ /* 107: cud */ rxvt_s_cud,
+ /* 108: ich */ rxvt_s_ich,
+ /* 109: indn */ ABSENT_STRING,
+ /* 110: il */ rxvt_s_il,
+ /* 111: cub */ rxvt_s_cub,
+ /* 112: cuf */ rxvt_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ rxvt_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ ABSENT_STRING,
+ /* 119: mc4 */ ABSENT_STRING,
+ /* 120: mc5 */ ABSENT_STRING,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ rxvt_s_rs1,
+ /* 123: rs2 */ rxvt_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ rxvt_s_rc,
+ /* 127: vpa */ rxvt_s_vpa,
+ /* 128: sc */ rxvt_s_sc,
+ /* 129: ind */ rxvt_s_ind,
+ /* 130: ri */ rxvt_s_ri,
+ /* 131: sgr */ rxvt_s_sgr,
+ /* 132: hts */ rxvt_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ rxvt_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ rxvt_s_ka1,
+ /* 140: ka3 */ rxvt_s_ka3,
+ /* 141: kb2 */ rxvt_s_kb2,
+ /* 142: kc1 */ rxvt_s_kc1,
+ /* 143: kc3 */ rxvt_s_kc3,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ rxvt_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ rxvt_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ ABSENT_STRING,
+ /* 152: rmam */ ABSENT_STRING,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ rxvt_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ rxvt_s_kend,
+ /* 165: kent */ rxvt_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ rxvt_s_kfnd,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ rxvt_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ rxvt_s_kslt,
+ /* 194: kEND */ rxvt_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ rxvt_s_kHOM,
+ /* 200: kIC */ rxvt_s_kIC,
+ /* 201: kLFT */ rxvt_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ rxvt_s_kNXT,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ rxvt_s_kPRV,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ rxvt_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ rxvt_s_kf11,
+ /* 217: kf12 */ rxvt_s_kf12,
+ /* 218: kf13 */ rxvt_s_kf13,
+ /* 219: kf14 */ rxvt_s_kf14,
+ /* 220: kf15 */ rxvt_s_kf15,
+ /* 221: kf16 */ rxvt_s_kf16,
+ /* 222: kf17 */ rxvt_s_kf17,
+ /* 223: kf18 */ rxvt_s_kf18,
+ /* 224: kf19 */ rxvt_s_kf19,
+ /* 225: kf20 */ rxvt_s_kf20,
+ /* 226: kf21 */ rxvt_s_kf21,
+ /* 227: kf22 */ rxvt_s_kf22,
+ /* 228: kf23 */ rxvt_s_kf23,
+ /* 229: kf24 */ rxvt_s_kf24,
+ /* 230: kf25 */ rxvt_s_kf25,
+ /* 231: kf26 */ rxvt_s_kf26,
+ /* 232: kf27 */ rxvt_s_kf27,
+ /* 233: kf28 */ rxvt_s_kf28,
+ /* 234: kf29 */ rxvt_s_kf29,
+ /* 235: kf30 */ rxvt_s_kf30,
+ /* 236: kf31 */ rxvt_s_kf31,
+ /* 237: kf32 */ rxvt_s_kf32,
+ /* 238: kf33 */ rxvt_s_kf33,
+ /* 239: kf34 */ rxvt_s_kf34,
+ /* 240: kf35 */ rxvt_s_kf35,
+ /* 241: kf36 */ rxvt_s_kf36,
+ /* 242: kf37 */ rxvt_s_kf37,
+ /* 243: kf38 */ rxvt_s_kf38,
+ /* 244: kf39 */ rxvt_s_kf39,
+ /* 245: kf40 */ rxvt_s_kf40,
+ /* 246: kf41 */ rxvt_s_kf41,
+ /* 247: kf42 */ rxvt_s_kf42,
+ /* 248: kf43 */ rxvt_s_kf43,
+ /* 249: kf44 */ rxvt_s_kf44,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ rxvt_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ rxvt_s_u6,
+ /* 294: u7 */ rxvt_s_u7,
+ /* 295: u8 */ rxvt_s_u8,
+ /* 296: u9 */ rxvt_s_u9,
+ /* 297: op */ rxvt_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ rxvt_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ rxvt_s_setaf,
+ /* 360: setab */ rxvt_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ rxvt_s_s0ds,
+ /* 365: s1ds */ rxvt_s_s1ds,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* vt100 */
+
+static char vt100_alias_data[] = "vt100|vt100-am|dec vt100 (w/advanced video)";
+
+static char vt100_s_bel [] = "\007";
+static char vt100_s_cr [] = "\015";
+static char vt100_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char vt100_s_tbc [] = "\033[3g";
+static char vt100_s_clear [] = "\033[H\033[J$<50>";
+static char vt100_s_el [] = "\033[K$<3>";
+static char vt100_s_ed [] = "\033[J$<50>";
+static char vt100_s_cup [] = "\033[%i%p1%d;%p2%dH$<5>";
+static char vt100_s_cud1 [] = "\012";
+static char vt100_s_home [] = "\033[H";
+static char vt100_s_cub1 [] = "\010";
+static char vt100_s_cuf1 [] = "\033[C$<2>";
+static char vt100_s_cuu1 [] = "\033[A$<2>";
+static char vt100_s_smacs [] = "\016";
+static char vt100_s_blink [] = "\033[5m$<2>";
+static char vt100_s_bold [] = "\033[1m$<2>";
+static char vt100_s_rev [] = "\033[7m$<2>";
+static char vt100_s_smso [] = "\033[7m$<2>";
+static char vt100_s_smul [] = "\033[4m$<2>";
+static char vt100_s_rmacs [] = "\017";
+static char vt100_s_sgr0 [] = "\033[m\017$<2>";
+static char vt100_s_rmso [] = "\033[m$<2>";
+static char vt100_s_rmul [] = "\033[m$<2>";
+static char vt100_s_kbs [] = "\010";
+static char vt100_s_kcud1 [] = "\033OB";
+static char vt100_s_kf0 [] = "\033Oy";
+static char vt100_s_kf1 [] = "\033OP";
+static char vt100_s_kf10 [] = "\033Ox";
+static char vt100_s_kf2 [] = "\033OQ";
+static char vt100_s_kf3 [] = "\033OR";
+static char vt100_s_kf4 [] = "\033OS";
+static char vt100_s_kf5 [] = "\033Ot";
+static char vt100_s_kf6 [] = "\033Ou";
+static char vt100_s_kf7 [] = "\033Ov";
+static char vt100_s_kf8 [] = "\033Ol";
+static char vt100_s_kf9 [] = "\033Ow";
+static char vt100_s_kcub1 [] = "\033OD";
+static char vt100_s_kcuf1 [] = "\033OC";
+static char vt100_s_kcuu1 [] = "\033OA";
+static char vt100_s_rmkx [] = "\033[?1l\033>";
+static char vt100_s_smkx [] = "\033[?1h\033=";
+static char vt100_s_lf1 [] = "pf1";
+static char vt100_s_lf2 [] = "pf2";
+static char vt100_s_lf3 [] = "pf3";
+static char vt100_s_lf4 [] = "pf4";
+static char vt100_s_cud [] = "\033[%p1%dB";
+static char vt100_s_cub [] = "\033[%p1%dD";
+static char vt100_s_cuf [] = "\033[%p1%dC";
+static char vt100_s_cuu [] = "\033[%p1%dA";
+static char vt100_s_mc0 [] = "\033[0i";
+static char vt100_s_mc4 [] = "\033[4i";
+static char vt100_s_mc5 [] = "\033[5i";
+static char vt100_s_rs2 [] = "\033<\033>\033[?3;4;5l\033[?7;8h\033[r";
+static char vt100_s_rc [] = "\0338";
+static char vt100_s_sc [] = "\0337";
+static char vt100_s_ind [] = "\012";
+static char vt100_s_ri [] = "\033M$<5>";
+static char vt100_s_sgr [] = "\033[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<2>";
+static char vt100_s_hts [] = "\033H";
+static char vt100_s_ht [] = "\011";
+static char vt100_s_ka1 [] = "\033Oq";
+static char vt100_s_ka3 [] = "\033Os";
+static char vt100_s_kb2 [] = "\033Or";
+static char vt100_s_kc1 [] = "\033Op";
+static char vt100_s_kc3 [] = "\033On";
+static char vt100_s_acsc [] = "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char vt100_s_smam [] = "\033[?7h";
+static char vt100_s_rmam [] = "\033[?7l";
+static char vt100_s_enacs [] = "\033(B\033)0";
+static char vt100_s_kent [] = "\033OM";
+static char vt100_s_el1 [] = "\033[1K$<3>";
+
+static char vt100_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ FALSE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ FALSE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ TRUE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ TRUE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 vt100_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ 3,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ ABSENT_NUMERIC,
+ /* 14: pairs */ ABSENT_NUMERIC,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * vt100_string_data[] = {
+ /* 0: cbt */ ABSENT_STRING,
+ /* 1: bel */ vt100_s_bel,
+ /* 2: cr */ vt100_s_cr,
+ /* 3: csr */ vt100_s_csr,
+ /* 4: tbc */ vt100_s_tbc,
+ /* 5: clear */ vt100_s_clear,
+ /* 6: el */ vt100_s_el,
+ /* 7: ed */ vt100_s_ed,
+ /* 8: hpa */ ABSENT_STRING,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ vt100_s_cup,
+ /* 11: cud1 */ vt100_s_cud1,
+ /* 12: home */ vt100_s_home,
+ /* 13: civis */ ABSENT_STRING,
+ /* 14: cub1 */ vt100_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ ABSENT_STRING,
+ /* 17: cuf1 */ vt100_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ vt100_s_cuu1,
+ /* 20: cvvis */ ABSENT_STRING,
+ /* 21: dch1 */ ABSENT_STRING,
+ /* 22: dl1 */ ABSENT_STRING,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ vt100_s_smacs,
+ /* 26: blink */ vt100_s_blink,
+ /* 27: bold */ vt100_s_bold,
+ /* 28: smcup */ ABSENT_STRING,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ ABSENT_STRING,
+ /* 31: smir */ ABSENT_STRING,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ vt100_s_rev,
+ /* 35: smso */ vt100_s_smso,
+ /* 36: smul */ vt100_s_smul,
+ /* 37: ech */ ABSENT_STRING,
+ /* 38: rmacs */ vt100_s_rmacs,
+ /* 39: sgr0 */ vt100_s_sgr0,
+ /* 40: rmcup */ ABSENT_STRING,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ ABSENT_STRING,
+ /* 43: rmso */ vt100_s_rmso,
+ /* 44: rmul */ vt100_s_rmul,
+ /* 45: flash */ ABSENT_STRING,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ ABSENT_STRING,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ ABSENT_STRING,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ vt100_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ ABSENT_STRING,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ vt100_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ vt100_s_kf0,
+ /* 66: kf1 */ vt100_s_kf1,
+ /* 67: kf10 */ vt100_s_kf10,
+ /* 68: kf2 */ vt100_s_kf2,
+ /* 69: kf3 */ vt100_s_kf3,
+ /* 70: kf4 */ vt100_s_kf4,
+ /* 71: kf5 */ vt100_s_kf5,
+ /* 72: kf6 */ vt100_s_kf6,
+ /* 73: kf7 */ vt100_s_kf7,
+ /* 74: kf8 */ vt100_s_kf8,
+ /* 75: kf9 */ vt100_s_kf9,
+ /* 76: khome */ ABSENT_STRING,
+ /* 77: kich1 */ ABSENT_STRING,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ vt100_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ ABSENT_STRING,
+ /* 82: kpp */ ABSENT_STRING,
+ /* 83: kcuf1 */ vt100_s_kcuf1,
+ /* 84: kind */ ABSENT_STRING,
+ /* 85: kri */ ABSENT_STRING,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ vt100_s_kcuu1,
+ /* 88: rmkx */ vt100_s_rmkx,
+ /* 89: smkx */ vt100_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ vt100_s_lf1,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ vt100_s_lf2,
+ /* 94: lf3 */ vt100_s_lf3,
+ /* 95: lf4 */ vt100_s_lf4,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ ABSENT_STRING,
+ /* 106: dl */ ABSENT_STRING,
+ /* 107: cud */ vt100_s_cud,
+ /* 108: ich */ ABSENT_STRING,
+ /* 109: indn */ ABSENT_STRING,
+ /* 110: il */ ABSENT_STRING,
+ /* 111: cub */ vt100_s_cub,
+ /* 112: cuf */ vt100_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ vt100_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ vt100_s_mc0,
+ /* 119: mc4 */ vt100_s_mc4,
+ /* 120: mc5 */ vt100_s_mc5,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ ABSENT_STRING,
+ /* 123: rs2 */ vt100_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ vt100_s_rc,
+ /* 127: vpa */ ABSENT_STRING,
+ /* 128: sc */ vt100_s_sc,
+ /* 129: ind */ vt100_s_ind,
+ /* 130: ri */ vt100_s_ri,
+ /* 131: sgr */ vt100_s_sgr,
+ /* 132: hts */ vt100_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ vt100_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ vt100_s_ka1,
+ /* 140: ka3 */ vt100_s_ka3,
+ /* 141: kb2 */ vt100_s_kb2,
+ /* 142: kc1 */ vt100_s_kc1,
+ /* 143: kc3 */ vt100_s_kc3,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ vt100_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ ABSENT_STRING,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ vt100_s_smam,
+ /* 152: rmam */ vt100_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ vt100_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ ABSENT_STRING,
+ /* 165: kent */ vt100_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ ABSENT_STRING,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ ABSENT_STRING,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ ABSENT_STRING,
+ /* 200: kIC */ ABSENT_STRING,
+ /* 201: kLFT */ ABSENT_STRING,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ ABSENT_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ ABSENT_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ ABSENT_STRING,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ ABSENT_STRING,
+ /* 217: kf12 */ ABSENT_STRING,
+ /* 218: kf13 */ ABSENT_STRING,
+ /* 219: kf14 */ ABSENT_STRING,
+ /* 220: kf15 */ ABSENT_STRING,
+ /* 221: kf16 */ ABSENT_STRING,
+ /* 222: kf17 */ ABSENT_STRING,
+ /* 223: kf18 */ ABSENT_STRING,
+ /* 224: kf19 */ ABSENT_STRING,
+ /* 225: kf20 */ ABSENT_STRING,
+ /* 226: kf21 */ ABSENT_STRING,
+ /* 227: kf22 */ ABSENT_STRING,
+ /* 228: kf23 */ ABSENT_STRING,
+ /* 229: kf24 */ ABSENT_STRING,
+ /* 230: kf25 */ ABSENT_STRING,
+ /* 231: kf26 */ ABSENT_STRING,
+ /* 232: kf27 */ ABSENT_STRING,
+ /* 233: kf28 */ ABSENT_STRING,
+ /* 234: kf29 */ ABSENT_STRING,
+ /* 235: kf30 */ ABSENT_STRING,
+ /* 236: kf31 */ ABSENT_STRING,
+ /* 237: kf32 */ ABSENT_STRING,
+ /* 238: kf33 */ ABSENT_STRING,
+ /* 239: kf34 */ ABSENT_STRING,
+ /* 240: kf35 */ ABSENT_STRING,
+ /* 241: kf36 */ ABSENT_STRING,
+ /* 242: kf37 */ ABSENT_STRING,
+ /* 243: kf38 */ ABSENT_STRING,
+ /* 244: kf39 */ ABSENT_STRING,
+ /* 245: kf40 */ ABSENT_STRING,
+ /* 246: kf41 */ ABSENT_STRING,
+ /* 247: kf42 */ ABSENT_STRING,
+ /* 248: kf43 */ ABSENT_STRING,
+ /* 249: kf44 */ ABSENT_STRING,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ vt100_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ ABSENT_STRING,
+ /* 294: u7 */ ABSENT_STRING,
+ /* 295: u8 */ ABSENT_STRING,
+ /* 296: u9 */ ABSENT_STRING,
+ /* 297: op */ ABSENT_STRING,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ ABSENT_STRING,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ ABSENT_STRING,
+ /* 360: setab */ ABSENT_STRING,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* xterm */
+
+static char xterm_alias_data[] = "xterm|xterm terminal emulator (X Window System)";
+
+static char xterm_s_cbt [] = "\033[Z";
+static char xterm_s_bel [] = "\007";
+static char xterm_s_cr [] = "\015";
+static char xterm_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char xterm_s_tbc [] = "\033[3g";
+static char xterm_s_clear [] = "\033[H\033[2J";
+static char xterm_s_el [] = "\033[K";
+static char xterm_s_ed [] = "\033[J";
+static char xterm_s_hpa [] = "\033[%i%p1%dG";
+static char xterm_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char xterm_s_cud1 [] = "\012";
+static char xterm_s_home [] = "\033[H";
+static char xterm_s_civis [] = "\033[?25l";
+static char xterm_s_cub1 [] = "\010";
+static char xterm_s_cnorm [] = "\033[?12l\033[?25h";
+static char xterm_s_cuf1 [] = "\033[C";
+static char xterm_s_cuu1 [] = "\033[A";
+static char xterm_s_cvvis [] = "\033[?12;25h";
+static char xterm_s_dch1 [] = "\033[P";
+static char xterm_s_dl1 [] = "\033[M";
+static char xterm_s_smacs [] = "\033(0";
+static char xterm_s_blink [] = "\033[5m";
+static char xterm_s_bold [] = "\033[1m";
+static char xterm_s_smcup [] = "\033[?1049h\033[22;0;0t";
+static char xterm_s_dim [] = "\033[2m";
+static char xterm_s_smir [] = "\033[4h";
+static char xterm_s_invis [] = "\033[8m";
+static char xterm_s_rev [] = "\033[7m";
+static char xterm_s_smso [] = "\033[7m";
+static char xterm_s_smul [] = "\033[4m";
+static char xterm_s_ech [] = "\033[%p1%dX";
+static char xterm_s_rmacs [] = "\033(B";
+static char xterm_s_sgr0 [] = "\033(B\033[m";
+static char xterm_s_rmcup [] = "\033[?1049l\033[23;0;0t";
+static char xterm_s_rmir [] = "\033[4l";
+static char xterm_s_rmso [] = "\033[27m";
+static char xterm_s_rmul [] = "\033[24m";
+static char xterm_s_flash [] = "\033[?5h$<100/>\033[?5l";
+static char xterm_s_is2 [] = "\033[!p\033[?3;4l\033[4l\033>";
+static char xterm_s_il1 [] = "\033[L";
+static char xterm_s_kbs [] = "\010";
+static char xterm_s_kdch1 [] = "\033[3~";
+static char xterm_s_kcud1 [] = "\033OB";
+static char xterm_s_kf1 [] = "\033OP";
+static char xterm_s_kf10 [] = "\033[21~";
+static char xterm_s_kf2 [] = "\033OQ";
+static char xterm_s_kf3 [] = "\033OR";
+static char xterm_s_kf4 [] = "\033OS";
+static char xterm_s_kf5 [] = "\033[15~";
+static char xterm_s_kf6 [] = "\033[17~";
+static char xterm_s_kf7 [] = "\033[18~";
+static char xterm_s_kf8 [] = "\033[19~";
+static char xterm_s_kf9 [] = "\033[20~";
+static char xterm_s_khome [] = "\033OH";
+static char xterm_s_kich1 [] = "\033[2~";
+static char xterm_s_kcub1 [] = "\033OD";
+static char xterm_s_knp [] = "\033[6~";
+static char xterm_s_kpp [] = "\033[5~";
+static char xterm_s_kcuf1 [] = "\033OC";
+static char xterm_s_kind [] = "\033[1;2B";
+static char xterm_s_kri [] = "\033[1;2A";
+static char xterm_s_kcuu1 [] = "\033OA";
+static char xterm_s_rmkx [] = "\033[?1l\033>";
+static char xterm_s_smkx [] = "\033[?1h\033=";
+static char xterm_s_rmm [] = "\033[?1034l";
+static char xterm_s_smm [] = "\033[?1034h";
+static char xterm_s_dch [] = "\033[%p1%dP";
+static char xterm_s_dl [] = "\033[%p1%dM";
+static char xterm_s_cud [] = "\033[%p1%dB";
+static char xterm_s_ich [] = "\033[%p1%d@";
+static char xterm_s_indn [] = "\033[%p1%dS";
+static char xterm_s_il [] = "\033[%p1%dL";
+static char xterm_s_cub [] = "\033[%p1%dD";
+static char xterm_s_cuf [] = "\033[%p1%dC";
+static char xterm_s_rin [] = "\033[%p1%dT";
+static char xterm_s_cuu [] = "\033[%p1%dA";
+static char xterm_s_mc0 [] = "\033[i";
+static char xterm_s_mc4 [] = "\033[4i";
+static char xterm_s_mc5 [] = "\033[5i";
+static char xterm_s_rep [] = "%p1%c\033[%p2%{1}%-%db";
+static char xterm_s_rs1 [] = "\033c";
+static char xterm_s_rs2 [] = "\033[!p\033[?3;4l\033[4l\033>";
+static char xterm_s_rc [] = "\0338";
+static char xterm_s_vpa [] = "\033[%i%p1%dd";
+static char xterm_s_sc [] = "\0337";
+static char xterm_s_ind [] = "\012";
+static char xterm_s_ri [] = "\033M";
+static char xterm_s_sgr [] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m";
+static char xterm_s_hts [] = "\033H";
+static char xterm_s_ht [] = "\011";
+static char xterm_s_kb2 [] = "\033OE";
+static char xterm_s_acsc [] = "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char xterm_s_kcbt [] = "\033[Z";
+static char xterm_s_smam [] = "\033[?7h";
+static char xterm_s_rmam [] = "\033[?7l";
+static char xterm_s_kend [] = "\033OF";
+static char xterm_s_kent [] = "\033OM";
+static char xterm_s_kDC [] = "\033[3;2~";
+static char xterm_s_kEND [] = "\033[1;2F";
+static char xterm_s_kHOM [] = "\033[1;2H";
+static char xterm_s_kIC [] = "\033[2;2~";
+static char xterm_s_kLFT [] = "\033[1;2D";
+static char xterm_s_kNXT [] = "\033[6;2~";
+static char xterm_s_kPRV [] = "\033[5;2~";
+static char xterm_s_kRIT [] = "\033[1;2C";
+static char xterm_s_kf11 [] = "\033[23~";
+static char xterm_s_kf12 [] = "\033[24~";
+static char xterm_s_kf13 [] = "\033[1;2P";
+static char xterm_s_kf14 [] = "\033[1;2Q";
+static char xterm_s_kf15 [] = "\033[1;2R";
+static char xterm_s_kf16 [] = "\033[1;2S";
+static char xterm_s_kf17 [] = "\033[15;2~";
+static char xterm_s_kf18 [] = "\033[17;2~";
+static char xterm_s_kf19 [] = "\033[18;2~";
+static char xterm_s_kf20 [] = "\033[19;2~";
+static char xterm_s_kf21 [] = "\033[20;2~";
+static char xterm_s_kf22 [] = "\033[21;2~";
+static char xterm_s_kf23 [] = "\033[23;2~";
+static char xterm_s_kf24 [] = "\033[24;2~";
+static char xterm_s_kf25 [] = "\033[1;5P";
+static char xterm_s_kf26 [] = "\033[1;5Q";
+static char xterm_s_kf27 [] = "\033[1;5R";
+static char xterm_s_kf28 [] = "\033[1;5S";
+static char xterm_s_kf29 [] = "\033[15;5~";
+static char xterm_s_kf30 [] = "\033[17;5~";
+static char xterm_s_kf31 [] = "\033[18;5~";
+static char xterm_s_kf32 [] = "\033[19;5~";
+static char xterm_s_kf33 [] = "\033[20;5~";
+static char xterm_s_kf34 [] = "\033[21;5~";
+static char xterm_s_kf35 [] = "\033[23;5~";
+static char xterm_s_kf36 [] = "\033[24;5~";
+static char xterm_s_kf37 [] = "\033[1;6P";
+static char xterm_s_kf38 [] = "\033[1;6Q";
+static char xterm_s_kf39 [] = "\033[1;6R";
+static char xterm_s_kf40 [] = "\033[1;6S";
+static char xterm_s_kf41 [] = "\033[15;6~";
+static char xterm_s_kf42 [] = "\033[17;6~";
+static char xterm_s_kf43 [] = "\033[18;6~";
+static char xterm_s_kf44 [] = "\033[19;6~";
+static char xterm_s_kf45 [] = "\033[20;6~";
+static char xterm_s_kf46 [] = "\033[21;6~";
+static char xterm_s_kf47 [] = "\033[23;6~";
+static char xterm_s_kf48 [] = "\033[24;6~";
+static char xterm_s_kf49 [] = "\033[1;3P";
+static char xterm_s_kf50 [] = "\033[1;3Q";
+static char xterm_s_kf51 [] = "\033[1;3R";
+static char xterm_s_kf52 [] = "\033[1;3S";
+static char xterm_s_kf53 [] = "\033[15;3~";
+static char xterm_s_kf54 [] = "\033[17;3~";
+static char xterm_s_kf55 [] = "\033[18;3~";
+static char xterm_s_kf56 [] = "\033[19;3~";
+static char xterm_s_kf57 [] = "\033[20;3~";
+static char xterm_s_kf58 [] = "\033[21;3~";
+static char xterm_s_kf59 [] = "\033[23;3~";
+static char xterm_s_kf60 [] = "\033[24;3~";
+static char xterm_s_kf61 [] = "\033[1;4P";
+static char xterm_s_kf62 [] = "\033[1;4Q";
+static char xterm_s_kf63 [] = "\033[1;4R";
+static char xterm_s_el1 [] = "\033[1K";
+static char xterm_s_u6 [] = "\033[%i%d;%dR";
+static char xterm_s_u7 [] = "\033[6n";
+static char xterm_s_u8 [] = "\033[?%[;0123456789]c";
+static char xterm_s_u9 [] = "\033[c";
+static char xterm_s_op [] = "\033[39;49m";
+static char xterm_s_setf [] = "\033[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m";
+static char xterm_s_setb [] = "\033[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m";
+static char xterm_s_sitm [] = "\033[3m";
+static char xterm_s_ritm [] = "\033[23m";
+static char xterm_s_kmous [] = "\033[<";
+static char xterm_s_setaf [] = "\033[3%p1%dm";
+static char xterm_s_setab [] = "\033[4%p1%dm";
+static char xterm_s_meml [] = "\033l";
+static char xterm_s_memu [] = "\033m";
+
+static char xterm_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ TRUE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ TRUE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ TRUE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 xterm_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * xterm_string_data[] = {
+ /* 0: cbt */ xterm_s_cbt,
+ /* 1: bel */ xterm_s_bel,
+ /* 2: cr */ xterm_s_cr,
+ /* 3: csr */ xterm_s_csr,
+ /* 4: tbc */ xterm_s_tbc,
+ /* 5: clear */ xterm_s_clear,
+ /* 6: el */ xterm_s_el,
+ /* 7: ed */ xterm_s_ed,
+ /* 8: hpa */ xterm_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ xterm_s_cup,
+ /* 11: cud1 */ xterm_s_cud1,
+ /* 12: home */ xterm_s_home,
+ /* 13: civis */ xterm_s_civis,
+ /* 14: cub1 */ xterm_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ xterm_s_cnorm,
+ /* 17: cuf1 */ xterm_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ xterm_s_cuu1,
+ /* 20: cvvis */ xterm_s_cvvis,
+ /* 21: dch1 */ xterm_s_dch1,
+ /* 22: dl1 */ xterm_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ xterm_s_smacs,
+ /* 26: blink */ xterm_s_blink,
+ /* 27: bold */ xterm_s_bold,
+ /* 28: smcup */ xterm_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ xterm_s_dim,
+ /* 31: smir */ xterm_s_smir,
+ /* 32: invis */ xterm_s_invis,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ xterm_s_rev,
+ /* 35: smso */ xterm_s_smso,
+ /* 36: smul */ xterm_s_smul,
+ /* 37: ech */ xterm_s_ech,
+ /* 38: rmacs */ xterm_s_rmacs,
+ /* 39: sgr0 */ xterm_s_sgr0,
+ /* 40: rmcup */ xterm_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ xterm_s_rmir,
+ /* 43: rmso */ xterm_s_rmso,
+ /* 44: rmul */ xterm_s_rmul,
+ /* 45: flash */ xterm_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ xterm_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ xterm_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ xterm_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ xterm_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ xterm_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ xterm_s_kf1,
+ /* 67: kf10 */ xterm_s_kf10,
+ /* 68: kf2 */ xterm_s_kf2,
+ /* 69: kf3 */ xterm_s_kf3,
+ /* 70: kf4 */ xterm_s_kf4,
+ /* 71: kf5 */ xterm_s_kf5,
+ /* 72: kf6 */ xterm_s_kf6,
+ /* 73: kf7 */ xterm_s_kf7,
+ /* 74: kf8 */ xterm_s_kf8,
+ /* 75: kf9 */ xterm_s_kf9,
+ /* 76: khome */ xterm_s_khome,
+ /* 77: kich1 */ xterm_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ xterm_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ xterm_s_knp,
+ /* 82: kpp */ xterm_s_kpp,
+ /* 83: kcuf1 */ xterm_s_kcuf1,
+ /* 84: kind */ xterm_s_kind,
+ /* 85: kri */ xterm_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ xterm_s_kcuu1,
+ /* 88: rmkx */ xterm_s_rmkx,
+ /* 89: smkx */ xterm_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ xterm_s_rmm,
+ /* 102: smm */ xterm_s_smm,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ xterm_s_dch,
+ /* 106: dl */ xterm_s_dl,
+ /* 107: cud */ xterm_s_cud,
+ /* 108: ich */ xterm_s_ich,
+ /* 109: indn */ xterm_s_indn,
+ /* 110: il */ xterm_s_il,
+ /* 111: cub */ xterm_s_cub,
+ /* 112: cuf */ xterm_s_cuf,
+ /* 113: rin */ xterm_s_rin,
+ /* 114: cuu */ xterm_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ xterm_s_mc0,
+ /* 119: mc4 */ xterm_s_mc4,
+ /* 120: mc5 */ xterm_s_mc5,
+ /* 121: rep */ xterm_s_rep,
+ /* 122: rs1 */ xterm_s_rs1,
+ /* 123: rs2 */ xterm_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ xterm_s_rc,
+ /* 127: vpa */ xterm_s_vpa,
+ /* 128: sc */ xterm_s_sc,
+ /* 129: ind */ xterm_s_ind,
+ /* 130: ri */ xterm_s_ri,
+ /* 131: sgr */ xterm_s_sgr,
+ /* 132: hts */ xterm_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ xterm_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ xterm_s_kb2,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ xterm_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ xterm_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ xterm_s_smam,
+ /* 152: rmam */ xterm_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ ABSENT_STRING,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ xterm_s_kend,
+ /* 165: kent */ xterm_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ xterm_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ xterm_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ xterm_s_kHOM,
+ /* 200: kIC */ xterm_s_kIC,
+ /* 201: kLFT */ xterm_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ xterm_s_kNXT,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ xterm_s_kPRV,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ xterm_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ xterm_s_kf11,
+ /* 217: kf12 */ xterm_s_kf12,
+ /* 218: kf13 */ xterm_s_kf13,
+ /* 219: kf14 */ xterm_s_kf14,
+ /* 220: kf15 */ xterm_s_kf15,
+ /* 221: kf16 */ xterm_s_kf16,
+ /* 222: kf17 */ xterm_s_kf17,
+ /* 223: kf18 */ xterm_s_kf18,
+ /* 224: kf19 */ xterm_s_kf19,
+ /* 225: kf20 */ xterm_s_kf20,
+ /* 226: kf21 */ xterm_s_kf21,
+ /* 227: kf22 */ xterm_s_kf22,
+ /* 228: kf23 */ xterm_s_kf23,
+ /* 229: kf24 */ xterm_s_kf24,
+ /* 230: kf25 */ xterm_s_kf25,
+ /* 231: kf26 */ xterm_s_kf26,
+ /* 232: kf27 */ xterm_s_kf27,
+ /* 233: kf28 */ xterm_s_kf28,
+ /* 234: kf29 */ xterm_s_kf29,
+ /* 235: kf30 */ xterm_s_kf30,
+ /* 236: kf31 */ xterm_s_kf31,
+ /* 237: kf32 */ xterm_s_kf32,
+ /* 238: kf33 */ xterm_s_kf33,
+ /* 239: kf34 */ xterm_s_kf34,
+ /* 240: kf35 */ xterm_s_kf35,
+ /* 241: kf36 */ xterm_s_kf36,
+ /* 242: kf37 */ xterm_s_kf37,
+ /* 243: kf38 */ xterm_s_kf38,
+ /* 244: kf39 */ xterm_s_kf39,
+ /* 245: kf40 */ xterm_s_kf40,
+ /* 246: kf41 */ xterm_s_kf41,
+ /* 247: kf42 */ xterm_s_kf42,
+ /* 248: kf43 */ xterm_s_kf43,
+ /* 249: kf44 */ xterm_s_kf44,
+ /* 250: kf45 */ xterm_s_kf45,
+ /* 251: kf46 */ xterm_s_kf46,
+ /* 252: kf47 */ xterm_s_kf47,
+ /* 253: kf48 */ xterm_s_kf48,
+ /* 254: kf49 */ xterm_s_kf49,
+ /* 255: kf50 */ xterm_s_kf50,
+ /* 256: kf51 */ xterm_s_kf51,
+ /* 257: kf52 */ xterm_s_kf52,
+ /* 258: kf53 */ xterm_s_kf53,
+ /* 259: kf54 */ xterm_s_kf54,
+ /* 260: kf55 */ xterm_s_kf55,
+ /* 261: kf56 */ xterm_s_kf56,
+ /* 262: kf57 */ xterm_s_kf57,
+ /* 263: kf58 */ xterm_s_kf58,
+ /* 264: kf59 */ xterm_s_kf59,
+ /* 265: kf60 */ xterm_s_kf60,
+ /* 266: kf61 */ xterm_s_kf61,
+ /* 267: kf62 */ xterm_s_kf62,
+ /* 268: kf63 */ xterm_s_kf63,
+ /* 269: el1 */ xterm_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ xterm_s_u6,
+ /* 294: u7 */ xterm_s_u7,
+ /* 295: u8 */ xterm_s_u8,
+ /* 296: u9 */ xterm_s_u9,
+ /* 297: op */ xterm_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ xterm_s_setf,
+ /* 303: setb */ xterm_s_setb,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ xterm_s_sitm,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ xterm_s_ritm,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ xterm_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ xterm_s_setaf,
+ /* 360: setab */ xterm_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ xterm_s_meml,
+ /* 412: memu */ xterm_s_memu,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* xterm-256color */
+
+static char xterm_256color_alias_data[] = "xterm-256color|xterm with 256 colors";
+
+static char xterm_256color_s_cbt[] = "\033[Z";
+static char xterm_256color_s_bel[] = "\007";
+static char xterm_256color_s_cr [] = "\015";
+static char xterm_256color_s_csr[] = "\033[%i%p1%d;%p2%dr";
+static char xterm_256color_s_tbc[] = "\033[3g";
+static char xterm_256color_s_clear[] = "\033[H\033[2J";
+static char xterm_256color_s_el [] = "\033[K";
+static char xterm_256color_s_ed [] = "\033[J";
+static char xterm_256color_s_hpa[] = "\033[%i%p1%dG";
+static char xterm_256color_s_cup[] = "\033[%i%p1%d;%p2%dH";
+static char xterm_256color_s_cud1[] = "\012";
+static char xterm_256color_s_home[] = "\033[H";
+static char xterm_256color_s_civis[] = "\033[?25l";
+static char xterm_256color_s_cub1[] = "\010";
+static char xterm_256color_s_cnorm[] = "\033[?12l\033[?25h";
+static char xterm_256color_s_cuf1[] = "\033[C";
+static char xterm_256color_s_cuu1[] = "\033[A";
+static char xterm_256color_s_cvvis[] = "\033[?12;25h";
+static char xterm_256color_s_dch1[] = "\033[P";
+static char xterm_256color_s_dl1[] = "\033[M";
+static char xterm_256color_s_smacs[] = "\033(0";
+static char xterm_256color_s_blink[] = "\033[5m";
+static char xterm_256color_s_bold[] = "\033[1m";
+static char xterm_256color_s_smcup[] = "\033[?1049h\033[22;0;0t";
+static char xterm_256color_s_dim[] = "\033[2m";
+static char xterm_256color_s_smir[] = "\033[4h";
+static char xterm_256color_s_invis[] = "\033[8m";
+static char xterm_256color_s_rev[] = "\033[7m";
+static char xterm_256color_s_smso[] = "\033[7m";
+static char xterm_256color_s_smul[] = "\033[4m";
+static char xterm_256color_s_ech[] = "\033[%p1%dX";
+static char xterm_256color_s_rmacs[] = "\033(B";
+static char xterm_256color_s_sgr0[] = "\033(B\033[m";
+static char xterm_256color_s_rmcup[] = "\033[?1049l\033[23;0;0t";
+static char xterm_256color_s_rmir[] = "\033[4l";
+static char xterm_256color_s_rmso[] = "\033[27m";
+static char xterm_256color_s_rmul[] = "\033[24m";
+static char xterm_256color_s_flash[] = "\033[?5h$<100/>\033[?5l";
+static char xterm_256color_s_is2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char xterm_256color_s_il1[] = "\033[L";
+static char xterm_256color_s_kbs[] = "\010";
+static char xterm_256color_s_kdch1[] = "\033[3~";
+static char xterm_256color_s_kcud1[] = "\033OB";
+static char xterm_256color_s_kf1[] = "\033OP";
+static char xterm_256color_s_kf10[] = "\033[21~";
+static char xterm_256color_s_kf2[] = "\033OQ";
+static char xterm_256color_s_kf3[] = "\033OR";
+static char xterm_256color_s_kf4[] = "\033OS";
+static char xterm_256color_s_kf5[] = "\033[15~";
+static char xterm_256color_s_kf6[] = "\033[17~";
+static char xterm_256color_s_kf7[] = "\033[18~";
+static char xterm_256color_s_kf8[] = "\033[19~";
+static char xterm_256color_s_kf9[] = "\033[20~";
+static char xterm_256color_s_khome[] = "\033OH";
+static char xterm_256color_s_kich1[] = "\033[2~";
+static char xterm_256color_s_kcub1[] = "\033OD";
+static char xterm_256color_s_knp[] = "\033[6~";
+static char xterm_256color_s_kpp[] = "\033[5~";
+static char xterm_256color_s_kcuf1[] = "\033OC";
+static char xterm_256color_s_kind[] = "\033[1;2B";
+static char xterm_256color_s_kri[] = "\033[1;2A";
+static char xterm_256color_s_kcuu1[] = "\033OA";
+static char xterm_256color_s_rmkx[] = "\033[?1l\033>";
+static char xterm_256color_s_smkx[] = "\033[?1h\033=";
+static char xterm_256color_s_rmm[] = "\033[?1034l";
+static char xterm_256color_s_smm[] = "\033[?1034h";
+static char xterm_256color_s_dch[] = "\033[%p1%dP";
+static char xterm_256color_s_dl [] = "\033[%p1%dM";
+static char xterm_256color_s_cud[] = "\033[%p1%dB";
+static char xterm_256color_s_ich[] = "\033[%p1%d@";
+static char xterm_256color_s_indn[] = "\033[%p1%dS";
+static char xterm_256color_s_il [] = "\033[%p1%dL";
+static char xterm_256color_s_cub[] = "\033[%p1%dD";
+static char xterm_256color_s_cuf[] = "\033[%p1%dC";
+static char xterm_256color_s_rin[] = "\033[%p1%dT";
+static char xterm_256color_s_cuu[] = "\033[%p1%dA";
+static char xterm_256color_s_mc0[] = "\033[i";
+static char xterm_256color_s_mc4[] = "\033[4i";
+static char xterm_256color_s_mc5[] = "\033[5i";
+static char xterm_256color_s_rep[] = "%p1%c\033[%p2%{1}%-%db";
+static char xterm_256color_s_rs1[] = "\033c\033]104\007";
+static char xterm_256color_s_rs2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char xterm_256color_s_rc [] = "\0338";
+static char xterm_256color_s_vpa[] = "\033[%i%p1%dd";
+static char xterm_256color_s_sc [] = "\0337";
+static char xterm_256color_s_ind[] = "\012";
+static char xterm_256color_s_ri [] = "\033M";
+static char xterm_256color_s_sgr[] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m";
+static char xterm_256color_s_hts[] = "\033H";
+static char xterm_256color_s_ht [] = "\011";
+static char xterm_256color_s_kb2[] = "\033OE";
+static char xterm_256color_s_acsc[] = "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char xterm_256color_s_kcbt[] = "\033[Z";
+static char xterm_256color_s_smam[] = "\033[?7h";
+static char xterm_256color_s_rmam[] = "\033[?7l";
+static char xterm_256color_s_kend[] = "\033OF";
+static char xterm_256color_s_kent[] = "\033OM";
+static char xterm_256color_s_kDC[] = "\033[3;2~";
+static char xterm_256color_s_kEND[] = "\033[1;2F";
+static char xterm_256color_s_kHOM[] = "\033[1;2H";
+static char xterm_256color_s_kIC[] = "\033[2;2~";
+static char xterm_256color_s_kLFT[] = "\033[1;2D";
+static char xterm_256color_s_kNXT[] = "\033[6;2~";
+static char xterm_256color_s_kPRV[] = "\033[5;2~";
+static char xterm_256color_s_kRIT[] = "\033[1;2C";
+static char xterm_256color_s_kf11[] = "\033[23~";
+static char xterm_256color_s_kf12[] = "\033[24~";
+static char xterm_256color_s_kf13[] = "\033[1;2P";
+static char xterm_256color_s_kf14[] = "\033[1;2Q";
+static char xterm_256color_s_kf15[] = "\033[1;2R";
+static char xterm_256color_s_kf16[] = "\033[1;2S";
+static char xterm_256color_s_kf17[] = "\033[15;2~";
+static char xterm_256color_s_kf18[] = "\033[17;2~";
+static char xterm_256color_s_kf19[] = "\033[18;2~";
+static char xterm_256color_s_kf20[] = "\033[19;2~";
+static char xterm_256color_s_kf21[] = "\033[20;2~";
+static char xterm_256color_s_kf22[] = "\033[21;2~";
+static char xterm_256color_s_kf23[] = "\033[23;2~";
+static char xterm_256color_s_kf24[] = "\033[24;2~";
+static char xterm_256color_s_kf25[] = "\033[1;5P";
+static char xterm_256color_s_kf26[] = "\033[1;5Q";
+static char xterm_256color_s_kf27[] = "\033[1;5R";
+static char xterm_256color_s_kf28[] = "\033[1;5S";
+static char xterm_256color_s_kf29[] = "\033[15;5~";
+static char xterm_256color_s_kf30[] = "\033[17;5~";
+static char xterm_256color_s_kf31[] = "\033[18;5~";
+static char xterm_256color_s_kf32[] = "\033[19;5~";
+static char xterm_256color_s_kf33[] = "\033[20;5~";
+static char xterm_256color_s_kf34[] = "\033[21;5~";
+static char xterm_256color_s_kf35[] = "\033[23;5~";
+static char xterm_256color_s_kf36[] = "\033[24;5~";
+static char xterm_256color_s_kf37[] = "\033[1;6P";
+static char xterm_256color_s_kf38[] = "\033[1;6Q";
+static char xterm_256color_s_kf39[] = "\033[1;6R";
+static char xterm_256color_s_kf40[] = "\033[1;6S";
+static char xterm_256color_s_kf41[] = "\033[15;6~";
+static char xterm_256color_s_kf42[] = "\033[17;6~";
+static char xterm_256color_s_kf43[] = "\033[18;6~";
+static char xterm_256color_s_kf44[] = "\033[19;6~";
+static char xterm_256color_s_kf45[] = "\033[20;6~";
+static char xterm_256color_s_kf46[] = "\033[21;6~";
+static char xterm_256color_s_kf47[] = "\033[23;6~";
+static char xterm_256color_s_kf48[] = "\033[24;6~";
+static char xterm_256color_s_kf49[] = "\033[1;3P";
+static char xterm_256color_s_kf50[] = "\033[1;3Q";
+static char xterm_256color_s_kf51[] = "\033[1;3R";
+static char xterm_256color_s_kf52[] = "\033[1;3S";
+static char xterm_256color_s_kf53[] = "\033[15;3~";
+static char xterm_256color_s_kf54[] = "\033[17;3~";
+static char xterm_256color_s_kf55[] = "\033[18;3~";
+static char xterm_256color_s_kf56[] = "\033[19;3~";
+static char xterm_256color_s_kf57[] = "\033[20;3~";
+static char xterm_256color_s_kf58[] = "\033[21;3~";
+static char xterm_256color_s_kf59[] = "\033[23;3~";
+static char xterm_256color_s_kf60[] = "\033[24;3~";
+static char xterm_256color_s_kf61[] = "\033[1;4P";
+static char xterm_256color_s_kf62[] = "\033[1;4Q";
+static char xterm_256color_s_kf63[] = "\033[1;4R";
+static char xterm_256color_s_el1[] = "\033[1K";
+static char xterm_256color_s_u6 [] = "\033[%i%d;%dR";
+static char xterm_256color_s_u7 [] = "\033[6n";
+static char xterm_256color_s_u8 [] = "\033[?%[;0123456789]c";
+static char xterm_256color_s_u9 [] = "\033[c";
+static char xterm_256color_s_op [] = "\033[39;49m";
+static char xterm_256color_s_oc [] = "\033]104\007";
+static char xterm_256color_s_initc[] = "\033]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\033\134";
+static char xterm_256color_s_sitm[] = "\033[3m";
+static char xterm_256color_s_ritm[] = "\033[23m";
+static char xterm_256color_s_kmous[] = "\033[<";
+static char xterm_256color_s_setaf[] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m";
+static char xterm_256color_s_setab[] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m";
+static char xterm_256color_s_meml[] = "\033l";
+static char xterm_256color_s_memu[] = "\033m";
+
+static char xterm_256color_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ TRUE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ TRUE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ TRUE,
+ /* 28: bce */ TRUE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 xterm_256color_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 256,
+ /* 14: pairs */ 32767,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * xterm_256color_string_data[] = {
+ /* 0: cbt */ xterm_256color_s_cbt,
+ /* 1: bel */ xterm_256color_s_bel,
+ /* 2: cr */ xterm_256color_s_cr,
+ /* 3: csr */ xterm_256color_s_csr,
+ /* 4: tbc */ xterm_256color_s_tbc,
+ /* 5: clear */ xterm_256color_s_clear,
+ /* 6: el */ xterm_256color_s_el,
+ /* 7: ed */ xterm_256color_s_ed,
+ /* 8: hpa */ xterm_256color_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ xterm_256color_s_cup,
+ /* 11: cud1 */ xterm_256color_s_cud1,
+ /* 12: home */ xterm_256color_s_home,
+ /* 13: civis */ xterm_256color_s_civis,
+ /* 14: cub1 */ xterm_256color_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ xterm_256color_s_cnorm,
+ /* 17: cuf1 */ xterm_256color_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ xterm_256color_s_cuu1,
+ /* 20: cvvis */ xterm_256color_s_cvvis,
+ /* 21: dch1 */ xterm_256color_s_dch1,
+ /* 22: dl1 */ xterm_256color_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ xterm_256color_s_smacs,
+ /* 26: blink */ xterm_256color_s_blink,
+ /* 27: bold */ xterm_256color_s_bold,
+ /* 28: smcup */ xterm_256color_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ xterm_256color_s_dim,
+ /* 31: smir */ xterm_256color_s_smir,
+ /* 32: invis */ xterm_256color_s_invis,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ xterm_256color_s_rev,
+ /* 35: smso */ xterm_256color_s_smso,
+ /* 36: smul */ xterm_256color_s_smul,
+ /* 37: ech */ xterm_256color_s_ech,
+ /* 38: rmacs */ xterm_256color_s_rmacs,
+ /* 39: sgr0 */ xterm_256color_s_sgr0,
+ /* 40: rmcup */ xterm_256color_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ xterm_256color_s_rmir,
+ /* 43: rmso */ xterm_256color_s_rmso,
+ /* 44: rmul */ xterm_256color_s_rmul,
+ /* 45: flash */ xterm_256color_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ xterm_256color_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ xterm_256color_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ xterm_256color_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ xterm_256color_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ xterm_256color_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ xterm_256color_s_kf1,
+ /* 67: kf10 */ xterm_256color_s_kf10,
+ /* 68: kf2 */ xterm_256color_s_kf2,
+ /* 69: kf3 */ xterm_256color_s_kf3,
+ /* 70: kf4 */ xterm_256color_s_kf4,
+ /* 71: kf5 */ xterm_256color_s_kf5,
+ /* 72: kf6 */ xterm_256color_s_kf6,
+ /* 73: kf7 */ xterm_256color_s_kf7,
+ /* 74: kf8 */ xterm_256color_s_kf8,
+ /* 75: kf9 */ xterm_256color_s_kf9,
+ /* 76: khome */ xterm_256color_s_khome,
+ /* 77: kich1 */ xterm_256color_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ xterm_256color_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ xterm_256color_s_knp,
+ /* 82: kpp */ xterm_256color_s_kpp,
+ /* 83: kcuf1 */ xterm_256color_s_kcuf1,
+ /* 84: kind */ xterm_256color_s_kind,
+ /* 85: kri */ xterm_256color_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ xterm_256color_s_kcuu1,
+ /* 88: rmkx */ xterm_256color_s_rmkx,
+ /* 89: smkx */ xterm_256color_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ xterm_256color_s_rmm,
+ /* 102: smm */ xterm_256color_s_smm,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ xterm_256color_s_dch,
+ /* 106: dl */ xterm_256color_s_dl,
+ /* 107: cud */ xterm_256color_s_cud,
+ /* 108: ich */ xterm_256color_s_ich,
+ /* 109: indn */ xterm_256color_s_indn,
+ /* 110: il */ xterm_256color_s_il,
+ /* 111: cub */ xterm_256color_s_cub,
+ /* 112: cuf */ xterm_256color_s_cuf,
+ /* 113: rin */ xterm_256color_s_rin,
+ /* 114: cuu */ xterm_256color_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ xterm_256color_s_mc0,
+ /* 119: mc4 */ xterm_256color_s_mc4,
+ /* 120: mc5 */ xterm_256color_s_mc5,
+ /* 121: rep */ xterm_256color_s_rep,
+ /* 122: rs1 */ xterm_256color_s_rs1,
+ /* 123: rs2 */ xterm_256color_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ xterm_256color_s_rc,
+ /* 127: vpa */ xterm_256color_s_vpa,
+ /* 128: sc */ xterm_256color_s_sc,
+ /* 129: ind */ xterm_256color_s_ind,
+ /* 130: ri */ xterm_256color_s_ri,
+ /* 131: sgr */ xterm_256color_s_sgr,
+ /* 132: hts */ xterm_256color_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ xterm_256color_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ xterm_256color_s_kb2,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ xterm_256color_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ xterm_256color_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ xterm_256color_s_smam,
+ /* 152: rmam */ xterm_256color_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ ABSENT_STRING,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ xterm_256color_s_kend,
+ /* 165: kent */ xterm_256color_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ xterm_256color_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ xterm_256color_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ xterm_256color_s_kHOM,
+ /* 200: kIC */ xterm_256color_s_kIC,
+ /* 201: kLFT */ xterm_256color_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ xterm_256color_s_kNXT,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ xterm_256color_s_kPRV,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ xterm_256color_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ xterm_256color_s_kf11,
+ /* 217: kf12 */ xterm_256color_s_kf12,
+ /* 218: kf13 */ xterm_256color_s_kf13,
+ /* 219: kf14 */ xterm_256color_s_kf14,
+ /* 220: kf15 */ xterm_256color_s_kf15,
+ /* 221: kf16 */ xterm_256color_s_kf16,
+ /* 222: kf17 */ xterm_256color_s_kf17,
+ /* 223: kf18 */ xterm_256color_s_kf18,
+ /* 224: kf19 */ xterm_256color_s_kf19,
+ /* 225: kf20 */ xterm_256color_s_kf20,
+ /* 226: kf21 */ xterm_256color_s_kf21,
+ /* 227: kf22 */ xterm_256color_s_kf22,
+ /* 228: kf23 */ xterm_256color_s_kf23,
+ /* 229: kf24 */ xterm_256color_s_kf24,
+ /* 230: kf25 */ xterm_256color_s_kf25,
+ /* 231: kf26 */ xterm_256color_s_kf26,
+ /* 232: kf27 */ xterm_256color_s_kf27,
+ /* 233: kf28 */ xterm_256color_s_kf28,
+ /* 234: kf29 */ xterm_256color_s_kf29,
+ /* 235: kf30 */ xterm_256color_s_kf30,
+ /* 236: kf31 */ xterm_256color_s_kf31,
+ /* 237: kf32 */ xterm_256color_s_kf32,
+ /* 238: kf33 */ xterm_256color_s_kf33,
+ /* 239: kf34 */ xterm_256color_s_kf34,
+ /* 240: kf35 */ xterm_256color_s_kf35,
+ /* 241: kf36 */ xterm_256color_s_kf36,
+ /* 242: kf37 */ xterm_256color_s_kf37,
+ /* 243: kf38 */ xterm_256color_s_kf38,
+ /* 244: kf39 */ xterm_256color_s_kf39,
+ /* 245: kf40 */ xterm_256color_s_kf40,
+ /* 246: kf41 */ xterm_256color_s_kf41,
+ /* 247: kf42 */ xterm_256color_s_kf42,
+ /* 248: kf43 */ xterm_256color_s_kf43,
+ /* 249: kf44 */ xterm_256color_s_kf44,
+ /* 250: kf45 */ xterm_256color_s_kf45,
+ /* 251: kf46 */ xterm_256color_s_kf46,
+ /* 252: kf47 */ xterm_256color_s_kf47,
+ /* 253: kf48 */ xterm_256color_s_kf48,
+ /* 254: kf49 */ xterm_256color_s_kf49,
+ /* 255: kf50 */ xterm_256color_s_kf50,
+ /* 256: kf51 */ xterm_256color_s_kf51,
+ /* 257: kf52 */ xterm_256color_s_kf52,
+ /* 258: kf53 */ xterm_256color_s_kf53,
+ /* 259: kf54 */ xterm_256color_s_kf54,
+ /* 260: kf55 */ xterm_256color_s_kf55,
+ /* 261: kf56 */ xterm_256color_s_kf56,
+ /* 262: kf57 */ xterm_256color_s_kf57,
+ /* 263: kf58 */ xterm_256color_s_kf58,
+ /* 264: kf59 */ xterm_256color_s_kf59,
+ /* 265: kf60 */ xterm_256color_s_kf60,
+ /* 266: kf61 */ xterm_256color_s_kf61,
+ /* 267: kf62 */ xterm_256color_s_kf62,
+ /* 268: kf63 */ xterm_256color_s_kf63,
+ /* 269: el1 */ xterm_256color_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ xterm_256color_s_u6,
+ /* 294: u7 */ xterm_256color_s_u7,
+ /* 295: u8 */ xterm_256color_s_u8,
+ /* 296: u9 */ xterm_256color_s_u9,
+ /* 297: op */ xterm_256color_s_op,
+ /* 298: oc */ xterm_256color_s_oc,
+ /* 299: initc */ xterm_256color_s_initc,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ xterm_256color_s_sitm,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ xterm_256color_s_ritm,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ xterm_256color_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ xterm_256color_s_setaf,
+ /* 360: setab */ xterm_256color_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ xterm_256color_s_meml,
+ /* 412: memu */ xterm_256color_s_memu,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* screen */
+
+static char screen_alias_data[] = "screen|VT 100/ANSI X3.64 virtual terminal";
+
+static char screen_s_cbt [] = "\033[Z";
+static char screen_s_bel [] = "\007";
+static char screen_s_cr [] = "\015";
+static char screen_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char screen_s_tbc [] = "\033[3g";
+static char screen_s_clear [] = "\033[H\033[J";
+static char screen_s_el [] = "\033[K";
+static char screen_s_ed [] = "\033[J";
+static char screen_s_hpa [] = "\033[%i%p1%dG";
+static char screen_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char screen_s_cud1 [] = "\012";
+static char screen_s_home [] = "\033[H";
+static char screen_s_civis [] = "\033[?25l";
+static char screen_s_cub1 [] = "\010";
+static char screen_s_cnorm [] = "\033[34h\033[?25h";
+static char screen_s_cuf1 [] = "\033[C";
+static char screen_s_cuu1 [] = "\033M";
+static char screen_s_cvvis [] = "\033[34l";
+static char screen_s_dch1 [] = "\033[P";
+static char screen_s_dl1 [] = "\033[M";
+static char screen_s_smacs [] = "\016";
+static char screen_s_blink [] = "\033[5m";
+static char screen_s_bold [] = "\033[1m";
+static char screen_s_smcup [] = "\033[?1049h";
+static char screen_s_dim [] = "\033[2m";
+static char screen_s_smir [] = "\033[4h";
+static char screen_s_rev [] = "\033[7m";
+static char screen_s_smso [] = "\033[3m";
+static char screen_s_smul [] = "\033[4m";
+static char screen_s_rmacs [] = "\017";
+static char screen_s_sgr0 [] = "\033[m\017";
+static char screen_s_rmcup [] = "\033[?1049l";
+static char screen_s_rmir [] = "\033[4l";
+static char screen_s_rmso [] = "\033[23m";
+static char screen_s_rmul [] = "\033[24m";
+static char screen_s_flash [] = "\033g";
+static char screen_s_is2 [] = "\033)0";
+static char screen_s_il1 [] = "\033[L";
+static char screen_s_kbs [] = "\010";
+static char screen_s_kdch1 [] = "\033[3~";
+static char screen_s_kcud1 [] = "\033OB";
+static char screen_s_kf1 [] = "\033OP";
+static char screen_s_kf10 [] = "\033[21~";
+static char screen_s_kf2 [] = "\033OQ";
+static char screen_s_kf3 [] = "\033OR";
+static char screen_s_kf4 [] = "\033OS";
+static char screen_s_kf5 [] = "\033[15~";
+static char screen_s_kf6 [] = "\033[17~";
+static char screen_s_kf7 [] = "\033[18~";
+static char screen_s_kf8 [] = "\033[19~";
+static char screen_s_kf9 [] = "\033[20~";
+static char screen_s_khome [] = "\033[1~";
+static char screen_s_kich1 [] = "\033[2~";
+static char screen_s_kcub1 [] = "\033OD";
+static char screen_s_knp [] = "\033[6~";
+static char screen_s_kpp [] = "\033[5~";
+static char screen_s_kcuf1 [] = "\033OC";
+static char screen_s_kcuu1 [] = "\033OA";
+static char screen_s_rmkx [] = "\033[?1l\033>";
+static char screen_s_smkx [] = "\033[?1h\033=";
+static char screen_s_nel [] = "\033E";
+static char screen_s_dch [] = "\033[%p1%dP";
+static char screen_s_dl [] = "\033[%p1%dM";
+static char screen_s_cud [] = "\033[%p1%dB";
+static char screen_s_ich [] = "\033[%p1%d@";
+static char screen_s_indn [] = "\033[%p1%dS";
+static char screen_s_il [] = "\033[%p1%dL";
+static char screen_s_cub [] = "\033[%p1%dD";
+static char screen_s_cuf [] = "\033[%p1%dC";
+static char screen_s_cuu [] = "\033[%p1%dA";
+static char screen_s_rs2 [] = "\033c\033[?1000l\033[?25h";
+static char screen_s_rc [] = "\0338";
+static char screen_s_vpa [] = "\033[%i%p1%dd";
+static char screen_s_sc [] = "\0337";
+static char screen_s_ind [] = "\012";
+static char screen_s_ri [] = "\033M";
+static char screen_s_sgr [] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;";
+static char screen_s_hts [] = "\033H";
+static char screen_s_ht [] = "\011";
+static char screen_s_acsc [] = "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char screen_s_kcbt [] = "\033[Z";
+static char screen_s_enacs [] = "\033(B\033)0";
+static char screen_s_kend [] = "\033[4~";
+static char screen_s_kf11 [] = "\033[23~";
+static char screen_s_kf12 [] = "\033[24~";
+static char screen_s_el1 [] = "\033[1K";
+static char screen_s_op [] = "\033[39;49m";
+static char screen_s_kmous [] = "\033[M";
+static char screen_s_setaf [] = "\033[3%p1%dm";
+static char screen_s_setab [] = "\033[4%p1%dm";
+
+static char screen_bool_data[] = {
+ /* 0: bw */ FALSE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ FALSE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ TRUE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 screen_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ CANCELLED_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * screen_string_data[] = {
+ /* 0: cbt */ screen_s_cbt,
+ /* 1: bel */ screen_s_bel,
+ /* 2: cr */ screen_s_cr,
+ /* 3: csr */ screen_s_csr,
+ /* 4: tbc */ screen_s_tbc,
+ /* 5: clear */ screen_s_clear,
+ /* 6: el */ screen_s_el,
+ /* 7: ed */ screen_s_ed,
+ /* 8: hpa */ screen_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ screen_s_cup,
+ /* 11: cud1 */ screen_s_cud1,
+ /* 12: home */ screen_s_home,
+ /* 13: civis */ screen_s_civis,
+ /* 14: cub1 */ screen_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ screen_s_cnorm,
+ /* 17: cuf1 */ screen_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ screen_s_cuu1,
+ /* 20: cvvis */ screen_s_cvvis,
+ /* 21: dch1 */ screen_s_dch1,
+ /* 22: dl1 */ screen_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ screen_s_smacs,
+ /* 26: blink */ screen_s_blink,
+ /* 27: bold */ screen_s_bold,
+ /* 28: smcup */ screen_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ screen_s_dim,
+ /* 31: smir */ screen_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ screen_s_rev,
+ /* 35: smso */ screen_s_smso,
+ /* 36: smul */ screen_s_smul,
+ /* 37: ech */ ABSENT_STRING,
+ /* 38: rmacs */ screen_s_rmacs,
+ /* 39: sgr0 */ screen_s_sgr0,
+ /* 40: rmcup */ screen_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ screen_s_rmir,
+ /* 43: rmso */ screen_s_rmso,
+ /* 44: rmul */ screen_s_rmul,
+ /* 45: flash */ screen_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ screen_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ screen_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ screen_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ screen_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ screen_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ screen_s_kf1,
+ /* 67: kf10 */ screen_s_kf10,
+ /* 68: kf2 */ screen_s_kf2,
+ /* 69: kf3 */ screen_s_kf3,
+ /* 70: kf4 */ screen_s_kf4,
+ /* 71: kf5 */ screen_s_kf5,
+ /* 72: kf6 */ screen_s_kf6,
+ /* 73: kf7 */ screen_s_kf7,
+ /* 74: kf8 */ screen_s_kf8,
+ /* 75: kf9 */ screen_s_kf9,
+ /* 76: khome */ screen_s_khome,
+ /* 77: kich1 */ screen_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ screen_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ screen_s_knp,
+ /* 82: kpp */ screen_s_kpp,
+ /* 83: kcuf1 */ screen_s_kcuf1,
+ /* 84: kind */ ABSENT_STRING,
+ /* 85: kri */ ABSENT_STRING,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ screen_s_kcuu1,
+ /* 88: rmkx */ screen_s_rmkx,
+ /* 89: smkx */ screen_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ screen_s_nel,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ screen_s_dch,
+ /* 106: dl */ screen_s_dl,
+ /* 107: cud */ screen_s_cud,
+ /* 108: ich */ screen_s_ich,
+ /* 109: indn */ screen_s_indn,
+ /* 110: il */ screen_s_il,
+ /* 111: cub */ screen_s_cub,
+ /* 112: cuf */ screen_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ screen_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ ABSENT_STRING,
+ /* 119: mc4 */ ABSENT_STRING,
+ /* 120: mc5 */ ABSENT_STRING,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ ABSENT_STRING,
+ /* 123: rs2 */ screen_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ screen_s_rc,
+ /* 127: vpa */ screen_s_vpa,
+ /* 128: sc */ screen_s_sc,
+ /* 129: ind */ screen_s_ind,
+ /* 130: ri */ screen_s_ri,
+ /* 131: sgr */ screen_s_sgr,
+ /* 132: hts */ screen_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ screen_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ ABSENT_STRING,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ screen_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ screen_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ ABSENT_STRING,
+ /* 152: rmam */ ABSENT_STRING,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ screen_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ screen_s_kend,
+ /* 165: kent */ ABSENT_STRING,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ ABSENT_STRING,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ ABSENT_STRING,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ ABSENT_STRING,
+ /* 200: kIC */ ABSENT_STRING,
+ /* 201: kLFT */ ABSENT_STRING,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ ABSENT_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ ABSENT_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ ABSENT_STRING,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ screen_s_kf11,
+ /* 217: kf12 */ screen_s_kf12,
+ /* 218: kf13 */ ABSENT_STRING,
+ /* 219: kf14 */ ABSENT_STRING,
+ /* 220: kf15 */ ABSENT_STRING,
+ /* 221: kf16 */ ABSENT_STRING,
+ /* 222: kf17 */ ABSENT_STRING,
+ /* 223: kf18 */ ABSENT_STRING,
+ /* 224: kf19 */ ABSENT_STRING,
+ /* 225: kf20 */ ABSENT_STRING,
+ /* 226: kf21 */ ABSENT_STRING,
+ /* 227: kf22 */ ABSENT_STRING,
+ /* 228: kf23 */ ABSENT_STRING,
+ /* 229: kf24 */ ABSENT_STRING,
+ /* 230: kf25 */ ABSENT_STRING,
+ /* 231: kf26 */ ABSENT_STRING,
+ /* 232: kf27 */ ABSENT_STRING,
+ /* 233: kf28 */ ABSENT_STRING,
+ /* 234: kf29 */ ABSENT_STRING,
+ /* 235: kf30 */ ABSENT_STRING,
+ /* 236: kf31 */ ABSENT_STRING,
+ /* 237: kf32 */ ABSENT_STRING,
+ /* 238: kf33 */ ABSENT_STRING,
+ /* 239: kf34 */ ABSENT_STRING,
+ /* 240: kf35 */ ABSENT_STRING,
+ /* 241: kf36 */ ABSENT_STRING,
+ /* 242: kf37 */ ABSENT_STRING,
+ /* 243: kf38 */ ABSENT_STRING,
+ /* 244: kf39 */ ABSENT_STRING,
+ /* 245: kf40 */ ABSENT_STRING,
+ /* 246: kf41 */ ABSENT_STRING,
+ /* 247: kf42 */ ABSENT_STRING,
+ /* 248: kf43 */ ABSENT_STRING,
+ /* 249: kf44 */ ABSENT_STRING,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ screen_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ ABSENT_STRING,
+ /* 294: u7 */ ABSENT_STRING,
+ /* 295: u8 */ ABSENT_STRING,
+ /* 296: u9 */ ABSENT_STRING,
+ /* 297: op */ screen_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ screen_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ screen_s_setaf,
+ /* 360: setab */ screen_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* screen.linux */
+
+static char screen_linux_alias_data[] = "screen.linux|screen in linux console";
+
+static char screen_linux_s_cbt [] = "\033[Z";
+static char screen_linux_s_bel [] = "\007";
+static char screen_linux_s_cr [] = "\015";
+static char screen_linux_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char screen_linux_s_tbc [] = "\033[3g";
+static char screen_linux_s_clear[] = "\033[H\033[J";
+static char screen_linux_s_el [] = "\033[K";
+static char screen_linux_s_ed [] = "\033[J";
+static char screen_linux_s_hpa [] = "\033[%i%p1%dG";
+static char screen_linux_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char screen_linux_s_cud1 [] = "\012";
+static char screen_linux_s_home [] = "\033[H";
+static char screen_linux_s_civis[] = "\033[?25l";
+static char screen_linux_s_cub1 [] = "\010";
+static char screen_linux_s_cnorm[] = "\033[34h\033[?25h";
+static char screen_linux_s_cuf1 [] = "\033[C";
+static char screen_linux_s_cuu1 [] = "\033M";
+static char screen_linux_s_cvvis[] = "\033[34l";
+static char screen_linux_s_dch1 [] = "\033[P";
+static char screen_linux_s_dl1 [] = "\033[M";
+static char screen_linux_s_smacs[] = "\016";
+static char screen_linux_s_blink[] = "\033[5m";
+static char screen_linux_s_bold [] = "\033[1m";
+static char screen_linux_s_smcup[] = "\033[?1049h";
+static char screen_linux_s_dim [] = "\033[2m";
+static char screen_linux_s_smir [] = "\033[4h";
+static char screen_linux_s_rev [] = "\033[7m";
+static char screen_linux_s_smso [] = "\033[3m";
+static char screen_linux_s_smul [] = "\033[4m";
+static char screen_linux_s_rmacs[] = "\017";
+static char screen_linux_s_sgr0 [] = "\033[m\017";
+static char screen_linux_s_rmcup[] = "\033[?1049l";
+static char screen_linux_s_rmir [] = "\033[4l";
+static char screen_linux_s_rmso [] = "\033[23m";
+static char screen_linux_s_rmul [] = "\033[24m";
+static char screen_linux_s_flash[] = "\033g";
+static char screen_linux_s_is2 [] = "\033)0";
+static char screen_linux_s_il1 [] = "\033[L";
+static char screen_linux_s_kbs [] = "\177";
+static char screen_linux_s_kdch1[] = "\033[3~";
+static char screen_linux_s_kcud1[] = "\033OB";
+static char screen_linux_s_kf1 [] = "\033OP";
+static char screen_linux_s_kf10 [] = "\033[21~";
+static char screen_linux_s_kf2 [] = "\033OQ";
+static char screen_linux_s_kf3 [] = "\033OR";
+static char screen_linux_s_kf4 [] = "\033OS";
+static char screen_linux_s_kf5 [] = "\033[15~";
+static char screen_linux_s_kf6 [] = "\033[17~";
+static char screen_linux_s_kf7 [] = "\033[18~";
+static char screen_linux_s_kf8 [] = "\033[19~";
+static char screen_linux_s_kf9 [] = "\033[20~";
+static char screen_linux_s_khome[] = "\033[1~";
+static char screen_linux_s_kich1[] = "\033[2~";
+static char screen_linux_s_kcub1[] = "\033OD";
+static char screen_linux_s_knp [] = "\033[6~";
+static char screen_linux_s_kpp [] = "\033[5~";
+static char screen_linux_s_kcuf1[] = "\033OC";
+static char screen_linux_s_kcuu1[] = "\033OA";
+static char screen_linux_s_rmkx [] = "\033[?1l\033>";
+static char screen_linux_s_smkx [] = "\033[?1h\033=";
+static char screen_linux_s_nel [] = "\033E";
+static char screen_linux_s_dch [] = "\033[%p1%dP";
+static char screen_linux_s_dl [] = "\033[%p1%dM";
+static char screen_linux_s_cud [] = "\033[%p1%dB";
+static char screen_linux_s_ich [] = "\033[%p1%d@";
+static char screen_linux_s_indn [] = "\033[%p1%dS";
+static char screen_linux_s_il [] = "\033[%p1%dL";
+static char screen_linux_s_cub [] = "\033[%p1%dD";
+static char screen_linux_s_cuf [] = "\033[%p1%dC";
+static char screen_linux_s_cuu [] = "\033[%p1%dA";
+static char screen_linux_s_rs2 [] = "\033c\033[?1000l\033[?25h";
+static char screen_linux_s_rc [] = "\0338";
+static char screen_linux_s_vpa [] = "\033[%i%p1%dd";
+static char screen_linux_s_sc [] = "\0337";
+static char screen_linux_s_ind [] = "\012";
+static char screen_linux_s_ri [] = "\033M";
+static char screen_linux_s_sgr [] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;";
+static char screen_linux_s_hts [] = "\033H";
+static char screen_linux_s_ht [] = "\011";
+static char screen_linux_s_acsc [] = "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char screen_linux_s_enacs[] = "\033(B\033)0";
+static char screen_linux_s_kend [] = "\033[4~";
+static char screen_linux_s_kf11 [] = "\033[23~";
+static char screen_linux_s_kf12 [] = "\033[24~";
+static char screen_linux_s_el1 [] = "\033[1K";
+static char screen_linux_s_op [] = "\033[39;49m";
+static char screen_linux_s_kmous[] = "\033[M";
+static char screen_linux_s_setaf[] = "\033[3%p1%dm";
+static char screen_linux_s_setab[] = "\033[4%p1%dm";
+
+static char screen_linux_bool_data[] = {
+ /* 0: bw */ TRUE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ FALSE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ TRUE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 screen_linux_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * screen_linux_string_data[] = {
+ /* 0: cbt */ screen_linux_s_cbt,
+ /* 1: bel */ screen_linux_s_bel,
+ /* 2: cr */ screen_linux_s_cr,
+ /* 3: csr */ screen_linux_s_csr,
+ /* 4: tbc */ screen_linux_s_tbc,
+ /* 5: clear */ screen_linux_s_clear,
+ /* 6: el */ screen_linux_s_el,
+ /* 7: ed */ screen_linux_s_ed,
+ /* 8: hpa */ screen_linux_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ screen_linux_s_cup,
+ /* 11: cud1 */ screen_linux_s_cud1,
+ /* 12: home */ screen_linux_s_home,
+ /* 13: civis */ screen_linux_s_civis,
+ /* 14: cub1 */ screen_linux_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ screen_linux_s_cnorm,
+ /* 17: cuf1 */ screen_linux_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ screen_linux_s_cuu1,
+ /* 20: cvvis */ screen_linux_s_cvvis,
+ /* 21: dch1 */ screen_linux_s_dch1,
+ /* 22: dl1 */ screen_linux_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ screen_linux_s_smacs,
+ /* 26: blink */ screen_linux_s_blink,
+ /* 27: bold */ screen_linux_s_bold,
+ /* 28: smcup */ screen_linux_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ screen_linux_s_dim,
+ /* 31: smir */ screen_linux_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ screen_linux_s_rev,
+ /* 35: smso */ screen_linux_s_smso,
+ /* 36: smul */ screen_linux_s_smul,
+ /* 37: ech */ ABSENT_STRING,
+ /* 38: rmacs */ screen_linux_s_rmacs,
+ /* 39: sgr0 */ screen_linux_s_sgr0,
+ /* 40: rmcup */ screen_linux_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ screen_linux_s_rmir,
+ /* 43: rmso */ screen_linux_s_rmso,
+ /* 44: rmul */ screen_linux_s_rmul,
+ /* 45: flash */ screen_linux_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ screen_linux_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ screen_linux_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ screen_linux_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ screen_linux_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ screen_linux_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ screen_linux_s_kf1,
+ /* 67: kf10 */ screen_linux_s_kf10,
+ /* 68: kf2 */ screen_linux_s_kf2,
+ /* 69: kf3 */ screen_linux_s_kf3,
+ /* 70: kf4 */ screen_linux_s_kf4,
+ /* 71: kf5 */ screen_linux_s_kf5,
+ /* 72: kf6 */ screen_linux_s_kf6,
+ /* 73: kf7 */ screen_linux_s_kf7,
+ /* 74: kf8 */ screen_linux_s_kf8,
+ /* 75: kf9 */ screen_linux_s_kf9,
+ /* 76: khome */ screen_linux_s_khome,
+ /* 77: kich1 */ screen_linux_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ screen_linux_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ screen_linux_s_knp,
+ /* 82: kpp */ screen_linux_s_kpp,
+ /* 83: kcuf1 */ screen_linux_s_kcuf1,
+ /* 84: kind */ ABSENT_STRING,
+ /* 85: kri */ ABSENT_STRING,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ screen_linux_s_kcuu1,
+ /* 88: rmkx */ screen_linux_s_rmkx,
+ /* 89: smkx */ screen_linux_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ screen_linux_s_nel,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ screen_linux_s_dch,
+ /* 106: dl */ screen_linux_s_dl,
+ /* 107: cud */ screen_linux_s_cud,
+ /* 108: ich */ screen_linux_s_ich,
+ /* 109: indn */ screen_linux_s_indn,
+ /* 110: il */ screen_linux_s_il,
+ /* 111: cub */ screen_linux_s_cub,
+ /* 112: cuf */ screen_linux_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ screen_linux_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ ABSENT_STRING,
+ /* 119: mc4 */ ABSENT_STRING,
+ /* 120: mc5 */ ABSENT_STRING,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ ABSENT_STRING,
+ /* 123: rs2 */ screen_linux_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ screen_linux_s_rc,
+ /* 127: vpa */ screen_linux_s_vpa,
+ /* 128: sc */ screen_linux_s_sc,
+ /* 129: ind */ screen_linux_s_ind,
+ /* 130: ri */ screen_linux_s_ri,
+ /* 131: sgr */ screen_linux_s_sgr,
+ /* 132: hts */ screen_linux_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ screen_linux_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ ABSENT_STRING,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ screen_linux_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ CANCELLED_STRING,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ ABSENT_STRING,
+ /* 152: rmam */ ABSENT_STRING,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ screen_linux_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ screen_linux_s_kend,
+ /* 165: kent */ ABSENT_STRING,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ ABSENT_STRING,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ ABSENT_STRING,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ ABSENT_STRING,
+ /* 200: kIC */ ABSENT_STRING,
+ /* 201: kLFT */ ABSENT_STRING,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ ABSENT_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ ABSENT_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ ABSENT_STRING,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ screen_linux_s_kf11,
+ /* 217: kf12 */ screen_linux_s_kf12,
+ /* 218: kf13 */ ABSENT_STRING,
+ /* 219: kf14 */ ABSENT_STRING,
+ /* 220: kf15 */ ABSENT_STRING,
+ /* 221: kf16 */ ABSENT_STRING,
+ /* 222: kf17 */ ABSENT_STRING,
+ /* 223: kf18 */ ABSENT_STRING,
+ /* 224: kf19 */ ABSENT_STRING,
+ /* 225: kf20 */ ABSENT_STRING,
+ /* 226: kf21 */ ABSENT_STRING,
+ /* 227: kf22 */ ABSENT_STRING,
+ /* 228: kf23 */ ABSENT_STRING,
+ /* 229: kf24 */ ABSENT_STRING,
+ /* 230: kf25 */ ABSENT_STRING,
+ /* 231: kf26 */ ABSENT_STRING,
+ /* 232: kf27 */ ABSENT_STRING,
+ /* 233: kf28 */ ABSENT_STRING,
+ /* 234: kf29 */ ABSENT_STRING,
+ /* 235: kf30 */ ABSENT_STRING,
+ /* 236: kf31 */ ABSENT_STRING,
+ /* 237: kf32 */ ABSENT_STRING,
+ /* 238: kf33 */ ABSENT_STRING,
+ /* 239: kf34 */ ABSENT_STRING,
+ /* 240: kf35 */ ABSENT_STRING,
+ /* 241: kf36 */ ABSENT_STRING,
+ /* 242: kf37 */ ABSENT_STRING,
+ /* 243: kf38 */ ABSENT_STRING,
+ /* 244: kf39 */ ABSENT_STRING,
+ /* 245: kf40 */ ABSENT_STRING,
+ /* 246: kf41 */ ABSENT_STRING,
+ /* 247: kf42 */ ABSENT_STRING,
+ /* 248: kf43 */ ABSENT_STRING,
+ /* 249: kf44 */ ABSENT_STRING,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ screen_linux_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ ABSENT_STRING,
+ /* 294: u7 */ ABSENT_STRING,
+ /* 295: u8 */ ABSENT_STRING,
+ /* 296: u9 */ ABSENT_STRING,
+ /* 297: op */ screen_linux_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ screen_linux_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ screen_linux_s_setaf,
+ /* 360: setab */ screen_linux_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* screen.rxvt */
+
+static char screen_rxvt_alias_data[] = "screen.rxvt|screen in rxvt";
+
+static char screen_rxvt_s_cbt [] = "\033[Z";
+static char screen_rxvt_s_bel [] = "\007";
+static char screen_rxvt_s_cr [] = "\015";
+static char screen_rxvt_s_csr [] = "\033[%i%p1%d;%p2%dr";
+static char screen_rxvt_s_tbc [] = "\033[3g";
+static char screen_rxvt_s_clear [] = "\033[H\033[J";
+static char screen_rxvt_s_el [] = "\033[K";
+static char screen_rxvt_s_ed [] = "\033[J";
+static char screen_rxvt_s_hpa [] = "\033[%i%p1%dG";
+static char screen_rxvt_s_cup [] = "\033[%i%p1%d;%p2%dH";
+static char screen_rxvt_s_cud1 [] = "\012";
+static char screen_rxvt_s_home [] = "\033[H";
+static char screen_rxvt_s_civis [] = "\033[?25l";
+static char screen_rxvt_s_cub1 [] = "\010";
+static char screen_rxvt_s_cnorm [] = "\033[34h\033[?25h";
+static char screen_rxvt_s_cuf1 [] = "\033[C";
+static char screen_rxvt_s_cuu1 [] = "\033M";
+static char screen_rxvt_s_dch1 [] = "\033[P";
+static char screen_rxvt_s_dl1 [] = "\033[M";
+static char screen_rxvt_s_smacs [] = "\016";
+static char screen_rxvt_s_blink [] = "\033[5m";
+static char screen_rxvt_s_bold [] = "\033[1m";
+static char screen_rxvt_s_smcup [] = "\033[?1049h";
+static char screen_rxvt_s_dim [] = "\033[2m";
+static char screen_rxvt_s_smir [] = "\033[4h";
+static char screen_rxvt_s_rev [] = "\033[7m";
+static char screen_rxvt_s_smso [] = "\033[3m";
+static char screen_rxvt_s_smul [] = "\033[4m";
+static char screen_rxvt_s_rmacs [] = "\017";
+static char screen_rxvt_s_sgr0 [] = "\033[m\017";
+static char screen_rxvt_s_rmcup [] = "\033[?1049l";
+static char screen_rxvt_s_rmir [] = "\033[4l";
+static char screen_rxvt_s_rmso [] = "\033[23m";
+static char screen_rxvt_s_rmul [] = "\033[24m";
+static char screen_rxvt_s_is2 [] = "\033)0";
+static char screen_rxvt_s_il1 [] = "\033[L";
+static char screen_rxvt_s_kbs [] = "\010";
+static char screen_rxvt_s_kdch1 [] = "\033[3~";
+static char screen_rxvt_s_kcud1 [] = "\033OB";
+static char screen_rxvt_s_kel [] = "\033[8^";
+static char screen_rxvt_s_kf1 [] = "\033OP";
+static char screen_rxvt_s_kf10 [] = "\033[21~";
+static char screen_rxvt_s_kf2 [] = "\033OQ";
+static char screen_rxvt_s_kf3 [] = "\033OR";
+static char screen_rxvt_s_kf4 [] = "\033OS";
+static char screen_rxvt_s_kf5 [] = "\033[15~";
+static char screen_rxvt_s_kf6 [] = "\033[17~";
+static char screen_rxvt_s_kf7 [] = "\033[18~";
+static char screen_rxvt_s_kf8 [] = "\033[19~";
+static char screen_rxvt_s_kf9 [] = "\033[20~";
+static char screen_rxvt_s_khome [] = "\033[1~";
+static char screen_rxvt_s_kich1 [] = "\033[2~";
+static char screen_rxvt_s_kcub1 [] = "\033OD";
+static char screen_rxvt_s_knp [] = "\033[6~";
+static char screen_rxvt_s_kpp [] = "\033[5~";
+static char screen_rxvt_s_kcuf1 [] = "\033OC";
+static char screen_rxvt_s_kind [] = "\033[a";
+static char screen_rxvt_s_kri [] = "\033[b";
+static char screen_rxvt_s_kcuu1 [] = "\033OA";
+static char screen_rxvt_s_rmkx [] = "\033[?1l\033>";
+static char screen_rxvt_s_smkx [] = "\033[?1h\033=";
+static char screen_rxvt_s_nel [] = "\033E";
+static char screen_rxvt_s_dch [] = "\033[%p1%dP";
+static char screen_rxvt_s_dl [] = "\033[%p1%dM";
+static char screen_rxvt_s_cud [] = "\033[%p1%dB";
+static char screen_rxvt_s_ich [] = "\033[%p1%d@";
+static char screen_rxvt_s_indn [] = "\033[%p1%dS";
+static char screen_rxvt_s_il [] = "\033[%p1%dL";
+static char screen_rxvt_s_cub [] = "\033[%p1%dD";
+static char screen_rxvt_s_cuf [] = "\033[%p1%dC";
+static char screen_rxvt_s_cuu [] = "\033[%p1%dA";
+static char screen_rxvt_s_rs2 [] = "\033c\033[?1000l\033[?25h";
+static char screen_rxvt_s_rc [] = "\0338";
+static char screen_rxvt_s_vpa [] = "\033[%i%p1%dd";
+static char screen_rxvt_s_sc [] = "\0337";
+static char screen_rxvt_s_ind [] = "\012";
+static char screen_rxvt_s_ri [] = "\033M";
+static char screen_rxvt_s_sgr [] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;";
+static char screen_rxvt_s_hts [] = "\033H";
+static char screen_rxvt_s_ht [] = "\011";
+static char screen_rxvt_s_ka1 [] = "\033Ow";
+static char screen_rxvt_s_ka3 [] = "\033Oy";
+static char screen_rxvt_s_kb2 [] = "\033Ou";
+static char screen_rxvt_s_kc1 [] = "\033Oq";
+static char screen_rxvt_s_kc3 [] = "\033Os";
+static char screen_rxvt_s_acsc [] = "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char screen_rxvt_s_kcbt [] = "\033[Z";
+static char screen_rxvt_s_enacs [] = "\033(B\033)0";
+static char screen_rxvt_s_kend [] = "\033[4~";
+static char screen_rxvt_s_kent [] = "\033OM";
+static char screen_rxvt_s_kDC [] = "\033[3$";
+static char screen_rxvt_s_kEND [] = "\033[8$";
+static char screen_rxvt_s_kHOM [] = "\033[7$";
+static char screen_rxvt_s_kIC [] = "\033[2$";
+static char screen_rxvt_s_kLFT [] = "\033[d";
+static char screen_rxvt_s_kNXT [] = "\033[6$";
+static char screen_rxvt_s_kPRV [] = "\033[5$";
+static char screen_rxvt_s_kRIT [] = "\033[c";
+static char screen_rxvt_s_kf11 [] = "\033[23~";
+static char screen_rxvt_s_kf12 [] = "\033[24~";
+static char screen_rxvt_s_kf13 [] = "\033[25~";
+static char screen_rxvt_s_kf14 [] = "\033[26~";
+static char screen_rxvt_s_kf15 [] = "\033[28~";
+static char screen_rxvt_s_kf16 [] = "\033[29~";
+static char screen_rxvt_s_kf17 [] = "\033[31~";
+static char screen_rxvt_s_kf18 [] = "\033[32~";
+static char screen_rxvt_s_kf19 [] = "\033[33~";
+static char screen_rxvt_s_kf20 [] = "\033[34~";
+static char screen_rxvt_s_kf21 [] = "\033[23$";
+static char screen_rxvt_s_kf22 [] = "\033[24$";
+static char screen_rxvt_s_kf23 [] = "\033[11^";
+static char screen_rxvt_s_kf24 [] = "\033[12^";
+static char screen_rxvt_s_kf25 [] = "\033[13^";
+static char screen_rxvt_s_kf26 [] = "\033[14^";
+static char screen_rxvt_s_kf27 [] = "\033[15^";
+static char screen_rxvt_s_kf28 [] = "\033[17^";
+static char screen_rxvt_s_kf29 [] = "\033[18^";
+static char screen_rxvt_s_kf30 [] = "\033[19^";
+static char screen_rxvt_s_kf31 [] = "\033[20^";
+static char screen_rxvt_s_kf32 [] = "\033[21^";
+static char screen_rxvt_s_kf33 [] = "\033[23^";
+static char screen_rxvt_s_kf34 [] = "\033[24^";
+static char screen_rxvt_s_kf35 [] = "\033[25^";
+static char screen_rxvt_s_kf36 [] = "\033[26^";
+static char screen_rxvt_s_kf37 [] = "\033[28^";
+static char screen_rxvt_s_kf38 [] = "\033[29^";
+static char screen_rxvt_s_kf39 [] = "\033[31^";
+static char screen_rxvt_s_kf40 [] = "\033[32^";
+static char screen_rxvt_s_kf41 [] = "\033[33^";
+static char screen_rxvt_s_kf42 [] = "\033[34^";
+static char screen_rxvt_s_kf43 [] = "\033[23@";
+static char screen_rxvt_s_kf44 [] = "\033[24@";
+static char screen_rxvt_s_el1 [] = "\033[1K";
+static char screen_rxvt_s_u6 [] = "\033[%i%d;%dR";
+static char screen_rxvt_s_u7 [] = "\033[6n";
+static char screen_rxvt_s_u8 [] = "\033[?1;2c";
+static char screen_rxvt_s_u9 [] = "\033[c";
+static char screen_rxvt_s_op [] = "\033[39;49m";
+static char screen_rxvt_s_kmous [] = "\033[M";
+static char screen_rxvt_s_setaf [] = "\033[3%p1%dm";
+static char screen_rxvt_s_setab [] = "\033[4%p1%dm";
+
+static char screen_rxvt_bool_data[] = {
+ /* 0: bw */ TRUE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ FALSE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ FALSE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ TRUE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 screen_rxvt_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * screen_rxvt_string_data[] = {
+ /* 0: cbt */ screen_rxvt_s_cbt,
+ /* 1: bel */ screen_rxvt_s_bel,
+ /* 2: cr */ screen_rxvt_s_cr,
+ /* 3: csr */ screen_rxvt_s_csr,
+ /* 4: tbc */ screen_rxvt_s_tbc,
+ /* 5: clear */ screen_rxvt_s_clear,
+ /* 6: el */ screen_rxvt_s_el,
+ /* 7: ed */ screen_rxvt_s_ed,
+ /* 8: hpa */ screen_rxvt_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ screen_rxvt_s_cup,
+ /* 11: cud1 */ screen_rxvt_s_cud1,
+ /* 12: home */ screen_rxvt_s_home,
+ /* 13: civis */ screen_rxvt_s_civis,
+ /* 14: cub1 */ screen_rxvt_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ screen_rxvt_s_cnorm,
+ /* 17: cuf1 */ screen_rxvt_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ screen_rxvt_s_cuu1,
+ /* 20: cvvis */ CANCELLED_STRING,
+ /* 21: dch1 */ screen_rxvt_s_dch1,
+ /* 22: dl1 */ screen_rxvt_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ screen_rxvt_s_smacs,
+ /* 26: blink */ screen_rxvt_s_blink,
+ /* 27: bold */ screen_rxvt_s_bold,
+ /* 28: smcup */ screen_rxvt_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ screen_rxvt_s_dim,
+ /* 31: smir */ screen_rxvt_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ screen_rxvt_s_rev,
+ /* 35: smso */ screen_rxvt_s_smso,
+ /* 36: smul */ screen_rxvt_s_smul,
+ /* 37: ech */ ABSENT_STRING,
+ /* 38: rmacs */ screen_rxvt_s_rmacs,
+ /* 39: sgr0 */ screen_rxvt_s_sgr0,
+ /* 40: rmcup */ screen_rxvt_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ screen_rxvt_s_rmir,
+ /* 43: rmso */ screen_rxvt_s_rmso,
+ /* 44: rmul */ screen_rxvt_s_rmul,
+ /* 45: flash */ CANCELLED_STRING,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ screen_rxvt_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ screen_rxvt_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ screen_rxvt_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ screen_rxvt_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ screen_rxvt_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ screen_rxvt_s_kel,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ screen_rxvt_s_kf1,
+ /* 67: kf10 */ screen_rxvt_s_kf10,
+ /* 68: kf2 */ screen_rxvt_s_kf2,
+ /* 69: kf3 */ screen_rxvt_s_kf3,
+ /* 70: kf4 */ screen_rxvt_s_kf4,
+ /* 71: kf5 */ screen_rxvt_s_kf5,
+ /* 72: kf6 */ screen_rxvt_s_kf6,
+ /* 73: kf7 */ screen_rxvt_s_kf7,
+ /* 74: kf8 */ screen_rxvt_s_kf8,
+ /* 75: kf9 */ screen_rxvt_s_kf9,
+ /* 76: khome */ screen_rxvt_s_khome,
+ /* 77: kich1 */ screen_rxvt_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ screen_rxvt_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ screen_rxvt_s_knp,
+ /* 82: kpp */ screen_rxvt_s_kpp,
+ /* 83: kcuf1 */ screen_rxvt_s_kcuf1,
+ /* 84: kind */ screen_rxvt_s_kind,
+ /* 85: kri */ screen_rxvt_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ screen_rxvt_s_kcuu1,
+ /* 88: rmkx */ screen_rxvt_s_rmkx,
+ /* 89: smkx */ screen_rxvt_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ ABSENT_STRING,
+ /* 102: smm */ ABSENT_STRING,
+ /* 103: nel */ screen_rxvt_s_nel,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ screen_rxvt_s_dch,
+ /* 106: dl */ screen_rxvt_s_dl,
+ /* 107: cud */ screen_rxvt_s_cud,
+ /* 108: ich */ screen_rxvt_s_ich,
+ /* 109: indn */ screen_rxvt_s_indn,
+ /* 110: il */ screen_rxvt_s_il,
+ /* 111: cub */ screen_rxvt_s_cub,
+ /* 112: cuf */ screen_rxvt_s_cuf,
+ /* 113: rin */ ABSENT_STRING,
+ /* 114: cuu */ screen_rxvt_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ ABSENT_STRING,
+ /* 119: mc4 */ ABSENT_STRING,
+ /* 120: mc5 */ ABSENT_STRING,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ ABSENT_STRING,
+ /* 123: rs2 */ screen_rxvt_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ screen_rxvt_s_rc,
+ /* 127: vpa */ screen_rxvt_s_vpa,
+ /* 128: sc */ screen_rxvt_s_sc,
+ /* 129: ind */ screen_rxvt_s_ind,
+ /* 130: ri */ screen_rxvt_s_ri,
+ /* 131: sgr */ screen_rxvt_s_sgr,
+ /* 132: hts */ screen_rxvt_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ screen_rxvt_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ screen_rxvt_s_ka1,
+ /* 140: ka3 */ screen_rxvt_s_ka3,
+ /* 141: kb2 */ screen_rxvt_s_kb2,
+ /* 142: kc1 */ screen_rxvt_s_kc1,
+ /* 143: kc3 */ screen_rxvt_s_kc3,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ screen_rxvt_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ screen_rxvt_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ ABSENT_STRING,
+ /* 152: rmam */ ABSENT_STRING,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ screen_rxvt_s_enacs,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ screen_rxvt_s_kend,
+ /* 165: kent */ screen_rxvt_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ screen_rxvt_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ screen_rxvt_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ screen_rxvt_s_kHOM,
+ /* 200: kIC */ screen_rxvt_s_kIC,
+ /* 201: kLFT */ screen_rxvt_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ screen_rxvt_s_kNXT,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ screen_rxvt_s_kPRV,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ screen_rxvt_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ screen_rxvt_s_kf11,
+ /* 217: kf12 */ screen_rxvt_s_kf12,
+ /* 218: kf13 */ screen_rxvt_s_kf13,
+ /* 219: kf14 */ screen_rxvt_s_kf14,
+ /* 220: kf15 */ screen_rxvt_s_kf15,
+ /* 221: kf16 */ screen_rxvt_s_kf16,
+ /* 222: kf17 */ screen_rxvt_s_kf17,
+ /* 223: kf18 */ screen_rxvt_s_kf18,
+ /* 224: kf19 */ screen_rxvt_s_kf19,
+ /* 225: kf20 */ screen_rxvt_s_kf20,
+ /* 226: kf21 */ screen_rxvt_s_kf21,
+ /* 227: kf22 */ screen_rxvt_s_kf22,
+ /* 228: kf23 */ screen_rxvt_s_kf23,
+ /* 229: kf24 */ screen_rxvt_s_kf24,
+ /* 230: kf25 */ screen_rxvt_s_kf25,
+ /* 231: kf26 */ screen_rxvt_s_kf26,
+ /* 232: kf27 */ screen_rxvt_s_kf27,
+ /* 233: kf28 */ screen_rxvt_s_kf28,
+ /* 234: kf29 */ screen_rxvt_s_kf29,
+ /* 235: kf30 */ screen_rxvt_s_kf30,
+ /* 236: kf31 */ screen_rxvt_s_kf31,
+ /* 237: kf32 */ screen_rxvt_s_kf32,
+ /* 238: kf33 */ screen_rxvt_s_kf33,
+ /* 239: kf34 */ screen_rxvt_s_kf34,
+ /* 240: kf35 */ screen_rxvt_s_kf35,
+ /* 241: kf36 */ screen_rxvt_s_kf36,
+ /* 242: kf37 */ screen_rxvt_s_kf37,
+ /* 243: kf38 */ screen_rxvt_s_kf38,
+ /* 244: kf39 */ screen_rxvt_s_kf39,
+ /* 245: kf40 */ screen_rxvt_s_kf40,
+ /* 246: kf41 */ screen_rxvt_s_kf41,
+ /* 247: kf42 */ screen_rxvt_s_kf42,
+ /* 248: kf43 */ screen_rxvt_s_kf43,
+ /* 249: kf44 */ screen_rxvt_s_kf44,
+ /* 250: kf45 */ ABSENT_STRING,
+ /* 251: kf46 */ ABSENT_STRING,
+ /* 252: kf47 */ ABSENT_STRING,
+ /* 253: kf48 */ ABSENT_STRING,
+ /* 254: kf49 */ ABSENT_STRING,
+ /* 255: kf50 */ ABSENT_STRING,
+ /* 256: kf51 */ ABSENT_STRING,
+ /* 257: kf52 */ ABSENT_STRING,
+ /* 258: kf53 */ ABSENT_STRING,
+ /* 259: kf54 */ ABSENT_STRING,
+ /* 260: kf55 */ ABSENT_STRING,
+ /* 261: kf56 */ ABSENT_STRING,
+ /* 262: kf57 */ ABSENT_STRING,
+ /* 263: kf58 */ ABSENT_STRING,
+ /* 264: kf59 */ ABSENT_STRING,
+ /* 265: kf60 */ ABSENT_STRING,
+ /* 266: kf61 */ ABSENT_STRING,
+ /* 267: kf62 */ ABSENT_STRING,
+ /* 268: kf63 */ ABSENT_STRING,
+ /* 269: el1 */ screen_rxvt_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ screen_rxvt_s_u6,
+ /* 294: u7 */ screen_rxvt_s_u7,
+ /* 295: u8 */ screen_rxvt_s_u8,
+ /* 296: u9 */ screen_rxvt_s_u9,
+ /* 297: op */ screen_rxvt_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ screen_rxvt_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ screen_rxvt_s_setaf,
+ /* 360: setab */ screen_rxvt_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* screen.xterm-new */
+
+static char screen_xterm_xfree86_alias_data[] = "screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm";
+
+static char screen_xterm_xfree86_s_cbt[] = "\033[Z";
+static char screen_xterm_xfree86_s_bel[] = "\007";
+static char screen_xterm_xfree86_s_cr[] = "\015";
+static char screen_xterm_xfree86_s_csr[] = "\033[%i%p1%d;%p2%dr";
+static char screen_xterm_xfree86_s_tbc[] = "\033[3g";
+static char screen_xterm_xfree86_s_clear[] = "\033[H\033[2J";
+static char screen_xterm_xfree86_s_el[] = "\033[K";
+static char screen_xterm_xfree86_s_ed[] = "\033[J";
+static char screen_xterm_xfree86_s_hpa[] = "\033[%i%p1%dG";
+static char screen_xterm_xfree86_s_cup[] = "\033[%i%p1%d;%p2%dH";
+static char screen_xterm_xfree86_s_cud1[] = "\012";
+static char screen_xterm_xfree86_s_home[] = "\033[H";
+static char screen_xterm_xfree86_s_civis[] = "\033[?25l";
+static char screen_xterm_xfree86_s_cub1[] = "\010";
+static char screen_xterm_xfree86_s_cnorm[] = "\033[?12l\033[?25h";
+static char screen_xterm_xfree86_s_cuf1[] = "\033[C";
+static char screen_xterm_xfree86_s_cuu1[] = "\033[A";
+static char screen_xterm_xfree86_s_cvvis[] = "\033[?12;25h";
+static char screen_xterm_xfree86_s_dch1[] = "\033[P";
+static char screen_xterm_xfree86_s_dl1[] = "\033[M";
+static char screen_xterm_xfree86_s_smacs[] = "\033(0";
+static char screen_xterm_xfree86_s_blink[] = "\033[5m";
+static char screen_xterm_xfree86_s_bold[] = "\033[1m";
+static char screen_xterm_xfree86_s_smcup[] = "\033[?1049h\033[22;0;0t";
+static char screen_xterm_xfree86_s_dim[] = "\033[2m";
+static char screen_xterm_xfree86_s_smir[] = "\033[4h";
+static char screen_xterm_xfree86_s_rev[] = "\033[7m";
+static char screen_xterm_xfree86_s_smso[] = "\033[7m";
+static char screen_xterm_xfree86_s_smul[] = "\033[4m";
+static char screen_xterm_xfree86_s_ech[] = "\033[%p1%dX";
+static char screen_xterm_xfree86_s_rmacs[] = "\033(B";
+static char screen_xterm_xfree86_s_sgr0[] = "\033(B\033[m";
+static char screen_xterm_xfree86_s_rmcup[] = "\033[?1049l\033[23;0;0t";
+static char screen_xterm_xfree86_s_rmir[] = "\033[4l";
+static char screen_xterm_xfree86_s_rmso[] = "\033[27m";
+static char screen_xterm_xfree86_s_rmul[] = "\033[24m";
+static char screen_xterm_xfree86_s_flash[] = "\033[?5h$<100/>\033[?5l";
+static char screen_xterm_xfree86_s_is2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char screen_xterm_xfree86_s_il1[] = "\033[L";
+static char screen_xterm_xfree86_s_kbs[] = "\010";
+static char screen_xterm_xfree86_s_kdch1[] = "\033[3~";
+static char screen_xterm_xfree86_s_kcud1[] = "\033OB";
+static char screen_xterm_xfree86_s_kf1[] = "\033OP";
+static char screen_xterm_xfree86_s_kf10[] = "\033[21~";
+static char screen_xterm_xfree86_s_kf2[] = "\033OQ";
+static char screen_xterm_xfree86_s_kf3[] = "\033OR";
+static char screen_xterm_xfree86_s_kf4[] = "\033OS";
+static char screen_xterm_xfree86_s_kf5[] = "\033[15~";
+static char screen_xterm_xfree86_s_kf6[] = "\033[17~";
+static char screen_xterm_xfree86_s_kf7[] = "\033[18~";
+static char screen_xterm_xfree86_s_kf8[] = "\033[19~";
+static char screen_xterm_xfree86_s_kf9[] = "\033[20~";
+static char screen_xterm_xfree86_s_khome[] = "\033[1~";
+static char screen_xterm_xfree86_s_kich1[] = "\033[2~";
+static char screen_xterm_xfree86_s_kcub1[] = "\033OD";
+static char screen_xterm_xfree86_s_knp[] = "\033[6~";
+static char screen_xterm_xfree86_s_kpp[] = "\033[5~";
+static char screen_xterm_xfree86_s_kcuf1[] = "\033OC";
+static char screen_xterm_xfree86_s_kind[] = "\033[1;2B";
+static char screen_xterm_xfree86_s_kri[] = "\033[1;2A";
+static char screen_xterm_xfree86_s_kcuu1[] = "\033OA";
+static char screen_xterm_xfree86_s_rmkx[] = "\033[?1l\033>";
+static char screen_xterm_xfree86_s_smkx[] = "\033[?1h\033=";
+static char screen_xterm_xfree86_s_rmm[] = "\033[?1034l";
+static char screen_xterm_xfree86_s_smm[] = "\033[?1034h";
+static char screen_xterm_xfree86_s_dch[] = "\033[%p1%dP";
+static char screen_xterm_xfree86_s_dl[] = "\033[%p1%dM";
+static char screen_xterm_xfree86_s_cud[] = "\033[%p1%dB";
+static char screen_xterm_xfree86_s_ich[] = "\033[%p1%d@";
+static char screen_xterm_xfree86_s_indn[] = "\033[%p1%dS";
+static char screen_xterm_xfree86_s_il[] = "\033[%p1%dL";
+static char screen_xterm_xfree86_s_cub[] = "\033[%p1%dD";
+static char screen_xterm_xfree86_s_cuf[] = "\033[%p1%dC";
+static char screen_xterm_xfree86_s_rin[] = "\033[%p1%dT";
+static char screen_xterm_xfree86_s_cuu[] = "\033[%p1%dA";
+static char screen_xterm_xfree86_s_mc0[] = "\033[i";
+static char screen_xterm_xfree86_s_mc4[] = "\033[4i";
+static char screen_xterm_xfree86_s_mc5[] = "\033[5i";
+static char screen_xterm_xfree86_s_rs1[] = "\033c";
+static char screen_xterm_xfree86_s_rs2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char screen_xterm_xfree86_s_rc[] = "\0338";
+static char screen_xterm_xfree86_s_vpa[] = "\033[%i%p1%dd";
+static char screen_xterm_xfree86_s_sc[] = "\0337";
+static char screen_xterm_xfree86_s_ind[] = "\012";
+static char screen_xterm_xfree86_s_ri[] = "\033M";
+static char screen_xterm_xfree86_s_sgr[] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m";
+static char screen_xterm_xfree86_s_hts[] = "\033H";
+static char screen_xterm_xfree86_s_ht[] = "\011";
+static char screen_xterm_xfree86_s_kb2[] = "\033OE";
+static char screen_xterm_xfree86_s_acsc[] = "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char screen_xterm_xfree86_s_kcbt[] = "\033[Z";
+static char screen_xterm_xfree86_s_smam[] = "\033[?7h";
+static char screen_xterm_xfree86_s_rmam[] = "\033[?7l";
+static char screen_xterm_xfree86_s_kend[] = "\033[4~";
+static char screen_xterm_xfree86_s_kent[] = "\033OM";
+static char screen_xterm_xfree86_s_kDC[] = "\033[3;2~";
+static char screen_xterm_xfree86_s_kEND[] = "\033[1;2F";
+static char screen_xterm_xfree86_s_kHOM[] = "\033[1;2H";
+static char screen_xterm_xfree86_s_kLFT[] = "\033[1;2D";
+static char screen_xterm_xfree86_s_kRIT[] = "\033[1;2C";
+static char screen_xterm_xfree86_s_kf11[] = "\033[23~";
+static char screen_xterm_xfree86_s_kf12[] = "\033[24~";
+static char screen_xterm_xfree86_s_kf13[] = "\033[1;2P";
+static char screen_xterm_xfree86_s_kf14[] = "\033[1;2Q";
+static char screen_xterm_xfree86_s_kf15[] = "\033[1;2R";
+static char screen_xterm_xfree86_s_kf16[] = "\033[1;2S";
+static char screen_xterm_xfree86_s_kf17[] = "\033[15;2~";
+static char screen_xterm_xfree86_s_kf18[] = "\033[17;2~";
+static char screen_xterm_xfree86_s_kf19[] = "\033[18;2~";
+static char screen_xterm_xfree86_s_kf20[] = "\033[19;2~";
+static char screen_xterm_xfree86_s_kf21[] = "\033[20;2~";
+static char screen_xterm_xfree86_s_kf22[] = "\033[21;2~";
+static char screen_xterm_xfree86_s_kf23[] = "\033[23;2~";
+static char screen_xterm_xfree86_s_kf24[] = "\033[24;2~";
+static char screen_xterm_xfree86_s_kf25[] = "\033[1;5P";
+static char screen_xterm_xfree86_s_kf26[] = "\033[1;5Q";
+static char screen_xterm_xfree86_s_kf27[] = "\033[1;5R";
+static char screen_xterm_xfree86_s_kf28[] = "\033[1;5S";
+static char screen_xterm_xfree86_s_kf29[] = "\033[15;5~";
+static char screen_xterm_xfree86_s_kf30[] = "\033[17;5~";
+static char screen_xterm_xfree86_s_kf31[] = "\033[18;5~";
+static char screen_xterm_xfree86_s_kf32[] = "\033[19;5~";
+static char screen_xterm_xfree86_s_kf33[] = "\033[20;5~";
+static char screen_xterm_xfree86_s_kf34[] = "\033[21;5~";
+static char screen_xterm_xfree86_s_kf35[] = "\033[23;5~";
+static char screen_xterm_xfree86_s_kf36[] = "\033[24;5~";
+static char screen_xterm_xfree86_s_kf37[] = "\033[1;6P";
+static char screen_xterm_xfree86_s_kf38[] = "\033[1;6Q";
+static char screen_xterm_xfree86_s_kf39[] = "\033[1;6R";
+static char screen_xterm_xfree86_s_kf40[] = "\033[1;6S";
+static char screen_xterm_xfree86_s_kf41[] = "\033[15;6~";
+static char screen_xterm_xfree86_s_kf42[] = "\033[17;6~";
+static char screen_xterm_xfree86_s_kf43[] = "\033[18;6~";
+static char screen_xterm_xfree86_s_kf44[] = "\033[19;6~";
+static char screen_xterm_xfree86_s_kf45[] = "\033[20;6~";
+static char screen_xterm_xfree86_s_kf46[] = "\033[21;6~";
+static char screen_xterm_xfree86_s_kf47[] = "\033[23;6~";
+static char screen_xterm_xfree86_s_kf48[] = "\033[24;6~";
+static char screen_xterm_xfree86_s_kf49[] = "\033[1;3P";
+static char screen_xterm_xfree86_s_kf50[] = "\033[1;3Q";
+static char screen_xterm_xfree86_s_kf51[] = "\033[1;3R";
+static char screen_xterm_xfree86_s_kf52[] = "\033[1;3S";
+static char screen_xterm_xfree86_s_kf53[] = "\033[15;3~";
+static char screen_xterm_xfree86_s_kf54[] = "\033[17;3~";
+static char screen_xterm_xfree86_s_kf55[] = "\033[18;3~";
+static char screen_xterm_xfree86_s_kf56[] = "\033[19;3~";
+static char screen_xterm_xfree86_s_kf57[] = "\033[20;3~";
+static char screen_xterm_xfree86_s_kf58[] = "\033[21;3~";
+static char screen_xterm_xfree86_s_kf59[] = "\033[23;3~";
+static char screen_xterm_xfree86_s_kf60[] = "\033[24;3~";
+static char screen_xterm_xfree86_s_kf61[] = "\033[1;4P";
+static char screen_xterm_xfree86_s_kf62[] = "\033[1;4Q";
+static char screen_xterm_xfree86_s_kf63[] = "\033[1;4R";
+static char screen_xterm_xfree86_s_el1[] = "\033[1K";
+static char screen_xterm_xfree86_s_u6[] = "\033[%i%d;%dR";
+static char screen_xterm_xfree86_s_u7[] = "\033[6n";
+static char screen_xterm_xfree86_s_u8[] = "\033[?%[;0123456789]c";
+static char screen_xterm_xfree86_s_u9[] = "\033[c";
+static char screen_xterm_xfree86_s_op[] = "\033[39;49m";
+static char screen_xterm_xfree86_s_setf[] = "\033[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m";
+static char screen_xterm_xfree86_s_setb[] = "\033[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m";
+static char screen_xterm_xfree86_s_kmous[] = "\033[M";
+static char screen_xterm_xfree86_s_setaf[] = "\033[3%p1%dm";
+static char screen_xterm_xfree86_s_setab[] = "\033[4%p1%dm";
+
+static char screen_xterm_xfree86_bool_data[] = {
+ /* 0: bw */ TRUE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ TRUE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ TRUE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 screen_xterm_xfree86_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 8,
+ /* 14: pairs */ 64,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * screen_xterm_xfree86_string_data[] = {
+ /* 0: cbt */ screen_xterm_xfree86_s_cbt,
+ /* 1: bel */ screen_xterm_xfree86_s_bel,
+ /* 2: cr */ screen_xterm_xfree86_s_cr,
+ /* 3: csr */ screen_xterm_xfree86_s_csr,
+ /* 4: tbc */ screen_xterm_xfree86_s_tbc,
+ /* 5: clear */ screen_xterm_xfree86_s_clear,
+ /* 6: el */ screen_xterm_xfree86_s_el,
+ /* 7: ed */ screen_xterm_xfree86_s_ed,
+ /* 8: hpa */ screen_xterm_xfree86_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ screen_xterm_xfree86_s_cup,
+ /* 11: cud1 */ screen_xterm_xfree86_s_cud1,
+ /* 12: home */ screen_xterm_xfree86_s_home,
+ /* 13: civis */ screen_xterm_xfree86_s_civis,
+ /* 14: cub1 */ screen_xterm_xfree86_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ screen_xterm_xfree86_s_cnorm,
+ /* 17: cuf1 */ screen_xterm_xfree86_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ screen_xterm_xfree86_s_cuu1,
+ /* 20: cvvis */ screen_xterm_xfree86_s_cvvis,
+ /* 21: dch1 */ screen_xterm_xfree86_s_dch1,
+ /* 22: dl1 */ screen_xterm_xfree86_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ screen_xterm_xfree86_s_smacs,
+ /* 26: blink */ screen_xterm_xfree86_s_blink,
+ /* 27: bold */ screen_xterm_xfree86_s_bold,
+ /* 28: smcup */ screen_xterm_xfree86_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ screen_xterm_xfree86_s_dim,
+ /* 31: smir */ screen_xterm_xfree86_s_smir,
+ /* 32: invis */ CANCELLED_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ screen_xterm_xfree86_s_rev,
+ /* 35: smso */ screen_xterm_xfree86_s_smso,
+ /* 36: smul */ screen_xterm_xfree86_s_smul,
+ /* 37: ech */ screen_xterm_xfree86_s_ech,
+ /* 38: rmacs */ screen_xterm_xfree86_s_rmacs,
+ /* 39: sgr0 */ screen_xterm_xfree86_s_sgr0,
+ /* 40: rmcup */ screen_xterm_xfree86_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ screen_xterm_xfree86_s_rmir,
+ /* 43: rmso */ screen_xterm_xfree86_s_rmso,
+ /* 44: rmul */ screen_xterm_xfree86_s_rmul,
+ /* 45: flash */ screen_xterm_xfree86_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ screen_xterm_xfree86_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ screen_xterm_xfree86_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ screen_xterm_xfree86_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ screen_xterm_xfree86_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ screen_xterm_xfree86_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ screen_xterm_xfree86_s_kf1,
+ /* 67: kf10 */ screen_xterm_xfree86_s_kf10,
+ /* 68: kf2 */ screen_xterm_xfree86_s_kf2,
+ /* 69: kf3 */ screen_xterm_xfree86_s_kf3,
+ /* 70: kf4 */ screen_xterm_xfree86_s_kf4,
+ /* 71: kf5 */ screen_xterm_xfree86_s_kf5,
+ /* 72: kf6 */ screen_xterm_xfree86_s_kf6,
+ /* 73: kf7 */ screen_xterm_xfree86_s_kf7,
+ /* 74: kf8 */ screen_xterm_xfree86_s_kf8,
+ /* 75: kf9 */ screen_xterm_xfree86_s_kf9,
+ /* 76: khome */ screen_xterm_xfree86_s_khome,
+ /* 77: kich1 */ screen_xterm_xfree86_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ screen_xterm_xfree86_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ screen_xterm_xfree86_s_knp,
+ /* 82: kpp */ screen_xterm_xfree86_s_kpp,
+ /* 83: kcuf1 */ screen_xterm_xfree86_s_kcuf1,
+ /* 84: kind */ screen_xterm_xfree86_s_kind,
+ /* 85: kri */ screen_xterm_xfree86_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ screen_xterm_xfree86_s_kcuu1,
+ /* 88: rmkx */ screen_xterm_xfree86_s_rmkx,
+ /* 89: smkx */ screen_xterm_xfree86_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ screen_xterm_xfree86_s_rmm,
+ /* 102: smm */ screen_xterm_xfree86_s_smm,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ screen_xterm_xfree86_s_dch,
+ /* 106: dl */ screen_xterm_xfree86_s_dl,
+ /* 107: cud */ screen_xterm_xfree86_s_cud,
+ /* 108: ich */ screen_xterm_xfree86_s_ich,
+ /* 109: indn */ screen_xterm_xfree86_s_indn,
+ /* 110: il */ screen_xterm_xfree86_s_il,
+ /* 111: cub */ screen_xterm_xfree86_s_cub,
+ /* 112: cuf */ screen_xterm_xfree86_s_cuf,
+ /* 113: rin */ screen_xterm_xfree86_s_rin,
+ /* 114: cuu */ screen_xterm_xfree86_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ screen_xterm_xfree86_s_mc0,
+ /* 119: mc4 */ screen_xterm_xfree86_s_mc4,
+ /* 120: mc5 */ screen_xterm_xfree86_s_mc5,
+ /* 121: rep */ CANCELLED_STRING,
+ /* 122: rs1 */ screen_xterm_xfree86_s_rs1,
+ /* 123: rs2 */ screen_xterm_xfree86_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ screen_xterm_xfree86_s_rc,
+ /* 127: vpa */ screen_xterm_xfree86_s_vpa,
+ /* 128: sc */ screen_xterm_xfree86_s_sc,
+ /* 129: ind */ screen_xterm_xfree86_s_ind,
+ /* 130: ri */ screen_xterm_xfree86_s_ri,
+ /* 131: sgr */ screen_xterm_xfree86_s_sgr,
+ /* 132: hts */ screen_xterm_xfree86_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ screen_xterm_xfree86_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ screen_xterm_xfree86_s_kb2,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ screen_xterm_xfree86_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ screen_xterm_xfree86_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ screen_xterm_xfree86_s_smam,
+ /* 152: rmam */ screen_xterm_xfree86_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ ABSENT_STRING,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ screen_xterm_xfree86_s_kend,
+ /* 165: kent */ screen_xterm_xfree86_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ screen_xterm_xfree86_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ screen_xterm_xfree86_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ screen_xterm_xfree86_s_kHOM,
+ /* 200: kIC */ CANCELLED_STRING,
+ /* 201: kLFT */ screen_xterm_xfree86_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ CANCELLED_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ CANCELLED_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ screen_xterm_xfree86_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ screen_xterm_xfree86_s_kf11,
+ /* 217: kf12 */ screen_xterm_xfree86_s_kf12,
+ /* 218: kf13 */ screen_xterm_xfree86_s_kf13,
+ /* 219: kf14 */ screen_xterm_xfree86_s_kf14,
+ /* 220: kf15 */ screen_xterm_xfree86_s_kf15,
+ /* 221: kf16 */ screen_xterm_xfree86_s_kf16,
+ /* 222: kf17 */ screen_xterm_xfree86_s_kf17,
+ /* 223: kf18 */ screen_xterm_xfree86_s_kf18,
+ /* 224: kf19 */ screen_xterm_xfree86_s_kf19,
+ /* 225: kf20 */ screen_xterm_xfree86_s_kf20,
+ /* 226: kf21 */ screen_xterm_xfree86_s_kf21,
+ /* 227: kf22 */ screen_xterm_xfree86_s_kf22,
+ /* 228: kf23 */ screen_xterm_xfree86_s_kf23,
+ /* 229: kf24 */ screen_xterm_xfree86_s_kf24,
+ /* 230: kf25 */ screen_xterm_xfree86_s_kf25,
+ /* 231: kf26 */ screen_xterm_xfree86_s_kf26,
+ /* 232: kf27 */ screen_xterm_xfree86_s_kf27,
+ /* 233: kf28 */ screen_xterm_xfree86_s_kf28,
+ /* 234: kf29 */ screen_xterm_xfree86_s_kf29,
+ /* 235: kf30 */ screen_xterm_xfree86_s_kf30,
+ /* 236: kf31 */ screen_xterm_xfree86_s_kf31,
+ /* 237: kf32 */ screen_xterm_xfree86_s_kf32,
+ /* 238: kf33 */ screen_xterm_xfree86_s_kf33,
+ /* 239: kf34 */ screen_xterm_xfree86_s_kf34,
+ /* 240: kf35 */ screen_xterm_xfree86_s_kf35,
+ /* 241: kf36 */ screen_xterm_xfree86_s_kf36,
+ /* 242: kf37 */ screen_xterm_xfree86_s_kf37,
+ /* 243: kf38 */ screen_xterm_xfree86_s_kf38,
+ /* 244: kf39 */ screen_xterm_xfree86_s_kf39,
+ /* 245: kf40 */ screen_xterm_xfree86_s_kf40,
+ /* 246: kf41 */ screen_xterm_xfree86_s_kf41,
+ /* 247: kf42 */ screen_xterm_xfree86_s_kf42,
+ /* 248: kf43 */ screen_xterm_xfree86_s_kf43,
+ /* 249: kf44 */ screen_xterm_xfree86_s_kf44,
+ /* 250: kf45 */ screen_xterm_xfree86_s_kf45,
+ /* 251: kf46 */ screen_xterm_xfree86_s_kf46,
+ /* 252: kf47 */ screen_xterm_xfree86_s_kf47,
+ /* 253: kf48 */ screen_xterm_xfree86_s_kf48,
+ /* 254: kf49 */ screen_xterm_xfree86_s_kf49,
+ /* 255: kf50 */ screen_xterm_xfree86_s_kf50,
+ /* 256: kf51 */ screen_xterm_xfree86_s_kf51,
+ /* 257: kf52 */ screen_xterm_xfree86_s_kf52,
+ /* 258: kf53 */ screen_xterm_xfree86_s_kf53,
+ /* 259: kf54 */ screen_xterm_xfree86_s_kf54,
+ /* 260: kf55 */ screen_xterm_xfree86_s_kf55,
+ /* 261: kf56 */ screen_xterm_xfree86_s_kf56,
+ /* 262: kf57 */ screen_xterm_xfree86_s_kf57,
+ /* 263: kf58 */ screen_xterm_xfree86_s_kf58,
+ /* 264: kf59 */ screen_xterm_xfree86_s_kf59,
+ /* 265: kf60 */ screen_xterm_xfree86_s_kf60,
+ /* 266: kf61 */ screen_xterm_xfree86_s_kf61,
+ /* 267: kf62 */ screen_xterm_xfree86_s_kf62,
+ /* 268: kf63 */ screen_xterm_xfree86_s_kf63,
+ /* 269: el1 */ screen_xterm_xfree86_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ screen_xterm_xfree86_s_u6,
+ /* 294: u7 */ screen_xterm_xfree86_s_u7,
+ /* 295: u8 */ screen_xterm_xfree86_s_u8,
+ /* 296: u9 */ screen_xterm_xfree86_s_u9,
+ /* 297: op */ screen_xterm_xfree86_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ screen_xterm_xfree86_s_setf,
+ /* 303: setb */ screen_xterm_xfree86_s_setb,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ screen_xterm_xfree86_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ screen_xterm_xfree86_s_setaf,
+ /* 360: setab */ screen_xterm_xfree86_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ CANCELLED_STRING,
+ /* 412: memu */ CANCELLED_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+/* screen.xterm-256color */
+
+static char screen_xterm_256color_alias_data[] = "screen.xterm-256color|GNU Screen with xterm using 256 colors";
+
+static char screen_xterm_256color_s_cbt[] = "\033[Z";
+static char screen_xterm_256color_s_bel[] = "\007";
+static char screen_xterm_256color_s_cr[] = "\015";
+static char screen_xterm_256color_s_csr[] = "\033[%i%p1%d;%p2%dr";
+static char screen_xterm_256color_s_tbc[] = "\033[3g";
+static char screen_xterm_256color_s_clear[] = "\033[H\033[2J";
+static char screen_xterm_256color_s_el[] = "\033[K";
+static char screen_xterm_256color_s_ed[] = "\033[J";
+static char screen_xterm_256color_s_hpa[] = "\033[%i%p1%dG";
+static char screen_xterm_256color_s_cup[] = "\033[%i%p1%d;%p2%dH";
+static char screen_xterm_256color_s_cud1[] = "\012";
+static char screen_xterm_256color_s_home[] = "\033[H";
+static char screen_xterm_256color_s_civis[] = "\033[?25l";
+static char screen_xterm_256color_s_cub1[] = "\010";
+static char screen_xterm_256color_s_cnorm[] = "\033[?12l\033[?25h";
+static char screen_xterm_256color_s_cuf1[] = "\033[C";
+static char screen_xterm_256color_s_cuu1[] = "\033[A";
+static char screen_xterm_256color_s_cvvis[] = "\033[?12;25h";
+static char screen_xterm_256color_s_dch1[] = "\033[P";
+static char screen_xterm_256color_s_dl1[] = "\033[M";
+static char screen_xterm_256color_s_smacs[] = "\033(0";
+static char screen_xterm_256color_s_blink[] = "\033[5m";
+static char screen_xterm_256color_s_bold[] = "\033[1m";
+static char screen_xterm_256color_s_smcup[] = "\033[?1049h\033[22;0;0t";
+static char screen_xterm_256color_s_dim[] = "\033[2m";
+static char screen_xterm_256color_s_smir[] = "\033[4h";
+static char screen_xterm_256color_s_rev[] = "\033[7m";
+static char screen_xterm_256color_s_smso[] = "\033[7m";
+static char screen_xterm_256color_s_smul[] = "\033[4m";
+static char screen_xterm_256color_s_ech[] = "\033[%p1%dX";
+static char screen_xterm_256color_s_rmacs[] = "\033(B";
+static char screen_xterm_256color_s_sgr0[] = "\033(B\033[m";
+static char screen_xterm_256color_s_rmcup[] = "\033[?1049l\033[23;0;0t";
+static char screen_xterm_256color_s_rmir[] = "\033[4l";
+static char screen_xterm_256color_s_rmso[] = "\033[27m";
+static char screen_xterm_256color_s_rmul[] = "\033[24m";
+static char screen_xterm_256color_s_flash[] = "\033[?5h$<100/>\033[?5l";
+static char screen_xterm_256color_s_is2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char screen_xterm_256color_s_il1[] = "\033[L";
+static char screen_xterm_256color_s_kbs[] = "\010";
+static char screen_xterm_256color_s_kdch1[] = "\033[3~";
+static char screen_xterm_256color_s_kcud1[] = "\033OB";
+static char screen_xterm_256color_s_kf1[] = "\033OP";
+static char screen_xterm_256color_s_kf10[] = "\033[21~";
+static char screen_xterm_256color_s_kf2[] = "\033OQ";
+static char screen_xterm_256color_s_kf3[] = "\033OR";
+static char screen_xterm_256color_s_kf4[] = "\033OS";
+static char screen_xterm_256color_s_kf5[] = "\033[15~";
+static char screen_xterm_256color_s_kf6[] = "\033[17~";
+static char screen_xterm_256color_s_kf7[] = "\033[18~";
+static char screen_xterm_256color_s_kf8[] = "\033[19~";
+static char screen_xterm_256color_s_kf9[] = "\033[20~";
+static char screen_xterm_256color_s_khome[] = "\033[1~";
+static char screen_xterm_256color_s_kich1[] = "\033[2~";
+static char screen_xterm_256color_s_kcub1[] = "\033OD";
+static char screen_xterm_256color_s_knp[] = "\033[6~";
+static char screen_xterm_256color_s_kpp[] = "\033[5~";
+static char screen_xterm_256color_s_kcuf1[] = "\033OC";
+static char screen_xterm_256color_s_kind[] = "\033[1;2B";
+static char screen_xterm_256color_s_kri[] = "\033[1;2A";
+static char screen_xterm_256color_s_kcuu1[] = "\033OA";
+static char screen_xterm_256color_s_rmkx[] = "\033[?1l\033>";
+static char screen_xterm_256color_s_smkx[] = "\033[?1h\033=";
+static char screen_xterm_256color_s_rmm[] = "\033[?1034l";
+static char screen_xterm_256color_s_smm[] = "\033[?1034h";
+static char screen_xterm_256color_s_dch[] = "\033[%p1%dP";
+static char screen_xterm_256color_s_dl[] = "\033[%p1%dM";
+static char screen_xterm_256color_s_cud[] = "\033[%p1%dB";
+static char screen_xterm_256color_s_ich[] = "\033[%p1%d@";
+static char screen_xterm_256color_s_indn[] = "\033[%p1%dS";
+static char screen_xterm_256color_s_il[] = "\033[%p1%dL";
+static char screen_xterm_256color_s_cub[] = "\033[%p1%dD";
+static char screen_xterm_256color_s_cuf[] = "\033[%p1%dC";
+static char screen_xterm_256color_s_rin[] = "\033[%p1%dT";
+static char screen_xterm_256color_s_cuu[] = "\033[%p1%dA";
+static char screen_xterm_256color_s_mc0[] = "\033[i";
+static char screen_xterm_256color_s_mc4[] = "\033[4i";
+static char screen_xterm_256color_s_mc5[] = "\033[5i";
+static char screen_xterm_256color_s_rs1[] = "\033c";
+static char screen_xterm_256color_s_rs2[] = "\033[!p\033[?3;4l\033[4l\033>";
+static char screen_xterm_256color_s_rc[] = "\0338";
+static char screen_xterm_256color_s_vpa[] = "\033[%i%p1%dd";
+static char screen_xterm_256color_s_sc[] = "\0337";
+static char screen_xterm_256color_s_ind[] = "\012";
+static char screen_xterm_256color_s_ri[] = "\033M";
+static char screen_xterm_256color_s_sgr[] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m";
+static char screen_xterm_256color_s_hts[] = "\033H";
+static char screen_xterm_256color_s_ht[] = "\011";
+static char screen_xterm_256color_s_kb2[] = "\033OE";
+static char screen_xterm_256color_s_acsc[] = "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~";
+static char screen_xterm_256color_s_kcbt[] = "\033[Z";
+static char screen_xterm_256color_s_smam[] = "\033[?7h";
+static char screen_xterm_256color_s_rmam[] = "\033[?7l";
+static char screen_xterm_256color_s_kend[] = "\033[4~";
+static char screen_xterm_256color_s_kent[] = "\033OM";
+static char screen_xterm_256color_s_kDC[] = "\033[3;2~";
+static char screen_xterm_256color_s_kEND[] = "\033[1;2F";
+static char screen_xterm_256color_s_kHOM[] = "\033[1;2H";
+static char screen_xterm_256color_s_kLFT[] = "\033[1;2D";
+static char screen_xterm_256color_s_kRIT[] = "\033[1;2C";
+static char screen_xterm_256color_s_kf11[] = "\033[23~";
+static char screen_xterm_256color_s_kf12[] = "\033[24~";
+static char screen_xterm_256color_s_kf13[] = "\033[1;2P";
+static char screen_xterm_256color_s_kf14[] = "\033[1;2Q";
+static char screen_xterm_256color_s_kf15[] = "\033[1;2R";
+static char screen_xterm_256color_s_kf16[] = "\033[1;2S";
+static char screen_xterm_256color_s_kf17[] = "\033[15;2~";
+static char screen_xterm_256color_s_kf18[] = "\033[17;2~";
+static char screen_xterm_256color_s_kf19[] = "\033[18;2~";
+static char screen_xterm_256color_s_kf20[] = "\033[19;2~";
+static char screen_xterm_256color_s_kf21[] = "\033[20;2~";
+static char screen_xterm_256color_s_kf22[] = "\033[21;2~";
+static char screen_xterm_256color_s_kf23[] = "\033[23;2~";
+static char screen_xterm_256color_s_kf24[] = "\033[24;2~";
+static char screen_xterm_256color_s_kf25[] = "\033[1;5P";
+static char screen_xterm_256color_s_kf26[] = "\033[1;5Q";
+static char screen_xterm_256color_s_kf27[] = "\033[1;5R";
+static char screen_xterm_256color_s_kf28[] = "\033[1;5S";
+static char screen_xterm_256color_s_kf29[] = "\033[15;5~";
+static char screen_xterm_256color_s_kf30[] = "\033[17;5~";
+static char screen_xterm_256color_s_kf31[] = "\033[18;5~";
+static char screen_xterm_256color_s_kf32[] = "\033[19;5~";
+static char screen_xterm_256color_s_kf33[] = "\033[20;5~";
+static char screen_xterm_256color_s_kf34[] = "\033[21;5~";
+static char screen_xterm_256color_s_kf35[] = "\033[23;5~";
+static char screen_xterm_256color_s_kf36[] = "\033[24;5~";
+static char screen_xterm_256color_s_kf37[] = "\033[1;6P";
+static char screen_xterm_256color_s_kf38[] = "\033[1;6Q";
+static char screen_xterm_256color_s_kf39[] = "\033[1;6R";
+static char screen_xterm_256color_s_kf40[] = "\033[1;6S";
+static char screen_xterm_256color_s_kf41[] = "\033[15;6~";
+static char screen_xterm_256color_s_kf42[] = "\033[17;6~";
+static char screen_xterm_256color_s_kf43[] = "\033[18;6~";
+static char screen_xterm_256color_s_kf44[] = "\033[19;6~";
+static char screen_xterm_256color_s_kf45[] = "\033[20;6~";
+static char screen_xterm_256color_s_kf46[] = "\033[21;6~";
+static char screen_xterm_256color_s_kf47[] = "\033[23;6~";
+static char screen_xterm_256color_s_kf48[] = "\033[24;6~";
+static char screen_xterm_256color_s_kf49[] = "\033[1;3P";
+static char screen_xterm_256color_s_kf50[] = "\033[1;3Q";
+static char screen_xterm_256color_s_kf51[] = "\033[1;3R";
+static char screen_xterm_256color_s_kf52[] = "\033[1;3S";
+static char screen_xterm_256color_s_kf53[] = "\033[15;3~";
+static char screen_xterm_256color_s_kf54[] = "\033[17;3~";
+static char screen_xterm_256color_s_kf55[] = "\033[18;3~";
+static char screen_xterm_256color_s_kf56[] = "\033[19;3~";
+static char screen_xterm_256color_s_kf57[] = "\033[20;3~";
+static char screen_xterm_256color_s_kf58[] = "\033[21;3~";
+static char screen_xterm_256color_s_kf59[] = "\033[23;3~";
+static char screen_xterm_256color_s_kf60[] = "\033[24;3~";
+static char screen_xterm_256color_s_kf61[] = "\033[1;4P";
+static char screen_xterm_256color_s_kf62[] = "\033[1;4Q";
+static char screen_xterm_256color_s_kf63[] = "\033[1;4R";
+static char screen_xterm_256color_s_el1[] = "\033[1K";
+static char screen_xterm_256color_s_u6[] = "\033[%i%d;%dR";
+static char screen_xterm_256color_s_u7[] = "\033[6n";
+static char screen_xterm_256color_s_u8[] = "\033[?%[;0123456789]c";
+static char screen_xterm_256color_s_u9[] = "\033[c";
+static char screen_xterm_256color_s_op[] = "\033[39;49m";
+static char screen_xterm_256color_s_kmous[] = "\033[M";
+static char screen_xterm_256color_s_setaf[] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m";
+static char screen_xterm_256color_s_setab[] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m";
+
+static char screen_xterm_256color_bool_data[] = {
+ /* 0: bw */ TRUE,
+ /* 1: am */ TRUE,
+ /* 2: xsb */ FALSE,
+ /* 3: xhp */ FALSE,
+ /* 4: xenl */ TRUE,
+ /* 5: eo */ FALSE,
+ /* 6: gn */ FALSE,
+ /* 7: hc */ FALSE,
+ /* 8: km */ TRUE,
+ /* 9: hs */ FALSE,
+ /* 10: in */ FALSE,
+ /* 11: da */ FALSE,
+ /* 12: db */ FALSE,
+ /* 13: mir */ TRUE,
+ /* 14: msgr */ TRUE,
+ /* 15: os */ FALSE,
+ /* 16: eslok */ FALSE,
+ /* 17: xt */ FALSE,
+ /* 18: hz */ FALSE,
+ /* 19: ul */ FALSE,
+ /* 20: xon */ FALSE,
+ /* 21: nxon */ FALSE,
+ /* 22: mc5i */ TRUE,
+ /* 23: chts */ FALSE,
+ /* 24: nrrmc */ FALSE,
+ /* 25: npc */ TRUE,
+ /* 26: ndscr */ FALSE,
+ /* 27: ccc */ FALSE,
+ /* 28: bce */ FALSE,
+ /* 29: hls */ FALSE,
+ /* 30: xhpa */ FALSE,
+ /* 31: crxm */ FALSE,
+ /* 32: daisy */ FALSE,
+ /* 33: xvpa */ FALSE,
+ /* 34: sam */ FALSE,
+ /* 35: cpix */ FALSE,
+ /* 36: lpix */ FALSE,
+ /* 37: OTbs */ TRUE,
+ /* 38: OTns */ FALSE,
+ /* 39: OTnc */ FALSE,
+ /* 40: OTMT */ FALSE,
+ /* 41: OTNL */ FALSE,
+ /* 42: OTpt */ FALSE,
+ /* 43: OTxr */ FALSE,
+};
+static NCURSES_INT2 screen_xterm_256color_number_data[] = {
+ /* 0: cols */ 80,
+ /* 1: it */ 8,
+ /* 2: lines */ 24,
+ /* 3: lm */ ABSENT_NUMERIC,
+ /* 4: xmc */ ABSENT_NUMERIC,
+ /* 5: pb */ ABSENT_NUMERIC,
+ /* 6: vt */ ABSENT_NUMERIC,
+ /* 7: wsl */ ABSENT_NUMERIC,
+ /* 8: nlab */ ABSENT_NUMERIC,
+ /* 9: lh */ ABSENT_NUMERIC,
+ /* 10: lw */ ABSENT_NUMERIC,
+ /* 11: ma */ ABSENT_NUMERIC,
+ /* 12: wnum */ ABSENT_NUMERIC,
+ /* 13: colors */ 256,
+ /* 14: pairs */ 32767,
+ /* 15: ncv */ ABSENT_NUMERIC,
+ /* 16: bufsz */ ABSENT_NUMERIC,
+ /* 17: spinv */ ABSENT_NUMERIC,
+ /* 18: spinh */ ABSENT_NUMERIC,
+ /* 19: maddr */ ABSENT_NUMERIC,
+ /* 20: mjump */ ABSENT_NUMERIC,
+ /* 21: mcs */ ABSENT_NUMERIC,
+ /* 22: mls */ ABSENT_NUMERIC,
+ /* 23: npins */ ABSENT_NUMERIC,
+ /* 24: orc */ ABSENT_NUMERIC,
+ /* 25: orl */ ABSENT_NUMERIC,
+ /* 26: orhi */ ABSENT_NUMERIC,
+ /* 27: orvi */ ABSENT_NUMERIC,
+ /* 28: cps */ ABSENT_NUMERIC,
+ /* 29: widcs */ ABSENT_NUMERIC,
+ /* 30: btns */ ABSENT_NUMERIC,
+ /* 31: bitwin */ ABSENT_NUMERIC,
+ /* 32: bitype */ ABSENT_NUMERIC,
+ /* 33: OTug */ ABSENT_NUMERIC,
+ /* 34: OTdC */ ABSENT_NUMERIC,
+ /* 35: OTdN */ ABSENT_NUMERIC,
+ /* 36: OTdB */ ABSENT_NUMERIC,
+ /* 37: OTdT */ ABSENT_NUMERIC,
+ /* 38: OTkn */ ABSENT_NUMERIC,
+};
+static char * screen_xterm_256color_string_data[] = {
+ /* 0: cbt */ screen_xterm_256color_s_cbt,
+ /* 1: bel */ screen_xterm_256color_s_bel,
+ /* 2: cr */ screen_xterm_256color_s_cr,
+ /* 3: csr */ screen_xterm_256color_s_csr,
+ /* 4: tbc */ screen_xterm_256color_s_tbc,
+ /* 5: clear */ screen_xterm_256color_s_clear,
+ /* 6: el */ screen_xterm_256color_s_el,
+ /* 7: ed */ screen_xterm_256color_s_ed,
+ /* 8: hpa */ screen_xterm_256color_s_hpa,
+ /* 9: cmdch */ ABSENT_STRING,
+ /* 10: cup */ screen_xterm_256color_s_cup,
+ /* 11: cud1 */ screen_xterm_256color_s_cud1,
+ /* 12: home */ screen_xterm_256color_s_home,
+ /* 13: civis */ screen_xterm_256color_s_civis,
+ /* 14: cub1 */ screen_xterm_256color_s_cub1,
+ /* 15: mrcup */ ABSENT_STRING,
+ /* 16: cnorm */ screen_xterm_256color_s_cnorm,
+ /* 17: cuf1 */ screen_xterm_256color_s_cuf1,
+ /* 18: ll */ ABSENT_STRING,
+ /* 19: cuu1 */ screen_xterm_256color_s_cuu1,
+ /* 20: cvvis */ screen_xterm_256color_s_cvvis,
+ /* 21: dch1 */ screen_xterm_256color_s_dch1,
+ /* 22: dl1 */ screen_xterm_256color_s_dl1,
+ /* 23: dsl */ ABSENT_STRING,
+ /* 24: hd */ ABSENT_STRING,
+ /* 25: smacs */ screen_xterm_256color_s_smacs,
+ /* 26: blink */ screen_xterm_256color_s_blink,
+ /* 27: bold */ screen_xterm_256color_s_bold,
+ /* 28: smcup */ screen_xterm_256color_s_smcup,
+ /* 29: smdc */ ABSENT_STRING,
+ /* 30: dim */ screen_xterm_256color_s_dim,
+ /* 31: smir */ screen_xterm_256color_s_smir,
+ /* 32: invis */ ABSENT_STRING,
+ /* 33: prot */ ABSENT_STRING,
+ /* 34: rev */ screen_xterm_256color_s_rev,
+ /* 35: smso */ screen_xterm_256color_s_smso,
+ /* 36: smul */ screen_xterm_256color_s_smul,
+ /* 37: ech */ screen_xterm_256color_s_ech,
+ /* 38: rmacs */ screen_xterm_256color_s_rmacs,
+ /* 39: sgr0 */ screen_xterm_256color_s_sgr0,
+ /* 40: rmcup */ screen_xterm_256color_s_rmcup,
+ /* 41: rmdc */ ABSENT_STRING,
+ /* 42: rmir */ screen_xterm_256color_s_rmir,
+ /* 43: rmso */ screen_xterm_256color_s_rmso,
+ /* 44: rmul */ screen_xterm_256color_s_rmul,
+ /* 45: flash */ screen_xterm_256color_s_flash,
+ /* 46: ff */ ABSENT_STRING,
+ /* 47: fsl */ ABSENT_STRING,
+ /* 48: is1 */ ABSENT_STRING,
+ /* 49: is2 */ screen_xterm_256color_s_is2,
+ /* 50: is3 */ ABSENT_STRING,
+ /* 51: if */ ABSENT_STRING,
+ /* 52: ich1 */ ABSENT_STRING,
+ /* 53: il1 */ screen_xterm_256color_s_il1,
+ /* 54: ip */ ABSENT_STRING,
+ /* 55: kbs */ screen_xterm_256color_s_kbs,
+ /* 56: ktbc */ ABSENT_STRING,
+ /* 57: kclr */ ABSENT_STRING,
+ /* 58: kctab */ ABSENT_STRING,
+ /* 59: kdch1 */ screen_xterm_256color_s_kdch1,
+ /* 60: kdl1 */ ABSENT_STRING,
+ /* 61: kcud1 */ screen_xterm_256color_s_kcud1,
+ /* 62: krmir */ ABSENT_STRING,
+ /* 63: kel */ ABSENT_STRING,
+ /* 64: ked */ ABSENT_STRING,
+ /* 65: kf0 */ ABSENT_STRING,
+ /* 66: kf1 */ screen_xterm_256color_s_kf1,
+ /* 67: kf10 */ screen_xterm_256color_s_kf10,
+ /* 68: kf2 */ screen_xterm_256color_s_kf2,
+ /* 69: kf3 */ screen_xterm_256color_s_kf3,
+ /* 70: kf4 */ screen_xterm_256color_s_kf4,
+ /* 71: kf5 */ screen_xterm_256color_s_kf5,
+ /* 72: kf6 */ screen_xterm_256color_s_kf6,
+ /* 73: kf7 */ screen_xterm_256color_s_kf7,
+ /* 74: kf8 */ screen_xterm_256color_s_kf8,
+ /* 75: kf9 */ screen_xterm_256color_s_kf9,
+ /* 76: khome */ screen_xterm_256color_s_khome,
+ /* 77: kich1 */ screen_xterm_256color_s_kich1,
+ /* 78: kil1 */ ABSENT_STRING,
+ /* 79: kcub1 */ screen_xterm_256color_s_kcub1,
+ /* 80: kll */ ABSENT_STRING,
+ /* 81: knp */ screen_xterm_256color_s_knp,
+ /* 82: kpp */ screen_xterm_256color_s_kpp,
+ /* 83: kcuf1 */ screen_xterm_256color_s_kcuf1,
+ /* 84: kind */ screen_xterm_256color_s_kind,
+ /* 85: kri */ screen_xterm_256color_s_kri,
+ /* 86: khts */ ABSENT_STRING,
+ /* 87: kcuu1 */ screen_xterm_256color_s_kcuu1,
+ /* 88: rmkx */ screen_xterm_256color_s_rmkx,
+ /* 89: smkx */ screen_xterm_256color_s_smkx,
+ /* 90: lf0 */ ABSENT_STRING,
+ /* 91: lf1 */ ABSENT_STRING,
+ /* 92: lf10 */ ABSENT_STRING,
+ /* 93: lf2 */ ABSENT_STRING,
+ /* 94: lf3 */ ABSENT_STRING,
+ /* 95: lf4 */ ABSENT_STRING,
+ /* 96: lf5 */ ABSENT_STRING,
+ /* 97: lf6 */ ABSENT_STRING,
+ /* 98: lf7 */ ABSENT_STRING,
+ /* 99: lf8 */ ABSENT_STRING,
+ /* 100: lf9 */ ABSENT_STRING,
+ /* 101: rmm */ screen_xterm_256color_s_rmm,
+ /* 102: smm */ screen_xterm_256color_s_smm,
+ /* 103: nel */ ABSENT_STRING,
+ /* 104: pad */ ABSENT_STRING,
+ /* 105: dch */ screen_xterm_256color_s_dch,
+ /* 106: dl */ screen_xterm_256color_s_dl,
+ /* 107: cud */ screen_xterm_256color_s_cud,
+ /* 108: ich */ screen_xterm_256color_s_ich,
+ /* 109: indn */ screen_xterm_256color_s_indn,
+ /* 110: il */ screen_xterm_256color_s_il,
+ /* 111: cub */ screen_xterm_256color_s_cub,
+ /* 112: cuf */ screen_xterm_256color_s_cuf,
+ /* 113: rin */ screen_xterm_256color_s_rin,
+ /* 114: cuu */ screen_xterm_256color_s_cuu,
+ /* 115: pfkey */ ABSENT_STRING,
+ /* 116: pfloc */ ABSENT_STRING,
+ /* 117: pfx */ ABSENT_STRING,
+ /* 118: mc0 */ screen_xterm_256color_s_mc0,
+ /* 119: mc4 */ screen_xterm_256color_s_mc4,
+ /* 120: mc5 */ screen_xterm_256color_s_mc5,
+ /* 121: rep */ ABSENT_STRING,
+ /* 122: rs1 */ screen_xterm_256color_s_rs1,
+ /* 123: rs2 */ screen_xterm_256color_s_rs2,
+ /* 124: rs3 */ ABSENT_STRING,
+ /* 125: rf */ ABSENT_STRING,
+ /* 126: rc */ screen_xterm_256color_s_rc,
+ /* 127: vpa */ screen_xterm_256color_s_vpa,
+ /* 128: sc */ screen_xterm_256color_s_sc,
+ /* 129: ind */ screen_xterm_256color_s_ind,
+ /* 130: ri */ screen_xterm_256color_s_ri,
+ /* 131: sgr */ screen_xterm_256color_s_sgr,
+ /* 132: hts */ screen_xterm_256color_s_hts,
+ /* 133: wind */ ABSENT_STRING,
+ /* 134: ht */ screen_xterm_256color_s_ht,
+ /* 135: tsl */ ABSENT_STRING,
+ /* 136: uc */ ABSENT_STRING,
+ /* 137: hu */ ABSENT_STRING,
+ /* 138: iprog */ ABSENT_STRING,
+ /* 139: ka1 */ ABSENT_STRING,
+ /* 140: ka3 */ ABSENT_STRING,
+ /* 141: kb2 */ screen_xterm_256color_s_kb2,
+ /* 142: kc1 */ ABSENT_STRING,
+ /* 143: kc3 */ ABSENT_STRING,
+ /* 144: mc5p */ ABSENT_STRING,
+ /* 145: rmp */ ABSENT_STRING,
+ /* 146: acsc */ screen_xterm_256color_s_acsc,
+ /* 147: pln */ ABSENT_STRING,
+ /* 148: kcbt */ screen_xterm_256color_s_kcbt,
+ /* 149: smxon */ ABSENT_STRING,
+ /* 150: rmxon */ ABSENT_STRING,
+ /* 151: smam */ screen_xterm_256color_s_smam,
+ /* 152: rmam */ screen_xterm_256color_s_rmam,
+ /* 153: xonc */ ABSENT_STRING,
+ /* 154: xoffc */ ABSENT_STRING,
+ /* 155: enacs */ ABSENT_STRING,
+ /* 156: smln */ ABSENT_STRING,
+ /* 157: rmln */ ABSENT_STRING,
+ /* 158: kbeg */ ABSENT_STRING,
+ /* 159: kcan */ ABSENT_STRING,
+ /* 160: kclo */ ABSENT_STRING,
+ /* 161: kcmd */ ABSENT_STRING,
+ /* 162: kcpy */ ABSENT_STRING,
+ /* 163: kcrt */ ABSENT_STRING,
+ /* 164: kend */ screen_xterm_256color_s_kend,
+ /* 165: kent */ screen_xterm_256color_s_kent,
+ /* 166: kext */ ABSENT_STRING,
+ /* 167: kfnd */ ABSENT_STRING,
+ /* 168: khlp */ ABSENT_STRING,
+ /* 169: kmrk */ ABSENT_STRING,
+ /* 170: kmsg */ ABSENT_STRING,
+ /* 171: kmov */ ABSENT_STRING,
+ /* 172: knxt */ ABSENT_STRING,
+ /* 173: kopn */ ABSENT_STRING,
+ /* 174: kopt */ ABSENT_STRING,
+ /* 175: kprv */ ABSENT_STRING,
+ /* 176: kprt */ ABSENT_STRING,
+ /* 177: krdo */ ABSENT_STRING,
+ /* 178: kref */ ABSENT_STRING,
+ /* 179: krfr */ ABSENT_STRING,
+ /* 180: krpl */ ABSENT_STRING,
+ /* 181: krst */ ABSENT_STRING,
+ /* 182: kres */ ABSENT_STRING,
+ /* 183: ksav */ ABSENT_STRING,
+ /* 184: kspd */ ABSENT_STRING,
+ /* 185: kund */ ABSENT_STRING,
+ /* 186: kBEG */ ABSENT_STRING,
+ /* 187: kCAN */ ABSENT_STRING,
+ /* 188: kCMD */ ABSENT_STRING,
+ /* 189: kCPY */ ABSENT_STRING,
+ /* 190: kCRT */ ABSENT_STRING,
+ /* 191: kDC */ screen_xterm_256color_s_kDC,
+ /* 192: kDL */ ABSENT_STRING,
+ /* 193: kslt */ ABSENT_STRING,
+ /* 194: kEND */ screen_xterm_256color_s_kEND,
+ /* 195: kEOL */ ABSENT_STRING,
+ /* 196: kEXT */ ABSENT_STRING,
+ /* 197: kFND */ ABSENT_STRING,
+ /* 198: kHLP */ ABSENT_STRING,
+ /* 199: kHOM */ screen_xterm_256color_s_kHOM,
+ /* 200: kIC */ ABSENT_STRING,
+ /* 201: kLFT */ screen_xterm_256color_s_kLFT,
+ /* 202: kMSG */ ABSENT_STRING,
+ /* 203: kMOV */ ABSENT_STRING,
+ /* 204: kNXT */ ABSENT_STRING,
+ /* 205: kOPT */ ABSENT_STRING,
+ /* 206: kPRV */ ABSENT_STRING,
+ /* 207: kPRT */ ABSENT_STRING,
+ /* 208: kRDO */ ABSENT_STRING,
+ /* 209: kRPL */ ABSENT_STRING,
+ /* 210: kRIT */ screen_xterm_256color_s_kRIT,
+ /* 211: kRES */ ABSENT_STRING,
+ /* 212: kSAV */ ABSENT_STRING,
+ /* 213: kSPD */ ABSENT_STRING,
+ /* 214: kUND */ ABSENT_STRING,
+ /* 215: rfi */ ABSENT_STRING,
+ /* 216: kf11 */ screen_xterm_256color_s_kf11,
+ /* 217: kf12 */ screen_xterm_256color_s_kf12,
+ /* 218: kf13 */ screen_xterm_256color_s_kf13,
+ /* 219: kf14 */ screen_xterm_256color_s_kf14,
+ /* 220: kf15 */ screen_xterm_256color_s_kf15,
+ /* 221: kf16 */ screen_xterm_256color_s_kf16,
+ /* 222: kf17 */ screen_xterm_256color_s_kf17,
+ /* 223: kf18 */ screen_xterm_256color_s_kf18,
+ /* 224: kf19 */ screen_xterm_256color_s_kf19,
+ /* 225: kf20 */ screen_xterm_256color_s_kf20,
+ /* 226: kf21 */ screen_xterm_256color_s_kf21,
+ /* 227: kf22 */ screen_xterm_256color_s_kf22,
+ /* 228: kf23 */ screen_xterm_256color_s_kf23,
+ /* 229: kf24 */ screen_xterm_256color_s_kf24,
+ /* 230: kf25 */ screen_xterm_256color_s_kf25,
+ /* 231: kf26 */ screen_xterm_256color_s_kf26,
+ /* 232: kf27 */ screen_xterm_256color_s_kf27,
+ /* 233: kf28 */ screen_xterm_256color_s_kf28,
+ /* 234: kf29 */ screen_xterm_256color_s_kf29,
+ /* 235: kf30 */ screen_xterm_256color_s_kf30,
+ /* 236: kf31 */ screen_xterm_256color_s_kf31,
+ /* 237: kf32 */ screen_xterm_256color_s_kf32,
+ /* 238: kf33 */ screen_xterm_256color_s_kf33,
+ /* 239: kf34 */ screen_xterm_256color_s_kf34,
+ /* 240: kf35 */ screen_xterm_256color_s_kf35,
+ /* 241: kf36 */ screen_xterm_256color_s_kf36,
+ /* 242: kf37 */ screen_xterm_256color_s_kf37,
+ /* 243: kf38 */ screen_xterm_256color_s_kf38,
+ /* 244: kf39 */ screen_xterm_256color_s_kf39,
+ /* 245: kf40 */ screen_xterm_256color_s_kf40,
+ /* 246: kf41 */ screen_xterm_256color_s_kf41,
+ /* 247: kf42 */ screen_xterm_256color_s_kf42,
+ /* 248: kf43 */ screen_xterm_256color_s_kf43,
+ /* 249: kf44 */ screen_xterm_256color_s_kf44,
+ /* 250: kf45 */ screen_xterm_256color_s_kf45,
+ /* 251: kf46 */ screen_xterm_256color_s_kf46,
+ /* 252: kf47 */ screen_xterm_256color_s_kf47,
+ /* 253: kf48 */ screen_xterm_256color_s_kf48,
+ /* 254: kf49 */ screen_xterm_256color_s_kf49,
+ /* 255: kf50 */ screen_xterm_256color_s_kf50,
+ /* 256: kf51 */ screen_xterm_256color_s_kf51,
+ /* 257: kf52 */ screen_xterm_256color_s_kf52,
+ /* 258: kf53 */ screen_xterm_256color_s_kf53,
+ /* 259: kf54 */ screen_xterm_256color_s_kf54,
+ /* 260: kf55 */ screen_xterm_256color_s_kf55,
+ /* 261: kf56 */ screen_xterm_256color_s_kf56,
+ /* 262: kf57 */ screen_xterm_256color_s_kf57,
+ /* 263: kf58 */ screen_xterm_256color_s_kf58,
+ /* 264: kf59 */ screen_xterm_256color_s_kf59,
+ /* 265: kf60 */ screen_xterm_256color_s_kf60,
+ /* 266: kf61 */ screen_xterm_256color_s_kf61,
+ /* 267: kf62 */ screen_xterm_256color_s_kf62,
+ /* 268: kf63 */ screen_xterm_256color_s_kf63,
+ /* 269: el1 */ screen_xterm_256color_s_el1,
+ /* 270: mgc */ ABSENT_STRING,
+ /* 271: smgl */ ABSENT_STRING,
+ /* 272: smgr */ ABSENT_STRING,
+ /* 273: fln */ ABSENT_STRING,
+ /* 274: sclk */ ABSENT_STRING,
+ /* 275: dclk */ ABSENT_STRING,
+ /* 276: rmclk */ ABSENT_STRING,
+ /* 277: cwin */ ABSENT_STRING,
+ /* 278: wingo */ ABSENT_STRING,
+ /* 279: hup */ ABSENT_STRING,
+ /* 280: dial */ ABSENT_STRING,
+ /* 281: qdial */ ABSENT_STRING,
+ /* 282: tone */ ABSENT_STRING,
+ /* 283: pulse */ ABSENT_STRING,
+ /* 284: hook */ ABSENT_STRING,
+ /* 285: pause */ ABSENT_STRING,
+ /* 286: wait */ ABSENT_STRING,
+ /* 287: u0 */ ABSENT_STRING,
+ /* 288: u1 */ ABSENT_STRING,
+ /* 289: u2 */ ABSENT_STRING,
+ /* 290: u3 */ ABSENT_STRING,
+ /* 291: u4 */ ABSENT_STRING,
+ /* 292: u5 */ ABSENT_STRING,
+ /* 293: u6 */ screen_xterm_256color_s_u6,
+ /* 294: u7 */ screen_xterm_256color_s_u7,
+ /* 295: u8 */ screen_xterm_256color_s_u8,
+ /* 296: u9 */ screen_xterm_256color_s_u9,
+ /* 297: op */ screen_xterm_256color_s_op,
+ /* 298: oc */ ABSENT_STRING,
+ /* 299: initc */ ABSENT_STRING,
+ /* 300: initp */ ABSENT_STRING,
+ /* 301: scp */ ABSENT_STRING,
+ /* 302: setf */ ABSENT_STRING,
+ /* 303: setb */ ABSENT_STRING,
+ /* 304: cpi */ ABSENT_STRING,
+ /* 305: lpi */ ABSENT_STRING,
+ /* 306: chr */ ABSENT_STRING,
+ /* 307: cvr */ ABSENT_STRING,
+ /* 308: defc */ ABSENT_STRING,
+ /* 309: swidm */ ABSENT_STRING,
+ /* 310: sdrfq */ ABSENT_STRING,
+ /* 311: sitm */ ABSENT_STRING,
+ /* 312: slm */ ABSENT_STRING,
+ /* 313: smicm */ ABSENT_STRING,
+ /* 314: snlq */ ABSENT_STRING,
+ /* 315: snrmq */ ABSENT_STRING,
+ /* 316: sshm */ ABSENT_STRING,
+ /* 317: ssubm */ ABSENT_STRING,
+ /* 318: ssupm */ ABSENT_STRING,
+ /* 319: sum */ ABSENT_STRING,
+ /* 320: rwidm */ ABSENT_STRING,
+ /* 321: ritm */ ABSENT_STRING,
+ /* 322: rlm */ ABSENT_STRING,
+ /* 323: rmicm */ ABSENT_STRING,
+ /* 324: rshm */ ABSENT_STRING,
+ /* 325: rsubm */ ABSENT_STRING,
+ /* 326: rsupm */ ABSENT_STRING,
+ /* 327: rum */ ABSENT_STRING,
+ /* 328: mhpa */ ABSENT_STRING,
+ /* 329: mcud1 */ ABSENT_STRING,
+ /* 330: mcub1 */ ABSENT_STRING,
+ /* 331: mcuf1 */ ABSENT_STRING,
+ /* 332: mvpa */ ABSENT_STRING,
+ /* 333: mcuu1 */ ABSENT_STRING,
+ /* 334: porder */ ABSENT_STRING,
+ /* 335: mcud */ ABSENT_STRING,
+ /* 336: mcub */ ABSENT_STRING,
+ /* 337: mcuf */ ABSENT_STRING,
+ /* 338: mcuu */ ABSENT_STRING,
+ /* 339: scs */ ABSENT_STRING,
+ /* 340: smgb */ ABSENT_STRING,
+ /* 341: smgbp */ ABSENT_STRING,
+ /* 342: smglp */ ABSENT_STRING,
+ /* 343: smgrp */ ABSENT_STRING,
+ /* 344: smgt */ ABSENT_STRING,
+ /* 345: smgtp */ ABSENT_STRING,
+ /* 346: sbim */ ABSENT_STRING,
+ /* 347: scsd */ ABSENT_STRING,
+ /* 348: rbim */ ABSENT_STRING,
+ /* 349: rcsd */ ABSENT_STRING,
+ /* 350: subcs */ ABSENT_STRING,
+ /* 351: supcs */ ABSENT_STRING,
+ /* 352: docr */ ABSENT_STRING,
+ /* 353: zerom */ ABSENT_STRING,
+ /* 354: csnm */ ABSENT_STRING,
+ /* 355: kmous */ screen_xterm_256color_s_kmous,
+ /* 356: minfo */ ABSENT_STRING,
+ /* 357: reqmp */ ABSENT_STRING,
+ /* 358: getm */ ABSENT_STRING,
+ /* 359: setaf */ screen_xterm_256color_s_setaf,
+ /* 360: setab */ screen_xterm_256color_s_setab,
+ /* 361: pfxl */ ABSENT_STRING,
+ /* 362: devt */ ABSENT_STRING,
+ /* 363: csin */ ABSENT_STRING,
+ /* 364: s0ds */ ABSENT_STRING,
+ /* 365: s1ds */ ABSENT_STRING,
+ /* 366: s2ds */ ABSENT_STRING,
+ /* 367: s3ds */ ABSENT_STRING,
+ /* 368: smglr */ ABSENT_STRING,
+ /* 369: smgtb */ ABSENT_STRING,
+ /* 370: birep */ ABSENT_STRING,
+ /* 371: binel */ ABSENT_STRING,
+ /* 372: bicr */ ABSENT_STRING,
+ /* 373: colornm */ ABSENT_STRING,
+ /* 374: defbi */ ABSENT_STRING,
+ /* 375: endbi */ ABSENT_STRING,
+ /* 376: setcolor */ ABSENT_STRING,
+ /* 377: slines */ ABSENT_STRING,
+ /* 378: dispc */ ABSENT_STRING,
+ /* 379: smpch */ ABSENT_STRING,
+ /* 380: rmpch */ ABSENT_STRING,
+ /* 381: smsc */ ABSENT_STRING,
+ /* 382: rmsc */ ABSENT_STRING,
+ /* 383: pctrm */ ABSENT_STRING,
+ /* 384: scesc */ ABSENT_STRING,
+ /* 385: scesa */ ABSENT_STRING,
+ /* 386: ehhlm */ ABSENT_STRING,
+ /* 387: elhlm */ ABSENT_STRING,
+ /* 388: elohlm */ ABSENT_STRING,
+ /* 389: erhlm */ ABSENT_STRING,
+ /* 390: ethlm */ ABSENT_STRING,
+ /* 391: evhlm */ ABSENT_STRING,
+ /* 392: sgr1 */ ABSENT_STRING,
+ /* 393: slength */ ABSENT_STRING,
+ /* 394: OTi2 */ ABSENT_STRING,
+ /* 395: OTrs */ ABSENT_STRING,
+ /* 396: OTnl */ ABSENT_STRING,
+ /* 397: OTbc */ ABSENT_STRING,
+ /* 398: OTko */ ABSENT_STRING,
+ /* 399: OTma */ ABSENT_STRING,
+ /* 400: OTG2 */ ABSENT_STRING,
+ /* 401: OTG3 */ ABSENT_STRING,
+ /* 402: OTG1 */ ABSENT_STRING,
+ /* 403: OTG4 */ ABSENT_STRING,
+ /* 404: OTGR */ ABSENT_STRING,
+ /* 405: OTGL */ ABSENT_STRING,
+ /* 406: OTGU */ ABSENT_STRING,
+ /* 407: OTGD */ ABSENT_STRING,
+ /* 408: OTGH */ ABSENT_STRING,
+ /* 409: OTGV */ ABSENT_STRING,
+ /* 410: OTGC */ ABSENT_STRING,
+ /* 411: meml */ ABSENT_STRING,
+ /* 412: memu */ ABSENT_STRING,
+ /* 413: box1 */ ABSENT_STRING,
+};
+static const TERMTYPE2 fallbacks[10] =
+{
+ /* linux */
+ {
+ linux_alias_data,
+ (char *)0, /* pointer to string table */
+ linux_bool_data,
+ linux_number_data,
+ linux_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* rxvt */
+ {
+ rxvt_alias_data,
+ (char *)0, /* pointer to string table */
+ rxvt_bool_data,
+ rxvt_number_data,
+ rxvt_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* vt100 */
+ {
+ vt100_alias_data,
+ (char *)0, /* pointer to string table */
+ vt100_bool_data,
+ vt100_number_data,
+ vt100_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* xterm */
+ {
+ xterm_alias_data,
+ (char *)0, /* pointer to string table */
+ xterm_bool_data,
+ xterm_number_data,
+ xterm_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* xterm-256color */
+ {
+ xterm_256color_alias_data,
+ (char *)0, /* pointer to string table */
+ xterm_256color_bool_data,
+ xterm_256color_number_data,
+ xterm_256color_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* screen */
+ {
+ screen_alias_data,
+ (char *)0, /* pointer to string table */
+ screen_bool_data,
+ screen_number_data,
+ screen_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* screen.linux */
+ {
+ screen_linux_alias_data,
+ (char *)0, /* pointer to string table */
+ screen_linux_bool_data,
+ screen_linux_number_data,
+ screen_linux_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* screen.rxvt */
+ {
+ screen_rxvt_alias_data,
+ (char *)0, /* pointer to string table */
+ screen_rxvt_bool_data,
+ screen_rxvt_number_data,
+ screen_rxvt_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* screen.xterm-new */
+ {
+ screen_xterm_xfree86_alias_data,
+ (char *)0, /* pointer to string table */
+ screen_xterm_xfree86_bool_data,
+ screen_xterm_xfree86_number_data,
+ screen_xterm_xfree86_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+, /* screen.xterm-256color */
+ {
+ screen_xterm_256color_alias_data,
+ (char *)0, /* pointer to string table */
+ screen_xterm_256color_bool_data,
+ screen_xterm_256color_number_data,
+ screen_xterm_256color_string_data,
+#if NCURSES_XNAMES
+ (char *)0, /* pointer to extended string table */
+ (char **)0, /* ...corresponding names */
+ 44, /* count total Booleans */
+ 39, /* count total Numbers */
+ 414, /* count total Strings */
+ 0, /* count extensions to Booleans */
+ 0, /* count extensions to Numbers */
+ 0, /* count extensions to Strings */
+#endif /* NCURSES_XNAMES */
+ }
+};
+
+NCURSES_EXPORT(const TERMTYPE2 *)
+_nc_fallback2 (const char *name GCC_UNUSED)
+{
+ const TERMTYPE2 *tp;
+
+ for (tp = fallbacks;
+ tp < fallbacks + sizeof(fallbacks)/sizeof(TERMTYPE2);
+ tp++) {
+ if (_nc_name_match(tp->term_names, name, "|")) {
+ return(tp);
+ }
+ }
+ return((const TERMTYPE2 *)0);
+}
+
+#if NCURSES_EXT_NUMBERS
+#undef _nc_fallback
+
+/*
+ * This entrypoint is used by tack.
+ */
+NCURSES_EXPORT(const TERMTYPE *)
+_nc_fallback (const char *name)
+{
+ const TERMTYPE2 *tp = _nc_fallback2(name);
+ const TERMTYPE *result = 0;
+ if (tp != 0) {
+ static TERMTYPE temp;
+ _nc_export_termtype2(&temp, tp);
+ result = &temp;
+ }
+ return result;
+}
+#endif
diff --git a/contrib/depends/patches/openssl/fix_arflags.patch b/contrib/depends/patches/openssl/fix_arflags.patch
new file mode 100644
index 000000000..2d2900d80
--- /dev/null
+++ b/contrib/depends/patches/openssl/fix_arflags.patch
@@ -0,0 +1,24 @@
+--- Makefile.org.O 2019-02-26 14:20:20.000000000 +0000
++++ Makefile.org 2019-11-15 13:05:54.370086856 +0000
+@@ -63,8 +63,8 @@
+ PEX_LIBS=
+ EX_LIBS=
+ EXE_EXT=
+-ARFLAGS=
+-AR=ar $(ARFLAGS) r
++ARFLAGS= r
++AR=ar $(ARFLAGS)
+ RANLIB= ranlib
+ RC= windres
+ NM= nm
+--- Configure.O 2019-02-26 14:20:20.000000000 +0000
++++ Configure 2019-11-16 07:43:14.933990774 +0000
+@@ -1251,7 +1251,7 @@
+ my $shared_extension = $fields[$idx_shared_extension];
+ my $ranlib = $ENV{'RANLIB'} || $fields[$idx_ranlib];
+ my $ar = $ENV{'AR'} || "ar";
+-my $arflags = $fields[$idx_arflags];
++my $arflags = $ENV{'ARFLAGS'} || $fields[$idx_arflags];
+ my $windres = $ENV{'RC'} || $ENV{'WINDRES'} || "windres";
+ my $multilib = $fields[$idx_multilib];
+
diff --git a/contrib/depends/patches/unwind/fix_obj_order.patch b/contrib/depends/patches/unwind/fix_obj_order.patch
new file mode 100644
index 000000000..374a9f04a
--- /dev/null
+++ b/contrib/depends/patches/unwind/fix_obj_order.patch
@@ -0,0 +1,11 @@
+--- config/ltmain.sh.O 2017-01-13 16:00:54.000000000 +0000
++++ config/ltmain.sh 2019-11-17 06:46:51.994402494 +0000
+@@ -7957,6 +7957,8 @@
+ esac
+ done
+ fi
++ oldobjs=`for obj in $oldobjs; do echo $obj; done | sort`
++ oldobjs=" `echo $oldobjs`"
+ eval cmds=\"$old_archive_cmds\"
+
+ func_len " $cmds"
diff --git a/contrib/depends/patches/zeromq/ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch b/contrib/depends/patches/zeromq/ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch
new file mode 100644
index 000000000..a532df1b6
--- /dev/null
+++ b/contrib/depends/patches/zeromq/ffe62d3398d5e0191f554f61049aa7ec9fc892ae.patch
@@ -0,0 +1,38 @@
+From ffe62d3398d5e0191f554f61049aa7ec9fc892ae Mon Sep 17 00:00:00 2001
+From: Gregory Lemercier <greglemercier@free.fr>
+Date: Sun, 7 Oct 2018 18:06:54 +0200
+Subject: [PATCH] Fix build on arm64 architectures with some strict compilers
+
+This patch fixes an issue that occurs on 64-bit architetures under
+strict compiler rules. The code initially checked that the received
+size stored in 'uint64_t' was not bigger than the max value of a
+'size_t' variable, which is legitimate on 32-bit architectures where
+'size_t' variables are stored on 32 bits. On 64-bit architectures,
+this test no longer makes sense since 'uint64_t' and 'size_t' types
+have the same size. The issue is fixed by ignoring this portion
+of code when built for arm64.
+---
+ src/v1_decoder.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/v1_decoder.cpp b/src/v1_decoder.cpp
+index b002dc9d..2c8c97a7 100644
+--- a/src/v1_decoder.cpp
++++ b/src/v1_decoder.cpp
+@@ -114,11 +114,13 @@ int zmq::v1_decoder_t::eight_byte_size_ready ()
+ return -1;
+ }
+
++#ifndef __aarch64__
+ // Message size must fit within range of size_t data type.
+ if (payload_length - 1 > std::numeric_limits <size_t>::max ()) {
+ errno = EMSGSIZE;
+ return -1;
+ }
++#endif
+
+ const size_t msg_size = static_cast <size_t> (payload_length - 1);
+
+--
+2.20.1
+
diff --git a/contrib/depends/toolchain.cmake.in b/contrib/depends/toolchain.cmake.in
index ebe96b69c..c56f3eb2e 100644
--- a/contrib/depends/toolchain.cmake.in
+++ b/contrib/depends/toolchain.cmake.in
@@ -1,4 +1,4 @@
-# Set the system name, either Darwin, Linux, or Windows
+# Set the system name to one of Android, Darwin, FreeBSD, Linux, or Windows
SET(CMAKE_SYSTEM_NAME @depends@)
SET(CMAKE_BUILD_TYPE @release_type@)
@@ -18,17 +18,19 @@ SET(CMAKE_FIND_ROOT_PATH @prefix@ /usr)
SET(ENV{PKG_CONFIG_PATH} @prefix@/lib/pkgconfig)
-SET(LRELEASE_PATH @prefix@/native/bin CACHE FILEPATH "path to lrelease" FORCE)
-
SET(Readline_ROOT_DIR @prefix@)
SET(Readline_INCLUDE_DIR @prefix@/include)
SET(Readline_LIBRARY @prefix@/lib/libreadline.a)
-SET(Termcap_LIBRARY @prefix@/lib/libtinfo.a)
+SET(Terminfo_LIBRARY @prefix@/lib/libtinfo.a)
+SET(LRELEASE_PATH @prefix@/native/bin CACHE FILEPATH "path to lrelease" FORCE)
+
+if(NOT CMAKE_SYSTEM_NAME STREQUAL "Android")
SET(LIBUNWIND_INCLUDE_DIR @prefix@/include)
SET(LIBUNWIND_LIBRARIES @prefix@/lib/libunwind.a)
SET(LIBUNWIND_LIBRARY_DIRS @prefix@/lib)
+if(NOT CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
SET(LIBUSB-1.0_LIBRARY @prefix@/lib/libusb-1.0.a)
SET(LIBUDEV_LIBRARY @prefix@/lib/libudev.a)
@@ -37,6 +39,9 @@ SET(Protobuf_PROTOC_EXECUTABLE @prefix@/native/bin/protoc CACHE FILEPATH "Path t
SET(Protobuf_INCLUDE_DIR @prefix@/include CACHE PATH "Protobuf include dir")
SET(Protobuf_INCLUDE_DIRS @prefix@/include CACHE PATH "Protobuf include dir")
SET(Protobuf_LIBRARY @prefix@/lib/libprotobuf.a CACHE FILEPATH "Protobuf library")
+endif()
+
+endif()
SET(ZMQ_INCLUDE_PATH @prefix@/include)
SET(ZMQ_LIB @prefix@/lib/libzmq.a)
@@ -78,6 +83,22 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
SET(CMAKE_OSX_ARCHITECTURES "x86_64")
SET(LLVM_ENABLE_PIC OFF)
SET(LLVM_ENABLE_PIE OFF)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
+ SET(ANDROID TRUE)
+ if(ARCHITECTURE STREQUAL "arm")
+ SET(CMAKE_ANDROID_ARCH_ABI "armeabi-v7a")
+ SET(CMAKE_SYSTEM_PROCESSOR "armv7-a")
+ SET(CMAKE_ANDROID_ARM_MODE ON)
+ SET(CMAKE_C_COMPILER_TARGET arm-linux-androideabi)
+ SET(CMAKE_CXX_COMPILER_TARGET arm-linux-androideabi)
+ SET(_CMAKE_TOOLCHAIN_PREFIX arm-linux-androideabi-)
+ elseif(ARCHITECTURE STREQUAL "aarch64")
+ SET(CMAKE_ANDROID_ARCH_ABI "arm64-v8a")
+ SET(CMAKE_SYSTEM_PROCESSOR "aarch64")
+ endif()
+ SET(CMAKE_ANDROID_STANDALONE_TOOLCHAIN @prefix@/native)
+ SET(CMAKE_C_COMPILER "${_CMAKE_TOOLCHAIN_PREFIX}clang")
+ SET(CMAKE_CXX_COMPILER "${_CMAKE_TOOLCHAIN_PREFIX}clang++")
else()
SET(CMAKE_C_COMPILER @CC@)
SET(CMAKE_CXX_COMPILER @CXX@)
@@ -89,13 +110,21 @@ if(ARCHITECTURE STREQUAL "arm")
set(ARM_ID "armv7-a")
set(BUILD_64 OFF)
set(CMAKE_BUILD_TYPE release)
- set(BUILD_TAG "linux-armv7")
+ if(ANDROID)
+ set(BUILD_TAG "android-armv7")
+ else()
+ set(BUILD_TAG "linux-armv7")
+ endif()
set(ARM7)
elseif(ARCHITECTURE STREQUAL "aarch64")
set(ARCH "armv8-a")
set(ARM ON)
set(ARM_ID "armv8-a")
- set(BUILD_TAG "linux-armv8")
+ if(ANDROID)
+ set(BUILD_TAG "android-armv8")
+ else()
+ set(BUILD_TAG "linux-armv8")
+ endif()
set(BUILD_64 ON)
endif()
diff --git a/contrib/epee/include/math_helper.h b/contrib/epee/include/math_helper.h
index 604a04680..29acffaea 100644
--- a/contrib/epee/include/math_helper.h
+++ b/contrib/epee/include/math_helper.h
@@ -32,6 +32,7 @@
#include <list>
#include <numeric>
+#include <random>
#include <boost/timer/timer.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/random_generator.hpp>
@@ -230,7 +231,7 @@ namespace math_helper
}
}
- template<uint64_t scale, int default_interval, bool start_immediate = true>
+ template<typename get_interval, bool start_immediate = true>
class once_a_time
{
uint64_t get_time() const
@@ -251,12 +252,18 @@ namespace math_helper
#endif
}
+ void set_next_interval()
+ {
+ m_interval = get_interval()();
+ }
+
public:
- once_a_time():m_interval(default_interval * scale)
+ once_a_time()
{
m_last_worked_time = 0;
if(!start_immediate)
m_last_worked_time = get_time();
+ set_next_interval();
}
void trigger()
@@ -273,6 +280,7 @@ namespace math_helper
{
bool res = functr();
m_last_worked_time = get_time();
+ set_next_interval();
return res;
}
return true;
@@ -283,9 +291,13 @@ namespace math_helper
uint64_t m_interval;
};
+ template<uint64_t N> struct get_constant_interval { public: uint64_t operator()() const { return N; } };
+
template<int default_interval, bool start_immediate = true>
- class once_a_time_seconds: public once_a_time<1000000, default_interval, start_immediate> {};
+ class once_a_time_seconds: public once_a_time<get_constant_interval<default_interval * (uint64_t)1000000>, start_immediate> {};
template<int default_interval, bool start_immediate = true>
- class once_a_time_milliseconds: public once_a_time<1000, default_interval, start_immediate> {};
+ class once_a_time_milliseconds: public once_a_time<get_constant_interval<default_interval * (uint64_t)1000>, start_immediate> {};
+ template<typename get_interval, bool start_immediate = true>
+ class once_a_time_seconds_range: public once_a_time<get_interval, start_immediate> {};
}
}
diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl
index 5d12f9466..128ff10aa 100644
--- a/contrib/epee/include/net/abstract_tcp_server2.inl
+++ b/contrib/epee/include/net/abstract_tcp_server2.inl
@@ -410,7 +410,12 @@ PRAGMA_WARNING_DISABLE_VS(4355)
else
{
_dbg3("[sock " << socket().native_handle() << "] peer closed connection");
- if (m_ready_to_close)
+ bool do_shutdown = false;
+ CRITICAL_REGION_BEGIN(m_send_que_lock);
+ if(!m_send_que.size())
+ do_shutdown = true;
+ CRITICAL_REGION_END();
+ if (m_ready_to_close || do_shutdown)
shutdown();
}
m_ready_to_close = true;
@@ -470,6 +475,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
{
MERROR("SSL handshake failed");
boost::interprocess::ipcdetail::atomic_write32(&m_want_close_connection, 1);
+ m_ready_to_close = true;
bool do_shutdown = false;
CRITICAL_REGION_BEGIN(m_send_que_lock);
if(!m_send_que.size())
diff --git a/contrib/epee/include/span.h b/contrib/epee/include/span.h
index e100452ca..59895535f 100644
--- a/contrib/epee/include/span.h
+++ b/contrib/epee/include/span.h
@@ -110,7 +110,8 @@ namespace epee
constexpr std::size_t size() const noexcept { return len; }
constexpr std::size_t size_bytes() const noexcept { return size() * sizeof(value_type); }
- const T &operator[](size_t idx) const { return ptr[idx]; }
+ T &operator[](size_t idx) noexcept { return ptr[idx]; }
+ const T &operator[](size_t idx) const noexcept { return ptr[idx]; }
private:
T* ptr;
diff --git a/contrib/gitian/README.md b/contrib/gitian/README.md
index 32aee5f56..7e3502bcf 100644
--- a/contrib/gitian/README.md
+++ b/contrib/gitian/README.md
@@ -126,7 +126,7 @@ Setup for LXC:
```bash
GH_USER=fluffypony
-VERSION=v0.14.1.0
+VERSION=v0.15.0.0
./gitian-build.py --setup $GH_USER $VERSION
```
@@ -167,13 +167,12 @@ If all went well, this produces a number of (uncommitted) `.assert` files in the
Checking your work
------------------
-Take a look in the assert files and note the SHA256 checksums listed there. eg for `v0.14.1.0` you should get this checksum:
+Take a look in the assert files and note the SHA256 checksums listed there.
-```
-2b95118f53d98d542a85f8732b84ba13b3cd20517ccb40332b0edd0ddf4f8c62 monero-x86_64-linux-gnu.tar.gz
-```
+You should verify that the checksum that is listed matches each of the binaries you actually built.
+This may be done on Linux using the `sha256sum` command or on MacOS using `shasum --algorithm 256` for example.
-You should verify that this is really the checksum you get on that file you built. You can also look in the gitian.sigs repo and / or [getmonero.org release checksums](https://web.getmonero.org/downloads/hashes.txt) to see if others got the same checksum for the same version tag. If there is ever a mismatch -- **STOP! Something is wrong**. Contact others on IRC / github to figure out what is going on.
+You can also look in the [gitian.sigs](https://github.com/monero-project/gitian.sigs/) repo and / or [getmonero.org release checksums](https://web.getmonero.org/downloads/hashes.txt) to see if others got the same checksum for the same version tag. If there is ever a mismatch -- **STOP! Something is wrong**. Contact others on IRC / github to figure out what is going on.
Signing assert files
@@ -183,13 +182,13 @@ If you chose to do detached signing using `--detach-sign` above (recommended), y
```bash
GH_USER=fluffypony
-VERSION=v0.14.1.0
+VERSION=v0.15.0.0
gpg --detach-sign ${VERSION}-linux/${GH_USER}/monero-linux-*-build.assert
gpg --detach-sign ${VERSION}-win/${GH_USER}/monero-win-*-build.assert
gpg --detach-sign ${VERSION}-osx/${GH_USER}/monero-osx-*-build.assert
+gpg --detach-sign ${VERSION}-android/${GH_USER}/monero-android-*-build.assert
```
-<!-- TODO: Replace * above with ${VERSION} once gitian builds correct file name -->
This will create a `.sig` file for each `.assert` file above (2 files for each platform).
@@ -226,3 +225,19 @@ To get all build options run:
./gitian-build.py --help
```
+Doing Successive Builds
+-----------------------
+
+If you need to do multiple iterations (while developing/testing) you can use the
+`--rebuild` option instead of `--build` on subsequent iterations. This skips the
+initial check for the freshness of the depends tools. In particular, doing this
+check all the time prevents rebuilding when you have no network access.
+
+
+Local-Only Builds
+-----------------
+
+If you need to run builds while disconnected from the internet, make sure you have
+local up-to-date repos in advance. Then specify your local repo using the `--url`
+option when building. This will avoid attempts to git pull across a network.
+
diff --git a/contrib/gitian/gitian-android.yml b/contrib/gitian/gitian-android.yml
new file mode 100644
index 000000000..02614b1a5
--- /dev/null
+++ b/contrib/gitian/gitian-android.yml
@@ -0,0 +1,136 @@
+---
+name: "monero-android-0.15"
+enable_cache: true
+suites:
+- "bionic"
+architectures:
+- "amd64"
+packages:
+- "curl"
+- "gperf"
+- "gcc-7"
+- "g++-7"
+- "gcc"
+- "g++"
+- "binutils-gold"
+- "git"
+- "pkg-config"
+- "build-essential"
+- "autoconf"
+- "libtool"
+- "automake"
+- "faketime"
+- "bsdmainutils"
+- "ca-certificates"
+- "python"
+- "cmake"
+- "ccache"
+- "protobuf-compiler"
+- "libdbus-1-dev"
+- "libharfbuzz-dev"
+- "libprotobuf-dev"
+- "python3-zmq"
+- "unzip"
+remotes:
+- "url": "https://github.com/monero-project/monero.git"
+ "dir": "monero"
+files: []
+script: |
+
+ WRAP_DIR=$HOME/wrapped
+ HOSTS="arm-linux-android aarch64-linux-android"
+ FAKETIME_HOST_PROGS="clang clang++ ar nm"
+ FAKETIME_PROGS="date"
+ HOST_CFLAGS="-O2 -g"
+ HOST_CXXFLAGS="-O2 -g"
+ HOST_LDFLAGS=-static-libstdc++
+
+ export GZIP="-9n"
+ export TZ="UTC"
+ export BUILD_DIR=`pwd`
+ mkdir -p ${WRAP_DIR}
+ if test -n "$GBUILD_CACHE_ENABLED"; then
+ export SOURCES_PATH=${GBUILD_COMMON_CACHE}
+ export BASE_CACHE=${GBUILD_PACKAGE_CACHE}
+ mkdir -p ${BASE_CACHE} ${SOURCES_PATH}
+ fi
+
+ export ZERO_AR_DATE=1
+
+ function create_global_faketime_wrappers {
+ for prog in ${FAKETIME_PROGS}; do
+ echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog}
+ echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
+ echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
+ echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog}
+ echo "\$REAL \$@" >> $WRAP_DIR/${prog}
+ chmod +x ${WRAP_DIR}/${prog}
+ done
+ }
+
+ function create_per-host_faketime_wrappers {
+ for i in $HOSTS; do
+ ABI=$i
+ if expr $i : arm- > /dev/null
+ then
+ ABI=$i"eabi"
+ fi
+ NDKDIR="${BUILD_DIR}/monero/contrib/depends/$i/native/bin"
+ for prog in ${FAKETIME_HOST_PROGS}; do
+ WRAPPER=${WRAP_DIR}/${ABI}-${prog}
+ echo '#!/usr/bin/env bash' > ${WRAPPER}
+ echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAPPER}
+ echo "export FAKETIME=\"$1\"" >> ${WRAPPER}
+ echo "$NDKDIR/${ABI}-$prog \$@" >> ${WRAPPER}
+ chmod +x ${WRAPPER}
+ done
+ done
+ }
+
+ # Faketime for depends so intermediate results are comparable
+ export PATH_orig=${PATH}
+ create_global_faketime_wrappers "2000-01-01 12:00:00"
+ create_per-host_faketime_wrappers "2000-01-01 12:00:00"
+ export PATH=${WRAP_DIR}:${PATH}
+
+ # gcc 7+ honors SOURCE_DATE_EPOCH, no faketime needed
+ export SOURCE_DATE_EPOCH=`date -d 2000-01-01T12:00:00 +%s`
+
+ git config --global core.abbrev 9
+ cd monero
+ # Set the version string that gets added to the tar archive name
+ version="`git describe`"
+ if [[ $version == *"-"*"-"* ]]; then
+ version="`git rev-parse --short=9 HEAD`"
+ version="`echo $version | head -c 9`"
+ fi
+
+ BASEPREFIX=`pwd`/contrib/depends
+ # Build dependencies for each host
+ export TAR_OPTIONS=--mtime=2000-01-01T12:00:00
+ for i in $HOSTS; do
+ make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}"
+ done
+
+ # Faketime for binaries
+ export PATH=${PATH_orig}
+ create_global_faketime_wrappers "${REFERENCE_DATETIME}"
+ create_per-host_faketime_wrappers "${REFERENCE_DATETIME}"
+
+ # Build in a new dir for each host
+ export TAR_OPTIONS=--mtime=${REFERENCE_DATE}T${REFERENCE_TIME}
+ for i in ${HOSTS}; do
+ export PATH=${WRAP_DIR}:${BASEPREFIX}/${i}/native/bin:${PATH_orig}
+ mkdir build && cd build
+ cmake .. -DCMAKE_TOOLCHAIN_FILE=${BASEPREFIX}/${i}/share/toolchain.cmake -DCMAKE_BUILD_TYPE=Release
+ make ${MAKEOPTS}
+ chmod 755 bin/*
+ cp ../LICENSE bin
+ chmod 644 bin/LICENSE
+ DISTNAME=monero-${i}-${version}
+ mv bin ${DISTNAME}
+ find ${DISTNAME}/ | sort | tar --no-recursion --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
+ cd ..
+ rm -rf build
+ done
+
diff --git a/contrib/gitian/gitian-build.py b/contrib/gitian/gitian-build.py
index a8d164c2c..64eb218bb 100755
--- a/contrib/gitian/gitian-build.py
+++ b/contrib/gitian/gitian-build.py
@@ -8,6 +8,12 @@ import sys
gsigs = 'https://github.com/monero-project/gitian.sigs.git'
gbrepo = 'https://github.com/devrandom/gitian-builder.git'
+platforms = {'l': ['Linux', 'linux', 'tar.bz2'],
+ 'a': ['Android', 'android', 'tar.bz2'],
+ 'f': ['FreeBSD', 'freebsd', 'tar.bz2'],
+ 'w': ['Windows', 'win', 'zip'],
+ 'm': ['MacOS', 'osx', 'tar.bz2'] }
+
def setup():
global args, workdir
programs = ['apt-cacher-ng', 'ruby', 'git', 'make', 'wget']
@@ -22,11 +28,7 @@ def setup():
if not os.path.isdir('builder'):
subprocess.check_call(['git', 'clone', gbrepo, 'builder'])
os.chdir('builder')
- subprocess.check_call(['git', 'config', 'user.email', 'gitianuser@localhost'])
- subprocess.check_call(['git', 'config', 'user.name', 'gitianuser'])
- subprocess.check_call(['git', 'checkout', '963322de8420c50502c4cc33d4d7c0d84437b576'])
- subprocess.check_call(['git', 'fetch', 'origin', '72c51f0bd2adec4eedab4dbd06c9229b9c4eb0e3'])
- subprocess.check_call(['git', 'cherry-pick', '72c51f0bd2adec4eedab4dbd06c9229b9c4eb0e3'])
+ subprocess.check_call(['git', 'checkout', 'c0f77ca018cb5332bfd595e0aff0468f77542c23'])
os.makedirs('inputs', exist_ok=True)
os.chdir('inputs')
if not os.path.isdir('monero'):
@@ -46,59 +48,65 @@ def setup():
print('Reboot is required')
sys.exit(0)
-def build():
+def rebuild():
global args, workdir
- os.makedirs('out/' + args.version, exist_ok=True)
print('\nBuilding Dependencies\n')
- os.chdir('builder')
- os.makedirs('inputs', exist_ok=True)
+ os.makedirs('../out/' + args.version, exist_ok=True)
- subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz'])
- subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch'])
- subprocess.check_output(["echo 'a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 inputs/osslsigncode-Backports-to-1.7.1.patch' | sha256sum -c"], shell=True)
- subprocess.check_output(["echo 'f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 inputs/osslsigncode-1.7.1.tar.gz' | sha256sum -c"], shell=True)
- subprocess.check_call(['make', '-C', 'inputs/monero/contrib/depends', 'download', 'SOURCES_PATH=' + os.getcwd() + '/cache/common'])
- if args.linux:
- print('\nCompiling ' + args.version + ' Linux')
- subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'monero='+args.commit, '--url', 'monero='+args.url, 'inputs/monero/contrib/gitian/gitian-linux.yml'])
- subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-linux', '--destination', '../sigs/', 'inputs/monero/contrib/gitian/gitian-linux.yml'])
- subprocess.check_call('mv build/out/monero-*.tar.bz2 ../out/'+args.version, shell=True)
+ for i in args.os:
+ if i is 'm' and args.nomac:
+ continue
- if args.windows:
- print('\nCompiling ' + args.version + ' Windows')
- subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'monero='+args.commit, '--url', 'monero='+args.url, 'inputs/monero/contrib/gitian/gitian-win.yml'])
- subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-win', '--destination', '../sigs/', 'inputs/monero/contrib/gitian/gitian-win.yml'])
- subprocess.check_call('mv build/out/monero*.zip ../out/'+args.version, shell=True)
+ os_name = platforms[i][0]
+ tag_name = platforms[i][1]
+ suffix = platforms[i][2]
- if args.macos:
- print('\nCompiling ' + args.version + ' MacOS')
- subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'monero='+args.commit, '--url', 'monero'+args.url, 'inputs/monero/contrib/gitian/gitian-osx.yml'])
- subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-osx', '--destination', '../sigs/', 'inputs/monero/contrib/gitian/gitian-osx.yml'])
- subprocess.check_call('mv build/out/monero*.tar.bz2 ../out/'+args.version, shell=True)
+ print('\nCompiling ' + args.version + ' ' + os_name)
+ infile = 'inputs/monero/contrib/gitian/gitian-' + tag_name + '.yml'
+ subprocess.check_call(['bin/gbuild', '-j', args.jobs, '-m', args.memory, '--commit', 'monero='+args.commit, '--url', 'monero='+args.url, infile])
+ subprocess.check_call(['bin/gsign', '-p', args.sign_prog, '--signer', args.signer, '--release', args.version+'-linux', '--destination', '../sigs/', infile])
+ subprocess.check_call('mv build/out/monero-*.' + suffix + ' ../out/'+args.version, shell=True)
+ print('Moving var/install.log to var/install-' + tag_name + '.log')
+ subprocess.check_call('mv var/install.log var/install-' + tag_name + '.log', shell=True)
+ print('Moving var/build.log to var/build-' + tag_name + '.log')
+ subprocess.check_call('mv var/build.log var/build-' + tag_name + '.log', shell=True)
os.chdir(workdir)
if args.commit_files:
print('\nCommitting '+args.version+' Unsigned Sigs\n')
os.chdir('sigs')
- subprocess.check_call(['git', 'add', args.version+'-linux/'+args.signer])
- subprocess.check_call(['git', 'add', args.version+'-win/'+args.signer])
- subprocess.check_call(['git', 'add', args.version+'-osx/'+args.signer])
+ for i, v in platforms:
+ subprocess.check_call(['git', 'add', args.version+'-'+v[1]+'/'+args.signer])
subprocess.check_call(['git', 'commit', '-m', 'Add '+args.version+' unsigned sigs for '+args.signer])
os.chdir(workdir)
+
+def build():
+ global args, workdir
+
+ print('\nChecking Depends Freshness\n')
+ os.chdir('builder')
+ os.makedirs('inputs', exist_ok=True)
+
+ subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz'])
+ subprocess.check_call(['wget', '-N', '-P', 'inputs', 'https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch'])
+ subprocess.check_output(["echo 'a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 inputs/osslsigncode-Backports-to-1.7.1.patch' | sha256sum -c"], shell=True)
+ subprocess.check_output(["echo 'f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 inputs/osslsigncode-1.7.1.tar.gz' | sha256sum -c"], shell=True)
+ subprocess.check_call(['make', '-C', 'inputs/monero/contrib/depends', 'download', 'SOURCES_PATH=' + os.getcwd() + '/cache/common'])
+
+ rebuild()
+
+
def verify():
global args, workdir
os.chdir('builder')
- print('\nVerifying v'+args.version+' Linux\n')
- subprocess.check_call(['bin/gverify', '-v', '-d', '../sigs/', '-r', args.version+'-linux', 'inputs/monero/contrib/gitian/gitian-linux.yml'])
- print('\nVerifying v'+args.version+' Windows\n')
- subprocess.check_call(['bin/gverify', '-v', '-d', '../sigs/', '-r', args.version+'-win', 'inputs/monero/contrib/gitian/gitian-win.yml'])
- print('\nVerifying v'+args.version+' MacOS\n')
- subprocess.check_call(['bin/gverify', '-v', '-d', '../sigs/', '-r', args.version+'-osx', 'inputs/monero/contrib/gitian/gitian-osx.yml'])
+ for i, v in platforms:
+ print('\nVerifying v'+args.version+' '+v[0]+'\n')
+ subprocess.check_call(['bin/gverify', '-v', '-d', '../sigs/', '-r', args.version+'-'+v[1], 'inputs/monero/contrib/gitian/gitian-'+v[1]+'.yml'])
os.chdir(workdir)
def main():
@@ -111,7 +119,9 @@ def main():
parser.add_argument('-v', '--verify', action='store_true', dest='verify', help='Verify the Gitian build')
parser.add_argument('-b', '--build', action='store_true', dest='build', help='Do a Gitian build')
parser.add_argument('-B', '--buildsign', action='store_true', dest='buildsign', help='Build both signed and unsigned binaries')
- parser.add_argument('-o', '--os', dest='os', default='lwm', help='Specify which Operating Systems the build is for. Default is %(default)s. l for Linux, w for Windows, m for MacOS')
+ parser.add_argument('-o', '--os', dest='os', default='lafwm', help='Specify which Operating Systems the build is for. Default is %(default)s. l for Linux, a for Android, f for FreeBSD, w for Windows, m for MacOS')
+ parser.add_argument('-r', '--rebuild', action='store_true', dest='rebuild', help='Redo a Gitian build')
+ parser.add_argument('-R', '--rebuildsign', action='store_true', dest='rebuildsign', help='Redo and sign a Gitian build')
parser.add_argument('-j', '--jobs', dest='jobs', default='2', help='Number of processes to use. Default %(default)s')
parser.add_argument('-m', '--memory', dest='memory', default='2000', help='Memory to allocate in MiB. Default %(default)s')
parser.add_argument('-k', '--kvm', action='store_true', dest='kvm', help='Use KVM instead of LXC')
@@ -126,16 +136,16 @@ def main():
args = parser.parse_args()
workdir = os.getcwd()
- args.linux = 'l' in args.os
- args.windows = 'w' in args.os
- args.macos = 'm' in args.os
-
args.is_bionic = b'bionic' in subprocess.check_output(['lsb_release', '-cs'])
if args.buildsign:
args.build = True
args.sign = True
+ if args.rebuildsign:
+ args.rebuild = True
+ args.sign = True
+
if args.kvm and args.docker:
raise Exception('Error: cannot have both kvm and docker')
@@ -152,9 +162,11 @@ def main():
os.environ['LXC_GUEST_IP'] = '10.0.3.5'
# Disable MacOS build if no SDK found
- if args.build and args.macos and not os.path.isfile('builder/inputs/MacOSX10.11.sdk.tar.gz'):
- print('Cannot build for MacOS, SDK does not exist. Will build for other OSes')
- args.macos = False
+ args.nomac = False
+ if 'm' in args.os and not os.path.isfile('builder/inputs/MacOSX10.11.sdk.tar.gz'):
+ if args.build:
+ print('Cannot build for MacOS, SDK does not exist. Will build for other OSes')
+ args.nomac = True
script_name = os.path.basename(sys.argv[0])
# Signer and version shouldn't be empty
@@ -189,6 +201,10 @@ def main():
if args.build:
build()
+ if args.rebuild:
+ os.chdir('builder')
+ rebuild()
+
if args.verify:
verify()
diff --git a/contrib/gitian/gitian-freebsd.yml b/contrib/gitian/gitian-freebsd.yml
new file mode 100644
index 000000000..0220b82a5
--- /dev/null
+++ b/contrib/gitian/gitian-freebsd.yml
@@ -0,0 +1,133 @@
+---
+name: "monero-freebsd-0.15"
+enable_cache: true
+suites:
+- "bionic"
+architectures:
+- "amd64"
+packages:
+- "curl"
+- "clang-8"
+- "gperf"
+- "gcc-7"
+- "g++-7"
+- "gcc"
+- "g++"
+- "binutils-gold"
+- "git"
+- "pkg-config"
+- "build-essential"
+- "autoconf"
+- "libtool"
+- "automake"
+- "faketime"
+- "bsdmainutils"
+- "ca-certificates"
+- "python"
+- "cmake"
+- "ccache"
+- "protobuf-compiler"
+- "libdbus-1-dev"
+- "libharfbuzz-dev"
+- "libprotobuf-dev"
+- "python3-zmq"
+remotes:
+- "url": "https://github.com/monero-project/monero.git"
+ "dir": "monero"
+files: []
+script: |
+
+ WRAP_DIR=$HOME/wrapped
+ HOSTS="x86_64-unknown-freebsd"
+ FAKETIME_HOST_PROGS=""
+ FAKETIME_PROGS="clang-8 clang++-8 date"
+ HOST_CFLAGS="-O2 -g"
+ HOST_CXXFLAGS="-O2 -g"
+ HOST_LDFLAGS=-static-libstdc++
+
+ export GZIP="-9n"
+ export TZ="UTC"
+ export BUILD_DIR=`pwd`
+ mkdir -p ${WRAP_DIR}
+ if test -n "$GBUILD_CACHE_ENABLED"; then
+ export SOURCES_PATH=${GBUILD_COMMON_CACHE}
+ export BASE_CACHE=${GBUILD_PACKAGE_CACHE}
+ mkdir -p ${BASE_CACHE} ${SOURCES_PATH}
+ fi
+
+ export ZERO_AR_DATE=1
+
+ function create_global_faketime_wrappers {
+ for prog in ${FAKETIME_PROGS}; do
+ echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog}
+ echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
+ echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
+ echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog}
+ echo "\$REAL \$@" >> $WRAP_DIR/${prog}
+ chmod +x ${WRAP_DIR}/${prog}
+ done
+ }
+
+ function create_per-host_faketime_wrappers {
+ for i in $HOSTS; do
+ for prog in ${FAKETIME_HOST_PROGS}; do
+ WRAPPER=${WRAP_DIR}/${i}-${prog}
+ echo '#!/usr/bin/env bash' > ${WRAPPER}
+ echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAPPER}
+ echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAPPER}
+ echo "export FAKETIME=\"$1\"" >> ${WRAPPER}
+ echo "$NDKDIR/${ABI}-$prog \$@" >> ${WRAPPER}
+ chmod +x ${WRAPPER}
+ done
+ done
+ }
+
+ # Faketime for depends so intermediate results are comparable
+ export PATH_orig=${PATH}
+ create_global_faketime_wrappers "2000-01-01 12:00:00"
+ create_per-host_faketime_wrappers "2000-01-01 12:00:00"
+ export PATH=${WRAP_DIR}:${PATH}
+
+ # gcc 7+ honors SOURCE_DATE_EPOCH, no faketime needed
+ export SOURCE_DATE_EPOCH=`date -d 2000-01-01T12:00:00 +%s`
+
+ git config --global core.abbrev 9
+ cd monero
+ # Set the version string that gets added to the tar archive name
+ version="`git describe`"
+ if [[ $version == *"-"*"-"* ]]; then
+ version="`git rev-parse --short=9 HEAD`"
+ version="`echo $version | head -c 9`"
+ fi
+
+ BASEPREFIX=`pwd`/contrib/depends
+ # Build dependencies for each host
+ export TAR_OPTIONS=--mtime=2000-01-01T12:00:00
+ for i in $HOSTS; do
+ make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}"
+ done
+
+ # Faketime for binaries
+ export PATH=${PATH_orig}
+ create_global_faketime_wrappers "${REFERENCE_DATETIME}"
+ create_per-host_faketime_wrappers "${REFERENCE_DATETIME}"
+
+ ORIGPATH="$PATH"
+ # Build in a new dir for each host
+ export SOURCE_DATE_EPOCH=`date -d ${REFERENCE_DATE}T${REFERENCE_TIME} +%s`
+ export TAR_OPTIONS=--mtime=${REFERENCE_DATE}T${REFERENCE_TIME}
+ for i in ${HOSTS}; do
+ export PATH=${WRAP_DIR}:${BASEPREFIX}/${i}/native/bin:${ORIGPATH}
+ mkdir build && cd build
+ cmake .. -DCMAKE_TOOLCHAIN_FILE=${BASEPREFIX}/${i}/share/toolchain.cmake -DCMAKE_BUILD_TYPE=Release
+ make ${MAKEOPTS}
+ chmod 755 bin/*
+ cp ../LICENSE bin
+ chmod 644 bin/LICENSE
+ DISTNAME=monero-${i}-${version}
+ mv bin ${DISTNAME}
+ find ${DISTNAME}/ | sort | tar --no-recursion --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
+ cd ..
+ rm -rf build
+ done
+
diff --git a/contrib/gitian/gitian-linux.yml b/contrib/gitian/gitian-linux.yml
index 8cbde2acb..9c2ebac9b 100644
--- a/contrib/gitian/gitian-linux.yml
+++ b/contrib/gitian/gitian-linux.yml
@@ -1,5 +1,5 @@
---
-name: "monero-linux-0.14"
+name: "monero-linux-0.15"
enable_cache: true
suites:
- "bionic"
@@ -50,14 +50,13 @@ script: |
WRAP_DIR=$HOME/wrapped
HOSTS="x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu i686-linux-gnu"
- FAKETIME_HOST_PROGS="gcc g++"
- FAKETIME_PROGS="date ar ranlib nm"
+ FAKETIME_HOST_PROGS=""
+ FAKETIME_PROGS="date"
HOST_CFLAGS="-O2 -g"
HOST_CXXFLAGS="-O2 -g"
HOST_LDFLAGS=-static-libstdc++
export GZIP="-9n"
- export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
export TZ="UTC"
export BUILD_DIR=`pwd`
mkdir -p ${WRAP_DIR}
@@ -105,29 +104,15 @@ script: |
# x86 needs /usr/include/i386-linux-gnu/asm pointed to /usr/include/x86_64-linux-gnu/asm,
# but we can't write there. Instead, create a link here and force it to be included in the
- # search paths by wrapping gcc/g++.
+ # search paths.
+ # This problem goes away if linux-libc-dev:i386 pkg exists, but it's not in bionic.
- mkdir -p $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu
- rm -f $WRAP_DIR/extra_includes/i686-pc-linux-gnu/asm
- ln -s /usr/include/x86_64-linux-gnu/asm $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu/asm
+ mkdir -p $EXTRA_INCLUDES_BASE/i686-linux-gnu
+ rm -f $WRAP_DIR/extra_includes/i686-linux-gnu/asm
+ ln -s /usr/include/x86_64-linux-gnu/asm $EXTRA_INCLUDES_BASE/i686-linux-gnu/asm
- for prog in gcc g++; do
- rm -f ${WRAP_DIR}/${prog}
- cat << EOF > ${WRAP_DIR}/${prog}
- #!/usr/bin/env bash
- REAL="`which -a ${prog}-7 | grep -v ${WRAP_DIR}/${prog} | head -1`"
- for var in "\$@"
- do
- if [ "\$var" = "-m32" ]; then
- export C_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu"
- export CPLUS_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu"
- break
- fi
- done
- \$REAL \$@
- EOF
- chmod +x ${WRAP_DIR}/${prog}
- done
+ # gcc 7+ honors SOURCE_DATE_EPOCH, no faketime needed
+ export SOURCE_DATE_EPOCH=`date -d 2000-01-01T12:00:00 +%s`
git config --global core.abbrev 9
cd monero
@@ -140,13 +125,17 @@ script: |
BASEPREFIX=`pwd`/contrib/depends
# Build dependencies for each host
+ export TAR_OPTIONS=--mtime=2000-01-01T12:00:00
for i in $HOSTS; do
EXTRA_INCLUDES="$EXTRA_INCLUDES_BASE/$i"
if [ -d "$EXTRA_INCLUDES" ]; then
- export HOST_ID_SALT="$EXTRA_INCLUDES"
+ export C_INCLUDE_PATH="$EXTRA_INCLUDES"
+ export CPLUS_INCLUDE_PATH="$EXTRA_INCLUDES"
+ else
+ unset C_INCLUDE_PATH
+ unset CPLUS_INCLUDE_PATH
fi
make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" V=1
- unset HOST_ID_SALT
done
# Faketime for binaries
@@ -157,14 +146,27 @@ script: |
ORIGPATH="$PATH"
# Build in a new dir for each host
+ export SOURCE_DATE_EPOCH=`date -d ${REFERENCE_DATE}T${REFERENCE_TIME} +%s`
+ export TAR_OPTIONS=--mtime=${REFERENCE_DATE}T${REFERENCE_TIME}
for i in ${HOSTS}; do
export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH}
mkdir build && cd build
+ EXTRA_INCLUDES="$EXTRA_INCLUDES_BASE/$i"
+ if [ -d "$EXTRA_INCLUDES" ]; then
+ export C_INCLUDE_PATH="$EXTRA_INCLUDES"
+ export CPLUS_INCLUDE_PATH="$EXTRA_INCLUDES"
+ else
+ unset C_INCLUDE_PATH
+ unset CPLUS_INCLUDE_PATH
+ fi
cmake .. -DCMAKE_TOOLCHAIN_FILE=${BASEPREFIX}/${i}/share/toolchain.cmake -DBACKCOMPAT=ON
make ${MAKEOPTS}
+ chmod 755 bin/*
+ cp ../LICENSE bin
+ chmod 644 bin/LICENSE
DISTNAME=monero-${i}-${version}
mv bin ${DISTNAME}
- find ${DISTNAME}/ | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
+ find ${DISTNAME}/ | sort | tar --no-recursion --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
cd ..
rm -rf build
done
diff --git a/contrib/gitian/gitian-osx.yml b/contrib/gitian/gitian-osx.yml
index d3141e2c7..ecc7d4b59 100644
--- a/contrib/gitian/gitian-osx.yml
+++ b/contrib/gitian/gitian-osx.yml
@@ -1,5 +1,5 @@
---
-name: "monero-osx-0.14"
+name: "monero-osx-0.15"
enable_cache: true
suites:
- "bionic"
@@ -32,10 +32,9 @@ script: |
WRAP_DIR=$HOME/wrapped
HOSTS="x86_64-apple-darwin11"
FAKETIME_HOST_PROGS=""
- FAKETIME_PROGS="ar ranlib date dmg genisoimage"
+ FAKETIME_PROGS="ar ranlib date dmg genisoimage python"
export GZIP="-9n"
- export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
export TZ="UTC"
export BUILD_DIR=`pwd`
mkdir -p ${WRAP_DIR}
@@ -92,6 +91,7 @@ script: |
tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/MacOSX10.11.sdk.tar.gz
# Build dependencies for each host
+ export TAR_OPTIONS=--mtime=2000-01-01T12:00:00
for i in $HOSTS; do
make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}"
done
@@ -104,14 +104,18 @@ script: |
ORIGPATH="$PATH"
# Build in a new dir for each host
+ export TAR_OPTIONS=--mtime=${REFERENCE_DATE}T${REFERENCE_TIME}
for i in ${HOSTS}; do
export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH}
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=${BASEPREFIX}/${i}/share/toolchain.cmake
make ${MAKEOPTS}
+ chmod 755 bin/*
+ cp ../LICENSE bin
+ chmod 644 bin/LICENSE
DISTNAME=monero-${i}-${version}
mv bin ${DISTNAME}
- find ${DISTNAME}/ | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
+ find ${DISTNAME}/ | sort | tar --no-recursion --owner=0 --group=0 -c -T - | bzip2 -9 > ${OUTDIR}/${DISTNAME}.tar.bz2
cd ..
rm -rf build
done
diff --git a/contrib/gitian/gitian-win.yml b/contrib/gitian/gitian-win.yml
index 4c559acfe..bd85695c1 100644
--- a/contrib/gitian/gitian-win.yml
+++ b/contrib/gitian/gitian-win.yml
@@ -1,5 +1,5 @@
---
-name: "monero-win-0.14"
+name: "monero-win-0.15"
enable_cache: true
suites:
- "bionic"
@@ -22,6 +22,19 @@ packages:
- "python"
- "rename"
- "cmake"
+alternatives:
+-
+ package: "i686-w64-mingw32-g++"
+ path: "/usr/bin/i686-w64-mingw32-g++-posix"
+-
+ package: "i686-w64-mingw32-gcc"
+ path: "/usr/bin/i686-w64-mingw32-gcc-posix"
+-
+ package: "x86_64-w64-mingw32-g++"
+ path: "/usr/bin/x86_64-w64-mingw32-g++-posix"
+-
+ package: "x86_64-w64-mingw32-gcc"
+ path: "/usr/bin/x86_64-w64-mingw32-gcc-posix"
remotes:
- "url": "https://github.com/monero-project/monero.git"
"dir": "monero"
@@ -29,13 +42,12 @@ files: []
script: |
WRAP_DIR=$HOME/wrapped
HOSTS="i686-w64-mingw32 x86_64-w64-mingw32"
- FAKETIME_HOST_PROGS="ar ranlib nm windres strip objcopy"
+ FAKETIME_HOST_PROGS="windres objcopy"
FAKETIME_PROGS="date zip"
HOST_CFLAGS="-O2 -g"
HOST_CXXFLAGS="-O2 -g"
export GZIP="-9n"
- export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
export TZ="UTC"
export BUILD_DIR=`pwd`
mkdir -p ${WRAP_DIR}
@@ -69,37 +81,15 @@ script: |
done
}
- function create_per-host_linker_wrapper {
- # This is only needed for trusty, as the mingw linker leaks a few bytes of
- # heap, causing non-determinism. See discussion in https://github.com/bitcoin/bitcoin/pull/6900
- for i in $HOSTS; do
- mkdir -p ${WRAP_DIR}/${i}
- for prog in collect2; do
- echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}/${prog}
- REAL=$(${i}-gcc -print-prog-name=${prog})
- echo "export MALLOC_PERTURB_=255" >> ${WRAP_DIR}/${i}/${prog}
- echo "${REAL} \$@" >> $WRAP_DIR/${i}/${prog}
- chmod +x ${WRAP_DIR}/${i}/${prog}
- done
- for prog in gcc g++; do
- echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog}
- echo "REAL=\`which -a ${i}-${prog}-posix | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
- echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
- echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog}
- echo "export COMPILER_PATH=${WRAP_DIR}/${i}" >> ${WRAP_DIR}/${i}-${prog}
- echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
- chmod +x ${WRAP_DIR}/${i}-${prog}
- done
- done
- }
-
# Faketime for depends so intermediate results are comparable
export PATH_orig=${PATH}
create_global_faketime_wrappers "2000-01-01 12:00:00"
create_per-host_faketime_wrappers "2000-01-01 12:00:00"
- create_per-host_linker_wrapper "2000-01-01 12:00:00"
export PATH=${WRAP_DIR}:${PATH}
+ # gcc 7+ honors SOURCE_DATE_EPOCH, no faketime needed
+ export SOURCE_DATE_EPOCH=`date -d 2000-01-01T12:00:00 +%s`
+
git config --global core.abbrev 9
cd monero
# Set the version string that gets added to the tar archive name
@@ -111,6 +101,7 @@ script: |
BASEPREFIX=`pwd`/contrib/depends
# Build dependencies for each host
+ export TAR_OPTIONS=--mtime=2000-01-01T12:00:00
for i in $HOSTS; do
EXTRA_INCLUDES="$EXTRA_INCLUDES_BASE/$i"
if [ -d "$EXTRA_INCLUDES" ]; then
@@ -129,11 +120,14 @@ script: |
ORIGPATH="$PATH"
# Run cmake and make, for each create a new build/ directory,
# compile from there, archive, export and delete the archive again
+ export SOURCE_DATE_EPOCH=`date -d ${REFERENCE_DATE}T${REFERENCE_TIME} +%s`
+ export TAR_OPTIONS=--mtime=${REFERENCE_DATE}T${REFERENCE_TIME}
for i in ${HOSTS}; do
export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH}
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=${BASEPREFIX}/${i}/share/toolchain.cmake
make ${MAKEOPTS}
+ cp ../LICENSE bin
DISTNAME=monero-${i}-${version}
mv bin ${DISTNAME}
find ${DISTNAME}/ | sort | zip -X@ ${OUTDIR}/${DISTNAME}.zip
diff --git a/external/easylogging++/easylogging++.cc b/external/easylogging++/easylogging++.cc
index 5c756bcdf..8439bec0b 100644
--- a/external/easylogging++/easylogging++.cc
+++ b/external/easylogging++/easylogging++.cc
@@ -1243,7 +1243,7 @@ bool OS::termSupportsColor(void) {
std::string term = getEnvironmentVariable("TERM", "");
return term == "xterm" || term == "xterm-color" || term == "xterm-256color"
|| term == "screen" || term == "linux" || term == "cygwin"
- || term == "screen-256color";
+ || term == "screen-256color" || term == "screen.xterm-256color";
}
// DateTime
diff --git a/external/randomx b/external/randomx
-Subproject 53af68c34a43f5bdb659f90cc27b6b2da7fd77f
+Subproject 7567cef4c6192fb5356bbdd7db802be77be0439
diff --git a/src/blockchain_db/blockchain_db.cpp b/src/blockchain_db/blockchain_db.cpp
index 63ac38a88..5fec22d8d 100644
--- a/src/blockchain_db/blockchain_db.cpp
+++ b/src/blockchain_db/blockchain_db.cpp
@@ -44,6 +44,71 @@ using epee::string_tools::pod_to_hex;
namespace cryptonote
{
+bool matches_category(relay_method method, relay_category category) noexcept
+{
+ switch (category)
+ {
+ default:
+ return false;
+ case relay_category::all:
+ return true;
+ case relay_category::relayable:
+ if (method == relay_method::none)
+ return false;
+ return true;
+ case relay_category::broadcasted:
+ case relay_category::legacy:
+ break;
+ }
+ // check for "broadcasted" or "legacy" methods:
+ switch (method)
+ {
+ default:
+ case relay_method::local:
+ return false;
+ case relay_method::block:
+ case relay_method::flood:
+ return true;
+ case relay_method::none:
+ break;
+ }
+ return category == relay_category::legacy;
+}
+
+void txpool_tx_meta_t::set_relay_method(relay_method method) noexcept
+{
+ kept_by_block = 0;
+ do_not_relay = 0;
+ is_local = 0;
+
+ switch (method)
+ {
+ case relay_method::none:
+ do_not_relay = 1;
+ break;
+ case relay_method::local:
+ is_local = 1;
+ break;
+ default:
+ case relay_method::flood:
+ break;
+ case relay_method::block:
+ kept_by_block = 1;
+ break;
+ }
+}
+
+relay_method txpool_tx_meta_t::get_relay_method() const noexcept
+{
+ if (kept_by_block)
+ return relay_method::block;
+ if (do_not_relay)
+ return relay_method::none;
+ if (is_local)
+ return relay_method::local;
+ return relay_method::flood;
+}
+
const command_line::arg_descriptor<std::string> arg_db_sync_mode = {
"db-sync-mode"
, "Specify sync option, using format [safe|fast|fastest]:[sync|async]:[<nblocks_per_sync>[blocks]|<nbytes_per_sync>[bytes]]."
@@ -924,4 +989,23 @@ void BlockchainDB::fixup()
batch_stop();
}
+bool BlockchainDB::txpool_tx_matches_category(const crypto::hash& tx_hash, relay_category category)
+{
+ try
+ {
+ txpool_tx_meta_t meta{};
+ if (!get_txpool_tx_meta(tx_hash, meta))
+ {
+ MERROR("Failed to get tx meta from txpool");
+ return false;
+ }
+ return meta.matches(category);
+ }
+ catch (const std::exception &e)
+ {
+ MERROR("Failed to get tx meta from txpool: " << e.what());
+ }
+ return false;
+}
+
} // namespace cryptonote
diff --git a/src/blockchain_db/blockchain_db.h b/src/blockchain_db/blockchain_db.h
index d1e4919be..b2c5d6cb4 100644
--- a/src/blockchain_db/blockchain_db.h
+++ b/src/blockchain_db/blockchain_db.h
@@ -39,6 +39,7 @@
#include "cryptonote_basic/cryptonote_basic.h"
#include "cryptonote_basic/difficulty.h"
#include "cryptonote_basic/hardfork.h"
+#include "cryptonote_protocol/enums.h"
/** \file
* Cryptonote Blockchain Database Interface
@@ -105,6 +106,16 @@ typedef std::pair<crypto::hash, uint64_t> tx_out_index;
extern const command_line::arg_descriptor<std::string> arg_db_sync_mode;
extern const command_line::arg_descriptor<bool, false> arg_db_salvage;
+enum class relay_category : uint8_t
+{
+ broadcasted = 0,//!< Public txes received via block/flooding/fluff
+ relayable, //!< Every tx not marked `relay_method::none`
+ legacy, //!< `relay_category::broadcasted` + `relay_method::none` for rpc relay requests or historical reasons
+ all //!< Everything in the db
+};
+
+bool matches_category(relay_method method, relay_category category) noexcept;
+
#pragma pack(push, 1)
/**
@@ -156,11 +167,22 @@ struct txpool_tx_meta_t
uint8_t do_not_relay;
uint8_t double_spend_seen: 1;
uint8_t pruned: 1;
- uint8_t bf_padding: 6;
+ uint8_t is_local: 1;
+ uint8_t bf_padding: 5;
uint8_t padding[76]; // till 192 bytes
+
+ void set_relay_method(relay_method method) noexcept;
+ relay_method get_relay_method() const noexcept;
+
+ //! See `relay_category` description
+ bool matches(const relay_category category) const noexcept
+ {
+ return matches_category(get_relay_method(), category);
+ }
};
+
#define DBF_SAFE 1
#define DBF_FAST 2
#define DBF_FASTEST 4
@@ -1465,12 +1487,12 @@ public:
/**
* @brief get the number of transactions in the txpool
*/
- virtual uint64_t get_txpool_tx_count(bool include_unrelayed_txes = true) const = 0;
+ virtual uint64_t get_txpool_tx_count(relay_category tx_category = relay_category::broadcasted) const = 0;
/**
- * @brief check whether a txid is in the txpool
+ * @brief check whether a txid is in the txpool and meets tx_category requirements
*/
- virtual bool txpool_has_tx(const crypto::hash &txid) const = 0;
+ virtual bool txpool_has_tx(const crypto::hash &txid, relay_category tx_category) const = 0;
/**
* @brief remove a txpool transaction
@@ -1494,10 +1516,11 @@ public:
*
* @param txid the transaction id of the transation to lookup
* @param bd the blob to return
+ * @param tx_category for filtering out hidden/private txes
*
- * @return true if the txid was in the txpool, false otherwise
+ * @return True iff `txid` is in the pool and meets `tx_category` requirements
*/
- virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const = 0;
+ virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd, relay_category tx_category) const = 0;
/**
* @brief get a txpool transaction's blob
@@ -1506,7 +1529,17 @@ public:
*
* @return the blob for that transaction
*/
- virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const = 0;
+ virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const = 0;
+
+ /**
+ * @brief Check if `tx_hash` relay status is in `category`.
+ *
+ * @param tx_hash hash of the transaction to lookup
+ * @param category relay status category to test against
+ *
+ * @return True if `tx_hash` latest relay status is in `category`.
+ */
+ bool txpool_tx_matches_category(const crypto::hash& tx_hash, relay_category category);
/**
* @brief prune output data for the given amount
@@ -1604,7 +1637,7 @@ public:
*
* @return false if the function returns false for any transaction, otherwise true
*/
- virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, bool include_unrelayed_txes = true) const = 0;
+ virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, relay_category category = relay_category::broadcasted) const = 0;
/**
* @brief runs a function over all key images stored
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index f978ef307..e8667adcf 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -1771,7 +1771,7 @@ void BlockchainLMDB::update_txpool_tx(const crypto::hash &txid, const txpool_tx_
}
}
-uint64_t BlockchainLMDB::get_txpool_tx_count(bool include_unrelayed_txes) const
+uint64_t BlockchainLMDB::get_txpool_tx_count(relay_category category) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -1781,7 +1781,7 @@ uint64_t BlockchainLMDB::get_txpool_tx_count(bool include_unrelayed_txes) const
TXN_PREFIX_RDONLY();
- if (include_unrelayed_txes)
+ if (category == relay_category::all)
{
// No filtering, we can get the number of tx the "fast" way
MDB_stat db_stats;
@@ -1807,7 +1807,7 @@ uint64_t BlockchainLMDB::get_txpool_tx_count(bool include_unrelayed_txes) const
if (result)
throw0(DB_ERROR(lmdb_error("Failed to enumerate txpool tx metadata: ", result).c_str()));
const txpool_tx_meta_t &meta = *(const txpool_tx_meta_t*)v.mv_data;
- if (!meta.do_not_relay)
+ if (meta.matches(category))
++num_entries;
}
}
@@ -1816,7 +1816,7 @@ uint64_t BlockchainLMDB::get_txpool_tx_count(bool include_unrelayed_txes) const
return num_entries;
}
-bool BlockchainLMDB::txpool_has_tx(const crypto::hash& txid) const
+bool BlockchainLMDB::txpool_has_tx(const crypto::hash& txid, relay_category tx_category) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -1825,11 +1825,21 @@ bool BlockchainLMDB::txpool_has_tx(const crypto::hash& txid) const
RCURSOR(txpool_meta)
MDB_val k = {sizeof(txid), (void *)&txid};
- auto result = mdb_cursor_get(m_cur_txpool_meta, &k, NULL, MDB_SET);
+ MDB_val v;
+ auto result = mdb_cursor_get(m_cur_txpool_meta, &k, &v, MDB_SET);
if (result != 0 && result != MDB_NOTFOUND)
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
+ if (result == MDB_NOTFOUND)
+ return false;
+
+ bool found = true;
+ if (tx_category != relay_category::all)
+ {
+ const txpool_tx_meta_t &meta = *(const txpool_tx_meta_t*)v.mv_data;
+ found = meta.matches(tx_category);
+ }
TXN_POSTFIX_RDONLY();
- return result != MDB_NOTFOUND;
+ return found;
}
void BlockchainLMDB::remove_txpool_tx(const crypto::hash& txid)
@@ -1883,7 +1893,7 @@ bool BlockchainLMDB::get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta
return true;
}
-bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const
+bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd, relay_category tx_category) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -1893,6 +1903,21 @@ bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::bl
MDB_val k = {sizeof(txid), (void *)&txid};
MDB_val v;
+
+ // if filtering, make sure those requirements are met before copying blob
+ if (tx_category != relay_category::all)
+ {
+ auto result = mdb_cursor_get(m_cur_txpool_meta, &k, &v, MDB_SET);
+ if (result == MDB_NOTFOUND)
+ return false;
+ if (result != 0)
+ throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str()));
+
+ const txpool_tx_meta_t& meta = *(const txpool_tx_meta_t*)v.mv_data;
+ if (!meta.matches(tx_category))
+ return false;
+ }
+
auto result = mdb_cursor_get(m_cur_txpool_blob, &k, &v, MDB_SET);
if (result == MDB_NOTFOUND)
return false;
@@ -1904,10 +1929,10 @@ bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::bl
return true;
}
-cryptonote::blobdata BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid) const
+cryptonote::blobdata BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const
{
cryptonote::blobdata bd;
- if (!get_txpool_tx_blob(txid, bd))
+ if (!get_txpool_tx_blob(txid, bd, tx_category))
throw1(DB_ERROR("Tx not found in txpool: "));
return bd;
}
@@ -2245,7 +2270,7 @@ bool BlockchainLMDB::check_pruning()
return prune_worker(prune_mode_check, 0);
}
-bool BlockchainLMDB::for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob, bool include_unrelayed_txes) const
+bool BlockchainLMDB::for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob, relay_category category) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
@@ -2269,8 +2294,7 @@ bool BlockchainLMDB::for_all_txpool_txes(std::function<bool(const crypto::hash&,
throw0(DB_ERROR(lmdb_error("Failed to enumerate txpool tx metadata: ", result).c_str()));
const crypto::hash txid = *(const crypto::hash*)k.mv_data;
const txpool_tx_meta_t &meta = *(const txpool_tx_meta_t*)v.mv_data;
- if (!include_unrelayed_txes && meta.do_not_relay)
- // Skipping that tx
+ if (!meta.matches(category))
continue;
const cryptonote::blobdata *passed_bd = NULL;
cryptonote::blobdata bd;
diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h
index 61a551476..e56711e8f 100644
--- a/src/blockchain_db/lmdb/db_lmdb.h
+++ b/src/blockchain_db/lmdb/db_lmdb.h
@@ -281,12 +281,12 @@ public:
virtual void add_txpool_tx(const crypto::hash &txid, const cryptonote::blobdata &blob, const txpool_tx_meta_t& meta);
virtual void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t& meta);
- virtual uint64_t get_txpool_tx_count(bool include_unrelayed_txes = true) const;
- virtual bool txpool_has_tx(const crypto::hash &txid) const;
+ virtual uint64_t get_txpool_tx_count(relay_category category = relay_category::broadcasted) const;
+ virtual bool txpool_has_tx(const crypto::hash &txid, relay_category tx_category) const;
virtual void remove_txpool_tx(const crypto::hash& txid);
virtual bool get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta_t &meta) const;
- virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const;
- virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const;
+ virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata& bd, relay_category tx_category) const;
+ virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const;
virtual uint32_t get_blockchain_pruning_seed() const;
virtual bool prune_blockchain(uint32_t pruning_seed = 0);
virtual bool update_pruning();
@@ -298,7 +298,7 @@ public:
virtual uint64_t get_alt_block_count();
virtual void drop_alt_blocks();
- virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob = false, bool include_unrelayed_txes = true) const;
+ virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob = false, relay_category category = relay_category::broadcasted) const;
virtual bool for_all_key_images(std::function<bool(const crypto::key_image&)>) const;
virtual bool for_blocks_range(const uint64_t& h1, const uint64_t& h2, std::function<bool(uint64_t, const crypto::hash&, const cryptonote::block&)>) const;
diff --git a/src/blockchain_db/testdb.h b/src/blockchain_db/testdb.h
index ac19fae25..a5847dec6 100644
--- a/src/blockchain_db/testdb.h
+++ b/src/blockchain_db/testdb.h
@@ -126,14 +126,14 @@ public:
virtual void add_txpool_tx(const crypto::hash &txid, const cryptonote::blobdata &blob, const cryptonote::txpool_tx_meta_t& details) override {}
virtual void update_txpool_tx(const crypto::hash &txid, const cryptonote::txpool_tx_meta_t& details) override {}
- virtual uint64_t get_txpool_tx_count(bool include_unrelayed_txes = true) const override { return 0; }
- virtual bool txpool_has_tx(const crypto::hash &txid) const override { return false; }
+ virtual uint64_t get_txpool_tx_count(relay_category tx_relay = relay_category::broadcasted) const override { return 0; }
+ virtual bool txpool_has_tx(const crypto::hash &txid, relay_category tx_category) const override { return false; }
virtual void remove_txpool_tx(const crypto::hash& txid) override {}
virtual bool get_txpool_tx_meta(const crypto::hash& txid, cryptonote::txpool_tx_meta_t &meta) const override { return false; }
- virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const override { return false; }
+ virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd, relay_category tx_category) const override { return false; }
virtual uint64_t get_database_size() const override { return 0; }
- virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const override { return ""; }
- virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const cryptonote::txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, bool include_unrelayed_txes = false) const override { return false; }
+ virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const override { return ""; }
+ virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const cryptonote::txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, relay_category category = relay_category::broadcasted) const override { return false; }
virtual void add_block( const cryptonote::block& blk
, size_t block_weight
diff --git a/src/blockchain_utilities/blockchain_import.cpp b/src/blockchain_utilities/blockchain_import.cpp
index 5d039d7f4..852e9cf4f 100644
--- a/src/blockchain_utilities/blockchain_import.cpp
+++ b/src/blockchain_utilities/blockchain_import.cpp
@@ -174,7 +174,7 @@ int check_flush(cryptonote::core &core, std::vector<block_complete_entry> &block
for(auto& tx_blob: block_entry.txs)
{
tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- core.handle_incoming_tx(tx_blob, tvc, true, true, false);
+ core.handle_incoming_tx(tx_blob, tvc, relay_method::block, true);
if(tvc.m_verifivation_failed)
{
MERROR("transaction verification failed, tx_id = "
diff --git a/src/blocks/checkpoints.dat b/src/blocks/checkpoints.dat
index eb614d58d..b14f9e8d2 100644
--- a/src/blocks/checkpoints.dat
+++ b/src/blocks/checkpoints.dat
Binary files differ
diff --git a/src/checkpoints/checkpoints.cpp b/src/checkpoints/checkpoints.cpp
index 11bbe2e24..4a4b3c5c2 100644
--- a/src/checkpoints/checkpoints.cpp
+++ b/src/checkpoints/checkpoints.cpp
@@ -210,6 +210,7 @@ namespace cryptonote
ADD_CHECKPOINT(1668900, "ac2dcaf3d2f58ffcf8391639f0f1ebafcb8eac43c49479c7c37f611868d07568");
ADD_CHECKPOINT(1775600, "1c6e01c661dc22cab939e79ec6a5272190624ce8356d2f7b958e4f9a57fdb05e");
ADD_CHECKPOINT(1856000, "9b57f17f29c71a3acd8a7904b93c41fa6eb8d2b7c73936ce4f1702d14880ba29");
+ ADD_CHECKPOINT(1958000, "98a5d6e51afdf3146e0eefb10a66e8648d8d4d5c2742be8835e976ba217c9bb2");
return true;
}
diff --git a/src/cryptonote_basic/miner.cpp b/src/cryptonote_basic/miner.cpp
index c4b5c8455..688aeaea3 100644
--- a/src/cryptonote_basic/miner.cpp
+++ b/src/cryptonote_basic/miner.cpp
@@ -102,13 +102,13 @@ namespace cryptonote
}
- miner::miner(i_miner_handler* phandler, Blockchain* pbc):m_stop(1),
+ miner::miner(i_miner_handler* phandler, const get_block_hash_t &gbh):m_stop(1),
m_template{},
m_template_no(0),
m_diffic(0),
m_thread_index(0),
m_phandler(phandler),
- m_pbc(pbc),
+ m_gbh(gbh),
m_height(0),
m_threads_active(0),
m_pausers_count(0),
@@ -471,12 +471,12 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------------
- bool miner::find_nonce_for_given_block(const Blockchain *pbc, block& bl, const difficulty_type& diffic, uint64_t height)
+ bool miner::find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height)
{
for(; bl.nonce != std::numeric_limits<uint32_t>::max(); bl.nonce++)
{
crypto::hash h;
- get_block_longhash(pbc, bl, h, height, tools::get_max_concurrency());
+ gbh(bl, height, tools::get_max_concurrency(), h);
if(check_hash(h, diffic))
{
@@ -572,7 +572,7 @@ namespace cryptonote
b.nonce = nonce;
crypto::hash h;
- get_block_longhash(m_pbc, b, h, height, tools::get_max_concurrency());
+ m_gbh(b, height, tools::get_max_concurrency(), h);
if(check_hash(h, local_diff))
{
diff --git a/src/cryptonote_basic/miner.h b/src/cryptonote_basic/miner.h
index 4efbcbec3..ce50d674e 100644
--- a/src/cryptonote_basic/miner.h
+++ b/src/cryptonote_basic/miner.h
@@ -52,7 +52,7 @@ namespace cryptonote
~i_miner_handler(){};
};
- class Blockchain;
+ typedef std::function<bool(const cryptonote::block&, uint64_t, unsigned int, crypto::hash&)> get_block_hash_t;
/************************************************************************/
/* */
@@ -60,7 +60,7 @@ namespace cryptonote
class miner
{
public:
- miner(i_miner_handler* phandler, Blockchain* pbc);
+ miner(i_miner_handler* phandler, const get_block_hash_t& gbh);
~miner();
bool init(const boost::program_options::variables_map& vm, network_type nettype);
static void init_options(boost::program_options::options_description& desc);
@@ -76,7 +76,7 @@ namespace cryptonote
bool on_idle();
void on_synchronized();
//synchronous analog (for fast calls)
- static bool find_nonce_for_given_block(const Blockchain *pbc, block& bl, const difficulty_type& diffic, uint64_t height);
+ static bool find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height);
void pause();
void resume();
void do_print_hashrate(bool do_hr);
@@ -135,7 +135,7 @@ namespace cryptonote
std::list<boost::thread> m_threads;
epee::critical_section m_threads_lock;
i_miner_handler* m_phandler;
- Blockchain* m_pbc;
+ get_block_hash_t m_gbh;
account_public_address m_mine_address;
epee::math_helper::once_a_time_seconds<5> m_update_block_template_interval;
epee::math_helper::once_a_time_seconds<2> m_update_merge_hr_interval;
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index b13ecbbf1..7357e44d0 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -616,7 +616,7 @@ block Blockchain::pop_block_from_blockchain()
// that might not be always true. Unlikely though, and always relaying
// these again might cause a spike of traffic as many nodes re-relay
// all the transactions in a popped block when a reorg happens.
- bool r = m_tx_pool.add_tx(tx, tvc, true, true, false, version);
+ bool r = m_tx_pool.add_tx(tx, tvc, relay_method::block, true, version);
if (!r)
{
LOG_ERROR("Error returning transaction to tx_pool");
@@ -1765,7 +1765,7 @@ bool Blockchain::handle_alternative_block(const block& b, const crypto::hash& id
{
cryptonote::tx_memory_pool::tx_details td;
cryptonote::blobdata blob;
- if (m_tx_pool.have_tx(txid))
+ if (m_tx_pool.have_tx(txid, relay_category::legacy))
{
if (m_tx_pool.get_transaction_info(txid, td))
{
@@ -3641,7 +3641,7 @@ void Blockchain::return_tx_to_pool(std::vector<std::pair<transaction, blobdata>>
// all the transactions in a popped block when a reorg happens.
const size_t weight = get_transaction_weight(tx.first, tx.second.size());
const crypto::hash tx_hash = get_transaction_hash(tx.first);
- if (!m_tx_pool.add_tx(tx.first, tx_hash, tx.second, weight, tvc, true, true, false, version))
+ if (!m_tx_pool.add_tx(tx.first, tx_hash, tx.second, weight, tvc, relay_method::block, true, version))
{
MERROR("Failed to return taken transaction with hash: " << get_transaction_hash(tx.first) << " to tx_pool");
}
@@ -3661,7 +3661,7 @@ bool Blockchain::flush_txes_from_pool(const std::vector<crypto::hash> &txids)
uint64_t fee;
bool relayed, do_not_relay, double_spend_seen, pruned;
MINFO("Removing txid " << txid << " from the pool");
- if(m_tx_pool.have_tx(txid) && !m_tx_pool.take_tx(txid, tx, txblob, tx_weight, fee, relayed, do_not_relay, double_spend_seen, pruned))
+ if(!m_tx_pool.have_tx(txid, relay_category::all) && !m_tx_pool.take_tx(txid, tx, txblob, tx_weight, fee, relayed, do_not_relay, double_spend_seen, pruned))
{
MERROR("Failed to remove txid " << txid << " from the pool");
res = false;
@@ -4895,9 +4895,9 @@ void Blockchain::remove_txpool_tx(const crypto::hash &txid)
m_db->remove_txpool_tx(txid);
}
-uint64_t Blockchain::get_txpool_tx_count(bool include_unrelayed_txes) const
+uint64_t Blockchain::get_txpool_tx_count(bool include_sensitive) const
{
- return m_db->get_txpool_tx_count(include_unrelayed_txes);
+ return m_db->get_txpool_tx_count(include_sensitive ? relay_category::all : relay_category::broadcasted);
}
bool Blockchain::get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta_t &meta) const
@@ -4905,19 +4905,24 @@ bool Blockchain::get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta_t &
return m_db->get_txpool_tx_meta(txid, meta);
}
-bool Blockchain::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const
+bool Blockchain::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd, relay_category tx_category) const
{
- return m_db->get_txpool_tx_blob(txid, bd);
+ return m_db->get_txpool_tx_blob(txid, bd, tx_category);
}
-cryptonote::blobdata Blockchain::get_txpool_tx_blob(const crypto::hash& txid) const
+cryptonote::blobdata Blockchain::get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const
{
- return m_db->get_txpool_tx_blob(txid);
+ return m_db->get_txpool_tx_blob(txid, tx_category);
}
-bool Blockchain::for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob, bool include_unrelayed_txes) const
+bool Blockchain::for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob, relay_category tx_category) const
{
- return m_db->for_all_txpool_txes(f, include_blob, include_unrelayed_txes);
+ return m_db->for_all_txpool_txes(f, include_blob, tx_category);
+}
+
+bool Blockchain::txpool_tx_matches_category(const crypto::hash& tx_hash, relay_category category)
+{
+ return m_db->txpool_tx_matches_category(tx_hash, category);
}
void Blockchain::set_user_options(uint64_t maxthreads, bool sync_on_blocks, uint64_t sync_threshold, blockchain_db_sync_mode sync_mode, bool fast_sync)
@@ -5029,7 +5034,7 @@ void Blockchain::cancel()
}
#if defined(PER_BLOCK_CHECKPOINT)
-static const char expected_block_hashes_hash[] = "95e60612c1a16f4cd992c335b66daabd98e2d351c2b02b66e43ced0296848d33";
+static const char expected_block_hashes_hash[] = "fce1dc7c17f7679f5f447df206b8f5fe2ef6b1a2845e59f650850a0ef00d265f";
void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback& get_checkpoints)
{
if (get_checkpoints == nullptr || !m_fast_sync)
@@ -5098,7 +5103,7 @@ void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback& get
CRITICAL_REGION_LOCAL(m_tx_pool);
std::vector<transaction> txs;
- m_tx_pool.get_transactions(txs);
+ m_tx_pool.get_transactions(txs, true);
size_t tx_weight;
uint64_t fee;
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index 6467031c2..c68fa22e3 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -964,11 +964,12 @@ namespace cryptonote
void add_txpool_tx(const crypto::hash &txid, const cryptonote::blobdata &blob, const txpool_tx_meta_t &meta);
void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t &meta);
void remove_txpool_tx(const crypto::hash &txid);
- uint64_t get_txpool_tx_count(bool include_unrelayed_txes = true) const;
+ uint64_t get_txpool_tx_count(bool include_sensitive = false) const;
bool get_txpool_tx_meta(const crypto::hash& txid, txpool_tx_meta_t &meta) const;
- bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const;
- cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const;
- bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, bool include_unrelayed_txes = true) const;
+ bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd, relay_category tx_category) const;
+ cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid, relay_category tx_category) const;
+ bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false, relay_category tx_category = relay_category::broadcasted) const;
+ bool txpool_tx_matches_category(const crypto::hash& tx_hash, relay_category category);
bool is_within_compiled_block_hash_area() const { return is_within_compiled_block_hash_area(m_db->height()); }
uint64_t prevalidate_block_hashes(uint64_t height, const std::vector<crypto::hash> &hashes, const std::vector<uint64_t> &weights);
diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index acb494a49..cf23a652c 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -29,6 +29,7 @@
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include <boost/algorithm/string.hpp>
+#include <boost/uuid/nil_generator.hpp>
#include "string_tools.h"
using namespace epee;
@@ -223,7 +224,9 @@ namespace cryptonote
core::core(i_cryptonote_protocol* pprotocol):
m_mempool(m_blockchain_storage),
m_blockchain_storage(m_mempool),
- m_miner(this, &m_blockchain_storage),
+ m_miner(this, [this](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash) {
+ return cryptonote::get_block_longhash(&m_blockchain_storage, b, hash, height, threads);
+ }),
m_starter_message_showed(false),
m_target_blockchain_height(0),
m_checkpoints_path(""),
@@ -751,7 +754,7 @@ namespace cryptonote
return false;
}
//-----------------------------------------------------------------------------------------------
- bool core::handle_incoming_tx_pre(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::handle_incoming_tx_pre(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash)
{
tvc = {};
@@ -815,7 +818,7 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------
- bool core::handle_incoming_tx_post(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::handle_incoming_tx_post(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash)
{
if(!check_tx_syntax(tx))
{
@@ -944,23 +947,29 @@ namespace cryptonote
return ret;
}
//-----------------------------------------------------------------------------------------------
- bool core::handle_incoming_txs(const std::vector<tx_blob_entry>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::handle_incoming_txs(const epee::span<const tx_blob_entry> tx_blobs, epee::span<tx_verification_context> tvc, relay_method tx_relay, bool relayed)
{
TRY_ENTRY();
- CRITICAL_REGION_LOCAL(m_incoming_tx_lock);
+
+ if (tx_blobs.size() != tvc.size())
+ {
+ MERROR("tx_blobs and tx_verification_context spans must have equal size");
+ return false;
+ }
struct result { bool res; cryptonote::transaction tx; crypto::hash hash; };
std::vector<result> results(tx_blobs.size());
- tvc.resize(tx_blobs.size());
+ CRITICAL_REGION_LOCAL(m_incoming_tx_lock);
+
tools::threadpool& tpool = tools::threadpool::getInstance();
tools::threadpool::waiter waiter;
- std::vector<tx_blob_entry>::const_iterator it = tx_blobs.begin();
+ epee::span<tx_blob_entry>::const_iterator it = tx_blobs.begin();
for (size_t i = 0; i < tx_blobs.size(); i++, ++it) {
tpool.submit(&waiter, [&, i, it] {
try
{
- results[i].res = handle_incoming_tx_pre(*it, tvc[i], results[i].tx, results[i].hash, keeped_by_block, relayed, do_not_relay);
+ results[i].res = handle_incoming_tx_pre(*it, tvc[i], results[i].tx, results[i].hash);
}
catch (const std::exception &e)
{
@@ -976,7 +985,7 @@ namespace cryptonote
for (size_t i = 0; i < tx_blobs.size(); i++, ++it) {
if (!results[i].res)
continue;
- if(m_mempool.have_tx(results[i].hash))
+ if(m_mempool.have_tx(results[i].hash, relay_category::legacy))
{
LOG_PRINT_L2("tx " << results[i].hash << "already have transaction in tx_pool");
already_have[i] = true;
@@ -991,7 +1000,7 @@ namespace cryptonote
tpool.submit(&waiter, [&, i, it] {
try
{
- results[i].res = handle_incoming_tx_post(*it, tvc[i], results[i].tx, results[i].hash, keeped_by_block, relayed, do_not_relay);
+ results[i].res = handle_incoming_tx_post(*it, tvc[i], results[i].tx, results[i].hash);
}
catch (const std::exception &e)
{
@@ -1012,7 +1021,7 @@ namespace cryptonote
tx_info.push_back({&results[i].tx, results[i].hash, tvc[i], results[i].res});
}
if (!tx_info.empty())
- handle_incoming_tx_accumulated_batch(tx_info, keeped_by_block);
+ handle_incoming_tx_accumulated_batch(tx_info, tx_relay == relay_method::block);
bool ok = true;
it = tx_blobs.begin();
@@ -1022,13 +1031,14 @@ namespace cryptonote
ok = false;
continue;
}
- if (keeped_by_block)
+ if (tx_relay == relay_method::block)
get_blockchain_storage().on_new_tx_from_block(results[i].tx);
if (already_have[i])
continue;
const uint64_t weight = results[i].tx.pruned ? get_pruned_transaction_weight(results[i].tx) : get_transaction_weight(results[i].tx, it->blob.size());
- ok &= add_new_tx(results[i].tx, results[i].hash, tx_blobs[i].blob, weight, tvc[i], keeped_by_block, relayed, do_not_relay);
+ ok &= add_new_tx(results[i].tx, results[i].hash, tx_blobs[i].blob, weight, tvc[i], tx_relay, relayed);
+
if(tvc[i].m_verifivation_failed)
{MERROR_VER("Transaction verification failed: " << results[i].hash);}
else if(tvc[i].m_verifivation_impossible)
@@ -1042,19 +1052,9 @@ namespace cryptonote
CATCH_ENTRY_L0("core::handle_incoming_txs()", false);
}
//-----------------------------------------------------------------------------------------------
- bool core::handle_incoming_tx(const tx_blob_entry& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
- {
- std::vector<tx_blob_entry> tx_blobs;
- tx_blobs.push_back(tx_blob);
- std::vector<tx_verification_context> tvcv(1);
- bool r = handle_incoming_txs(tx_blobs, tvcv, keeped_by_block, relayed, do_not_relay);
- tvc = tvcv[0];
- return r;
- }
- //-----------------------------------------------------------------------------------------------
- bool core::handle_incoming_tx(const blobdata& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::handle_incoming_tx(const tx_blob_entry& tx_blob, tx_verification_context& tvc, relay_method tx_relay, bool relayed)
{
- return handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, keeped_by_block, relayed, do_not_relay);
+ return handle_incoming_txs({std::addressof(tx_blob), 1}, {std::addressof(tvc), 1}, tx_relay, relayed);
}
//-----------------------------------------------------------------------------------------------
bool core::get_stat_info(core_stat_info& st_inf) const
@@ -1244,13 +1244,13 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------
- bool core::add_new_tx(transaction& tx, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::add_new_tx(transaction& tx, tx_verification_context& tvc, relay_method tx_relay, bool relayed)
{
crypto::hash tx_hash = get_transaction_hash(tx);
blobdata bl;
t_serializable_object_to_blob(tx, bl);
size_t tx_weight = get_transaction_weight(tx, bl.size());
- return add_new_tx(tx, tx_hash, bl, tx_weight, tvc, keeped_by_block, relayed, do_not_relay);
+ return add_new_tx(tx, tx_hash, bl, tx_weight, tvc, tx_relay, relayed);
}
//-----------------------------------------------------------------------------------------------
size_t core::get_blockchain_total_transactions() const
@@ -1258,9 +1258,9 @@ namespace cryptonote
return m_blockchain_storage.get_total_transactions();
}
//-----------------------------------------------------------------------------------------------
- bool core::add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
+ bool core::add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, relay_method tx_relay, bool relayed)
{
- if(m_mempool.have_tx(tx_hash))
+ if(m_mempool.have_tx(tx_hash, relay_category::legacy))
{
LOG_PRINT_L2("tx " << tx_hash << "already have transaction in tx_pool");
return true;
@@ -1273,40 +1273,62 @@ namespace cryptonote
}
uint8_t version = m_blockchain_storage.get_current_hard_fork_version();
- return m_mempool.add_tx(tx, tx_hash, blob, tx_weight, tvc, keeped_by_block, relayed, do_not_relay, version);
+ return m_mempool.add_tx(tx, tx_hash, blob, tx_weight, tvc, tx_relay, relayed, version);
}
//-----------------------------------------------------------------------------------------------
bool core::relay_txpool_transactions()
{
// we attempt to relay txes that should be relayed, but were not
- std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
+ std::vector<std::tuple<crypto::hash, cryptonote::blobdata, relay_method>> txs;
if (m_mempool.get_relayable_transactions(txs) && !txs.empty())
{
- cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context);
- tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- NOTIFY_NEW_TRANSACTIONS::request r;
- for (auto it = txs.begin(); it != txs.end(); ++it)
+ NOTIFY_NEW_TRANSACTIONS::request public_req{};
+ NOTIFY_NEW_TRANSACTIONS::request private_req{};
+ for (auto& tx : txs)
{
- r.txs.push_back(it->second);
+ switch (std::get<2>(tx))
+ {
+ default:
+ case relay_method::none:
+ break;
+ case relay_method::local:
+ private_req.txs.push_back(std::move(std::get<1>(tx)));
+ break;
+ case relay_method::block:
+ case relay_method::flood:
+ public_req.txs.push_back(std::move(std::get<1>(tx)));
+ break;
+ }
}
- get_protocol()->relay_transactions(r, fake_context);
- m_mempool.set_relayed(txs);
+
+ /* All txes are sent on randomized timers per connection in
+ `src/cryptonote_protocol/levin_notify.cpp.` They are either sent with
+ "white noise" delays or via diffusion (Dandelion++ fluff). So
+ re-relaying public and private _should_ be acceptable here. */
+ const boost::uuids::uuid source = boost::uuids::nil_uuid();
+ if (!public_req.txs.empty())
+ get_protocol()->relay_transactions(public_req, source, epee::net_utils::zone::public_);
+ if (!private_req.txs.empty())
+ get_protocol()->relay_transactions(private_req, source, epee::net_utils::zone::invalid);
}
return true;
}
//-----------------------------------------------------------------------------------------------
- void core::on_transaction_relayed(const cryptonote::blobdata& tx_blob)
+ void core::on_transactions_relayed(const epee::span<const cryptonote::blobdata> tx_blobs, const relay_method tx_relay)
{
- std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
- cryptonote::transaction tx;
- crypto::hash tx_hash;
- if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash))
+ std::vector<crypto::hash> tx_hashes{};
+ tx_hashes.resize(tx_blobs.size());
+
+ cryptonote::transaction tx{};
+ for (std::size_t i = 0; i < tx_blobs.size(); ++i)
{
- LOG_ERROR("Failed to parse relayed transaction");
- return;
+ if (!parse_and_validate_tx_from_blob(tx_blobs[i], tx, tx_hashes[i]))
+ {
+ LOG_ERROR("Failed to parse relayed transaction");
+ return;
+ }
}
- txs.push_back(std::make_pair(tx_hash, std::move(tx_blob)));
- m_mempool.set_relayed(txs);
+ m_mempool.set_relayed(epee::to_span(tx_hashes), tx_relay);
}
//-----------------------------------------------------------------------------------------------
bool core::get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce)
@@ -1367,7 +1389,7 @@ namespace cryptonote
for (const auto &tx_hash: b.tx_hashes)
{
cryptonote::blobdata txblob;
- CHECK_AND_ASSERT_THROW_MES(pool.get_transaction(tx_hash, txblob), "Transaction not found in pool");
+ CHECK_AND_ASSERT_THROW_MES(pool.get_transaction(tx_hash, txblob, relay_category::all), "Transaction not found in pool");
bce.txs.push_back({txblob, crypto::null_hash});
}
return bce;
@@ -1571,14 +1593,14 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------
- bool core::get_pool_transaction(const crypto::hash &id, cryptonote::blobdata& tx) const
+ bool core::get_pool_transaction(const crypto::hash &id, cryptonote::blobdata& tx, relay_category tx_category) const
{
- return m_mempool.get_transaction(id, tx);
+ return m_mempool.get_transaction(id, tx, tx_category);
}
//-----------------------------------------------------------------------------------------------
bool core::pool_has_tx(const crypto::hash &id) const
{
- return m_mempool.have_tx(id);
+ return m_mempool.have_tx(id, relay_category::legacy);
}
//-----------------------------------------------------------------------------------------------
bool core::get_pool_transactions_and_spent_keys_info(std::vector<tx_info>& tx_infos, std::vector<spent_key_image_info>& key_image_infos, bool include_sensitive_data) const
diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h
index f69ac3509..4b67984ab 100644
--- a/src/cryptonote_core/cryptonote_core.h
+++ b/src/cryptonote_core/cryptonote_core.h
@@ -35,7 +35,9 @@
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
+#include "cryptonote_core/i_core_events.h"
#include "cryptonote_protocol/cryptonote_protocol_handler_common.h"
+#include "cryptonote_protocol/enums.h"
#include "storages/portable_storage_template_helper.h"
#include "common/download.h"
#include "common/command_line.h"
@@ -46,6 +48,7 @@
#include "cryptonote_basic/cryptonote_stat_info.h"
#include "warnings.h"
#include "crypto/hash.h"
+#include "span.h"
PUSH_WARNINGS
DISABLE_VS_WARNINGS(4355)
@@ -77,7 +80,7 @@ namespace cryptonote
* limited to, communication among the Blockchain, the transaction pool,
* any miners, and the network.
*/
- class core: public i_miner_handler
+ class core final: public i_miner_handler, public i_core_events
{
public:
@@ -115,14 +118,12 @@ namespace cryptonote
*
* @param tx_blob the tx to handle
* @param tvc metadata about the transaction's validity
- * @param keeped_by_block if the transaction has been in a block
+ * @param tx_relay how the transaction was received
* @param relayed whether or not the transaction was relayed to us
- * @param do_not_relay whether to prevent the transaction from being relayed
*
* @return true if the transaction was accepted, false otherwise
*/
- bool handle_incoming_tx(const tx_blob_entry& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
- bool handle_incoming_tx(const blobdata& tx_blob, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool handle_incoming_tx(const tx_blob_entry& tx_blob, tx_verification_context& tvc, relay_method tx_relay, bool relayed);
/**
* @brief handles a list of incoming transactions
@@ -130,15 +131,35 @@ namespace cryptonote
* Parses incoming transactions and, if nothing is obviously wrong,
* passes them along to the transaction pool
*
+ * @pre `tx_blobs.size() == tvc.size()`
+ *
* @param tx_blobs the txs to handle
* @param tvc metadata about the transactions' validity
- * @param keeped_by_block if the transactions have been in a block
+ * @param tx_relay how the transaction was received.
* @param relayed whether or not the transactions were relayed to us
- * @param do_not_relay whether to prevent the transactions from being relayed
*
* @return true if the transactions were accepted, false otherwise
*/
- bool handle_incoming_txs(const std::vector<tx_blob_entry>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool handle_incoming_txs(epee::span<const tx_blob_entry> tx_blobs, epee::span<tx_verification_context> tvc, relay_method tx_relay, bool relayed);
+
+ /**
+ * @brief handles a list of incoming transactions
+ *
+ * Parses incoming transactions and, if nothing is obviously wrong,
+ * passes them along to the transaction pool
+ *
+ * @param tx_blobs the txs to handle
+ * @param tvc metadata about the transactions' validity
+ * @param tx_relay how the transaction was received.
+ * @param relayed whether or not the transactions were relayed to us
+ *
+ * @return true if the transactions were accepted, false otherwise
+ */
+ bool handle_incoming_txs(const std::vector<tx_blob_entry>& tx_blobs, std::vector<tx_verification_context>& tvc, relay_method tx_relay, bool relayed)
+ {
+ tvc.resize(tx_blobs.size());
+ return handle_incoming_txs(epee::to_span(tx_blobs), epee::to_mut_span(tvc), tx_relay, relayed);
+ }
/**
* @brief handles an incoming block
@@ -212,9 +233,10 @@ namespace cryptonote
virtual bool get_block_template(block& b, const crypto::hash *prev_block, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
/**
- * @brief called when a transaction is relayed
+ * @brief called when a transaction is relayed.
+ * @note Should only be invoked from `levin_notify`.
*/
- virtual void on_transaction_relayed(const cryptonote::blobdata& tx);
+ virtual void on_transactions_relayed(epee::span<const cryptonote::blobdata> tx_blobs, relay_method tx_relay) final;
/**
@@ -440,11 +462,11 @@ namespace cryptonote
/**
* @copydoc tx_memory_pool::get_transactions
- * @param include_unrelayed_txes include unrelayed txes in result
+ * @param include_sensitive_txes include private transactions
*
* @note see tx_memory_pool::get_transactions
*/
- bool get_pool_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes = true) const;
+ bool get_pool_transactions(std::vector<transaction>& txs, bool include_sensitive_txes = false) const;
/**
* @copydoc tx_memory_pool::get_txpool_backlog
@@ -455,34 +477,34 @@ namespace cryptonote
/**
* @copydoc tx_memory_pool::get_transactions
- * @param include_unrelayed_txes include unrelayed txes in result
+ * @param include_sensitive_txes include private transactions
*
* @note see tx_memory_pool::get_transactions
*/
- bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const;
+ bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_sensitive_txes = false) const;
/**
* @copydoc tx_memory_pool::get_transactions
- * @param include_unrelayed_txes include unrelayed txes in result
+ * @param include_sensitive_txes include private transactions
*
* @note see tx_memory_pool::get_transactions
*/
- bool get_pool_transaction_stats(struct txpool_stats& stats, bool include_unrelayed_txes = true) const;
+ bool get_pool_transaction_stats(struct txpool_stats& stats, bool include_sensitive_txes = false) const;
/**
* @copydoc tx_memory_pool::get_transaction
*
* @note see tx_memory_pool::get_transaction
*/
- bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx) const;
+ bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx, relay_category tx_category) const;
/**
* @copydoc tx_memory_pool::get_pool_transactions_and_spent_keys_info
- * @param include_unrelayed_txes include unrelayed txes in result
+ * @param include_sensitive_txes include private transactions
*
* @note see tx_memory_pool::get_pool_transactions_and_spent_keys_info
*/
- bool get_pool_transactions_and_spent_keys_info(std::vector<tx_info>& tx_infos, std::vector<spent_key_image_info>& key_image_infos, bool include_unrelayed_txes = true) const;
+ bool get_pool_transactions_and_spent_keys_info(std::vector<tx_info>& tx_infos, std::vector<spent_key_image_info>& key_image_infos, bool include_sensitive_txes = false) const;
/**
* @copydoc tx_memory_pool::get_pool_for_rpc
@@ -852,11 +874,11 @@ namespace cryptonote
* @param tx_hash the transaction's hash
* @param blob the transaction as a blob
* @param tx_weight the weight of the transaction
+ * @param tx_relay how the transaction was received
* @param relayed whether or not the transaction was relayed to us
- * @param do_not_relay whether to prevent the transaction from being relayed
*
*/
- bool add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, relay_method tx_relay, bool relayed);
/**
* @brief add a new transaction to the transaction pool
@@ -865,15 +887,14 @@ namespace cryptonote
*
* @param tx the transaction to add
* @param tvc return-by-reference metadata about the transaction's verification process
- * @param keeped_by_block whether or not the transaction has been in a block
+ * @param tx_relay how the transaction was received
* @param relayed whether or not the transaction was relayed to us
- * @param do_not_relay whether to prevent the transaction from being relayed
*
* @return true if the transaction is already in the transaction pool,
* is already in a block on the Blockchain, or is successfully added
* to the transaction pool
*/
- bool add_new_tx(transaction& tx, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool add_new_tx(transaction& tx, tx_verification_context& tvc, relay_method tx_relay, bool relayed);
/**
* @copydoc Blockchain::add_new_block
@@ -929,8 +950,8 @@ namespace cryptonote
bool check_tx_semantic(const transaction& tx, bool keeped_by_block) const;
void set_semantics_failed(const crypto::hash &tx_hash);
- bool handle_incoming_tx_pre(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
- bool handle_incoming_tx_post(const tx_blob_entry &tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool handle_incoming_tx_pre(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash);
+ bool handle_incoming_tx_post(const tx_blob_entry& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash);
struct tx_verification_batch_info { const cryptonote::transaction *tx; crypto::hash tx_hash; tx_verification_context &tvc; bool &result; };
bool handle_incoming_tx_accumulated_batch(std::vector<tx_verification_batch_info> &tx_info, bool keeped_by_block);
diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp
index 3e1b4e97f..f50fc61a5 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.cpp
+++ b/src/cryptonote_core/cryptonote_tx_utils.cpp
@@ -663,7 +663,9 @@ namespace cryptonote
bl.minor_version = CURRENT_BLOCK_MINOR_VERSION;
bl.timestamp = 0;
bl.nonce = nonce;
- miner::find_nonce_for_given_block(NULL, bl, 1, 0);
+ miner::find_nonce_for_given_block([](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
+ return cryptonote::get_block_longhash(NULL, b, hash, height, threads);
+ }, bl, 1, 0);
bl.invalidate_hashes();
return true;
}
diff --git a/src/cryptonote_core/i_core_events.h b/src/cryptonote_core/i_core_events.h
new file mode 100644
index 000000000..f49fbdf07
--- /dev/null
+++ b/src/cryptonote_core/i_core_events.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include "cryptonote_basic/blobdatatype.h"
+#include "cryptonote_protocol/enums.h"
+#include "span.h"
+
+namespace cryptonote
+{
+ struct i_core_events
+ {
+ virtual ~i_core_events() noexcept
+ {}
+
+ virtual void on_transactions_relayed(epee::span<const cryptonote::blobdata> tx_blobs, relay_method tx_relay) = 0;
+ };
+}
diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp
index 392e611e9..1bc475879 100644
--- a/src/cryptonote_core/tx_pool.cpp
+++ b/src/cryptonote_core/tx_pool.cpp
@@ -115,8 +115,10 @@ namespace cryptonote
}
//---------------------------------------------------------------------------------
- bool tx_memory_pool::add_tx(transaction &tx, /*const crypto::hash& tx_prefix_hash,*/ const crypto::hash &id, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool kept_by_block, bool relayed, bool do_not_relay, uint8_t version)
+ bool tx_memory_pool::add_tx(transaction &tx, /*const crypto::hash& tx_prefix_hash,*/ const crypto::hash &id, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, relay_method tx_relay, bool relayed, uint8_t version)
{
+ const bool kept_by_block = (tx_relay == relay_method::block);
+
// this should already be called with that lock, but let's make it explicit for clarity
CRITICAL_REGION_LOCAL(m_transactions_lock);
@@ -227,7 +229,7 @@ namespace cryptonote
crypto::hash max_used_block_id = null_hash;
uint64_t max_used_block_height = 0;
- cryptonote::txpool_tx_meta_t meta;
+ cryptonote::txpool_tx_meta_t meta{};
bool ch_inp_res = check_tx_inputs([&tx]()->cryptonote::transaction&{ return tx; }, id, max_used_block_height, max_used_block_id, tvc, kept_by_block);
if(!ch_inp_res)
{
@@ -241,11 +243,10 @@ namespace cryptonote
meta.max_used_block_height = 0;
meta.last_failed_height = 0;
meta.last_failed_id = null_hash;
- meta.kept_by_block = kept_by_block;
meta.receive_time = receive_time;
meta.last_relayed_time = time(NULL);
meta.relayed = relayed;
- meta.do_not_relay = do_not_relay;
+ meta.set_relay_method(tx_relay);
meta.double_spend_seen = have_tx_keyimges_as_spent(tx);
meta.pruned = tx.pruned;
meta.bf_padding = 0;
@@ -256,15 +257,16 @@ namespace cryptonote
m_parsed_tx_cache.insert(std::make_pair(id, tx));
CRITICAL_REGION_LOCAL1(m_blockchain);
LockedTXN lock(m_blockchain);
- m_blockchain.add_txpool_tx(id, blob, meta);
- if (!insert_key_images(tx, id, kept_by_block))
+ if (!insert_key_images(tx, id, tx_relay))
return false;
+
+ m_blockchain.add_txpool_tx(id, blob, meta);
m_txs_by_fee_and_receive_time.emplace(std::pair<double, std::time_t>(fee / (double)(tx_weight ? tx_weight : 1), receive_time), id);
lock.commit();
}
catch (const std::exception &e)
{
- MERROR("transaction already exists at inserting in memory pool: " << e.what());
+ MERROR("Error adding transaction to txpool: " << e.what());
return false;
}
tvc.m_verifivation_impossible = true;
@@ -280,7 +282,6 @@ namespace cryptonote
{
//update transactions container
meta.weight = tx_weight;
- meta.kept_by_block = kept_by_block;
meta.fee = fee;
meta.max_used_block_id = max_used_block_id;
meta.max_used_block_height = max_used_block_height;
@@ -289,7 +290,7 @@ namespace cryptonote
meta.receive_time = receive_time;
meta.last_relayed_time = time(NULL);
meta.relayed = relayed;
- meta.do_not_relay = do_not_relay;
+ meta.set_relay_method(tx_relay);
meta.double_spend_seen = false;
meta.pruned = tx.pruned;
meta.bf_padding = 0;
@@ -302,20 +303,21 @@ namespace cryptonote
CRITICAL_REGION_LOCAL1(m_blockchain);
LockedTXN lock(m_blockchain);
m_blockchain.remove_txpool_tx(id);
- m_blockchain.add_txpool_tx(id, blob, meta);
- if (!insert_key_images(tx, id, kept_by_block))
+ if (!insert_key_images(tx, id, tx_relay))
return false;
+
+ m_blockchain.add_txpool_tx(id, blob, meta);
m_txs_by_fee_and_receive_time.emplace(std::pair<double, std::time_t>(fee / (double)(tx_weight ? tx_weight : 1), receive_time), id);
lock.commit();
}
catch (const std::exception &e)
{
- MERROR("internal error: transaction already exists at inserting in memory pool: " << e.what());
+ MERROR("internal error: error adding transaction to txpool: " << e.what());
return false;
}
tvc.m_added_to_pool = true;
- if(meta.fee > 0 && !do_not_relay)
+ if(meta.fee > 0 && tx_relay != relay_method::none)
tvc.m_should_be_relayed = true;
}
@@ -331,7 +333,7 @@ namespace cryptonote
return true;
}
//---------------------------------------------------------------------------------
- bool tx_memory_pool::add_tx(transaction &tx, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay, uint8_t version)
+ bool tx_memory_pool::add_tx(transaction &tx, tx_verification_context& tvc, relay_method tx_relay, bool relayed, uint8_t version)
{
crypto::hash h = null_hash;
size_t blob_size = 0;
@@ -339,7 +341,7 @@ namespace cryptonote
t_serializable_object_to_blob(tx, bl);
if (bl.size() == 0 || !get_transaction_hash(tx, h))
return false;
- return add_tx(tx, h, bl, get_transaction_weight(tx, bl.size()), tvc, keeped_by_block, relayed, do_not_relay, version);
+ return add_tx(tx, h, bl, get_transaction_weight(tx, bl.size()), tvc, tx_relay, relayed, version);
}
//---------------------------------------------------------------------------------
size_t tx_memory_pool::get_txpool_weight() const
@@ -375,7 +377,7 @@ namespace cryptonote
txpool_tx_meta_t meta;
if (!m_blockchain.get_txpool_tx_meta(txid, meta))
{
- MERROR("Failed to find tx in txpool");
+ MERROR("Failed to find tx_meta in txpool");
return;
}
// don't prune the kept_by_block ones, they're likely added because we're adding a block with those
@@ -384,7 +386,7 @@ namespace cryptonote
--it;
continue;
}
- cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid);
+ cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid, relay_category::all);
cryptonote::transaction_prefix tx;
if (!parse_and_validate_tx_prefix_from_blob(txblob, tx))
{
@@ -413,17 +415,38 @@ namespace cryptonote
MINFO("Pool weight after pruning is larger than limit: " << m_txpool_weight << "/" << bytes);
}
//---------------------------------------------------------------------------------
- bool tx_memory_pool::insert_key_images(const transaction_prefix &tx, const crypto::hash &id, bool kept_by_block)
+ bool tx_memory_pool::insert_key_images(const transaction_prefix &tx, const crypto::hash &id, relay_method tx_relay)
{
for(const auto& in: tx.vin)
{
CHECKED_GET_SPECIFIC_VARIANT(in, const txin_to_key, txin, false);
std::unordered_set<crypto::hash>& kei_image_set = m_spent_key_images[txin.k_image];
- CHECK_AND_ASSERT_MES(kept_by_block || kei_image_set.size() == 0, false, "internal error: kept_by_block=" << kept_by_block
- << ", kei_image_set.size()=" << kei_image_set.size() << ENDL << "txin.k_image=" << txin.k_image << ENDL
- << "tx_id=" << id );
- auto ins_res = kei_image_set.insert(id);
- CHECK_AND_ASSERT_MES(ins_res.second, false, "internal error: try to insert duplicate iterator in key_image set");
+
+ /* If any existing key-image in the set is publicly visible AND this is
+ not forcibly "kept_by_block", then fail (duplicate key image). If all
+ existing key images are supposed to be hidden, we silently allow so
+ that the node doesn't leak knowledge of a local/stem tx. */
+ bool visible = false;
+ if (tx_relay != relay_method::block)
+ {
+ for (const crypto::hash& other_id : kei_image_set)
+ visible |= m_blockchain.txpool_tx_matches_category(other_id, relay_category::legacy);
+ }
+
+ CHECK_AND_ASSERT_MES(!visible, false, "internal error: tx_relay=" << unsigned(tx_relay)
+ << ", kei_image_set.size()=" << kei_image_set.size() << ENDL << "txin.k_image=" << txin.k_image << ENDL
+ << "tx_id=" << id);
+
+ /* If adding a tx (hash) that already exists, fail only if the tx has
+ been publicly "broadcast" previously. This way, when a private tx is
+ received for the first time from a remote node, "this" node will
+ respond as-if it were seen for the first time. LMDB does the
+ "hard-check" on key-images, so the effect is overwriting the existing
+ tx_pool metadata and "first seen" time. */
+ const bool new_or_previously_private =
+ kei_image_set.insert(id).second ||
+ !m_blockchain.txpool_tx_matches_category(id, relay_category::legacy);
+ CHECK_AND_ASSERT_MES(new_or_previously_private, false, "internal error: try to insert duplicate iterator in key_image set");
}
++m_cookie;
return true;
@@ -475,10 +498,10 @@ namespace cryptonote
txpool_tx_meta_t meta;
if (!m_blockchain.get_txpool_tx_meta(id, meta))
{
- MERROR("Failed to find tx in txpool");
+ MERROR("Failed to find tx_meta in txpool");
return false;
}
- txblob = m_blockchain.get_txpool_tx_blob(id);
+ txblob = m_blockchain.get_txpool_tx_blob(id, relay_category::all);
auto ci = m_parsed_tx_cache.find(id);
if (ci != m_parsed_tx_cache.end())
{
@@ -533,7 +556,7 @@ namespace cryptonote
MERROR("Failed to find tx in txpool");
return false;
}
- cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid);
+ cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid, relay_category::all);
auto ci = m_parsed_tx_cache.find(txid);
if (ci != m_parsed_tx_cache.end())
{
@@ -611,7 +634,7 @@ namespace cryptonote
remove.push_back(std::make_pair(txid, meta.weight));
}
return true;
- }, false);
+ }, false, relay_category::all);
if (!remove.empty())
{
@@ -621,7 +644,7 @@ namespace cryptonote
const crypto::hash &txid = entry.first;
try
{
- cryptonote::blobdata bd = m_blockchain.get_txpool_tx_blob(txid);
+ cryptonote::blobdata bd = m_blockchain.get_txpool_tx_blob(txid, relay_category::all);
cryptonote::transaction_prefix tx;
if (!parse_and_validate_tx_prefix_from_blob(bd, tx))
{
@@ -649,7 +672,7 @@ namespace cryptonote
}
//---------------------------------------------------------------------------------
//TODO: investigate whether boolean return is appropriate
- bool tx_memory_pool::get_relayable_transactions(std::vector<std::pair<crypto::hash, cryptonote::blobdata>> &txs) const
+ bool tx_memory_pool::get_relayable_transactions(std::vector<std::tuple<crypto::hash, cryptonote::blobdata, relay_method>> &txs) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
@@ -667,8 +690,7 @@ namespace cryptonote
{
try
{
- cryptonote::blobdata bd = m_blockchain.get_txpool_tx_blob(txid);
- txs.push_back(std::make_pair(txid, bd));
+ txs.emplace_back(txid, m_blockchain.get_txpool_tx_blob(txid, relay_category::all), meta.get_relay_method());
}
catch (const std::exception &e)
{
@@ -678,26 +700,27 @@ namespace cryptonote
}
}
return true;
- }, false);
+ }, false, relay_category::relayable);
return true;
}
//---------------------------------------------------------------------------------
- void tx_memory_pool::set_relayed(const std::vector<std::pair<crypto::hash, cryptonote::blobdata>> &txs)
+ void tx_memory_pool::set_relayed(const epee::span<const crypto::hash> hashes, const relay_method method)
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
const time_t now = time(NULL);
LockedTXN lock(m_blockchain);
- for (auto it = txs.begin(); it != txs.end(); ++it)
+ for (const auto& hash : hashes)
{
try
{
txpool_tx_meta_t meta;
- if (m_blockchain.get_txpool_tx_meta(it->first, meta))
+ if (m_blockchain.get_txpool_tx_meta(hash, meta))
{
meta.relayed = true;
meta.last_relayed_time = now;
- m_blockchain.update_txpool_tx(it->first, meta);
+ meta.set_relay_method(method);
+ m_blockchain.update_txpool_tx(hash, meta);
}
}
catch (const std::exception &e)
@@ -709,18 +732,19 @@ namespace cryptonote
lock.commit();
}
//---------------------------------------------------------------------------------
- size_t tx_memory_pool::get_transactions_count(bool include_unrelayed_txes) const
+ size_t tx_memory_pool::get_transactions_count(bool include_sensitive) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
- return m_blockchain.get_txpool_tx_count(include_unrelayed_txes);
+ return m_blockchain.get_txpool_tx_count(include_sensitive);
}
//---------------------------------------------------------------------------------
- void tx_memory_pool::get_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes) const
+ void tx_memory_pool::get_transactions(std::vector<transaction>& txs, bool include_sensitive) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
- txs.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
+ const relay_category category = include_sensitive ? relay_category::all : relay_category::broadcasted;
+ txs.reserve(m_blockchain.get_txpool_tx_count(include_sensitive));
m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
transaction tx;
if (!(meta.pruned ? parse_and_validate_tx_base_from_blob(*bd, tx) : parse_and_validate_tx_from_blob(*bd, tx)))
@@ -732,39 +756,42 @@ namespace cryptonote
tx.set_hash(txid);
txs.push_back(std::move(tx));
return true;
- }, true, include_unrelayed_txes);
+ }, true, category);
}
//------------------------------------------------------------------
- void tx_memory_pool::get_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes) const
+ void tx_memory_pool::get_transaction_hashes(std::vector<crypto::hash>& txs, bool include_sensitive) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
- txs.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
+ const relay_category category = include_sensitive ? relay_category::all : relay_category::broadcasted;
+ txs.reserve(m_blockchain.get_txpool_tx_count(include_sensitive));
m_blockchain.for_all_txpool_txes([&txs](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
txs.push_back(txid);
return true;
- }, false, include_unrelayed_txes);
+ }, false, category);
}
//------------------------------------------------------------------
- void tx_memory_pool::get_transaction_backlog(std::vector<tx_backlog_entry>& backlog, bool include_unrelayed_txes) const
+ void tx_memory_pool::get_transaction_backlog(std::vector<tx_backlog_entry>& backlog, bool include_sensitive) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
const uint64_t now = time(NULL);
- backlog.reserve(m_blockchain.get_txpool_tx_count(include_unrelayed_txes));
+ const relay_category category = include_sensitive ? relay_category::all : relay_category::broadcasted;
+ backlog.reserve(m_blockchain.get_txpool_tx_count(include_sensitive));
m_blockchain.for_all_txpool_txes([&backlog, now](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
backlog.push_back({meta.weight, meta.fee, meta.receive_time - now});
return true;
- }, false, include_unrelayed_txes);
+ }, false, category);
}
//------------------------------------------------------------------
- void tx_memory_pool::get_transaction_stats(struct txpool_stats& stats, bool include_unrelayed_txes) const
+ void tx_memory_pool::get_transaction_stats(struct txpool_stats& stats, bool include_sensitive) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
const uint64_t now = time(NULL);
+ const relay_category category = include_sensitive ? relay_category::all : relay_category::broadcasted;
std::map<uint64_t, txpool_histo> agebytes;
- stats.txs_total = m_blockchain.get_txpool_tx_count(include_unrelayed_txes);
+ stats.txs_total = m_blockchain.get_txpool_tx_count(include_sensitive);
std::vector<uint32_t> weights;
weights.reserve(stats.txs_total);
m_blockchain.for_all_txpool_txes([&stats, &weights, now, &agebytes](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
@@ -789,7 +816,8 @@ namespace cryptonote
if (meta.double_spend_seen)
++stats.num_double_spends;
return true;
- }, false, include_unrelayed_txes);
+ }, false, category);
+
stats.bytes_med = epee::misc_utils::median(weights);
if (stats.txs_total > 1)
{
@@ -847,8 +875,10 @@ namespace cryptonote
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
- tx_infos.reserve(m_blockchain.get_txpool_tx_count());
- key_image_infos.reserve(m_blockchain.get_txpool_tx_count());
+ const relay_category category = include_sensitive_data ? relay_category::all : relay_category::broadcasted;
+ const size_t count = m_blockchain.get_txpool_tx_count(include_sensitive_data);
+ tx_infos.reserve(count);
+ key_image_infos.reserve(count);
m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos, include_sensitive_data](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
tx_info txi;
txi.id_hash = epee::string_tools::pod_to_hex(txid);
@@ -879,7 +909,7 @@ namespace cryptonote
txi.double_spend_seen = meta.double_spend_seen;
tx_infos.push_back(std::move(txi));
return true;
- }, true, include_sensitive_data);
+ }, true, category);
txpool_tx_meta_t meta;
for (const key_images_container::value_type& kee : m_spent_key_images) {
@@ -889,30 +919,13 @@ namespace cryptonote
ki.id_hash = epee::string_tools::pod_to_hex(k_image);
for (const crypto::hash& tx_id_hash : kei_image_set)
{
- if (!include_sensitive_data)
- {
- try
- {
- if (!m_blockchain.get_txpool_tx_meta(tx_id_hash, meta))
- {
- MERROR("Failed to get tx meta from txpool");
- return false;
- }
- if (!meta.relayed)
- // Do not include that transaction if in restricted mode and it's not relayed
- continue;
- }
- catch (const std::exception &e)
- {
- MERROR("Failed to get tx meta from txpool: " << e.what());
- return false;
- }
- }
- ki.txs_hashes.push_back(epee::string_tools::pod_to_hex(tx_id_hash));
+ if (m_blockchain.txpool_tx_matches_category(tx_id_hash, category))
+ ki.txs_hashes.push_back(epee::string_tools::pod_to_hex(tx_id_hash));
}
+
// Only return key images for which we have at least one tx that we can show for them
if (!ki.txs_hashes.empty())
- key_image_infos.push_back(ki);
+ key_image_infos.push_back(std::move(ki));
}
return true;
}
@@ -948,18 +961,19 @@ namespace cryptonote
txi.double_spend_seen = meta.double_spend_seen;
tx_infos.push_back(txi);
return true;
- }, true, false);
+ }, true, relay_category::broadcasted);
for (const key_images_container::value_type& kee : m_spent_key_images) {
std::vector<crypto::hash> tx_hashes;
const std::unordered_set<crypto::hash>& kei_image_set = kee.second;
for (const crypto::hash& tx_id_hash : kei_image_set)
{
- tx_hashes.push_back(tx_id_hash);
+ if (m_blockchain.txpool_tx_matches_category(tx_id_hash, relay_category::broadcasted))
+ tx_hashes.push_back(tx_id_hash);
}
- const crypto::key_image& k_image = kee.first;
- key_image_infos[k_image] = std::move(tx_hashes);
+ if (!tx_hashes.empty())
+ key_image_infos[kee.first] = std::move(tx_hashes);
}
return true;
}
@@ -973,19 +987,26 @@ namespace cryptonote
for (const auto& image : key_images)
{
- spent.push_back(m_spent_key_images.find(image) == m_spent_key_images.end() ? false : true);
+ bool is_spent = false;
+ const auto found = m_spent_key_images.find(image);
+ if (found != m_spent_key_images.end())
+ {
+ for (const crypto::hash& tx_hash : found->second)
+ is_spent |= m_blockchain.txpool_tx_matches_category(tx_hash, relay_category::broadcasted);
+ }
+ spent.push_back(is_spent);
}
return true;
}
//---------------------------------------------------------------------------------
- bool tx_memory_pool::get_transaction(const crypto::hash& id, cryptonote::blobdata& txblob) const
+ bool tx_memory_pool::get_transaction(const crypto::hash& id, cryptonote::blobdata& txblob, relay_category tx_category) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
try
{
- return m_blockchain.get_txpool_tx_blob(id, txblob);
+ return m_blockchain.get_txpool_tx_blob(id, txblob, tx_category);
}
catch (const std::exception &e)
{
@@ -1009,11 +1030,11 @@ namespace cryptonote
return true;
}
//---------------------------------------------------------------------------------
- bool tx_memory_pool::have_tx(const crypto::hash &id) const
+ bool tx_memory_pool::have_tx(const crypto::hash &id, relay_category tx_category) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
CRITICAL_REGION_LOCAL1(m_blockchain);
- return m_blockchain.get_db().txpool_has_tx(id);
+ return m_blockchain.get_db().txpool_has_tx(id, tx_category);
}
//---------------------------------------------------------------------------------
bool tx_memory_pool::have_tx_keyimges_as_spent(const transaction& tx) const
@@ -1032,7 +1053,14 @@ namespace cryptonote
bool tx_memory_pool::have_tx_keyimg_as_spent(const crypto::key_image& key_im) const
{
CRITICAL_REGION_LOCAL(m_transactions_lock);
- return m_spent_key_images.end() != m_spent_key_images.find(key_im);
+ bool spent = false;
+ const auto found = m_spent_key_images.find(key_im);
+ if (found != m_spent_key_images.end())
+ {
+ for (const crypto::hash& tx_hash : found->second)
+ spent |= m_blockchain.txpool_tx_matches_category(tx_hash, relay_category::broadcasted);
+ }
+ return spent;
}
//---------------------------------------------------------------------------------
void tx_memory_pool::lock() const
@@ -1217,13 +1245,14 @@ namespace cryptonote
<< "weight: " << meta.weight << std::endl
<< "fee: " << print_money(meta.fee) << std::endl
<< "kept_by_block: " << (meta.kept_by_block ? 'T' : 'F') << std::endl
+ << "is_local" << (meta.is_local ? 'T' : 'F') << std::endl
<< "double_spend_seen: " << (meta.double_spend_seen ? 'T' : 'F') << std::endl
<< "max_used_block_height: " << meta.max_used_block_height << std::endl
<< "max_used_block_id: " << meta.max_used_block_id << std::endl
<< "last_failed_height: " << meta.last_failed_height << std::endl
<< "last_failed_id: " << meta.last_failed_id << std::endl;
return true;
- }, !short_format);
+ }, !short_format, relay_category::all);
return ss.str();
}
@@ -1255,7 +1284,7 @@ namespace cryptonote
for (; sorted_it != m_txs_by_fee_and_receive_time.end(); ++sorted_it)
{
txpool_tx_meta_t meta;
- if (!m_blockchain.get_txpool_tx_meta(sorted_it->second, meta))
+ if (!m_blockchain.get_txpool_tx_meta(sorted_it->second, meta) && !meta.matches(relay_category::legacy))
{
MERROR(" failed to find tx meta");
continue;
@@ -1304,7 +1333,9 @@ namespace cryptonote
}
}
- cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(sorted_it->second);
+ // "local" and "stem" txes are filtered above
+ cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(sorted_it->second, relay_category::all);
+
cryptonote::transaction tx;
// Skip transactions that are not ready to be
@@ -1379,7 +1410,7 @@ namespace cryptonote
remove.insert(txid);
}
return true;
- }, false);
+ }, false, relay_category::all);
size_t n_removed = 0;
if (!remove.empty())
@@ -1389,7 +1420,7 @@ namespace cryptonote
{
try
{
- cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid);
+ cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(txid, relay_category::all);
cryptonote::transaction tx;
if (!parse_and_validate_tx_from_blob(txblob, tx)) // remove pruned ones on startup, they're meant to be temporary
{
@@ -1450,7 +1481,7 @@ namespace cryptonote
remove.push_back(txid);
return true;
}
- if (!insert_key_images(tx, txid, meta.kept_by_block))
+ if (!insert_key_images(tx, txid, meta.get_relay_method()))
{
MFATAL("Failed to insert key images from txpool tx");
return false;
@@ -1458,7 +1489,7 @@ namespace cryptonote
m_txs_by_fee_and_receive_time.emplace(std::pair<double, time_t>(meta.fee / (double)meta.weight, meta.receive_time), txid);
m_txpool_weight += meta.weight;
return true;
- }, true);
+ }, true, relay_category::all);
if (!r)
return false;
}
diff --git a/src/cryptonote_core/tx_pool.h b/src/cryptonote_core/tx_pool.h
index dec7e3cd9..f716440ad 100644
--- a/src/cryptonote_core/tx_pool.h
+++ b/src/cryptonote_core/tx_pool.h
@@ -32,17 +32,20 @@
#include "include_base_utils.h"
#include <set>
+#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <boost/serialization/version.hpp>
#include <boost/utility.hpp>
+#include "span.h"
#include "string_tools.h"
#include "syncobj.h"
#include "math_helper.h"
#include "cryptonote_basic/cryptonote_basic_impl.h"
#include "cryptonote_basic/verification_context.h"
+#include "cryptonote_protocol/enums.h"
#include "blockchain_db/blockchain_db.h"
#include "crypto/hash.h"
#include "rpc/core_rpc_server_commands_defs.h"
@@ -105,9 +108,10 @@ namespace cryptonote
* @copydoc add_tx(transaction&, tx_verification_context&, bool, bool, uint8_t)
*
* @param id the transaction's hash
+ * @tx_relay how the transaction was received
* @param tx_weight the transaction's weight
*/
- bool add_tx(transaction &tx, const crypto::hash &id, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool kept_by_block, bool relayed, bool do_not_relay, uint8_t version);
+ bool add_tx(transaction &tx, const crypto::hash &id, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, relay_method tx_relay, bool relayed, uint8_t version);
/**
* @brief add a transaction to the transaction pool
@@ -119,14 +123,13 @@ namespace cryptonote
*
* @param tx the transaction to be added
* @param tvc return-by-reference status about the transaction verification
- * @param kept_by_block has this transaction been in a block?
+ * @tx_relay how the transaction was received
* @param relayed was this transaction from the network or a local client?
- * @param do_not_relay to avoid relaying the transaction to the network
* @param version the version used to create the transaction
*
* @return true if the transaction passes validations, otherwise false
*/
- bool add_tx(transaction &tx, tx_verification_context& tvc, bool kept_by_block, bool relayed, bool do_not_relay, uint8_t version);
+ bool add_tx(transaction &tx, tx_verification_context& tvc, relay_method tx_relay, bool relayed, uint8_t version);
/**
* @brief takes a transaction with the given hash from the pool
@@ -149,10 +152,11 @@ namespace cryptonote
* @brief checks if the pool has a transaction with the given hash
*
* @param id the hash to look for
+ * @param tx_category a filter for txes
*
- * @return true if the transaction is in the pool, otherwise false
+ * @return true if the transaction is in the pool and meets tx_category requirements
*/
- bool have_tx(const crypto::hash &id) const;
+ bool have_tx(const crypto::hash &id, relay_category tx_category) const;
/**
* @brief action to take when notified of a block added to the blockchain
@@ -236,37 +240,37 @@ namespace cryptonote
* @brief get a list of all transactions in the pool
*
* @param txs return-by-reference the list of transactions
- * @param include_unrelayed_txes include unrelayed txes in the result
+ * @param include_sensitive return stempool, anonymity-pool, and unrelayed txes
*
*/
- void get_transactions(std::vector<transaction>& txs, bool include_unrelayed_txes = true) const;
+ void get_transactions(std::vector<transaction>& txs, bool include_sensitive = false) const;
/**
* @brief get a list of all transaction hashes in the pool
*
* @param txs return-by-reference the list of transactions
- * @param include_unrelayed_txes include unrelayed txes in the result
+ * @param include_sensitive return stempool, anonymity-pool, and unrelayed txes
*
*/
- void get_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const;
+ void get_transaction_hashes(std::vector<crypto::hash>& txs, bool include_sensitive = false) const;
/**
* @brief get (weight, fee, receive time) for all transaction in the pool
*
* @param txs return-by-reference that data
- * @param include_unrelayed_txes include unrelayed txes in the result
+ * @param include_sensitive return stempool, anonymity-pool, and unrelayed txes
*
*/
- void get_transaction_backlog(std::vector<tx_backlog_entry>& backlog, bool include_unrelayed_txes = true) const;
+ void get_transaction_backlog(std::vector<tx_backlog_entry>& backlog, bool include_sensitive = false) const;
/**
* @brief get a summary statistics of all transaction hashes in the pool
*
* @param stats return-by-reference the pool statistics
- * @param include_unrelayed_txes include unrelayed txes in the result
+ * @param include_sensitive return stempool, anonymity-pool, and unrelayed txes
*
*/
- void get_transaction_stats(struct txpool_stats& stats, bool include_unrelayed_txes = true) const;
+ void get_transaction_stats(struct txpool_stats& stats, bool include_sensitive = false) const;
/**
* @brief get information about all transactions and key images in the pool
@@ -275,11 +279,12 @@ namespace cryptonote
*
* @param tx_infos return-by-reference the transactions' information
* @param key_image_infos return-by-reference the spent key images' information
- * @param include_sensitive_data include unrelayed txes and fields that are sensitive to the node privacy
+ * @param include_sensitive_data return stempool, anonymity-pool, and unrelayed
+ * txes and fields that are sensitive to the node privacy
*
* @return true
*/
- bool get_transactions_and_spent_keys_info(std::vector<tx_info>& tx_infos, std::vector<spent_key_image_info>& key_image_infos, bool include_sensitive_data = true) const;
+ bool get_transactions_and_spent_keys_info(std::vector<tx_info>& tx_infos, std::vector<spent_key_image_info>& key_image_infos, bool include_sensitive_data = false) const;
/**
* @brief get information about all transactions and key images in the pool
@@ -308,10 +313,11 @@ namespace cryptonote
*
* @param h the hash of the transaction to get
* @param tx return-by-reference the transaction blob requested
+ * @param tx_relay last relay method us
*
* @return true if the transaction is found, otherwise false
*/
- bool get_transaction(const crypto::hash& h, cryptonote::blobdata& txblob) const;
+ bool get_transaction(const crypto::hash& h, cryptonote::blobdata& txblob, relay_category tx_category) const;
/**
* @brief get a list of all relayable transactions and their hashes
@@ -326,21 +332,22 @@ namespace cryptonote
*
* @return true
*/
- bool get_relayable_transactions(std::vector<std::pair<crypto::hash, cryptonote::blobdata>>& txs) const;
+ bool get_relayable_transactions(std::vector<std::tuple<crypto::hash, cryptonote::blobdata, relay_method>>& txs) const;
/**
* @brief tell the pool that certain transactions were just relayed
*
- * @param txs the list of transactions (and their hashes)
+ * @param hashes list of tx hashes that are about to be relayed
+ * @param tx_relay update how the tx left this node
*/
- void set_relayed(const std::vector<std::pair<crypto::hash, cryptonote::blobdata>>& txs);
+ void set_relayed(epee::span<const crypto::hash> hashes, relay_method tx_relay);
/**
* @brief get the total number of transactions in the pool
*
* @return the number of transactions in the pool
*/
- size_t get_transactions_count(bool include_unrelayed_txes = true) const;
+ size_t get_transactions_count(bool include_sensitive = false) const;
/**
* @brief get a string containing human-readable pool information
@@ -441,7 +448,7 @@ namespace cryptonote
*
* @return true on success, false on error
*/
- bool insert_key_images(const transaction_prefix &tx, const crypto::hash &txid, bool kept_by_block);
+ bool insert_key_images(const transaction_prefix &tx, const crypto::hash &txid, relay_method tx_relay);
/**
* @brief remove old transactions from the pool
@@ -544,7 +551,7 @@ namespace cryptonote
* transaction on the assumption that the original will not be in a
* block again.
*/
- typedef std::unordered_map<crypto::key_image, std::unordered_set<crypto::hash> > key_images_container;
+ typedef std::unordered_map<crypto::key_image, std::unordered_set<crypto::hash>> key_images_container;
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
public:
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.h b/src/cryptonote_protocol/cryptonote_protocol_handler.h
index b16b42564..ddbd45a61 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.h
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.h
@@ -112,6 +112,7 @@ namespace cryptonote
void stop();
void on_connection_close(cryptonote_connection_context &context);
void set_max_out_peers(unsigned int max) { m_max_out_peers = max; }
+ bool no_sync() const { return m_no_sync; }
void set_no_sync(bool value) { m_no_sync = value; }
std::string get_peers_overview() const;
std::pair<uint32_t, uint32_t> get_next_needed_pruning_stripe() const;
@@ -129,7 +130,7 @@ namespace cryptonote
//----------------- i_bc_protocol_layout ---------------------------------------
virtual bool relay_block(NOTIFY_NEW_BLOCK::request& arg, cryptonote_connection_context& exclude_context);
- virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, cryptonote_connection_context& exclude_context);
+ virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, const boost::uuids::uuid& source, epee::net_utils::zone zone);
//----------------------------------------------------------------------------------
//bool get_payload_sync_data(HANDSHAKE_DATA::request& hshd, cryptonote_connection_context& context);
bool should_drop_connection(cryptonote_connection_context& context, uint32_t next_stripe);
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index 74ceeb41d..e20934a25 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -455,7 +455,7 @@ namespace cryptonote
for(auto tx_blob_it = arg.b.txs.begin(); tx_blob_it!=arg.b.txs.end();tx_blob_it++)
{
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- m_core.handle_incoming_tx(*tx_blob_it, tvc, true, true, false);
+ m_core.handle_incoming_tx(*tx_blob_it, tvc, relay_method::block, true);
if(tvc.m_verifivation_failed)
{
LOG_PRINT_CCONTEXT_L1("Block verification failed: transaction verification failed, dropping connection");
@@ -619,7 +619,7 @@ namespace cryptonote
{
MDEBUG("Incoming tx " << tx_hash << " not in pool, adding");
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- if(!m_core.handle_incoming_tx(tx_blob, tvc, true, true, false) || tvc.m_verifivation_failed)
+ if(!m_core.handle_incoming_tx(tx_blob, tvc, relay_method::block, true) || tvc.m_verifivation_failed)
{
LOG_PRINT_CCONTEXT_L1("Block verification failed: transaction verification failed, dropping connection");
drop_connection(context, false, false);
@@ -667,13 +667,13 @@ namespace cryptonote
drop_connection(context, false, false);
m_core.resume_mine();
return 1;
- }
-
+ }
+
size_t tx_idx = 0;
for(auto& tx_hash: new_block.tx_hashes)
{
cryptonote::blobdata txblob;
- if(m_core.get_pool_transaction(tx_hash, txblob))
+ if(m_core.get_pool_transaction(tx_hash, txblob, relay_category::broadcasted))
{
have_tx.push_back({txblob, crypto::null_hash});
}
@@ -702,7 +702,7 @@ namespace cryptonote
need_tx_indices.push_back(tx_idx);
}
}
-
+
++tx_idx;
}
@@ -909,8 +909,8 @@ namespace cryptonote
newtxs.reserve(arg.txs.size());
for (size_t i = 0; i < arg.txs.size(); ++i)
{
- cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- m_core.handle_incoming_tx({arg.txs[i], crypto::null_hash}, tvc, false, true, false);
+ cryptonote::tx_verification_context tvc{};
+ m_core.handle_incoming_tx({arg.txs[i], crypto::null_hash}, tvc, relay_method::flood, true);
if(tvc.m_verifivation_failed)
{
LOG_PRINT_CCONTEXT_L1("Tx verification failed, dropping connection");
@@ -925,7 +925,7 @@ namespace cryptonote
if(arg.txs.size())
{
//TODO: add announce usage here
- relay_transactions(arg, context);
+ relay_transactions(arg, context.m_connection_id, context.m_remote_address.get_zone());
}
return 1;
@@ -1316,7 +1316,7 @@ namespace cryptonote
TIME_MEASURE_START(transactions_process_time);
num_txs += block_entry.txs.size();
std::vector<tx_verification_context> tvc;
- m_core.handle_incoming_txs(block_entry.txs, tvc, true, true, false);
+ m_core.handle_incoming_txs(block_entry.txs, tvc, relay_method::block, true);
if (tvc.size() != block_entry.txs.size())
{
LOG_ERROR_CCONTEXT("Internal error: tvc.size() != block_entry.txs.size()");
@@ -2344,14 +2344,14 @@ skip:
}
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
- bool t_cryptonote_protocol_handler<t_core>::relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, cryptonote_connection_context& exclude_context)
+ bool t_cryptonote_protocol_handler<t_core>::relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, const boost::uuids::uuid& source, epee::net_utils::zone zone)
{
- for(auto& tx_blob : arg.txs)
- m_core.on_transaction_relayed(tx_blob);
-
- // no check for success, so tell core they're relayed unconditionally
- m_p2p->send_txs(std::move(arg.txs), exclude_context.m_remote_address.get_zone(), exclude_context.m_connection_id, m_core.pad_transactions());
- return true;
+ /* Push all outgoing transactions to this function. The behavior needs to
+ identify how the transaction is going to be relayed, and then update the
+ local mempool before doing the relay. The code was already updating the
+ DB twice on received transactions - it is difficult to workaround this
+ due to the internal design. */
+ return m_p2p->send_txs(std::move(arg.txs), zone, source, m_core, m_core.pad_transactions()) != epee::net_utils::zone::invalid;
}
//------------------------------------------------------------------------------------------------------------------------
template<class t_core>
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler_common.h b/src/cryptonote_protocol/cryptonote_protocol_handler_common.h
index a67178c52..978a9ebf3 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler_common.h
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler_common.h
@@ -41,7 +41,7 @@ namespace cryptonote
struct i_cryptonote_protocol
{
virtual bool relay_block(NOTIFY_NEW_BLOCK::request& arg, cryptonote_connection_context& exclude_context)=0;
- virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, cryptonote_connection_context& exclude_context)=0;
+ virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, const boost::uuids::uuid& source, epee::net_utils::zone zone)=0;
//virtual bool request_objects(NOTIFY_REQUEST_GET_OBJECTS::request& arg, cryptonote_connection_context& context)=0;
};
@@ -54,7 +54,7 @@ namespace cryptonote
{
return false;
}
- virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, cryptonote_connection_context& exclude_context)
+ virtual bool relay_transactions(NOTIFY_NEW_TRANSACTIONS::request& arg, const boost::uuids::uuid& source, epee::net_utils::zone zone)
{
return false;
}
diff --git a/src/cryptonote_protocol/enums.h b/src/cryptonote_protocol/enums.h
new file mode 100644
index 000000000..ad4eedf4c
--- /dev/null
+++ b/src/cryptonote_protocol/enums.h
@@ -0,0 +1,43 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include <cstdint>
+
+namespace cryptonote
+{
+ //! Methods tracking how a tx was received and relayed
+ enum class relay_method : std::uint8_t
+ {
+ none = 0, //!< Received via RPC with `do_not_relay` set
+ local, //!< Received via RPC; trying to send over i2p/tor, etc.
+ block, //!< Received in block, takes precedence over others
+ flood //!< Received/sent over public networks
+ };
+}
diff --git a/src/cryptonote_protocol/fwd.h b/src/cryptonote_protocol/fwd.h
new file mode 100644
index 000000000..616b48be3
--- /dev/null
+++ b/src/cryptonote_protocol/fwd.h
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+namespace cryptonote
+{
+ class core;
+ struct cryptonote_connection_context;
+ struct i_core_events;
+}
+
diff --git a/src/cryptonote_protocol/levin_notify.h b/src/cryptonote_protocol/levin_notify.h
index 484243af5..8bc9b72fa 100644
--- a/src/cryptonote_protocol/levin_notify.h
+++ b/src/cryptonote_protocol/levin_notify.h
@@ -35,6 +35,7 @@
#include "byte_slice.h"
#include "cryptonote_basic/blobdatatype.h"
+#include "cryptonote_protocol/fwd.h"
#include "net/enums.h"
#include "span.h"
@@ -53,11 +54,6 @@ namespace nodetool
namespace cryptonote
{
- struct cryptonote_connection_context;
-}
-
-namespace cryptonote
-{
namespace levin
{
namespace detail
diff --git a/src/daemon/command_parser_executor.cpp b/src/daemon/command_parser_executor.cpp
index b827221f6..99a460c78 100644
--- a/src/daemon/command_parser_executor.cpp
+++ b/src/daemon/command_parser_executor.cpp
@@ -28,7 +28,6 @@
#include "common/dns_utils.h"
#include "common/command_line.h"
-#include "version.h"
#include "daemon/command_parser_executor.h"
#undef MONERO_DEFAULT_LOG_CATEGORY
@@ -803,8 +802,7 @@ bool t_command_parser_executor::rpc_payments(const std::vector<std::string>& arg
bool t_command_parser_executor::version(const std::vector<std::string>& args)
{
- std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl;
- return true;
+ return m_executor.version();
}
bool t_command_parser_executor::prune_blockchain(const std::vector<std::string>& args)
diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp
index fc9f8ef39..ef9fed177 100644
--- a/src/daemon/rpc_command_executor.cpp
+++ b/src/daemon/rpc_command_executor.cpp
@@ -38,6 +38,7 @@
#include "cryptonote_basic/difficulty.h"
#include "cryptonote_basic/hardfork.h"
#include "rpc/rpc_payment_signature.h"
+#include "rpc/rpc_version_str.h"
#include <boost/format.hpp>
#include <ctime>
#include <string>
@@ -2442,4 +2443,39 @@ bool t_rpc_command_executor::rpc_payments()
return true;
}
+bool t_rpc_command_executor::version()
+{
+ cryptonote::COMMAND_RPC_GET_INFO::request req;
+ cryptonote::COMMAND_RPC_GET_INFO::response res;
+
+ const char *fail_message = "Problem fetching info";
+
+ if (m_is_rpc)
+ {
+ if (!m_rpc_client->rpc_request(req, res, "/getinfo", fail_message))
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if (!m_rpc_server->on_get_info(req, res) || res.status != CORE_RPC_STATUS_OK)
+ {
+ tools::fail_msg_writer() << make_error(fail_message, res.status);
+ return true;
+ }
+ }
+
+ if (res.version.empty() || !cryptonote::rpc::is_version_string_valid(res.version))
+ {
+ tools::fail_msg_writer() << "The daemon software version is not available.";
+ }
+ else
+ {
+ tools::success_msg_writer() << res.version;
+ }
+
+ return true;
+}
+
}// namespace daemonize
diff --git a/src/daemon/rpc_command_executor.h b/src/daemon/rpc_command_executor.h
index e8b12cb9b..af55f0e22 100644
--- a/src/daemon/rpc_command_executor.h
+++ b/src/daemon/rpc_command_executor.h
@@ -163,6 +163,8 @@ public:
bool print_net_stats();
+ bool version();
+
bool set_bootstrap_daemon(
const std::string &address,
const std::string &username,
diff --git a/src/daemonizer/posix_fork.cpp b/src/daemonizer/posix_fork.cpp
index 5af4e1a4a..16758215d 100644
--- a/src/daemonizer/posix_fork.cpp
+++ b/src/daemonizer/posix_fork.cpp
@@ -127,13 +127,18 @@ void fork(const std::string & pidfile)
{
quit("Unable to open output file: " + output);
}
+#else
+ if (open("/dev/null", O_WRONLY) < 0)
+ {
+ quit("Unable to open /dev/null");
+ }
+#endif
// Also send standard error to the same log file.
if (dup(1) < 0)
{
quit("Unable to dup output descriptor");
}
-#endif
}
} // namespace posix
diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h
index 8d861ce29..ee70c2806 100644
--- a/src/p2p/net_node.h
+++ b/src/p2p/net_node.h
@@ -43,6 +43,7 @@
#include <vector>
#include "cryptonote_config.h"
+#include "cryptonote_protocol/fwd.h"
#include "cryptonote_protocol/levin_notify.h"
#include "warnings.h"
#include "net/abstract_tcp_server2.h"
@@ -336,7 +337,7 @@ namespace nodetool
virtual void callback(p2p_connection_context& context);
//----------------- i_p2p_endpoint -------------------------------------------------------------
virtual bool relay_notify_to_list(int command, const epee::span<const uint8_t> data_buff, std::vector<std::pair<epee::net_utils::zone, boost::uuids::uuid>> connections);
- virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, const bool pad_txs);
+ virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, cryptonote::i_core_events& core, bool pad_txs);
virtual bool invoke_command_to_peer(int command, const epee::span<const uint8_t> req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context);
virtual bool invoke_notify_to_peer(int command, const epee::span<const uint8_t> req_buff, const epee::net_utils::connection_context_base& context);
virtual bool drop_connection(const epee::net_utils::connection_context_base& context);
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index f8094bfa8..45bb10593 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -2053,13 +2053,18 @@ namespace nodetool
}
//-----------------------------------------------------------------------------------
template<class t_payload_net_handler>
- epee::net_utils::zone node_server<t_payload_net_handler>::send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, const bool pad_txs)
+ epee::net_utils::zone node_server<t_payload_net_handler>::send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, cryptonote::i_core_events& core, const bool pad_txs)
{
namespace enet = epee::net_utils;
- const auto send = [&txs, &source, pad_txs] (std::pair<const enet::zone, network_zone>& network)
+ const auto send = [&txs, &source, &core, pad_txs] (std::pair<const enet::zone, network_zone>& network)
{
- if (network.second.m_notifier.send_txs(std::move(txs), source, (pad_txs || network.first != enet::zone::public_)))
+ const bool is_public = (network.first == enet::zone::public_);
+ const cryptonote::relay_method tx_relay = is_public ?
+ cryptonote::relay_method::flood : cryptonote::relay_method::local;
+
+ core.on_transactions_relayed(epee::to_span(txs), tx_relay);
+ if (network.second.m_notifier.send_txs(std::move(txs), source, (pad_txs || !is_public)))
return network.first;
return enet::zone::invalid;
};
diff --git a/src/p2p/net_node_common.h b/src/p2p/net_node_common.h
index 752873666..aa1b83b83 100644
--- a/src/p2p/net_node_common.h
+++ b/src/p2p/net_node_common.h
@@ -34,6 +34,8 @@
#include <utility>
#include <vector>
#include "cryptonote_basic/blobdatatype.h"
+#include "cryptonote_protocol/enums.h"
+#include "cryptonote_protocol/fwd.h"
#include "net/enums.h"
#include "net/net_utils_base.h"
#include "p2p_protocol_defs.h"
@@ -48,7 +50,7 @@ namespace nodetool
struct i_p2p_endpoint
{
virtual bool relay_notify_to_list(int command, const epee::span<const uint8_t> data_buff, std::vector<std::pair<epee::net_utils::zone, boost::uuids::uuid>> connections)=0;
- virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, const bool pad_txs)=0;
+ virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, cryptonote::i_core_events& core, bool pad_txs)=0;
virtual bool invoke_command_to_peer(int command, const epee::span<const uint8_t> req_buff, std::string& resp_buff, const epee::net_utils::connection_context_base& context)=0;
virtual bool invoke_notify_to_peer(int command, const epee::span<const uint8_t> req_buff, const epee::net_utils::connection_context_base& context)=0;
virtual bool drop_connection(const epee::net_utils::connection_context_base& context)=0;
@@ -73,7 +75,7 @@ namespace nodetool
{
return false;
}
- virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, const bool pad_txs)
+ virtual epee::net_utils::zone send_txs(std::vector<cryptonote::blobdata> txs, const epee::net_utils::zone origin, const boost::uuids::uuid& source, cryptonote::i_core_events& core, const bool pad_txs)
{
return epee::net_utils::zone::invalid;
}
diff --git a/src/ringct/bulletproofs.cc b/src/ringct/bulletproofs.cc
index ff6fee95c..80ecc5593 100644
--- a/src/ringct/bulletproofs.cc
+++ b/src/ringct/bulletproofs.cc
@@ -27,6 +27,7 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Adapted from Java code by Sarang Noether
+// Paper references are to https://eprint.iacr.org/2017/1066 (revision 1 July 2018)
#include <stdlib.h>
#include <boost/thread/mutex.hpp>
@@ -521,6 +522,7 @@ Bulletproof bulletproof_PROVE(const rct::keyV &sv, const rct::keyV &gamma)
}
PERF_TIMER_STOP_BP(PROVE_v);
+ // PAPER LINES 41-42
PERF_TIMER_START_BP(PROVE_aLaR);
for (size_t j = 0; j < M; ++j)
{
@@ -566,14 +568,14 @@ try_again:
rct::key hash_cache = rct::hash_to_scalar(V);
PERF_TIMER_START_BP(PROVE_step1);
- // PAPER LINES 38-39
+ // PAPER LINES 43-44
rct::key alpha = rct::skGen();
rct::key ve = vector_exponent(aL8, aR8);
rct::key A;
sc_mul(tmp.bytes, alpha.bytes, INV_EIGHT.bytes);
rct::addKeys(A, ve, rct::scalarmultBase(tmp));
- // PAPER LINES 40-42
+ // PAPER LINES 45-47
rct::keyV sL = rct::skvGen(MN), sR = rct::skvGen(MN);
rct::key rho = rct::skGen();
ve = vector_exponent(sL, sR);
@@ -581,7 +583,7 @@ try_again:
rct::addKeys(S, ve, rct::scalarmultBase(rho));
S = rct::scalarmultKey(S, INV_EIGHT);
- // PAPER LINES 43-45
+ // PAPER LINES 48-50
rct::key y = hash_cache_mash(hash_cache, A, S);
if (y == rct::zero())
{
@@ -598,24 +600,20 @@ try_again:
}
// Polynomial construction by coefficients
+ // PAPER LINES 70-71
rct::keyV l0 = vector_subtract(aL, z);
const rct::keyV &l1 = sL;
- // This computes the ugly sum/concatenation from PAPER LINE 65
rct::keyV zero_twos(MN);
const rct::keyV zpow = vector_powers(z, M+2);
- for (size_t i = 0; i < MN; ++i)
+ for (size_t j = 0; j < M; ++j)
{
- zero_twos[i] = rct::zero();
- for (size_t j = 1; j <= M; ++j)
- {
- if (i >= (j-1)*N && i < j*N)
+ for (size_t i = 0; i < N; ++i)
{
- CHECK_AND_ASSERT_THROW_MES(1+j < zpow.size(), "invalid zpow index");
- CHECK_AND_ASSERT_THROW_MES(i-(j-1)*N < twoN.size(), "invalid twoN index");
- sc_muladd(zero_twos[i].bytes, zpow[1+j].bytes, twoN[i-(j-1)*N].bytes, zero_twos[i].bytes);
+ CHECK_AND_ASSERT_THROW_MES(j+2 < zpow.size(), "invalid zpow index");
+ CHECK_AND_ASSERT_THROW_MES(i < twoN.size(), "invalid twoN index");
+ sc_mul(zero_twos[j*N+i].bytes,zpow[j+2].bytes,twoN[i].bytes);
}
- }
}
rct::keyV r0 = vector_add(aR, z);
@@ -624,7 +622,7 @@ try_again:
r0 = vector_add(r0, zero_twos);
rct::keyV r1 = hadamard(yMN, sR);
- // Polynomial construction before PAPER LINE 46
+ // Polynomial construction before PAPER LINE 51
rct::key t1_1 = inner_product(l0, r1);
rct::key t1_2 = inner_product(l1, r0);
rct::key t1;
@@ -634,7 +632,7 @@ try_again:
PERF_TIMER_STOP_BP(PROVE_step1);
PERF_TIMER_START_BP(PROVE_step2);
- // PAPER LINES 47-48
+ // PAPER LINES 52-53
rct::key tau1 = rct::skGen(), tau2 = rct::skGen();
rct::key T1, T2;
@@ -648,7 +646,7 @@ try_again:
ge_double_scalarmult_base_vartime_p3(&p3, tmp.bytes, &ge_p3_H, tmp2.bytes);
ge_p3_tobytes(T2.bytes, &p3);
- // PAPER LINES 49-51
+ // PAPER LINES 54-56
rct::key x = hash_cache_mash(hash_cache, z, T1, T2);
if (x == rct::zero())
{
@@ -657,7 +655,7 @@ try_again:
goto try_again;
}
- // PAPER LINES 52-53
+ // PAPER LINES 61-63
rct::key taux;
sc_mul(taux.bytes, tau1.bytes, x.bytes);
rct::key xsq;
@@ -671,7 +669,7 @@ try_again:
rct::key mu;
sc_muladd(mu.bytes, x.bytes, rho.bytes, alpha.bytes);
- // PAPER LINES 54-57
+ // PAPER LINES 58-60
rct::keyV l = l0;
l = vector_add(l, vector_scalar(l1, x));
rct::keyV r = r0;
@@ -690,7 +688,7 @@ try_again:
CHECK_AND_ASSERT_THROW_MES(test_t == t, "test_t check failed");
#endif
- // PAPER LINES 32-33
+ // PAPER LINE 6
rct::key x_ip = hash_cache_mash(hash_cache, x, taux, mu, t);
if (x_ip == rct::zero())
{
@@ -725,20 +723,19 @@ try_again:
PERF_TIMER_STOP_BP(PROVE_step3);
PERF_TIMER_START_BP(PROVE_step4);
- // PAPER LINE 13
const rct::keyV *scale = &yinvpow;
while (nprime > 1)
{
- // PAPER LINE 15
+ // PAPER LINE 20
nprime /= 2;
- // PAPER LINES 16-17
+ // PAPER LINES 21-22
PERF_TIMER_START_BP(PROVE_inner_product);
rct::key cL = inner_product(slice(aprime, 0, nprime), slice(bprime, nprime, bprime.size()));
rct::key cR = inner_product(slice(aprime, nprime, aprime.size()), slice(bprime, 0, nprime));
PERF_TIMER_STOP_BP(PROVE_inner_product);
- // PAPER LINES 18-19
+ // PAPER LINES 23-24
PERF_TIMER_START_BP(PROVE_LR);
sc_mul(tmp.bytes, cL.bytes, x_ip.bytes);
L[round] = cross_vector_exponent8(nprime, Gprime, nprime, Hprime, 0, aprime, 0, bprime, nprime, scale, &ge_p3_H, &tmp);
@@ -746,7 +743,7 @@ try_again:
R[round] = cross_vector_exponent8(nprime, Gprime, 0, Hprime, nprime, aprime, nprime, bprime, 0, scale, &ge_p3_H, &tmp);
PERF_TIMER_STOP_BP(PROVE_LR);
- // PAPER LINES 21-22
+ // PAPER LINES 25-27
w[round] = hash_cache_mash(hash_cache, L[round], R[round]);
if (w[round] == rct::zero())
{
@@ -755,7 +752,7 @@ try_again:
goto try_again;
}
- // PAPER LINES 24-25
+ // PAPER LINES 29-30
const rct::key winv = invert(w[round]);
if (nprime > 1)
{
@@ -765,7 +762,7 @@ try_again:
PERF_TIMER_STOP_BP(PROVE_hadamard2);
}
- // PAPER LINES 28-29
+ // PAPER LINES 33-34
PERF_TIMER_START_BP(PROVE_prime);
aprime = vector_add(vector_scalar(slice(aprime, 0, nprime), w[round]), vector_scalar(slice(aprime, nprime, aprime.size()), winv));
bprime = vector_add(vector_scalar(slice(bprime, 0, nprime), winv), vector_scalar(slice(bprime, nprime, bprime.size()), w[round]));
@@ -776,7 +773,6 @@ try_again:
}
PERF_TIMER_STOP_BP(PROVE_step4);
- // PAPER LINE 58 (with inclusions from PAPER LINE 8 and PAPER LINE 20)
return Bulletproof(std::move(V), A, S, T1, T2, taux, mu, std::move(L), std::move(R), aprime[0], bprime[0], t);
}
@@ -810,7 +806,10 @@ struct proof_data_t
size_t logM, inv_offset;
};
-/* Given a range proof, determine if it is valid */
+/* Given a range proof, determine if it is valid
+ * This uses the method in PAPER LINES 95-105,
+ * weighted across multiple proofs in a batch
+ */
bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
{
init_exponents();
@@ -871,7 +870,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
CHECK_AND_ASSERT_MES(rounds > 0, false, "Zero rounds");
PERF_TIMER_START_BP(VERIFY_line_21_22);
- // PAPER LINES 21-22
// The inner product challenges are computed per round
pd.w.resize(rounds);
for (size_t i = 0; i < rounds; ++i)
@@ -929,7 +927,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
rct::key proof8_A = rct::scalarmult8(proof.A);
PERF_TIMER_START_BP(VERIFY_line_61);
- // PAPER LINE 61
sc_mulsub(m_y0.bytes, proof.taux.bytes, weight_y.bytes, m_y0.bytes);
const rct::keyV zpow = vector_powers(pd.z, M+3);
@@ -962,7 +959,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
PERF_TIMER_STOP_BP(VERIFY_line_61rl_new);
PERF_TIMER_START_BP(VERIFY_line_62);
- // PAPER LINE 62
multiexp_data.emplace_back(weight_z, proof8_A);
sc_mul(tmp.bytes, pd.x.bytes, weight_z.bytes);
multiexp_data.emplace_back(tmp, proof8_S);
@@ -973,7 +969,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
CHECK_AND_ASSERT_MES(rounds > 0, false, "Zero rounds");
PERF_TIMER_START_BP(VERIFY_line_24_25);
- // Basically PAPER LINES 24-25
// Compute the curvepoints from G[i] and H[i]
rct::key yinvpow = rct::identity();
rct::key ypow = rct::identity();
@@ -1010,7 +1005,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
sc_mul(g_scalar.bytes, g_scalar.bytes, w_cache[i].bytes);
sc_mul(h_scalar.bytes, h_scalar.bytes, w_cache[(~i) & (MN-1)].bytes);
- // Adjust the scalars using the exponents from PAPER LINE 62
sc_add(g_scalar.bytes, g_scalar.bytes, pd.z.bytes);
CHECK_AND_ASSERT_MES(2+i/N < zpow.size(), false, "invalid zpow index");
CHECK_AND_ASSERT_MES(i%N < twoN.size(), false, "invalid twoN index");
@@ -1043,7 +1037,6 @@ bool bulletproof_VERIFY(const std::vector<const Bulletproof*> &proofs)
PERF_TIMER_STOP_BP(VERIFY_line_24_25);
- // PAPER LINE 26
PERF_TIMER_START_BP(VERIFY_line_26_new);
sc_muladd(z1.bytes, proof.mu.bytes, weight_z.bytes, z1.bytes);
for (size_t i = 0; i < rounds; ++i)
diff --git a/src/ringct/rctTypes.cpp b/src/ringct/rctTypes.cpp
index 2c4e5fc3b..1763542db 100644
--- a/src/ringct/rctTypes.cpp
+++ b/src/ringct/rctTypes.cpp
@@ -31,6 +31,7 @@
#include "misc_log_ex.h"
#include "cryptonote_config.h"
#include "rctTypes.h"
+#include "int-util.h"
using namespace crypto;
using namespace std;
@@ -118,40 +119,22 @@ namespace rct {
//uint long long to 32 byte key
void d2h(key & amounth, const xmr_amount in) {
sc_0(amounth.bytes);
- xmr_amount val = in;
- int i = 0;
- while (val != 0) {
- amounth[i] = (unsigned char)(val & 0xFF);
- i++;
- val /= (xmr_amount)256;
- }
+ memcpy_swap64le(amounth.bytes, &in, 1);
}
//uint long long to 32 byte key
key d2h(const xmr_amount in) {
key amounth;
- sc_0(amounth.bytes);
- xmr_amount val = in;
- int i = 0;
- while (val != 0) {
- amounth[i] = (unsigned char)(val & 0xFF);
- i++;
- val /= (xmr_amount)256;
- }
+ d2h(amounth, in);
return amounth;
}
//uint long long to int[64]
void d2b(bits amountb, xmr_amount val) {
int i = 0;
- while (val != 0) {
- amountb[i] = val & 1;
- i++;
- val >>= 1;
- }
while (i < 64) {
- amountb[i] = 0;
- i++;
+ amountb[i++] = val & 1;
+ val >>= 1;
}
}
@@ -172,16 +155,11 @@ namespace rct {
int val = 0, i = 0, j = 0;
for (j = 0; j < 8; j++) {
val = (unsigned char)test.bytes[j];
- i = 8 * j;
- while (val != 0) {
- amountb2[i] = val & 1;
- i++;
+ i = 0;
+ while (i < 8) {
+ amountb2[j*8+i++] = val & 1;
val >>= 1;
}
- while (i < 8 * (j + 1)) {
- amountb2[i] = 0;
- i++;
- }
}
}
diff --git a/src/rpc/CMakeLists.txt b/src/rpc/CMakeLists.txt
index ebb1e767f..65d88b57e 100644
--- a/src/rpc/CMakeLists.txt
+++ b/src/rpc/CMakeLists.txt
@@ -37,6 +37,7 @@ set(rpc_sources
bootstrap_daemon.cpp
core_rpc_server.cpp
rpc_payment.cpp
+ rpc_version_str.cpp
instanciations)
set(daemon_messages_sources
@@ -54,6 +55,7 @@ set(rpc_base_headers
rpc_handler.h)
set(rpc_headers
+ rpc_version_str.h
rpc_handler.h)
set(daemon_rpc_server_headers)
diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp
index df264dde6..dc93e7023 100644
--- a/src/rpc/core_rpc_server.cpp
+++ b/src/rpc/core_rpc_server.cpp
@@ -29,6 +29,7 @@
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include <boost/preprocessor/stringize.hpp>
+#include <boost/uuid/nil_generator.hpp>
#include "include_base_utils.h"
#include "string_tools.h"
using namespace epee;
@@ -1095,9 +1096,8 @@ namespace cryptonote
}
res.sanity_check_failed = false;
- cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context);
- tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- if(!m_core.handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, false, false, req.do_not_relay) || tvc.m_verifivation_failed)
+ tx_verification_context tvc{};
+ if(!m_core.handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, (req.do_not_relay ? relay_method::none : relay_method::local), false) || tvc.m_verifivation_failed)
{
res.status = "Failed";
std::string reason = "";
@@ -1142,7 +1142,7 @@ namespace cryptonote
NOTIFY_NEW_TRANSACTIONS::request r;
r.txs.push_back(tx_blob);
- m_core.get_protocol()->relay_transactions(r, fake_context);
+ m_core.get_protocol()->relay_transactions(r, boost::uuids::nil_uuid(), epee::net_utils::zone::invalid);
//TODO: make sure that tx has reached other nodes here, probably wait to receive reflections from other nodes
res.status = CORE_RPC_STATUS_OK;
return true;
@@ -1833,7 +1833,9 @@ namespace cryptonote
return false;
}
b.nonce = req.starting_nonce;
- miner::find_nonce_for_given_block(&(m_core.get_blockchain_storage()), b, template_res.difficulty, template_res.height);
+ miner::find_nonce_for_given_block([this](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash) {
+ return cryptonote::get_block_longhash(&(m_core.get_blockchain_storage()), b, hash, height, threads);
+ }, b, template_res.difficulty, template_res.height);
submit_req.front() = string_tools::buff_to_hex_nodelimer(block_to_blob(b));
r = on_submitblock(submit_req, submit_res, error_resp, ctx);
@@ -1903,7 +1905,8 @@ namespace cryptonote
}
auto current_time = std::chrono::system_clock::now();
- if (current_time - m_bootstrap_height_check_time > std::chrono::seconds(30)) // update every 30s
+ if (!m_p2p.get_payload_object().no_sync() &&
+ current_time - m_bootstrap_height_check_time > std::chrono::seconds(30)) // update every 30s
{
{
boost::upgrade_to_unique_lock<boost::shared_mutex> lock(upgrade_lock);
@@ -1927,9 +1930,10 @@ namespace cryptonote
uint64_t top_height = m_core.get_current_blockchain_height();
m_should_use_bootstrap_daemon = top_height + 10 < *bootstrap_daemon_height;
MINFO((m_should_use_bootstrap_daemon ? "Using" : "Not using") << " the bootstrap daemon (our height: " << top_height << ", bootstrap daemon's height: " << *bootstrap_daemon_height << ")");
+
+ if (!m_should_use_bootstrap_daemon)
+ return false;
}
- if (!m_should_use_bootstrap_daemon)
- return false;
if (mode == invoke_http_mode::JON)
{
@@ -2366,7 +2370,7 @@ namespace cryptonote
if (req.txids.empty())
{
std::vector<transaction> pool_txs;
- bool r = m_core.get_pool_transactions(pool_txs);
+ bool r = m_core.get_pool_transactions(pool_txs, true);
if (!r)
{
res.status = "Failed to get txpool contents";
@@ -2743,13 +2747,11 @@ namespace cryptonote
crypto::hash txid = *reinterpret_cast<const crypto::hash*>(txid_data.data());
cryptonote::blobdata txblob;
- bool r = m_core.get_pool_transaction(txid, txblob);
- if (r)
+ if (!m_core.get_pool_transaction(txid, txblob, relay_category::legacy))
{
- cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context);
NOTIFY_NEW_TRANSACTIONS::request r;
r.txs.push_back(txblob);
- m_core.get_protocol()->relay_transactions(r, fake_context);
+ m_core.get_protocol()->relay_transactions(r, boost::uuids::nil_uuid(), epee::net_utils::zone::invalid);
//TODO: make sure that tx has reached other nodes here, probably wait to receive reflections from other nodes
}
else
diff --git a/src/rpc/daemon_handler.cpp b/src/rpc/daemon_handler.cpp
index d7e081af3..0b6cd6c7a 100644
--- a/src/rpc/daemon_handler.cpp
+++ b/src/rpc/daemon_handler.cpp
@@ -28,6 +28,7 @@
#include "daemon_handler.h"
+#include <boost/uuid/nil_generator.hpp>
// likely included by daemon_handler.h's includes,
// but including here for clarity
#include "cryptonote_core/cryptonote_core.h"
@@ -288,10 +289,9 @@ namespace rpc
return;
}
- cryptonote_connection_context fake_context = AUTO_VAL_INIT(fake_context);
tx_verification_context tvc = AUTO_VAL_INIT(tvc);
- if(!m_core.handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, false, false, !relay) || tvc.m_verifivation_failed)
+ if(!m_core.handle_incoming_tx({tx_blob, crypto::null_hash}, tvc, (relay ? relay_method::local : relay_method::none), false) || tvc.m_verifivation_failed)
{
if (tvc.m_verifivation_failed)
{
@@ -368,7 +368,7 @@ namespace rpc
NOTIFY_NEW_TRANSACTIONS::request r;
r.txs.push_back(tx_blob);
- m_core.get_protocol()->relay_transactions(r, fake_context);
+ m_core.get_protocol()->relay_transactions(r, boost::uuids::nil_uuid(), epee::net_utils::zone::invalid);
//TODO: make sure that tx has reached other nodes here, probably wait to receive reflections from other nodes
res.status = Message::STATUS_OK;
diff --git a/src/rpc/rpc_version_str.cpp b/src/rpc/rpc_version_str.cpp
new file mode 100644
index 000000000..c60cf4891
--- /dev/null
+++ b/src/rpc/rpc_version_str.cpp
@@ -0,0 +1,55 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "rpc_version_str.h"
+#include "version.h"
+#include <regex>
+
+namespace cryptonote
+{
+
+namespace rpc
+{
+
+// Expected format of Monero software version string:
+// 1) Four numbers, one to two digits each, separated by periods
+// 2) Optionally, one of the following suffixes:
+// a) -release
+// b) -<hash> where <hash> is exactly nine lowercase hex digits
+
+bool is_version_string_valid(const std::string& str)
+{
+ return std::regex_match(str, std::regex(
+ "^\\d{1,2}(\\.\\d{1,2}){3}(-(release|[0-9a-f]{9}))?$",
+ std::regex_constants::nosubs
+ ));
+}
+
+} // namespace rpc
+
+} // namespace cryptonote
diff --git a/src/rpc/rpc_version_str.h b/src/rpc/rpc_version_str.h
new file mode 100644
index 000000000..930c807d2
--- /dev/null
+++ b/src/rpc/rpc_version_str.h
@@ -0,0 +1,43 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+#pragma once
+
+#include <string>
+
+namespace cryptonote
+{
+
+namespace rpc
+{
+
+bool is_version_string_valid(const std::string& str);
+
+} // namespace rpc
+
+} // namespace cryptonote
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 03693a57c..a35ee40ae 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -912,16 +912,6 @@ bool simple_wallet::change_password(const std::vector<std::string> &args)
bool simple_wallet::payment_id(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
-
- crypto::hash payment_id;
- if (args.size() > 0)
- {
- PRINT_USAGE(USAGE_PAYMENT_ID);
- return true;
- }
- payment_id = crypto::rand<crypto::hash>();
- success_msg_writer() << tr("Random payment ID: ") << payment_id;
- return true;
}
bool simple_wallet::print_fee_info(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
@@ -6293,13 +6283,6 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
if (tools::wallet2::parse_long_payment_id(payment_id_str, payment_id))
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
-
- std::string extra_nonce;
- set_payment_id_to_tx_extra_nonce(extra_nonce, payment_id);
- r = add_extra_nonce_to_tx_extra(extra, extra_nonce);
- local_args.pop_back();
- payment_id_seen = true;
- message_writer() << tr("Warning: Unencrypted payment IDs will harm your privacy: ask the recipient to use subaddresses instead");
}
if(!r)
{
@@ -6408,8 +6391,6 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vector<std::stri
else if (tools::wallet2::parse_payment_id(payment_id_uri, payment_id))
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
- set_payment_id_to_tx_extra_nonce(extra_nonce, payment_id);
- message_writer() << tr("Warning: Unencrypted payment IDs will harm your privacy: ask the recipient to use subaddresses instead");
}
else
{
@@ -6945,11 +6926,6 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vector<st
if(r)
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
-
- std::string extra_nonce;
- set_payment_id_to_tx_extra_nonce(extra_nonce, payment_id);
- r = add_extra_nonce_to_tx_extra(extra, extra_nonce);
- payment_id_seen = true;
}
if(!r && local_args.size() == 3)
@@ -7191,7 +7167,6 @@ bool simple_wallet::sweep_single(const std::vector<std::string> &args_)
if (tools::wallet2::parse_long_payment_id(local_args.back(), payment_id))
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
- set_payment_id_to_tx_extra_nonce(extra_nonce, payment_id);
}
else
{
@@ -8356,7 +8331,11 @@ bool simple_wallet::get_transfers(std::vector<std::string>& local_args, std::vec
m_in_manual_refresh.store(true, std::memory_order_relaxed);
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){m_in_manual_refresh.store(false, std::memory_order_relaxed);});
- m_wallet->update_pool_state();
+ std::vector<std::pair<cryptonote::transaction, bool>> process_txs;
+ m_wallet->update_pool_state(process_txs);
+ if (!process_txs.empty())
+ m_wallet->process_pool_state(process_txs);
+
std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>> payments;
m_wallet->get_unconfirmed_payments(payments, m_current_subaddress_account, subaddr_indices);
for (std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>>::const_iterator i = payments.begin(); i != payments.end(); ++i) {
@@ -8803,22 +8782,41 @@ void simple_wallet::check_for_messages()
//----------------------------------------------------------------------------------------------------
void simple_wallet::wallet_idle_thread()
{
+ const boost::posix_time::ptime start_time = boost::posix_time::microsec_clock::universal_time();
while (true)
{
boost::unique_lock<boost::mutex> lock(m_idle_mutex);
if (!m_idle_run.load(std::memory_order_relaxed))
break;
+ // if another thread was busy (ie, a foreground refresh thread), we'll end up here at
+ // some random time that's not what we slept for, so we should not call refresh now
+ // or we'll be leaking that fact through timing
+ const boost::posix_time::ptime now0 = boost::posix_time::microsec_clock::universal_time();
+ const uint64_t dt_actual = (now0 - start_time).total_microseconds() % 1000000;
+#ifdef _WIN32
+ static const uint64_t threshold = 10000;
+#else
+ static const uint64_t threshold = 2000;
+#endif
+ if (dt_actual < threshold) // if less than a threshold... would a very slow machine always miss it ?
+ {
#ifndef _WIN32
- m_inactivity_checker.do_call(boost::bind(&simple_wallet::check_inactivity, this));
+ m_inactivity_checker.do_call(boost::bind(&simple_wallet::check_inactivity, this));
#endif
- m_refresh_checker.do_call(boost::bind(&simple_wallet::check_refresh, this));
- m_mms_checker.do_call(boost::bind(&simple_wallet::check_mms, this));
- m_rpc_payment_checker.do_call(boost::bind(&simple_wallet::check_rpc_payment, this));
+ m_refresh_checker.do_call(boost::bind(&simple_wallet::check_refresh, this));
+ m_mms_checker.do_call(boost::bind(&simple_wallet::check_mms, this));
+ m_rpc_payment_checker.do_call(boost::bind(&simple_wallet::check_rpc_payment, this));
- if (!m_idle_run.load(std::memory_order_relaxed))
- break;
- m_idle_cond.wait_for(lock, boost::chrono::seconds(1));
+ if (!m_idle_run.load(std::memory_order_relaxed))
+ break;
+ }
+
+ // aim for the next multiple of 1 second
+ const boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
+ const auto dt = (now - start_time).total_microseconds();
+ const auto wait = 1000000 - dt % 1000000;
+ m_idle_cond.wait_for(lock, boost::chrono::microseconds(wait));
}
}
//----------------------------------------------------------------------------------------------------
@@ -9398,7 +9396,6 @@ bool simple_wallet::address_book(const std::vector<std::string> &args/* = std::v
if (tools::wallet2::parse_long_payment_id(args[3], payment_id))
{
LONG_PAYMENT_ID_SUPPORT_CHECK();
- description_start += 2;
}
else if (tools::wallet2::parse_short_payment_id(args[3], info.payment_id))
{
@@ -10002,7 +9999,11 @@ bool simple_wallet::show_transfer(const std::vector<std::string> &args)
try
{
- m_wallet->update_pool_state();
+ std::vector<std::pair<cryptonote::transaction, bool>> process_txs;
+ m_wallet->update_pool_state(process_txs);
+ if (!process_txs.empty())
+ m_wallet->process_pool_state(process_txs);
+
std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>> pool_payments;
m_wallet->get_unconfirmed_payments(pool_payments, m_current_subaddress_account);
for (std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>>::const_iterator i = pool_payments.begin(); i != pool_payments.end(); ++i) {
diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h
index e8f96ad54..75bd893d5 100644
--- a/src/simplewallet/simplewallet.h
+++ b/src/simplewallet/simplewallet.h
@@ -448,10 +448,12 @@ namespace cryptonote
std::atomic<bool> m_locked;
std::atomic<bool> m_in_command;
+ template<uint64_t mini, uint64_t maxi> struct get_random_interval { public: uint64_t operator()() const { return crypto::rand_range(mini, maxi); } };
+
epee::math_helper::once_a_time_seconds<1> m_inactivity_checker;
- epee::math_helper::once_a_time_seconds<90> m_refresh_checker;
- epee::math_helper::once_a_time_seconds<90> m_mms_checker;
- epee::math_helper::once_a_time_seconds<90> m_rpc_payment_checker;
+ epee::math_helper::once_a_time_seconds_range<get_random_interval<80 * 1000000, 100 * 1000000>> m_refresh_checker;
+ epee::math_helper::once_a_time_seconds_range<get_random_interval<90 * 1000000, 110 * 1000000>> m_mms_checker;
+ epee::math_helper::once_a_time_seconds_range<get_random_interval<90 * 1000000, 115 * 1000000>> m_rpc_payment_checker;
std::atomic<bool> m_need_payment;
boost::posix_time::ptime m_last_rpc_payment_mining_time;
diff --git a/src/version.cpp.in b/src/version.cpp.in
index 9121cdf85..ccb88f1fe 100644
--- a/src/version.cpp.in
+++ b/src/version.cpp.in
@@ -1,6 +1,6 @@
#define DEF_MONERO_VERSION_TAG "@VERSIONTAG@"
-#define DEF_MONERO_VERSION "0.14.1.2"
-#define DEF_MONERO_RELEASE_NAME "Boron Butterfly"
+#define DEF_MONERO_VERSION "0.15.0.0"
+#define DEF_MONERO_RELEASE_NAME "Carbon Chamaeleon"
#define DEF_MONERO_VERSION_FULL DEF_MONERO_VERSION "-" DEF_MONERO_VERSION_TAG
#define DEF_MONERO_VERSION_IS_RELEASE @VERSION_IS_RELEASE@
diff --git a/src/wallet/node_rpc_proxy.cpp b/src/wallet/node_rpc_proxy.cpp
index 731896715..005b0bafa 100644
--- a/src/wallet/node_rpc_proxy.cpp
+++ b/src/wallet/node_rpc_proxy.cpp
@@ -36,7 +36,7 @@
do { \
CHECK_AND_ASSERT_MES(error.code == 0, error.message, error.message); \
handle_payment_changes(res, std::integral_constant<bool, HasCredits<decltype(res)>::Has>()); \
- CHECK_AND_ASSERT_MES(r, std::string(), "Failed to connect to daemon"); \
+ CHECK_AND_ASSERT_MES(r, std::string("Failed to connect to daemon"), "Failed to connect to daemon"); \
/* empty string -> not connection */ \
CHECK_AND_ASSERT_MES(!res.status.empty(), res.status, "No connection to daemon"); \
CHECK_AND_ASSERT_MES(res.status != CORE_RPC_STATUS_BUSY, res.status, "Daemon busy"); \
@@ -77,6 +77,7 @@ void NodeRPCProxy::invalidate()
m_rpc_payment_seed_height = 0;
m_rpc_payment_seed_hash = crypto::null_hash;
m_rpc_payment_next_seed_hash = crypto::null_hash;
+ m_height_time = 0;
}
boost::optional<std::string> NodeRPCProxy::get_rpc_version(uint32_t &rpc_version)
@@ -101,6 +102,7 @@ boost::optional<std::string> NodeRPCProxy::get_rpc_version(uint32_t &rpc_version
void NodeRPCProxy::set_height(uint64_t h)
{
m_height = h;
+ m_height_time = time(NULL);
}
boost::optional<std::string> NodeRPCProxy::get_info()
@@ -126,12 +128,20 @@ boost::optional<std::string> NodeRPCProxy::get_info()
m_target_height = resp_t.target_height;
m_block_weight_limit = resp_t.block_weight_limit ? resp_t.block_weight_limit : resp_t.block_size_limit;
m_get_info_time = now;
+ m_height_time = now;
}
return boost::optional<std::string>();
}
boost::optional<std::string> NodeRPCProxy::get_height(uint64_t &height)
{
+ const time_t now = time(NULL);
+ if (now < m_height_time + 30) // re-cache every 30 seconds
+ {
+ height = m_height;
+ return boost::optional<std::string>();
+ }
+
auto res = get_info();
if (res)
return res;
diff --git a/src/wallet/node_rpc_proxy.h b/src/wallet/node_rpc_proxy.h
index a9d8167ac..65ca40640 100644
--- a/src/wallet/node_rpc_proxy.h
+++ b/src/wallet/node_rpc_proxy.h
@@ -97,6 +97,7 @@ private:
crypto::hash m_rpc_payment_seed_hash;
crypto::hash m_rpc_payment_next_seed_hash;
uint32_t m_rpc_payment_cookie;
+ time_t m_height_time;
};
}
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 9b3e7e8b4..e60c6b7e1 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2519,12 +2519,14 @@ void wallet2::parse_block_round(const cryptonote::blobdata &blob, cryptonote::bl
error = !cryptonote::parse_and_validate_block_from_blob(blob, bl, bl_id);
}
//----------------------------------------------------------------------------------------------------
-void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices)
+void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t &current_height)
{
cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::request req = AUTO_VAL_INIT(req);
cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::response res = AUTO_VAL_INIT(res);
req.block_ids = short_chain_history;
+ MDEBUG("Pulling blocks: start_height " << start_height);
+
req.prune = true;
req.start_height = start_height;
req.no_miner_tx = m_refresh_type == RefreshNoCoinbase;
@@ -2544,6 +2546,10 @@ void wallet2::pull_blocks(uint64_t start_height, uint64_t &blocks_start_height,
blocks_start_height = res.start_height;
blocks = std::move(res.blocks);
o_indices = std::move(res.output_indices);
+ current_height = res.current_height;
+
+ MDEBUG("Pulled blocks: blocks_start_height " << blocks_start_height << ", count " << blocks.size()
+ << ", height " << blocks_start_height + blocks.size() << ", node height " << res.current_height);
}
//----------------------------------------------------------------------------------------------------
void wallet2::pull_hashes(uint64_t start_height, uint64_t &blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<crypto::hash> &hashes)
@@ -2726,9 +2732,10 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
refresh(trusted_daemon, start_height, blocks_fetched, received_money);
}
//----------------------------------------------------------------------------------------------------
-void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &error, std::exception_ptr &exception)
+void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &last, bool &error, std::exception_ptr &exception)
{
error = false;
+ last = false;
exception = NULL;
try
@@ -2746,7 +2753,8 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
// pull the new blocks
std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> o_indices;
- pull_blocks(start_height, blocks_start_height, short_chain_history, blocks, o_indices);
+ uint64_t current_height;
+ pull_blocks(start_height, blocks_start_height, short_chain_history, blocks, o_indices, current_height);
THROW_WALLET_EXCEPTION_IF(blocks.size() != o_indices.size(), error::wallet_internal_error, "Mismatched sizes of blocks and o_indices");
tools::threadpool& tpool = tools::threadpool::getInstance();
@@ -2784,6 +2792,7 @@ void wallet2::pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks
}
}
waiter.wait(&tpool);
+ last = !blocks.empty() && cryptonote::get_block_height(parsed_blocks.back().block) + 1 == current_height;
}
catch(...)
{
@@ -2820,7 +2829,7 @@ void wallet2::remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashe
}
//----------------------------------------------------------------------------------------------------
-void wallet2::update_pool_state(bool refreshed)
+void wallet2::update_pool_state(std::vector<std::pair<cryptonote::transaction, bool>> &process_txs, bool refreshed)
{
MTRACE("update_pool_state start");
@@ -2968,11 +2977,6 @@ void wallet2::update_pool_state(bool refreshed)
LOG_PRINT_L1("We sent that one");
}
}
- else
- {
- LOG_PRINT_L1("Already saw that one, it's for us");
- txids.push_back({txid, true});
- }
}
// get those txes
@@ -3015,13 +3019,7 @@ void wallet2::update_pool_state(bool refreshed)
[tx_hash](const std::pair<crypto::hash, bool> &e) { return e.first == tx_hash; });
if (i != txids.end())
{
- process_new_transaction(tx_hash, tx, std::vector<uint64_t>(), 0, 0, time(NULL), false, true, tx_entry.double_spend_seen, {});
- m_scanned_pool_txs[0].insert(tx_hash);
- if (m_scanned_pool_txs[0].size() > 5000)
- {
- std::swap(m_scanned_pool_txs[0], m_scanned_pool_txs[1]);
- m_scanned_pool_txs[0].clear();
- }
+ process_txs.push_back(std::make_pair(tx, tx_entry.double_spend_seen));
}
else
{
@@ -3052,6 +3050,24 @@ void wallet2::update_pool_state(bool refreshed)
MTRACE("update_pool_state end");
}
//----------------------------------------------------------------------------------------------------
+void wallet2::process_pool_state(const std::vector<std::pair<cryptonote::transaction, bool>> &txs)
+{
+ const time_t now = time(NULL);
+ for (const auto &e: txs)
+ {
+ const cryptonote::transaction &tx = e.first;
+ const bool double_spend_seen = e.second;
+ const crypto::hash tx_hash = get_transaction_hash(tx);
+ process_new_transaction(tx_hash, tx, std::vector<uint64_t>(), 0, 0, now, false, true, double_spend_seen, {});
+ m_scanned_pool_txs[0].insert(tx_hash);
+ if (m_scanned_pool_txs[0].size() > 5000)
+ {
+ std::swap(m_scanned_pool_txs[0], m_scanned_pool_txs[1]);
+ m_scanned_pool_txs[0].clear();
+ }
+ }
+}
+//----------------------------------------------------------------------------------------------------
void wallet2::fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, bool force)
{
std::vector<crypto::hash> hashes;
@@ -3255,7 +3271,15 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
});
auto scope_exit_handler_hwdev = epee::misc_utils::create_scope_leave_handler([&](){hwdev.computing_key_images(false);});
- bool first = true;
+
+ // get updated pool state first, but do not process those txes just yet,
+ // since that might cause a password prompt, which would introduce a data
+ // leak allowing a passive adversary with traffic analysis capability to
+ // infer when we get an incoming output
+ std::vector<std::pair<cryptonote::transaction, bool>> process_pool_txs;
+ update_pool_state(process_pool_txs, true);
+
+ bool first = true, last = false;
while(m_run.load(std::memory_order_relaxed))
{
uint64_t next_blocks_start_height;
@@ -3277,7 +3301,8 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
refreshed = true;
break;
}
- tpool.submit(&waiter, [&]{pull_and_parse_next_blocks(start_height, next_blocks_start_height, short_chain_history, blocks, parsed_blocks, next_blocks, next_parsed_blocks, error, exception);});
+ if (!last)
+ tpool.submit(&waiter, [&]{pull_and_parse_next_blocks(start_height, next_blocks_start_height, short_chain_history, blocks, parsed_blocks, next_blocks, next_parsed_blocks, last, error, exception);});
if (!first)
{
@@ -3384,8 +3409,8 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
try
{
// If stop() is called we don't need to check pending transactions
- if (check_pool && m_run.load(std::memory_order_relaxed))
- update_pool_state(refreshed);
+ if (check_pool && m_run.load(std::memory_order_relaxed) && !process_pool_txs.empty())
+ process_pool_state(process_pool_txs);
}
catch (...)
{
@@ -13187,7 +13212,7 @@ uint64_t wallet2::get_blockchain_height_by_date(uint16_t year, uint8_t month, ui
bool wallet2::is_synced()
{
uint64_t height;
- boost::optional<std::string> result = m_node_rpc_proxy.get_target_height(height);
+ boost::optional<std::string> result = m_node_rpc_proxy.get_height(height);
if (result && *result != CORE_RPC_STATUS_OK)
return false;
return get_blockchain_current_height() >= height;
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index 640565a4e..c86315f7c 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -1219,7 +1219,8 @@ private:
bool import_key_images(signed_tx_set & signed_tx, size_t offset=0, bool only_selected_transfers=false);
crypto::public_key get_tx_pub_key_from_received_outs(const tools::wallet2::transfer_details &td) const;
- void update_pool_state(bool refreshed = false);
+ void update_pool_state(std::vector<std::pair<cryptonote::transaction, bool>> &process_txs, bool refreshed = false);
+ void process_pool_state(const std::vector<std::pair<cryptonote::transaction, bool>> &txs);
void remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashes);
std::string encrypt(const char *plaintext, size_t len, const crypto::secret_key &skey, bool authenticated = true) const;
@@ -1403,10 +1404,10 @@ private:
void get_short_chain_history(std::list<crypto::hash>& ids, uint64_t granularity = 1) const;
bool clear();
void clear_soft(bool keep_key_images=false);
- void pull_blocks(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices);
+ void pull_blocks(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<cryptonote::COMMAND_RPC_GET_BLOCKS_FAST::block_output_indices> &o_indices, uint64_t &current_height);
void pull_hashes(uint64_t start_height, uint64_t& blocks_start_height, const std::list<crypto::hash> &short_chain_history, std::vector<crypto::hash> &hashes);
void fast_refresh(uint64_t stop_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, bool force = false);
- void pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &error, std::exception_ptr &exception);
+ void pull_and_parse_next_blocks(uint64_t start_height, uint64_t &blocks_start_height, std::list<crypto::hash> &short_chain_history, const std::vector<cryptonote::block_complete_entry> &prev_blocks, const std::vector<parsed_block> &prev_parsed_blocks, std::vector<cryptonote::block_complete_entry> &blocks, std::vector<parsed_block> &parsed_blocks, bool &last, bool &error, std::exception_ptr &exception);
void process_parsed_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<parsed_block> &parsed_blocks, uint64_t& blocks_added, std::map<std::pair<uint64_t, uint64_t>, size_t> *output_tracker_cache = NULL);
uint64_t select_transfers(uint64_t needed_money, std::vector<size_t> unused_transfers_indices, std::vector<size_t>& selected_transfers) const;
bool prepare_file_names(const std::string& file_path);
diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp
index ec21b2897..de501f056 100644
--- a/src/wallet/wallet_rpc_server.cpp
+++ b/src/wallet/wallet_rpc_server.cpp
@@ -2438,7 +2438,10 @@ namespace tools
if (req.pool)
{
- m_wallet->update_pool_state();
+ std::vector<std::pair<cryptonote::transaction, bool>> process_txs;
+ m_wallet->update_pool_state(process_txs);
+ if (!process_txs.empty())
+ m_wallet->process_pool_state(process_txs);
std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>> payments;
m_wallet->get_unconfirmed_payments(payments, account_index, subaddr_indices);
@@ -2518,7 +2521,10 @@ namespace tools
}
}
- m_wallet->update_pool_state();
+ std::vector<std::pair<cryptonote::transaction, bool>> process_txs;
+ m_wallet->update_pool_state(process_txs);
+ if (!process_txs.empty())
+ m_wallet->process_pool_state(process_txs);
std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>> pool_payments;
m_wallet->get_unconfirmed_payments(pool_payments, req.account_index);
diff --git a/tests/core_proxy/core_proxy.cpp b/tests/core_proxy/core_proxy.cpp
index db5b7797a..9463d14ce 100644
--- a/tests/core_proxy/core_proxy.cpp
+++ b/tests/core_proxy/core_proxy.cpp
@@ -160,8 +160,8 @@ string tx2str(const cryptonote::transaction& tx, const cryptonote::hash256& tx_h
return ss.str();
}*/
-bool tests::proxy_core::handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) {
- if (!keeped_by_block)
+bool tests::proxy_core::handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, cryptonote::relay_method tx_relay, bool relayed) {
+ if (tx_relay != cryptonote::relay_method::block)
return true;
crypto::hash tx_hash = null_hash;
@@ -190,13 +190,13 @@ bool tests::proxy_core::handle_incoming_tx(const cryptonote::tx_blob_entry& tx_b
return true;
}
-bool tests::proxy_core::handle_incoming_txs(const std::vector<tx_blob_entry>& tx_blobs, std::vector<tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
+bool tests::proxy_core::handle_incoming_txs(const std::vector<tx_blob_entry>& tx_blobs, std::vector<tx_verification_context>& tvc, cryptonote::relay_method tx_relay, bool relayed)
{
tvc.resize(tx_blobs.size());
size_t i = 0;
for (const auto &tx_blob: tx_blobs)
{
- if (!handle_incoming_tx(tx_blob, tvc[i], keeped_by_block, relayed, do_not_relay))
+ if (!handle_incoming_tx(tx_blob, tvc[i], tx_relay, relayed))
return false;
++i;
}
diff --git a/tests/core_proxy/core_proxy.h b/tests/core_proxy/core_proxy.h
index 0e41a2be0..8732c85cc 100644
--- a/tests/core_proxy/core_proxy.h
+++ b/tests/core_proxy/core_proxy.h
@@ -34,6 +34,7 @@
#include "cryptonote_basic/cryptonote_basic_impl.h"
#include "cryptonote_basic/verification_context.h"
+#include "cryptonote_core/i_core_events.h"
#include <unordered_map>
namespace tests
@@ -51,7 +52,7 @@ namespace tests
: height(_height), id(_id), longhash(_longhash), blk(_blk), blob(_blob), txes(_txes) { }
};
- class proxy_core
+ class proxy_core : public cryptonote::i_core_events
{
cryptonote::block m_genesis;
std::list<crypto::hash> m_known_block_list;
@@ -75,8 +76,8 @@ namespace tests
bool get_stat_info(cryptonote::core_stat_info& st_inf){return true;}
bool have_block(const crypto::hash& id);
void get_blockchain_top(uint64_t& height, crypto::hash& top_id);
- bool handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
- bool handle_incoming_txs(const std::vector<cryptonote::tx_blob_entry>& tx_blobs, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
+ bool handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, cryptonote::relay_method tx_relay, bool relayed);
+ bool handle_incoming_txs(const std::vector<cryptonote::tx_blob_entry>& tx_blobs, std::vector<cryptonote::tx_verification_context>& tvc, cryptonote::relay_method tx_relay, bool relayed);
bool handle_incoming_block(const cryptonote::blobdata& block_blob, const cryptonote::block *block, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true);
void pause_mine(){}
void resume_mine(){}
@@ -90,9 +91,9 @@ namespace tests
bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; }
uint64_t get_target_blockchain_height() const { return 1; }
size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; }
- virtual void on_transaction_relayed(const cryptonote::blobdata& tx) {}
+ virtual void on_transactions_relayed(epee::span<const cryptonote::blobdata> tx_blobs, cryptonote::relay_method tx_relay) {}
cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; }
- bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; }
+ bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob, cryptonote::relay_category tx_category) const { return false; }
bool pool_has_tx(const crypto::hash &txid) const { return false; }
bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::vector<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::transaction>& txs, std::vector<crypto::hash>& missed_txs) const { return false; }
diff --git a/tests/core_tests/CMakeLists.txt b/tests/core_tests/CMakeLists.txt
index f93cbf3ad..42e76e613 100644
--- a/tests/core_tests/CMakeLists.txt
+++ b/tests/core_tests/CMakeLists.txt
@@ -40,6 +40,7 @@ set(core_tests_sources
ring_signature_1.cpp
transaction_tests.cpp
tx_validation.cpp
+ tx_pool.cpp
v2_tests.cpp
rct.cpp
bulletproofs.cpp
@@ -57,6 +58,7 @@ set(core_tests_headers
integer_overflow.h
multisig.h
ring_signature_1.h
+ tx_pool.h
transaction_tests.h
tx_validation.h
v2_tests.h
diff --git a/tests/core_tests/chaingen.cpp b/tests/core_tests/chaingen.cpp
index 3f2984288..35e449e10 100644
--- a/tests/core_tests/chaingen.cpp
+++ b/tests/core_tests/chaingen.cpp
@@ -186,7 +186,9 @@ bool test_generator::construct_block(cryptonote::block& blk, uint64_t height, co
// Nonce search...
blk.nonce = 0;
- while (!miner::find_nonce_for_given_block(NULL, blk, get_test_difficulty(hf_ver), height))
+ while (!miner::find_nonce_for_given_block([](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
+ return cryptonote::get_block_longhash(NULL, b, hash, height, threads);
+ }, blk, get_test_difficulty(hf_ver), height))
blk.timestamp++;
add_block(blk, txs_weight, block_weights, already_generated_coins, hf_ver ? hf_ver.get() : 1);
@@ -797,7 +799,9 @@ void fill_tx_sources_and_destinations(const std::vector<test_event_entry>& event
void fill_nonce(cryptonote::block& blk, const difficulty_type& diffic, uint64_t height)
{
blk.nonce = 0;
- while (!miner::find_nonce_for_given_block(NULL, blk, diffic, height))
+ while (!miner::find_nonce_for_given_block([](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
+ return cryptonote::get_block_longhash(NULL, b, hash, height, threads);
+ }, blk, diffic, height))
blk.timestamp++;
}
diff --git a/tests/core_tests/chaingen.h b/tests/core_tests/chaingen.h
index b78640dc9..bc0e61365 100644
--- a/tests/core_tests/chaingen.h
+++ b/tests/core_tests/chaingen.h
@@ -53,6 +53,7 @@
#include "cryptonote_basic/cryptonote_basic_impl.h"
#include "cryptonote_basic/cryptonote_format_utils.h"
#include "cryptonote_core/cryptonote_core.h"
+#include "cryptonote_protocol/enums.h"
#include "cryptonote_basic/cryptonote_boost_serialization.h"
#include "misc_language.h"
@@ -108,17 +109,17 @@ typedef serialized_object<cryptonote::transaction> serialized_transaction;
struct event_visitor_settings
{
- int valid_mask;
- bool txs_keeped_by_block;
+ int mask;
enum settings
{
- set_txs_keeped_by_block = 1 << 0
+ set_txs_keeped_by_block = 1 << 0,
+ set_txs_do_not_relay = 1 << 1,
+ set_local_relay = 1 << 2
};
- event_visitor_settings(int a_valid_mask = 0, bool a_txs_keeped_by_block = false)
- : valid_mask(a_valid_mask)
- , txs_keeped_by_block(a_txs_keeped_by_block)
+ event_visitor_settings(int a_mask = 0)
+ : mask(a_mask)
{
}
@@ -128,8 +129,7 @@ private:
template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/)
{
- ar & valid_mask;
- ar & txs_keeped_by_block;
+ ar & mask;
}
};
@@ -503,7 +503,7 @@ private:
t_test_class& m_validator;
size_t m_ev_index;
- bool m_txs_keeped_by_block;
+ cryptonote::relay_method m_tx_relay;
public:
push_core_event_visitor(cryptonote::core& c, const std::vector<test_event_entry>& events, t_test_class& validator)
@@ -511,7 +511,7 @@ public:
, m_events(events)
, m_validator(validator)
, m_ev_index(0)
- , m_txs_keeped_by_block(false)
+ , m_tx_relay(cryptonote::relay_method::flood)
{
}
@@ -530,9 +530,21 @@ public:
{
log_event("event_visitor_settings");
- if (settings.valid_mask & event_visitor_settings::set_txs_keeped_by_block)
+ if (settings.mask & event_visitor_settings::set_txs_keeped_by_block)
{
- m_txs_keeped_by_block = settings.txs_keeped_by_block;
+ m_tx_relay = cryptonote::relay_method::block;
+ }
+ else if (settings.mask & event_visitor_settings::set_local_relay)
+ {
+ m_tx_relay = cryptonote::relay_method::local;
+ }
+ else if (settings.mask & event_visitor_settings::set_txs_do_not_relay)
+ {
+ m_tx_relay = cryptonote::relay_method::none;
+ }
+ else
+ {
+ m_tx_relay = cryptonote::relay_method::flood;
}
return true;
@@ -544,7 +556,7 @@ public:
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
size_t pool_size = m_c.get_pool_transactions_count();
- m_c.handle_incoming_tx({t_serializable_object_to_blob(tx), crypto::null_hash}, tvc, m_txs_keeped_by_block, false, false);
+ m_c.handle_incoming_tx({t_serializable_object_to_blob(tx), crypto::null_hash}, tvc, m_tx_relay, false);
bool tx_added = pool_size + 1 == m_c.get_pool_transactions_count();
bool r = m_validator.check_tx_verification_context(tvc, tx_added, m_ev_index, tx);
CHECK_AND_NO_ASSERT_MES(r, false, "tx verification context check failed");
@@ -564,7 +576,7 @@ public:
tvcs.push_back(tvc0);
}
size_t pool_size = m_c.get_pool_transactions_count();
- m_c.handle_incoming_txs(tx_blobs, tvcs, m_txs_keeped_by_block, false, false);
+ m_c.handle_incoming_txs(tx_blobs, tvcs, m_tx_relay, false);
size_t tx_added = m_c.get_pool_transactions_count() - pool_size;
bool r = m_validator.check_tx_verification_context_array(tvcs, tx_added, m_ev_index, txs);
CHECK_AND_NO_ASSERT_MES(r, false, "tx verification context check failed");
@@ -644,7 +656,7 @@ public:
cryptonote::tx_verification_context tvc = AUTO_VAL_INIT(tvc);
size_t pool_size = m_c.get_pool_transactions_count();
- m_c.handle_incoming_tx(sr_tx.data, tvc, m_txs_keeped_by_block, false, false);
+ m_c.handle_incoming_tx(sr_tx.data, tvc, m_tx_relay, false);
bool tx_added = pool_size + 1 == m_c.get_pool_transactions_count();
cryptonote::transaction tx;
@@ -955,7 +967,7 @@ inline bool do_replay_file(const std::string& filename)
#define MAKE_MINER_TX_MANUALLY(TX, BLK) MAKE_MINER_TX_AND_KEY_MANUALLY(TX, BLK, 0)
-#define SET_EVENT_VISITOR_SETT(VEC_EVENTS, SETT, VAL) VEC_EVENTS.push_back(event_visitor_settings(SETT, VAL));
+#define SET_EVENT_VISITOR_SETT(VEC_EVENTS, SETT) VEC_EVENTS.push_back(event_visitor_settings(SETT));
#define GENERATE(filename, genclass) \
{ \
diff --git a/tests/core_tests/chaingen_main.cpp b/tests/core_tests/chaingen_main.cpp
index 8406f416f..23f3170b8 100644
--- a/tests/core_tests/chaingen_main.cpp
+++ b/tests/core_tests/chaingen_main.cpp
@@ -32,6 +32,7 @@
#include "chaingen_tests_list.h"
#include "common/util.h"
#include "common/command_line.h"
+#include "tx_pool.h"
#include "transaction_tests.h"
namespace po = boost::program_options;
@@ -155,6 +156,12 @@ int main(int argc, char* argv[])
GENERATE_AND_PLAY(gen_tx_output_is_not_txout_to_key);
GENERATE_AND_PLAY(gen_tx_signatures_are_invalid);
+ // Mempool
+ GENERATE_AND_PLAY(txpool_spend_key_public);
+ GENERATE_AND_PLAY(txpool_spend_key_all);
+ GENERATE_AND_PLAY(txpool_double_spend_norelay);
+ GENERATE_AND_PLAY(txpool_double_spend_local);
+
// Double spend
GENERATE_AND_PLAY(gen_double_spend_in_tx<false>);
GENERATE_AND_PLAY(gen_double_spend_in_tx<true>);
diff --git a/tests/core_tests/double_spend.cpp b/tests/core_tests/double_spend.cpp
index afd212b27..4aa12c8e0 100644
--- a/tests/core_tests/double_spend.cpp
+++ b/tests/core_tests/double_spend.cpp
@@ -46,7 +46,7 @@ bool gen_double_spend_in_different_chains::generate(std::vector<test_event_entry
{
INIT_DOUBLE_SPEND_TEST();
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, true);
+ SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block);
MAKE_TX(events, tx_1, bob_account, alice_account, send_amount / 2 - TESTS_DEFAULT_FEE, blk_1);
events.pop_back();
MAKE_TX(events, tx_2, bob_account, alice_account, send_amount - TESTS_DEFAULT_FEE, blk_1);
@@ -96,3 +96,4 @@ bool gen_double_spend_in_different_chains::check_double_spend(cryptonote::core&
return true;
}
+
diff --git a/tests/core_tests/double_spend.inl b/tests/core_tests/double_spend.inl
index 600899b6f..684c9c4de 100644
--- a/tests/core_tests/double_spend.inl
+++ b/tests/core_tests/double_spend.inl
@@ -147,7 +147,7 @@ bool gen_double_spend_in_tx<txs_keeped_by_block>::generate(std::vector<test_even
if (!construct_tx(bob_account.get_keys(), sources, destinations, boost::none, std::vector<uint8_t>(), tx_1, 0))
return false;
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, txs_keeped_by_block);
+ SET_EVENT_VISITOR_SETT(events, txs_keeped_by_block ? event_visitor_settings::set_txs_keeped_by_block : 0);
DO_CALLBACK(events, "mark_invalid_tx");
events.push_back(tx_1);
DO_CALLBACK(events, "mark_invalid_block");
@@ -163,7 +163,7 @@ bool gen_double_spend_in_the_same_block<txs_keeped_by_block>::generate(std::vect
INIT_DOUBLE_SPEND_TEST();
DO_CALLBACK(events, "mark_last_valid_block");
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, txs_keeped_by_block);
+ SET_EVENT_VISITOR_SETT(events, txs_keeped_by_block ? event_visitor_settings::set_txs_keeped_by_block : 0);
MAKE_TX_LIST_START(events, txs_1, bob_account, alice_account, send_amount - TESTS_DEFAULT_FEE, blk_1);
cryptonote::transaction tx_1 = txs_1.front();
@@ -190,7 +190,7 @@ bool gen_double_spend_in_different_blocks<txs_keeped_by_block>::generate(std::ve
INIT_DOUBLE_SPEND_TEST();
DO_CALLBACK(events, "mark_last_valid_block");
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, txs_keeped_by_block);
+ SET_EVENT_VISITOR_SETT(events, txs_keeped_by_block ? event_visitor_settings::set_txs_keeped_by_block : 0);
// Create two identical transactions, but don't push it to events list
MAKE_TX(events, tx_blk_2, bob_account, alice_account, send_amount - TESTS_DEFAULT_FEE, blk_1);
@@ -220,7 +220,7 @@ bool gen_double_spend_in_alt_chain_in_the_same_block<txs_keeped_by_block>::gener
{
INIT_DOUBLE_SPEND_TEST();
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, txs_keeped_by_block);
+ SET_EVENT_VISITOR_SETT(events, txs_keeped_by_block ? event_visitor_settings::set_txs_keeped_by_block : 0);
// Main chain
MAKE_NEXT_BLOCK(events, blk_2, blk_1r, miner_account);
@@ -255,7 +255,7 @@ bool gen_double_spend_in_alt_chain_in_different_blocks<txs_keeped_by_block>::gen
{
INIT_DOUBLE_SPEND_TEST();
- SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block, txs_keeped_by_block);
+ SET_EVENT_VISITOR_SETT(events, txs_keeped_by_block ? event_visitor_settings::set_txs_keeped_by_block : 0);
// Main chain
MAKE_NEXT_BLOCK(events, blk_2, blk_1r, miner_account);
diff --git a/tests/core_tests/tx_pool.cpp b/tests/core_tests/tx_pool.cpp
new file mode 100644
index 000000000..537015dca
--- /dev/null
+++ b/tests/core_tests/tx_pool.cpp
@@ -0,0 +1,561 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "tx_pool.h"
+
+#include <boost/chrono/chrono.hpp>
+#include <boost/thread/thread_only.hpp>
+#include <limits>
+#include "string_tools.h"
+
+#define INIT_MEMPOOL_TEST() \
+ uint64_t send_amount = 1000; \
+ uint64_t ts_start = 1338224400; \
+ GENERATE_ACCOUNT(miner_account); \
+ GENERATE_ACCOUNT(bob_account); \
+ MAKE_GENESIS_BLOCK(events, blk_0, miner_account, ts_start); \
+ REWIND_BLOCKS(events, blk_0r, blk_0, miner_account); \
+
+
+txpool_base::txpool_base()
+ : test_chain_unit_base()
+ , m_broadcasted_tx_count(0)
+ , m_all_tx_count(0)
+{
+ REGISTER_CALLBACK_METHOD(txpool_spend_key_public, increase_broadcasted_tx_count);
+ REGISTER_CALLBACK_METHOD(txpool_spend_key_public, increase_all_tx_count);
+ REGISTER_CALLBACK_METHOD(txpool_spend_key_public, check_txpool_spent_keys);
+}
+
+bool txpool_base::increase_broadcasted_tx_count(cryptonote::core& /*c*/, size_t /*ev_index*/, const std::vector<test_event_entry>& /*events*/)
+{
+ ++m_broadcasted_tx_count;
+ return true;
+}
+
+bool txpool_base::increase_all_tx_count(cryptonote::core& /*c*/, size_t /*ev_index*/, const std::vector<test_event_entry>& /*events*/)
+{
+ ++m_all_tx_count;
+ return true;
+}
+
+bool txpool_base::check_txpool_spent_keys(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& events)
+{
+ std::vector<cryptonote::tx_info> infos{};
+ std::vector<cryptonote::spent_key_image_info> key_images{};
+ if (!c.get_pool_transactions_and_spent_keys_info(infos, key_images) || infos.size() != m_broadcasted_tx_count || key_images.size() != m_broadcasted_tx_count)
+ {
+ MERROR("Failed broadcasted spent keys retrieval - Expected Broadcasted Count: " << m_broadcasted_tx_count << " Actual Info Count: " << infos.size() << " Actual Key Image Count: " << key_images.size());
+ return false;
+ }
+
+ infos.clear();
+ key_images.clear();
+ if (!c.get_pool_transactions_and_spent_keys_info(infos, key_images, false) || infos.size() != m_broadcasted_tx_count || key_images.size() != m_broadcasted_tx_count)
+ {
+ MERROR("Failed broadcasted spent keys retrieval - Expected Broadcasted Count: " << m_broadcasted_tx_count << " Actual Info Count: " << infos.size() << " Actual Key Image Count: " << key_images.size());
+ return false;
+ }
+
+ infos.clear();
+ key_images.clear();
+ if (!c.get_pool_transactions_and_spent_keys_info(infos, key_images, true) || infos.size() != m_all_tx_count || key_images.size() != m_all_tx_count)
+ {
+ MERROR("Failed all spent keys retrieval - Expected All Count: " << m_all_tx_count << " Actual Info Count: " << infos.size() << " Actual Key Image Count: " << key_images.size());
+ return false;
+ }
+
+ return true;
+}
+
+bool txpool_spend_key_public::generate(std::vector<test_event_entry>& events) const
+{
+ INIT_MEMPOOL_TEST();
+
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ MAKE_TX(events, tx_0, miner_account, bob_account, send_amount, blk_0);
+ DO_CALLBACK(events, "increase_broadcasted_tx_count");
+ DO_CALLBACK(events, "increase_all_tx_count");
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+
+ return true;
+}
+
+bool txpool_spend_key_all::generate(std::vector<test_event_entry>& events)
+{
+ INIT_MEMPOOL_TEST();
+ SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_do_not_relay);
+
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ MAKE_TX(events, tx_0, miner_account, bob_account, send_amount, blk_0);
+ DO_CALLBACK(events, "increase_all_tx_count");
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+
+ return true;
+}
+
+txpool_double_spend_base::txpool_double_spend_base()
+ : txpool_base()
+ , m_broadcasted_hashes()
+ , m_no_relay_hashes()
+ , m_all_hashes()
+ , m_no_new_index(0)
+ , m_new_timestamp_index(0)
+ , m_last_tx(crypto::hash{})
+{
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, mark_no_new);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, mark_timestamp_change);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, timestamp_change_pause);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, check_unchanged);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, check_new_broadcasted);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, check_new_hidden);
+ REGISTER_CALLBACK_METHOD(txpool_double_spend_base, check_new_no_relay);
+}
+
+bool txpool_double_spend_base::mark_no_new(cryptonote::core& /*c*/, size_t ev_index, const std::vector<test_event_entry>& /*events*/)
+{
+ m_no_new_index = ev_index + 1;
+ return true;
+}
+
+bool txpool_double_spend_base::mark_timestamp_change(cryptonote::core& /*c*/, size_t ev_index, const std::vector<test_event_entry>& /*events*/)
+{
+ m_new_timestamp_index = ev_index + 1;
+ return true;
+}
+
+bool txpool_double_spend_base::timestamp_change_pause(cryptonote::core& /*c*/, size_t /*ev_index*/, const std::vector<test_event_entry>& /*events*/)
+{
+ boost::this_thread::sleep_for(boost::chrono::seconds{1} + boost::chrono::milliseconds{100});
+ return true;
+}
+
+bool txpool_double_spend_base::check_changed(cryptonote::core& c, const size_t ev_index, relay_test condition)
+{
+ const std::size_t public_hash_count = m_broadcasted_hashes.size();
+ const std::size_t all_hash_count = m_all_hashes.size();
+
+ const std::size_t new_broadcasted_hash_count = m_broadcasted_hashes.size() + unsigned(condition == relay_test::broadcasted);
+ const std::size_t new_all_hash_count = m_all_hashes.size() + unsigned(condition == relay_test::hidden) + unsigned(condition == relay_test::no_relay);
+
+ std::vector<crypto::hash> hashes{};
+ if (!c.get_pool_transaction_hashes(hashes))
+ {
+ MERROR("Failed to get broadcasted transaction pool hashes");
+ return false;
+ }
+
+ for (const crypto::hash& hash : hashes)
+ m_broadcasted_hashes.insert(hash);
+
+ if (new_broadcasted_hash_count != m_broadcasted_hashes.size())
+ {
+ MERROR("Expected " << new_broadcasted_hash_count << " broadcasted hashes but got " << m_broadcasted_hashes.size());
+ return false;
+ }
+
+ if (m_broadcasted_hashes.size() != c.get_pool_transactions_count())
+ {
+ MERROR("Expected " << m_broadcasted_hashes.size() << " broadcasted hashes but got " << c.get_pool_transactions_count());
+ return false;
+ }
+
+ hashes.clear();
+ if (!c.get_pool_transaction_hashes(hashes, false))
+ {
+ MERROR("Failed to get broadcasted transaction pool hashes");
+ return false;
+ }
+
+ for (const crypto::hash& hash : hashes)
+ m_all_hashes.insert(std::make_pair(hash, 0));
+
+ if (new_broadcasted_hash_count != m_broadcasted_hashes.size())
+ {
+ MERROR("Expected " << new_broadcasted_hash_count << " broadcasted hashes but got " << m_broadcasted_hashes.size());
+ return false;
+ }
+
+ hashes.clear();
+ if (!c.get_pool_transaction_hashes(hashes, true))
+ {
+
+ MERROR("Failed to get all transaction pool hashes");
+ return false;
+ }
+
+ for (const crypto::hash& hash : hashes)
+ m_all_hashes.insert(std::make_pair(hash, 0));
+
+ if (new_all_hash_count != m_all_hashes.size())
+ {
+ MERROR("Expected " << new_all_hash_count << " all hashes but got " << m_all_hashes.size());
+ return false;
+ }
+
+ if (condition == relay_test::no_relay)
+ {
+ if (!m_no_relay_hashes.insert(m_last_tx).second)
+ {
+ MERROR("Expected new no_relay tx but got a duplicate legacy tx");
+ return false;
+ }
+
+ for (const crypto::hash& hash : m_no_relay_hashes)
+ {
+ if (!c.pool_has_tx(hash))
+ {
+ MERROR("Expected public tx " << hash << " to be listed in pool");
+ return false;
+ }
+ }
+ }
+
+ // check receive time changes
+ {
+ std::vector<cryptonote::tx_info> infos{};
+ std::vector<cryptonote::spent_key_image_info> key_images{};
+ if (!c.get_pool_transactions_and_spent_keys_info(infos, key_images, true) || infos.size() != m_all_hashes.size())
+ {
+ MERROR("Unable to retrieve all txpool metadata");
+ return false;
+ }
+
+ for (const cryptonote::tx_info& info : infos)
+ {
+ crypto::hash tx_hash;
+ if (!epee::string_tools::hex_to_pod(info.id_hash, tx_hash))
+ {
+ MERROR("Unable to convert tx_hash hex to binary");
+ return false;
+ }
+
+ const auto entry = m_all_hashes.find(tx_hash);
+ if (entry == m_all_hashes.end())
+ {
+ MERROR("Unable to find tx_hash in set of tracked hashes");
+ return false;
+ }
+
+ if (m_new_timestamp_index == ev_index && m_last_tx == tx_hash)
+ {
+ if (entry->second >= info.receive_time)
+ {
+ MERROR("Last relay time did not change as expected - last at " << entry->second << " and current at " << info.receive_time);
+ return false;
+ }
+ entry->second = info.receive_time;
+ }
+ else if (entry->second != info.receive_time)
+ {
+ MERROR("Last relayed time changed unexpectedly from " << entry->second << " to " << info.receive_time);
+ return false;
+ }
+ }
+ }
+
+ {
+ std::vector<cryptonote::transaction> txes{};
+ if (!c.get_pool_transactions(txes))
+ {
+ MERROR("Failed to get broadcasted transactions from pool");
+ return false;
+ }
+
+ hashes.clear();
+ for (const cryptonote::transaction& tx : txes)
+ hashes.push_back(cryptonote::get_transaction_hash(tx));
+
+ std::unordered_set<crypto::hash> public_hashes = m_broadcasted_hashes;
+ for (const crypto::hash& hash : hashes)
+ {
+ if (!c.pool_has_tx(hash))
+ {
+ MERROR("Expected broadcasted tx " << hash << " to be listed in pool");
+ return false;
+ }
+
+ if (!public_hashes.erase(hash))
+ {
+ MERROR("An unexected transaction was returned from the public pool");
+ return false;
+ }
+ }
+ if (!public_hashes.empty())
+ {
+ MERROR(public_hashes.size() << " transaction(s) were missing from the public pool");
+ return false;
+ }
+ }
+
+ {
+ std::vector<cryptonote::transaction> txes{};
+ if (!c.get_pool_transactions(txes, false))
+ {
+ MERROR("Failed to get broadcasted transactions from pool");
+ return false;
+ }
+
+ hashes.clear();
+ for (const cryptonote::transaction& tx : txes)
+ hashes.push_back(cryptonote::get_transaction_hash(tx));
+
+ std::unordered_set<crypto::hash> public_hashes = m_broadcasted_hashes;
+ for (const crypto::hash& hash : hashes)
+ {
+
+ if (!public_hashes.erase(hash))
+ {
+ MERROR("An unexected transaction was returned from the public pool");
+ return false;
+ }
+ }
+ if (!public_hashes.empty())
+ {
+ MERROR(public_hashes.size() << " transaction(s) were missing from the public pool");
+ return false;
+ }
+ }
+
+ {
+ std::vector<cryptonote::transaction> txes{};
+ if (!c.get_pool_transactions(txes, true))
+ {
+ MERROR("Failed to get all transactions from pool");
+ return false;
+ }
+
+ hashes.clear();
+ for (const cryptonote::transaction& tx : txes)
+ hashes.push_back(cryptonote::get_transaction_hash(tx));
+
+ std::unordered_map<crypto::hash, uint64_t> all_hashes = m_all_hashes;
+ for (const crypto::hash& hash : hashes)
+ {
+ if (!all_hashes.erase(hash))
+ {
+ MERROR("An unexected transaction was returned from the all pool");
+ return false;
+ }
+ }
+ if (!all_hashes.empty())
+ {
+ MERROR(m_broadcasted_hashes.size() << " transaction(s) were missing from the all pool");
+ return false;
+ }
+ }
+
+ {
+ std::vector<cryptonote::tx_backlog_entry> entries{};
+ if (!c.get_txpool_backlog(entries))
+ {
+ MERROR("Failed to get broadcasted txpool backlog");
+ return false;
+ }
+
+ if (m_broadcasted_hashes.size() != entries.size())
+ {
+ MERROR("Expected " << m_broadcasted_hashes.size() << " in the broadcasted txpool backlog but got " << entries.size());
+ return false;
+ }
+ }
+
+ for (const std::pair<crypto::hash, uint64_t>& hash : m_all_hashes)
+ {
+ cryptonote::blobdata tx_blob{};
+ if (!c.get_pool_transaction(hash.first, tx_blob, cryptonote::relay_category::all))
+ {
+ MERROR("Failed to retrieve tx expected to be in pool: " << hash.first);
+ return false;
+ }
+ }
+
+ {
+ std::unordered_map<crypto::hash, uint64_t> difference = m_all_hashes;
+ for (const crypto::hash& hash : m_broadcasted_hashes)
+ difference.erase(hash);
+
+ for (const crypto::hash& hash : m_no_relay_hashes)
+ difference.erase(hash);
+
+ for (const std::pair<crypto::hash, uint64_t>& hash : difference)
+ {
+ if (c.pool_has_tx(hash.first))
+ {
+ MERROR("Did not expect private/hidden tx " << hash.first << " to be listed in pool");
+ return false;
+ }
+
+ cryptonote::blobdata tx_blob{};
+ if (c.get_pool_transaction(hash.first, tx_blob, cryptonote::relay_category::broadcasted))
+ {
+ MERROR("Tx " << hash.first << " is not supposed to be in broadcasted pool");
+ return false;
+ }
+
+ if (!c.get_pool_transaction(hash.first, tx_blob, cryptonote::relay_category::all))
+ {
+ MERROR("Tx " << hash.first << " blob could not be retrieved from pool");
+ return false;
+ }
+ }
+ }
+
+ {
+ cryptonote::txpool_stats stats{};
+ if (!c.get_pool_transaction_stats(stats) || stats.txs_total != m_broadcasted_hashes.size())
+ {
+ MERROR("Expected broadcasted stats to list " << m_broadcasted_hashes.size() << " txes but got " << stats.txs_total);
+ return false;
+ }
+
+ if (!c.get_pool_transaction_stats(stats, false) || stats.txs_total != m_broadcasted_hashes.size())
+ {
+ MERROR("Expected broadcasted stats to list " << m_broadcasted_hashes.size() << " txes but got " << stats.txs_total);
+ return false;
+ }
+
+ if (!c.get_pool_transaction_stats(stats, true) || stats.txs_total != m_all_hashes.size())
+ {
+ MERROR("Expected all stats to list " << m_all_hashes.size() << " txes but got " << stats.txs_total);
+ return false;
+ }
+ }
+
+ {
+ std::vector<cryptonote::rpc::tx_in_pool> infos{};
+ cryptonote::rpc::key_images_with_tx_hashes key_images{};
+ if (!c.get_pool_for_rpc(infos, key_images) || infos.size() != m_broadcasted_hashes.size() || key_images.size() != m_broadcasted_hashes.size())
+ {
+ MERROR("Expected broadcasted rpc data to return " << m_broadcasted_hashes.size() << " but got " << infos.size() << " infos and " << key_images.size() << "key images");
+ return false;
+ }
+ }
+ return true;
+}
+
+bool txpool_double_spend_base::check_unchanged(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& /*events */)
+{
+ return check_changed(c, ev_index, relay_test::no_change);
+}
+
+bool txpool_double_spend_base::check_new_broadcasted(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& /*events */)
+{
+ return check_changed(c, ev_index, relay_test::broadcasted);
+}
+
+bool txpool_double_spend_base::check_new_hidden(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& /*events */)
+{
+ return check_changed(c, ev_index, relay_test::hidden);
+}
+bool txpool_double_spend_base::check_new_no_relay(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& /*events */)
+{
+ return check_changed(c, ev_index, relay_test::no_relay);
+}
+
+bool txpool_double_spend_base::check_tx_verification_context(const cryptonote::tx_verification_context& tvc, bool tx_added, size_t event_idx, const cryptonote::transaction& tx)
+{
+ m_last_tx = cryptonote::get_transaction_hash(tx);
+ if (m_no_new_index == event_idx)
+ return !tvc.m_verifivation_failed && !tx_added;
+ else
+ return !tvc.m_verifivation_failed && tx_added;
+}
+
+bool txpool_double_spend_norelay::generate(std::vector<test_event_entry>& events) const
+{
+ INIT_MEMPOOL_TEST();
+
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_do_not_relay);
+ DO_CALLBACK(events, "mark_no_new");
+
+ MAKE_TX(events, tx_0, miner_account, bob_account, send_amount, blk_0);
+
+ DO_CALLBACK(events, "increase_all_tx_count");
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "mark_timestamp_change");
+ DO_CALLBACK(events, "check_new_no_relay");
+ DO_CALLBACK(events, "timestamp_change_pause");
+ DO_CALLBACK(events, "mark_no_new");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "check_unchanged");
+ SET_EVENT_VISITOR_SETT(events, 0);
+ DO_CALLBACK(events, "timestamp_change_pause");
+ DO_CALLBACK(events, "mark_no_new");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "check_unchanged");
+
+ // kepped by block currently does not change txpool status
+ SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_txs_keeped_by_block);
+ DO_CALLBACK(events, "timestamp_change_pause");
+ DO_CALLBACK(events, "mark_no_new");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "check_unchanged");
+
+ return true;
+}
+
+bool txpool_double_spend_local::generate(std::vector<test_event_entry>& events) const
+{
+ INIT_MEMPOOL_TEST();
+
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ SET_EVENT_VISITOR_SETT(events, event_visitor_settings::set_local_relay);
+ DO_CALLBACK(events, "mark_no_new");
+
+ MAKE_TX(events, tx_0, miner_account, bob_account, send_amount, blk_0);
+
+ DO_CALLBACK(events, "increase_all_tx_count");
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "mark_timestamp_change");
+ DO_CALLBACK(events, "check_new_hidden");
+ DO_CALLBACK(events, "timestamp_change_pause");
+ DO_CALLBACK(events, "mark_no_new");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "mark_timestamp_change");
+ DO_CALLBACK(events, "check_unchanged");
+ SET_EVENT_VISITOR_SETT(events, 0);
+ DO_CALLBACK(events, "timestamp_change_pause");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "increase_broadcasted_tx_count");
+ DO_CALLBACK(events, "check_txpool_spent_keys");
+ DO_CALLBACK(events, "mark_timestamp_change");
+ DO_CALLBACK(events, "check_new_broadcasted");
+ DO_CALLBACK(events, "timestamp_change_pause");
+ DO_CALLBACK(events, "mark_no_new");
+ events.push_back(tx_0);
+ DO_CALLBACK(events, "check_unchanged");
+
+ return true;
+}
+
diff --git a/tests/core_tests/tx_pool.h b/tests/core_tests/tx_pool.h
new file mode 100644
index 000000000..996c76698
--- /dev/null
+++ b/tests/core_tests/tx_pool.h
@@ -0,0 +1,118 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#pragma once
+
+#include <unordered_map>
+#include <unordered_set>
+
+#include "chaingen.h"
+#include "crypto/crypto.h"
+
+enum class relay_test
+{
+ no_change = 0, //!< No expected changes to the txpool
+ broadcasted, //!< A new block or fluff/flood tx is expected in txpool
+ hidden, //!< A new stem or local tx is expected in txpool
+ no_relay //!< A new no relay is expected in txpool
+};
+
+class txpool_base : public test_chain_unit_base
+{
+ size_t m_broadcasted_tx_count;
+ size_t m_all_tx_count;
+
+public:
+ txpool_base();
+
+ bool increase_broadcasted_tx_count(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& events);
+ bool increase_all_tx_count(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& events);
+ bool check_txpool_spent_keys(cryptonote::core& c, size_t /*ev_index*/, const std::vector<test_event_entry>& events);
+};
+
+struct txpool_spend_key_public : txpool_base
+{
+ txpool_spend_key_public() : txpool_base()
+ {}
+
+ bool generate(std::vector<test_event_entry>& events) const;
+};
+
+struct txpool_spend_key_all : txpool_base
+{
+ txpool_spend_key_all() : txpool_base()
+ {}
+
+ bool generate(std::vector<test_event_entry>& events);
+};
+
+class txpool_double_spend_base : public txpool_base
+{
+ std::unordered_set<crypto::hash> m_broadcasted_hashes;
+ std::unordered_set<crypto::hash> m_no_relay_hashes;
+ std::unordered_map<crypto::hash, uint64_t> m_all_hashes;
+ size_t m_no_new_index;
+ size_t m_new_timestamp_index;
+ crypto::hash m_last_tx;
+
+ bool check_changed(cryptonote::core& c, size_t ev_index, relay_test condition);
+
+public:
+ txpool_double_spend_base();
+
+ bool mark_no_new(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+ bool mark_timestamp_change(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+
+ //! Pause for 1 second, so that `receive_time` for tx meta changes (tx hidden from public rpc being updated)
+ bool timestamp_change_pause(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+
+ bool check_unchanged(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+ bool check_new_broadcasted(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+ bool check_new_hidden(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+ bool check_new_no_relay(cryptonote::core& c, size_t ev_index, const std::vector<test_event_entry>& events);
+
+ bool check_tx_verification_context(const cryptonote::tx_verification_context& tvc, bool tx_added, size_t event_idx, const cryptonote::transaction& /*tx*/);
+};
+
+struct txpool_double_spend_norelay : txpool_double_spend_base
+{
+ txpool_double_spend_norelay()
+ : txpool_double_spend_base()
+ {}
+
+ bool generate(std::vector<test_event_entry>& events) const;
+};
+
+struct txpool_double_spend_local : txpool_double_spend_base
+{
+ txpool_double_spend_local()
+ : txpool_double_spend_base()
+ {}
+
+ bool generate(std::vector<test_event_entry>& events) const;
+};
diff --git a/tests/functional_tests/mining.py b/tests/functional_tests/mining.py
index ad646417e..d067c25e1 100755
--- a/tests/functional_tests/mining.py
+++ b/tests/functional_tests/mining.py
@@ -170,5 +170,15 @@ class MiningTest():
assert res.hash == block_hash
+class Guard:
+ def __enter__(self):
+ pass
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ daemon = Daemon()
+ try: daemon.stop_mining()
+ except: pass
+
if __name__ == '__main__':
- MiningTest().run_test()
+ with Guard() as guard:
+ MiningTest().run_test()
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index 96825f54f..cda25dfc9 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -92,7 +92,8 @@ set(unit_tests_sources
ringdb.cpp
wipeable_string.cpp
is_hdd.cpp
- aligned.cpp)
+ aligned.cpp
+ rpc_version_str.cpp)
set(unit_tests_headers
unit_tests_utils.h)
diff --git a/tests/unit_tests/node_server.cpp b/tests/unit_tests/node_server.cpp
index 2c89323c7..c92f70b97 100644
--- a/tests/unit_tests/node_server.cpp
+++ b/tests/unit_tests/node_server.cpp
@@ -32,6 +32,7 @@
#include "cryptonote_core/cryptonote_core.h"
#include "p2p/net_node.h"
#include "p2p/net_node.inl"
+#include "cryptonote_core/i_core_events.h"
#include "cryptonote_protocol/cryptonote_protocol_handler.h"
#include "cryptonote_protocol/cryptonote_protocol_handler.inl"
@@ -43,7 +44,7 @@ namespace cryptonote {
class blockchain_storage;
}
-class test_core
+class test_core : public cryptonote::i_core_events
{
public:
void on_synchronized(){}
@@ -56,8 +57,8 @@ public:
bool get_stat_info(cryptonote::core_stat_info& st_inf) const {return true;}
bool have_block(const crypto::hash& id) const {return true;}
void get_blockchain_top(uint64_t& height, crypto::hash& top_id)const{height=0;top_id=crypto::null_hash;}
- bool handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; }
- bool handle_incoming_txs(const std::vector<cryptonote::tx_blob_entry>& tx_blob, std::vector<cryptonote::tx_verification_context>& tvc, bool keeped_by_block, bool relayed, bool do_not_relay) { return true; }
+ bool handle_incoming_tx(const cryptonote::tx_blob_entry& tx_blob, cryptonote::tx_verification_context& tvc, cryptonote::relay_method tx_relay, bool relayed) { return true; }
+ bool handle_incoming_txs(const std::vector<cryptonote::tx_blob_entry>& tx_blob, std::vector<cryptonote::tx_verification_context>& tvc, cryptonote::relay_method tx_relay, bool relayed) { return true; }
bool handle_incoming_block(const cryptonote::blobdata& block_blob, const cryptonote::block *block, cryptonote::block_verification_context& bvc, bool update_miner_blocktemplate = true) { return true; }
void pause_mine(){}
void resume_mine(){}
@@ -71,9 +72,9 @@ public:
bool cleanup_handle_incoming_blocks(bool force_sync = false) { return true; }
uint64_t get_target_blockchain_height() const { return 1; }
size_t get_block_sync_size(uint64_t height) const { return BLOCKS_SYNCHRONIZING_DEFAULT_COUNT; }
- virtual void on_transaction_relayed(const cryptonote::blobdata& tx) {}
+ virtual void on_transactions_relayed(epee::span<const cryptonote::blobdata> tx_blobs, cryptonote::relay_method tx_relay) {}
cryptonote::network_type get_nettype() const { return cryptonote::MAINNET; }
- bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob) const { return false; }
+ bool get_pool_transaction(const crypto::hash& id, cryptonote::blobdata& tx_blob, cryptonote::relay_category tx_category) const { return false; }
bool pool_has_tx(const crypto::hash &txid) const { return false; }
bool get_blocks(uint64_t start_offset, size_t count, std::vector<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::vector<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::vector<cryptonote::transaction>& txs, std::vector<crypto::hash>& missed_txs) const { return false; }
@@ -262,16 +263,25 @@ TEST(ban, ignores_port)
TEST(node_server, bind_same_p2p_port)
{
- const auto new_node = []() -> std::unique_ptr<Server> {
+ struct test_data_t
+ {
test_core pr_core;
- cryptonote::t_cryptonote_protocol_handler<test_core> cprotocol(pr_core, NULL);
- std::unique_ptr<Server> server(new Server(cprotocol));
- cprotocol.set_p2p_endpoint(server.get());
+ cryptonote::t_cryptonote_protocol_handler<test_core> cprotocol;
+ std::unique_ptr<Server> server;
+
+ test_data_t(): cprotocol(pr_core, NULL)
+ {
+ server.reset(new Server(cprotocol));
+ cprotocol.set_p2p_endpoint(server.get());
+ }
+ };
- return server;
+ const auto new_node = []() -> std::unique_ptr<test_data_t> {
+ test_data_t *d = new test_data_t;
+ return std::unique_ptr<test_data_t>(d);
};
- const auto init = [](const std::unique_ptr<Server>& server, const char* port) -> bool {
+ const auto init = [](const std::unique_ptr<test_data_t>& server, const char* port) -> bool {
boost::program_options::options_description desc_options("Command line options");
cryptonote::core::init_options(desc_options);
Server::init_options(desc_options);
@@ -284,7 +294,7 @@ TEST(node_server, bind_same_p2p_port)
boost::program_options::notify(vm);
- return server->init(vm);
+ return server->server->init(vm);
};
constexpr char port[] = "48080";
diff --git a/tests/unit_tests/rpc_version_str.cpp b/tests/unit_tests/rpc_version_str.cpp
new file mode 100644
index 000000000..5dce60465
--- /dev/null
+++ b/tests/unit_tests/rpc_version_str.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2019, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "gtest/gtest.h"
+
+#include "rpc/rpc_version_str.h"
+#include "version.h"
+
+TEST(rpc, is_version_string_valid)
+{
+ using namespace cryptonote::rpc;
+ ASSERT_TRUE(is_version_string_valid(MONERO_VERSION));
+ ASSERT_TRUE(is_version_string_valid("0.14.1.2"));
+ ASSERT_TRUE(is_version_string_valid("0.15.0.0-release"));
+ ASSERT_TRUE(is_version_string_valid("0.15.0.0-fe3f6a3e6"));
+
+ ASSERT_FALSE(is_version_string_valid(""));
+ ASSERT_FALSE(is_version_string_valid("invalid"));
+ ASSERT_FALSE(is_version_string_valid("0.15.0.0-invalid"));
+ ASSERT_FALSE(is_version_string_valid("0.15.0.0-release0"));
+ ASSERT_FALSE(is_version_string_valid("0.15.0.0-release "));
+ ASSERT_FALSE(is_version_string_valid("0.15.0.0-fe3f6a3e60"));
+ ASSERT_FALSE(is_version_string_valid("0.15.0.0-fe3f6a3e6 "));
+}